Полезная информация

На IRC-канале #mozilla-ru можно получить техническую консультацию онлайн и, конечно же, порцию общения.

№119-09-2013 10:12:10

2k1dmg
Участник
 
Группа: Members
Зарегистрирован: 06-04-2011
Сообщений: 190
UA: Firefox 24.0

[CB] Click to Play per-element

Click to Play per-element 2014-01-15
Совместимость: [firefox] Firefox 24+
Автор: 2k1dmg
Описание: Восстанавливает возможность воспроизводить плагины поэлементно.
Если нужно активировать плагин на этой странице, а не на домене (как в Firefox 23 кнопка "Включить")
то в about:config "plugin.sessionPermissionNow.intervalInMinutes" установить равным 0
и кликать по кнопке "Временно разрешить"

Инициализация:

Выделить код

Код:

// CTPpe 2014-01-15

'use strict';

let _prefs = {
    'styles.enabled': true,
    'styles.useOldCSS': false,
    'styles.useOldCSSoutlineColorOnHover': '',
    'styles.useOldCSSoutlineWidth': 1,
    'styles.customHoverBackgroundColor': '',
    'styles.customHoverTextColor': '',
    'styles.hidePluginNotifications': false,

    'showPluginUIEvenIfItsTooBig': false,

    // default
    'defaultBackgroundColor': 'rgb(142,142,142)', // rgb(142,142,142)
    'defaultTextColor': 'rgb(0,0,0)', // rgb(0,0,0)
};

