Проверка, установлено ли у пользователя определенное расширение - PullRequest
9 голосов
/ 08 ноября 2011

Я только что узнал, что расширение Screen Capture от Google делает событие window.onresize моего сайта незапускаемым.

Я хочу выполнить проверку JavaScript, чтобы увидеть, установлен ли у пользователя ScreenCapture, и если да, предупредить пользователя о проблеме.

Год назад я думаю, что слышал о каком-то javascript-коде, который мог бы это сделать, возможно, с использованием некоторого API Google, но я не помню.

Есть идеи по этому поводу? Я не разработал никаких расширений, поэтому не знаю, как они работают.

[EDIT] Поэтому меня попросили показать код. Как видно из моего предыдущего вопроса ( window.onresize не запускается в Chrome, а запускается в Chrome Incognito ), проблема возникает в любой функции события window.onresize, поэтому я не думаю, что мой код действительно имеет значение.

Кроме того, мой код содержит довольно много информации, я не знаю, сколько из него нужно вставить или будет ли это полезно.

        var debounce = function (func, threshold, execAsap) 
    {
        var timeout;

        return function debounced () {//alert("1.1 Y U NO WORK?");
            var obj = this, args = arguments;
            function delayed () {
                if (!execAsap)
                    func.apply(obj, args);
                timeout = null; 
            }

            if (timeout)
                clearTimeout(timeout);
            else if (execAsap)
                func.apply(obj, args);

            timeout = setTimeout(delayed, threshold || 100); 
        };
    };


    window.onresize = debounce(function (e) { //alert("1.2 Y U NO WORK?");
        flag = true;
        var point = window.center({width:1,height:1});
        doCenter(point);
        // does something here, but only once after mouse cursor stops 
    }, 100, false);

Я хотел бы подчеркнуть, что проблема не в дебюте. window.onresize = t; function t (e) { alert("wtf?");} тоже не сработает.

[EDIT2]

Вот результат:

    var screenCapture = null;
    var screenCaptureImg = document.createElement("img");
     screenCaptureImg.setAttribute("src", "chrome-extension://cpngackimfmofbokmjmljamhdncknpmg/images/arrow.png");
    /*
     * Add event listeners for both "load"- and "error"-event
     * Set the variable showing the existence of the extension by
     * setting it to "true" or "false" according to the fired event
     */
    screenCaptureImg.addEventListener("load", doLoad, false);
    function doLoad(e){
        screenCapture = true; //removeImgTag(e);

        alert("I've so cleverly detected that your Chrome has the ScreenCapture extension enabled. \n\nThis extension interferes with my website's DOM and long story short, it won't be able to scale properly.\n\nSo please disable it. \nConsider this extension: \"Disable All Extensions Plus\", it's a handy selective disabler.");
    }

    screenCaptureImg.addEventListener("error", function(e){
        screenCapture = false; //removeImgTag(e);
    }, false);
    /*
    function removeImgTag(e) {
        e.currentTarget.parentNode.removeChild(e.currentTarget);
    }
    */

Обратите внимание, что я не могу заставить removeImgTag работать, потому что (по крайней мере, в Chrome) у меня нет доступа к объекту document для создания или удаления элементов из моей страницы, из в рамках этих функций событий. Вот почему я отображаю alert вместо элегантного написания document.getElementById("something").innerHTML= ...

1 Ответ

16 голосов
/ 08 ноября 2011

Чтобы определить, установлено ли расширение в Chrome, вы можете проверить наличие известного ресурса, включенного в расширение, такого как изображение.Ссылки на ресурсы для расширения используются по следующему шаблону URL:

chrome-extension://<extensionID>/<pathToFile>

Основная методика обнаружения заключается в создании скрытого тега изображения и присоединении к нему событий load и error для проверки загрузки изображения (как описано * 1004).* здесь для Firefox):

extensionImg.setAttribute("src", "chrome-extension://<INSERT EXTENSION ID HERE>/images/someImage.png"); // See below for discussion of how to find this

/*
 * Add event listeners for both "load"- and "error"-event
 * Set the variable showing the existence of the extension by
 * setting it to "true" or "false" according to the fired event
 */
extensionImg.addEventListener("load", function(e) {
    extensionExists = true;
    removeImgTag(e);
}, false);
extensionImg.addEventListener("error", function(e) {
    extensionExists = false;
    removeImgTag(e);
}, false);

function removeImgTag(e) {
    e.currentTarget.parentNode.removeChild(e.currentTarget);
}

