nazo6 notememo

Firefoxをいじる

作成:2022/10/27

更新:2022/10/27

(2022-10-27)

Floorp というブラウザを最近見てFirefoxに興味が湧いたので調べてみるメモ

参考資料 (2022-10-27)

Firefox Source Tree Documentation — Firefox Source Docs documentation

firefox-source-docs.mozilla.org

Firefoxのビルド (2022-10-27)

なにはともあれFirefoxのソースがないと始まらないので一度ソースをもってきてビルドしてみる。
今回はwsl2(Arch Linux) on Windows11で試す。

bootstrap (2022-10-27)

手順は

Building Firefox On Linux — Firefox Source Docs documentation

firefox-source-docs.mozilla.org

これに従うだけ。
mercurialって使ったことないけどmercurialがおすすめと書いてあるので一応そうしとく。gitでも使えるらしいが・・・
sudo pacman -S mercurial
curl https://hg.mozilla.org/mozilla-central/raw-file/default/python/mozboot/bin/bootstrap.py -O
python3 bootstrap.py
途中Artifact Buildがどうかを選ぶところがあるがこれは事前コンパイル済みバイナリを使ってC++とかのコア部分を開発しない場合にビルド時間を短縮するものらしい

Understanding Artifact Builds — Firefox Source Docs documentation

firefox-source-docs.mozilla.org

とりあえず今回はArtifact Modeじゃなくて普通にコンパイルする。
他のオプションはMozillaにcommitするかというところ以外は全部Yにした。

build (2022-10-27)

ビルドするには
cd mozilla-unified
./mach build
を実行。
CargoのログとCのログが入り交じりながら15分ぐらい待つと無事ビルド失敗。なぜ。

(2022-10-27)

こういう時は経験則上エラー内容を調べても無駄なので最初からやりなおし。
せっかくなので次はgitを使ってみる。git-cinnabarというものが必要らしい。
paru -S git-cinnabar
curl https://hg.mozilla.org/mozilla-central/raw-file/default/python/mozboot/bin/bootstrap.py -O
python3 bootstrap.py --vcs=git
cd mozilla-unified
./mach build
今度はビルド成功。
ちなみにi7-12700、メモリ32GBでビルド時間は約18分だった。メモリによって並列実行数か決められてるような表示が一瞬見えたからwslのメモリ割り当て増やしたら速くなるのかな?
あと現時点でのmozilla-unifiedフォルダの容量は約24GBだった。

実行 (2022-10-27)

./mach run
https://storage.googleapis.com/zenn-user-upload/247dc913b789-20221027.png
なぜか文字化けしてる。そしてウインドウを動かしたら治った。謎だ。
あと設定が開けない。about:preferencesは開ける。謎だ。
というかドロップダウンメニューの項目が全部押せない。wslgが悪いのかな?

(2022-10-27)

AURのfirefox-nightly-binを入れたりUbuntuにもnightly入れたりしてみたところ同様に押せなかったのでnightlyとwslgの相性問題があるみたい?

Releaseタグでビルド (2022-10-27)

現時点で最新の106.0.2に切り替える。
git fetch --tags hg::tags: [tag "*"]
git checkout -b 106.0.2 refs/tags/FIREFOX_106_0_2_RELEASE
./mach build
ここでなんかclobberが云々みたいなのが出てきた。前のバージョンに戻したからかインクリメンタルビルドができないみたいなことが書いてある。
とりあえず書いてる通りに実行する。
./mach clobber
./mach build
./mach run
これだとちゃんとメニューとかも動く。ただロゴとかがnightlyのままだけど。

Windowsでビルド (2022-10-27)

やっぱりWindowsでも使いたいのでWindows環境構築

Building Firefox On Windows — Firefox Source Docs documentation

firefox-source-docs.mozilla.org

まずMozillaBuildというのをインストール。デフォルトのディレクトリに入れろと書いてあったが無視して変えた。大丈夫かな
でこの先はmozilla-build\start-shell.batで専用のシェルを起動しないといけないらしい。
cd /d/dev
mkdir mozilla-source
cd mozilla-source
wget https://hg.mozilla.org/mozilla-central/raw-file/default/python/mozboot/bin/bootstrap.py
python3 bootstrap.py --vcs=git
ここでgit-cinnabarのパス~\.mozbuild\git-cinnabarを通す
git fetch --tags hg::tags: [tag "*"]
git checkout -b 106.0.2 refs/tags/FIREFOX_106_0_2_RELEASE
./mach bootstrap
./mach build
ここでwasiが云々というエラーが発生。

