题
我在建设过程中,我的第一个野生动物园的扩展--一个非常简单-但我遇到几个问题。延长归结到一个单一的、注脚本,试图以绕过当地饲料处理程序和重定向到http://URI。我的问题是双重的:
- "白名单"不是工作的方式,我们期望。由于所有的饲料显示根据"料://"协议,我已经试图捕获,在白名单中作为"料://*/*"(没有黑名单),但是我结束了在请求循环,我可以不理解。如果我设置的 的黑名单 值"http://*/*"和"https://*/*"一切工作,如预期的那样。
- 我不知道如何进入我的设置,从我的注脚本。剧本创建了一个
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背后的元素可以 getItem
和 setItem
如预期的那样。
我的结论是,由于某些原因,注脚本不能访问设置(实际上,他们甚至不似乎已经访问 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);
依靠 此 苹果文件