Safari扩展问题

Rob*_*son 12 safari safari-extension

我正在构建我的第一个Safari扩展 - 一个非常简单的扩展 - 但我遇到了一些问题.扩展名归结为单个注入脚本,该脚本尝试绕过本机Feed处理程序并重定向到http:// URI.到目前为止,我的问题有两个:

  1. "白名单"并没有像我期望的那样运作.由于所有Feed都显示在"feed://"协议下,因此我尝试将其作为"feed://*/*"(黑名单中没有任何内容)在白名单中捕获,但我最终在请求中循环,我无法理解.如果我将黑名单值设置为" http://*/* "和" https://*/* ",则一切都按预期工作.
  2. 我无法弄清楚如何从我注入的脚本访问我的设置.该脚本创建一个beforeload事件处理程序,但无法使用safari.extension.settings文档中指示的路径访问我的设置.

我没有在Apple的文档中找到任何内容,表明我的脚本不应该提供设置.由于扩展功能是一项新功能,因此即使是Google也会返回有限的相关结果,其中大部分都来自官方文档.

我错过了什么?

谢谢.

更新 所以我希望文档不完整,因为它的边界非常糟糕,但我已经了解了一些设置.事实证明,从注入脚本,该SafariExtensionSettings对象不可用.注入脚本只能访问该SafariContentExtension对象(根本没用),但它的别名方式完全相同(safari.extension.settings) - 坏主意,IMO.如注入脚本文档中所述:

重要提示:当您在注入的脚本中使用safari.extension时,您不会处理SafariExtension类.您正在处理SafariContentExtension类.

您必须使用消息传递系统与可以访问设置的全局HTML文件进行通信.它有点循环,但是我有一条消息被发送到一个global.html文件来检索设置,并且一旦我弄清楚如何去做,就会将消息发送回我的注入脚本.

由于我做所有我的工作文件加载之前,所有的方法,我发现要发送消息靠,我没有一个网页对象.

Ric*_*her 6

就像其他人一样,我仍然在攀登学习曲线,但这就是我如何处理这个问题:

我有一个简单的扩展,没有chrome和一个注入的结束脚本(script.js).为了加载设置,我添加了一个简单的全局页面(proxy.html).注入script.js时,它会向getSettingsproxy.html 发送一条消息.proxy.html以setSettings消息响应,并且script.js继续初始化.

我在这个主题的文档中找到的最有用的页面是Messages和Proxies.

proxy.html:

<!doctype html>
<html lang="en">
<head>
  <script type="text/javascript">
    safari.application.addEventListener( "message", function( e ) {
      if( e.name === "getSettings" ) {
        e.target.page.dispatchMessage( "setSettings", {
          sort_keys: safari.extension.settings.getItem( "sort_keys" )
        } );
      }
    }, false );
  </script>
</head>
<body></body>
</html>
Run Code Online (Sandbox Code Playgroud)

的script.js:

( function() {
  var settings, init = function() {
    // do extension stuff
  };

  // listen for an incoming setSettings message
  safari.self.addEventListener( "message", function( e ) {
    if( e.name === "setSettings" ) {
      settings = e.message;
      init();
    }
  }, false );

  // ask proxy.html for settings
  safari.self.tab.dispatchMessage( "getSettings" );
}() )
Run Code Online (Sandbox Code Playgroud)


Rob*_*son 2

我花了几天时间,但我认为我使用canLoad()消息传递方法找到了一个可行的解决方案。我的注入脚本通过调用全局 HTML 页面来检索设置,如下所示:

settings = safari.self.tab.canLoad( event );
Run Code Online (Sandbox Code Playgroud)

我的全局 HTML 文件又将这些设置返回为:

settings = {
  'setting1': safari.extension.settings.getItem( 'setting1' )
}

msgEvent.message = settings;
Run Code Online (Sandbox Code Playgroud)

它仍然比我想要的更“hacky”。我似乎无法简单地返回设置对象本身,因此我必须通过手动检索每个设置来编译一个新对象。虽然不理想,但似乎确实有效。