NACL: невозможно выполнить ReadResponseBody в HandleDocumentLoad

API javascript расширения Google Chrome не может получить содержимое обработчиков MIME-типа, таких как пользовательский обработчик PDF. Необходимо написать плагин NACL для перехвата входящего контента.

Это можно сделать!

Загрузка собственного расширения клиента Chrome для определенного MIME Тип

Я застрял в части 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))

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

ReadResponseBody, возвращающее -1, является нормальным PP_OK_COMPLETIONPENDING, поскольку о загрузке будет сообщено функции обратного вызова ReadResponseBody.

Результат функции обратного вызова 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;
}

person user2896053    schedule 21.10.2013    source источник


Ответы (1)


Вы используете интерфейс PPAPI C, который требует ручного подсчета ссылок. Похоже, что ресурс URLLoader уничтожается, пока вы пытаетесь его прочитать. Я думаю, вам понадобится AddRef ресурс url_loader, прежде чем вы вызовете ReadResponseBody.

См. PPB_Core.AddRefResource.

person binji    schedule 21.10.2013
comment
Спасибо, бинджи, это была именно проблема! Я опубликую полное решение, как только разберусь со всеми перегибами. - person user2896053; 22.10.2013