Re: Getting tab URL in C++
Vaibhav <[email protected]> Mon, 12 Apr 2010 03:03:22 -0700 (PDT)
| Newsgroups | gmane.comp.mozilla.devel.dom |
|---|---|
| Organization | http://groups.google.com |
| Message-ID | <6c453c8a-617b-4830-ae59-71b3ee667faa@k33g2000yqc.googlegroups.com> |
On Apr 10, 7:15 am, Jens Sorensen <[email protected]> wrote: > You are almost there.. > > If you bring up DOM inspector then you will notice that the > 'browsers/tabs' are actually located under the 'xul:panels' node which > has the anonid value of "panelcontainer" and not "tabcontainer". You > passed "tabcontainer" in to "GetAnonymousElementByAttribute" which is > not correct. You will also notice that this element contains multiple > 'xul:notificationbox' elements (one for each tab) and that the > 'xul:browser' node is the last child of the 'xul:notificationbox'. > > The 'xul:browser" node is what you are looking for. > > Here is the updated code. > > nsresult rv; > 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); > } > > If you do this early in the stage then the uri might be NULL or the > URL will most likely be about:blank. > > I suggest that you add "TabOpen", "TabSelect" "TabXXXX" event > listeners if you need to track tab creation, destruction etc. > > nsCOMPtr<nsIDOMEventTarget> eventTarget = do_QueryInterface(dwi); > eventTarget->AddEventListener(.....) > > Remember to check for null pointers etc.. > Cheers, > Jens Sorensen > > nsresult rv; > 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); > } > > > > On Thu, Apr 8, 2010 at 6:04 AM, Vaibhav <[email protected]> wrote: > > Hi, > > > I am writing Firefox extension using C++. > > > I am enumerating the tabs to get their respective URLs. > > > Following is pseudocode: > > > /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// /// > > > nsCOMPtr<nsIWindowMediator> windowMediator = > > do_GetService(NS_WINDOWMEDIATOR_CONTRACTID, &rv); > > windowMediator->GetMostRecentWindow(L"navigator:browser", > > getter_AddRefs(dwi)); > > dwi->GetDocument(getter_AddRefs(doc)); > > nsCOMPtr<nsIDOMDocumentXBL> xbl(do_QueryInterface(doc)); > > doc->GetElementById(NS_LITERAL_STRING("content"), > > getter_AddRefs(domEl)); > > nsCOMPtr<nsIDOMElement> pAnoEl; > > xbl->GetAnonymousElementByAttribute( > > domEl, > > NS_LITERAL_STRING("anonid"), > > NS_LITERAL_STRING("tabcontainer"), > > getter_AddRefs(pAnoEl) > > ); > > nsString retval; > > PRBool bRet = 0; > > nsCOMPtr<nsIDOMNodeList> nodeList; > > pAnoEl->GetChildNodes(getter_AddRefs(nodeList)); > > nsCOMPtr<nsIDOMNode> domNode; > > rv = nodeList->GetLength(&len); > > for (PRUint32 i = 0; i < len; i++) > > { > > nodeList->Item(i, getter_AddRefs(domNode)); > > nsCOMPtr<nsIDOMXULElement> xulElement = do_QueryInterface(domNode); > > nsCOMPtr<nsIBoxObject> boxObject; > > xulElement->GetBoxObject(getter_AddRefs(boxObject)); > > nsCOMPtr<nsIBrowserBoxObject> browserboxObject = > > do_QueryInterface(boxObject); > > } > > > /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// /// > > > In the above code QueryInterface for getting nsIBrowserBoxObject fails > > with error code: NS_ERROR_NO_INTERFACE. > > > Please suggest me the ways to get tab URL. > > > Help Me !!! > > > Thanks, > > Vaibhav. > > _______________________________________________ > > dev-tech-dom mailing list > > [email protected] > >https://lists.mozilla.org/listinfo/dev-tech-dom Hi Jens, Thanks a lot. It is a solution. Vaibhav.