失望の底なし沼: Chrome 拡張機能の物語

新機能!ブラウザでJava Web Startを実行

CheerpJ JNLP Runnerブラウザ拡張機能は、JavaデスクトップをインストールせずにブラウザでJNLPファイルを実行できる唯一のソリューションです。ダウンロードやプラグインは必要ありません。

ちょっとした「痛みから学ぶ」/暴言/経験型のブログ投稿の共有ですが、ここまでです。

 技術を学ぶでは、JavaScript と WebAssembly をターゲットとするコンパイラと VM を作成します。当社のツールは、既存のアプリケーションの寿命を延ばして最新のブラウザで実行できるようにするだけでなく、伝統的にネイティブ アプリケーションの特権であった言語 (C/C++ や Java など) で新しい Web アプリケーションを移植および開発するためにも使用されます。

私たちは通常、最新のブラウザーと HTML5 仕様が許可する限界内で作業を行っているため、次のことを発見しました (そして修正しました!)。 もっと ブラウザ バグ よりも のパフォーマンス向上に貢献したいと考えています 複数の JavaScript エンジンのアクティブな部分です。 標準化プロセス WebAssembly 用。

一般的に言えば、私たちは PoC や小さなおもちゃのプロジェクトを開発するのは簡単ですが、堅牢な製品を作るのは非常に難しいニッチな分野で働いています。企業の顧客が大多数を占めていますが、その性格上、私たちは常に正しい方法™ で物事を進めようとするタイプの人間です。

CheerpJ特に、Java クライアント アプリケーションを完全にクライアント側でブラウザ内で変換して実行するためのソリューションです。 「任意」というときは、リフレクション、プロキシ、動的に生成されたクラス、完全なランタイム サポート (AWT、Swing など)、スレッドなど、あらゆるものを意味します。 CheerpJ は、これらの機能を備えた市場で唯一のツールであり、主に複雑な移植および移行要件を持つ企業顧客によって使用されています。

このテクノロジーの派生として、私たちは数年間、無料で使用できる Chrome 拡張機能 (非営利目的) を提供してきました。 CheerpJ Applet Runner.

これにより、ユーザーは、ローカルに Java をインストールしたり、プラグインを使用したりせずに、Chrome の最新バージョンで完全に非推奨になった Java アプレットにシームレスにアクセスできるようになります。これは本質的に、アプレットのバイトコードをオンザフライで HTML5 に変換し、JavaScript と Wasm で完全な Java ランタイム環境を提供することによって実現されます。

もともと私たちの技術を可能な限りテストするために開発されました 野生で、Java アプレットを日常的に使用する必要があるあらゆる階層の人々によって非常に広く使用されるようになりました。私たちは、40,000 人以上の学生、上級カード プレイヤー、アーティスト、法執行官、さらには主要な米国連邦機関が、発売日をはるかに過ぎたコンテンツにアクセスできるよう支援してきました。 4.4/5 の評価と幅広い採用により、私たちはその点でかなり成功したと思います。

念のため言っておきますが、私たちはレビューを購入しません。

一日を始めるのに最適な方法ではない

2020 年 3 月、新型コロナウイルス感染症 (COVID-19) のパンデミックが地球上で猛威を振るい始めたとき、私はある日目覚めると、拡張機能開発者が最も恐れているものを発見しました。立て続けに 2 通のメール:

  1. 最近公開されたアップデートはポリシー違反のため拒否されました。

2 通目のメールは私たちに希望の光をもたらしました。返信して決定に対して異議を申し立てることは可能でした。私たちはすぐにそうしました。 (当時の)新たなパンデミックと Chrome ウェブストアの一般的な混雑のため、回答を受け取るまでに数日かかる可能性があるという自動応答を受け取りました。

ほぼ 18 か月が経過した今も、私たちは上訴に対する回答をまだ受け取っていません。 この拡張機能はどういうわけかストアにまだ残っています。 拒否されました ダッシュボードで更新します。このため、拡張機能が完全に削除される可能性を懸念し、拡張機能を更新しないこと、または同じ更新で再試行することを決定しました。

これが意味するのは、ユーザーに未解決のバグを残したままにし、数千のエンドユーザーだけが新しいリリースに提供できる広範なテストを私たちが受けられないままにすることです。それだけでなく、この拡張機能の背後にある姉妹テクノロジーである CheerpJ にはいくつかのメジャー リリースがありましたが、これを Applet Runner に伝播することはできませんでした。

