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;
}