2011-02-24 2 views
3

을 사용하여 Chrome의 iframe에 정의 된 자바 스크립트 기능 호출이 질문은 완전히 업데이트 된 질문의 유형과 매우 유사합니다. How to call a JavaScript function from one frame to another in Chrome/Webkit with file protocol — 불행히도이 질문은 실제로 답변 된 적이 없습니다.파일 프로토콜

iframe에 SVG 이미지가 포함 된 HTML 페이지가 있습니다. SVG는 JavaScript API를 내 보내서 유용한 작업을 수행 할 수 있습니다 (확대/축소 및 중앙 정렬, "실제 크기"로 표시). iframe 아래에 사용자가 해당 호출을 클릭하여 SVG에 정의 된 함수를 호출 할 수있는 버튼을 배치했습니다.

내 코드는 다음과 같습니다

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

그것은 사파리, 파이어 폭스, 심지어 IE 9에서 완벽하게 작동합니다 (SVGs을 지원합니다 - 만세!). 하지만 Chrome에서는 오류가 발생합니다. 디버거가 다음과 같이 알려줍니다.

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

사실, 'contentWindow'는 DOMWindow 유형이지만, 메소드 나 필드가 없습니다 (적어도 디버거가 표시하지는 않습니다). 그것의 '문서'필드를 요구하는 것조차도 실패합니다 (null이됩니다).

포함 된 HTML과 포함 된 SVG를 모두 전송하려면 file : // 프로토콜을 사용하는 것으로 나타납니다. 내가 위에서 언급 한 질문에서 언급 한 바와 같이, 크롬 'contentWindow를'액세스 할 수있는 시도가 만들어 다음과 같은 오류 발생 : 일반적으로

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

을, 나는 보안이 좋은 생각; 이것은 보안에 영감을받은 제한과 같습니다. 하지만 여기서는 너무 지나친 것처럼 보입니다.이 파일은 사용자의 파일 시스템에있는 파일입니다. 결국 내 경우에는 같은 디렉토리에 있습니다.

코드 호스팅은 옵션이 아니며 사용자 컴퓨터에 있어야합니다. 나는 사람들에게 "크롬을 사용하지 말라. 보안에 대한 어리석은 생각"이라고 말해야한다.

이 제한 사항을 해결할 방법이 없습니까?

답변

5

물론이 방법은 없습니다 :) 이러한 파일 프로토콜은 사용자가 명시 적으로 호출하기위한 것입니다. 지금까지 보았 듯이 웹 애플리케이션에서이를 허용 할 수있는 방법은 전혀 없습니다.

// 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.exe --allow-file-access-from-files 이것은 개발 용으로 사용됩니다.

+0

예 - 그 트릭을 수행합니다. 고맙습니다. 하지만 왜 그걸 잠근거야? 파일 - 투 - HTTP 또는 HTTP - 투 - 파일 또는 ... 나에게 의미가 있습니다. 그러나 File-to-File? 내가 고려하고 있지 않은 몇 가지 보안 취약점이 있어야합니다. –

2

@Mohamed Mansour가 제공 한 정보 덕분에이 문제에 대한 자세한 정보를 얻을 수있었습니다.

크롬의 동작은 JavaScript 및 내부 프레임을 통해 악의적으로 제작 된 페이지가 사용자의 지식없이 파일 시스템의 내용에 액세스하여 인터넷에 데이터를 업로드하는 것을 방지하기위한 것입니다. [Chromium bug 4197, Chromium bug 47416]

내 의견으로는 Chromium 팀이 최대한 멀리하는 것을 선택하는 것은 불행합니다.Gecko는이 두더지를 두드리기에 더 미묘합니다 : 동일한 페이지로 된 스크립트를 동일한 하위 디렉토리로 제한합니다 [Mozilla bug 230606, Same-origin policy for file protocol]. 결과는 사용자와 개발자에게는별로 놀라운 일이 아니며 Chrome의 동작보다 많은 어려움을 덜 낳았습니다. — 특히 Chromium bug 47416을 읽으면 무엇을 의미합니까? 이 동작의

, 나는 인터넷에서 호스팅 할 수 없으며 로컬 사용자의 컴퓨터 그래서 브라우저를 전환하는 사용자를 알려주는 대화 상자를 던졌습니다 —에 있어야 내 "웹 사이트"—을 수정 했어 . 정말 나쁘다. — 크롬을 지원하고 싶지만 내 "웹 사이트"를 실행할 때마다 사용자가 애매한 명령 줄 옵션을 사용하여 다시 시작하도록 기대할 수는 없습니다.

크롬이 신비하게도 작동하지 않는 것처럼 보일 때 다른 사람이 내 질문에 우연히 마주 치며이 글을 읽는 사람에게 Chromium bug 47416을 고려하도록 권유합니다. 개발자는 명확하게 사람들이 문제를 신경 쓰지 않는 한 Chrome의 행동을 변경하는 것을 고려하지 않으려한다는 것을 분명히했습니다. "나는 크롬을 사용하지 말라는 사용자들에게 말해야했다"는 말은 격려가 충분하지 못했다.

+0

이전에 응답하지 않아서 죄송합니다. 훌륭한 연구를 해보았습니다 :) 불행히도 File API는 여전히 제작 중이며 HTML5가 대부분의 사용자 요구를 해결할 것입니다. 이러한 명령 행 옵션을 사용하면 좌절감을 느낄 수 있으므로 개선 할 수 있습니다. 희망을 갖고 그것이 미래에있을 것이다 :) –