大規模ソフトウェア(Chromium)を手探る - 設定画面(settings)を手探る1 -
電気系3年生後期実験「大規模ソフトウェアを手探る」でChromiumブラウザーをまさぐったお話です。
発表スライドがこちらになります。
実験で取り組んだことの概要については、 大規模ソフトウェア(Chromium)を手探る 導入・ビルド編 - あさりさんの作業日記 をご参照ください。
そうだ、設定画面をいじろう
前の記事(大規模ソフトウェア(Chromium)を手探る user profileに設定を追加する - あさりさんの作業日記)までで、検索ボックスに表示される検索履歴から、指定したキーワードを含む履歴を表示しないようにすることができました。
残りのやることは、ユーザーが検索履歴非表示キーワードを指定できるようにするだけです。
今回は、Chromium内の設定画面にキーワード設定欄を追加することにしました。
課題1: どこを編集すれば良い????
まず、Chromiumブラウザーの設定画面(chrome://settings/)のHTMLソースコードを見てみます。
あれ、たったの27行だけ??でも、とりあえずL.22の<settings-ui></settings-ui>
のというところでDOMを読み込んで表示されてそうですね。
そこで、「settings-ui」をCode Searchで検索してみると…
src/chrome/browser/resources/settings/settings.html
↑上のchrome://settings/のhtmlが書かれているファイルsrc/chrome/browser/resources/settings/settings_ui/settings_ui.html
↑<settings-ui></settings-ui>
のDOMが定義されているファイル
が見つかります。これを見ると、settings_ui.htmlではさらに
L.71〜<settings-menu></settings-menu>
やL.82〜<settings-main></settings-main>
が呼ばれていることがわかります。山勘をはって<settings-main></settings-main>
の中身を見てみると、
src/chrome/browser/resources/settings/settings_main/settings_main.html
となっていて、どうやらL.43〜L.51<settings-basic-page></settings-basic-page>
の中で定義されていそうです。
もう一度「settings-basic-page」をCode Searchでググると、
src/chrome/browser/resources/settings/basic_page/basic_page.html
ということで、どうやらいろんな項目が呼び出されていそうなページが出てきました。試しにひとつのDOMタグを消してみるとその項目が表示されなくなったので、このファイルをいじれば良さそうです。
※ちなみに、どのタグのなかでどの部分が定義されているかはCode SearchしなくてもChromiumのDeveloper tools(検証)を使えばできるはずなのですが、デバッグモードでビルドするとDeveloper toolsの挙動がものすごく重くなって話にならなかったので文字通りググりました。
他には、「検証」で出てきたタグを適当に選んでCode Searchに突っ込んでも良かったかもしれないですね。
(もう一回リリースモードでビルドし直してもいいんだけれど、フルビルドまたn時間かかるのか…う、頭が…)
課題2: 設定画面に表示を追加してみよう
課題1でいじる場所を見つけたので、設定画面を追加してみましょう。
といっても、どういじればいいのかわからないのでとりあえず他の設定項目をパクってきます。
どれをパクろうかと思ったとき、シンプルなやつがいいと思ったので、ファイルが3つしかなかった
src/chrome/browser/resources/settings/multidevice_page
をパクることにしました。
ということで、まずはbasic_page.htmlを
src/chrome/browser/resources/settings/basic_page/basic_page.html
というように変更し、src/chrome/browser/resources/settings/restrict_keyword/
ディレクトリを作ってその中にrestrict_keyword.html
, restrick_keyword.js
を作って表示させようとしたものの、
動かず…!
どうしてかと思って、multidevice_pageのDOMモジュールである「settings-multidevice-page
」でCode Search検索をかけてみると…
というようにいろいろなファイルを編集する必要がありそうでした…
ただ、このリストにはテストなどの直接は関係ないファイルも含まれているため、先ほど編集した本体の他に関係のあるファイルをまとめてみると、
- src/chrome/browser/resources/settings/settings_resources.grd
…おそらくビルド用のファイル - src/chrome/browser/resources/settings/multidevice_page/compiled_resources2.gyp
…これもビルド用のファイルっぽい(compiledって書いてあるし自動生成されるものかもしれないと思ったけれどよくわからないから入れてみた)
があります。
あと、basic_page.html内の該当部分(L.282〜L.292)
<if expr="chromeos"> <template is="dom-if" if="[[shouldShowMultidevice_(showMultidevice, pageVisibility)]]" restamp> <settings-section page-title="$i18n{multidevicePageTitle}" section="multidevice"> <settings-multidevice-page prefs="{{prefs}}"> </settings-multidevice-page> </settings-section> </template> </if>
の中で
<settings-section ... section="multidevice">
となっているのもあやしいので、「src/chrome/browser/resources/settings/」ディレクトリ内で「multidevice」と検索してみると、他にも
- src/chrome/browser/resources/settings/route.js
…おそらくルーティング用のファイル
といういかにもそれっぽいファイルが見つかりました。
これらのファイルを以下のように編集すると、
src/chrome/browser/resources/settings/settings_resources.grd
src/chrome/browser/resources/settings/multidevice_page/compiled_resources2.gyp(追加)
src/chrome/browser/resources/settings/route.js
無事、以下のように表示画面を追加できました。