let CTPpe = {
    init: function() {
        gBrowser.addEventListener('PluginBindingAttached', this, true, true);
        window.addEventListener('unload', this, false);
        if (_prefs['styles.enabled'])
            this.loadStyles();
    },
    uninit: function(reason) {
        gBrowser.removeEventListener('PluginBindingAttached', this, true, true);
        window.removeEventListener('unload', this, false);
        if (reason == 'destructor' || reason == 'unload')
            return;
        this.unloadStyles();
    },

    handleEvent: function(event) {
        switch (event.type) {
            case 'PluginBindingAttached':
                this.pluginBindingAttached(event);
                break;
            case 'unload':
                this.uninit('unload');
                break;
        }
    },

    _stylesLoaded: false,
    loadStyles: function() {
        if (this._stylesLoaded)
            return;
        this._stylesLoaded = true;
        let sss = this.sss;

        let cssURI = this.cssURI = this.makeCSSURI();
        if (!sss.sheetRegistered(cssURI, sss.USER_SHEET))
            sss.loadAndRegisterSheet(cssURI, sss.USER_SHEET);
    },
    unloadStyles: function() {
        if (!this._stylesLoaded)
            return;
        this._stylesLoaded = false;
        let sss = this.sss;
        if (sss.sheetRegistered(this.cssURI, sss.USER_SHEET))
            sss.unregisterSheet(this.cssURI, sss.USER_SHEET);
    },
    reloadStyles: function() {
        this.unloadStyles();
        this.loadStyles();
    },
    get sss() {
        delete this.sss;
        return this.sss = Components.classes['@mozilla.org/content/style-sheet-service;1']
            .getService(Components.interfaces.nsIStyleSheetService);
    },
    makeCSSURI: function() {
        let cssStr;

        if (_prefs['styles.useOldCSS']) {

            let clicktoplay_bgtexturePNG = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6N0FDQzM0RTJDMzU5MTFERjg1MTlGNThDQkY1RDlCQkYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6N0FDQzM0RTNDMzU5MTFERjg1MTlGNThDQkY1RDlCQkYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3QUNDMzRFMEMzNTkxMURGODUxOUY1OENCRjVEOUJCRiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3QUNDMzRFMUMzNTkxMURGODUxOUY1OENCRjVEOUJCRiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PpD58KwAAANLSURBVHjabFRZT1NBGD29vaW00IXiZWmDUESFAFGEBzUafTHxN5qYGI0vPGpIBB40SoEUCUshkrQUWcpWqF2gpXTBOd+lJIKTTGY7c+Z821hmI9v+cqUM3arDpmsolavgus5WB7ZyuSyjrusynpfOb2Bra42LifEJNDdqaHMDyWQSc+E5BLyQHovFEI1Gr9bzP+dxeHgoWMOlYXJiEqVSSdYWKiNRMltGoVCA1+OCQ4k4zhVRqVbgczlFUSqXh1WzotllR0GJTWdycDgcMNw6jk+qyGaz0CjPqSwi0eLSorzgUff5+npsXSmGdM65xzNilpeXkc/n5S45QqGQqYym+dtbBRTbKwjx7TYf7Dbg935OlHW1uVAsAVv7KVHU3erA4Qmwu3cAwzDQ4bv0Gf3iMP0rRDs7O6KgXpGlUinpnHMvkUgIRtOABqUqHo9LENgs4dWEn46NHxTFjL47HXLp11YWZ8Ui+oMGNAsQiSdRb7ej77Ybmbw6X99GS0uLUmhHIm0GSsNlo7PT6bSYxkai05MT1CnFuhUy5x4bMcTW0saqWI6OjmCZXtr0k/XhQK84em07J2aN9HcK0UI0iYtqFY/utypzgPDKJnw+H3o7XCqKwOLKGnp6etB5SzeVXVxc4HqjaXKmiK63/+H/8Vl0Ly/hf/l4UJxNRTTt2VBQgFMLG2hobMTQXQNnKqrfw6vo6urCvUAD9rPAzGwYeo2VCen1eiX8JKOzpZwq5jmJanvEuN3uqxKrKPE03TK1uOFnibx68USiGImnJPyvnw8KUPlUxqcPOmX88iOCQCCAwW4fcmfA+NcZDI8MI2jUKXJVpMFgUErEo8BMSIIZfkaNL9JHNI2KeEYM2+k55C45xM8sheHeNqm10bGQZDZfZR59m41I1Jhb9BH3eNbT7hDsn3RW7pLjzccxs5xY/QeZstRak9ctmZ3MFCWPmj0N8upx5lR8ZHjsoohETqcTrR4dyVwVmUzGLKf3o2NS/VTAWqMfmNmMFPOInXPu8Syxuy9YEvEuv6CBYJOpjAubzXbjc2RmF8/NLLerDGbUrn+Otbv1Ns30GV/kf/Tp85hUPyPDqghNz0pmszOPuMczYoilabxLorfvPuCvAAMAakjBuDF4E1QAAAAASUVORK5CYII=';
            let videoClickToPlayButtonSVG = 'data:image/svg+xml;base64,PCEtLSBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljCiAgIC0gTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpcwogICAtIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0idmlkZW9QbGF5QnV0dG9uT3ZlcmxheSIKICAgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pbllNaW4gbWVldCIKICAgdmlld0JveD0iMCAwIDY0IDY0Ij4KICA8ZGVmcz4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0id2hpdGVHcmFkaWVudFN0b3BzIj4KICAgICAgPHN0b3AgaWQ9IndoaXRlR3JhZGllbnRTdG9wMDEiIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5Oi45NSIgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcCBpZD0id2hpdGVHcmFkaWVudFN0b3AwMiIgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6Ljc1IiBvZmZzZXQ9Ii40NSIgLz4KICAgICAgPHN0b3AgaWQ9IndoaXRlR3JhZGllbnRTdG9wMDMiIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5Oi43MiIgb2Zmc2V0PSIuNTUiIC8+CiAgICAgIDxzdG9wIGlkPSJ3aGl0ZUdyYWRpZW50U3RvcDA0IiBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTouNjUiIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIzMiIKICAgICAgIHkxPSIwIgogICAgICAgeDI9IjMyIgogICAgICAgeTI9IjYyIgogICAgICAgaWQ9IndoaXRlR3JhZGllbnQiCiAgICAgICB4bGluazpocmVmPSIjd2hpdGVHcmFkaWVudFN0b3BzIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIC8+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImFycm93R3JhZGllbnRTdG9wcyI+CiAgICAgIDxzdG9wIGlkPSJhcnJvd0dyYWRpZW50U3RvcDAxIiBzdHlsZT0ic3RvcC1jb2xvcjojMzMzMzMzO3N0b3Atb3BhY2l0eTouNSIgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcCBpZD0iYXJyb3dHcmFkaWVudFN0b3AwMiIgc3R5bGU9InN0b3AtY29sb3I6IzY2NjY2NjtzdG9wLW9wYWNpdHk6LjUiIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIzMiIKICAgICAgIHkxPSIxNiIKICAgICAgIHgyPSIzMiIKICAgICAgIHkyPSI0OCIKICAgICAgIGlkPSJhcnJvd0dyYWRpZW50IgogICAgICAgeGxpbms6aHJlZj0iI2Fycm93R3JhZGllbnRTdG9wcyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGZpbHRlcgogICAgICAgeD0iLTAuMTUiCiAgICAgICB5PSItMC4xNSIKICAgICAgIHdpZHRoPSIxLjI1IgogICAgICAgaGVpZ2h0PSIxLjI1IgogICAgICAgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIgogICAgICAgaWQ9ImRyb3BTaGFkb3ciPgogICAgICA8ZmVHYXVzc2lhbkJsdXIKICAgICAgICAgcmVzdWx0PSJibHVyIgogICAgICAgICBzdGREZXZpYXRpb249IjIiCiAgICAgICAgIGluPSJTb3VyY2VBbHBoYSIKICAgICAgICAgaWQ9ImRyb3BTaGFkb3dCbHVyIiAvPgogICAgICA8ZmVDb2xvck1hdHJpeAogICAgICAgICB2YWx1ZXM9IjEgMCAwIDAgIDAKICAgICAgICAgICAgICAgICAwIDEgMCAwICAwCiAgICAgICAgICAgICAgICAgMCAwIDEgMCAgMAogICAgICAgICAgICAgICAgIDAgMCAwIC41IDAiCiAgICAgICAgIHR5cGU9Im1hdHJpeCIKICAgICAgICAgcmVzdWx0PSJibHVyYWxwaGEiCiAgICAgICAgIGlkPSJkcm9wU2hhZG93Q29sb3IiIC8+CiAgICAgIDxmZU9mZnNldAogICAgICAgICByZXN1bHQ9Im9mZnNldEJsdXIiCiAgICAgICAgIGR5PSIxIgogICAgICAgICBkeD0iMCIKICAgICAgICAgaW49ImJsdXJhbHBoYSIKICAgICAgICAgaWQ9ImRyb3BTaGFkb3dPZmZzZXQiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZQogICAgICAgICAgIGluPSJvZmZzZXRCbHVyIiAvPgogICAgICAgIDxmZU1lcmdlTm9kZQogICAgICAgICAgIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICAgIDxtYXNrIGlkPSJkcm9wU2hhZG93TWFzayI+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik00Ny4yODUsMzAuOTkxTDIzLjc1LDE3LjI0Yy0wLjM1Ny0wLjIwOC0wLjY5Mi0wLjI3OC0wLjk2OS0wLjIyMSBDMjIuMzIsMTcuMTE1LDIyLDE3LjU1NSwyMiwxOC4yNTJ2MjcuNDk5YzAsMS4xMTIsMC43OTcsMS41NjgsMS43NSwxLjAxMWwyMy41MzUtMTMuNzQ4QzQ4LjIzOCwzMi40NTgsNDguMjM4LDMxLjU0Nyw0Ny4yODUsMzAuOTkxIHogTTAsMHY2NGg2NFYwSDB6IE0zMiw2MEMxNi41MzYsNjAsNCw0Ny40NjQsNCwzMlMxNi41MzYsNCwzMiw0czI4LDEyLjUzNiwyOCwyOFM0Ny40NjQsNjAsMzIsNjB6IgogICAgICAgICBpZD0iZHJvcFNoYWRvd01hc2tQYXRoIgogICAgICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgPC9tYXNrPiAgICAgICAKICA8L2RlZnM+CiAgPHBhdGggCiAgICAgZD0iTTMyLDRDMTYuNTM2LDQsNCwxNi41MzYsNCwzMnMxMi41MzYsMjgsMjgsMjhzMjgtMTIuNTM2LDI4LTI4UzQ3LjQ2NCw0LDMyLDR6IE00Ny4yODUsMzMuMDE0IEwyMy43NSw0Ni43NjJDMjIuNzk3LDQ3LjMxOSwyMiw0Ni44NjMsMjIsNDUuNzUxdi0yNy41YzAtMC42OTcsMC4zMi0xLjEzNywwLjc4MS0xLjIzMmMwLjI3Ny0wLjA1OCwwLjYxMiwwLjAxMiwwLjk2OSwwLjIyMSBsMjMuNTM1LDEzLjc1MUM0OC4yMzgsMzEuNTQ2LDQ4LjIzOCwzMi40NTgsNDcuMjg1LDMzLjAxNHoiCiAgICAgbWFzaz0idXJsKCNkcm9wU2hhZG93TWFzaykiCiAgICAgaWQ9InBsYXlCdXR0b25TaGFkb3ciCiAgICAgc3R5bGU9ImZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7ZmlsdGVyOnVybCgjZHJvcFNoYWRvdykiIC8+CiAgPHBhdGgKICAgICBkPSJNMjIuNzgxLDE3LjAxOUMyMi4zMiwxNy4xMTQsMjIsMTcuNTU1LDIyLDE4LjI1MXYyNy41YzAsMS4xMTIsMC43OTcsMS41NjgsMS43NSwxLjAxMSBsMjMuNTM1LTEzLjc0OGMwLjk1My0wLjU1NiwwLjk1My0xLjQ2NywwLTIuMDIzTDIzLjc1LDE3LjI0QzIzLjM5MywxNy4wMzEsMjMuMDU4LDE2Ljk2MSwyMi43ODEsMTcuMDE5eiIKICAgICBpZD0icGxheUJ1dHRvbkFycm93IgogICAgIHN0eWxlPSJmaWxsOnVybCgjYXJyb3dHcmFkaWVudCk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+CiAgPHBhdGggCiAgICAgZD0iTTMyLDRDMTYuNTM2LDQsNCwxNi41MzYsNCwzMnMxMi41MzYsMjgsMjgsMjhzMjgtMTIuNTM2LDI4LTI4UzQ3LjQ2NCw0LDMyLDR6IE00Ny4yODUsMzMuMDE0IEwyMy43NSw0Ni43NjJDMjIuNzk3LDQ3LjMxOSwyMiw0Ni44NjMsMjIsNDUuNzUxdi0yNy41YzAtMC42OTcsMC4zMi0xLjEzNywwLjc4MS0xLjIzMmMwLjI3Ny0wLjA1OCwwLjYxMiwwLjAxMiwwLjk2OSwwLjIyMSBsMjMuNTM1LDEzLjc1MUM0OC4yMzgsMzEuNTQ2LDQ4LjIzOCwzMi40NTgsNDcuMjg1LDMzLjAxNHoiCiAgICAgaWQ9InBsYXlCdXR0b24iCiAgICAgc3R5bGU9ImZpbGw6dXJsKCN3aGl0ZUdyYWRpZW50KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICA8cGF0aAogICAgIGQ9Ik0zMiw0QzE2LjUzNiw0LDQsMTYuNTM2LDQsMzJzMTIuNTM2LDI4LDI4LDI4czI4LTEyLjUzNiwyOC0yOFM0Ny40NjQsNCwzMiw0eiBNMzIsNTlDMTcuMTEyLDU5LDUsNDYuODg4LDUsMzJTMTcuMTEyLDUsMzIsNXMyNywxMi4xMTIsMjcsMjdTNDYuODg4LDU5LDMyLDU5eiBNNDcuNzg5LDMwLjEyN2wtMjMuNTM0LTEzLjc1IEMyMy44MjYsMTYuMTI2LDIzLjM5NiwxNiwyMi45NzYsMTZjLTAuMTM1LDAtMC4yNywwLjAxNC0wLjM5OCwwLjA0MUMyMS42MiwxNi4yMzgsMjEsMTcuMTA2LDIxLDE4LjI1MXYyNy41IEMyMSw0Ny4wNzUsMjEuODEyLDQ4LDIyLjk3Nyw0OGMwLjQyMywwLDAuODU0LTAuMTI2LDEuMjc5LTAuMzc1TDQ3Ljc5LDMzLjg3N2MwLjc2OS0wLjQ0OSwxLjIxLTEuMTMyLDEuMjEtMS44NzUgUzQ4LjU1OSwzMC41NzYsNDcuNzg5LDMwLjEyN3ogTTQ3LjI4NSwzMy4wMTRMMjMuNzUsNDYuNzYyQzIzLjQ3NCw0Ni45MjQsMjMuMjExLDQ3LDIyLjk3Nyw0N0MyMi40MDIsNDcsMjIsNDYuNTQxLDIyLDQ1Ljc1MXYtMjcuNSBjMC0wLjY5NywwLjMyLTEuMTM3LDAuNzgxLTEuMjMyTDIyLjk3NiwxN2MwLjIzMywwLDAuNDk4LDAuMDc5LDAuNzc1LDAuMjRsMjMuNTM1LDEzLjc1MSBDNDguMjM4LDMxLjU0Niw0OC4yMzgsMzIuNDU4LDQ3LjI4NSwzMy4wMTR6IgogICAgIGlkPSJwbGF5QnV0dG9uRWRnZUhpZ2hsaWdodHMiCiAgICAgc3R5bGU9ImZpbGw6d2hpdGU7ZmlsbC1vcGFjaXR5Oi4zO3N0cm9rZTpub25lIiAvPgogIDxwYXRoCiAgICAgZD0iTTMyLDRDMTYuNTM2LDQsNCwxNi41MzYsNCwzMmMwLDAuMTY3LDAuMDEsMC4zMzMsMC4wMTMsMC41IEM0LjI4LDE3LjI2OCwxNi43MDQsNSwzMiw1YzE1LjI5NiwwLDI3LjcyLDEyLjI2OCwyNy45ODcsMjcuNUM1OS45OSwzMi4zMzMsNjAsMzIuMTY3LDYwLDMyQzYwLDE2LjUzNiw0Ny40NjQsNCwzMiw0eiBNNDcuMjg1LDMzLjAxNEwyMy43NSw0Ni43NjJDMjIuNzk3LDQ3LjMxOSwyMiw0Ni44NjMsMjIsNDUuNzUxdjFjMCwxLjExMiwwLjc5NywxLjU2OCwxLjc1LDEuMDExbDIzLjUzNS0xMy43NDggYzAuNjk3LTAuNDA2LDAuODc5LTEuMDAzLDAuNTU2LTEuNTEyQzQ3LjcyMywzMi42ODgsNDcuNTQxLDMyLjg2NCw0Ny4yODUsMzMuMDE0eiIKICAgICBpZD0icGxheUJ1dHRvblRvcEVkZ2VIaWdobGlnaHRzIgogICAgIHN0eWxlPSJmaWxsOndoaXRlO2ZpbGwtb3BhY2l0eTouODtzdHJva2U6bm9uZSIgLz4KPC9zdmc+Cg==';

            let outlineColorOnHover = _prefs['styles.useOldCSSoutlineColorOnHover'];
            if (outlineColorOnHover === '') {
                outlineColorOnHover = 'hsla(0,0%,50%,0.5)';
            }

            let outlineWidth = _prefs['styles.useOldCSSoutlineWidth'];
            if (typeof outlineWidth != 'number' ||
                    outlineWidth <= 1  ||
                    outlineWidth > 4 ) {
                outlineWidth = 1;
            }

            cssStr = '@namespace url(http://www.w3.org/1999/xhtml);\n' +
                    '@namespace xul url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);\n' +
                    ':-moz-handler-clicktoplay .icon {\n' +
                    '    opacity: 0.7;\n' +
                    '    background-image: url(' + clicktoplay_bgtexturePNG + '),\n' +
                    '                        url(' + videoClickToPlayButtonSVG + ') !important;\n' +
                    '}\n' +
                    ':-moz-handler-clicktoplay .hoverBox:hover .icon {\n' +
                    '    opacity: 1 !important;\n' +
                    '}\n' +
                    ':-moz-handler-clicktoplay .mainBox {\n' +
                    '    background-color: hsla(0,0%,100%,.2) !important;\n' +
                    '    color: hsl(0,0%,35%) !important;\n' +
                    '    outline: ' + outlineWidth + 'px dashed hsla(0,0%,50%,0.5) !important;\n' +
                    '    outline-offset: -' + outlineWidth + 'px !important;\n' +
                    '}\n' +
                    ':-moz-handler-clicktoplay .mainBox:hover {\n' +
                    '    background-color: hsla(0,0%,90%,.7) !important;\n' +
                    '    outline-color: ' + outlineColorOnHover + ' !important;\n' +
                    '}\n' +
                    ':-moz-handler-clicktoplay .hoverBox:hover {\n' +
                    '    color: hsl(0,0%,20%) !important;\n' +
                    '}\n';
        } else {
            let setBgColor = _prefs['styles.customHoverBackgroundColor'];
            let setTColor= _prefs['styles.customHoverTextColor'];
            if (!setBgColor || setBgColor == '')
                setBgColor = _prefs['defaultBackgroundColor'];
            if (!setTColor || setTColor == '')
                setTColor = _prefs['defaultTextColor'];

            cssStr = '\@namespace url(http://www.w3.org/1999/xhtml);\n' +
                    '@namespace xul url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);\n' +
                    ':-moz-handler-clicktoplay .mainBox:hover {\n' +
                    '    background-color: ' + setBgColor + ' !important;\n' +
                    '}\n' +
                    ':-moz-handler-clicktoplay .hoverBox:hover {\n' +
                    '    color: ' + setTColor + ' !important;\n' +
                    '}\n';
        }

        let hidePluginNotifications = _prefs['styles.hidePluginNotifications'];
        if (hidePluginNotifications) {
            cssStr += '\n' +
                    'xul|notification[value="plugin-hidden"] {\n'+
                    '    display: none !important;\n' +
                    '}\n';
        }
        return Services.io.newURI('data:text/css,' + encodeURIComponent(cssStr), null, null);
    },

    // fallback
    getPluginUI: function(plugin, doc) {
        return doc.getAnonymousElementByAttribute(plugin, 'class', 'mainBox') ||
                doc.getAnonymousElementByAttribute(plugin, 'anonid', 'main');
    },

    pluginBindingAttached: function(event) {
        window.setTimeout(function() {
            this.pluginAttached(event);
        }.bind(this), 50);
    },
    pluginAttached: function(event) {
        let eventType = event.type;
        if (eventType == 'PluginRemoved') {
            return;
        }
        let plugin = event.target;
        let doc = plugin.ownerDocument;
        if (!(plugin instanceof Ci.nsIObjectLoadingContent))
            return;
        if (eventType == 'PluginBindingAttached') {
            // The plugin binding fires this event when it is created.
            // As an untrusted event, ensure that this object actually has a binding
            // and make sure we don't handle it twice
            let overlay = gPluginHandler.getPluginUI(plugin, 'main') ||
                            this.getPluginUI(plugin, doc);
            if (!overlay) {
                return;
            }
            // Lookup the handler for this binding
            eventType = gPluginHandler._getBindingType(plugin);
            if (!eventType) {
                // Not all bindings have handlers
                return;
            }
        }
        if (eventType == 'PluginClickToPlay')
            this._handleClickToPlayEvent(plugin);
    },
    _handleClickToPlayEvent: function PH_handleClickToPlayEvent(aPlugin) {
        let doc = aPlugin.ownerDocument;
        let browser = gBrowser.getBrowserForDocument(doc.defaultView.top.document);
        let objLoadingContent = aPlugin.QueryInterface(Ci.nsIObjectLoadingContent);
        // guard against giving pluginHost.getPermissionStringForType a type
        // not associated with any known plugin
        if (!gPluginHandler.isKnownPlugin(objLoadingContent))
            return;
        let overlay = gPluginHandler.getPluginUI(aPlugin, 'main') ||
                            this.getPluginUI(aPlugin, doc);
        if (overlay) {
            overlay.addEventListener('click', CTPpe._overlayClickListener, true);
            overlay.removeEventListener('click', gPluginHandler._overlayClickListener, true);
            if (_prefs['showPluginUIEvenIfItsTooBig']) {
                window.setTimeout(function() {
                    try {
                        if (gPluginHandler.isTooSmall && overlay &&
                                gPluginHandler.isTooSmall(aPlugin, overlay))
                            overlay.style.visibility = 'visible';
                    } catch (ex) {
                        console.error('CTPpe' + ex);
                    }
                }.bind(this), 100);
            }
        }
    },
    _overlayClickListener: {
        handleEvent: function PH_handleOverlayClick(aEvent) {
            let plugin = document.getBindingParent(aEvent.target);
            let contentWindow = plugin.ownerDocument.defaultView.top;
            // gBrowser.getBrowserForDocument does not exist in the case where we
            // drag-and-dropped a tab from a window containing only that tab. In
            // that case, the window gets destroyed.
            let browser = gBrowser.getBrowserForDocument ?
                gBrowser.getBrowserForDocument(contentWindow.document) :
                null;
            // If browser is null here, we've been drag-and-dropped from another
            // window, and this is the wrong click handler.
            if (!browser) {
                aEvent.target.removeEventListener('click', CTPpe._overlayClickListener, true);
                return;
            }
            let objLoadingContent = plugin.QueryInterface(Ci.nsIObjectLoadingContent);
            // Have to check that the target is not the link to update the plugin
            if (!(aEvent.originalTarget instanceof HTMLAnchorElement) &&
                    (aEvent.originalTarget.getAttribute('anonid') != 'closeIcon') &&
                    aEvent.button == 0 && aEvent.isTrusted) {
                if (gPluginHandler.canActivatePlugin(objLoadingContent) &&
                        objLoadingContent.pluginFallbackType !=
                        Ci.nsIObjectLoadingContent.PLUGIN_VULNERABLE_UPDATABLE &&
                        objLoadingContent.pluginFallbackType !=
                        Ci.nsIObjectLoadingContent.PLUGIN_VULNERABLE_NO_UPDATE) {
                    objLoadingContent.playPlugin();
                } else {
                    gPluginHandler._showClickToPlayNotification(browser, plugin);
                }
                aEvent.stopPropagation();
                aEvent.preventDefault();
            }
        }
    }
};
this.onDestroy = function(reason) {
    CTPpe.uninit(reason);
};
CTPpe.init();

