3

この質問は、ここで尋ねられた質問の完全に更新されたバージョンと非常によく似ています。ファイルプロトコルを使用してChrome / Webkitのあるフレームから別のフレームにJavaScript関数を呼び出す方法—残念ながら、その質問は実際には回答されませんでした。

iframeにSVG画像を含むHTMLページがあります。SVGはJavaScriptAPIをエクスポートして、便利なことを実行できるようにします(ズームおよび中央にリセットし、「実際のサイズ」で表示します)。iframeの下に、ユーザーがその呼び出しをクリックしてSVGで定義された関数にアクセスできるボタンを配置しました。

私のコードは次のようになります:

function reset() {
  document.getElementByID('iframe').contentWindow.reset();
}

Safari、Firefox、さらにはIE 9(SVGをサポートしています-やったー!)でも完全に機能します。しかし、Chromeでは失敗します。デバッガーから次のように通知されます。

Property 'reset' of object [object DOMWindow] is not a function

実際、これには真実があるようです。「contentWindow」はDOMWindow型ですが、メソッドやフィールドはありません(少なくとも、デバッガーが表示するわけではありません)。'document'フィールドを要求しても失敗します(nullが生成されます)。

摩擦は、file://プロトコルを使用して、含まれているHTMLと含まれているSVGの両方を転送することのようです。上で参照した質問で述べたように、「contentWindow」にアクセスしようとすると、Chromeは次のエラーを生成します。

Attempt to access frame with URL file://[...]/contained.svg from frame with URL file://[...]/container.html. Domains, protocols and ports must match.

一般的に、セキュリティは素晴らしいと思います。これは、セキュリティに触発された制限のように見えます。しかし、ここでは、行き過ぎているようです。これらは、結局のところ、ユーザーのファイルシステム上のファイルであり、私の場合は、同じディレクトリにさえあります。

コードをホストすることはオプションではありません-それはユーザーのマシン上に存在しなければなりません。「Chromeは使用しないでください。セキュリティの概念がばかげている」と人々に言わなければならないのは嫌です。

この制限を回避する方法はありませんか?

4

2 に答える 2

5

もちろん、方法はありません:)これらのファイルプロトコルは、ユーザーが明示的に呼び出すことを目的としています。あなたが見てきたように、Webアプリケーションがそれを許可する方法は絶対にありません。

これを行う唯一の方法は、「ユーザーとして」許可した場合です。許可した場合は、次のコマンドラインパラメーターを追加して有効にできます。

// By default, file:// URIs cannot read other file:// URIs. This is an
// override for developers who need the old behavior for testing.
--allow-file-access-from-files

したがって、Chromeを次のコマンドで開きます:chrome.exe--allow-file-access-from-filesこれは開発に使用されます。

于 2011-02-25T00:33:51.400 に答える
2

@Mohamed Mansourから提供された情報のおかげで、この問題の詳細を見つけることができました。

Chromeの動作の理論的根拠は、悪意を持って作成されたページがJavaScriptや内部フレームを介して、知らないうちにファイルシステムのコンテンツにアクセスし、インターネットにデータをアップロードするのを防ぐことです[ Chromiumバグ4197Chromiumバグ47416 ]。

私の観点からすると、Chromiumチームが物事を可能な限り実行することを選択したのは残念です。Geckoは、このほくろを打つことにおいてもう少し微妙です。それは、クロスページスクリプトを同じサブディレクトリに制限します[ Mozillaバグ230606ファイルプロトコルの同一生成元ポリシー]。その結果は、ユーザーや開発者にとってそれほど驚くことではなく、Chromeの動作に対して発生したものよりもはるかに少ない不安を生み出しました。特に、 Chromiumのバグ47416を読んで、私が何を意味するかを確認してください。

この動作のために、インターネット上でホストできず、ローカルユーザーのマシン上に存在する必要がある「Webサイト」を変更して、ユーザーにブラウザーを切り替えるように指示するダイアログボックスを表示する必要がありました。本当に残念です。Chromeをサポートしたいのですが、ユーザーが私の「ウェブサイト」を実行したいときに、あいまいなコマンドラインオプションを使用してChromeを再起動することは期待できません。

Chromeが不思議なことに機能しないように思われるときに誰かが私の質問に出くわした場合に備えて、またこれを読んだ人にChromiumバグ47416の主演を検討するように勧めるために、ここに私の調査結果を投稿します。開発者は、人々が本当に問題に関心を持っていることが明らかでない限り、Chromeの動作を変更することを検討したくないことを痛烈に明らかにしました。「ユーザーにChromeを使用しないように言わなければならなかった」と言われたことは、十分な励ましではありませんでした。

于 2011-02-25T20:13:58.447 に答える