12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- /* 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';
- module.metadata = {
- 'stability': 'unstable'
- };
- let { merge } = require('../util/object');
- let assetsURI = require('../self').data.url();
- let isArray = Array.isArray;
- let method = require('../../method/core');
- function isAddonContent({ contentURL }) {
- return typeof(contentURL) === 'string' && contentURL.indexOf(assetsURI) === 0;
- }
- exports.isAddonContent = isAddonContent;
- function hasContentScript({ contentScript, contentScriptFile }) {
- return (isArray(contentScript) ? contentScript.length > 0 :
- !!contentScript) ||
- (isArray(contentScriptFile) ? contentScriptFile.length > 0 :
- !!contentScriptFile);
- }
- exports.hasContentScript = hasContentScript;
- function requiresAddonGlobal(model) {
- return model.injectInDocument || (isAddonContent(model) && !hasContentScript(model));
- }
- exports.requiresAddonGlobal = requiresAddonGlobal;
- function getAttachEventType(model) {
- if (!model) return null;
- let when = model.contentScriptWhen;
- return requiresAddonGlobal(model) ? 'document-element-inserted' :
- when === 'start' ? 'document-element-inserted' :
- when === 'end' ? 'load' :
- when === 'ready' ? 'DOMContentLoaded' :
- null;
- }
- exports.getAttachEventType = getAttachEventType;
- let attach = method('worker-attach');
- exports.attach = attach;
- let detach = method('worker-detach');
- exports.detach = detach;
- let destroy = method('worker-destroy');
- exports.destroy = destroy;
- function WorkerHost (workerFor) {
- // Define worker properties that just proxy to underlying worker
- return ['postMessage', 'port', 'url', 'tab'].reduce(function(proto, name) {
- // Use descriptor properties instead so we can call
- // the worker function in the context of the worker so we
- // don't have to create new functions with `fn.bind(worker)`
- let descriptorProp = {
- value: function (...args) {
- let worker = workerFor(this);
- return worker[name].apply(worker, args);
- }
- };
-
- let accessorProp = {
- get: function () { return workerFor(this)[name]; },
- set: function (value) { workerFor(this)[name] = value; }
- };
- Object.defineProperty(proto, name, merge({
- enumerable: true,
- configurable: false,
- }, isDescriptor(name) ? descriptorProp : accessorProp));
- return proto;
- }, {});
-
- function isDescriptor (prop) {
- return ~['postMessage'].indexOf(prop);
- }
- }
- exports.WorkerHost = WorkerHost;
|