Расширение Chrome с использованием модуля NaCl (код C) не будет принимать мои сообщения

Я был помещен в этот проект, где мне нужно захватить строку PDF в кодировке base64 на уровне javascript и затем отобразить ее. Большая часть кода была написана до того, как я начал, и он уже смог отправить строку base64 на уровень javascript и записать ее в консоль. Мне нужно взять строку и сохранить ее в var для декодирования, а затем использовать pdf.js для ее отображения. Прямо сейчас я просмотрел руководство по обмену сообщениями nacl, но, похоже, оно не работает (я просто хочу, чтобы оно предупредило "Hello World"), чтобы убедиться, что я получаю переменную. Вот часть кода.

vdocs_pdf.c

    base64encode(document_buffer, document_used, base64_buf, base64_size);
    captured_base64 = CStrToVar(base64_buf);
    free(base64_buf);
    captured_flag = 1;
    struct PP_Var var = CStrToVar("hello world");
    ppb_messaging_interface->PostMessage(this_instance, var);
    LogVar(captured_base64);
    SendVar(captured_base64);

static struct PP_Var CBufToVar(const char* str, size_t len)
{
  if (ppb_var_interface) {
    return ppb_var_interface->VarFromUtf8(str, len);
  }
  return PP_MakeUndefined();
}

static struct PP_Var CStrToVar(const char* str)
{
  return CBufToVar(str, strlen(str));
}

index.html

<!DOCTYPE html>
<html>
<!--
Copyright (c) 2012 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->
<head>
  <meta http-equiv="Pragma" content="no-cache">
  <meta http-equiv="Expires" content="-1">
  <title>vdocs_pdf</title>
  <script type="text/javascript" src="common.js"></script>
  <script type="text/javascript" src="vdocs_pdf.js"></script>
</head>
<body data-name="vdocs_pdf" data-tools="newlib glibc pnacl linux" data-configs="Debug Release" data-path="{tc}/{config}">
  <h1>vdocs_pdf</h1>
  <h2>Status: <code id="statusField">NO-STATUS</code></h2>
  <p>vdocs_pdf will accept the application/pdf data and pass
     it up to javascript as a base64 encoded string variable.</p>
  <h2>Output:</h2>
  <pre id="log" style="font-weight: bold"></pre>
  <!-- The NaCl plugin will be embedded inside the element with id "listener".
      See common.js.-->
  <div id="listener"></div>
</body>
</html>

vdoc_pdf.js

// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Once we load, hide the plugin
function moduleDidLoad() {
  common.hideModule();
}

// Called by the common.js module.
function handleMessage(message) {
  common.logMessage(message.data);
}

var listener = document.getElementById('listener');
listener.addEventListener
(
    "message",
  function(message) 
  { 
    alert(message.data); 
  },
  false
);

Есть идеи, что я делаю не так и почему я не могу предупредить о "Hello World"?

Вот вывод из моей консоли, который явно означает, что сообщения передаются на уровень JavaScript. Это просто не работает, когда я отправляю строку "Hello World".

V-DOCS PDF 1.0 (JavaScript Console)! 
HandleDocumentLoad(instance(62dde6dd) url_loader(30)) 
document buffer(fed50008) used(0) max(100000) 
document buffer(fed50008) used(1193) max(100000) 
document buffer(fed50008) used(2641) max(100000) 
document buffer(fed50008) used(4089) max(100000) 
document buffer(fed50008) used(5537) max(100000) 
document buffer(fed50008) used(6985) max(100000) 
document buffer(fed50008) used(8433) max(100000) 
document buffer(fed50008) used(9881) max(100000) 
document buffer(fed50008) used(11329) max(100000) 
document buffer(fed50008) used(12777) max(100000) 
document buffer(fea40008) used(1053574) max(1600000) 
base64_size(1475013) 
JVBERi0xLjYNJeLjz9MNCjY4MiAwIG9iag08PC9MaW5lYXJpemVkIDEvTCAxMDUzNTc0L08gNjg4L0UgODMzNDYvTiAyL1QgMTA1MzA5OS9IIFsgNzA1IDM5OV0+Pg1l... 

Последняя строка в формате base64 в формате pdf. Есть ли что-нибудь еще, что могло бы помочь вам, ребята, помочь мне решить проблему? Я действительно чувствую, что мои изменения в коде Javascript не принимаются во внимание и не знаю почему.

1 ответ

embed.addEventListener линия выглядит неправильно для меня. embed кажется, нигде не определен. Обязательно проверьте консоль JavaScript на наличие ошибок. См. https://developer.chrome.com/devtools/docs/console.

Также помните, что элемент embed недоступен во время работы этого скрипта; поскольку скрипт находится в элементе, он запускается до того, как какой-либо элемент в теле был создан. Если вы хотите получить доступ к элементу встраивания, вы должны подождать, пока он не будет создан. Вы можете сделать это в moduleDidLoad функция:

function moduleDidLoad() {
  common.hideModule();

  // common.naclModule is the embed element...
  common.naclModule.postMessage("foobar");
}

handleMessage Функция выше должна уже обрабатывать сообщения от модуля NaCl. Если вы хотите предупредить, попробуйте это:

function handleMessage(message) {
  alert(message.data);
}
Другие вопросы по тегам