Niky Williams wrote:
Niky Williams wrote:
Boris Zbarsky wrote:
Niky Williams wrote:
Okay, I'm trying to dispatch a focus event to an input element.

Accessing DOM nodes from off the main thread is not ok. If you're using a debug build you'll see all sorts of beautiful assertions when you do this.

 I've read some things on nsProxy and the nsIThread...but
can't seem to put it together on how to post this event to the main thread. Can someone point me in the correct direction please? Thanks in advance!

See the code at
http://lxr.mozilla.org/seamonkey/source/directory/xpcom/base/src/nsLDAPChannel.cpp#107 for an example of creating a proxy object.

-Boris

Thanks for the reply!  I'll take a look into this.

Niky Williams

Boris,
Are you talking about the lovely "Not Threadsafe" assertions? I'm not getting them on this app, but when I first started messing with this, I got them...However, I am seeing this assertion:

###!!! ASSERTION: Frame abuses NS_FRAME_OUTSIDE_CHILDREN flag: 'Not Reached', file c:/Dev/Source/mozilla/layout/generic/nsFrame.cpp, line 4359

Not sure what exactly it means...



BTW, I am using a debug shared build of 1.5.0.2. I traced from when I call my "Focus" function all the way through to the event loop itself...the debugger shows them on the same (main) thread. Maybe my function itself is messed up. If you have a minute, I've posted my function below. Maybe you can see something I'm not doing correctly. Just a brief overview of how I'm trying to use this. It's a UserName/Password type of entry. They enter in their UserName/Password and I do a lookup in SQL, if it comes back bad, I clear out the UserName/Password (works fine) and then try to set focus back to the UserName...this is where it's not working. Thanks again for your time!


//---------------------------------------------------------------------------
//Sets the focus for an element
//---------------------------------------------------------------------------
void CGeckoChrome::SetElementFocus (nsString sID)
{
    //Temp vars
    nsCOMPtr<nsIDOMElement> pCOM_de;
nsCOMPtr<nsIDOMEvent> pCOM_deDOMEvent; nsCOMPtr<nsIDOMEventTarget> pCOM_det; PRBool pbResult = PR_FALSE; //Trying to create an event CreateDOMEvent (NS_ConvertUTF8toUTF16("HTMLEvents"), getter_AddRefs (pCOM_deDOMEvent));

    //Making sure we have something here
    if (pCOM_deDOMEvent)
    {
        //Getting the element by it's ID first
        GetDOMElement (sID, getter_AddRefs (pCOM_de));

        //Now getting an event target from the element
        if (pCOM_de && (pCOM_det = do_QueryInterface (pCOM_de)))
        {
            //Setting up to receive/init an event
if (NS_SUCCEEDED (pCOM_deDOMEvent->InitEvent (NS_ConvertUTF8toUTF16("focus"), PR_TRUE, PR_TRUE))) { //Dispatching the event
                pCOM_det->DispatchEvent (pCOM_deDOMEvent, &pbResult);
            }
} }
}
//---------------------------------------------------------------------------


NOTE: THESE ARE SOME HELPER FUNCTIONS I CREATED THAT ARE USED ABOVE...HERE FOR REFERENCE IF YOU NEED IT

//---------------------------------------------------------------------------
//Creates events on the DOM
//---------------------------------------------------------------------------
void CGeckoChrome::CreateDOMEvent (nsString sEventType, nsIDOMEvent **ppde)
{
    //Temp vars
    nsCOMPtr<nsIDOMWindow> pCOM_dw;
    nsCOMPtr<nsIDOMDocument> pCOM_dd;
    nsCOMPtr<nsIDOMDocumentEvent> pCOM_dde;

    //Getting the DOM Window first
    if (NS_SUCCEEDED (pwb->GetContentDOMWindow (getter_AddRefs (pCOM_dw))))
    {
        //Now the document
        if (NS_SUCCEEDED (pCOM_dw->GetDocument (getter_AddRefs (pCOM_dd))))
        {
            //Now the DOM Document event
            if (pCOM_dde = do_QueryInterface (pCOM_dd))
            {
                //Creating the event now
                pCOM_dde->CreateEvent (sEventType, ppde);
            }
        }
    }
}
//---------------------------------------------------------------------------

NOTE: pwb is a raw pointer to the nsIWebBrowser for the nsIWebBrowserChrome

//---------------------------------------------------------------------------
//Gets the element via it's ID
//---------------------------------------------------------------------------
void CGeckoChrome::GetDOMElement (nsString sID, nsIDOMElement **ppde)
{
    //Temp vars
    nsCOMPtr<nsIDOMWindow> pCOM_dw;
    nsCOMPtr<nsIDOMDocument> pCOM_dd;

    //Getting the DOM Window first
    if (NS_SUCCEEDED (pwb->GetContentDOMWindow (getter_AddRefs (pCOM_dw))))
    {
        //Now the document
        if (NS_SUCCEEDED (pCOM_dw->GetDocument (getter_AddRefs (pCOM_dd))))
        {
            //Finally getting the element
            pCOM_dd->GetElementById (sID, ppde);
        }
    }
}
//---------------------------------------------------------------------------

Niky Williams

Quick note...I had some old code that a found that created a "KeyEvents" and sent a "keypress"...I stuck that code in and it worked, no assertions about not being "thread safe" in the debug console window. I must be creating the focus event incorrectly somehow.
_______________________________________________
dev-embedding mailing list
[email protected]
https://lists.mozilla.org/listinfo/dev-embedding

Reply via email to