e10s - I want to get from nsIObserver-nsIHttpChannel-nsIDOMWindow-nsIDOMDocument. How can I do it?

99 Views Asked by At


My addon worked on FF41. Now I want to migrate on e10s. Use Firefox developer edition v43.

The example observer (c++).

NS_IMETHODIMP CFFObserver::Observe( nsISupports* aSubject, const char* aTopic, const char16_t* aData ) 
{ ......... 
    if ( lstrcmpA( aTopic, "http-on-modify-request" ) == 0 ) 
    { 
        CFFObserver::onSending( aSubject ); 
    } ..........    
} 
void CFFObserver::onSending( nsISupports* IHttpChannel ) 
{ 
.............. 
    nsISupports* IDOMWindowOwner = m_gate.Channel_GetOwnerWindow( IHttpChannel ); 
................. 
}


The example JS helper.

Channel_GetOwnerWindow:

function( objChannel ) // This option does not worked in v43[e10s]; <br>
{ 
    try 
    { 
        var notificationCallbacks = objChannel.QueryInterface(Components.interfaces.nsIHttpChannel).notificationCallbacks; 
        if ( !notificationCallbacks ) 
        { 
            var loadGroup = objChannel.QueryInterface(Components.interfaces.nsIRequest).loadGroup.notificationCallbacks; 
            if ( loadGroup ) notificationCallbacks = loadGroup.notificationCallbacks; 
        } 
        if ( notificationCallbacks ) 
        { 
            return notificationCallbacks.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                                                                    .getInterface(Components.interfaces.nsIDOMWindow) 
                                                                    .QueryInterface(Components.interfaces.nsISupports); 
        } 
    } 
    catch ( err ) 
    { 
        this.ErrorOut( err ); 
    }   
    return null;
}

Below code works but I cannot get document from getting nsIDOMWindow.

...... 
objWindow.QueryInterface(Components.interfaces.nsIDOMWindow).document.QueryInterface(Components.interfaces.nsISupports) 

is error - no interface....


Channel_GetOwnerWindow:

function( objChannel ) 
{   
    try 
    { 
        return objChannel.QueryInterface(Components.interfaces.nsIHttpChannel) 
                                            .notificationCallbacks 
                                            .getInterface(Components.interfaces.nsILoadContext)
                                            .topFrameElement 
                                            .QueryInterface(Components.interfaces.nsISupports); 
    } 
    catch ( err ) 
    { 
        this.ErrorOut( err ); 
    }   
    return null; 
}


Help me please resolve this problem. Thanks.

1

There are 1 best solutions below

0
On

Resolved!

var browser = objChannel.QueryInterface(Components.interfaces.nsIHttpChannel)
    .notificationCallbacks
    .getInterface(Components.interfaces.nsILoadContext).topFrameElement;

var window = browser.contentWindow.QueryInterface(Components.interfaces.nsISupports);