これほど長い時間が経ったので、これ以上更新を延期することはできませんし、停滞し続けることもできません。

この投稿は、この泥沼から抜け出すための私たちの計画、この状況で避けられないコスト (私たちとユーザーの両方にとって)、そしてその過程で発見した大量のフラストレーション、無意味な制限、醜いバグについてです。これが他の Chrome 拡張機能の開発者にとって役立つことを願っています。少なくとも、他の人がそれなりの苦しみを抱えているのを見ることで、いくらかの慰めを得るかもしれない。

私たちは悪者なのでしょうか?

Chrome ウェブストアのポリシーは頻繁に変更され、そのほとんどは日に日に厳しくなっていますが、それには十分な理由があります。

拡張機能は強力であるため、ユーザーのセキュリティとプライバシーに重大な悪影響を及ぼす可能性があります。これは、直接的 (つまり、単純なマルウェア/スパイウェア拡張機能) だけでなく、開発者アカウントや正当な拡張機能のリモート資産を侵害することによって間接的に発生する可能性があります。

怪しげな企業による「拡張機能の買収」というグレーゾーンもあります。私たちは CheerpJ Applet Runner 拡張機能の購入に関する問い合わせを頻繁に受け取りますが、そのほとんどはまったくコーシャとは言えません。

いずれにせよ、多層防御の一形態として、Chrome ウェブストアのポリシーでは、要求されるアクセス許可の量を可能な限り少なくすることが求められています。このように、拡張機能が侵害されても、限定的な損害を与える可能性があります。これは完全に理にかなっています。拡張機能の開発者は、「警告」システムによって奨励されています。拡張機能をインストールするときに、拡張機能に強引な権限が必要な場合は、懸念のあるメッセージがユーザーに表示されます。さらに、開発者はアイテムをストアに送信するときに、要求された許可をすべて正当化する必要があります。

uBlock Origin: インストール時に非常に心配なメッセージを表示する非常に人気のある拡張機能

CheerpJ Applet Runner はインストール時に警告を受けません

私たちにとって、これらのガイドラインに従うという考えは理にかなっているだけでなく、簡単なことでもありました。私たちはユーザーのプライバシーを非常に重視しており、CheerpJ Applet Runner が「アクセスした Web サイト上のすべてのデータを読み取って変更する」という考えをユーザーに与えたくありません。正直に言うと、私たちはそれに伴う責任を負いたくありません。

