SWFobject в расширении Chrome - API недоступен

Привет!
Я создаю расширение Chrome, в которое мне нужно встроить SWFobject на фоновую страницу.
Все работает, кроме элементов управления JavaScript для SWFobject и eventListeners.
Я предполагаю, что это как-то связано с междоменными политиками, потому что во время тестирования страницы на веб-сервере все работало нормально.

Во всяком случае, вот фрагмент:

На главной странице:

var playerView =  chrome.extension.getBackgroundPage(); 
$('#playerPause').click(function(){
    playerView.playerPause();
});

На заднем фоне:

function playerPause() {
    if (postData[nowPlaying].provider == 'youtube' ) {
        player.pauseVideo();
    } 
    else if (postData[nowPlaying].provider == 'soundcloud' ) {
        player.api_pause();
    };
}

И eventListeners:

soundcloud.addEventListener('onMediaEnd', playerNext);

function onYouTubePlayerReady(player) {
    player.addEventListener("onStateChange", "function(state){ if(state == 0) { playerNext(); } }");
}

В консоль кидает

"Uncaught TypeError: У объекта # нет метода 'pauseVideo'"

для обоих Youtube встроить Soundcloud один.

Кроме того, SWFobject встраивается следующим образом (и работает):

function loadTrack (id) {
    if(postData[id].provider == 'youtube') {
        swfobject.embedSWF(
            "http://www.youtube.com/e/" + postData[id].url + "?enablejsapi=1&playerapiid=player",
            "player",
            "1",
            "1",
            "8",
            null,
            {
                autoplay: 1
            },
            {
                allowScriptAccess: "always"
            },
            {
                id: "player"
            }
        );
    }
    else if(postData[id].provider == 'soundcloud') {
        swfobject.embedSWF(
            'http://player.soundcloud.com/player.swf',
            'player',
            '1',
            '1',
            '9.0.0',
            'expressInstall.swf',
            {
                enable_api: true, 
                object_id: 'player',
                url: postData[id].url,
                auto_play: true
            },
            {
                allowscriptaccess: 'always'
            },
            {
                id: 'player',
                name: 'player'
            }
        );
    }
}

Извините за длинный пост, я хотел предоставить как можно больше информации.
Кроме того, я знаю, что код не очень красивый, это было только мое второе приложение;)

Большое спасибо заранее всем, кто может помочь,
Giacomo

2 ответа

Проблема здесь в том, что вы не можете использовать встроенные сценарии или встроенные обработчики событий в расширениях Chrome с тех пор, как манифест развился до v2.

Вы должны были добавить файл манифеста для меня, чтобы понять, что происходит лучше. Но кратко все, что вы можете сделать, это

На главной странице

  • Удалите все встроенные сценарии и переместите их во внешний файл JS.
  • Удалите встроенные прослушиватели событий, переместите их на тот же или другой внешний JS и используйте

    addEventListener().

Но проблема в том, что вы не можете выполнять вызовы SWF на фоновой странице или ожидать, что он что-нибудь вернет. Все это будет продолжать давать вам "Uncaught TypeError" Исключение.

Возьмем случай захвата изображения с веб-камеры в формате SWF: веб-камера будет передаваться на страницу, но вызов функции для нее никогда не будет выполнен, и, следовательно, изображение никогда не будет захвачено. Из-за этого мой проект по сканированию QR-кодов из всплывающего окна аддонов встретил руины.

Вы можете взглянуть на это расширение, вы не можете получить доступ к локальному соединению в расширении Chrome, но вместо этого вы можете запустить скрипт контента как скрипт прокси (вы можете использовать прокси-страницу на gae или любых других бесплатных серверах)

Другие вопросы по тегам