1

是否可以将 dart 用于 chrome 扩展内容脚本?以下似乎没有调用 main() 中的任何内容

import 'dart:html';

import 'package:js/js.dart' as js;

void main() {
  js.context.alert('Hello from Dart via JavaScript');
  window.console.log("START!!!");
  window.alert("alert");
}

清单.json...

 "content_scripts": [
    {
      "matches": [
        "http://docs.google.com/*",
        "https://docs.google.com/*"
      ],
      "js": [
        "packages/browser/dart.js",
        "packages/browser/interop.js",
        "packages/js/dart_interop.js",
        "out.js"
      ],
      "run_at" : "document_idle",
      "all_frames" : false
    }
  ],
4

2 回答 2

1

我自己并不熟悉 chrome 扩展内容脚本,但从查看文档来看,它们似乎在比常规浏览器脚本更受限制的世界中运行。从文档中,他们不能:

  • 使用 chrome.* API(chrome.extension 的部分除外)
  • 使用由其扩展页面定义的变量或函数
  • 使用由网页或其他内容脚本定义的变量或函数

可能是 dart2js 输出违反了这些规则之一。您可以尝试使用 --disallow-unsafe-eval 选项编译 dart 代码。它用于需要在 CSP 环境中运行的脚本。您还可以查看 devtools 以查看是否有任何有用的错误 -

于 2013-09-10T19:26:29.200 回答
1

我做了一些调试,我相信 dart2js 中有一个针对 chrome.dart 的错误。

content.dart.js 的末尾是启动 main 函数的代码。我加了(); 更改后调用这两个函数和主函数。

在显示从 1 到 5 的更改 console.log 调用之前,但不是 #6。更改后,调用 1-6 中的所有 console.log 调用,并显示 main 函数中的 print()。

  // BEGIN invoke [main].
  (function(callback) {
    console.log('Begin invoke main 1');
    if (typeof document === "undefined") {
      callback(null);
      return;
    }
    console.log('Begin invoke main 2');
    if (document.currentScript) {
      callback(document.currentScript);
      return;
    }
    console.log('Begin invoke main 3');
    var scripts = document.scripts;
    function onLoad(event) {
      for (var i = 0; i < scripts.length; ++i)
        scripts[i].removeEventListener("load", onLoad, false);
      callback(event.target);
    }
    console.log('Begin invoke main 4');
    for (var i = 0; i < scripts.length; ++i)
      scripts[i].addEventListener("load", onLoad, false);
    console.log('Begin invoke main 5');
  })();    // <-- Added
  (function(currentScript) {
    console.log('Begin invoke main 6');
    init.currentScript = currentScript;
    if (typeof dartMainRunner === "function")
      dartMainRunner(T.main, []);
    else
      T.main([]);
  })();    // <-- Added
  // END invoke [main].
于 2015-07-14T08:18:05.233 回答