2016-10-21 12 views
8

개인적인 용도로 사용하는 Firefox 부가 기능을 작성하고 JavaScript 및 Firefox 부가 기능 SDK에 대해 더 자세히 배우려고합니다. 부가 기능은 vivo.sx URL을 연 다음 자동으로 플레이어를 시작해야하지만 2 가지 문제가 있습니다. 너희들이 나를 도울 수 있기를. 콘텐츠 스크립트에서 Flowplayer 기능을 사용하는 방법은 무엇입니까?

관련 추가 기능 코드 :

function vivoplay() 
{ 
    pageMod.PageMod({ 
     include: "https://vivo.sx/*", 
     contentScriptFile: "./vivoplay.js", 
     onAttach: play 
    }); 

    function play(worker)      //Fires 2 Times 
    { 
     console.log("Timeout"); 
     tmr.setTimeout(sendplay, 14000); 
     function sendplay() 
     { 
      var a = 0; 
      worker.port.emit("start", a); 
     } 
    } 
} 

내용 스크립트

self.port.on("start", function(a) { 
    console.log("Load"); 
    flowplayer().load();   //ReferenceError: flowplayer is not defined 
    console.log("Loaded"); 
}); 

첫 번째 문제는 함수 play 화재 2 번, 만 번 실행해야한다는 것입니다. 아마도 올바르게 작동하지 않는 onAttach 일 것입니다. 그것에 대해 어떻게 생각하세요?

더 중요한 문제는 ReferenceError입니다. 나는 Greasemonkey 스크립트를 가지고 있는데, 여기서 나는 flowplayer().load(); 함수를 사용한다. 콘텐츠 스크립트가 Greasemonkey 스크립트처럼 실행되고 있다고 생각했습니다. 그래서이 함수를 사용할 수 있어야합니다. 그 맞습니까? 이 문제를 어떻게 해결할 수 있습니까?

내 그리스 몽키 스크립트는

// ==UserScript== 
// @name  3. Vivo 
// @namespace Autoplay 
// @include  https://vivo.sx/* 
// @version  1 
// @grant  none 
// ==/UserScript== 

window.setTimeout(Play, 2000); 
function Play() 
{ 
    flowplayer().load(); 
    console.log("Loaded"); 
    flowplayer().fullscreen(); 
    console.log("Fullscreen started"); 
} 

그래서

: 나와 함께 인내하시기 바랍니다 자세한 정보가 필요하면 댓글을 남겨주세요이 아주 새로운 오전.

+1

어디에서'flowplayer()'를 정의합니까? – Makyen

+0

아무데도 정의 할 수 없다. –

+0

그러면 Greasemonkey에서 사용하는 환경에 어떻게 포함됩니까? 상호 작용을 시도하는 페이지의 일부로 포함되어 있습니까? – Makyen

답변

1

발생하는 문제는 콘텐츠 스크립트가 웹 페이지의 스크립트 (페이지 스크립트)와 다른 컨텍스트에서 실행되고 있다는 것을 고려하지 않고 있다는 것입니다. 콘텐츠 스크립트를 페이지 스크립트와 별도로 유지하는 것은 보안상의 이유로 브라우저 확장을위한 일반적인 아키텍처입니다. 콘텐트 스크립트는 페이지 스크립트에 부여 된 권한보다 높은 권한을가집니다. 보안상의 이유로 콘텐트 스크립트 컨텍스트 내에서 페이지가 제공하는 기능을 기술적으로 실행할 수는 있지만 그렇게해서는 안됩니다. 그렇게하기로 선택하면 확장 프로그램은 AMO에 등록 된 Mozilla의 검토를 통과하지 못합니다.

당신이 expose functions which exist in your content script to page scripts을 할 수있는 동안, 그리고 create objects in the page script scope, 실제로 페이지 스크립트의 컨텍스트 내에서 코드를 실행할 수있는 방법은 실행하기 원하는 코드가 포함 된 document<script> 요소를 추가하는 것입니다. 전체 코드와 브라우저가 어떻게 생겼는지의 스크린 샷이 없으면
:

self.port.on("start", function(a) { 
    let newScript = document.createElement('script'); 
    //The calls to console.log don't need to be in the page script. 
    // However, the code in the newScript is executed asynchronously. Thus, if the 
    // console.log("Loaded"); 
    // is in the content script it will be executed prior to flowplayer().load() actually 
    // being called. 
    newScript.innerHTML = 'console.log("Load");' 
         + 'flowplayer().load();' 
         + 'console.log("Loaded");' ; 
    document.head.appendChild(newScript); 
}); 

onAttach/play 번 이상 실행 :로 문제의 코드를

이이 구현 될 수있다 이것이 일어날 이유를 확신하는 것은 불가능합니다.

가장 큰 이유는 "https://vivo.sx/*"과 일치하는 주소로 두 개 이상의 탭이 열려 있기 때문일 수 있습니다. onAttach 코드는 콘텐츠 스크립트가 페이지에 첨부 될 때마다 호출됩니다. 일치하는 URL에 열려있는 각 탭마다 한 번 연결됩니다. 추가 기능이로드 될 때 일치하는 URL에 대해 두 개의 탭이 열리면 onAttach 코드가 두 번 실행됩니다.

또 다른 가능성은 vivoplay 번 이상 실행하여 각각 PageMod을 설정하여 각 탭에 콘텐츠 스크립트의 별도 사본을 첨부하는 것입니다. 이 함수에 사용 된 이름이 vivoplay이라면 두 번 이상 실행중인 재생 함수로 취급 할 수 있습니다. 당신이 그 기능 안에서 조직 된 것들을 가지고 있다면 그렇게해서는 안됩니다.

표시되는 내용에 대한 지나치게 복잡 :
코드는 표시되는 내용에 대한 지나치게 복잡하다. 콘텐츠 스크립트에 onAttach 이벤트를 사용하여 start을 보냈습니다. 콘텐츠 스크립트는 첨부 될 때만로드/실행됩니다. 따라서 첨부 된 콘텐츠 스크립트에 start을 전송하여 알리는 것은 불필요합니다. 다른 이벤트 (예 : 사용자가 버튼을 클릭)에 대한 응답으로 start 만 전송하도록 코드를 수정하려는 경우 이는 합당 할 수 있습니다. 그러나 Flowplayer를 항상 자동으로 시작하려는 의도가있는 경우 start 메시지를 콘텐츠 스크립트에 보낼 필요가 없습니다. 콘텐츠 스크립트는 setTimeout 일 수 있으며 실행될 때 해당 코드를 실행할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 마침내 추가 기능이 생겼습니다. 그러나 귀하의 솔루션에 대해 몇 가지 질문이있었습니다. 내가 추가 한 스크립트 요소는 언제 실행됩니까? 내 부가 기능이 작업을 마친 후 브라우저가 정상적으로 작동하도록 첨부 된 콘텐츠 스크립트를 어떻게 취소 할 수 있는지 팁을 알려 주실 수 있습니까? –

+0

내가 추가하는 것을 보여준'