1759544 - ERROR: Cannot find a wasi sysroot. Please give its location with --with-wasi-sysroot. on mozilla-release

RESOLVED (nobody) in Firefox Build System - General. Last updated 2022-03-14.

bugzilla.mozilla.org

に従い、.mozconfigを作成し、
ac_add_options --enable-bootstrap
を追加。再ビルド。
今度は成功した。ビルド時間は約22分。やっぱりLinuxより遅いか
./mach run
で実行すると正常に動作しているようだ。

(2022-10-27)

というかそもそも公式ではWindows用バイナリはLinux上でのクロスコンパイルで実現しているようだ。

Cross compiling Windows binaries from Linux

jake-shadle.github.io

Floorpのgithub actionsもそのようになっているっぽい

Floorp (2022-10-27)

Floorpはオープンソースで開発されてる。

GitHub - Floorp-Projects/Floorp: The most of source code of version 10 or later of Floorp Browser, the most Advanced and Fastest Firefox derivative 🦊

The most of source code of version 10 or later of Floorp Browser, the most Advanced and Fastest Firefox derivative 🦊 - Floorp-Projects/Floorp

github.com

ざっと見たところfloorp関連のソースコードは/floorpディレクトリに集約されていて元のFirefoxのコードにそれを呼び出すものがあるようだ。

いろいろ (2022-10-27)

気づいたこと (2022-10-27)

  • Firefoxのソースはフロント部分とバックエンド部分に分かれている。フロント部分をいじるだけでけっこういろいろなことができそうだ。
Meta
  • Firefoxのソースは最新ソースコードmozilla-central、リリースのmozilla-releaseなどがある。自動でダウンロードされたリポジトリはmozilla-unifiedだがこれには全部含まれているらしい。mercurialに精通していないのでよくわからない。
フロント
  • FirefoxではFirefox自体のUIがhtmlなどのweb技術で書かれている。まあuserChrome.cssなどもあったしこれは驚くことでもない。
  • 開発者ツールの設定から有効にするとブラウザーツールボックスというFirefoxのUIを調査できる開発ツールを使える。
  • 見たことがない拡張子としてjsmがある。jsmファイルはそのまま使えるがjscssはコンパイル作業が必要というようなことが書いてある(https://firefox-source-docs.mozilla.org/browser/components/newtab/docs/index.html#for-jsm-files)。
  • .xhtml・・・まだ生きてたのか
  • jsソース内ではPreferencesなどのオブジェクトが使われているがこれはtoolkit/content/で定義されている。が、恐らくここ以外にもある。
  • xhtml内では<browser>など独自要素が使われている。これらの要素についてドキュメントがあるかは不明。
  • 残念ながらまともに型はついていないが一応eslintプラグインがある。mach npm iでインストールできる。これで間違ったことをすると多少教えてくれるようだが…?(https://firefox-source-docs.mozilla.org/code-quality/lint/linters/eslint-plugin-mozilla.html)
色々書いたがFirefox Source Docsにかなり情報が乗っているのでそれを見る。

ディレクトリ構成 (2022-10-27)

browser
│ base <- ブラウザのUI全体
│ └ content
│ branding
│ components <- 色んなコンポーネント
│ extensions <- ビルトインの拡張(pipとか)

ベンチマーク (2022-10-27)

ちょっと気になったので公式ビルドと手製ビルドでベンチマークの差を比較

公式ビルド 106.0.2

https://storage.googleapis.com/zenn-user-upload/8f74e49da3b1-20221027.png

手製ビルド 106.0.2

https://storage.googleapis.com/zenn-user-upload/a818f0ebf879-20221027.png
まあやはりという感じではあるがこちらのほうが遅い

(2022-10-27)

パフォーマンス改善できないかと色々調べたが効果がありそうな--enable-releaseはほとんど意味なし。
どうやら公式ビルドではPGOとLTOが有効になってるのでそれをしないと公式と同じ数値には達しなさそうだがWindowsでのPGOはサポートされてないっぽい?
Linux上のクロスコンパイルビルドだとできるってことかな

1718171 - Windows 10 PGO build fails with undefined symbol: __llvm_profile_instrument_memop

RESOLVED (mh+mozilla) in Firefox Build System - General. Last updated 2023-04-05.

bugzilla.mozilla.org

(2022-10-27)

https://firefox-ci-tc.services.mozilla.com/tasks/ZSb95bHiSrm5Pf6jYUeryQ
多分これが公式リリースのciだと思うけどようわからん