Отредактировано 2k1dmg (15-01-2014 10:23:13)

Отсутствует

 

№203-10-2013 12:28:46

2k1dmg
Участник
 
Группа: Members
Зарегистрирован: 06-04-2011
Сообщений: 190
UA: Firefox 24.0

Re: [CB] Click to Play per-element

Тестовая версия

скрытый текст

Выделить код

Код:

// Click to Play per-element 0.0.3b1.20131003

let LOG_PREFIX = "cbjs_c2ppe";
let console = (Cu.import("resource://gre/modules/devtools/Console.jsm", {})).console;

let _prefs = {
    "styles.enabled": true, // true
    // добавить стиль CSS
    "styles.customHoverBackgroundColor": "", // ""
    // цвет фона оболочки плагина при наведении курсора
    "styles.customHoverTextColor": "", // ""
    // цвет текста оболочки плагина при наведении курсора
    "showPluginUIEvenIfItsTooBig": false, // false
    // показывать оболочку плагина даже если она слишком большая
    "defaultBackgroundColor": "rgb(142,142,142)", // rgb(142,142,142)"
    "defaultTextColor": "rgb(0,0,0)", // "rgb(0,0,0)"
    // цвета по умолчанию если не заданы выше
    "timeout.add_to_handleClickToPlayEvent": true, // true
    "timeout.add_to_showPluginUIEvenIfItsTooBig": true, // true
    "timeout.handleClickToPlayEvent": 100, // 100
    "timeout.showPluginUIEvenIfItsTooBig": 100, // 100
    // таймауты
    "play.PLUGIN_VULNERABLE_UPDATABLE": false, // false
    "play.PLUGIN_VULNERABLE_NO_UPDATE": false  // false
    // включать уязвимые плагины
};

