Skip to content

Commit

Permalink
Merge fx-team to m-c
Browse files Browse the repository at this point in the history
  • Loading branch information
KWierso committed Mar 14, 2014
2 parents f0d4dcf + 030d512 commit 2699402
Show file tree
Hide file tree
Showing 157 changed files with 96,858 additions and 1,031 deletions.
9 changes: 7 additions & 2 deletions addon-sdk/source/lib/sdk/content/sandbox.js
Expand Up @@ -18,6 +18,7 @@ const { URL } = require('../url');
const { sandbox, evaluate, load } = require('../loader/sandbox');
const { merge } = require('../util/object');
const { getTabForContentWindow } = require('../tabs/utils');
const { getInnerId } = require('../window/utils');

// WeakMap of sandboxes so we can access private values
const sandboxes = new WeakMap();
Expand All @@ -28,12 +29,13 @@ const sandboxes = new WeakMap();
*/
let prefix = module.uri.split('sandbox.js')[0];
const CONTENT_WORKER_URL = prefix + 'content-worker.js';
const metadata = require('@loader/options').metadata;

// Fetch additional list of domains to authorize access to for each content
// script. It is stored in manifest `metadata` field which contains
// package.json data. This list is originaly defined by authors in
// `permissions` attribute of their package.json addon file.
const permissions = require('@loader/options').metadata['permissions'] || {};
const permissions = (metadata && metadata['permissions']) || {};
const EXPANDED_PRINCIPALS = permissions['cross-domain-content'] || [];

const JS_VERSION = '1.8';
Expand Down Expand Up @@ -128,7 +130,10 @@ const WorkerSandbox = Class({
wantXrays: true,
wantGlobalProperties: wantGlobalProperties,
sameZoneAs: window,
metadata: { SDKContentScript: true }
metadata: {
SDKContentScript: true,
'inner-window-id': getInnerId(window)
}
});
model.sandbox = content;

Expand Down
5 changes: 4 additions & 1 deletion addon-sdk/source/lib/sdk/deprecated/traits-worker.js
Expand Up @@ -157,7 +157,10 @@ const WorkerSandbox = EventEmitter.compose({
wantXrays: true,
wantGlobalProperties: wantGlobalProperties,
sameZoneAs: window,
metadata: { SDKContentScript: true }
metadata: {
SDKContentScript: true,
'inner-window-id': getInnerId(window)
}
});
// We have to ensure that window.top and window.parent are the exact same
// object than window object, i.e. the sandbox global object. But not
Expand Down
17 changes: 16 additions & 1 deletion addon-sdk/source/lib/sdk/loader/sandbox.js
Expand Up @@ -12,6 +12,12 @@ const systemPrincipal = CC('@mozilla.org/systemprincipal;1', 'nsIPrincipal')();
const scriptLoader = Cc['@mozilla.org/moz/jssubscript-loader;1'].
getService(Ci.mozIJSSubScriptLoader);
const self = require('sdk/self');
const { getTabId, getTabForContentWindow } = require('../tabs/utils');
const { getInnerId } = require('../window/utils');

const { gDevToolsExtensions: {
addContentGlobal, removeContentGlobal
} } = Cu.import("resource://gre/modules/devtools/DevToolsExtensions.jsm", {});

