Google Chromeの拡張機能で Native Message を利用する際に、[Uncaught (in promise) Error: The sender sent an invalid JSON message; message ignored.]エラーが表示されえる場合に確認する部分を備忘録的に投稿しておきます。
JSONメッセージが無視される
Google Chromeの拡張機能で Native Message を利用する際に、戻り値としてJSON形式の値を利用しようとしたら、こんなエラーが発生しました。
こんな感じでバイナリー形式で値を作成して[OpenStandardOutput]で出力していましたが、このやり方では正しい戻り値としてChrome 拡張機能で認識してもらえないみたいです。
static void OpenStandardStreamOut(string Data)
{
string jsondata = "{\"text\":\"" + Data + "\"}";
int DataLength = Data.Length;
Stream stdout = Console.OpenStandardOutput();
stdout.WriteByte((byte)((DataLength >> 0) & 0xFF));
stdout.WriteByte((byte)((DataLength >> 8) & 0xFF));
stdout.WriteByte((byte)((DataLength >> 16) & 0xFF));
stdout.WriteByte((byte)((DataLength >> 24) & 0xFF));
Console.Write(jsondata);
stdout.Flush();
}
例えば、connectNativeに次のような引数を指定した場合は、[Unchecked runtime.lastError: Invalid native messaging host name specified.]エラーになる場合があります。
最後までキチンとバイナリー化が必要
バイナリーの先頭部分以外のJSON形式にした文字列もバイナリー(Byte)化が必要のようで、次のコードに変更することでエラーを改善できました。
static void OpenStandardStreamOut(string Data)
{
string jsondata = "{\"text\":\"" + Data + "\"}";
int DataLength = Data.Length;
Stream stdout = Console.OpenStandardOutput();
stdout.WriteByte((byte)((DataLength >> 0) & 0xFF));
stdout.WriteByte((byte)((DataLength >> 8) & 0xFF));
stdout.WriteByte((byte)((DataLength >> 16) & 0xFF));
stdout.WriteByte((byte)((DataLength >> 24) & 0xFF));
stdout.WriteByte(Convert.ToByte(jsondata, 16));
stdout.Flush();
}
後は、こんな感じでOpenStandardOutput関数を呼び出します。
string message = "test";
OpenStandardStreamOut(message);
まとめ
今回は、短い記事ですが Google Chromeの拡張機能で Native Message を利用する際に、[Uncaught (in promise) Error: The sender sent an invalid JSON message; message ignored.]エラーが表示された場合の対処法を書きました。
NativeMessageを利用する場合、戻り値をバイナリー形式にする必要があります。
多少処理が面倒になりますが、Convert.ToByteを利用して戻り値を16進数化してから送信する必要がありました。
Google Chrome 拡張機能で[Uncaught (in promise) Error: The sender sent an invalid JSON message; message ignored.]エラーが解決しない人の参考になれば幸いです。
スポンサーリンク
最後までご覧いただきありがとうございます。