let cbjs_c2ppe = {
    init: function() {
        this.toggleEventListener("add");
        if (_prefs["styles.enabled"])
            this.loadStyles();
    },
    uninit: function() {
        this.toggleEventListener("remove");
        this.unloadStyles();
    },
    toggleEventListener: function(tReason) {
        let tListener = (tReason == "add") ? "addEventListener" : "removeEventListener";
        window[tListener]("unload", this, false);
        gBrowser[tListener]("PluginBindingAttached", this, true, true);
    },
    handleEvent: function(e) {
        switch(e.type) {
            case "PluginBindingAttached":
                this.pluginBindingAttached(e);
                break;
            case "unload":
                this.uninit();
                break;
        }
    },

    _stylesLoaded: false,
    loadStyles: function() {
        if(this._stylesLoaded)
            return;
        this._stylesLoaded = true;
        let sss = this.sss;

        var cssURI = this.cssURI = this.makeCSSURI();
        if(!sss.sheetRegistered(cssURI, sss.USER_SHEET))
            sss.loadAndRegisterSheet(cssURI, sss.USER_SHEET);
    },
    unloadStyles: function() {
        if(!this._stylesLoaded)
            return;
        this._stylesLoaded = false;
        let sss = this.sss;
        if(sss.sheetRegistered(this.cssURI, sss.USER_SHEET))
            sss.unregisterSheet(this.cssURI, sss.USER_SHEET);
    },
    reloadStyles: function() {
        this.unloadStyles();
        this.loadStyles();
    },
    get sss() {
        delete this.sss;
        return this.sss = Components.classes["@mozilla.org/content/style-sheet-service;1"]
            .getService(Components.interfaces.nsIStyleSheetService);
    },
    makeCSSURI: function() {
        let setBgColor = _prefs["styles.customHoverBackgroundColor"];
        let setTColor= _prefs["styles.customHoverTextColor"];
        if (!setBgColor || setBgColor == "")
            setBgColor = _prefs["defaultBackgroundColor"];
        if (!setTColor || setTColor == "")
            setTColor = _prefs["defaultTextColor"];

        let vulUpd = _prefs["play.PLUGIN_VULNERABLE_UPDATABLE"];
        let vulNoUpd = _prefs["play.PLUGIN_VULNERABLE_NO_UPDATE"];

        let cssStr ='\
@namespace url(http://www.w3.org/1999/xhtml);\n\
:-moz-handler-clicktoplay .mainBox:hover';
        if (vulUpd) cssStr +=
',\n\
:-moz-handler-vulnerable-updatable .mainBox:hover';
        if (vulNoUpd) cssStr +=
',\n\
:-moz-handler-vulnerable-no-update .mainBox:hover';
        cssStr +=
' {\n\
    background-color: ' + setBgColor + ' !important;\n\
}\n\
:-moz-handler-clicktoplay .hoverBox:hover';
        if (vulUpd) cssStr +=
',\n\
:-moz-handler-vulnerable-updatable .hoverBox:hover';
        if (vulNoUpd) cssStr +=
',\n\
:-moz-handler-vulnerable-no-update .hoverBox:hover';
        cssStr +=
' {\n\
    color: ' + setTColor + ' !important;\n\
}\n\
';
        return Services.io.newURI("data:text/css," + encodeURIComponent(cssStr), null, null);
    },

    pluginBindingAttached: function(event) {
        let plugin;
        let doc;
        try {
            plugin = event.target;
            doc = plugin.ownerDocument;
            let _this = this;
            if (_prefs["timeout.add_to_handleClickToPlayEvent"]) {
                let timeout = _prefs["timeout.handleClickToPlayEvent"] || 100;
                window.setTimeout(function() {
                    _this._handleClickToPlayEvent.call(_this, plugin, doc);
                }, timeout);
            } else
                this._handleClickToPlayEvent(plugin, doc);
        } catch (ex) {
            console.error(LOG_PREFIX + ex);
        }
    },
    _handleClickToPlayEvent: function PH_handleClickToPlayEvent(plugin, doc) {
        let overlay;
        let eventType;
        try {
            overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main") ||
                            doc.getAnonymousElementByAttribute(plugin, "class", "mainBox");
            if (!overlay && !(plugin instanceof Ci.nsIObjectLoadingContent)) {
                console.error(LOG_PREFIX + "_handleClickToPlayEvent(): overlay", overlay);
                return;
            }
            eventType = gPluginHandler._getBindingType(plugin);
        } catch (ex) {
            console.error(LOG_PREFIX + ex);
            return;
        }
        switch (eventType) {
            case "PluginVulnerableUpdatable":
            case "PluginVulnerableNoUpdate":
            case "PluginClickToPlay":
                plugin.addEventListener("click", cbjs_c2ppe._overlayClickListener, true);
                if (_prefs["showPluginUIEvenIfItsTooBig"]) {
                    this.showPluginUIEvenIfItsTooBig(plugin, overlay);
                }
                break;
        }
    },
    showPluginUIEvenIfItsTooBig: function(plugin, overlay) {
        if (_prefs["timeout.add_to_showPluginUIEvenIfItsTooBig"]) {
            let timeout = _prefs["timeout.showPluginUIEvenIfItsTooBig"] || 100;
            window.setTimeout(function() {
                try {
                    if (gPluginHandler.isTooSmall && overlay &&
                        gPluginHandler.isTooSmall(plugin, overlay))
                        overlay.style.visibility = "visible";
                } catch (ex) {
                    console.error(LOG_PREFIX + ex);
                }
            }, timeout);
        } else {
            try {
                if (gPluginHandler.isTooSmall && overlay &&
                    gPluginHandler.isTooSmall(plugin, overlay))
                    overlay.style.visibility = "visible";
            } catch (ex) {
                console.error(LOG_PREFIX + ex);
            }
        }
    },
    _overlayClickListener: {
        handleEvent: function PH_handleOverlayClick(aEvent) {
            aEvent.target.removeEventListener("click", cbjs_c2ppe._overlayClickListener, true);
            let plugin = document.getBindingParent(aEvent.originalTarget);
            let contentWindow = plugin.ownerDocument.defaultView.top;
            // gBrowser.getBrowserForDocument does not exist in the case where we
            // drag-and-dropped a tab from a window containing only that tab. In
            // that case, the window gets destroyed.
            let browser = gBrowser.getBrowserForDocument ?
                gBrowser.getBrowserForDocument(contentWindow.document) :
                null;
            // If browser is null here, we've been drag-and-dropped from another
            // window, and this is the wrong click handler.
            if (!browser) {
                return;
            }
            let objLoadingContent = plugin.QueryInterface(Ci.nsIObjectLoadingContent);
            // Have to check that the target is not the link to update the plugin
            if (!(aEvent.originalTarget instanceof HTMLAnchorElement) &&
                (aEvent.originalTarget.getAttribute('anonid') != 'closeIcon') &&
                aEvent.button == 0 && aEvent.isTrusted) {
                // If this isn't a vulnerable plugin, try to activate
                // just this element without changing any other state.
                if (!gPluginHandler.canActivatePlugin(objLoadingContent))
                    return;
                if (objLoadingContent.pluginFallbackType ==
                        Ci.nsIObjectLoadingContent.PLUGIN_VULNERABLE_UPDATABLE &&
                        !_prefs["play.PLUGIN_VULNERABLE_UPDATABLE"] ||
                        objLoadingContent.pluginFallbackType ==
                        Ci.nsIObjectLoadingContent.PLUGIN_VULNERABLE_NO_UPDATE &&
                        !_prefs["play.PLUGIN_VULNERABLE_NO_UPDATE"])
                    return;
                objLoadingContent.playPlugin();
                aEvent.stopPropagation();
                aEvent.preventDefault();
            }
        }
    }
};

