問題タブ [chrome-native-messaging]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
3743 参照

c# - Chrome 拡張機能からホストに「大量」のデータを渡すのが非常に遅い (C# で記述)

Chrome のNative Messaging APIを使用して、ページの DOM をホストに渡しています。拡張機能からホストに小さな文字列を渡そうとすると、すべてが機能しますが、DOM 全体 (それほど大きくはありません... 約 260KB のみ) を渡そうとすると、すべての実行速度が大幅に低下し、最終的にはNative host has exited errorホストの応答を妨げます。

私の主な質問: 拡張機能からホストに 250KB から 350KB のメッセージを渡すのになぜそんなに時間がかかるのですか?

開発者のサイトによると:

Chrome は、個別のプロセスで各ネイティブ メッセージング ホストを起動し、標準入力 (stdin) と標準出力 (stdout) を使用して通信します。メッセージを両方向に送信するために同じ形式が使用されます。各メッセージは JSON を使用してシリアル化され、UTF-8 でエンコードされ、ネイティブ バイト オーダーで 32 ビット メッセージ長が前に付けられます。ネイティブ メッセージング ホストからの 1 つのメッセージの最大サイズは 1 MB です。これは主に、ネイティブ アプリケーションの誤動作から Chrome を保護するためです。ネイティブ メッセージング ホストに送信されるメッセージの最大サイズは 4 GB です。

ホストに送信したい DOM のページは 260KB (場合によっては 300KB) を超えず、課された最大値の 4GB を大きく下回っています。

popup.js

ホスト.exe

この質問から上記の方法を見つけたことに注意してください。

現時点では、文字列を .txt ファイルに書き込もうとしています。

  1. ファイルへの文字列の書き込みには長い時間がかかります (最大 4 秒、場合によっては最大 10 秒)。
  2. 実際に書き込まれるテキストの量はさまざまですが、最上位のドキュメント宣言といくつかの IE コメント タグ以上のものではありません。すべてのテキストが表示されるようになりました。
  3. テキストがほとんどないこのファイルは 649KB ですが、実際のドキュメントは 205KB しかないはずです (ダウンロード時)。ファイルは、本来あるべきサイズよりわずかに大きいままです (205KB のはずが 216KB)。

ファイルをダウンロードするだけで機能をテストしましgetDOM.jsたが、プロセス全体はほぼ瞬時です。

このプロセスに時間がかかる理由、ファイルが非常に大きい理由、または実際にメッセージがほとんど送信されていない理由がわかりません。

これが特定の方法でメッセージを逆シリアル化することと関係があるのか​​ 、メソッドを使用する代わりにポートを作成する必要chrome.runtime.sendNativeMessage(...);があるのか​​ 、それとも他に何か完全に欠けているものがあるのか​​ はわかりません.

すべてのヘルプは大歓迎です! ありがとうございました!


編集

私のメッセージは拡張機能からホストに正しく送信されていますが、Native host has exited error拡張機能がホストのメッセージを受信する前に受信しています。

0 投票する
1 に答える
702 参照

javascript - Chrome 拡張機能で connectNative() を使用してネイティブ ホスト アプリケーションに接続すると、「ネイティブ アプリへの接続エラー」が発生する原因は何ですか?

Chrome のネイティブ メッセージング機能を使用して、Web ページと Mac アプリケーション間の通信を実装しています。chrome.runtime.connectNative("my_native_host_app_name") への JavaScript 呼び出しを行うまで、すべてがうまくいくように見えます。これにより、コンソールに次のエラーが生成されます。

このエラーの原因と思われる実際の呼び出し (スタック トレースの background.js への参照の 19 行目) は次のとおりです。

より多くのコンテキストを提供するために、リスナーから呼び出されます。

if ステートメントに到達することはありません。私が主に使用しているドキュメントは Chrome Native Messagingです。ドキュメントの下部には、一般的なエラーのヘルプを提供するセクションがありますデバッグ ネイティブ メッセージング。「ネイティブアプリへの接続エラー」を具体的に言及されたエラーのいずれにも関連付けることができないようです。

私の拡張マニフェスト ファイル (「manifest.json」) の完全な内容は次のとおりです。

0 投票する
2 に答える
5998 参照

