mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1192281: Uplift Add-on SDK to fx-team. a=me
96ae8d914f...169a05b976
This commit is contained in:
parent
c00d2e8ba5
commit
5f7c8e6845
@ -223,6 +223,20 @@ function show(panel, options, anchor) {
|
||||
}
|
||||
exports.show = show
|
||||
|
||||
function onPanelClick(event) {
|
||||
let { target, metaKey, ctrlKey, shiftKey, button } = event;
|
||||
let accel = platform === "darwin" ? metaKey : ctrlKey;
|
||||
let isLeftClick = button === 0;
|
||||
let isMiddleClick = button === 1;
|
||||
|
||||
if ((isLeftClick && (accel || shiftKey)) || isMiddleClick) {
|
||||
let link = target.closest('a');
|
||||
|
||||
if (link && link.href)
|
||||
getMostRecentBrowserWindow().openUILink(link.href, event)
|
||||
}
|
||||
}
|
||||
|
||||
function setupPanelFrame(frame) {
|
||||
frame.setAttribute("flex", 1);
|
||||
frame.setAttribute("transparent", "transparent");
|
||||
@ -301,6 +315,8 @@ function make(document) {
|
||||
panel.addEventListener("popupshown", onPanelStateChange, false);
|
||||
panel.addEventListener("popuphidden", onPanelStateChange, false);
|
||||
|
||||
panel.addEventListener("click", onPanelClick, false);
|
||||
|
||||
// Panel content document can be either in panel `viewFrame` or in
|
||||
// a `backgroundFrame` depending on panel state. Listeners are set
|
||||
// on both to avoid setting and removing listeners on panel state changes.
|
||||
|
@ -13,14 +13,14 @@ const { getTabs, closeTab } = require("../tabs/utils");
|
||||
const { windows: getWindows } = require("../window/utils");
|
||||
const { close: closeWindow } = require("../window/helpers");
|
||||
const { isGenerator } = require("../lang/type");
|
||||
|
||||
const { env } = require("../system/environment");
|
||||
const { Task } = require("resource://gre/modules/Task.jsm");
|
||||
|
||||
function getTestNames (exports)
|
||||
Object.keys(exports).filter(name => /^test/.test(name))
|
||||
const getTestNames = (exports) =>
|
||||
Object.keys(exports).filter(name => /^test/.test(name));
|
||||
|
||||
function isTestAsync (fn) fn.length > 1
|
||||
function isHelperAsync (fn) fn.length > 2
|
||||
const isTestAsync = ({length}) => length > 1;
|
||||
const isHelperAsync = ({length}) => length > 2;
|
||||
|
||||
/*
|
||||
* Takes an `exports` object of a test file and a function `beforeFn`
|
||||
@ -195,3 +195,5 @@ let cleanUI = function cleanUI() {
|
||||
return promise;
|
||||
}
|
||||
exports.cleanUI = cleanUI;
|
||||
|
||||
exports.isTravisCI = ("TRAVIS" in env && "CI" in env);
|
||||
|
@ -194,14 +194,16 @@ function readURI(uri) {
|
||||
|
||||
// Combines all arguments into a resolved, normalized path
|
||||
function join (...paths) {
|
||||
let resolved = normalize(pathJoin(...paths))
|
||||
// OS.File `normalize` strips out the second slash in
|
||||
// `resource://` or `chrome://`, and third slash in
|
||||
// `file:///`, so we work around this
|
||||
resolved = resolved.replace(/^resource\:\/([^\/])/, 'resource://$1');
|
||||
resolved = resolved.replace(/^file\:\/([^\/])/, 'file:///$1');
|
||||
resolved = resolved.replace(/^chrome\:\/([^\/])/, 'chrome://$1');
|
||||
return resolved;
|
||||
let joined = pathJoin(...paths);
|
||||
let resolved = normalize(joined);
|
||||
|
||||
// OS.File `normalize` strips out any additional slashes breaking URIs like
|
||||
// `resource://`, `resource:///`, `chrome://` or `file:///`, so we work
|
||||
// around this putting back the slashes originally given, for such schemes.
|
||||
let re = /^(resource|file|chrome)(\:\/{1,3})([^\/])/;
|
||||
let matches = joined.match(re);
|
||||
|
||||
return resolved.replace(re, (...args) => args[1] + matches[2] + args[3]);
|
||||
}
|
||||
Loader.join = join;
|
||||
|
||||
@ -568,7 +570,8 @@ Loader.resolveURI = resolveURI;
|
||||
const Require = iced(function Require(loader, requirer) {
|
||||
let {
|
||||
modules, mapping, resolve: loaderResolve, load,
|
||||
manifest, rootURI, isNative, requireMap
|
||||
manifest, rootURI, isNative, requireMap,
|
||||
overrideRequire
|
||||
} = loader;
|
||||
|
||||
function require(id) {
|
||||
@ -576,6 +579,14 @@ const Require = iced(function Require(loader, requirer) {
|
||||
throw Error('You must provide a module name when calling require() from '
|
||||
+ requirer.id, requirer.uri);
|
||||
|
||||
if (overrideRequire) {
|
||||
return overrideRequire(id, _require);
|
||||
}
|
||||
|
||||
return _require(id);
|
||||
}
|
||||
|
||||
function _require(id) {
|
||||
let { uri, requirement } = getRequirements(id);
|
||||
let module = null;
|
||||
// If module is already cached by loader then just use it.
|
||||
@ -715,7 +726,7 @@ const Require = iced(function Require(loader, requirer) {
|
||||
}
|
||||
|
||||
// Expose the `resolve` function for this `Require` instance
|
||||
require.resolve = function resolve(id) {
|
||||
require.resolve = _require.resolve = function resolve(id) {
|
||||
let { uri } = getRequirements(id);
|
||||
return uri;
|
||||
}
|
||||
@ -901,6 +912,7 @@ function Loader(options) {
|
||||
value: options.invisibleToDebugger || false },
|
||||
load: { enumerable: false, value: options.load || load },
|
||||
checkCompatibility: { enumerable: false, value: checkCompatibility },
|
||||
overrideRequire: { enumerable: false, value: options.require },
|
||||
// Main (entry point) module, it can be set only once, since loader
|
||||
// instance can have only one main module.
|
||||
main: new function() {
|
||||
|
1
addon-sdk/source/test/fixtures/loader/json/mutation.json
vendored
Normal file
1
addon-sdk/source/test/fixtures/loader/json/mutation.json
vendored
Normal file
@ -0,0 +1 @@
|
||||
{ "value": 1 }
|
@ -1234,6 +1234,33 @@ exports['test active tab properties defined on popup closed'] = function (assert
|
||||
});
|
||||
};
|
||||
|
||||
// related to bug 922956
|
||||
// https://bugzilla.mozilla.org/show_bug.cgi?id=922956
|
||||
exports["test ready event after window.open"] = function (assert, done) {
|
||||
setPref(OPEN_IN_NEW_WINDOW_PREF, 2);
|
||||
setPref(DISABLE_POPUP_PREF, false);
|
||||
|
||||
let firstRun = true;
|
||||
tabs.on('ready', function onReady(tab) {
|
||||
if (firstRun) {
|
||||
assert.pass("tab ready callback after 1st window.open");
|
||||
firstRun = false;
|
||||
tab.close();
|
||||
}
|
||||
else {
|
||||
assert.pass("tab ready callback after 2nd window.open");
|
||||
tabs.removeListener('ready', onReady);
|
||||
tab.close(done);
|
||||
}
|
||||
});
|
||||
|
||||
tabs.activeTab.attach({
|
||||
contentScript: "window.open('about:blank');" +
|
||||
"window.open('about:blank', '', " +
|
||||
"'width=800,height=600,resizable=no,status=no,location=no');"
|
||||
});
|
||||
}
|
||||
|
||||
after(exports, function*(name, assert) {
|
||||
resetPopupPrefs();
|
||||
yield cleanUI();
|
||||
|
@ -6,6 +6,7 @@
|
||||
require("sdk/context-menu");
|
||||
|
||||
const { defer } = require("sdk/core/promise");
|
||||
const { isTravisCI } = require("sdk/test/utils");
|
||||
const packaging = require('@loader/options');
|
||||
|
||||
// These should match the same constants in the module.
|
||||
@ -3752,7 +3753,7 @@ exports.testPredicateContextTargetValueNotSet = function (assert, done) {
|
||||
});
|
||||
};
|
||||
|
||||
if (packaging.isNative) {
|
||||
if (isTravisCI) {
|
||||
module.exports = {
|
||||
"test skip on jpm": (assert) => assert.pass("skipping this file with jpm")
|
||||
};
|
||||
|
@ -57,6 +57,10 @@ exports['test join'] = function (assert) {
|
||||
'resource://my/path/yeah/whoa');
|
||||
assert.equal(join('resource://my/path/yeah/yuh', './whoa'),
|
||||
'resource://my/path/yeah/yuh/whoa');
|
||||
assert.equal(join('resource:///my/path/yeah/yuh', '../whoa'),
|
||||
'resource:///my/path/yeah/whoa');
|
||||
assert.equal(join('resource:///my/path/yeah/yuh', './whoa'),
|
||||
'resource:///my/path/yeah/yuh/whoa');
|
||||
assert.equal(join('file:///my/path/yeah/yuh', '../whoa'),
|
||||
'file:///my/path/yeah/whoa');
|
||||
assert.equal(join('file:///my/path/yeah/yuh', './whoa'),
|
||||
@ -552,4 +556,60 @@ exports['test user global'] = function(assert) {
|
||||
"user module returns expected `com` global");
|
||||
};
|
||||
|
||||
exports['test custom require caching'] = function(assert) {
|
||||
const loader = Loader({
|
||||
paths: { '': root + "/" },
|
||||
require: (id, require) => {
|
||||
// Just load it normally
|
||||
return require(id);
|
||||
}
|
||||
});
|
||||
const require = Require(loader, module);
|
||||
|
||||
let data = require('fixtures/loader/json/mutation.json');
|
||||
assert.equal(data.value, 1, 'has initial value');
|
||||
data.value = 2;
|
||||
let newdata = require('fixtures/loader/json/mutation.json');
|
||||
assert.equal(
|
||||
newdata.value,
|
||||
2,
|
||||
'JSON objects returned should be cached and the same instance'
|
||||
);
|
||||
};
|
||||
|
||||
exports['test caching when proxying a loader'] = function(assert) {
|
||||
const parentRequire = require;
|
||||
const loader = Loader({
|
||||
paths: { '': root + "/" },
|
||||
require: (id, childRequire) => {
|
||||
if(id === 'gimmejson') {
|
||||
return childRequire('fixtures/loader/json/mutation.json')
|
||||
}
|
||||
// Load it with the original (global) require
|
||||
return parentRequire(id);
|
||||
}
|
||||
});
|
||||
const childRequire = Require(loader, module);
|
||||
|
||||
let data = childRequire('./fixtures/loader/json/mutation.json');
|
||||
assert.equal(data.value, 1, 'data has initial value');
|
||||
data.value = 2;
|
||||
|
||||
let newdata = childRequire('./fixtures/loader/json/mutation.json');
|
||||
assert.equal(newdata.value, 2, 'data has changed');
|
||||
|
||||
let childData = childRequire('gimmejson');
|
||||
assert.equal(childData.value, 1, 'data from child loader has initial value');
|
||||
childData.value = 3;
|
||||
let newChildData = childRequire('gimmejson');
|
||||
assert.equal(newChildData.value, 3, 'data from child loader has changed');
|
||||
|
||||
data = childRequire('./fixtures/loader/json/mutation.json');
|
||||
assert.equal(data.value, 2, 'data from parent loader has not changed');
|
||||
|
||||
// Set it back to the original value just in case (this instance
|
||||
// will be shared across tests)
|
||||
data.value = 1;
|
||||
}
|
||||
|
||||
require('sdk/test').run(exports);
|
||||
|
@ -22,7 +22,8 @@ const { getMostRecentBrowserWindow } = require('sdk/window/utils');
|
||||
const { URL } = require('sdk/url');
|
||||
const { wait } = require('./event/helpers');
|
||||
const packaging = require('@loader/options');
|
||||
const { cleanUI, after } = require("sdk/test/utils");
|
||||
const { cleanUI, after, isTravisCI } = require("sdk/test/utils");
|
||||
const { platform } = require('sdk/system');
|
||||
|
||||
const fixtures = require('./fixtures')
|
||||
|
||||
@ -1315,12 +1316,64 @@ exports["test Panel without contentURL and contentScriptWhen=start should show"]
|
||||
loader.unload();
|
||||
}
|
||||
|
||||
exports["test Panel links"] = function*(assert) {
|
||||
const loader = Loader(module);
|
||||
|
||||
const { Panel } = loader.require('sdk/panel');
|
||||
const { getActiveView } = loader.require('sdk/view/core');
|
||||
const tabs = loader.require('sdk/tabs');
|
||||
|
||||
const synthesizeClick = (panel, options) => {
|
||||
let { contentWindow } = getActiveView(panel).querySelector('iframe');
|
||||
let event = new contentWindow.MouseEvent('click', options);
|
||||
|
||||
contentWindow.document.querySelector('a').dispatchEvent(event);
|
||||
}
|
||||
|
||||
const linkURL = 'data:text/html;charset=utf-8,' +
|
||||
encodeURIComponent('<html><a href="#">foo</a></html>');
|
||||
|
||||
const contentURL = 'data:text/html;charset=utf-8,' +
|
||||
encodeURIComponent(`<html><a href="${linkURL}">page</a></html>`);
|
||||
|
||||
let panel = Panel({
|
||||
contentURL,
|
||||
contentScript: Isolate(() => self.postMessage(document.URL))
|
||||
});
|
||||
|
||||
panel.show();
|
||||
|
||||
let url = yield wait(panel, 'message');
|
||||
|
||||
assert.equal(url, contentURL,
|
||||
'content URL loaded');
|
||||
|
||||
synthesizeClick(panel, { bubbles: true });
|
||||
|
||||
url = yield wait(panel, 'message');
|
||||
|
||||
assert.equal(url, linkURL,
|
||||
'link URL loaded in the panel after click');
|
||||
|
||||
synthesizeClick(panel, {
|
||||
bubbles: true,
|
||||
[platform === 'darwin' ? 'metaKey' : 'ctrlKey']: true
|
||||
});
|
||||
|
||||
let tab = yield wait(tabs, 'ready');
|
||||
|
||||
assert.equal(tab.url, linkURL + '#',
|
||||
'link URL loaded in a new tab after click + accel');
|
||||
|
||||
loader.unload();
|
||||
}
|
||||
|
||||
after(exports, function*(name, assert) {
|
||||
yield cleanUI();
|
||||
assert.pass("ui was cleaned.");
|
||||
});
|
||||
|
||||
if (packaging.isNative) {
|
||||
if (isTravisCI) {
|
||||
module.exports = {
|
||||
"test skip on jpm": (assert) => assert.pass("skipping this file with jpm")
|
||||
};
|
||||
|
@ -312,10 +312,10 @@ exports.testUnloadOfDynamicPrefGeneration = function*(assert) {
|
||||
yield promise;
|
||||
|
||||
// reopen the add-on prefs page
|
||||
({ tabId, document }) = yield open(addon);
|
||||
({ tabId, document } = yield open(addon));
|
||||
|
||||
// confirm dynamic pref generation did not occur
|
||||
({ promise, resolve }) = defer();
|
||||
({ promise, resolve } = defer());
|
||||
results = document.querySelectorAll("*[data-jetpack-id=\"" + id + "\"]");
|
||||
assert.equal(0, results.length, "the prefs were not setup after unload");
|
||||
modelFor(getTabForId(tabId)).close(resolve);
|
||||
|
@ -25,11 +25,11 @@ exports["test makeFilters no method filter"] = (assert) => {
|
||||
testFiles.forEach(f => assert.ok(fileFilter(f), "using filter 'i' on filename " + f + " works"));
|
||||
testMethods.forEach(m => assert.ok(testFilter(m), "using filter 'i' on method name " + m + " works"));
|
||||
|
||||
({ fileFilter, testFilter }) = makeFilters({ filter: "i:" });
|
||||
({ fileFilter, testFilter } = makeFilters({ filter: "i:" }));
|
||||
testFiles.forEach(f => assert.ok(fileFilter(f), "using filter 'i:' on filename " + f + " works"));
|
||||
testMethods.forEach(m => assert.ok(testFilter(m), "using filter 'i:' on method name " + m + " works"));
|
||||
|
||||
({ fileFilter, testFilter }) = makeFilters({ filter: "z:" });
|
||||
({ fileFilter, testFilter } = makeFilters({ filter: "z:" }));
|
||||
testFiles.forEach(f => assert.ok(!fileFilter(f), "using filter 'z:' on filename " + f + " dnw"));
|
||||
testMethods.forEach(m => assert.ok(testFilter(m), "using filter 'z:' on method name " + m + " works"));
|
||||
}
|
||||
@ -39,7 +39,7 @@ exports["test makeFilters no file filter"] = (assert) => {
|
||||
testFiles.forEach(f => assert.ok(fileFilter(f), "using filter ':i' on filename " + f + " works"));
|
||||
testMethods.forEach(m => assert.ok(testFilter(m), "using filter ':i' on method name " + m + " works"));
|
||||
|
||||
({ fileFilter, testFilter }) = makeFilters({ filter: ":z" });
|
||||
({ fileFilter, testFilter } = makeFilters({ filter: ":z" }));
|
||||
testFiles.forEach(f => assert.ok(fileFilter(f), "using filter ':z' on filename " + f + " works"));
|
||||
testMethods.forEach(m => assert.ok(!testFilter(m), "using filter ':z' on method name " + m + " dnw"));
|
||||
}
|
||||
@ -49,7 +49,7 @@ exports["test makeFilters both filters"] = (assert) => {
|
||||
testFiles.forEach(f => assert.ok(fileFilter(f), "using filter 'i:i' on filename " + f + " works"));
|
||||
testMethods.forEach(m => assert.ok(testFilter(m), "using filter 'i:i' on method name " + m + " works"));
|
||||
|
||||
({ fileFilter, testFilter }) = makeFilters({ filter: "z:z" });
|
||||
({ fileFilter, testFilter } = makeFilters({ filter: "z:z" }));
|
||||
testFiles.forEach(f => assert.ok(!fileFilter(f), "using filter 'z:z' on filename " + f + " dnw"));
|
||||
testMethods.forEach(m => assert.ok(!testFilter(m), "using filter 'z:z' on method name " + m + " dnw"));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user