mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-25 22:01:30 +00:00
Backing out 414463b32e36 to dcae4884a07d
This commit is contained in:
parent
12d43f4c68
commit
8e478df3a1
@ -1676,23 +1676,6 @@ public:
|
||||
*/
|
||||
static PRBool IsFocusedContent(nsIContent *aContent);
|
||||
|
||||
#ifdef MOZ_IPC
|
||||
#ifdef ANDROID
|
||||
static void SetActiveFrameLoader(nsFrameLoader *aFrameLoader)
|
||||
{
|
||||
sActiveFrameLoader = aFrameLoader;
|
||||
}
|
||||
|
||||
static void ClearActiveFrameLoader(const nsFrameLoader *aFrameLoader)
|
||||
{
|
||||
if (sActiveFrameLoader == aFrameLoader)
|
||||
sActiveFrameLoader = nsnull;
|
||||
}
|
||||
|
||||
static already_AddRefed<nsFrameLoader> GetActiveFrameLoader();
|
||||
#endif
|
||||
#endif
|
||||
|
||||
private:
|
||||
|
||||
static PRBool InitializeEventTable();
|
||||
@ -1782,12 +1765,6 @@ private:
|
||||
static nsIInterfaceRequestor* sSameOriginChecker;
|
||||
|
||||
static PRBool sIsHandlingKeyBoardEvent;
|
||||
|
||||
#ifdef MOZ_IPC
|
||||
#ifdef ANDROID
|
||||
static nsFrameLoader *sActiveFrameLoader;
|
||||
#endif
|
||||
#endif
|
||||
};
|
||||
|
||||
#define NS_HOLD_JS_OBJECTS(obj, clazz) \
|
||||
|
@ -266,12 +266,6 @@ PRBool nsContentUtils::sInitialized = PR_FALSE;
|
||||
nsRefPtrHashtable<nsPrefObserverHashKey, nsPrefOldCallback>
|
||||
*nsContentUtils::sPrefCallbackTable = nsnull;
|
||||
|
||||
#ifdef MOZ_IPC
|
||||
#ifdef ANDROID
|
||||
nsFrameLoader *nsContentUtils::sActiveFrameLoader = nsnull;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
static PLDHashTable sEventListenerManagersHash;
|
||||
|
||||
class EventListenerManagerMapEntry : public PLDHashEntryHdr
|
||||
@ -6215,17 +6209,6 @@ nsContentUtils::IsFocusedContent(nsIContent* aContent)
|
||||
return fm && fm->GetFocusedContent() == aContent;
|
||||
}
|
||||
|
||||
#ifdef MOZ_IPC
|
||||
#ifdef ANDROID
|
||||
// static
|
||||
already_AddRefed<nsFrameLoader>
|
||||
nsContentUtils::GetActiveFrameLoader()
|
||||
{
|
||||
return nsCOMPtr<nsFrameLoader>(sActiveFrameLoader).forget();
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
void nsContentUtils::RemoveNewlines(nsString &aString)
|
||||
{
|
||||
// strip CR/LF and null
|
||||
|
@ -1170,9 +1170,6 @@ nsFrameLoader::DestroyChild()
|
||||
{
|
||||
#ifdef MOZ_IPC
|
||||
if (mRemoteBrowser) {
|
||||
#ifdef ANDROID
|
||||
nsContentUtils::ClearActiveFrameLoader(this);
|
||||
#endif
|
||||
mRemoteBrowser->SetOwnerElement(nsnull);
|
||||
// If this fails, it's most likely due to a content-process crash,
|
||||
// and auto-cleanup will kick in. Otherwise, the child side will
|
||||
@ -1708,9 +1705,6 @@ nsFrameLoader::ActivateRemoteFrame() {
|
||||
#ifdef MOZ_IPC
|
||||
if (mRemoteBrowser) {
|
||||
mRemoteBrowser->Activate();
|
||||
#ifdef ANDROID
|
||||
nsContentUtils::SetActiveFrameLoader(this);
|
||||
#endif
|
||||
return NS_OK;
|
||||
}
|
||||
#endif
|
||||
|
@ -44,12 +44,6 @@
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#ifdef MOZ_IPC
|
||||
#ifdef ANDROID
|
||||
#include "mozilla/dom/PBrowserParent.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsEventStateManager.h"
|
||||
#include "nsEventListenerManager.h"
|
||||
@ -165,12 +159,6 @@
|
||||
#import <ApplicationServices/ApplicationServices.h>
|
||||
#endif
|
||||
|
||||
#ifdef MOZ_IPC
|
||||
#ifdef ANDROID
|
||||
#include "nsFrameLoader.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
//#define DEBUG_DOCSHELL_FOCUS
|
||||
|
||||
#define NS_USER_INTERACTION_INTERVAL 5000 // ms
|
||||
@ -1381,40 +1369,6 @@ nsEventStateManager::PreHandleEvent(nsPresContext* aPresContext,
|
||||
DoContentCommandScrollEvent(static_cast<nsContentCommandEvent*>(aEvent));
|
||||
}
|
||||
break;
|
||||
#ifdef MOZ_IPC
|
||||
#ifdef ANDROID
|
||||
case NS_TEXT_TEXT:
|
||||
{
|
||||
nsTextEvent *textEvent = static_cast<nsTextEvent*>(aEvent);
|
||||
if (IsTargetCrossProcess(textEvent)) {
|
||||
// Will not be handled locally, remote the event
|
||||
mozilla::dom::PBrowserParent *remoteBrowser = GetCrossProcessTarget();
|
||||
if (remoteBrowser &&
|
||||
remoteBrowser->SendTextEvent(*textEvent)) {
|
||||
// Cancel local dispatching
|
||||
*aStatus = nsEventStatus_eConsumeNoDefault;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case NS_COMPOSITION_START:
|
||||
case NS_COMPOSITION_END:
|
||||
{
|
||||
nsCompositionEvent *compositionEvent =
|
||||
static_cast<nsCompositionEvent*>(aEvent);
|
||||
if (IsTargetCrossProcess(compositionEvent)) {
|
||||
// Will not be handled locally, remote the event
|
||||
mozilla::dom::PBrowserParent *remoteBrowser = GetCrossProcessTarget();
|
||||
if (remoteBrowser &&
|
||||
remoteBrowser->SendCompositionEvent(*compositionEvent)) {
|
||||
// Cancel local dispatching
|
||||
*aStatus = nsEventStatus_eConsumeNoDefault;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
@ -3245,49 +3199,6 @@ nsEventStateManager::PostHandleEvent(nsPresContext* aPresContext,
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef MOZ_IPC
|
||||
#ifdef ANDROID
|
||||
case NS_QUERY_SELECTED_TEXT:
|
||||
case NS_QUERY_TEXT_CONTENT:
|
||||
case NS_QUERY_CARET_RECT:
|
||||
case NS_QUERY_TEXT_RECT:
|
||||
case NS_QUERY_EDITOR_RECT:
|
||||
case NS_QUERY_CONTENT_STATE:
|
||||
// We don't remote nsITransferable yet
|
||||
//case NS_QUERY_SELECTION_AS_TRANSFERABLE:
|
||||
case NS_QUERY_CHARACTER_AT_POINT:
|
||||
{
|
||||
nsQueryContentEvent *queryEvent =
|
||||
static_cast<nsQueryContentEvent*>(aEvent);
|
||||
// If local query failed, try remote query
|
||||
if (queryEvent->mSucceeded)
|
||||
break;
|
||||
|
||||
mozilla::dom::PBrowserParent *remoteBrowser = GetCrossProcessTarget();
|
||||
if (remoteBrowser &&
|
||||
remoteBrowser->SendQueryContentEvent(*queryEvent)) {
|
||||
queryEvent->mWasAsync = PR_TRUE;
|
||||
queryEvent->mSucceeded = PR_TRUE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case NS_SELECTION_SET:
|
||||
{
|
||||
nsSelectionEvent *selectionEvent =
|
||||
static_cast<nsSelectionEvent*>(aEvent);
|
||||
// If local handler failed, try remoting the event
|
||||
if (selectionEvent->mSucceeded)
|
||||
break;
|
||||
|
||||
mozilla::dom::PBrowserParent *remoteBrowser = GetCrossProcessTarget();
|
||||
if (remoteBrowser &&
|
||||
remoteBrowser->SendSelectionEvent(*selectionEvent))
|
||||
selectionEvent->mSucceeded = PR_TRUE;
|
||||
}
|
||||
break;
|
||||
#endif // ANDROID
|
||||
#endif // MOZ_IPC
|
||||
}
|
||||
|
||||
//Reset target frame to null to avoid mistargeting after reentrant event
|
||||
@ -3296,27 +3207,6 @@ nsEventStateManager::PostHandleEvent(nsPresContext* aPresContext,
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef MOZ_IPC
|
||||
#ifdef ANDROID
|
||||
mozilla::dom::PBrowserParent*
|
||||
nsEventStateManager::GetCrossProcessTarget()
|
||||
{
|
||||
nsCOMPtr<nsFrameLoader> fl = nsContentUtils::GetActiveFrameLoader();
|
||||
NS_ENSURE_TRUE(fl, nsnull);
|
||||
return fl->GetRemoteBrowser();
|
||||
}
|
||||
|
||||
PRBool
|
||||
nsEventStateManager::IsTargetCrossProcess(nsGUIEvent *aEvent)
|
||||
{
|
||||
nsQueryContentEvent stateEvent(PR_TRUE, NS_QUERY_CONTENT_STATE, aEvent->widget);
|
||||
nsContentEventHandler handler(mPresContext);
|
||||
handler.OnQueryContentState(&stateEvent);
|
||||
return !stateEvent.mSucceeded;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsEventStateManager::NotifyDestroyPresContext(nsPresContext* aPresContext)
|
||||
{
|
||||
|
@ -331,13 +331,6 @@ protected:
|
||||
nsresult DoContentCommandEvent(nsContentCommandEvent* aEvent);
|
||||
nsresult DoContentCommandScrollEvent(nsContentCommandEvent* aEvent);
|
||||
|
||||
#ifdef MOZ_IPC
|
||||
#ifdef ANDROID
|
||||
mozilla::dom::PBrowserParent *GetCrossProcessTarget();
|
||||
PRBool IsTargetCrossProcess(nsGUIEvent *aEvent);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
PRInt32 mLockCursor;
|
||||
|
||||
nsWeakFrame mCurrentTarget;
|
||||
|
@ -48,16 +48,11 @@ include "mozilla/TabTypes.h";
|
||||
include "TabMessageUtils.h";
|
||||
include "gfxMatrix.h";
|
||||
include "mozilla/net/NeckoMessageUtils.h";
|
||||
include "mozilla/widget/nsGUIEventIPC.h";
|
||||
|
||||
using IPC::URI;
|
||||
using MagicWindowHandle;
|
||||
using RemoteDOMEvent;
|
||||
using gfxMatrix;
|
||||
using nsCompositionEvent;
|
||||
using nsTextEvent;
|
||||
using nsQueryContentEvent;
|
||||
using nsSelectionEvent;
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
@ -110,8 +105,6 @@ parent:
|
||||
sync SyncMessage(nsString aMessage, nsString aJSON)
|
||||
returns (nsString[] retval);
|
||||
|
||||
QueryContentResult(nsQueryContentEvent event);
|
||||
|
||||
PGeolocationRequest(URI uri);
|
||||
|
||||
PContentDialog(PRUint32 aType, nsCString aName, nsCString aFeatures,
|
||||
@ -154,14 +147,6 @@ child:
|
||||
PRInt32 aModifiers,
|
||||
bool aPreventDefault);
|
||||
|
||||
CompositionEvent(nsCompositionEvent event);
|
||||
|
||||
TextEvent(nsTextEvent event);
|
||||
|
||||
QueryContentEvent(nsQueryContentEvent event);
|
||||
|
||||
SelectionEvent(nsSelectionEvent event);
|
||||
|
||||
/**
|
||||
* Activate event forwarding from client to parent.
|
||||
*/
|
||||
|
@ -54,7 +54,6 @@
|
||||
#include "mozilla/ipc/DocumentRendererChild.h"
|
||||
#include "mozilla/ipc/DocumentRendererShmemChild.h"
|
||||
#include "mozilla/ipc/DocumentRendererNativeIDChild.h"
|
||||
#include "mozilla/widget/nsGUIEventIPC.h"
|
||||
#include "nsIInterfaceRequestorUtils.h"
|
||||
#include "nsPIDOMWindow.h"
|
||||
#include "nsIDOMWindowUtils.h"
|
||||
@ -81,8 +80,6 @@
|
||||
#include "nsIDOMDocument.h"
|
||||
#include "nsIScriptGlobalObject.h"
|
||||
#include "nsWeakReference.h"
|
||||
#include "nsIFrame.h"
|
||||
#include "nsIView.h"
|
||||
#include "nsISecureBrowserUI.h"
|
||||
#include "nsISSLStatusProvider.h"
|
||||
#include "nsSerializationHelper.h"
|
||||
@ -723,77 +720,15 @@ TabChild::RecvKeyEvent(const nsString& aType,
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
TabChild::RecvCompositionEvent(const nsCompositionEvent& event)
|
||||
{
|
||||
nsCompositionEvent localEvent(event);
|
||||
DispatchWidgetEvent(localEvent);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
TabChild::RecvTextEvent(const nsTextEvent& event)
|
||||
{
|
||||
nsTextEvent localEvent(event);
|
||||
DispatchWidgetEvent(localEvent);
|
||||
IPC::ParamTraits<nsTextEvent>::Free(event);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
TabChild::RecvQueryContentEvent(const nsQueryContentEvent& event)
|
||||
{
|
||||
nsQueryContentEvent localEvent(event);
|
||||
DispatchWidgetEvent(localEvent);
|
||||
// Send result back even if query failed
|
||||
SendQueryContentResult(localEvent);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
TabChild::RecvSelectionEvent(const nsSelectionEvent& event)
|
||||
{
|
||||
nsSelectionEvent localEvent(event);
|
||||
DispatchWidgetEvent(localEvent);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
TabChild::DispatchWidgetEvent(nsGUIEvent& event)
|
||||
{
|
||||
nsCOMPtr<nsPIDOMWindow> window = do_GetInterface(mWebNav);
|
||||
NS_ENSURE_TRUE(window, false);
|
||||
|
||||
nsIDocShell *docShell = window->GetDocShell();
|
||||
NS_ENSURE_TRUE(docShell, false);
|
||||
|
||||
nsCOMPtr<nsIPresShell> presShell;
|
||||
docShell->GetPresShell(getter_AddRefs(presShell));
|
||||
NS_ENSURE_TRUE(presShell, false);
|
||||
|
||||
nsIFrame *frame = presShell->GetRootFrame();
|
||||
NS_ENSURE_TRUE(frame, false);
|
||||
|
||||
nsIView *view = frame->GetView();
|
||||
NS_ENSURE_TRUE(view, false);
|
||||
|
||||
nsCOMPtr<nsIWidget> widget = view->GetNearestWidget(nsnull);
|
||||
NS_ENSURE_TRUE(widget, false);
|
||||
|
||||
nsEventStatus status;
|
||||
event.widget = widget;
|
||||
NS_ENSURE_SUCCESS(widget->DispatchEvent(&event, status), false);
|
||||
return true;
|
||||
}
|
||||
|
||||
mozilla::ipc::PDocumentRendererChild*
|
||||
TabChild::AllocPDocumentRenderer(const PRInt32& x,
|
||||
const PRInt32& y,
|
||||
const PRInt32& w,
|
||||
const PRInt32& h,
|
||||
const nsString& bgcolor,
|
||||
const PRUint32& flags,
|
||||
const bool& flush)
|
||||
TabChild::AllocPDocumentRenderer(
|
||||
const PRInt32& x,
|
||||
const PRInt32& y,
|
||||
const PRInt32& w,
|
||||
const PRInt32& h,
|
||||
const nsString& bgcolor,
|
||||
const PRUint32& flags,
|
||||
const bool& flush)
|
||||
{
|
||||
return new mozilla::ipc::DocumentRendererChild();
|
||||
}
|
||||
|
@ -191,10 +191,6 @@ public:
|
||||
const PRInt32& aCharCode,
|
||||
const PRInt32& aModifiers,
|
||||
const bool& aPreventDefault);
|
||||
virtual bool RecvCompositionEvent(const nsCompositionEvent& event);
|
||||
virtual bool RecvTextEvent(const nsTextEvent& event);
|
||||
virtual bool RecvQueryContentEvent(const nsQueryContentEvent& event);
|
||||
virtual bool RecvSelectionEvent(const nsSelectionEvent& event);
|
||||
virtual bool RecvActivateFrameEvent(const nsString& aType, const bool& capture);
|
||||
virtual bool RecvLoadRemoteScript(const nsString& aURL);
|
||||
virtual bool RecvAsyncMessage(const nsString& aMessage,
|
||||
@ -289,8 +285,6 @@ protected:
|
||||
NS_OVERRIDE
|
||||
virtual bool RecvDestroy();
|
||||
|
||||
bool DispatchWidgetEvent(nsGUIEvent& event);
|
||||
|
||||
private:
|
||||
void ActorDestroy(ActorDestroyReason why);
|
||||
|
||||
|
@ -71,11 +71,6 @@
|
||||
#include "nsIContent.h"
|
||||
#include "mozilla/unused.h"
|
||||
|
||||
#ifdef ANDROID
|
||||
#include "AndroidBridge.h"
|
||||
using namespace mozilla;
|
||||
#endif
|
||||
|
||||
using mozilla::ipc::DocumentRendererParent;
|
||||
using mozilla::ipc::DocumentRendererShmemParent;
|
||||
using mozilla::ipc::DocumentRendererNativeIDParent;
|
||||
@ -572,32 +567,6 @@ TabParent::RecvAsyncMessage(const nsString& aMessage,
|
||||
return ReceiveMessage(aMessage, PR_FALSE, aJSON, nsnull);
|
||||
}
|
||||
|
||||
bool
|
||||
TabParent::RecvQueryContentResult(const nsQueryContentEvent& event)
|
||||
{
|
||||
#ifdef ANDROID
|
||||
if (!event.mSucceeded) {
|
||||
AndroidBridge::Bridge()->ReturnIMEQueryResult(nsnull, 0, 0, 0);
|
||||
return true;
|
||||
}
|
||||
|
||||
switch (event.message) {
|
||||
case NS_QUERY_TEXT_CONTENT:
|
||||
AndroidBridge::Bridge()->ReturnIMEQueryResult(
|
||||
event.mReply.mString.get(), event.mReply.mString.Length(), 0, 0);
|
||||
break;
|
||||
case NS_QUERY_SELECTED_TEXT:
|
||||
AndroidBridge::Bridge()->ReturnIMEQueryResult(
|
||||
event.mReply.mString.get(),
|
||||
event.mReply.mString.Length(),
|
||||
event.GetSelectionStart(),
|
||||
event.GetSelectionEnd() - event.GetSelectionStart());
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
TabParent::ReceiveMessage(const nsString& aMessage,
|
||||
PRBool aSync,
|
||||
|
@ -132,7 +132,6 @@ public:
|
||||
nsTArray<nsString>* aJSONRetVal);
|
||||
virtual bool RecvAsyncMessage(const nsString& aMessage,
|
||||
const nsString& aJSON);
|
||||
virtual bool RecvQueryContentResult(const nsQueryContentEvent& event);
|
||||
virtual PContentDialogParent* AllocPContentDialog(const PRUint32& aType,
|
||||
const nsCString& aName,
|
||||
const nsCString& aFeatures,
|
||||
|
@ -10348,7 +10348,7 @@ IsTraceableRecursion(JSContext *cx)
|
||||
return false;
|
||||
if (*fp->script->code != JSOP_TRACE)
|
||||
return false;
|
||||
return !fp->fun->isHeavyweight();
|
||||
return true;
|
||||
}
|
||||
|
||||
JS_REQUIRES_STACK AbortableRecordingStatus
|
||||
|
@ -1,3 +0,0 @@
|
||||
toolkit.jar:
|
||||
% content satchel %content/satchel/
|
||||
* content/satchel/formSubmitListener.js (src/formSubmitListener.js)
|
@ -1,211 +0,0 @@
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Mozilla Foundation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2010
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Justin Dolske <dolske@mozilla.com>
|
||||
* Paul O’Shannessy <paul@oshannessy.com>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
var Cc = Components.classes;
|
||||
var Ci = Components.interfaces;
|
||||
|
||||
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||
Components.utils.import("resource://gre/modules/Services.jsm");
|
||||
|
||||
var satchelFormListener = {
|
||||
QueryInterface : XPCOMUtils.generateQI([Ci.nsIFormSubmitObserver,
|
||||
Ci.nsIDOMEventListener,
|
||||
Ci.nsObserver,
|
||||
Ci.nsISupportsWeakReference]),
|
||||
|
||||
debug : true,
|
||||
enabled : true,
|
||||
saveHttpsForms : true,
|
||||
|
||||
init : function() {
|
||||
Services.obs.addObserver(this, "earlyformsubmit", false);
|
||||
Services.prefs.addObserver("browser.formfill.", this, false);
|
||||
this.updatePrefs();
|
||||
addEventListener("unload", this, false);
|
||||
},
|
||||
|
||||
updatePrefs : function () {
|
||||
this.debug = Services.prefs.getBoolPref("browser.formfill.debug");
|
||||
this.enabled = Services.prefs.getBoolPref("browser.formfill.enable");
|
||||
this.saveHttpsForms = Services.prefs.getBoolPref("browser.formfill.saveHttpsForms");
|
||||
},
|
||||
|
||||
// Implements the Luhn checksum algorithm as described at
|
||||
// http://wikipedia.org/wiki/Luhn_algorithm
|
||||
isValidCCNumber : function (ccNumber) {
|
||||
// Remove dashes and whitespace
|
||||
ccNumber = ccNumber.replace(/[\-\s]/g, '');
|
||||
|
||||
let len = ccNumber.length;
|
||||
if (len != 9 && len != 15 && len != 16)
|
||||
return false;
|
||||
|
||||
if (!/^\d+$/.test(ccNumber))
|
||||
return false;
|
||||
|
||||
let total = 0;
|
||||
for (let i = 0; i < len; i++) {
|
||||
let ch = parseInt(ccNumber[len - i - 1]);
|
||||
if (i % 2 == 1) {
|
||||
// Double it, add digits together if > 10
|
||||
ch *= 2;
|
||||
if (ch > 9)
|
||||
ch -= 9;
|
||||
}
|
||||
total += ch;
|
||||
}
|
||||
return total % 10 == 0;
|
||||
},
|
||||
|
||||
log : function (message) {
|
||||
if (!this.debug)
|
||||
return;
|
||||
dump("satchelFormListener: " + message + "\n");
|
||||
Services.console.logStringMessage("satchelFormListener: " + message);
|
||||
},
|
||||
|
||||
/* ---- dom event handler ---- */
|
||||
|
||||
handleEvent: function(e) {
|
||||
switch (e.type) {
|
||||
case "unload":
|
||||
Services.obs.removeObserver(this, "earlyformsubmit");
|
||||
Services.prefs.removeObserver("browser.formfill.", this);
|
||||
break;
|
||||
|
||||
default:
|
||||
this.log("Oops! Unexpected event: " + e.type);
|
||||
break;
|
||||
}
|
||||
},
|
||||
|
||||
/* ---- nsIObserver interface ---- */
|
||||
|
||||
observe : function (subject, topic, data) {
|
||||
if (topic == "nsPref:changed")
|
||||
this.updatePrefs();
|
||||
else
|
||||
this.log("Oops! Unexpected notification: " + topic);
|
||||
},
|
||||
|
||||
/* ---- nsIFormSubmitObserver interfaces ---- */
|
||||
|
||||
notify : function(form, domWin, actionURI, cancelSubmit) {
|
||||
try {
|
||||
// Even though the global context is for a specific browser, we
|
||||
// can receive observer events from other tabs! Ensure this event
|
||||
// is about our content.
|
||||
if (domWin.top != content)
|
||||
return;
|
||||
if (!this.enabled)
|
||||
return;
|
||||
|
||||
|
||||
this.log("Form submit observer notified.");
|
||||
|
||||
if (!this.saveHttpsForms) {
|
||||
if (actionURI.schemeIs("https"))
|
||||
return;
|
||||
if (form.ownerDocument.documentURIObject.schemeIs("https"))
|
||||
return;
|
||||
}
|
||||
|
||||
if (form.hasAttribute("autocomplete") &&
|
||||
form.getAttribute("autocomplete").toLowerCase() == "off")
|
||||
return;
|
||||
|
||||
let entries = [];
|
||||
for (let i = 0; i < form.elements.length; i++) {
|
||||
let input = form.elements[i];
|
||||
if (!(input instanceof Ci.nsIDOMHTMLInputElement))
|
||||
continue;
|
||||
|
||||
// Only use inputs that hold text values (not including type="password")
|
||||
if (!input.mozIsTextField(true))
|
||||
continue;
|
||||
|
||||
// Bug 394612: If Login Manager marked this input, don't save it.
|
||||
// The login manager will deal with remembering it.
|
||||
|
||||
// Don't save values when autocomplete=off is present.
|
||||
if (input.hasAttribute("autocomplete") &&
|
||||
input.getAttribute("autocomplete").toLowerCase() == "off")
|
||||
continue;
|
||||
|
||||
let value = input.value.trim();
|
||||
|
||||
// Don't save empty or unchanged values.
|
||||
if (!value || value == input.defaultValue.trim())
|
||||
continue;
|
||||
|
||||
// Don't save credit card numbers.
|
||||
if (this.isValidCCNumber(value)) {
|
||||
this.log("skipping saving a credit card number");
|
||||
continue;
|
||||
}
|
||||
|
||||
let name = input.name || input.id;
|
||||
if (!name)
|
||||
continue;
|
||||
|
||||
// Limit stored data to 200 characters.
|
||||
if (name.length > 200 || value.length > 200) {
|
||||
this.log("skipping input that has a name/value too large");
|
||||
continue;
|
||||
}
|
||||
|
||||
// Limit number of fields stored per form.
|
||||
if (entries.length >= 100) {
|
||||
this.log("not saving any more entries for this form.");
|
||||
break;
|
||||
}
|
||||
|
||||
entries.push({ name: name, value: value });
|
||||
}
|
||||
|
||||
if (entries.length) {
|
||||
this.log("sending entries to parent process for form " + form.id);
|
||||
sendAsyncMessage("FormHistory:FormSubmitEntries", entries);
|
||||
}
|
||||
}
|
||||
catch (e) {
|
||||
this.log("notify failed: " + e);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
satchelFormListener.init();
|
@ -52,14 +52,12 @@ function FormHistory() {
|
||||
|
||||
FormHistory.prototype = {
|
||||
classID : Components.ID("{0c1bb408-71a2-403f-854a-3a0659829ded}"),
|
||||
QueryInterface : XPCOMUtils.generateQI([Ci.nsIFormHistory2,
|
||||
Ci.nsIObserver,
|
||||
Ci.nsIFrameMessageListener,
|
||||
]),
|
||||
QueryInterface : XPCOMUtils.generateQI([Ci.nsIFormHistory2, Ci.nsIObserver, Ci.nsIFormSubmitObserver, Ci.nsISupportsWeakReference]),
|
||||
|
||||
debug : true,
|
||||
enabled : true,
|
||||
saveHttpsForms : true,
|
||||
prefBranch : null,
|
||||
|
||||
// The current database schema.
|
||||
dbSchema : {
|
||||
@ -126,19 +124,15 @@ FormHistory.prototype = {
|
||||
|
||||
init : function() {
|
||||
let self = this;
|
||||
|
||||
Services.prefs.addObserver("browser.formfill.", this, false);
|
||||
|
||||
this.prefBranch = Services.prefs.getBranch("browser.formfill.");
|
||||
this.prefBranch.QueryInterface(Ci.nsIPrefBranch2);
|
||||
this.prefBranch.addObserver("", this, true);
|
||||
this.updatePrefs();
|
||||
|
||||
this.dbStmts = {};
|
||||
|
||||
this.messageManager = Cc["@mozilla.org/globalmessagemanager;1"].
|
||||
getService(Ci.nsIChromeFrameMessageManager);
|
||||
this.messageManager.loadFrameScript("chrome://satchel/content/formSubmitListener.js", true);
|
||||
this.messageManager.addMessageListener("FormHistory:FormSubmitEntries", this);
|
||||
|
||||
// Add observers
|
||||
Services.obs.addObserver(this, "earlyformsubmit", false);
|
||||
Services.obs.addObserver(function() { self.expireOldEntries() }, "idle-daily", false);
|
||||
Services.obs.addObserver(function() { self.expireOldEntries() }, "formhistory-expire-now", false);
|
||||
|
||||
@ -161,26 +155,6 @@ FormHistory.prototype = {
|
||||
},
|
||||
|
||||
|
||||
/* ---- message listener ---- */
|
||||
|
||||
|
||||
receiveMessage: function receiveMessage(message) {
|
||||
// Open a transaction so multiple adds happen in one commit
|
||||
this.dbConnection.beginTransaction();
|
||||
|
||||
try {
|
||||
let entries = message.json;
|
||||
for (let i = 0; i < entries.length; i++) {
|
||||
this.addEntry(entries[i].name, entries[i].value);
|
||||
}
|
||||
} finally {
|
||||
// Don't need it to be atomic if there was an error. Commit what
|
||||
// we managed to put in the table.
|
||||
this.dbConnection.commitTransaction();
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
/* ---- nsIFormHistory2 interfaces ---- */
|
||||
|
||||
|
||||
@ -199,10 +173,10 @@ FormHistory.prototype = {
|
||||
let now = Date.now() * 1000; // microseconds
|
||||
|
||||
let [id, guid] = this.getExistingEntryID(name, value);
|
||||
let stmt;
|
||||
|
||||
if (id != -1) {
|
||||
// Update existing entry
|
||||
let stmt;
|
||||
let query = "UPDATE moz_formhistory SET timesUsed = timesUsed + 1, lastUsed = :lastUsed WHERE id = :id";
|
||||
let params = {
|
||||
lastUsed : now,
|
||||
@ -386,6 +360,87 @@ FormHistory.prototype = {
|
||||
},
|
||||
|
||||
|
||||
/* ---- nsIFormSubmitObserver interfaces ---- */
|
||||
|
||||
|
||||
notify : function(form, domWin, actionURI, cancelSubmit) {
|
||||
if (!this.enabled)
|
||||
return;
|
||||
|
||||
this.log("Form submit observer notified.");
|
||||
|
||||
if (!this.saveHttpsForms) {
|
||||
if (actionURI.schemeIs("https"))
|
||||
return;
|
||||
if (form.ownerDocument.documentURIObject.schemeIs("https"))
|
||||
return;
|
||||
}
|
||||
|
||||
if (form.hasAttribute("autocomplete") &&
|
||||
form.getAttribute("autocomplete").toLowerCase() == "off")
|
||||
return;
|
||||
|
||||
// Open a transaction so that multiple additions are efficient.
|
||||
this.dbConnection.beginTransaction();
|
||||
|
||||
try {
|
||||
let savedCount = 0;
|
||||
for (let i = 0; i < form.elements.length; i++) {
|
||||
let input = form.elements[i];
|
||||
if (!(input instanceof Ci.nsIDOMHTMLInputElement))
|
||||
continue;
|
||||
|
||||
// Only use inputs that hold text values (not including type="password")
|
||||
if (!input.mozIsTextField(true))
|
||||
continue;
|
||||
|
||||
// Bug 394612: If Login Manager marked this input, don't save it.
|
||||
// The login manager will deal with remembering it.
|
||||
|
||||
// Don't save values when autocomplete=off is present.
|
||||
if (input.hasAttribute("autocomplete") &&
|
||||
input.getAttribute("autocomplete").toLowerCase() == "off")
|
||||
continue;
|
||||
|
||||
let value = input.value.trim();
|
||||
|
||||
// Don't save empty or unchanged values.
|
||||
if (!value || value == input.defaultValue.trim())
|
||||
continue;
|
||||
|
||||
// Don't save credit card numbers.
|
||||
if (this.isValidCCNumber(value)) {
|
||||
this.log("skipping saving a credit card number");
|
||||
continue;
|
||||
}
|
||||
|
||||
let name = input.name || input.id;
|
||||
if (!name)
|
||||
continue;
|
||||
|
||||
// Limit stored data to 200 characters.
|
||||
if (name.length > 200 || value.length > 200) {
|
||||
this.log("skipping input that has a name/value too large");
|
||||
continue;
|
||||
}
|
||||
|
||||
// Limit number of fields stored per form.
|
||||
if (savedCount++ >= 100) {
|
||||
this.log("not saving any more entries for this form.");
|
||||
break;
|
||||
}
|
||||
|
||||
this.addEntry(name, value);
|
||||
}
|
||||
} catch (e) {
|
||||
// Empty
|
||||
} finally {
|
||||
// Save whatever we've added so far.
|
||||
this.dbConnection.commitTransaction();
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
/* ---- helpers ---- */
|
||||
|
||||
|
||||
@ -509,7 +564,7 @@ FormHistory.prototype = {
|
||||
// Determine how many days of history we're supposed to keep.
|
||||
let expireDays = 180;
|
||||
try {
|
||||
expireDays = Services.prefs.getIntPref("browser.formfill.expire_days");
|
||||
expireDays = this.prefBranch.getIntPref("expire_days");
|
||||
} catch (e) { /* ignore */ }
|
||||
|
||||
let expireTime = Date.now() - expireDays * DAY_IN_MS;
|
||||
@ -548,11 +603,41 @@ FormHistory.prototype = {
|
||||
|
||||
|
||||
updatePrefs : function () {
|
||||
this.debug = Services.prefs.getBoolPref("browser.formfill.debug");
|
||||
this.enabled = Services.prefs.getBoolPref("browser.formfill.enable");
|
||||
this.saveHttpsForms = Services.prefs.getBoolPref("browser.formfill.saveHttpsForms");
|
||||
this.debug = this.prefBranch.getBoolPref("debug");
|
||||
this.enabled = this.prefBranch.getBoolPref("enable");
|
||||
this.saveHttpsForms = this.prefBranch.getBoolPref("saveHttpsForms");
|
||||
},
|
||||
|
||||
|
||||
// Implements the Luhn checksum algorithm as described at
|
||||
// http://wikipedia.org/wiki/Luhn_algorithm
|
||||
isValidCCNumber : function (ccNumber) {
|
||||
// Remove dashes and whitespace
|
||||
ccNumber = ccNumber.replace(/[\-\s]/g, '');
|
||||
|
||||
let len = ccNumber.length;
|
||||
if (len != 9 && len != 15 && len != 16)
|
||||
return false;
|
||||
|
||||
if (!/^\d+$/.test(ccNumber))
|
||||
return false;
|
||||
|
||||
let total = 0;
|
||||
for (let i = 0; i < len; i++) {
|
||||
let ch = parseInt(ccNumber[len - i - 1]);
|
||||
if (i % 2 == 1) {
|
||||
// Double it, add digits together if > 10
|
||||
ch *= 2;
|
||||
if (ch > 9)
|
||||
ch -= 9;
|
||||
}
|
||||
total += ch;
|
||||
}
|
||||
return total % 10 == 0;
|
||||
},
|
||||
|
||||
|
||||
|
||||
//**************************************************************************//
|
||||
// Database Creation & Access
|
||||
|
||||
|
@ -35,11 +35,6 @@
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
|
||||
|
||||
Components.utils.import("resource://gre/modules/Services.jsm");
|
||||
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||
|
||||
/*
|
||||
* $_
|
||||
*
|
||||
@ -117,60 +112,3 @@ function cleanUpFormHist() {
|
||||
formhist.removeAllEntries();
|
||||
}
|
||||
cleanUpFormHist();
|
||||
|
||||
|
||||
var checkObserver = {
|
||||
verifyStack: [],
|
||||
callback: null,
|
||||
|
||||
waitForChecks: function(callback) {
|
||||
if (this.verifyStack.length == 0)
|
||||
callback();
|
||||
else
|
||||
this.callback = callback;
|
||||
},
|
||||
|
||||
observe: function(subject, topic, data) {
|
||||
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
|
||||
|
||||
if (data != "addEntry" && data != "modifyEntry")
|
||||
return;
|
||||
ok(this.verifyStack.length > 0, "checking if saved form data was expected");
|
||||
|
||||
// Make sure that every piece of data we expect to be saved is saved, and no
|
||||
// more. Here it is assumed that for every entry satchel saves or modifies, a
|
||||
// message is sent.
|
||||
//
|
||||
// We don't actually check the content of the message, but just that the right
|
||||
// quantity of messages is received.
|
||||
// - if there are too few messages, test will time out
|
||||
// - if there are too many messages, test will error out here
|
||||
//
|
||||
var expected = this.verifyStack.shift();
|
||||
ok(fh.entryExists(expected.name, expected.value), expected.message);
|
||||
|
||||
if (this.verifyStack.length == 0) {
|
||||
var callback = this.callback;
|
||||
this.callback = null;
|
||||
callback();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function checkForSave(name, value, message) {
|
||||
checkObserver.verifyStack.push({ name : name, value: value, message: message });
|
||||
}
|
||||
|
||||
|
||||
function getFormSubmitButton(formNum) {
|
||||
var form = $("form" + formNum); // by id, not name
|
||||
ok(form != null, "getting form " + formNum);
|
||||
|
||||
// we can't just call form.submit(), because that doesn't seem to
|
||||
// invoke the form onsubmit handler.
|
||||
var button = form.firstChild;
|
||||
while (button && button.type != "submit") { button = button.nextSibling; }
|
||||
ok(button != null, "getting form submit button");
|
||||
|
||||
return button;
|
||||
}
|
||||
|
@ -1,38 +1,9 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<form id="subform1" onsubmit="return checkSubmit(21)">
|
||||
<form id="subform">
|
||||
<input id="subtest1" type="text" name="subtest1">
|
||||
<button type="submit">Submit</button>
|
||||
</form>
|
||||
|
||||
<form id="subform2" onsubmit="return checkSubmit(100)">
|
||||
<input id="subtest2" type="text" name="subtest2">
|
||||
<button type="submit">Submit</button>
|
||||
</form>
|
||||
|
||||
<script>
|
||||
function checkSubmit(num) {
|
||||
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
|
||||
return parent.checkSubmit(num);
|
||||
}
|
||||
|
||||
function clickButton(num) {
|
||||
if (num == 21)
|
||||
document.querySelectorAll("button")[0].click();
|
||||
else if (num == 100)
|
||||
document.querySelectorAll("button")[1].click();
|
||||
}
|
||||
|
||||
// set the input's value (can't use a default value, as satchel will ignore it)
|
||||
document.getElementById("subtest1").value = "subtestValue";
|
||||
document.getElementById("subtest2").value = "subtestValue";
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
@ -9,7 +9,6 @@
|
||||
</head>
|
||||
<body>
|
||||
<p id="display"></p>
|
||||
<iframe id="iframe" src="https://example.com/tests/toolkit/components/satchel/test/subtst_form_submission_1.html"></iframe>
|
||||
<div id="content" style="display: none">
|
||||
|
||||
<!-- ===== Things that should not be saved. ===== -->
|
||||
@ -223,6 +222,9 @@
|
||||
<button type="submit">Submit</button>
|
||||
</form>
|
||||
|
||||
<iframe id="iframe1" src="https://example.com/tests/toolkit/components/satchel/test/subtst_form_submission_1.html"></iframe>
|
||||
<iframe id="iframe2" src="https://example.com/tests/toolkit/components/satchel/test/subtst_form_submission_1.html"></iframe>
|
||||
|
||||
<!-- form data submitted through HTTPS, when browser.formfill.saveHttpsForms is true -->
|
||||
<form id="form109" action="https://www.example.com/" onsubmit="return checkSubmit(109)">
|
||||
<input type="text" name="test9">
|
||||
@ -345,7 +347,7 @@ function checkSubmit(formNum) {
|
||||
ok(true, "form " + formNum + " submitted");
|
||||
numSubmittedForms++;
|
||||
|
||||
|
||||
|
||||
// Check for expected storage state.
|
||||
switch (formNum) {
|
||||
// Test 1-20 should not save anything.
|
||||
@ -369,63 +371,75 @@ function checkSubmit(formNum) {
|
||||
case 18:
|
||||
case 19:
|
||||
case 20:
|
||||
case 21:
|
||||
ok(!fh.hasEntries, "checking for empty storage");
|
||||
break;
|
||||
case 100:
|
||||
checkForSave("subtest2", "subtestValue", "checking saved subtest value");
|
||||
break;
|
||||
// The other tests do save data...
|
||||
case 101:
|
||||
checkForSave("test1", "savedValue", "checking saved value");
|
||||
ok(fh.entryExists("test1", "savedValue"), "checking saved value");
|
||||
break;
|
||||
case 102:
|
||||
checkForSave("test2", "savedValue", "checking saved value");
|
||||
ok(fh.entryExists("test2", "savedValue"), "checking saved value");
|
||||
break;
|
||||
case 103:
|
||||
checkForSave("test3", "savedValue", "checking saved value");
|
||||
ok(fh.entryExists("test3", "savedValue"), "checking saved value");
|
||||
break;
|
||||
case 104:
|
||||
checkForSave("test4", "trimTrailingAndLeadingSpace", "checking saved value is trimmed on both sides");
|
||||
ok(fh.entryExists("test4", "trimTrailingAndLeadingSpace"), "checking saved value is trimmed on both sides");
|
||||
break;
|
||||
case 105:
|
||||
checkForSave("test5", "trimTrailingAndLeadingWhitespace", "checking saved value is trimmed on both sides");
|
||||
ok(fh.entryExists("test5", "trimTrailingAndLeadingWhitespace"), "checking saved value is trimmed on both sides");
|
||||
break;
|
||||
case 106:
|
||||
checkForSave("test6", "00000000109181", "checking saved value");
|
||||
ok(fh.entryExists("test6", "00000000109181"), "checking saved value");
|
||||
break;
|
||||
case 107:
|
||||
for (var i = 0; i != ccNumbers.invalid16.length; i++) {
|
||||
checkForSave("test7_" + (i + 1), ccNumbers.invalid16[i], "checking saved value");
|
||||
ok(fh.entryExists("test7_" + (i + 1), ccNumbers.invalid16[i]), "checking saved value");
|
||||
}
|
||||
break;
|
||||
case 108:
|
||||
for (var i = 0; i != ccNumbers.invalid15.length; i++) {
|
||||
checkForSave("test8_" + (i + 1), ccNumbers.invalid15[i], "checking saved value");
|
||||
ok(fh.entryExists("test8_" + (i + 1), ccNumbers.invalid15[i]), "checking saved value");
|
||||
}
|
||||
break;
|
||||
case 109:
|
||||
checkForSave("test9", "savedValue", "checking saved value");
|
||||
ok(fh.entryExists("test9", "savedValue"), "checking saved value");
|
||||
break;
|
||||
case 110:
|
||||
checkForSave("test10", "savedValue", "checking saved value");
|
||||
ok(fh.entryExists("test10", "savedValue"), "checking saved value");
|
||||
break;
|
||||
default:
|
||||
ok(false, "Unexpected form submission");
|
||||
break;
|
||||
}
|
||||
|
||||
// Forms 13 and 14 would trigger a save-password notification. Temporarily
|
||||
// Forms 13 and 14 would trigger a save-password notification. Tempoarily
|
||||
// disable pwmgr, then reenable it.
|
||||
if (formNum == 12)
|
||||
prefBranch.setBoolPref("signon.rememberSignons", false);
|
||||
if (formNum == 14)
|
||||
prefBranch.clearUserPref("signon.rememberSignons");
|
||||
|
||||
// Forms 20 and 21 requires browser.formfill.saveHttpsForms to be false
|
||||
if (formNum == 19)
|
||||
// Form 20 requires browser.formfill.saveHttpsForms to be false
|
||||
// Run a couple subtests here, which submit forms from an HTTPS origin,
|
||||
// these are loaded in iframes since the test suite isn't HTTPS. The subtest
|
||||
// before the pref change should save a value, the (same) subtest run after
|
||||
// the pref change should not.
|
||||
if (formNum == 19) {
|
||||
ok(true, "submitting subtest1");
|
||||
var iframe = document.getElementById("iframe1");
|
||||
iframe.contentDocument.forms[0].submit();
|
||||
ok(fh.entryExists("subtest1", "subtestValue"), "checking saved subtest value");
|
||||
fh.removeEntriesForName("subtest1");
|
||||
|
||||
prefBranch.setBoolPref("browser.formfill.saveHttpsForms", false);
|
||||
// Reset preference now that 20 and 21 are over
|
||||
if (formNum == 21)
|
||||
|
||||
ok(true, "submitting subtest1");
|
||||
iframe = document.getElementById("iframe2");
|
||||
iframe.contentDocument.forms[0].submit();
|
||||
ok(!fh.entryExists("subtest1", "subtestValue"), "checking unsaved subtest value");
|
||||
}
|
||||
if (formNum == 20)
|
||||
prefBranch.clearUserPref("browser.formfill.saveHttpsForms");
|
||||
|
||||
// Form 109 requires browser.formfill.save_https_forms to be true;
|
||||
@ -439,42 +453,32 @@ function checkSubmit(formNum) {
|
||||
|
||||
// End the test at the last form.
|
||||
if (formNum == 110) {
|
||||
is(numSubmittedForms, 32, "Ensuring all forms were submitted.");
|
||||
Services.obs.removeObserver(checkObserver, "satchel-storage-changed");
|
||||
is(numSubmittedForms, 30, "Ensuring all forms were submitted.");
|
||||
SimpleTest.finish();
|
||||
return false; // return false to cancel current form submission
|
||||
}
|
||||
|
||||
// This timeout is here so that button.click() is never called before this
|
||||
// function returns. If button.click() is called before returning, a long
|
||||
// chain of submits will happen recursively since the submit is dispatched
|
||||
// immediately.
|
||||
//
|
||||
// This in itself is fine, but if there are errors in the code, mochitests
|
||||
// will in some cases give you "server too busy", which is hard to debug!
|
||||
//
|
||||
setTimeout(function() {
|
||||
checkObserver.waitForChecks(function() {
|
||||
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
|
||||
|
||||
var nextFormNum = formNum == 21 ? 100 : (formNum + 1);
|
||||
|
||||
// Submit the next form. Special cases are Forms 21 and 100, which happen
|
||||
// from an HTTPS domain in an iframe.
|
||||
if (nextFormNum == 21 || nextFormNum == 100) {
|
||||
ok(true, "submitting iframe test " + nextFormNum);
|
||||
document.getElementById("iframe").contentWindow.clickButton(nextFormNum);
|
||||
}
|
||||
else {
|
||||
var button = getFormSubmitButton(nextFormNum);
|
||||
button.click();
|
||||
}
|
||||
});
|
||||
}, 0);
|
||||
// submit the next form.
|
||||
var button = getFormSubmitButton(formNum == 20 ? 101 : (formNum + 1));
|
||||
button.click();
|
||||
|
||||
return false; // cancel current form submission
|
||||
}
|
||||
|
||||
|
||||
function getFormSubmitButton(formNum) {
|
||||
var form = $("form" + formNum); // by id, not name
|
||||
ok(form != null, "getting form " + formNum);
|
||||
|
||||
// we can't just call form.submit(), because that doesn't seem to
|
||||
// invoke the form onsubmit handler.
|
||||
var button = form.firstChild;
|
||||
while (button && button.type != "submit") { button = button.nextSibling; }
|
||||
ok(button != null, "getting form submit button");
|
||||
|
||||
return button;
|
||||
}
|
||||
|
||||
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
|
||||
|
||||
var fh = Components.classes["@mozilla.org/satchel/form-history;1"].
|
||||
@ -484,8 +488,6 @@ ok(fh != null, "Got formHistory service");
|
||||
var prefBranch = Components.classes["@mozilla.org/preferences-service;1"].
|
||||
getService(Components.interfaces.nsIPrefBranch);
|
||||
|
||||
Services.obs.addObserver(checkObserver, "satchel-storage-changed", false);
|
||||
|
||||
window.onload = startTest;
|
||||
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
|
@ -63,27 +63,41 @@ function checkSubmit(formNum) {
|
||||
|
||||
// check that the first (numInputFields - 1) CHANGED fields are saved
|
||||
for (i = 1; i < numInputFields; i++) { // check all but last
|
||||
checkForSave("test" + i, i, "checking saved value " + i);
|
||||
ok(fh.entryExists("test" + i, i), "checking saved value " + i);
|
||||
}
|
||||
|
||||
// make sure that the remaining changed fields are not saved
|
||||
ok(!fh.entryExists("test" + numInputFields, numInputFields), "checking unsaved value " + numInputFields);
|
||||
|
||||
|
||||
// End the test at the last form.
|
||||
if (formNum == 1) {
|
||||
is(numSubmittedForms, 1, "Ensuring all forms were submitted.");
|
||||
Services.obs.removeObserver(checkObserver, "satchel-storage-changed");
|
||||
SimpleTest.finish();
|
||||
return false; // return false to cancel current form submission
|
||||
}
|
||||
|
||||
checkObserver.waitForChecks(function() {
|
||||
// submit the next form.
|
||||
var button = getFormSubmitButton(formNum + 1);
|
||||
button.click();
|
||||
});
|
||||
// submit the next form.
|
||||
var button = getFormSubmitButton(formNum + 1);
|
||||
button.click();
|
||||
|
||||
return false; // cancel current form submission
|
||||
}
|
||||
|
||||
|
||||
function getFormSubmitButton(formNum) {
|
||||
var form = $("form" + formNum); // by id, not name
|
||||
ok(form != null, "getting form " + formNum);
|
||||
|
||||
// we can't just call form.submit(), because that doesn't seem to
|
||||
// invoke the form onsubmit handler.
|
||||
var button = form.firstChild;
|
||||
while (button && button.type != "submit") { button = button.nextSibling; }
|
||||
ok(button != null, "getting form submit button");
|
||||
|
||||
return button;
|
||||
}
|
||||
|
||||
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
|
||||
|
||||
var fh = Components.classes["@mozilla.org/satchel/form-history;1"].
|
||||
@ -92,8 +106,6 @@ ok(fh != null, "Got formHistory service");
|
||||
|
||||
window.onload = startTest;
|
||||
|
||||
Services.obs.addObserver(checkObserver, "satchel-storage-changed", false);
|
||||
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
|
||||
</script>
|
||||
|
@ -155,27 +155,37 @@ function checkSubmit(formNum) {
|
||||
}
|
||||
|
||||
// make sure that the field # numInputFields was saved
|
||||
checkForSave("test" + numInputFields, numInputFields + " changed", "checking saved value " + numInputFields);
|
||||
ok(fh.entryExists("test" + numInputFields, numInputFields + " changed"), "checking saved value " + numInputFields);
|
||||
|
||||
|
||||
// End the test at the last form.
|
||||
if (formNum == 1) {
|
||||
is(numSubmittedForms, 1, "Ensuring all forms were submitted.");
|
||||
Services.obs.removeObserver(checkObserver, "satchel-storage-changed");
|
||||
SimpleTest.finish();
|
||||
return false; // return false to cancel current form submission
|
||||
}
|
||||
|
||||
checkObserver.waitForChecks(function() {
|
||||
// submit the next form.
|
||||
var button = getFormSubmitButton(formNum + 1);
|
||||
button.click();
|
||||
});
|
||||
// submit the next form.
|
||||
var button = getFormSubmitButton(formNum + 1);
|
||||
button.click();
|
||||
|
||||
return false; // cancel current form submission
|
||||
}
|
||||
|
||||
|
||||
function getFormSubmitButton(formNum) {
|
||||
var form = $("form" + formNum); // by id, not name
|
||||
ok(form != null, "getting form " + formNum);
|
||||
|
||||
// we can't just call form.submit(), because that doesn't seem to
|
||||
// invoke the form onsubmit handler.
|
||||
var button = form.firstChild;
|
||||
while (button && button.type != "submit") { button = button.nextSibling; }
|
||||
ok(button != null, "getting form submit button");
|
||||
|
||||
return button;
|
||||
}
|
||||
|
||||
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
|
||||
|
||||
var fh = Components.classes["@mozilla.org/satchel/form-history;1"].
|
||||
@ -184,8 +194,6 @@ ok(fh != null, "Got formHistory service");
|
||||
|
||||
window.onload = startTest;
|
||||
|
||||
Services.obs.addObserver(checkObserver, "satchel-storage-changed", false);
|
||||
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
|
||||
</script>
|
||||
|
@ -46,12 +46,6 @@ MODULE = widget
|
||||
XPIDL_MODULE = widget
|
||||
GRE_MODULE = 1
|
||||
|
||||
EXPORTS_NAMESPACES = mozilla/widget
|
||||
|
||||
EXPORTS_mozilla/widget = \
|
||||
nsGUIEventIPC.h \
|
||||
$(NULL)
|
||||
|
||||
EXPORTS = \
|
||||
nsIWidget.h \
|
||||
nsGUIEvent.h \
|
||||
|
@ -60,15 +60,6 @@
|
||||
#include "nsITransferable.h"
|
||||
#include "nsIVariant.h"
|
||||
|
||||
#ifdef MOZ_IPC
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
class PBrowserParent;
|
||||
class PBrowserChild;
|
||||
}
|
||||
}
|
||||
#endif // MOZ_IPC
|
||||
|
||||
#ifdef ACCESSIBILITY
|
||||
class nsAccessible;
|
||||
#endif
|
||||
@ -518,12 +509,6 @@ protected:
|
||||
MOZ_COUNT_CTOR(nsEvent);
|
||||
}
|
||||
|
||||
#ifdef MOZ_IPC
|
||||
nsEvent()
|
||||
{
|
||||
}
|
||||
#endif // MOZ_IPC
|
||||
|
||||
public:
|
||||
nsEvent(PRBool isTrusted, PRUint32 msg)
|
||||
: eventStructType(NS_EVENT),
|
||||
@ -575,13 +560,6 @@ protected:
|
||||
{
|
||||
}
|
||||
|
||||
#ifdef MOZ_IPC
|
||||
nsGUIEvent()
|
||||
: pluginEvent(nsnull)
|
||||
{
|
||||
}
|
||||
#endif // MOZ_IPC
|
||||
|
||||
public:
|
||||
nsGUIEvent(PRBool isTrusted, PRUint32 msg, nsIWidget *w)
|
||||
: nsEvent(isTrusted, msg, NS_GUI_EVENT),
|
||||
@ -746,12 +724,6 @@ protected:
|
||||
{
|
||||
}
|
||||
|
||||
#ifdef MOZ_IPC
|
||||
nsInputEvent()
|
||||
{
|
||||
}
|
||||
#endif // MOZ_IPC
|
||||
|
||||
public:
|
||||
nsInputEvent(PRBool isTrusted, PRUint32 msg, nsIWidget *w)
|
||||
: nsGUIEvent(isTrusted, msg, w, NS_INPUT_EVENT),
|
||||
@ -1048,16 +1020,6 @@ typedef nsTextRange* nsTextRangeArray;
|
||||
|
||||
class nsTextEvent : public nsInputEvent
|
||||
{
|
||||
#ifdef MOZ_IPC
|
||||
private:
|
||||
friend class mozilla::dom::PBrowserParent;
|
||||
friend class mozilla::dom::PBrowserChild;
|
||||
|
||||
nsTextEvent()
|
||||
{
|
||||
}
|
||||
#endif // MOZ_IPC
|
||||
|
||||
public:
|
||||
nsTextEvent(PRBool isTrusted, PRUint32 msg, nsIWidget *w)
|
||||
: nsInputEvent(isTrusted, msg, w, NS_TEXT_EVENT),
|
||||
@ -1076,16 +1038,6 @@ public:
|
||||
|
||||
class nsCompositionEvent : public nsInputEvent
|
||||
{
|
||||
#ifdef MOZ_IPC
|
||||
private:
|
||||
friend class mozilla::dom::PBrowserParent;
|
||||
friend class mozilla::dom::PBrowserChild;
|
||||
|
||||
nsCompositionEvent()
|
||||
{
|
||||
}
|
||||
#endif // MOZ_IPC
|
||||
|
||||
public:
|
||||
nsCompositionEvent(PRBool isTrusted, PRUint32 msg, nsIWidget *w)
|
||||
: nsInputEvent(isTrusted, msg, w, NS_COMPOSITION_EVENT)
|
||||
@ -1200,22 +1152,10 @@ public:
|
||||
|
||||
class nsQueryContentEvent : public nsGUIEvent
|
||||
{
|
||||
#ifdef MOZ_IPC
|
||||
private:
|
||||
friend class mozilla::dom::PBrowserParent;
|
||||
friend class mozilla::dom::PBrowserChild;
|
||||
|
||||
nsQueryContentEvent()
|
||||
{
|
||||
mReply.mContentsRoot = nsnull;
|
||||
mReply.mFocusedWidget = nsnull;
|
||||
}
|
||||
#endif // MOZ_IPC
|
||||
|
||||
public:
|
||||
nsQueryContentEvent(PRBool aIsTrusted, PRUint32 aMsg, nsIWidget *aWidget) :
|
||||
nsGUIEvent(aIsTrusted, aMsg, aWidget, NS_QUERY_CONTENT_EVENT),
|
||||
mSucceeded(PR_FALSE), mWasAsync(PR_FALSE)
|
||||
mSucceeded(PR_FALSE)
|
||||
{
|
||||
}
|
||||
|
||||
@ -1242,22 +1182,7 @@ public:
|
||||
mInput.mLength = aLength;
|
||||
}
|
||||
|
||||
PRUint32 GetSelectionStart(void) const
|
||||
{
|
||||
NS_ASSERTION(message == NS_QUERY_SELECTED_TEXT,
|
||||
"not querying selection");
|
||||
return mReply.mOffset + (mReply.mReversed ? mReply.mString.Length() : 0);
|
||||
}
|
||||
|
||||
PRUint32 GetSelectionEnd(void) const
|
||||
{
|
||||
NS_ASSERTION(message == NS_QUERY_SELECTED_TEXT,
|
||||
"not querying selection");
|
||||
return mReply.mOffset + (mReply.mReversed ? 0 : mReply.mString.Length());
|
||||
}
|
||||
|
||||
PRBool mSucceeded;
|
||||
PRPackedBool mWasAsync;
|
||||
struct {
|
||||
PRUint32 mOffset;
|
||||
PRUint32 mLength;
|
||||
@ -1294,16 +1219,6 @@ public:
|
||||
|
||||
class nsSelectionEvent : public nsGUIEvent
|
||||
{
|
||||
#ifdef MOZ_IPC
|
||||
private:
|
||||
friend class mozilla::dom::PBrowserParent;
|
||||
friend class mozilla::dom::PBrowserChild;
|
||||
|
||||
nsSelectionEvent()
|
||||
{
|
||||
}
|
||||
#endif // MOZ_IPC
|
||||
|
||||
public:
|
||||
nsSelectionEvent(PRBool aIsTrusted, PRUint32 aMsg, nsIWidget *aWidget) :
|
||||
nsGUIEvent(aIsTrusted, aMsg, aWidget, NS_SELECTION_EVENT),
|
||||
|
@ -1,284 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* The Mozilla Foundation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2010
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#ifndef nsGUIEventIPC_h__
|
||||
#define nsGUIEventIPC_h__
|
||||
|
||||
#include "IPC/IPCMessageUtils.h"
|
||||
#include "nsGUIEvent.h"
|
||||
|
||||
namespace IPC
|
||||
{
|
||||
|
||||
template<>
|
||||
struct ParamTraits<nsEvent>
|
||||
{
|
||||
typedef nsEvent paramType;
|
||||
|
||||
static void Write(Message* aMsg, const paramType& aParam)
|
||||
{
|
||||
WriteParam(aMsg, aParam.eventStructType);
|
||||
WriteParam(aMsg, aParam.message);
|
||||
WriteParam(aMsg, aParam.refPoint);
|
||||
WriteParam(aMsg, aParam.time);
|
||||
WriteParam(aMsg, aParam.flags);
|
||||
}
|
||||
|
||||
static bool Read(const Message* aMsg, void** aIter, paramType* aResult)
|
||||
{
|
||||
return ReadParam(aMsg, aIter, &aResult->eventStructType) &&
|
||||
ReadParam(aMsg, aIter, &aResult->message) &&
|
||||
ReadParam(aMsg, aIter, &aResult->refPoint) &&
|
||||
ReadParam(aMsg, aIter, &aResult->time) &&
|
||||
ReadParam(aMsg, aIter, &aResult->flags);
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
struct ParamTraits<nsGUIEvent>
|
||||
{
|
||||
typedef nsGUIEvent paramType;
|
||||
|
||||
static void Write(Message* aMsg, const paramType& aParam)
|
||||
{
|
||||
WriteParam(aMsg, static_cast<nsEvent>(aParam));
|
||||
}
|
||||
|
||||
static bool Read(const Message* aMsg, void** aIter, paramType* aResult)
|
||||
{
|
||||
return ReadParam(aMsg, aIter, static_cast<nsEvent*>(aResult));
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
struct ParamTraits<nsInputEvent>
|
||||
{
|
||||
typedef nsInputEvent paramType;
|
||||
|
||||
static void Write(Message* aMsg, const paramType& aParam)
|
||||
{
|
||||
WriteParam(aMsg, static_cast<nsGUIEvent>(aParam));
|
||||
WriteParam(aMsg, aParam.isShift);
|
||||
WriteParam(aMsg, aParam.isControl);
|
||||
WriteParam(aMsg, aParam.isAlt);
|
||||
WriteParam(aMsg, aParam.isMeta);
|
||||
}
|
||||
|
||||
static bool Read(const Message* aMsg, void** aIter, paramType* aResult)
|
||||
{
|
||||
return ReadParam(aMsg, aIter, static_cast<nsGUIEvent*>(aResult)) &&
|
||||
ReadParam(aMsg, aIter, &aResult->isShift) &&
|
||||
ReadParam(aMsg, aIter, &aResult->isControl) &&
|
||||
ReadParam(aMsg, aIter, &aResult->isAlt) &&
|
||||
ReadParam(aMsg, aIter, &aResult->isMeta);
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
struct ParamTraits<nsTextRangeStyle>
|
||||
{
|
||||
typedef nsTextRangeStyle paramType;
|
||||
|
||||
static void Write(Message* aMsg, const paramType& aParam)
|
||||
{
|
||||
WriteParam(aMsg, aParam.mDefinedStyles);
|
||||
WriteParam(aMsg, aParam.mLineStyle);
|
||||
WriteParam(aMsg, aParam.mIsBoldLine);
|
||||
WriteParam(aMsg, aParam.mForegroundColor);
|
||||
WriteParam(aMsg, aParam.mBackgroundColor);
|
||||
WriteParam(aMsg, aParam.mUnderlineColor);
|
||||
}
|
||||
|
||||
static bool Read(const Message* aMsg, void** aIter, paramType* aResult)
|
||||
{
|
||||
return ReadParam(aMsg, aIter, &aResult->mDefinedStyles) &&
|
||||
ReadParam(aMsg, aIter, &aResult->mLineStyle) &&
|
||||
ReadParam(aMsg, aIter, &aResult->mIsBoldLine) &&
|
||||
ReadParam(aMsg, aIter, &aResult->mForegroundColor) &&
|
||||
ReadParam(aMsg, aIter, &aResult->mBackgroundColor) &&
|
||||
ReadParam(aMsg, aIter, &aResult->mUnderlineColor);
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
struct ParamTraits<nsTextRange>
|
||||
{
|
||||
typedef nsTextRange paramType;
|
||||
|
||||
static void Write(Message* aMsg, const paramType& aParam)
|
||||
{
|
||||
WriteParam(aMsg, aParam.mStartOffset);
|
||||
WriteParam(aMsg, aParam.mEndOffset);
|
||||
WriteParam(aMsg, aParam.mRangeType);
|
||||
WriteParam(aMsg, aParam.mRangeStyle);
|
||||
}
|
||||
|
||||
static bool Read(const Message* aMsg, void** aIter, paramType* aResult)
|
||||
{
|
||||
return ReadParam(aMsg, aIter, &aResult->mStartOffset) &&
|
||||
ReadParam(aMsg, aIter, &aResult->mEndOffset) &&
|
||||
ReadParam(aMsg, aIter, &aResult->mRangeType) &&
|
||||
ReadParam(aMsg, aIter, &aResult->mRangeStyle);
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
struct ParamTraits<nsTextEvent>
|
||||
{
|
||||
typedef nsTextEvent paramType;
|
||||
|
||||
static void Write(Message* aMsg, const paramType& aParam)
|
||||
{
|
||||
WriteParam(aMsg, static_cast<nsInputEvent>(aParam));
|
||||
WriteParam(aMsg, aParam.theText);
|
||||
WriteParam(aMsg, aParam.isChar);
|
||||
WriteParam(aMsg, aParam.rangeCount);
|
||||
for (PRUint32 index = 0; index < aParam.rangeCount; index++)
|
||||
WriteParam(aMsg, aParam.rangeArray[index]);
|
||||
}
|
||||
|
||||
static bool Read(const Message* aMsg, void** aIter, paramType* aResult)
|
||||
{
|
||||
if (!ReadParam(aMsg, aIter, static_cast<nsInputEvent*>(aResult)) ||
|
||||
!ReadParam(aMsg, aIter, &aResult->theText) ||
|
||||
!ReadParam(aMsg, aIter, &aResult->isChar) ||
|
||||
!ReadParam(aMsg, aIter, &aResult->rangeCount))
|
||||
return false;
|
||||
|
||||
if (!aResult->rangeCount) {
|
||||
aResult->rangeArray = nsnull;
|
||||
return true;
|
||||
}
|
||||
|
||||
aResult->rangeArray = new nsTextRange[aResult->rangeCount];
|
||||
if (!aResult->rangeArray)
|
||||
return false;
|
||||
|
||||
for (PRUint32 index = 0; index < aResult->rangeCount; index++)
|
||||
if (!ReadParam(aMsg, aIter, &aResult->rangeArray[index])) {
|
||||
Free(*aResult);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static void Free(const paramType& aResult)
|
||||
{
|
||||
if (aResult.rangeArray)
|
||||
delete [] aResult.rangeArray;
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
struct ParamTraits<nsCompositionEvent>
|
||||
{
|
||||
typedef nsCompositionEvent paramType;
|
||||
|
||||
static void Write(Message* aMsg, const paramType& aParam)
|
||||
{
|
||||
WriteParam(aMsg, static_cast<nsInputEvent>(aParam));
|
||||
}
|
||||
|
||||
static bool Read(const Message* aMsg, void** aIter, paramType* aResult)
|
||||
{
|
||||
return ReadParam(aMsg, aIter, static_cast<nsInputEvent*>(aResult));
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
struct ParamTraits<nsQueryContentEvent>
|
||||
{
|
||||
typedef nsQueryContentEvent paramType;
|
||||
|
||||
static void Write(Message* aMsg, const paramType& aParam)
|
||||
{
|
||||
WriteParam(aMsg, static_cast<nsGUIEvent>(aParam));
|
||||
WriteParam(aMsg, aParam.mSucceeded);
|
||||
WriteParam(aMsg, aParam.mInput.mOffset);
|
||||
WriteParam(aMsg, aParam.mInput.mLength);
|
||||
WriteParam(aMsg, aParam.mReply.mOffset);
|
||||
WriteParam(aMsg, aParam.mReply.mString);
|
||||
WriteParam(aMsg, aParam.mReply.mRect);
|
||||
WriteParam(aMsg, aParam.mReply.mReversed);
|
||||
WriteParam(aMsg, aParam.mReply.mHasSelection);
|
||||
}
|
||||
|
||||
static bool Read(const Message* aMsg, void** aIter, paramType* aResult)
|
||||
{
|
||||
aResult->mWasAsync = PR_TRUE;
|
||||
return ReadParam(aMsg, aIter, static_cast<nsGUIEvent*>(aResult)) &&
|
||||
ReadParam(aMsg, aIter, &aResult->mSucceeded) &&
|
||||
ReadParam(aMsg, aIter, &aResult->mInput.mOffset) &&
|
||||
ReadParam(aMsg, aIter, &aResult->mInput.mLength) &&
|
||||
ReadParam(aMsg, aIter, &aResult->mReply.mOffset) &&
|
||||
ReadParam(aMsg, aIter, &aResult->mReply.mString) &&
|
||||
ReadParam(aMsg, aIter, &aResult->mReply.mRect) &&
|
||||
ReadParam(aMsg, aIter, &aResult->mReply.mReversed) &&
|
||||
ReadParam(aMsg, aIter, &aResult->mReply.mHasSelection);
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
struct ParamTraits<nsSelectionEvent>
|
||||
{
|
||||
typedef nsSelectionEvent paramType;
|
||||
|
||||
static void Write(Message* aMsg, const paramType& aParam)
|
||||
{
|
||||
WriteParam(aMsg, static_cast<nsGUIEvent>(aParam));
|
||||
WriteParam(aMsg, aParam.mOffset);
|
||||
WriteParam(aMsg, aParam.mLength);
|
||||
WriteParam(aMsg, aParam.mReversed);
|
||||
WriteParam(aMsg, aParam.mExpandToClusterBoundary);
|
||||
WriteParam(aMsg, aParam.mSucceeded);
|
||||
}
|
||||
|
||||
static bool Read(const Message* aMsg, void** aIter, paramType* aResult)
|
||||
{
|
||||
return ReadParam(aMsg, aIter, static_cast<nsGUIEvent*>(aResult)) &&
|
||||
ReadParam(aMsg, aIter, &aResult->mOffset) &&
|
||||
ReadParam(aMsg, aIter, &aResult->mLength) &&
|
||||
ReadParam(aMsg, aIter, &aResult->mReversed) &&
|
||||
ReadParam(aMsg, aIter, &aResult->mExpandToClusterBoundary) &&
|
||||
ReadParam(aMsg, aIter, &aResult->mSucceeded);
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace IPC
|
||||
|
||||
#endif // nsGUIEventIPC_h__
|
||||
|
@ -37,10 +37,7 @@
|
||||
|
||||
#include <android/log.h>
|
||||
|
||||
#ifdef MOZ_IPC
|
||||
#include "mozilla/dom/ContentChild.h"
|
||||
#include "nsXULAppAPI.h"
|
||||
#endif
|
||||
#include <pthread.h>
|
||||
#include <prthread.h>
|
||||
#include "nsXPCOMStrings.h"
|
||||
@ -195,12 +192,8 @@ AndroidBridge::NotifyIME(int aType, int aState)
|
||||
if (sBridge)
|
||||
JNI()->CallStaticVoidMethod(sBridge->mGeckoAppShellClass,
|
||||
sBridge->jNotifyIME, aType, aState);
|
||||
#ifdef MOZ_IPC
|
||||
// It's possible that we are in chrome process
|
||||
// but sBridge is not initialized yet
|
||||
else if (XRE_GetProcessType() == GeckoProcessType_Content)
|
||||
else
|
||||
mozilla::dom::ContentChild::GetSingleton()->SendNotifyIME(aType, aState);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
@ -208,11 +201,9 @@ AndroidBridge::NotifyIMEChange(const PRUnichar *aText, PRUint32 aTextLen,
|
||||
int aStart, int aEnd, int aNewEnd)
|
||||
{
|
||||
if (!sBridge) {
|
||||
#ifdef MOZ_IPC
|
||||
mozilla::dom::ContentChild::GetSingleton()->
|
||||
SendNotifyIMEChange(nsAutoString(aText), aTextLen,
|
||||
aStart, aEnd, aNewEnd);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1365,11 +1365,11 @@ nsWindow::OnIMEEvent(AndroidGeckoEvent *ae)
|
||||
AndroidBridge::Bridge()->ReturnIMEQueryResult(
|
||||
nsnull, 0, 0, 0);
|
||||
return;
|
||||
} else if (!event.mWasAsync) {
|
||||
AndroidBridge::Bridge()->ReturnIMEQueryResult(
|
||||
event.mReply.mString.get(),
|
||||
event.mReply.mString.Length(), 0, 0);
|
||||
}
|
||||
|
||||
AndroidBridge::Bridge()->ReturnIMEQueryResult(
|
||||
event.mReply.mString.get(),
|
||||
event.mReply.mString.Length(), 0, 0);
|
||||
//ALOGIME("IME: -> l=%u", event.mReply.mString.Length());
|
||||
}
|
||||
return;
|
||||
@ -1411,13 +1411,21 @@ nsWindow::OnIMEEvent(AndroidGeckoEvent *ae)
|
||||
AndroidBridge::Bridge()->ReturnIMEQueryResult(
|
||||
nsnull, 0, 0, 0);
|
||||
return;
|
||||
} else if (!event.mWasAsync) {
|
||||
AndroidBridge::Bridge()->ReturnIMEQueryResult(
|
||||
event.mReply.mString.get(),
|
||||
event.mReply.mString.Length(),
|
||||
event.GetSelectionStart(),
|
||||
event.GetSelectionEnd() - event.GetSelectionStart());
|
||||
}
|
||||
|
||||
int selStart = int(event.mReply.mOffset +
|
||||
(event.mReply.mReversed ?
|
||||
event.mReply.mString.Length() : 0));
|
||||
|
||||
int selLength = event.mReply.mReversed ?
|
||||
int(event.mReply.mString.Length()) :
|
||||
-int(event.mReply.mString.Length());
|
||||
|
||||
AndroidBridge::Bridge()->ReturnIMEQueryResult(
|
||||
event.mReply.mString.get(),
|
||||
event.mReply.mString.Length(),
|
||||
selStart, selLength);
|
||||
|
||||
//ALOGIME("IME: -> o=%u, l=%u", event.mReply.mOffset, event.mReply.mString.Length());
|
||||
}
|
||||
return;
|
||||
@ -1512,9 +1520,10 @@ NS_IMETHODIMP
|
||||
nsWindow::OnIMEFocusChange(PRBool aFocus)
|
||||
{
|
||||
ALOGIME("IME: OnIMEFocusChange: f=%d", aFocus);
|
||||
|
||||
AndroidBridge::NotifyIME(AndroidBridge::NOTIFY_IME_FOCUSCHANGE,
|
||||
int(aFocus));
|
||||
|
||||
if (AndroidBridge::Bridge())
|
||||
AndroidBridge::NotifyIME(AndroidBridge::NOTIFY_IME_FOCUSCHANGE,
|
||||
int(aFocus));
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user