2017-11-04 4 views
0

特定のタブにのみバッジ番号を設定するにはどうすればよいですか?これまでのところ、すべてのタブにバッジ番号を設定するコードがあります。私はたくさんのことを読んできましたが、これに関する情報がたくさんあるようには見えないので、これはここです。Safari拡張機能 - 特定のタブにのみバッジ番号を設定するにはどうすればよいですか?

Adblock Plusのように、特定のタブのバッジ番号を設定したいと思います。これはChromeなどではかなり簡単ですが、Safariの場合はそうではありません。

enter image description here

誰もが自分好みのプラスのような機能拡張は、特定のタブのバッジ番号を示して方法を知っていますか?

これまではこのコードしかありませんが、言及したように、すべてのタブにバッジが設定されています。これは私が望む結果ではありません。

safari.extension.toolbarItems[0].badge = 2; 

編集:

私は自分好みプラス、およびこの機能を持っていたいくつかの他の拡張機能のソースコードを見てきました。そして、それはいくつかのプロトタイプを使用しているようです。

自分好みプラス背景の抜粋:

BrowserAction.prototype = { 
_set: function(name, value) 
{ 
    var toolbarItem = getToolbarItemForWindow(this._page._tab.browserWindow); 
    if (!toolbarItem) 
    { 
    return; 
    } 
    var property = toolbarItemProperties[name]; 
    if (!property) 
    { 
    property = toolbarItemProperties[name] = { 
     pages: new ext.PageMap(), 
     global: toolbarItem[name] 
    }; 
    } 
    property.pages.set(this._page, value); 
    if (isPageActive(this._page)) 
    { 
    toolbarItem[name] = value; 
    } 
}, 
setIcon: function(path) 
{ 
    this._set("image", safari.extension.baseURI + path.replace("$size", "16")); 
}, 
setBadge: function(badge) 
{ 
    if (!badge) 
    { 
    this._set("badge", 0); 
    } 
    else if ("number" in badge) 
    { 
    this._set("badge", badge.number); 
    } 
} 
}; 

コンテンツスクリプト(adblockplus.js)

FilterNotifier.on("filter.hitCount", function(filter, newValue, oldValue, page) 
{ 
if (!(filter instanceof BlockingFilter) || !page) 
{ 
    return; 
} 
Prefs.blocked_total++; 
var blocked = blockedPerPage.get(page) || 0; 
blockedPerPage.set(page, ++blocked); 
if (Prefs.show_statsinicon) 
{ 
    page.browserAction.setBadge(
    { 
    color: badgeColor, 
    number: blocked 
    }); 
} 
}); 

それは、これが自分好みのプラスはそれをしない方法ですが、これまでのところ、私はすることができていないようですそれを複製する。まだ試みています。

+0

誰も何も持っていませんか? – Anders

答えて

0

さて、私はついにこの解決策を見つけました。他の誰かが同じ状況にある場合に備えて、私がしたことを分かち合うと思いました。

今朝は、ユーザーがバッジ番号を表示したいウェブサイトの1つにアクセスしたとき(ユーザーが訪問したすべてのウェブサイトを保存しない)、データが配列に格納されるという考えが得られました私がターゲットにしたいウェブサイトの1つ。私は配列に以下のデータを格納しました:ルートドメイン(example.com)とbadgeNumber。

この機能を有効にするには、ターゲットとするウェブサイトのルートドメインの配列を作成し、それが一致すると次のコマンドを実行する必要があります。そうしないと、あまりにも多くのデータが必要です。グローバル・ページで

、あなたはその後、同様にあなたのグローバル・ページでメッセージ処理を設定する必要があり

var badgeUpdateArray = []; 

データを格納するための空の配列を作ることから始めます。

safari.application.addEventListener('message', handleMessage, false); 

function handleMessage(event) { 
if(event.name === "setBadgeText"){ 

    var id = badgeUpdateArray.length + 1; 
    var isFound = 0; 
    var found = badgeUpdateArray.some(function (el) { 
     if(el.identifier === event.message.identifier){ 
      // Was found 
      isFound = 1; 
     } 
    }); 
    if (isFound == 0) { 
     // Not found, add to the array 
     badgeUpdateArray.push({identifier:event.message.identifier,badgeNumber:event.message.badgeNumber}); 
    } 

    // Set the badge number 
    safari.extension.toolbarItems[0].badge = event.message.badgeNumber; 
} 
} 

ここで、コンテンツスクリプトからグローバルページにメッセージを送信する必要があります。ルートドメイン(example.com)を取得する必要がありますが、ここには入りません。かなり簡単です。 badgeNumber値も必要です。これはどこからでも取得できます(GET要求など)。

ウェブサイトがターゲットドメインと一致する場合にのみ、このコードを実行してください。

var message = { 
     identifier: domain, 
     badgeNumber: rows.length 
    } 
    safari.self.tab.dispatchMessage("setBadgeText", message); 

これはメッセージを送信し、配列にデータを格納し、バッジ番号も設定します。

これで異なるタブで作業するには、グローバルページで"activate"のイベントハンドラを作成する必要があります。これは、タブがアクティブなときは常に実行されます。私はそれを保存する簡単な方法を好むだろうと言っているのにクロムなどがタブで、それをしないように..うまくいけば、私はここでそれをすべて持っている、と作品少なくとも何か

safari.application.addEventListener("activate", updateBadge, true); 

function updateBadge(){ 

var cDomain = safari.application.activeBrowserWindow.activeTab.url; 
cDomain = cDomain.replace("www3.",""); 
cDomain = cDomain.replace("www2.",""); 
cDomain = cDomain.replace("www1.",""); 
cDomain = cDomain.replace("www.",""); 
cDomain = new URL(cDomain); 
cDomain = cDomain.hostname; 

var id = badgeUpdateArray.length + 1; 
var isFound = 0; 
var badgeNumber = 0; 
var found = badgeUpdateArray.some(function (el) { 
    badgeNumber = el.badgeNumber; 
    if(el.identifier === cDomain){ 
     // Was found, set the badge number 
     isFound = 1; 
     safari.extension.toolbarItems[0].badge = el.badgeNumber; 
    } 
}); 
if (isFound == 0) { 
    // Was not found 
    safari.extension.toolbarItems[0].badge = 0; 
} 

} 

API。

関連する問題