Есть ли способ в javascript, чтобы получить все iframes, которые не нарушают политику одного и того же происхождения с getElementsByTagName? - PullRequest
0 голосов
/ 25 октября 2019

Я пишу расширение Chrome, которое должно получить элемент видео html5 на странице, но некоторые элементы видео были в фреймах. Я добавил в свою функцию поиск через iframes, но начал получать ошибки из-за политики Same-Origin-Policy, связанной с iframes с разными доменами src.

В моей функции есть простой способ исключить iframes, которыенарушать ту же политику происхождения? Или еще лучше (хотя, вероятно, это невозможно), есть ли способ по-прежнему искать на главной странице iframes с разными доменами src?

Рассматриваемая функция:

function getVideo() {
    var videos = document.getElementsByTagName("video");
    if (videos.length >= 1) {
        return videos[0];
    }
    var iframes = document.getElementsByTagName("iframe");
    if (iframes.length >= 1) {
        for (const frame of iframes) {
            videos = frame.contentWindow.document.getElementsByTagName("video");
            if (videos.length >= 1) {
                return videos[0];
            }
        }
    }
    return null; // if a video doesn't exist
}

1 Ответ

0 голосов
/ 27 октября 2019

Как раз когда вы думаете, что искали здесь достаточно долго, чтобы оправдать вопрос, вы находите что-то действительно полезное.

Основываясь на ответе на этот вопрос , я обновил свойкод для этого:

function getVideo() {
    var videos = document.getElementsByTagName("video");
    if (videos.length >= 1) {
        return [videos[0], "main"];
    }

    // Code that will run only inside iframe
    if (parent === top) {
        var videos = document.getElementsByTagName("video");
        if (videos.length >= 1) {
            return [videos[0], "iframe"];
        }
    }
    return [null, null]; // if a video doesn't exist
}

И включил это в мой манифест, чтобы скрипт также вставлялся в iframe:

"content_scripts": [{
    "all_frames": true,
    ...

    ...
}],

Это работает, но это делает мойдругие функции довольно безобразны. Пример:

// if a video exists, set it to the speed and give a notification
function setSpeed(newSpeed) {
    var returnVal = getVideo();
    var video = returnVal[0], type = returnVal[1];
    if (video != null && type === "main") {
        video.playbackRate = newSpeed;
        inWindowAlert("Speed: " + newSpeed, 1000);
        setIcon(newSpeed);
    }
    if (parent === top) {
        if (video != null && type === "iframe") {
            video.playbackRate = newSpeed;
            inWindowAlert("Speed: " + newSpeed, 1000);
            setIcon(newSpeed);
        }
    }
}

Я постараюсь найти более чистое решение, но пока оно работает. Надеюсь, это кому-нибудь поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...