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.