5

その場で特定の XML ドキュメントに XSLT 変換を適用する必要がある Chrome 拡張機能を作成しています。テストのために、次の XML および XSL ファイルを使用します。

XML:

<?xml version="1.0" encoding="utf-8" ?>
<WebServiceMessage>
 <status>timeout</status>
 <message>Nameserver%2520not%2520registered.</message>
 <stepName>Finish</stepName>
 <stepNumber>11</stepNumber>
 <maxStepNumber>11</maxStepNumber>
 <percent>100</percent>
 <session>2fc0f139b88a800151e5f21b9d747919</session>
</WebServiceMessage>

XSL:

<?xml version="1.0" ?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <html><head></head>
    <body>
      <xsl:apply-templates/>
    </body>
    </html>
  </xsl:template>
  <xsl:template match="*">
    <xsl:for-each select="*">
      <p><b><xsl:value-of select ="name(.)"/></b>:
      <span><xsl:attribute name="id"><xsl:value-of select ="name(.)"/></xsl:attribute><xsl:value-of select="."/></span></p>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

変換は、テスト XML ファイル自体の内部でリンクされている場合、つまり次の方法で正常に機能します。

<?xml-stylesheet type="text/xsl" href="message.xsl"?>

拡張機能は、同じ xsl リンクを XML ファイルに挿入する必要があります。

マニフェスト.json:

{
  "permissions": ["tabs", "<all_urls>"],
  "content_scripts":
  [
    {
      "matches": ["<all_urls>"],
      "js" : ["contentscript.js"]
    }
  ],
  "web_accessible_resources":
  [
    "message.xsl"
  ],
  "manifest_version": 2
}

contentscript.js:

(function()
{
  if(document.xmlVersion != null)
  {
     var e = document.createProcessingInstruction(
               "xml-stylesheet",
               "type='text/xsl' href='" + chrome.extension.getURL("message.xsl") + "'");
     document.insertBefore(e, document.firstChild);
  }
})();

問題

Chrome は次のエラーをコンソールに出力します。

chrome-extension://ladfinoepkgipbeooknnklpakoknohjh/message.xslURLのフレームから安全でない URL をロードしようとしていますhttp://localhost/out.xml。ドメイン、プロトコル、およびポートが一致する必要があります。

これを修正する方法は?Chrome のバグのように見える同様のエラーに関連するレポートをインターネットでいくつか見ました。

xsl ファイルも Web サーバーに配置し、スタイルシート リンクを Web サーバーに変更しました。それでも同じエラー:

http://localhost/message.xslURLのフレームから安全でない URL をロードしようとしていますhttp://localhost/out.xml。ドメイン、プロトコル、およびポートが一致する必要があります。

どうやらドメイン、プロトコル、およびポートは一致しています。

4

3 に答える 3

1

私が現在使用している回避策は次のとおりです。

function loadXMLtext(url)
{
  xhttp = new XMLHttpRequest();
  xhttp.open("GET", url, false);
  xhttp.send();
  if(xhttp.responseXML == undefined) throw "XHR failed for " + url;
  return xhttp.responseXML;
}

function transformxml()
{
  var xml = loadXMLtext(document.location.href);
  var xsl = loadXMLtext(chrome.extension.getURL("message.xsl"));

  var xsltPrs = new XSLTProcessor();
  xsltPrs.importStylesheet(xsl);

  var result = xsltPrs.transformToFragment(xml, document);

  var xmlsrv = new XMLSerializer();
  var plaintext = xmlsrv.serializeToString(result);
  document.documentElement.innerHTML = plaintext;
}

transformxml();
于 2013-01-05T20:15:31.617 に答える
0

ドメイン外のリソースを処理するよう Web ページに要求しています。localhost を介してブラウザを「だます」ことを試みることはできますが、これは facebook に google からスクリプトを実行するように要求することと同じです。これはSame Origin ポリシーエラーです。解決するには、処理をコンテンツ スクリプトからバックグラウンド/イベント ページに移動するだけです処理後に結果を渡す必要がありますが、それが正しいアプローチです。

ほとんどの処理をバックグラウンド/イベント ページで実行する必要があるもう 1 つの理由は、拡張機能を最適化するためです。それ以外の場合は、現在のwindowエンジンを使用しているだけであり、ブロックされている場合はユーザーのタブを実行します。

于 2013-01-05T17:54:41.407 に答える