FireGestures用 リンクからブックマークへ飛ぶ スクリプト 0.2

以前書いたFirefox で、リンクからブックマークへ飛ぶ FireGestures用スクリプトFirefox 22.0 *1 以降で動作しなくなったので、更新した。
FireGestures は、マウス操作だけで様々な機能を実行することができるマウスジェスチャー拡張機能

  • 必要環境
  • 動作確認

使い方

  • link
    1. リンクを起点にジェスチャ
    2. ポップアップが出るので選ぶ
    3. ブックマークに飛ぶ
  • selection
    1. 範囲選択してジェスチャ
    2. ポップアップが出るので選ぶ
    3. ブックマークに飛ぶ

ちなみに、その場でジェスチャすると現在のページについて動きます。
ニコニコ動画のマイリストで使うとか、おもむろに全選択してジェスチャするとか。

go bookmark (link)

//go bookmark (link) v0.2 written by Agano
const bmsvc = Components.classes["@mozilla.org/browser/nav-bookmarks-service;1"]
                      .getService(Components.interfaces.nsINavBookmarksService);
const ios = Components.classes["@mozilla.org/network/io-service;1"]
                    .getService(Components.interfaces.nsIIOService);
const faviconService = Components.classes["@mozilla.org/browser/favicon-service;1"]
                               .getService(Components.interfaces.nsIFaviconService);
const asyncFavicons = faviconService.QueryInterface(Components.interfaces.mozIAsyncFavicons);

if (FireGestures.API_goBookmark === undefined) {
  FireGestures.API_goBookmark = function(bid, fid) {
    toggleSidebar("viewBookmarksSidebar", true);
    var sidebar = document.getElementById("sidebar").contentWindow;
    var bmv = sidebar.document.getElementById("bookmarks-view");
    var tbo = bmv.treeBoxObject;
    //bmv.selectItems([fid]);
    //tbo.scrollToRow(bmv.currentIndex);
    bmv.selectItems([bid]);
    tbo.ensureRowIsVisible(bmv.currentIndex);
  };
}

var srcNode = FireGestures.sourceNode;
var url = FireGestures.getLinkURL(srcNode);
if (!url) url = window.content.location.href;

var uri = ios.newURI(url, null, null);
if (!bmsvc.isBookmarked(uri))
  throw "Bookmark Not Found";

var bookmarksArray = bmsvc.getBookmarkIdsForURI(uri, {});

var attrsList = bookmarksArray.map(function(bid) {
  if (!bid) return null;
  var parentFolderId = bmsvc.getFolderIdForItem(bid);
  var parentFolderName = bmsvc.getItemTitle(parentFolderId);
  var bookmarkName = bmsvc.getItemTitle(bid);

  var item = {
    //image: favicon,
    class: "menuitem-iconic",
    label: parentFolderName,
    description: bookmarkName + " " + uri.path,
    value: parentFolderId,
    oncommand: "this.API_goBookmark(" + bid + "," + parentFolderId + ");"
  };
  asyncFavicons.getFaviconURLForPage(uri, function(aURI) {
      if (aURI) {
        this.image = faviconService.getFaviconLinkForIcon(aURI).spec;
        FireGestures.handleEvent({type:"popuphiding"});
        FireGestures.generatePopup(event, attrsList);
      }
    }.bind(item));
  return item;
});

attrsList.sort(function(a, b) {
  return a.value - b.value;
});
FireGestures.generatePopup(event, attrsList);

MIT Licenseで。

go bookmark (selection)

//go bookmark (selection) v0.2 written by Agano
const bmsvc = Components.classes["@mozilla.org/browser/nav-bookmarks-service;1"]
                      .getService(Components.interfaces.nsINavBookmarksService);
const ios = Components.classes["@mozilla.org/network/io-service;1"]
                    .getService(Components.interfaces.nsIIOService);
const faviconService = Components.classes["@mozilla.org/browser/favicon-service;1"]
                               .getService(Components.interfaces.nsIFaviconService);
const asyncFavicons = faviconService.QueryInterface(Components.interfaces.mozIAsyncFavicons);

if (FireGestures.API_goBookmark === undefined) {
  FireGestures.API_goBookmark = function(bid, fid) {
    toggleSidebar("viewBookmarksSidebar", true);
    var sidebar = document.getElementById("sidebar").contentWindow;
    var bmv = sidebar.document.getElementById("bookmarks-view");
    var tbo = bmv.treeBoxObject;
    //bmv.selectItems([fid]);
    //tbo.scrollToRow(bmv.currentIndex);
    bmv.selectItems([bid]);
    tbo.ensureRowIsVisible(bmv.currentIndex);
  };
}

var urlArray = FireGestures.gatherLinkURLsInSelection();
if (!urlArray) {
  urlArray = [window.content.location.href];
}
var bookmarksArray = [];
var storage = {};
for (var i=0; i<urlArray.length; ++i) {
  var url = urlArray[i];
  if (url in storage) continue;
  storage[url] = true;
  var uri = ios.newURI(url, null, null);
  if (!bmsvc.isBookmarked(uri)) continue;
  bookmarksArray = bookmarksArray.concat(bmsvc.getBookmarkIdsForURI(uri, {}));
}
if (bookmarksArray.length == 0)
  throw "Bookmark Not Found";

var attrsList = bookmarksArray.map(function(bid) {
  if (!bid) return null;
  var parentFolderId = bmsvc.getFolderIdForItem(bid);
  var parentFolderName = bmsvc.getItemTitle(parentFolderId);
  var bookmarkName = bmsvc.getItemTitle(bid);
  var uri = bmsvc.getBookmarkURI(bid);

  var item = {
    //image: favicon,
    class: "menuitem-iconic",
    label: parentFolderName,
    description: bookmarkName + " " + uri.path,
    value: parentFolderId,
    oncommand: "this.API_goBookmark(" + bid + "," + parentFolderId + ");"
  };
  asyncFavicons.getFaviconURLForPage(uri, function(aURI) {
      if (aURI) {
        this.image = faviconService.getFaviconLinkForIcon(aURI).spec;
        FireGestures.handleEvent({type:"popuphiding"});
        FireGestures.generatePopup(event, attrsList);
      }
    }.bind(item));
  return item;
});

attrsList.sort(function(a, b) {
  return a.value - b.value;
});
FireGestures.generatePopup(event, attrsList);

MIT Licenseで。

仕様

  • sidebarがload済みかどうか気にしていないので初回は失敗することがある
    • もう一回やると多分動きます
  • 最近ブックマークしたページ(Recent Bookmarks)などのdynamic entriesに誤爆する