if (gPluginHandler &&
        gPluginHandler._overlayClickListener &&
        gPluginHandler._overlayClickListener.handleEvent &&
        gPluginHandler.canActivatePlugin &&
        gPluginHandler._getBindingType &&
        !gPluginHandler.activateSinglePlugin &&
        !gPluginHandler._pluginNeedsActivationExceptThese) {
    cbjs_c2ppe.init();
}

this.onDestroy = function(reason) {
    if(reason != "destructor") {
        let sss = this.sss;
        let cssURI = this.cssURI;
        if(sss.sheetRegistered(cssURI, sss.USER_SHEET))
            sss.unregisterSheet(cssURI, sss.USER_SHEET);
    }
    cbjs_c2ppe.uninit();
};


CTPpe 2013-12-29
(-) showPluginUIEvenIfItsTooBig
(+) hidePluginNotifications

Выделить код

Код:

// CTPpe 2013-12-29

"use strict";

let _prefs = {
    "styles.enabled": true,
    "styles.useOldCSS": false,
    "styles.customHoverBackgroundColor": "",
    "styles.customHoverTextColor": "",
    "hidePluginNotifications": true,

    "timeout.add_to_handleClickToPlayEvent": false,
    "timeout.handleClickToPlayEvent": 100,

    // default
    "defaultBackgroundColor": "rgb(142,142,142)", // rgb(142,142,142)
    "defaultTextColor": "rgb(0,0,0)", // rgb(0,0,0)
};