そうは言っても、私たちの拡張機能が期待どおりに動作するには、いくつかの難しいことを実行できる必要があります。特に:

  • Java を利用した Web サイトの多くは、関連する Web サイトを作成する前に Java がサポートされているかどうかを検出しようとします。 /要素。現時点では、プラグインは最新のブラウザでは長い間サポートされていません。これを回避するには、拡張機能がプラグインが存在することを「偽装」し、そのようなページを完全に読み込めるようにする必要があります。通常、このチェックはページのライフサイクルの非常に早い段階で同期的に行われます。このため、拡張機能はスプーフィング コードを挿入できる必要があります。 非常に早い。

    変な許可はいりません

    かなりの努力の末、私たちは次の権限スキームに落ち着きました。これは、2020 年 3 月の不安なメールが届くまで、長年にわたってうまく機能していました。

    • オプションの権限: ユーザーが任意のドメインで拡張機能を実行できるようにするための解決策は、次のとおりです。 オプションの権限。この機能を使用すると、拡張機能は、インストール時に実際に権限を付与しなくても、必要な権限の最大量を宣言できます。 UX の点では、ユーザーは選択した有用なドメイン (おそらくほんの少数) で CheerpJ Applet Runner を選択的に有効にする必要があります。これは、拡張機能のポップアップを 1 回クリックするだけで実行できます。 Chrome は付与された権限を記憶しているため、同じドメインへの次回のアクセス時に拡張機能が自動的に有効になります。ユーザーは、標準の Chrome UI を使用して、いつでも自由に権限を削除できます。

    権限はユーザーアクションの後にのみ要求され、スコープは明確に記載されています
    • 宣言的な内容: この権限は、Java アプレットが検出されたとき、またはすでに有効になっている場合に CheerpJ のステータスについて視覚的なヒントを提供するために使用されていました。の使用 宣言的な内容 API では、ページ上で一致する CSS セレクターに応じて、異なるアイコンを選択できます。拡張機能のみであるため、これは完全にプライバシーを保護します。 宣言します 実際にページのコンテンツにアクセスすることなく、ルールをブラウザーに送信します。理想的には、この動作は、manifest.json ファイルで静的に指定する必要があり、アクセス許可は必要ありません。残念ながら、マニフェストでアイコンを指定するには、 深く文書化されていないbase64/バイナリ形式 (私は最近やっと理解することができました)。機能全体がそうなっているので、それは重要ではありません されています 完全に壊れた 2018年4月から、誰にも気付かれずに。

    各アイコンの意味を説明する前の拡張機能ポップアップ
    • アクティブなタブ: 非常に軽量な権限で、現在のタブ ID を照会し、プロセスをブートストラップするためにのみ使用されます。使用していますが アクティブタブ が推奨されており、おそらく最も侵襲性の低いものですが、Google は依然としてそれを使用する正当な理由を必要としています。

    善行は罰せられない

    私たちの理解する限りでは、このスキームに従うことで、ルール内でうまくプレーできました。確かに業界平均を上回っています。これだけの努力をした結果、拡張機能が失われそうになるのは非常に苦痛でイライラするものであり、拡張機能が禁止されるリスクを避けるために、基本的に非常に長い間更新を遅らせることを余儀なくされました。

    何が起こったのかについての私の最善の推測は、方針が変更されたことです。 リモートでホストされるコード これは眉をひそめており、次期 API のマニフェスト V3 リビジョンで完全に禁止されています。

    CheerpJ は Java を実行するため、Java ランタイムと完全に「同等」のものが必要です。 CheerpJ では、これは JavaScript/WebAssembly ファイルの完全に静的なセットとして提供され、CDN 上で配布され、各バージョンは公開されると完全に不変になります。拡張機能自体は非常に軽量で、実際のロジックのほとんどはリモート モジュラー ランタイムによって提供されます。もちろん、このロジックはすべてページのコンテキストで実行されます。

    Chrome ウェブストアの拡張機能を送信するプロセスでは、開発者は許可が必要なときにいつでも正当化することができます。 CheerpJ Applet Runner はすでにルールに従っていると信じていますが、私たちのユースケースがあまりにも独特で予想外すぎて、レビュー担当者が割り当てた限られた時間内では完全に理解できないのではないかとも考えています。

    さらに、私たちが理解している限り、拡張機能は現在借用された時間で生きており、別の更新が拒否されると永久にダウンする可能性があるかどうかは非常に不明です。当社にはこのツールを必要とする可能性のあるユーザーが何万人もおり、彼らを失望させたくありません。

    これは、Chrome Web ストアでの迅速なレビューと承認が成功することを期待して、CheerpJ Applet Runner 拡張機能を更新する計画です。

    計画 (1/4): 羽のように軽くなる

    ご想像のとおり、私たちは CheerpJ Applet Runner の次のアップデートが拒否されるリスクと、理由もなく拡張機能が削除されるリスクを非常に懸念しています。

    2 回目の拒否を確実に回避するために、必要なアクセス許可を最小限に抑えるために拡張機能を再設計することにしました。理想的にはゼロにします。

    これには、以前は喜んで支払えなかった代償が伴いますが、もはや避けることはできません。特に、拡張機能の新しいバージョンでは、「一度有効にする/常に実行する」機能を使用できなくなります。ユーザーは拡張機能アイコンをクリックする必要があります アプレットを使用する必要があるたびに.

    必要な権限を最小限に抑え、できればアップデートが承認される可能性を最大限に高めるために、いくつかの大きな変更を加える必要がありました。

    マニフェスト V3 を採用: マニフェスト V3 は Chrome 拡張機能プラットフォームの新しいリビジョンであり、ユーザーのセキュリティとプライバシーを強化するための新しいルールと制限が導入されています。 V2 はまだサポートされているため、現時点では V3 の使用はオプションですが、将来のある時点で V2 が非推奨になることは明らかです。

    私たちは、より厳格な制限によって改訂プロセスがより簡単になり、レビュー担当者の恣意的な決定の影響を受けにくくなるという期待から、V3 を採用することにしました。さらに、V2 の将来の非推奨への拡張も将来に備えています。

    ランタイム全体を拡張機能に含めます: これはマニフェスト V3 の要件です。 リモートでホストされるコード 現在は禁止されています。 CheerpJ Applet Runner の以前のバージョンでは、オンデマンドで CDN から個々のランタイム コンポーネントをフェッチしていました。これにより、ランタイムのごく一部のみが必要な場合に、不必要なダウンロードが回避されました。

    技術的には、この制限は以下を使用して強制されます。 非常に厳しいです 拡張機能マニフェストの Content-Security-Policy 要件。公平を期すために、これは低速接続を使用している一部のユーザーにとっては改善となる可能性があります。一方で、拡張機能は数キロバイトではなくなり、ユーザーにバックグラウンドで大量のダウンロードをスパム送信したくないため、アップデートの計画にはより慎重になる必要があります。

    Google アナリティクスを削除する: 以前、CheerpJ アプレット ランナーは GA を使用していました。 とても 使用状況 (ユーザーではない) の追跡は最小限で、ワンクリックでオプトアウトでき、URL のログは記録されません。

    新しい CSP により、通常の GA スクリプトのロードは禁止されています。スクリプトを拡張機能にバンドルするか、イベントを手動で送信するだけで、GA (または別の分析プロバイダー) を使用することは技術的には可能でした。それにもかかわらず、私たちはさらに一歩進んで、次のことに決めました。 あらゆる形式の追跡を削除する.

    任意のホストへのオプションのアクセスを削除します: これは、UX の観点から、私たちがしなければならなかった最も高価な選択です。私たちが理解している限り、以下を使用する拡張機能には特別な審査プロセスが課されます。 <all_urls>たとえその一部であっても、 オプションの権限 セクション。

    このより詳細なレビューを完全に回避するために、この機能は削除されます。これが、ドメインに対して拡張機能を 1 回だけ有効にすることができなくなった理由です。私たちは新しいアプローチを考案しました。 アクティブタブ 現在使用されているタブにローダー スクリプトを挿入する権限。

    私たちの最大の失望の 1 つは、Manifest V3 ではオプションのホスト権限という概念全体が消えてしまったことを発見したことです。マニフェスト形式は次のように再編成されました。 権限オプションの権限 そして ホストの許可、現在、すべてのホストはオプションではないと考えられています。

    いくつかあります 曖昧な言葉遣い すべてを作ることについて ホスト権限 将来的にはオプションになりますが、現時点では、インストール時に恐ろしい警告を表示せずに任意のホスト上で実行できる可能性がある Manifest V3 拡張機能を作成することは不可能です。 または 同じドメインであっても、ユーザーは一度でも拡張機能を有効にすることが強制されます。

    ストレージ権限を削除する: CheerpJ Applet Runner には、ストレージを必要とする設定がほぼ 1 つだけあります。 クリップボードモード (単一のバイナリ値) を使用します。 ストレージ 以前は、正当な理由を必要としない許可の 1 つでした。これは現在は変わりましたが、新しい戦略を見つけて使用することができました。 ローカルストレージ これらの設定を保存するには、プライベート拡張ドメインの機能を使用します。これは簡単なことではありません。なぜなら、その理由を理解するのは難しいからです。 ローカルストレージ 拡張機能を強化するバックグラウンド Service Worker では使用できません。

    declarativeContent 権限を削除する: プログラムによる宣言型コンテンツ ルールの追加が使用された理由は 2 つあります。まず、ユーザーがドメインを明示的に有効にすると、CheerpJ ローダー スクリプトを自動的に挿入できるようになりました。上で説明したように、残念ながらこの機能は削除されました。

    次に、拡張機能アイコンの色を変更することで、実行中のアプレットのステータスに関する視覚的なフィードバックをユーザーに提供するために使用されました。特に、ページ上で Java アプレットが検出された場合は黄色のアイコンを表示し、CheerpJ Applet Runner が正常に実行できた場合は緑色のアイコンを表示するトリガーとして CSS セレクターを使用します。素晴らしい点 宣言的な内容、拡張機能はルールを宣言するだけで、ブラウザがマッチングを行うということです。これは、拡張機能がページを覗く必要がなく、ユーザーのプライバシーが保護されることを意味します。

    ばかばかしく聞こえるかもしれませんが、この機能を削除しても実質的なコストはかかりませんでした。 2018 年 4 月以降、Chrome ではすべてが完全に機能しなくなっています!実際に問題を二分して調べたところ、メンテナンス コミットの一部として 1 行のコードが間違って配置されていたことがわかりました。それだけではありません。この 2 行を私たちの側で修正した後でも、機能が壊れていることがわかりました。 また いつかの時点で。この機能がなぜ誰も気づかずにこれほど長い間壊れたまま (さらには 2 回も壊れる) ことができたのか、私の理解を超えています。Chrome の拡張機能プラットフォームが実際にプロジェクトの他の部分と同じ高い基準に保たれているのか疑問です。

    これらの、やや苦痛な選択をすべて終えた後、残された拡張機能は、 アクティブタブ そして スクリプト これらの権限は連携して Java プラグインの可用性を偽装し、ページに CheerpJ ローダーを挿入します。現時点では他に削除できるものは何もありません。レビューの神々が私たちの犠牲に感謝し、親切にしてくれることを祈るだけです。

    新しいポップアップ UI、失われた機能を反映するためにいくつかの要素が削除されました

    計画 (2/4): 最悪の事態に備える

    あらゆる予防策を講じたとしても、残念ながら CheerpJ Applet Runner が Chrome ウェブストアによって削除されないとは言い切れません。

    ユーザーが別のオプションを利用できるようにするために、Edge アドオン ストアで CheerpJ アプレット ランナーをリリースしました。大多数のユーザーは Windows を使用しており、いずれにせよ、Edge はデスクトップ上ですでに利用可能であると想定して間違いありません。 Edge は現在 Chrome の単なるフォークであるため、これ以上の技術的努力は必要ありません。審査プロセスは公正かつ迅速かつ効率的だったと言わざるを得ません。

    Firefox と Safari 用の拡張機能のプロトタイプも作成しました。ただし、現状ではマニフェスト V3 はどちらでもサポートされていないため、特別にダウングレードしたバージョンを提供する必要があります。現時点では Firefox/Safari をサポートしないことを決定しましたが、V3 がサポートされるようになったら決定を修正する予定です。特にFirefoxには、 ベータ版を発表した この機能は 2021 年後半または 2022 年初頭にリリースされます。

    計画 (3/4): 騒いでください

    この投稿の主な目的は、Chrome 拡張機能のメンテナンスと更新のプロセス全体についてオープンに説明することです。

    このプロセスの「困難」の結果、CheerpJ Applet Runner の次のバージョンは、ユーザーが慣れ親しんでいるものと比較して、UX が大幅に劣る必要があります。なぜこのようなことが起こるのかについて、私たちは説明する義務があると感じました。

    この投稿が Chrome ウェブストアの非常に残念な状況とアップデートの承認プロセスについての認識を高めることを願っています。私たちは、拡張機能のレビュー プロセスによって悪影響を受ける最初の開発者ではありません (そして、私たちが最後になることはありません)。これまでのケースで、コミュニティからある程度の注目を集めることがどのように大きな効果をもたらすかを見てきました。これが CheerpJ Applet Runner にも適用されることを願っています。

    計画 (4/4): サイコロを振る

    更新されたら、失われた UX の一部を再導入しようとします。特に、 宣言的な内容 Chromium でのサポートが修正される予定です。これにより、色分けされたアイコンの使用を復元して、ユーザーにわかりやすく情報を提供できるようになります。

    問題が見つかり、修正が Chrome に適用されると (物事は特に有望ではないようです ちなみに..)、リリース サイクル全体にパッチが適用されるまでに約 2 か月かかります。

    拡張機能を使用するたびにクリックが必要になることについては、理想的ではありませんが、これを回避する方法はまだ見つかりません。適切なソリューションには、特に Manifest v3 でオプションのホスト権限が削除されている場合、強引な権限と警告が必要になります。 API の将来のリビジョンでこの機能が復活することを期待しています。

    問題を解決する良い方法を思いついたら、ぜひお話ししたいと思います。お気軽に私にメッセージを送ってください ツイッター.

    とりあえず終わり

    この投稿を最後まで読んでいただいた方は、大変お待たせいたしました。

    この投稿で説明されている問題についてアイデアや回避策がある場合、または Chrome 拡張機能に関連した独自の悩みがある場合は、ぜひご連絡ください。喜んでお話しします。

    {ツイッターギッターWebサイトEメール}

    そして、知りたいなら  私たちの活動についてさらに詳しく知りたい方は、当社のウェブサイトをご覧ください。 技術ブログ!

    あなたはおそらくそれも好きでしょう

    新機能!ブラウザでJava Web Startを実行

    CheerpJ JNLP Runnerブラウザ拡張機能は、JavaデスクトップをインストールせずにブラウザでJNLPファイルを実行できる唯一のソリューションです。ダウンロードやプラグインは必要ありません。

    タグ: アプレット

    類似の投稿をもっと見る