【问题标题】:Chrome extension: function must be called during a user gestureChrome 扩展:必须在用户手势期间调用函数
【发布时间】:2015-02-24 12:01:57
【问题描述】:

在 Chrome 扩展程序中,我想要求用户通过 browser_action 的弹出窗口链接(也就是带有链接的工具栏弹出窗口)完全访问页面。当用户单击链接时,我收到此错误:

runtime.lastError while running permissions.request: This function must be called during a user gesture

然而用户实际上点击了链接和“用户手势”。关于如何调试被视为用户手势的任何想法?

点击按钮后,我通过 chrome 的 chrome.permissions.request api 请求完全访问权限:

$('#button-requestpermissions').click(function(){
  requestAmbientPermission(function(granted) {
    if (granted) {
      // code never reached as granted === false
    } 
  });
});

function requestAmbientPermission(callback){
    // Permissions must be requested from inside a user gesture, like a button's click handler.
    chrome.permissions.request({
      permissions: ['activeTab'],
      origins: ['<all_urls>']
    }, callback);
}

清单具有像这样设置的可选权限:

  "permissions": [
    "https://www.meethue.com/",
    "https://colorlovers.herokuapp.com/"
  ],
  "optional_permissions": [ 
    "activeTab",
    "<all_urls>"
  ],

【问题讨论】:

  • 请求权限代码可能需要从后台页面而不是内容脚本执行
  • Zig,我确实尝试过暴力破解解决方案 - 从后台页面执行 permissions.request 会产生相同的错误。
  • 请注意:activeTab 权限不会产生警告。它是made for that specific purpose。因此,确实没有必要将其设为可选。

标签: javascript google-chrome-extension permissions


【解决方案1】:

即使代码在用户手势回调中,请求权限时也会出现错误。

runtime.lastError while running permissions.request: This function must be called during a user gesture

仅当我在执行 API 之前放置调试器时才会发生这种情况。当我删除调试器并让 API 在没有任何中间阻止程序的情况下执行时,它被纠正了。对于任何调试,我从那时起就使用了 console.log。

我猜这是因为当调试器停止代码执行并且我们在调试模式下在浏览器上进行一些用户交互时,我们再次开始执行,chrome 决定此代码块与最后一次交互无关,所以不允许。

【讨论】:

    【解决方案2】:

    回答太晚了?您只能从用户操作请求新权限,例如单击按钮:

    document.querySelector('#my-button').addEventListener('click', function(event) {
        // Permissions must be requested from inside a user gesture, like a button's
        // click handler.
        chrome.permissions.request({
          permissions: ['tabs'],
          origins: ['http://www.google.com/']
        }, function(granted) {
          // The callback argument will be true if the user granted the permissions.
          if (granted) {
            doSomething();
          } else {
            doSomethingElse();
          }
        });
    });
    

    详细解释可以看here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-14
      • 1970-01-01
      • 2011-11-12
      • 1970-01-01
      • 1970-01-01
      • 2019-11-05
      • 1970-01-01
      • 2018-05-25
      相关资源
      最近更新 更多