Проверьте каталог установки расширения в конфигурации Chrome, чтобы найти вероятную цель для обнаружения.На моей рабочей станции Linux расширения расположены по адресу:

 ~/.config/chromium/Default/Extensions

Вы можете видеть, что у меня установлено 3 расширения прямо сейчас:

~/.config/chromium/Default/Extensions$ ls
cpecbmjeidppdiampimghndkikcmoadk  nmpeeekfhbmikbdhlpjbfmnpgcbeggic
cpngackimfmofbokmjmljamhdncknpmg

Странные имена - это уникальные идентификаторы, присвоенныерасширение при загрузке в интернет-магазин Chrome.Вы можете получить идентификатор либо из интернет-магазина, либо перейдя на вкладку Расширения (гаечный ключ -> Расширения) и наведя указатель мыши на ссылку на соответствующее расширение или в этом случае на «Снимок экрана (Google)» (обратите внимание на расширение, отмеченное звездочкой)ID):

https://chrome.google.com/webstore/detail/**cpngackimfmofbokmjmljamhdncknpmg**

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

~/.config/chromium/Default/Extensions/cpngackimfmofbokmjmljamhdncknpmg/5.0.3_0$ ls
account.js         images             page.js         sina_microblog.js
ajax.js            isLoad.js          picasa.js       site.js
background.html    _locales           plugin          style.css
editor.js          manifest.json      popup.html      ui.js
facebook.js        notification.html  sha1.js         upload_ui.js
hotkey_storage.js  oauth.js           shortcut.js
hub.html           options.html       showimage.css
i18n_styles        page_context.js    showimage.html

В случае расширения Screen Capture существует ряд изображений, которые можно использовать:

~/.config/chromium/Default/Extensions/cpngackimfmofbokmjmljamhdncknpmg/5.0.3_0/images$ ls
arrow.png                icon_128.png    icon_save.png     print.png
copy.png                 icon_16.png     line.png          region.png
cross.png                icon_19.png     loading.gif       screen.png
custom.png               icon_32.png     loading_icon.gif  sina_icon.png
delete_account_icon.png  icon_48.png     mark.png          toolbar_bg.png
down_arrow.png           icon_close.png  picasa_icon.png   upload.png
facebook_icon.png        icon_copy.png   popup_bg.jpg      whole.png

Это может бытьссылка на этот URL:

chrome-extension://cpngackimfmofbokmjmljamhdncknpmg/images/arrow.png

Этот метод, очевидно, зависит от стабильности содержимого расширения.Я рекомендую использовать изображение, которое, вероятно, останется во всех версиях.


Как уже упоминалось выше, тот же метод может использоваться для обнаружения расширений Firefox.В этом случае URL-адрес содержимого выглядит следующим образом:

chrome://<EXTENSION NAME>/content/<PATH TO RESOURCE>

На моей рабочей станции Linux расширения Firefox находятся в:

 ~/.mozilla/firefox/<USER PROFILE ID>/extensions

Гдевыглядит примерно так: "h4aqaewq.default"

Вы можете видеть, что у меня установлено 2 расширения, одно из которых является установкой каталога, а другое - XPI (произносится "zippy").") file:

~/.mozilla/firefox/h4aqaewq.default/extensions$ ls
{3e9a3920-1b27-11da-8cd6-0800200c9a66}  staged
firebug@software.joehewitt.com.xpi

В" промежуточном "каталоге Firefox хранит расширения, которые будут обновлены (я думаю).Каталог GUID с квадратными скобками является установкой расширения на основе каталога, а файл .xpi - Firebug.

Примечание : XPI исчезает (см. Ссылку выше).Это в основном zip-файл, который может быть открыт и проверен любым, кто понимает zip-файл.Я использовал Emacs.

Найти идентификатор расширения в Firefox немного сложнее.Перейдите в «Инструменты -> Надстройки», перейдите на вкладку «Расширения», нажмите ссылку «Дополнительно» рядом с описанием расширения, затем нажмите ссылку «Отзывы», чтобы перейти на сайт расширения Firefox и получить идентификатор из URL (обратите внимание на ID расширения, отмеченный звездочкой):

https://addons.mozilla.org/en-US/firefox/addon/**firebug**/reviews/?src=api

Вероятно, есть более простой способ сделать это;предложения приветствуются.

TODO: как найти вероятное изображение в расширении Firefox.


В качестве дополнительной заметки, в Chrome вы можете общаться только с расширением через общий DOMстраница: Связь с хост-страницей

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