Safari 狩猎延伸问题

Safari 狩猎延伸问题,safari,safari-extension,Safari,Safari Extension,我正在构建我的第一个Safari扩展——一个非常简单的扩展——但我遇到了几个问题。扩展可以归结为一个注入脚本,该脚本试图绕过本机提要处理程序并重定向到http://URI。到目前为止,我的问题有两个: “白名单”的工作方式与我预期的不同。由于所有提要都显示在“feed://”协议下,因此我试图在白名单中将其捕获为“feed://*/*”(黑名单中没有任何内容),但我最终陷入了一个无法理解的请求循环。如果我设置了“黑名单”的值“和”,则一切正常 我不知道如何从注入的脚本访问我的设置。脚本在加载前创

我正在构建我的第一个Safari扩展——一个非常简单的扩展——但我遇到了几个问题。扩展可以归结为一个注入脚本,该脚本试图绕过本机提要处理程序并重定向到http://URI。到目前为止,我的问题有两个:

  • “白名单”的工作方式与我预期的不同。由于所有提要都显示在“feed://”协议下,因此我试图在白名单中将其捕获为“feed://*/*”(黑名单中没有任何内容),但我最终陷入了一个无法理解的请求循环。如果我设置了“黑名单”的值“和”,则一切正常
  • 我不知道如何从注入的脚本访问我的设置。脚本在加载前创建
    事件处理程序,但无法使用文档中指示的
    safari.extension.settings
    路径访问我的设置
  • 我在苹果的文档中没有发现任何东西表明我的脚本不应该提供设置。由于扩展是这样一个新特性,即使是谷歌也会返回有限的相关结果,其中大部分来自官方文档

    我错过了什么

    更新 所以我希望文档是不完整的,因为它近乎糟糕,但我已经了解了一些设置。事实证明,从注入脚本来看,
    SafariExtensionSettings
    对象不可用。注入脚本只能访问
    SafariContentExtension
    对象(这一点都不有用),但它的别名方式完全相同(
    safari.extension.settings
    )--这主意不好,依我看。如中所述:

    重要提示:从注入脚本中使用safari.extension时,您不是在寻址safari扩展类。您正在处理SafariContentExtension类

    您必须使用消息传递系统与可以访问设置的全局HTML文件进行对话。这有点荒唐,但我有一条消息被发送到一个
    global.html
    文件,该文件检索设置,并在我找到如何执行该操作的方法后立即将消息发送回我的注入脚本


    因为我在加载文档之前做了所有的工作,所以我发现所有发回消息的方法都依赖于一个我没有的页面对象。

    编辑:就像您在最初的后期更新中所说的,注入的脚本没有全局HTML页面应有的访问权限。这是我的工作解决方案,假设您想知道在注入脚本中设置“foo”的值:

    注入的脚本代码:

    function getMessage(msgEvent) {
    
        if (msgEvent.name == "settingValueIs")
            alert("Value for asked setting is: " + msgEvent.message);
    
    }
    
    safari.self.tab.dispatchMessage("getSettingValue", "foo"); // ask for value
    safari.self.addEventListener("message", getMessage, false); // wait for reply
    
    全局HTML代码:

    function respondToMessage(messageEvent) {
    
        if (messageEvent.name == "getSettingValue") {
    
               // getItem("foo");
            var value = safari.extension.settings.getItem(messageEvent.message);
            // return value of foo to injected script
               safari.application.activeBrowserWindow.activeTab.page.dispatchMessage("settingValueIs", value);
    
        } 
    
    }
    
    safari.application.addEventListener("message",respondToMessage,false);
    
    希望这有帮助


    初始帖子:我遇到了与您相同的第二个问题,我无法从注入脚本访问我的设置(或secureSettings)。在我的例子中,脚本是在页面加载之后加载的,但即使这样,我也不能使用
    safari.extension.settings

    它的唯一工作方式是使用工具栏/按钮,该元素后面的HTML可以像预期的那样
    getItem
    setItem


    我的结论是,出于某种原因,注入脚本无法访问设置(实际上,它们甚至似乎都无法访问
    safari
    元素)。Bug或预期功能,这有待解决。

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

    settings = safari.self.tab.canLoad( event );
    
    我的全局HTML文件依次返回这些设置:

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

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

    与其他人一样,我仍在不断学习,但我是如何处理这个问题的:

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

    我在文档中找到的关于这个主题的最有用的页面是

    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>
    

    遇到同样的问题,但答案比您想象的要简单:在全局html中包含脚本

    <!DOCTYPE HTML>
    <script type="text/javascript" src="cleanup.js"></script>
    <script>
    …
    </script>
    
    global.html

    switch (event.name) {
    case "getSettings":
       // send the settings data
       event.target.page.dispatchMessage("SETTINGS", safari.extension.settings);
    

    依靠苹果的文档

    看看我上面添加的更新。我现在知道了为什么你不能访问设置,甚至已经指出了如何访问它们(尽管它因其他原因对我不起作用)。我刚刚找到了解决我问题的方法,上面为你或其他有相同问题的人发布了。也许你可以根据你的情况调整它!谢谢你的更新。在我的例子中,所有的工作都是在加载前
    完成的,因此页面对象未定义,这似乎意味着
    dispatchMessage()
    方法不可用。我还在寻找解决办法。瑞克,你是救命恩人!非常感谢。
    function gotSettings(msgEvent) {
       if (msgEvent.name === "SETTINGS") {
          setts = msgEvent.message;
          alert(setts.mySetting1);
          // run the programm
       }
    }
    
    safari.self.addEventListener("message", gotSettings, false);
    safari.self.tab.dispatchMessage("getSettings");
    
    switch (event.name) {
    case "getSettings":
       // send the settings data
       event.target.page.dispatchMessage("SETTINGS", safari.extension.settings);