let CTPpe = {
    _stylesLoaded: false,
    loadStyles: function() {
        if (this._stylesLoaded)
            return;
        this._stylesLoaded = true;
        let sss = this.sss;

        let cssURI = this.cssURI = this.makeCSSURI();
        if (!sss.sheetRegistered(cssURI, sss.USER_SHEET))
            sss.loadAndRegisterSheet(cssURI, sss.USER_SHEET);
    },
    unloadStyles: function() {
        if (!this._stylesLoaded)
            return;
        this._stylesLoaded = false;
        let sss = this.sss;
        if (sss.sheetRegistered(this.cssURI, sss.USER_SHEET))
            sss.unregisterSheet(this.cssURI, sss.USER_SHEET);
    },
    reloadStyles: function() {
        this.unloadStyles();
        this.loadStyles();
    },
    get sss() {
        delete this.sss;
        return this.sss = Components.classes["@mozilla.org/content/style-sheet-service;1"]
            .getService(Components.interfaces.nsIStyleSheetService);
    },
    makeCSSURI: function() {
        let cssStr;

        if (_prefs["styles.useOldCSS"]) {

            let clicktoplay_bgtexturePNG = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6N0FDQzM0RTJDMzU5MTFERjg1MTlGNThDQkY1RDlCQkYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6N0FDQzM0RTNDMzU5MTFERjg1MTlGNThDQkY1RDlCQkYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3QUNDMzRFMEMzNTkxMURGODUxOUY1OENCRjVEOUJCRiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3QUNDMzRFMUMzNTkxMURGODUxOUY1OENCRjVEOUJCRiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PpD58KwAAANLSURBVHjabFRZT1NBGD29vaW00IXiZWmDUESFAFGEBzUafTHxN5qYGI0vPGpIBB40SoEUCUshkrQUWcpWqF2gpXTBOd+lJIKTTGY7c+Z821hmI9v+cqUM3arDpmsolavgus5WB7ZyuSyjrusynpfOb2Bra42LifEJNDdqaHMDyWQSc+E5BLyQHovFEI1Gr9bzP+dxeHgoWMOlYXJiEqVSSdYWKiNRMltGoVCA1+OCQ4k4zhVRqVbgczlFUSqXh1WzotllR0GJTWdycDgcMNw6jk+qyGaz0CjPqSwi0eLSorzgUff5+npsXSmGdM65xzNilpeXkc/n5S45QqGQqYym+dtbBRTbKwjx7TYf7Dbg935OlHW1uVAsAVv7KVHU3erA4Qmwu3cAwzDQ4bv0Gf3iMP0rRDs7O6KgXpGlUinpnHMvkUgIRtOABqUqHo9LENgs4dWEn46NHxTFjL47HXLp11YWZ8Ui+oMGNAsQiSdRb7ej77Ybmbw6X99GS0uLUmhHIm0GSsNlo7PT6bSYxkai05MT1CnFuhUy5x4bMcTW0saqWI6OjmCZXtr0k/XhQK84em07J2aN9HcK0UI0iYtqFY/utypzgPDKJnw+H3o7XCqKwOLKGnp6etB5SzeVXVxc4HqjaXKmiK63/+H/8Vl0Ly/hf/l4UJxNRTTt2VBQgFMLG2hobMTQXQNnKqrfw6vo6urCvUAD9rPAzGwYeo2VCen1eiX8JKOzpZwq5jmJanvEuN3uqxKrKPE03TK1uOFnibx68USiGImnJPyvnw8KUPlUxqcPOmX88iOCQCCAwW4fcmfA+NcZDI8MI2jUKXJVpMFgUErEo8BMSIIZfkaNL9JHNI2KeEYM2+k55C45xM8sheHeNqm10bGQZDZfZR59m41I1Jhb9BH3eNbT7hDsn3RW7pLjzccxs5xY/QeZstRak9ctmZ3MFCWPmj0N8upx5lR8ZHjsoohETqcTrR4dyVwVmUzGLKf3o2NS/VTAWqMfmNmMFPOInXPu8Syxuy9YEvEuv6CBYJOpjAubzXbjc2RmF8/NLLerDGbUrn+Otbv1Ns30GV/kf/Tp85hUPyPDqghNz0pmszOPuMczYoilabxLorfvPuCvAAMAakjBuDF4E1QAAAAASUVORK5CYII=";
            let videoClickToPlayButtonSVG = "data:image/svg+xml;base64,PCEtLSBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljCiAgIC0gTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpcwogICAtIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0idmlkZW9QbGF5QnV0dG9uT3ZlcmxheSIKICAgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pbllNaW4gbWVldCIKICAgdmlld0JveD0iMCAwIDY0IDY0Ij4KICA8ZGVmcz4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0id2hpdGVHcmFkaWVudFN0b3BzIj4KICAgICAgPHN0b3AgaWQ9IndoaXRlR3JhZGllbnRTdG9wMDEiIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5Oi45NSIgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcCBpZD0id2hpdGVHcmFkaWVudFN0b3AwMiIgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6Ljc1IiBvZmZzZXQ9Ii40NSIgLz4KICAgICAgPHN0b3AgaWQ9IndoaXRlR3JhZGllbnRTdG9wMDMiIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5Oi43MiIgb2Zmc2V0PSIuNTUiIC8+CiAgICAgIDxzdG9wIGlkPSJ3aGl0ZUdyYWRpZW50U3RvcDA0IiBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTouNjUiIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIzMiIKICAgICAgIHkxPSIwIgogICAgICAgeDI9IjMyIgogICAgICAgeTI9IjYyIgogICAgICAgaWQ9IndoaXRlR3JhZGllbnQiCiAgICAgICB4bGluazpocmVmPSIjd2hpdGVHcmFkaWVudFN0b3BzIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIC8+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImFycm93R3JhZGllbnRTdG9wcyI+CiAgICAgIDxzdG9wIGlkPSJhcnJvd0dyYWRpZW50U3RvcDAxIiBzdHlsZT0ic3RvcC1jb2xvcjojMzMzMzMzO3N0b3Atb3BhY2l0eTouNSIgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcCBpZD0iYXJyb3dHcmFkaWVudFN0b3AwMiIgc3R5bGU9InN0b3AtY29sb3I6IzY2NjY2NjtzdG9wLW9wYWNpdHk6LjUiIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIzMiIKICAgICAgIHkxPSIxNiIKICAgICAgIHgyPSIzMiIKICAgICAgIHkyPSI0OCIKICAgICAgIGlkPSJhcnJvd0dyYWRpZW50IgogICAgICAgeGxpbms6aHJlZj0iI2Fycm93R3JhZGllbnRTdG9wcyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGZpbHRlcgogICAgICAgeD0iLTAuMTUiCiAgICAgICB5PSItMC4xNSIKICAgICAgIHdpZHRoPSIxLjI1IgogICAgICAgaGVpZ2h0PSIxLjI1IgogICAgICAgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIgogICAgICAgaWQ9ImRyb3BTaGFkb3ciPgogICAgICA8ZmVHYXVzc2lhbkJsdXIKICAgICAgICAgcmVzdWx0PSJibHVyIgogICAgICAgICBzdGREZXZpYXRpb249IjIiCiAgICAgICAgIGluPSJTb3VyY2VBbHBoYSIKICAgICAgICAgaWQ9ImRyb3BTaGFkb3dCbHVyIiAvPgogICAgICA8ZmVDb2xvck1hdHJpeAogICAgICAgICB2YWx1ZXM9IjEgMCAwIDAgIDAKICAgICAgICAgICAgICAgICAwIDEgMCAwICAwCiAgICAgICAgICAgICAgICAgMCAwIDEgMCAgMAogICAgICAgICAgICAgICAgIDAgMCAwIC41IDAiCiAgICAgICAgIHR5cGU9Im1hdHJpeCIKICAgICAgICAgcmVzdWx0PSJibHVyYWxwaGEiCiAgICAgICAgIGlkPSJkcm9wU2hhZG93Q29sb3IiIC8+CiAgICAgIDxmZU9mZnNldAogICAgICAgICByZXN1bHQ9Im9mZnNldEJsdXIiCiAgICAgICAgIGR5PSIxIgogICAgICAgICBkeD0iMCIKICAgICAgICAgaW49ImJsdXJhbHBoYSIKICAgICAgICAgaWQ9ImRyb3BTaGFkb3dPZmZzZXQiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZQogICAgICAgICAgIGluPSJvZmZzZXRCbHVyIiAvPgogICAgICAgIDxmZU1lcmdlTm9kZQogICAgICAgICAgIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICAgIDxtYXNrIGlkPSJkcm9wU2hhZG93TWFzayI+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik00Ny4yODUsMzAuOTkxTDIzLjc1LDE3LjI0Yy0wLjM1Ny0wLjIwOC0wLjY5Mi0wLjI3OC0wLjk2OS0wLjIyMSBDMjIuMzIsMTcuMTE1LDIyLDE3LjU1NSwyMiwxOC4yNTJ2MjcuNDk5YzAsMS4xMTIsMC43OTcsMS41NjgsMS43NSwxLjAxMWwyMy41MzUtMTMuNzQ4QzQ4LjIzOCwzMi40NTgsNDguMjM4LDMxLjU0Nyw0Ny4yODUsMzAuOTkxIHogTTAsMHY2NGg2NFYwSDB6IE0zMiw2MEMxNi41MzYsNjAsNCw0Ny40NjQsNCwzMlMxNi41MzYsNCwzMiw0czI4LDEyLjUzNiwyOCwyOFM0Ny40NjQsNjAsMzIsNjB6IgogICAgICAgICBpZD0iZHJvcFNoYWRvd01hc2tQYXRoIgogICAgICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgPC9tYXNrPiAgICAgICAKICA8L2RlZnM+CiAgPHBhdGggCiAgICAgZD0iTTMyLDRDMTYuNTM2LDQsNCwxNi41MzYsNCwzMnMxMi41MzYsMjgsMjgsMjhzMjgtMTIuNTM2LDI4LTI4UzQ3LjQ2NCw0LDMyLDR6IE00Ny4yODUsMzMuMDE0IEwyMy43NSw0Ni43NjJDMjIuNzk3LDQ3LjMxOSwyMiw0Ni44NjMsMjIsNDUuNzUxdi0yNy41YzAtMC42OTcsMC4zMi0xLjEzNywwLjc4MS0xLjIzMmMwLjI3Ny0wLjA1OCwwLjYxMiwwLjAxMiwwLjk2OSwwLjIyMSBsMjMuNTM1LDEzLjc1MUM0OC4yMzgsMzEuNTQ2LDQ4LjIzOCwzMi40NTgsNDcuMjg1LDMzLjAxNHoiCiAgICAgbWFzaz0idXJsKCNkcm9wU2hhZG93TWFzaykiCiAgICAgaWQ9InBsYXlCdXR0b25TaGFkb3ciCiAgICAgc3R5bGU9ImZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7ZmlsdGVyOnVybCgjZHJvcFNoYWRvdykiIC8+CiAgPHBhdGgKICAgICBkPSJNMjIuNzgxLDE3LjAxOUMyMi4zMiwxNy4xMTQsMjIsMTcuNTU1LDIyLDE4LjI1MXYyNy41YzAsMS4xMTIsMC43OTcsMS41NjgsMS43NSwxLjAxMSBsMjMuNTM1LTEzLjc0OGMwLjk1My0wLjU1NiwwLjk1My0xLjQ2NywwLTIuMDIzTDIzLjc1LDE3LjI0QzIzLjM5MywxNy4wMzEsMjMuMDU4LDE2Ljk2MSwyMi43ODEsMTcuMDE5eiIKICAgICBpZD0icGxheUJ1dHRvbkFycm93IgogICAgIHN0eWxlPSJmaWxsOnVybCgjYXJyb3dHcmFkaWVudCk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+CiAgPHBhdGggCiAgICAgZD0iTTMyLDRDMTYuNTM2LDQsNCwxNi41MzYsNCwzMnMxMi41MzYsMjgsMjgsMjhzMjgtMTIuNTM2LDI4LTI4UzQ3LjQ2NCw0LDMyLDR6IE00Ny4yODUsMzMuMDE0IEwyMy43NSw0Ni43NjJDMjIuNzk3LDQ3LjMxOSwyMiw0Ni44NjMsMjIsNDUuNzUxdi0yNy41YzAtMC42OTcsMC4zMi0xLjEzNywwLjc4MS0xLjIzMmMwLjI3Ny0wLjA1OCwwLjYxMiwwLjAxMiwwLjk2OSwwLjIyMSBsMjMuNTM1LDEzLjc1MUM0OC4yMzgsMzEuNTQ2LDQ4LjIzOCwzMi40NTgsNDcuMjg1LDMzLjAxNHoiCiAgICAgaWQ9InBsYXlCdXR0b24iCiAgICAgc3R5bGU9ImZpbGw6dXJsKCN3aGl0ZUdyYWRpZW50KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICA8cGF0aAogICAgIGQ9Ik0zMiw0QzE2LjUzNiw0LDQsMTYuNTM2LDQsMzJzMTIuNTM2LDI4LDI4LDI4czI4LTEyLjUzNiwyOC0yOFM0Ny40NjQsNCwzMiw0eiBNMzIsNTlDMTcuMTEyLDU5LDUsNDYuODg4LDUsMzJTMTcuMTEyLDUsMzIsNXMyNywxMi4xMTIsMjcsMjdTNDYuODg4LDU5LDMyLDU5eiBNNDcuNzg5LDMwLjEyN2wtMjMuNTM0LTEzLjc1IEMyMy44MjYsMTYuMTI2LDIzLjM5NiwxNiwyMi45NzYsMTZjLTAuMTM1LDAtMC4yNywwLjAxNC0wLjM5OCwwLjA0MUMyMS42MiwxNi4yMzgsMjEsMTcuMTA2LDIxLDE4LjI1MXYyNy41IEMyMSw0Ny4wNzUsMjEuODEyLDQ4LDIyLjk3Nyw0OGMwLjQyMywwLDAuODU0LTAuMTI2LDEuMjc5LTAuMzc1TDQ3Ljc5LDMzLjg3N2MwLjc2OS0wLjQ0OSwxLjIxLTEuMTMyLDEuMjEtMS44NzUgUzQ4LjU1OSwzMC41NzYsNDcuNzg5LDMwLjEyN3ogTTQ3LjI4NSwzMy4wMTRMMjMuNzUsNDYuNzYyQzIzLjQ3NCw0Ni45MjQsMjMuMjExLDQ3LDIyLjk3Nyw0N0MyMi40MDIsNDcsMjIsNDYuNTQxLDIyLDQ1Ljc1MXYtMjcuNSBjMC0wLjY5NywwLjMyLTEuMTM3LDAuNzgxLTEuMjMyTDIyLjk3NiwxN2MwLjIzMywwLDAuNDk4LDAuMDc5LDAuNzc1LDAuMjRsMjMuNTM1LDEzLjc1MSBDNDguMjM4LDMxLjU0Niw0OC4yMzgsMzIuNDU4LDQ3LjI4NSwzMy4wMTR6IgogICAgIGlkPSJwbGF5QnV0dG9uRWRnZUhpZ2hsaWdodHMiCiAgICAgc3R5bGU9ImZpbGw6d2hpdGU7ZmlsbC1vcGFjaXR5Oi4zO3N0cm9rZTpub25lIiAvPgogIDxwYXRoCiAgICAgZD0iTTMyLDRDMTYuNTM2LDQsNCwxNi41MzYsNCwzMmMwLDAuMTY3LDAuMDEsMC4zMzMsMC4wMTMsMC41IEM0LjI4LDE3LjI2OCwxNi43MDQsNSwzMiw1YzE1LjI5NiwwLDI3LjcyLDEyLjI2OCwyNy45ODcsMjcuNUM1OS45OSwzMi4zMzMsNjAsMzIuMTY3LDYwLDMyQzYwLDE2LjUzNiw0Ny40NjQsNCwzMiw0eiBNNDcuMjg1LDMzLjAxNEwyMy43NSw0Ni43NjJDMjIuNzk3LDQ3LjMxOSwyMiw0Ni44NjMsMjIsNDUuNzUxdjFjMCwxLjExMiwwLjc5NywxLjU2OCwxLjc1LDEuMDExbDIzLjUzNS0xMy43NDggYzAuNjk3LTAuNDA2LDAuODc5LTEuMDAzLDAuNTU2LTEuNTEyQzQ3LjcyMywzMi42ODgsNDcuNTQxLDMyLjg2NCw0Ny4yODUsMzMuMDE0eiIKICAgICBpZD0icGxheUJ1dHRvblRvcEVkZ2VIaWdobGlnaHRzIgogICAgIHN0eWxlPSJmaWxsOndoaXRlO2ZpbGwtb3BhY2l0eTouODtzdHJva2U6bm9uZSIgLz4KPC9zdmc+Cg==";

            cssStr = '\
@namespace url(http://www.w3.org/1999/xhtml);\n\
@namespace xul url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);\n\
:-moz-handler-clicktoplay .icon {\n\
    opacity: 0.7;\n\
    background-image: url(' + clicktoplay_bgtexturePNG + '),\n\
                url(' + videoClickToPlayButtonSVG + ') !important;\n\
}\n\
:-moz-handler-clicktoplay .hoverBox:hover .icon {\n\
    opacity: 1 !important;\n\
}\n\
:-moz-handler-clicktoplay .mainBox {\n\
    background-color: hsla(0,0%,100%,.2) !important;\n\
    color: hsl(0,0%,35%) !important;\n\
    outline: 1px dashed hsla(0,0%,50%,0.5) !important;\n\
    outline-offset: -1px !important;\n\
}\n\
:-moz-handler-clicktoplay .mainBox:hover {\n\
    background-color: hsla(0,0%,90%,.7) !important;\n\
}\n\
:-moz-handler-clicktoplay .hoverBox:hover {\n\
    color: hsl(0,0%,20%) !important;\n\
}\n\
';
        } else {
            let setBgColor = _prefs["styles.customHoverBackgroundColor"];
            let setTColor= _prefs["styles.customHoverTextColor"];
            if (!setBgColor || setBgColor == "")
                setBgColor = _prefs["defaultBackgroundColor"];
            if (!setTColor || setTColor == "")
                setTColor = _prefs["defaultTextColor"];

            cssStr = '\
@namespace url(http://www.w3.org/1999/xhtml);\n\
@namespace xul url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);\n\
:-moz-handler-clicktoplay .mainBox:hover';
            cssStr += '\
 {\n\
    background-color: ' + setBgColor + ' !important;\n\
}\n\
:-moz-handler-clicktoplay .hoverBox:hover';
            cssStr += '\
 {\n\
    color: ' + setTColor + ' !important;\n\
}\n\
';
        }

        let hidePluginNotifications = _prefs["hidePluginNotifications"];
        if (hidePluginNotifications) {
            let pluginHidden = '\
\n\
xul|notification[value="plugin-hidden"] {\n\
    display: none !important;\n\
}\n\
';
            cssStr += pluginHidden;
        }
        return Services.io.newURI("data:text/css," + encodeURIComponent(cssStr), null, null);
    },

    handleEvent: function(event) {
        switch (event.type) {
            case "PluginBindingAttached":
                this.pluginBindingAttached(event);
                break;
        }
    },
    
    // fallback
    getPluginUI: function(plugin, doc) {
        return doc.getAnonymousElementByAttribute(plugin, "class", "mainBox") ||
                doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
    },

    pluginBindingAttached: function(event) {
        let eventType = event.type;

        if (eventType == "PluginRemoved") {
            return;
        }

        let plugin = event.target;
        let doc = plugin.ownerDocument;

        if (!(plugin instanceof Ci.nsIObjectLoadingContent))
            return;

        if (eventType == "PluginBindingAttached") {
            // The plugin binding fires this event when it is created.
            // As an untrusted event, ensure that this object actually has a binding
            // and make sure we don't handle it twice
            let overlay = gPluginHandler.getPluginUI(plugin, "main") ||
                            this.getPluginUI(plugin, doc);
            if (!overlay) {
                return;
            }

            // Lookup the handler for this binding
            eventType = gPluginHandler._getBindingType(plugin);
            if (!eventType) {
                // Not all bindings have handlers
                return;
            }
        }

        if (eventType == "PluginClickToPlay")
            this._handleClickToPlayEvent(plugin);
    },
    _handleClickToPlayEvent: function PH_handleClickToPlayEvent(aPlugin) {
        let doc = aPlugin.ownerDocument;
        let browser = gBrowser.getBrowserForDocument(doc.defaultView.top.document);
        let pluginHost = Cc["@mozilla.org/plugin/host;1"].getService(Ci.nsIPluginHost);
        let objLoadingContent = aPlugin.QueryInterface(Ci.nsIObjectLoadingContent);
        // guard against giving pluginHost.getPermissionStringForType a type
        // not associated with any known plugin
        if (!gPluginHandler.isKnownPlugin(objLoadingContent))
            return;
        /*let permissionString = pluginHost.getPermissionStringForType(objLoadingContent.actualType);
        let principal = doc.defaultView.top.document.nodePrincipal;
        let pluginPermission = Services.perms.testPermissionFromPrincipal(principal, permissionString);
        */
        let overlay = gPluginHandler.getPluginUI(aPlugin, "main") ||
                            this.getPluginUI(plugin, doc);
        /*
        if (pluginPermission == Ci.nsIPermissionManager.DENY_ACTION) {
            if (overlay) {
                overlay.classList.remove("visible");
            }
            return;
        }*/

        if (overlay) {
            overlay.addEventListener("click", CTPpe._overlayClickListener, true);
        }
    },
    _overlayClickListener: {
        handleEvent: function PH_handleOverlayClick(aEvent) {
            let plugin = document.getBindingParent(aEvent.target);
            let contentWindow = plugin.ownerDocument.defaultView.top;
            // gBrowser.getBrowserForDocument does not exist in the case where we
            // drag-and-dropped a tab from a window containing only that tab. In
            // that case, the window gets destroyed.
            let browser = gBrowser.getBrowserForDocument ?
                gBrowser.getBrowserForDocument(contentWindow.document) :
                null;
            // If browser is null here, we've been drag-and-dropped from another
            // window, and this is the wrong click handler.
            if (!browser) {
                aEvent.target.removeEventListener("click", CTPpe._overlayClickListener, true);
                return;
            }
            let objLoadingContent = plugin.QueryInterface(Ci.nsIObjectLoadingContent);
            // Have to check that the target is not the link to update the plugin
            if (!(aEvent.originalTarget instanceof HTMLAnchorElement) &&
                    (aEvent.originalTarget.getAttribute('anonid') != 'closeIcon') &&
                    aEvent.button == 0 && aEvent.isTrusted) {
                if (!window.gPluginHandler.canActivatePlugin(objLoadingContent))
                    return;
                if (objLoadingContent.pluginFallbackType ==
                        Ci.nsIObjectLoadingContent.PLUGIN_VULNERABLE_UPDATABLE ||
                        objLoadingContent.pluginFallbackType ==
                        Ci.nsIObjectLoadingContent.PLUGIN_VULNERABLE_NO_UPDATE)
                    return;
                objLoadingContent.playPlugin();
                aEvent.stopPropagation();
                aEvent.preventDefault();

                let cwu = contentWindow.QueryInterface(Ci.nsIInterfaceRequestor)
                        .getInterface(Ci.nsIDOMWindowUtils);
                let browser = gBrowser.getBrowserForDocument(contentWindow.document);
                let notification = PopupNotifications.getNotification("click-to-play-plugins", browser);
                if (notification) {
                    notification.remove();
                }
            }
        }
    }
};
if (_prefs["styles.enabled"])
    CTPpe.loadStyles();

