【问题标题】:Communicating with the crossrider sidepanel plugin与 crossrider 侧面板插件通信
【发布时间】:2013-12-13 11:42:11
【问题描述】:

crossrider 侧面板只是一个 iframe(您可以使用 js 注入的 html,但我有兴趣使用 iframe 来减少对页面其余部分的干扰)。我根本无法在浏览器扩展程序和 iframe 之间进行任何交互。

我认为添加带有扩展的侧面板没有任何意义,除非您可以进行一些基本的 JS 通信。在这种情况下,我想要控制扩展的 iframe 中的一些选项、复选框等。由于这个插件存在,我假设一定有办法。

理想情况下,我希望在子 iframe 中有一些基本的输入处理 js,并让它返回奇怪的保存/加载命令。答案真的是某种形式的消息传递吗?如果是这样,我应该在这里使用哪个 API?

我相信这是相关的:Accessing iframe from chrome extension

[编辑]
好的,所以我尝试了一些方法...

  1. 似乎预期的用途是将 iframe 的 html 内容托管在某处。考虑到它应该是本地的并且是扩展的一部分,有点奇怪。如果您想离线查看某些页面会发生什么?这很愚蠢,我将其视为一种选择。为什么要浪费资源来托管应该只在本地可用的东西。

  2. 另一种方法是提供侧边栏中的 HTML。请注意,此 HTML 不会放入 iframe 中。我喜欢 iframe 的想法,因为它使 CSS 和 JS 非常独立,因此页面和您的扩展程序之间的干扰最小。

    所以我尝试通过带有 ID 的html 侧边栏属性创建一个 iframe,并在 100 毫秒延迟后使用myiframe.contentWindow.document.open/writeln/close() 注入内容。这在 chrome 上运行良好,但在 Firefox 中失败并出现安全错误(open() 上的The operation is insecure)。

  3. 另一种方法是通过src url 提供iframe 内容(对于侧边栏,我使用url 属性的数据地址):Html code as IFRAME source rather than a URL。这在 Firefox 中有效,但在 chrome 中会导致 CORS 错误:The frame requesting access has a protocol of "http", the frame being accessed has a protocol of "data". Protocols must match.Warning: Blocked a frame with origin "http://localhost" from accessing a cross-origin frame. Function-name: appAPI.message.addListener

这些 CORS 问题让我觉得非常愚蠢。我所有的代码都来自同一个扩展,注入到同一个页面中。没有发生交叉起源,我创造了该死的东西。如果我有能力改变原点,那么它首先是不安全的,所以为什么要麻烦。

【问题讨论】:

    标签: javascript iframe crossrider


    【解决方案1】:

    假设您使用 url 侧边栏属性来加载侧边栏的 HTML(即托管网页),您可以使用扩展程序的 Run in Iframe 功能在iframe 扩展和父窗口的扩展。

    要实现这一点,首先要让扩展程序在 iframe 中运行(设置 > 在 iframe 中运行),然后您可以使用 extension.js em> 加载您的侧边栏并处理消息。例如,以下代码加载一个页面,该页面有一个标识为 btnSave 的按钮:

    托管网页文件:

    <html>
    <head>
    </head>
    <body>
      <div id="mySidebar">
        My sidebar form
        <br />
        <button id="btnSave">Save</button>
      </div>
    </body>
    </html>
    

    extension.js 文件:

    appAPI.ready(function($) {
      // Check if running in iframe and the sidebar page loaded
      if (appAPI.dom.isIframe() && $('#mySidebar').length) {
        // Set click handler for button to send message to parent window
        $('#btnSave').click(function() {
          appAPI.message.toCurrentTabWindow({
            type:'save',
            data:'My save data'
          });
        });
        // End of Iframe code ... exit
        return;
      }
    
      // Parent window message listener
      appAPI.message.addListener(function(msg) {
        if (msg.type === 'save') {
          console.log('Extn:: Parent received data: ' +
            appAPI.JSON.stringify(msg.data));
        }
      });
    
      // Create the sidebar
      var sidebar = new appAPI.sidebar({
        position:'right',
        url: 'http://yourdomain.com/sidebar_page.html',
         title:{
          content:'Sidebar Title',
          close:true
        },
        opacity:1.0,
        width:'300px',
        height:'650px',
        preloader:true,
        sticky:true,
        slide:150,
        openAction:['click', 'mouseover'],
        closeAction:'click',
        theme:'default',
        scrollbars:false,
        openOnInstall:true,
        events:{
          onShow:function () {
            console.log("Extn:: Show sidebar event triggered");
          },
          onHide:function () {
            console.log("Extn:: Hide sidebar event triggered");
          }
        }
      });
    });
    

    但是,如果您使用 html 侧边栏属性来加载侧边栏的 HTML,则此解决方案将不起作用,因为扩展程序不会在此上下文中运行。但是,您可以利用您引用的 StackOverflow 线程中描述的方法与父窗口(这将是特定于浏览器)进行通信,而父窗口又可以使用我们的 CrossriderAPI event 与扩展程序进行通信。

    [免责声明:我是 Crossrider 的员工]

    【讨论】:

    • 非常感谢!有没有办法可以将url 参数指向本地文件,例如crossrider resources 目录中的文件?目前,我正在通过 html 参数创建 iframe 并手动注入 resources html 文件。我希望扩展在本地运行,而不需要服务器。
    • 使用 run-in-iframe 选项注入似乎也不起作用 - “请注意,在 Chrome 中只有现有的 iframe 应用”。有没有一种方法可以明确要求 API 将自身注入给定的 iframe?
    • 在当前实现中,仅当页面托管并且您使用 URL 属性时,才能使用在 Iframe 中运行功能。使用 HTML 属性,您可以使用本机特定于浏览器的消息在 iframe 和父页面之间进行通信,如答案中所述。
    猜你喜欢
    • 2012-08-21
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多