void nsFormFillController::RemoveWindowListeners(nsIDOMWindow *aWindow) { if (!aWindow) return; StopControllingInput(); nsCOMPtr<nsIDOMDocument> domDoc; aWindow->GetDocument(getter_AddRefs(domDoc)); mPwmgrInputs.Enumerate(RemoveForDOMDocumentEnumerator, domDoc); nsCOMPtr<nsPIDOMWindow> privateDOMWindow(do_QueryInterface(aWindow)); nsIDOMEventTarget* target = nsnull; if (privateDOMWindow) target = privateDOMWindow->GetChromeEventHandler(); if (!target) return; target->RemoveEventListener(NS_LITERAL_STRING("focus"), this, true); target->RemoveEventListener(NS_LITERAL_STRING("blur"), this, true); target->RemoveEventListener(NS_LITERAL_STRING("pagehide"), this, true); target->RemoveEventListener(NS_LITERAL_STRING("mousedown"), this, true); target->RemoveEventListener(NS_LITERAL_STRING("input"), this, true); target->RemoveEventListener(NS_LITERAL_STRING("compositionstart"), this, true); target->RemoveEventListener(NS_LITERAL_STRING("compositionend"), this, true); target->RemoveEventListener(NS_LITERAL_STRING("contextmenu"), this, true); }
NS_IMETHODIMP nsFormFillController::HandleEvent(nsIDOMEvent* aEvent) { // Drop untrusted events from content if (!IsEventTrusted(aEvent)) return NS_OK; nsAutoString type; aEvent->GetType(type); if (type.EqualsLiteral("pagehide")) { nsCOMPtr<nsIDOMEventTarget> target; aEvent->GetTarget(getter_AddRefs(target)); nsCOMPtr<nsIDOMDocument> domDoc = do_QueryInterface(target); if (!domDoc) return NS_OK; if (mFocusedInput) { nsCOMPtr<nsIDOMDocument> inputDoc; mFocusedInput->GetOwnerDocument(getter_AddRefs(inputDoc)); if (domDoc == inputDoc) StopControllingInput(); } mPwmgrInputs.Enumerate(RemoveForDOMDocumentEnumerator, domDoc); } return NS_OK; }
void nsFormFillController::RemoveWindowListeners(nsIDOMWindow *aWindow) { if (!aWindow) return; StopControllingInput(); nsCOMPtr<nsIDOMDocument> domDoc; aWindow->GetDocument(getter_AddRefs(domDoc)); mPwmgrInputs.Enumerate(RemoveForDOMDocumentEnumerator, domDoc); nsCOMPtr<nsPIDOMWindow> privateDOMWindow(do_QueryInterface(aWindow)); nsPIDOMEventTarget* chromeEventHandler = nsnull; if (privateDOMWindow) chromeEventHandler = privateDOMWindow->GetChromeEventHandler(); nsCOMPtr<nsIDOMEventTarget> target(do_QueryInterface(chromeEventHandler)); if (!target) return; target->RemoveEventListener(NS_LITERAL_STRING("focus"), static_cast<nsIDOMFocusListener *>(this), PR_TRUE); target->RemoveEventListener(NS_LITERAL_STRING("blur"), static_cast<nsIDOMFocusListener *>(this), PR_TRUE); target->RemoveEventListener(NS_LITERAL_STRING("pagehide"), static_cast<nsIDOMFocusListener *>(this), PR_TRUE); target->RemoveEventListener(NS_LITERAL_STRING("mousedown"), static_cast<nsIDOMMouseListener *>(this), PR_TRUE); target->RemoveEventListener(NS_LITERAL_STRING("click"), static_cast<nsIDOMMouseListener *>(this), PR_TRUE); target->RemoveEventListener(NS_LITERAL_STRING("input"), static_cast<nsIDOMFormListener *>(this), PR_TRUE); target->RemoveEventListener(NS_LITERAL_STRING("compositionstart"), static_cast<nsIDOMCompositionListener *>(this), PR_TRUE); target->RemoveEventListener(NS_LITERAL_STRING("compositionend"), static_cast<nsIDOMCompositionListener *>(this), PR_TRUE); target->RemoveEventListener(NS_LITERAL_STRING("contextmenu"), static_cast<nsIDOMContextMenuListener *>(this), PR_TRUE); }
NS_IMETHODIMP nsFormFillController::Submit(nsIDOMEvent* aEvent) { // Drop untrusted events from content if (!IsEventTrusted(aEvent)) return NS_OK; if (mFocusedInput) StopControllingInput(); return NS_OK; }
void nsFormFillController::StartControllingInput(nsIDOMHTMLInputElement *aInput) { // Make sure we're not still attached to an input StopControllingInput(); // Find the currently focused docShell nsCOMPtr<nsIDocShell> docShell = GetDocShellForInput(aInput); PRInt32 index = GetIndexOfDocShell(docShell); if (index < 0) return; // Cache the popup for the focused docShell mPopups->GetElementAt(index, getter_AddRefs(mFocusedPopup)); AddKeyListener(aInput); mFocusedInput = aInput; // Now we are the autocomplete controller's bitch mController->SetInput(this); }
void nsFormFillController::StartControllingInput(nsIDOMHTMLInputElement *aInput) { // Make sure we're not still attached to an input StopControllingInput(); // Find the currently focused docShell nsCOMPtr<nsIDocShell> docShell = GetDocShellForInput(aInput); int32_t index = GetIndexOfDocShell(docShell); if (index < 0) return; // Cache the popup for the focused docShell mFocusedPopup = mPopups.SafeElementAt(index); nsCOMPtr<nsINode> node = do_QueryInterface(aInput); if (!node) { return; } AddKeyListener(aInput); node->AddMutationObserverUnlessExists(this); mFocusedInputNode = node; mFocusedInput = aInput; nsCOMPtr<nsIDOMHTMLElement> list; mFocusedInput->GetList(getter_AddRefs(list)); nsCOMPtr<nsINode> listNode = do_QueryInterface(list); if (listNode) { listNode->AddMutationObserverUnlessExists(this); mListNode = listNode; } // Now we are the autocomplete controller's bitch mController->SetInput(this); }
NS_IMETHODIMP nsFormFillController::HandleEvent(nsIDOMEvent* aEvent) { nsAutoString type; aEvent->GetType(type); if (type.EqualsLiteral("focus")) { return Focus(aEvent); } if (type.EqualsLiteral("mousedown")) { return MouseDown(aEvent); } if (type.EqualsLiteral("keypress")) { return KeyPress(aEvent); } if (type.EqualsLiteral("input")) { return (!mSuppressOnInput && mController && mFocusedInput) ? mController->HandleText() : NS_OK; } if (type.EqualsLiteral("blur")) { if (mFocusedInput) StopControllingInput(); return NS_OK; } if (type.EqualsLiteral("compositionstart")) { NS_ASSERTION(mController, "should have a controller!"); if (mController && mFocusedInput) mController->HandleStartComposition(); return NS_OK; } if (type.EqualsLiteral("compositionend")) { NS_ASSERTION(mController, "should have a controller!"); if (mController && mFocusedInput) mController->HandleEndComposition(); return NS_OK; } if (type.EqualsLiteral("contextmenu")) { if (mFocusedPopup) mFocusedPopup->ClosePopup(); return NS_OK; } if (type.EqualsLiteral("pagehide")) { nsCOMPtr<nsIDOMEventTarget> target; aEvent->GetTarget(getter_AddRefs(target)); nsCOMPtr<nsIDOMDocument> domDoc = do_QueryInterface(target); if (!domDoc) return NS_OK; if (mFocusedInput) { nsCOMPtr<nsIDOMDocument> inputDoc; mFocusedInput->GetOwnerDocument(getter_AddRefs(inputDoc)); if (domDoc == inputDoc) StopControllingInput(); } mPwmgrInputs.Enumerate(RemoveForDOMDocumentEnumerator, domDoc); } return NS_OK; }