我在建设过程中,我的第一个野生动物园的扩展--一个非常简单-但我遇到几个问题。延长归结到一个单一的、注脚本,试图以绕过当地饲料处理程序和重定向到http://URI。我的问题是双重的:

  1. "白名单"不是工作的方式,我们期望。由于所有的饲料显示根据"料://"协议,我已经试图捕获,在白名单中作为"料://*/*"(没有黑名单),但是我结束了在请求循环,我可以不理解。如果我设置的 的黑名单 值"http://*/*"和"https://*/*"一切工作,如预期的那样。
  2. 我不知道如何进入我的设置,从我的注脚本。剧本创建了一个 beforeload 事件处理程序,但不能访问我的设置使用的 safari.extension.settings 路径中指出的文件。

我还没有找到任何东西在苹果的文件表明,设置不应该是可以从我的脚本。由于扩展这样的一个新特征,即使是谷歌的回报有限,有关结果和大多数的那些从正式文件。

我是什么丢失?

更新 所以我希望该文件是不完整的,因为它的边界非常糟糕,但是我学到一点关于设置。事实证明,注脚本, SafariExtensionSettings 对象还不可用。注脚本,只能访问到的 SafariContentExtension 对象(这是不是有用的,在所有),但是它的混淆完全相同的方式(safari.extension.settings)--糟糕的主意,海事组织。正如在 注脚本文件:

重要的是:当你使用野生动物园。延长从内部的一个注脚,你是不是解决SafariExtension类。你是解决SafariContentExtension类。

你必须使用的通讯系统,以跟一个全球HTML文件,其中有访问的设置。这有点糊涂,但我有一个消息发送到 global.html 文件的检索设置并将发送一个信息回到我的脚注,只要我弄清楚如何去这样做。

因为我在做我所有的工作之前的文件载荷,所有的方法,我已经找到发消息的 依靠一页的目的,我没有。

有帮助吗?

解决方案 3

我花了几天,但我认为我找到一个可行的解决方案的使用 canLoad() 消息传递方法。我注脚本的检索设置通过调用全球HTML网页是这样的:

settings = safari.self.tab.canLoad( event );

我的全球HTML文件,反过来,返回这些设置为:

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

msgEvent.message = settings;

它仍然是多一点"哈克"比我喜欢的。我似乎不能简单地返回设置的对象本身,所以我必须编制一个新的对象通过检索每一设置。不理想,但它似乎是有效的。

其他提示

像其他人一样在这一点上,我还在攀登的学习曲线,但这里我是如何处理这个问题:

我有一个简单的扩展没有铬和一个注端脚本(script.js).为目的的装置我已经增加了一个简单的全球页(proxy.html).时script.js 注,它发送一个 getSettings 消息proxy.html.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>

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" );
}() )

编辑: 就像你说的在你后的初始更新,注脚本不会有同样的访问,全球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);

希望这可以帮助!


最初的职: 我有相同的第2个问题,因为你,我不能接我的设置(或secureSettings)从一个注脚本。在我的情况下,脚本后载入页面负荷,但即使这样,我不能使用 safari.extension.settings.

唯一的它的工作方式是与一个工具栏/按钮,HTML背后的元素可以 getItemsetItem 如预期的那样。

我的结论是,由于某些原因,注脚本不能访问设置(实际上,他们甚至不似乎已经访问 safari 元)。错误或旨在功能,剩下的图。

遇到同样的问题,但答案是很容易,你可以想象一下:包括脚本在全球html。

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

然后你可以访问设置中所述的文件 safari.extension.settings.myKey

你也可以投票@特拉维斯,因为我有想法从 他的职位

//编辑:
实际上我真的不知道什么是错误的。调用的设置,作为第一命令的工作,但不在稍后的时间。此外,它似乎是要破坏我的完整的脚本后2.注射。需要验证,如果它只是在我的(难?) 脚本。

//EDIT2:
现在我得到了它的工作得到回设置的对象,通过 dispatchMessage()

在你 injected.js

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");

global.html

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

依靠 苹果文件

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top