gBrowser.addEventListener("PluginBindingAttached", CTPpe, true, true);

addDestructor(function (reason) {
    gBrowser.removeEventListener("PluginBindingAttached", CTPpe, true, true);
    CTPpe.unloadStyles();
}, this);

Отредактировано 2k1dmg (29-12-2013 15:11:03)

Отсутствует

 

№324-06-2014 18:55:52

Kamui
Участник
 
Группа: Members
Зарегистрирован: 31-03-2011
Сообщений: 1796
UA: Firefox 30.0

Re: [CB] Click to Play per-element

2k1dmg
Например здесь, первое видео не отображает значок и надпись Activate Adobe Flash. После обновления минуя кэш, появляется все.
Я конечно понимаю что это скорее всего из-за рутуба, но все же, можно что-то сделать?

okkamas_knife пишет:

я ставлю что в [firefox] 25 её уже поломают :dumb:.на крайняк в 26.

Проиграл, все три кода на этой странице которые, работают.

Отсутствует

 

№425-06-2014 12:03:24

2k1dmg
Участник
 
Группа: Members
Зарегистрирован: 06-04-2011
Сообщений: 190
UA: Firefox 30.0

Re: [CB] Click to Play per-element

Kamui пишет:

не отображает значок и надпись Activate Adobe Flash

