首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用JavaScript代码模块(XPCOMUtils.jsm)的URL?

使用JavaScript代码模块(XPCOMUtils.jsm)的URL?
EN

Stack Overflow用户
提问于 2015-01-18 15:47:52
回答 1查看 439关注 0票数 2

我正在尝试动态注册自定义URL,用于火狐扩展,相对于变量.

示例:

代码语言:javascript
复制
- If var = 1, then create... about:123

- If var = 2, then create... about:abc

- If var = 3, then create... about:xxx

有人向我推荐了XPCOMUtils.jsm,代码模块,特别是JavaScript,但是如何在代码中实现这一点呢?

我翻阅了这几页都没有用:

我已经使用文件实现了一个定制的静态chrome.manifest:URL。但是我不需要静态关于:URL。我需要动态关于:URL,相对于火狐扩展中的变量。

谢谢你的帮忙!

EN

回答 1

Stack Overflow用户

发布于 2015-01-21 02:41:39

我编写了这个addon-sdk模块名为-什么?,它将允许您动态地向火狐添加/删除about:what uris。

这是关于-什么的当前源代码

代码语言:javascript
复制
/* 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 { Cr, Cu, Ci, Cc, Cm } = require('chrome');
const { when: unload } = require('sdk/system/unload');
const { validateOptions : validate } = require('sdk/deprecated/api-utils');
const { uuid } = require('sdk/util/uuid');
const { URL, isValidURI } = require('sdk/url');
const tabs = require('sdk/tabs');

Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");

const validOptions = {
  what: {
    is: ['string'],
    ok: function(what) {
      if (what.match(/^[a-z0-9-]+$/i))
        return true;
      return false;
    },
    map: function(url) url.toLowerCase()
  },
  url: {
    is: ['string', 'undefined']
  },
  content: {
    is: ['string', 'undefined']
  },
  useChrome: {
    is: ['undefined', 'null', 'boolean'],
    map: function(use) !!use
  }
};

function add(options) {
  let { what, url, content, useChrome } = validate(options, validOptions);
  let baseURL = url;
  if (content) {
    url = encodeURI('data:text/html;charset=utf-8,' + content.replace(/\{\s*page\.baseurl\s*\}/, baseURL));
  }

  let classID = uuid();

  let aboutModule = {
    QueryInterface: XPCOMUtils.generateQI([Ci.nsIAboutModule]),
     newChannel: function (aURI) {
       let chan = Services.io.newChannel(url, null, null);
       if (useChrome)
         chan.owner = Services.scriptSecurityManager.getSystemPrincipal();
       return chan;
     },
    getURIFlags: function () Ci.nsIAboutModule.ALLOW_SCRIPT
  };

  let factory = {
    createInstance: function(aOuter, aIID) {
      if (aOuter)
        throw Cr.NS_ERROR_NO_AGGREGATION;
      return aboutModule.QueryInterface(aIID);
    },
    QueryInterface: XPCOMUtils.generateQI([Ci.nsIFactory])
  };

  // register about:what
  Cm.QueryInterface(Ci.nsIComponentRegistrar).
    registerFactory(classID, '', '@mozilla.org/network/protocol/about;1?what='+what, factory);

  let remover = unloader.bind(null, what, factory, classID);
  unload(remover);

  return undefined;
}
exports.add = add;

function unloader(what, factory, classID) {
  // unregister about:what
  Cm.QueryInterface(Ci.nsIComponentRegistrar).unregisterFactory(classID, factory);
  let regEx = new RegExp('^' + what, 'i');

  // AMO policy, see http://maglione-k.users.sourceforge.net/bootstrapped.xhtml
  // close about:what tabs
  for each (let tab in tabs) {
    let url = URL(tab.url);
    if (url.scheme === 'about' && url.path.match(regEx)) {
      tab.close();
    }
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28011594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档