Bug 1281726 - Support TabActor.getTab against mozbrowser iframes. r=jryans
--- a/devtools/client/framework/test/browser_target_from_url.js
+++ b/devtools/client/framework/test/browser_target_from_url.js
@@ -33,20 +33,20 @@ add_task(function* () {
assertIsTabTarget(target);
info("Test tab with chrome privileges");
target = yield targetFromURL(new URL("http://foo?type=tab&id=" + windowId + "&chrome"));
assertIsTabTarget(target, true);
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");
target = yield targetFromURL(new URL("http://foo?type=process"));
let topWindow = Services.wm.getMostRecentWindow("navigator:browser");
is(target.url, topWindow.location.href);
is(target.isLocalTab, false);
is(target.chrome, true);
--- a/devtools/server/actors/webbrowser.js
+++ b/devtools/server/actors/webbrowser.js
@@ -377,16 +377,35 @@ BrowserTabList.prototype._getActorForBro
actor = new BrowserTabActor(this._connection, browser);
this._actorByBrowser.set(browser, actor);
this._checkListening();
return promise.resolve(actor);
};
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 <xul:browsers> when using outerWindowID for
+ // OOP tabs
for (let browser of this._getBrowsers()) {
if (browser.outerWindowID == outerWindowID) {
return this._getActorForBrowser(browser);
}
}
return promise.reject({
error: "noTab",
message: "Unable to find tab with outerWindowID '" + outerWindowID + "'"