7

(我已经读过这个但它没有用,我做了很多搜索和实验都无济于事。)

我正在编写一个 Chrome 扩展程序(BigConsole),目的是为 Chrome 开发人员工具构建一个更好的控制台选项卡。这意味着我想在页面上下文中执行用户输入代码,并访问页面上的 DOM 和其他变量。为此,通信结构如下:

  • devtools创建panel用户编写代码的地方
  • 当用户想要从 中执行代码时panel,会向脚本panel发送一条消息background
  • 脚本从background接收消息/代码panel并将其传递给content注入页面的脚本
  • 脚本从content脚本接收消息/代码background并将script元素注入页面,然后运行代码
  • 然后将页面上的结果通过 window.postMessagescript发回脚本content
  • 脚本侦听来自页面的content消息/结果并将其传递给background脚本
  • 脚本从background脚本接收消息/结果content并将其传递给panel
  • 从脚本panel接收消息/结果background并将其插入结果日志

唷。

现在,当用户尝试运行代码时,什么也没有发生。我将一堆console.log()s 放入代码中,但控制台中没有出现任何内容。我的主要问题是,我在这里做错了什么消息传递导致什么都没有发生?或者,我很想被告知我让这种方式过于复杂,并且有更好的做事方式。下面的简化代码...

面板.js:

    window.onload = function() {
      var port = chrome.runtime.connect({name: "Eval in context"});
      // Add the eval'd response to the console when the background page sends it back
      port.onMessage.addListener(function (msg) {
        addToConsole(msg, false);
      });
      document.getElementById('run').addEventListener('click', function() {
        var s = document.getElementById('console').value;
        try {
          // Ask the background page to ask the content script to inject a script
          // into the DOM that can finally eval `s` in the right context.
          port.postMessage(s);
          // Outputting `s` to the log in the panel works here,
          // but console.log() does nothing, and I can't observe any
          // results of port.postMessage
        }
        catch(e) {}
      });
    };

背景.js:

    chrome.runtime.onConnect.addListener(function (port) {
      // Listen for message from the panel and pass it on to the content
      port.onMessage.addListener(function (message) {
        // Request a tab for sending needed information
        chrome.tabs.query({'active': true,'currentWindow': true}, function (tabs) {
          // Send message to content script
          if (tab) {
            chrome.tabs.sendMessage(tabs[0].id, message);
          }
        });
      });
      // Post back to Devtools from content
      chrome.runtime.onMessage.addListener(function (message, sender) {
        port.postMessage(message);
      });
    });

内容.js:

    // Listen for the content to eval from the panel via the background page
    chrome.runtime.onMessage.addListener(function (message, sender) {
      executeScriptInPageContext(message);
    });
    function executeScriptInPageContext(m) { alert(m); }
4

1 回答 1

5

正如亚历克斯所指出的,您的代码中有一个错字,导致它无法正常工作。

删除当前代码并使用chrome.devtools.inspectedWindow.eval直接运行代码并解析结果。这将您的复杂逻辑简化为:

  • devtools 创建一个面板,用户可以在其中编写代码
  • devtools 运行代码
  • devtools 处理结果

PS。有一种方法可以操纵现有的控制台,但我建议不要使用它,除非它是供个人使用的。此答案中显示了两种不同的方法。

于 2013-07-07T10:43:51.803 回答