0

Google Chrome 拡張 JavaScript API は、カスタム PDF ハンドラーなどの MIME タイプ ハンドラーのコンテンツを取得できません。着信コンテンツをキャッチするには、NACL プラグインを作成する必要があります。

これはできる!

特定の MIME タイプのネイティブ クライアント Chrome 拡張機能をロードする

私は ReadResponseBody 部分で立ち往生しています。タイプ application/mu のドキュメントをロードすると、以下のコードからこのコンソール出力が得られます。

========================

Resource interpreted as Document but transferred with MIME type application/mu:
Instance_HandleDocumentLoad(instance(7c2333c9) url_loader(14)) 
load_callback.func(20620) user_data(7c2333c9) flags(0) 
ReadResponseBody returned -1 
load_callback_func(user_data(7c2333c9) result(-3))

========================

-1 を返す ReadResponseBody は、読み込みが ReadResponseBody コールバック関数に報告されるため、通常の PP_OK_COMPLETIONPENDING です。

ReadResponseBody コールバック関数の結果 -3 は、pepper_29/include/ppapi/c/pp_errors.h で説明されています。

========================

/**
* This value indicates failure due to an asynchronous operation being
* interrupted. The most common cause of this error code is destroying a
* resource that still has a callback pending. All callbacks are guaranteed
* to execute, so any callbacks pending on a destroyed resource will be
* issued with PP_ERROR_ABORTED.
*
* If you get an aborted notification that you aren't expecting, check to
* make sure that the resource you're using is still in scope. A common
* mistake is to create a resource on the stack, which will destroy the
* resource as soon as the function returns.
*/
PP_ERROR_ABORTED = -3,

========================

私のバッファはスタック上にないので、何を試せばよいか途方に暮れています。

関連するコードは次のとおりです。

========================

static char load_document_buffer[8192];

static void load_callback_func(void* user_data, int32_t result)
{
  char msg[256];

  sprintf(msg, "load_callback_func(user_data(%lx) result(%ld))",
      (long)user_data,
      (long)result);
  LogMessage((PP_Instance)user_data, msg);
}

static PP_Bool Instance_HandleDocumentLoad(PP_Instance instance,
                                          PP_Resource url_loader) {
  char msg[256];

  sprintf(msg, "Instance_HandleDocumentLoad(instance(%lx) url_loader(%ld))",
      (long)instance,
      (long)url_loader
      );
  LogMessage(instance, msg);

  struct PP_CompletionCallback load_callback;
  load_callback.func       = load_callback_func;
  load_callback.user_data  = (void *)instance;
  load_callback.flags      = PP_COMPLETIONCALLBACK_FLAG_NONE;

  sprintf(msg, "load_callback.func(%lx) user_data(%lx) flags(%d)",
      (long)(load_callback.func),
      (long)(load_callback.user_data),
      (long)(load_callback.flags));
  LogMessage(instance, msg);

  load_document_buffer[0] = '\0';
  int32_t rv = ppb_urlloader_interface->ReadResponseBody(
      url_loader,
      load_document_buffer,
      sizeof(load_document_buffer),
      load_callback);

  sprintf(msg, "ReadResponseBody returned %d", rv);
  LogMessage(instance, msg);

  return PP_TRUE;
}
4

1 に答える 1

1

手動の参照カウントが必要な PPAPI C インターフェイスを使用しています。URLLoaderリソースから読み取ろうとしているときに、リソースが破棄されているようです。AddRefを呼び出す前に url_loader リソースが必要になると思いますReadResponseBody

PPB_Core.AddRefResourceを参照してください

于 2013-10-21T23:32:59.687 に答える