0


私のアドオンはFF41で動作しました。今、e10s に移行したいと考えています。Firefox 開発者版 v43 を使用してください。

オブザーバーの例 (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 ); 
................. 
}


JS ヘルパーの例。

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;
}

以下のコードは機能しますが、nsIDOMWindow からドキュメントを取得できません。

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

はエラーです - インターフェイスがありません....


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; 
}


この問題を解決してください。ありがとう。

4

1 に答える 1

0

解決しました!

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

var window = browser.contentWindow.QueryInterface(Components.interfaces.nsISupports);
于 2015-10-06T07:11:40.667 に答える