я уже давно пробовал исправить, но не смог.

Kamui пишет:

это скорее всего из-за рутуба

и ещё из-за того, что так сделали разработчики [firefox] gecko-dev / browser / base / content / browser-plugins.js

Отсутствует

 

№519-09-2014 16:41:52

turbot
Участник
 
Группа: Members
Зарегистрирован: 09-10-2011
Сообщений: 2529
UA: Firefox 35.0

Re: [CB] Click to Play per-element

Перестало работать в последней Nightly (35.0a1 BuildID: 20140917114326). И в обычном и в e10s режиме.

Отсутствует

 

№620-10-2014 17:49:57

wolwerine
╒╤╬╧╣╠═╝
 
Группа: Members
Зарегистрирован: 15-04-2009
Сообщений: 159
UA: Firefox 35.0

Re: [CB] Click to Play per-element

turbot пишет:

Перестало работать в последней Nightly (35.0a1 BuildID: 20140917114326). И в обычном и в e10s режиме.

Подтверждаю, с 35 версии уже не работает.

Отсутствует

 

№720-10-2014 18:28:03

turbot
Участник
 
Группа: Members
Зарегистрирован: 09-10-2011
Сообщений: 2529
UA: Firefox 36.0

Re: [CB] Click to Play per-element

Есть аддон, от (я так понимаю) этого же автора, работающий.

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2011 Mozilla Russia
Язык отображения форума: [Русский] [English]