/**
* Make a new sandbox that inherits given `source`'s principals. Source can be
Expand All @@ -23,7 +29,16 @@ function sandbox(target, options) {
options.metadata.addonID = options.metadata.addonID ?
options.metadata.addonID : self.id;

return Cu.Sandbox(target || systemPrincipal, options);
let sandbox = Cu.Sandbox(target || systemPrincipal, options);
Cu.setSandboxMetadata(sandbox, options.metadata);
let innerWindowID = options.metadata['inner-window-id']
if (innerWindowID) {
addContentGlobal({
global: sandbox,
'inner-window-id': innerWindowID
});
}
return sandbox;
}
exports.sandbox = sandbox;

Expand Down
@@ -0,0 +1,7 @@
<html>
<head>
<meta charset="UTF-8">
<title>Page Mod Debugger Test</title>
</head>
<body></body>
</html>
@@ -0,0 +1,7 @@
'use strict';

unsafeWindow.runDebuggerStatement = function() {
window.document.body.setAttribute('style', 'background-color: red');
debugger;
window.document.body.setAttribute('style', 'background-color: green');
}
133 changes: 133 additions & 0 deletions addon-sdk/source/test/addons/page-mod-debugger-post/main.js
@@ -0,0 +1,133 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";

const { Cu } = require('chrome');
const { PageMod } = require('sdk/page-mod');
const tabs = require('sdk/tabs');
const promise = require('sdk/core/promise')
const { getMostRecentBrowserWindow } = require('sdk/window/utils');
const { data } = require('sdk/self');
const { set } = require('sdk/preferences/service');

const { DebuggerServer } = Cu.import('resource://gre/modules/devtools/dbg-server.jsm', {});
const { DebuggerClient } = Cu.import('resource://gre/modules/devtools/dbg-client.jsm', {});

let gClient;
let ok;
let testName = 'testDebugger';
let iframeURL = 'data:text/html;charset=utf-8,' + testName;
let TAB_URL = 'data:text/html;charset=utf-8,' + encodeURIComponent('<iframe src="' + iframeURL + '" />');
TAB_URL = data.url('index.html');
let mod;

exports.testDebugger = function(assert, done) {
ok = assert.ok.bind(assert);
assert.pass('starting test');
set('devtools.debugger.log', true);

if (!DebuggerServer.initialized) {
DebuggerServer.init(() => true);
DebuggerServer.addBrowserActors();
}

let transport = DebuggerServer.connectPipe();
gClient = new DebuggerClient(transport);
gClient.connect((aType, aTraits) => {
tabs.open({
url: TAB_URL,
onLoad: function(tab) {
assert.pass('tab loaded');

attachTabActorForUrl(gClient, TAB_URL).
then(_ => { assert.pass('attachTabActorForUrl called'); return _; }).
then(attachThread).
then(testDebuggerStatement).
then(_ => { assert.pass('testDebuggerStatement called') }).
then(closeConnection).
then(_ => { assert.pass('closeConnection called') }).
then(done).
then(null, aError => {
ok(false, "Got an error: " + aError.message + "\n" + aError.stack);
});
}
});
});
}

function attachThread([aGrip, aResponse]) {
let deferred = promise.defer();

// Now attach and resume...
gClient.request({ to: aResponse.threadActor, type: "attach" }, () => {
gClient.request({ to: aResponse.threadActor, type: "resume" }, () => {
ok(true, "Pause wasn't called before we've attached.");
deferred.resolve([aGrip, aResponse]);
});
});

return deferred.promise;
}

function testDebuggerStatement([aGrip, aResponse]) {
let deferred = promise.defer();
ok(aGrip, 'aGrip existss')

gClient.addListener("paused", (aEvent, aPacket) => {
ok(true, 'there was a pause event');
gClient.request({ to: aResponse.threadActor, type: "resume" }, () => {
ok(true, "The pause handler was triggered on a debugger statement.");
deferred.resolve();
});
});

mod = PageMod({
include: TAB_URL,
attachTo: ['existing', 'top', 'frame'],
contentScriptFile: data.url('script.js'),
onAttach: function(mod) {
ok(true, 'the page-mod was attached to ' + mod.tab.url);

require('sdk/timers').setTimeout(function() {
let debuggee = getMostRecentBrowserWindow().gBrowser.selectedTab.linkedBrowser.contentWindow.wrappedJSObject;
debuggee.runDebuggerStatement();
ok(true, 'called runDebuggerStatement');
}, 500)
}
});
ok(true, 'PageMod was created');

return deferred.promise;
}

function getTabActorForUrl(aClient, aUrl) {
let deferred = promise.defer();

aClient.listTabs(aResponse => {
let tabActor = aResponse.tabs.filter(aGrip => aGrip.url == aUrl).pop();
deferred.resolve(tabActor);
});

return deferred.promise;
}

function attachTabActorForUrl(aClient, aUrl) {
let deferred = promise.defer();

getTabActorForUrl(aClient, aUrl).then(aGrip => {
aClient.attachTab(aGrip.actor, aResponse => {
deferred.resolve([aGrip, aResponse]);
});
});

return deferred.promise;
}

function closeConnection() {
let deferred = promise.defer();
gClient.close(deferred.resolve);
return deferred.promise;
}

require('sdk/test/runner').runTestsFromModule(module);
@@ -0,0 +1,4 @@
{
"id": "test-page-mod-debugger",
"author": "Erik Vold"
}
@@ -0,0 +1,7 @@
<html>
<head>
<meta charset="UTF-8">
<title>Page Mod Debugger Test</title>
</head>
<body></body>
</html>
@@ -0,0 +1,7 @@
'use strict';

unsafeWindow.runDebuggerStatement = function() {
window.document.body.setAttribute('style', 'background-color: red');
debugger;
window.document.body.setAttribute('style', 'background-color: green');
}
128 changes: 128 additions & 0 deletions addon-sdk/source/test/addons/page-mod-debugger-pre/main.js
@@ -0,0 +1,128 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";

const { Cu } = require('chrome');
const { PageMod } = require('sdk/page-mod');
const tabs = require('sdk/tabs');
const promise = require('sdk/core/promise')
const { getMostRecentBrowserWindow } = require('sdk/window/utils');
const { data } = require('sdk/self');
const { set } = require('sdk/preferences/service');

const { DebuggerServer } = Cu.import('resource://gre/modules/devtools/dbg-server.jsm', {});
const { DebuggerClient } = Cu.import('resource://gre/modules/devtools/dbg-client.jsm', {});

let gClient;
let ok;
let testName = 'testDebugger';
let iframeURL = 'data:text/html;charset=utf-8,' + testName;
let TAB_URL = 'data:text/html;charset=utf-8,' + encodeURIComponent('<iframe src="' + iframeURL + '" />');
TAB_URL = data.url('index.html');
let mod;

exports.testDebugger = function(assert, done) {
ok = assert.ok.bind(assert);
assert.pass('starting test');
set('devtools.debugger.log', true);

mod = PageMod({
include: TAB_URL,
attachTo: ['existing', 'top', 'frame'],
contentScriptFile: data.url('script.js'),
});
ok(true, 'PageMod was created');

if (!DebuggerServer.initialized) {
DebuggerServer.init(() => true);
DebuggerServer.addBrowserActors();
}

let transport = DebuggerServer.connectPipe();
gClient = new DebuggerClient(transport);
gClient.connect((aType, aTraits) => {
tabs.open({
url: TAB_URL,
onLoad: function(tab) {
assert.pass('tab loaded');

attachTabActorForUrl(gClient, TAB_URL).
then(_ => { assert.pass('attachTabActorForUrl called'); return _; }).
then(attachThread).
then(testDebuggerStatement).
then(_ => { assert.pass('testDebuggerStatement called') }).
then(closeConnection).
then(_ => { assert.pass('closeConnection called') }).
then(done).
then(null, aError => {
ok(false, "Got an error: " + aError.message + "\n" + aError.stack);
});
}
});
});
}

function attachThread([aGrip, aResponse]) {
let deferred = promise.defer();

// Now attach and resume...
gClient.request({ to: aResponse.threadActor, type: "attach" }, () => {
gClient.request({ to: aResponse.threadActor, type: "resume" }, () => {
ok(true, "Pause wasn't called before we've attached.");
deferred.resolve([aGrip, aResponse]);
});
});

return deferred.promise;
}

function testDebuggerStatement([aGrip, aResponse]) {
let deferred = promise.defer();
ok(aGrip, 'aGrip existss')

gClient.addListener("paused", (aEvent, aPacket) => {
ok(true, 'there was a pause event');
gClient.request({ to: aResponse.threadActor, type: "resume" }, () => {
ok(true, "The pause handler was triggered on a debugger statement.");
deferred.resolve();
});
});

let debuggee = getMostRecentBrowserWindow().gBrowser.selectedTab.linkedBrowser.contentWindow.wrappedJSObject;
debuggee.runDebuggerStatement();
ok(true, 'called runDebuggerStatement');

return deferred.promise;
}

function getTabActorForUrl(aClient, aUrl) {
let deferred = promise.defer();

aClient.listTabs(aResponse => {
let tabActor = aResponse.tabs.filter(aGrip => aGrip.url == aUrl).pop();
deferred.resolve(tabActor);
});

return deferred.promise;
}

function attachTabActorForUrl(aClient, aUrl) {
let deferred = promise.defer();

getTabActorForUrl(aClient, aUrl).then(aGrip => {
aClient.attachTab(aGrip.actor, aResponse => {
deferred.resolve([aGrip, aResponse]);
});
});

return deferred.promise;
}

function closeConnection() {
let deferred = promise.defer();
gClient.close(deferred.resolve);
return deferred.promise;
}

require('sdk/test/runner').runTestsFromModule(module);
@@ -0,0 +1,4 @@
{
"id": "test-page-mod-debugger",
"author": "Erik Vold"
}

0 comments on commit 2699402

Please sign in to comment.