PRInt32 nsFormFillController::GetIndexOfDocShell(nsIDocShell *aDocShell) { if (!aDocShell) return -1; // Loop through our cached docShells looking for the given docShell PRUint32 count; mDocShells->Count(&count); for (PRUint32 i = 0; i < count; ++i) { nsCOMPtr<nsIDocShell> docShell; mDocShells->GetElementAt(i, getter_AddRefs(docShell)); if (docShell == aDocShell) return i; } // Recursively check the parent docShell of this one nsCOMPtr<nsIDocShellTreeItem> treeItem = do_QueryInterface(aDocShell); nsCOMPtr<nsIDocShellTreeItem> parentItem; treeItem->GetParent(getter_AddRefs(parentItem)); if (parentItem) { nsCOMPtr<nsIDocShell> parentShell = do_QueryInterface(parentItem); return GetIndexOfDocShell(parentShell); } return -1; }
NS_IMETHODIMP nsFormFillController::DetachFromBrowser(nsIDocShell *aDocShell) { int32_t index = GetIndexOfDocShell(aDocShell); NS_ENSURE_TRUE(index >= 0, NS_ERROR_FAILURE); // Stop listening for focus events on the domWindow of the docShell nsCOMPtr<nsIDOMWindow> domWindow = GetWindowForDocShell(mDocShells.SafeElementAt(index)); RemoveWindowListeners(domWindow); mDocShells.RemoveElementAt(index); mPopups.RemoveElementAt(index); 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); }
int32_t nsFormFillController::GetIndexOfDocShell(nsIDocShell *aDocShell) { if (!aDocShell) return -1; // Loop through our cached docShells looking for the given docShell uint32_t count = mDocShells.Length(); for (uint32_t i = 0; i < count; ++i) { if (mDocShells[i] == aDocShell) return i; } // Recursively check the parent docShell of this one nsCOMPtr<nsIDocShellTreeItem> treeItem = do_QueryInterface(aDocShell); nsCOMPtr<nsIDocShellTreeItem> parentItem; treeItem->GetParent(getter_AddRefs(parentItem)); if (parentItem) { nsCOMPtr<nsIDocShell> parentShell = do_QueryInterface(parentItem); return GetIndexOfDocShell(parentShell); } return -1; }