Re: Identifying Tab in OnStateChange C++
Vaibhav <[email protected]> Tue, 27 Apr 2010 06:37:03 -0700 (PDT)
| Newsgroups | gmane.comp.mozilla.devel.dom |
|---|---|
| Organization | http://groups.google.com |
| Message-ID | <c0c078fe-0354-4da3-aa6e-f61058cf1a89@v27g2000pro.googlegroups.com> |
On Apr 27, 9:32 am, Jens Sorensen <[email protected]> wrote: > You are welcome, let me know if you need to know how to get to the > actual document from the TabXXX event.. > Thanks > Jens Sorensen > > > > On Mon, Apr 26, 2010 at 8:52 PM, Vaibhav <[email protected]> wrote: > > On Apr 22, 6:07 pm, Vaibhav <[email protected]> wrote: > >> On Apr 21, 7:19 am, Jens Sorensen <[email protected]> wrote:> You are using the wrong DOM window in "HandleEvent"... > > >> > I assume you already saved off the panel container, and that you added > >> > the event listeners (if not then look at one of my ealier posts). But > >> > the call basically looks like this.. > > >> > xbl->GetAnonymousElementByAttribute(domEl, > >> > NS_LITERAL_STRING("anonid"), NS_LITERAL_STRING("panelcontainer"), > >> > getter_AddRefs(panelcontainer) ); > > >> > NS_IMETHODIMP XXXXXX::HandleEvent(nsIDOMEvent* event) > > >> > if( This_Is_The_TabOpen_Event ) > >> > { > >> > // Get a collection of all the tabs using the saved off panelcontainer pointer > >> > nsCOMPtr<nsIDOMNodeList> tabs; > >> > panelContainer->GetChildNodes(getter_AddRefs(tabs)); > > >> > // Its pretty safe to assume that the new tab will be last in the collection > >> > // since new tabs are always appended, lets get the # of tabs > >> > PRUint32 tabCount = 0; > >> > tabs->GetLength(&tabCount); > > >> > // Lets get the last tab which is the 'xul::notificationbox' element > >> > for the given tab > >> > nsCOMPtr<nsIDOMNode> newTab; > >> > tabs->Item(tabCount-1, getter_AddRefs(newTab)); > > >> > // get the last child of the 'xul::notificationbox' which is the > >> > 'xul:browser' element > >> > nsCOMPtr<nsIDOMNode> domXULBrowser; > >> > newTab->GetLastChild(getter_AddRefs(domXULBrowser)); > > >> > nsCOMPtr<nsIDOMXULElement> xulElement = do_QueryInterface(domXULBrowser); > >> > nsCOMPtr<nsIBoxObject> boxObject; > >> > xulElement->GetBoxObject(getter_AddRefs(boxObject)); > >> > nsCOMPtr<nsIBrowserBoxObject> browserboxObject = do_QueryInterface(boxObject); > > >> > nsCOMPtr<nsIDocShell> docShell; > >> > browserboxObject->GetDocShell(getter_AddRefs(docShell)); > > >> > nsCOMPtr<nsIDOMWindow> domWindow = do_GetInterface(docShell); > >> > // From here you can get the dom document etc... > >> > : > >> > : > > >> > You should be able to match up the above domWindow with the one you > >> > get in your progress listener > > >> > Plus you should not be adding "TabOpen" etc. event listeners in you > >> > OnStateChange function. This function will get called a lot plus its > >> > the wrong object that you are adding the event listeners to. You want > >> > to keep "OnStateChange" as light as possible since it will impact > >> > browser performance. > > >> > You might find this link very usefulhttps://developer.mozilla.org/en/Code_snippets/Tabbed_browser > > >> > Here is a Java script example.. (Taken from the above link) > > >> > // During initialisation > >> > var container = gBrowser.tabContainer; > >> > container.addEventListener("TabOpen", exampleTabAdded, false); > > >> > Hope this helps.. You are almost there :) > > >> > -Jens > > >> > On Tue, Apr 20, 2010 at 3:04 AM, Vaibhav <[email protected]> wrote: > >> > > On Apr 20, 2:41 pm, Vaibhav <[email protected]> wrote: > >> > >> On Apr 19, 6:13 pm, Vaibhav <[email protected]> wrote: > > >> > >> > Hi, > > >> > >> > I am writing Firefox extension using C++. > >> > >> > In OnStateChange method I want to determine the tab associated with > >> > >> > particular request. > > >> > >> > Currently I compare DOM Document Pointers to do it. > > >> > >> > Following is the Pseudocode: > > >> > >> > OnStateChange() > >> > >> > { > >> > >> > //================================================== > >> > >> > //+ > >> > >> > // GET URL > > >> > >> > nsCString url; > >> > >> > const char *pcszURL; > >> > >> > aRequest->GetName(url); > >> > >> > NS_CStringGetData(url, &pcszURL); > > >> > >> > //- > >> > >> > //================================================== > > >> > >> > nsCOMPtr<nsIDOMWindow> DOMWin; > >> > >> > rv = aWebProgress->GetDOMWindow(getter_AddRefs(DOMWin)); > >> > >> > nsCOMPtr<nsIDOMDocument> DOMDoc; > >> > >> > rv = DOMWin->GetDocument(getter_AddRefs(DOMDoc)); > > >> > >> > INT iTabIndex; > >> > >> > nsCOMPtr<nsIWindowMediator> windowMediator = > >> > >> > do_GetService(NS_WINDOWMEDIATOR_CONTRACTID, &rv); > >> > >> > nsCOMPtr<nsIDOMWindowInternal> dwi; > >> > >> > windowMediator->GetMostRecentWindow(L"navigator:browser", > >> > >> > getter_AddRefs(dwi)); > >> > >> > nsCOMPtr<nsIDOMDocument> doc; > >> > >> > dwi->GetDocument(getter_AddRefs(doc)); > >> > >> > nsCOMPtr<nsIDOMDocumentXBL> xbl(do_QueryInterface(doc)); > >> > >> > nsCOMPtr<nsIDOMElement> domEl; > >> > >> > doc->GetElementById(NS_LITERAL_STRING("content"), > >> > >> > getter_AddRefs(domEl)); > >> > >> > nsCOMPtr<nsIDOMElement> pAnoEl; > > >> > >> > // > >> > >> > // getting xul:tabpanels > >> > >> > // > >> > >> > xbl->GetAnonymousElementByAttribute( > >> > >> > domEl, > >> > >> > NS_LITERAL_STRING("anonid"), > >> > >> > NS_LITERAL_STRING("panelcontainer"), > >> > >> > getter_AddRefs(pAnoEl) > >> > >> > ); > >> > >> > nsString retval; > >> > >> > PRBool bRet = 0; > >> > >> > nsCOMPtr<nsIDOMNodeList> nodeList; > >> > >> > pAnoEl->GetChildNodes(getter_AddRefs(nodeList)); > >> > >> > nsCOMPtr<nsIDOMNode> domNode; > >> > >> > PRUint32 len = 0; > >> > >> > rv = nodeList->GetLength(&len); > >> > >> > for( PRUint32 i=0; i<len; i++ ) > >> > >> > { > >> > >> > // getting the xul::notificationbox > >> > >> > nsCOMPtr<nsIDOMNode> domNode; > >> > >> > nodeList->Item(i, getter_AddRefs(domNode)); > >> > >> > // get the last child of the 'xul::notificationbox' which is the > >> > >> > 'xul:browser' > >> > >> > nsCOMPtr<nsIDOMNode> domXULBrowser; > >> > >> > domNode->GetLastChild(getter_AddRefs(domXULBrowser)); > >> > >> > nsCOMPtr<nsIDOMXULElement> xulElement = > >> > >> > do_QueryInterface(domXULBrowser); > >> > >> > nsCOMPtr<nsIBoxObject> boxObject; > >> > >> > xulElement->GetBoxObject(getter_AddRefs(boxObject)); > >> > >> > nsCOMPtr<nsIBrowserBoxObject> browserboxObject = > >> > >> > do_QueryInterface(boxObject); > >> > >> > nsCOMPtr<nsIDocShell> docShell; > >> > >> > browserboxObject->GetDocShell(getter_AddRefs(docShell)); > >> > >> > nsCOMPtr<nsIWebNavigation> webNav = do_QueryInterface(docShell); > >> > >> > nsCOMPtr<nsIURI> uri; > >> > >> > webNav->GetCurrentURI(getter_AddRefs(uri)); > >> > >> > nsCString path; > >> > >> > uri->GetAsciiSpec(path); > >> > >> > const CHAR *ppathspec = path.get(); > >> > >> > if (0 == _stricmp(ppathspec, pcszURL)) > >> > >> > { > >> > >> > nsCOMPtr<nsIDOMDocument> tabdoc; > >> > >> > webNav->GetDocument(getter_AddRefs(tabdoc)); > >> > >> > if (tabdoc.get() == DOMDoc.get()) > >> > >> > { > >> > >> > // > >> > >> > // !!! This is the required tab. !!! > >> > >> > // !!! This is the tab associated with the request. !!! > >> > >> > // > >> > >> > } > >> > >> > } > >> > >> > } > > >> > >> > } > > >> > >> > In above code I am comparing nsIDOMDocument pointers to get currently > >> > >> > navigated tab. > > >> > >> > Is there another sure way to do this? > > >> > >> > With Best Regards, > >> > >> > Vaibhav. > > >> > >> Jens Replied: > > >> > >> I would do it like this. Have a map (or whatever fits your needs) that > >> > >> keeps track of tab instances. Whenever a tab is created then save off > >> > >> the DOM Window (nsIDOMWindow) which represents the tab in the given > >> > >> container. You can add a "TabOpen" event handler to the browser window > >> > >> if you want to get notified when a new tab has been created and find > >> > >> the DOM window which represents the tab and do whatever you need to > >> > >> do. > > >> > >> Now when "OnStateChange" is being called then check if the > >> > >> "STATE_IS_DOCUMENT" bit is set in aStateFlags. If the bit is set then > >> > >> grab the... > > read more » Very Thanks Jens for ur kind response. I think I get actual document in following ways: 1. TabOpen: - Go to the last tab as you specified in previous post - Get Box Object & Browser Box Object pointers - Get Web Navigation Pointer - Get Tab Document in following way nsCOMPtr<nsIDOMDocument> tabdoc; rv = webNav->GetDocument(getter_AddRefs(tabdoc)); 2. TabSelect: - I check 'selected' attribute of tab element to get the selected tab and follow above steps. But I don't know How to identify tab in case of TabMove & TabClose? Please let me know, Am I following right steps to get Tab Document? Best Regards, Vaibhav.