Firefoxのタブ機能をソースコードをいじって改変した


Firefoxのタブ機能をソースコードをいじって改変した

はじめに

この記事は大学の講義の一環で作成しています。目次はこちらになります。

目的

ブラウザでテキストを選択した後検索ということをしたいときを考えると既存の方法としては以下のようなものが考えられます。

  • 右クリック → 「Googleで○○を検索」をクリック
  • Ctrl+C(コピー) → Ctrl+T(新しいタブ) → Ctrl+V(貼り付け) → Enter(検索の実行)

この操作がいつも煩雑だと思うので、ブラウザ上で選択した単語を簡単に(例えばショートカットキーで)検索したいテキストを選択 → Ctrl+Tで実行できるようにしたいと思いました。

実装

実装を考える上で文字を選択して右クリックを入力した際の挙動をデバッガによって追跡しました。デバッグはブラウザツールボックスを用いて行います。
新しいタブを開くときに、クリップボードの中身を検索して出てくるように実装しました。クリップボードの中身が空であれば新しいタブを開くようにしました。

今後、ファイルの場所はfirefox-49.0というディレクトリにいるとした時のパスで表します。
まず、元のコードとしては以下のコードとなっています。

./browser/base/content/browser.js改変前
function BrowserOpenNewTabOrWindow(event) {
  if (event.shiftKey) {
    OpenBrowserWindow();
  } else {
    BrowserOpenTab();
  }
}

これを以下のように変更しました。

./browser/base/content/browser.js改変後
function BrowserOpenNewTabOrWindow(event) {
  if (event.shiftKey) {
    OpenBrowserWindow();
  } else {
    let searchText = readFromClipboard();
    if (typeof searchText !== "undefined") {
      BrowserSearch.loadSearch(searchText, true, null);
    } else {
      BrowserOpenTab();
    }
  }
}

関数や変数の説明

readFromClipboard

この関数は名前の通りクリップボードの中身を取得している関数と考えられます。また、この関数には以下のようなコメントがあります。

./browser/base/content/browser.js
// If available, use selection clipboard, otherwise global one

これによりダブルクリックで選択した後に(選択を外れた後も)Ctrl+Tとするだけで(予期せず)検索できました。

typeof searchText

これによってsearchTextの型を確認することにより、クリップボードが空(undefined)のときには新しいタブを表示するようにしました。

BrowserSearch.loadSearch

この関数は以下のように定義されています。

./browser/base/content/browser.js
loadSearch: function BrowserSearch_search(searchText, useNewTab, purpose) {
  let engine = BrowserSearch._loadSearch(searchText, useNewTab, purpose);
  if (!engine) {
    return null;
  }
  return engine.name;
}

右クリックの時にも呼ばれる関数であり、今回はusenewTab:trueとすることで新しいタブで検索結果を表示しています。また、purpose:nullとすることでこの関数内のBrowser._loadSearchより内部でpurposeはデフォルトのpurpose("searchbar")となります。このことは以下の記述からわかります。

./obj-x86_64-pc-linux-gnu/dist/bin/components/nsSearchService.js
// Default to searchbar if the purpose is not provided
var purpose = aPurpose || "searchbar";

最後に

バグ

  • ブラウザの外でクリップボードにコピーした後しばらくしてから新しいタブを開くとなぜか新しいタブが表示されてしまいます。
  • 何かのタイミング新しいタブを開くと”about:home”が検索されてしまいます。

メリット

別のところで(例えばpdfファイルやターミナルに表示されるエラー文)検索したいワードが出てきた時にそれをクリップボードにコピーすれば新しいタブを開くだけで検索できます。

デメリット

新しいタブを開くときに常に検索されてしまいます。
ショートカットキーを別に割り当てた方がいいかもしれません。