Search code examples
xpcomgecko

How to attach mouse event listeners to embedded nsIWebBrowser in C++


I've embedded an nsIWebBrowser in my application. Because I'm just generating HTML for it on the fly, I'm using OpenStream, AppendToStream, and CloseStream to add content. What I need is to add event listeners for mouse movement over the web browser as well as mouse clicks. I've read documentation and tried lots of different things, but nothing I have tried has worked. For instance, the code below would seem to do the right thing, but it does nothing:

    nsCOMPtr<nsIDOMWindow> domWindow;
    mWebBrowser->GetContentDOMWindow(getter_AddRefs(domWindow));

    if (!mEventTarget) {
    mEventTarget = do_QueryInterface(domWindow);

    if (mEventTarget)
        mEventTarget->AddEventListener(NS_LITERAL_STRING("mouseover"), (nsIDOMEventListener *)mEventListener, PR_FALSE);
}

Perhaps it isn't working because this is run during initialization, but before any content is actually added. However, if I add it during AppendStream, or CloseStream, it segfaults.

Please tell me a straightforward way to do this.


Solution

  • Well, here's the answer:

    nsCOMPtr<nsIDOMEventTarget> cpEventTarget;
    nsCOMPtr<nsIDOMWindow> cpDomWin;
    m_pWebBrowser->GetContentDOMWindow (getter_AddRefs(cpDomWin));
    nsCOMPtr<nsIDOMWindow2> cpDomWin2 (do_QueryInterface (cpDomWin));
    cpDomWin2->GetWindowRoot(getter_AddRefs(cpEventTarget));
    
    rv = cpEventTarget->AddEventListener(NS_LITERAL_STRING("mousedown"),
                    m_pBrowserImpl, PR_FALSE);