CKeditor во всплывающем окне Chrome Extension выпустил: «Отказался загружать фрейм из« about: blank »из-за Content-Security-Policy». - PullRequest
1 голос
/ 03 апреля 2012

CKeditor во всплывающем окне Chrome Extension выпустил: «Отказался загружать фрейм из« about: blank »из-за Content-Security-Policy».

Я пытаюсь обновить расширение Chrome для работы с манифестом 2 и новыми API Chrome, которые в настоящее время ломают плагин с последней версией выпуска 18.0.1025.142.

Я использую CKEditorво всплывающем окне, которое выдается фоновой страницей в расширении.

Но я получаю ошибку Refused to load frame from 'about:blank' because of Content-Security-Policy.2 - есть ли способ обойти это?

Обновление

Это может быть связано: http://code.google.com/p/chromium/issues/detail?id=77947&q=Error%20during%20tabs.executeScript%3A&colspec=ID%20Pri%20Mstone%20ReleaseBlock%20Area%20Feature%20Status%20Owner%20Summary

1 Ответ

0 голосов
/ 04 апреля 2012

В расширениях Chrome вы не можете получить доступ или изменить содержимое из протоколов, отличных от file:, http:, ftp: и chrome-extension: (data:, blob: и filesystem:, когда страница создала ресурс сами по себе).

Я рассмотрел четыре подхода к решению проблемы:

  1. Привязать событие beforeload к документу и изменить URL-адрес, если оно соответствует about:blank.
    Не работает : CSP активируется до запуска этого события.
  2. Привязать событие DOMNodeInserted к документу и проверить наличие about:blank фреймов.
    Не работает : CSP активируется до запуска этого события.
  3. Используйте API webRequest для перехвата запроса.
    Не работает : строгое соответствие шаблонам не разрешает протокол about:.
  4. Измените свойство src перед вставкой в ​​документ IFRAME:
    1. Либо вручную (лучший вариант), либо
    2. Изменить document.createElement для IFrames или
    3. Измените методы appendChild, insertBefore и replaceChild для фреймов.

Для всех методов вы должны создать фиктивную страницу, скажем, blank.html в вашем добавочном номере и разрешить доступ через web_accessible_resources.

Пример файла манифеста (важны последние четыре строки):

{
  "name": "Name",
  "version": "1.0",
  "background": {"scripts": ["aboutblank.js"]},
  "manifest_version": 2,
  "content_security_policy": "default-src 'self'",
  "web_accessible_resources": ["blank.html"]
}

aboutblank.js

var BLANK_PAGE = chrome.extension.getURL("blank.html");

(function(BLANK_PAGE, createElement, appendChild, insertBefore, replaceChild) {
    HTMLDocument.prototype.createElement = function(str) {
        var elem = createElement.call(this, str);
        if (str.toUpperCase() == 'IFRAME') {
            elem.src = BLANK_PAGE;
        }
        return elem;
    };
    Element.prototype.appendChild = function(newChild) {
        iframe_check(newChild);
        return appendChild.call(this, newChild);
    };
    Element.prototype.insertBefore = function(newChild, refChild) {
        iframe_check(newChild);
        return insertBefore.call(this, newChild, refChild);
    };
    Element.prototype.replaceChild = function(newChild, refChild) {
        iframe_check(newChild);
        return replaceChild.call(this, newChild, refChild);
    };

    function iframe_check(elem) {
        if (elem instanceof HTMLIFrameElement && (elem.src == '' || elem.src.slice(0,11) == 'about:blank')) {
            elem.src = BLANK_PAGE;
        }
    }
})(BLANK_PAGE,
   HTMLDocument.prototype.createElement,
   Element.prototype.appendChild,
   Element.prototype.insertBefore,
   Element.prototype.replaceChild);

Примечание. Рекомендуется использовать вариант 1 для изменения этих методов-прототипов. Также способ-прототип не работает для <iframes>, введенного с использованием .innerHTML.

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