从后台页面创建cookie

时间:2014-02-24 21:46:38

标签: javascript google-chrome google-chrome-extension

我的扩展程序中有一个后台脚本,用于创建上下文菜单项并对其进行处理。单击它时,将创建包含特定详细信息的cookie。以下是该文件的来源:

的script.js

function createC() {
    var x = 1;
    var y = 2;
    //Create Cookie
    document.cookie = document.URL + "=" + " " + x + " " + y + " ; " + 4102444799;
    console.log("Cookie Created."); 
}

chrome.contextMenus.create({

    title: "Create Cookie", 
    contexts:["all"], 
    onclick: createC,

});

显然,其中使用的变量用于测试。当我在控制台中运行document.cookie;时,cookie不会出现。 我尝试使用chrome.cookies API并遇到了同样的问题。

Cookie是否因为在后台脚本中创建而未显示?我试图在用户所在的当前选项卡上设置它,而不是背景页面本身。

的manifest.json

{
  "manifest_version": 2,

  "name": "MyExtension",
  "description": "Do stuff",
  "version": "0.1",
  "icons": { "16": "icon.png",
           "48": "icon.png",
          "128": "icon.png" },
  "options_page": "options.html",
  "permissions": [
    "tabs", "<all_urls>", "contextMenus", "cookies"
  ],
  "background": {
    "scripts": ["script.js"]
  },
  "content_scripts": [
    {
      "matches": ["<all_urls>"],
      "js": ["nav.js"]
    }
  ]
}

4 个答案:

答案 0 :(得分:0)

在后台脚本中,“文档”不适用于当前页面,而是适用于扩展程序背景页面(chrome-extension:// [您的扩展ID] /bacground.html)。所以,你不能使用'document.cookie',你需要尝试chrome.cookies.get这样:

/**
 * Create cookie for the special page
 * @param {Object<key, value>} detail
 * @param {Function=} opt_callback
 */
function createCookie(detail, opt_callback) {
  chrome.cookies.set(detail, opt_callback);
}

答案 1 :(得分:0)

如果您想使用document当前页面而不是background.html,则需要在特定标签中使用javascript代码。

这可以通过函数executeScript来完成,您的语法是:

chrome.tabs.executeScript( tabId, details, callback )
chrome.tabs.executeScript( MyTabIdNumberMandatoryInYourCase, MyScriptCodeInLineOrUrl, MyCallbackOptional )

tabId有效标签页的ID相匹配background.js文件在主background.html下执行,然后您需要通过如果您没有传递正确的ID,希望它会执行background.html作为活动标签

所有WebRequest个事件都有一个名为details的变量且她带有tabid值,您可以通过details.tabId访问它,下面是我用过的代码我已经创建了一个扩展程序。

var onCompletedExecuteScriptDetails = {
  // You can run all the code in the inline form,
  // rather than using the parameter "file", use the "code" parameter, but is very ugly, 
  // is much more elegant to use the "file" mode
  // my-script.js is a file with code to create cookie
  file : "my-script.js"
};

var onCompletedExecuteScript = function ( details ) {
  chrome.tabs.executeScript( details.tabId, onCompletedExecuteScriptDetails );
};

var onCompletedCallback = function ( details ) {
  document.addEventListener( 'DOMContentLoaded', onCompletedExecuteScript( details ) );
};

var onCompletedFilter = {
  urls : [
        "http://*/*",
        "https://*/*"
  ]
};

chrome.webRequest.onCompleted.addListener( onCompletedCallback, onCompletedFilter, onCompletedInfo );

答案 2 :(得分:0)

我最终使用了:

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
    if (changeInfo.url != null) {
        url = changeInfo.url;
    }
});

答案 3 :(得分:0)

这就是我最终要做的。

c.RegisterType<IStorageOperations>(new InjectionFactory(c => configuration.GetValue<bool>("UseMock:Storage") ? (IStorageOperations) new FileOperations() : new S3StorageService())); 中:

manifest.json

"permissions": [ "cookies", "*://*.target_website.com/", "*://*/_generated_background_page.html" ]

background.js