javascript - Chrome ネイティブ メッセージング -- 「指定されたネイティブ メッセージング ホストが見つかりません」というエラーが表示されるのはなぜですか?

Chrome Native Messaging のドキュメントによると、connectNative() の呼び出しが成功するとポートが返され、それを使用してメッセージをネイティブ アプリ (Mac アプリ) に投稿できます。私の場合、nativeConnect() は有効なポートを返しますが、onDisconnected() リスナーへの呼び出しはほとんどすぐに開始されます。リスナーが起動されるたびに、「lastError」プロパティがブラウザのコンソールに出力され、次のようになります。

なぜこれを行うのですか?メッセージを生成するリスナーは次のようになります。

この特定のエラーに関するセクション全体がドキュメントの下部にあり ( Native Messaging )、提案された救済策では、マニフェスト ファイルの名前、配置、または定義 (JSON) が間違っているか、ホスト アプリの名前が付けられていないか、配置されていないことが示されています。マニフェストがそうあるべきだと言っている場所。ドキュメントには、connectNative() は「別のプロセスでホストを開始する」と書かれていますが、アクティビティ モニターは、ネイティブ ホスト アプリが起動されたという証拠を示していません。

次のように connectNative() を呼び出します。

私のネイティブ ホスト マニフェスト ファイルは、ドキュメントに従って正しいフォルダーにあり、JSON として適切に解析され、次のようになります。

Chrome 拡張機能にはマニフェストも必要です。パーミッション セクションを正しく取得するまでは、connectNative() から null 以外のポートを取得できませんでした。したがって、これは正しいと確信しています。

アップデート:

Mac のターミナルから Chrome ブラウザを起動し、より「詳細な」ログを表示できるフラグを設定する方法を見つけました。次に、実行すると、次の出力に気付きました。

ホストマニフェストが見つからないことは明らかですが、なぜですか??

0 投票する
3 に答える
12041 参照

javascript - Chrome ブラウザ拡張機能の Native Host Has Exited エラーを修正する方法 -- Native Messaging

Mac 用の Chrome ブラウザ拡張機能で「ネイティブ ホストが終了しました」というエラーを修正する方法を教えてください。ここにあるネイティブ メッセージングのドキュメントでは、このエラーが下部に具体的に言及され、考えられる原因が示唆されていますが、非常に一般的に述べられており (「これは、ネイティブ メッセージング ホストから開始された可能性が最も高い」)、解決するために何を試みるべきかは不明ですこれ。

ターミナルでのログ出力 (Mac ターミナルから Chrome を起動すると、ログ情報を表示できます) から、ネイティブ ホスト アプリ自体のプロセスが正常に開始されることはないと思いました。私は得続けます:

ただし、バックグラウンド JavaScript ページのコンソールに「ネイティブ ホストが終了しました」と出力する実際のコードは次のとおりです。

onDisconnected() リスナーは、ドキュメントに従ってここで実行した connectNative() を呼び出した結果として実際に呼び出されます。

connectNative() が有効なポートを返すレベル bc で成功することを知っています。ただし、connectNative() は、ネイティブ ホスト アプリを見つけて起動しようとします。私のホストアプリはstdoutまたはstdinとの通信をまったく実装していませんが、ドキュメントは、ホストアプリが原因であり、何らかの形でChromeとネイティブアプリ間の「パイプ」の切断を開始していることを示唆しています。その上、Chrome のログ メッセージ (「LaunchProcess: failed to execvp:」) は、私の Mac アプリが正常に起動されなかったことを示しているようです。

他にもあります: オンラインで見つけたソース コード (おそらく古いものですか?ソース ファイル) は、この「ネイティブ ホストが終了しました」というメッセージがどこで発生したかを正確に明らかにし、調査により、Google Chrome のコードが終了している理由が示唆されます。HandleReadResult() では、Close() が呼び出され、まさに msg を提供し、Posix read() が 0 を返すことに応答して物事を閉じます。私のMacアプリでこれを読み取りに失敗させますか? 私の Mac アプリは stdout に何も書き込んでいません。それとも、これらすべてが私を誤解させており、execvp がホスト アプリを起動できなかったことが、より深い原因なのでしょうか? もしそうなら、なぜですか?これは単純な、必要最小限の Mac アプリです。