From 213ad20a2e1dbf14341b8449406dfe114a657d3b Mon Sep 17 00:00:00 2001 From: Alexandre Poirot Date: Wed, 13 Jul 2016 23:34:17 -0700 Subject: [PATCH] Bug 1281726 - Support TabActor.getTab against mozbrowser iframes. r=jryans --- .../framework/test/browser_target_from_url.js | 4 ++-- devtools/server/actors/webbrowser.js | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/devtools/client/framework/test/browser_target_from_url.js b/devtools/client/framework/test/browser_target_from_url.js index 6d5f2f51a886..12ebb12a85a1 100644 --- a/devtools/client/framework/test/browser_target_from_url.js +++ b/devtools/client/framework/test/browser_target_from_url.js @@ -38,10 +38,10 @@ add_task(function* () { info("Test invalid tab id"); try { - yield targetFromURL(new URL("http://foo?type=tab&id=1")); + yield targetFromURL(new URL("http://foo?type=tab&id=10000")); ok(false, "Shouldn't pass"); } catch (e) { - is(e.message, "targetFromURL, tab with outerWindowID:'1' doesn't exist"); + is(e.message, "targetFromURL, tab with outerWindowID:'10000' doesn't exist"); } info("Test parent process"); diff --git a/devtools/server/actors/webbrowser.js b/devtools/server/actors/webbrowser.js index 3d599d6a3a07..33d366102d7f 100644 --- a/devtools/server/actors/webbrowser.js +++ b/devtools/server/actors/webbrowser.js @@ -382,6 +382,25 @@ BrowserTabList.prototype._getActorForBrowser = function (browser) { BrowserTabList.prototype.getTab = function ({ outerWindowID, tabId }) { if (typeof outerWindowID == "number") { + // First look for in-process frames with this ID + let window = Services.wm.getOuterWindowWithId(outerWindowID); + // Safety check to prevent debugging top level window via getTab + if (window instanceof Ci.nsIDOMChromeWindow) { + return promise.reject({ + error: "forbidden", + message: "Window with outerWindowID '" + outerWindowID + "' is chrome" + }); + } + if (window) { + let iframe = window.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIDOMWindowUtils) + .containerElement; + if (iframe) { + return this._getActorForBrowser(iframe); + } + } + // Then also look on registered when using outerWindowID for + // OOP tabs for (let browser of this._getBrowsers()) { if (browser.outerWindowID == outerWindowID) { return this._getActorForBrowser(browser);