Должен ли работать window.state = 'fullscreen' из фонового скрипта?

Работа с Xubuntu 14.04 и Firefox 45.0.1 здесь

Я пытаюсь автоматически перевести окно браузера в полноэкранное состояние из фонового скрипта, если location.hash == "#fullscreen".

Это запрашивается из сценария привилегированной веб-страницы путем выполнения postMessage(), который прослушивает сценарий содержимого, который, в свою очередь, делегирует этот запрос фоновому сценарию.

Все работает, как и ожидалось, включая ожидаемые значения console.log() в background.js (см. соответствующие фрагменты исходного кода ниже)... за исключением того, что окно не становится полноэкранным; на самом деле ничего не происходит, также нет предупреждения консоли о необходимости инициированного пользователем события, которое я получил бы, если бы попробовал что-то подобное с самой веб-страницы (именно поэтому я обратился к созданию этого расширения в первом место). Например, попытка w.state = 'minimized' тоже ничего не дает.

Вопросы:

  1. Предполагается ли, что Firefox WebExtensions API поддерживает window.state изменений (уже)?

  2. Если да, то должен ли Firefox WebExtensions API иметь достаточно привилегий, чтобы запускать полноэкранный режим без явного взаимодействия с пользователем?

  3. Если да, следует ли мне разрешить делать это из контекста, в котором я пытаюсь это сделать?

  4. Может быть, виноват (X) ubuntu или любое другое предпочтение Firefox?


Соответствующие manifest.json данные:

"background": {
  "scripts": ["background.js"]
},

"content_scripts": [
  {
    "matches": ["*://privilegeduri/*"],
    "js": ["jquery-1.11.3.min.js", "content.js"],
    "run_at": "document_start"
  }
],

// I've tried without "fullscreen" as well
"permissions": [
  "tabs",
  "fullscreen", // no mention of this on MDN, but I tried it anyway
  "webNavigation"
]

Сценарий привилегированной веб-страницы:

if( location.hash == '#fullscreen' ) {
  if( hasExtension() ) { // function that evaluates whether my extension is installed
    window.postMessage( {
      action: 'requestFullscreen'
    }, 'http://privilegeduri' );
  }
}

Скрипт content.js:

function receiveMessage( e ) {
  if( e.source === window && e.origin === 'http://privilegeduri' ) {
    switch( e.data.action ) {
      case 'requestFullscreen':
        chrome.runtime.sendMessage( e.data );
      break;
    }
  }
}

window.addEventListener( 'message', receiveMessage );

Скрипт background.js:

function receiveMessage( message, sender, sendResponse ) {
  if( sender.id === chrome.runtime.id && sender.url.match( /^http:\/\/privilegeduri/ ) ) {
    switch( message.action ) {
      case 'requestFullscreen':
        browser.windows.get( sender.tab.windowId, {}, function( w ) {
          console.log( w.state ); // outputs 'normal'
          w.state = 'fullscreen';
          console.log( w.state ); // outputs the expected value 'fullscreen'
        } );
      break;
    }
  }
}

chrome.runtime.onMessage.addListener( receiveMessage );

person Decent Dabbler    schedule 18.04.2016    source источник
comment
Пробовали ли вы полноэкранный API html5 — developer.mozilla.org/en- США/документы/Интернет/API/Fullscreen_API - ?   -  person Noitidart    schedule 22.04.2016
comment
@Noitidart Да, в конце концов я заставил его работать с полноэкранным API. Однако только в рамках надстройки без перезапуска (самозагрузки). Причина, по которой я начал разработку этого расширения, заключалась в том, что полноэкранный API ограничен инициацией пользователя внутри веб-страниц. Однако, к сожалению, API WebExtensions также не имеет повышенных привилегий в этом отношении. :( Итак, после неудачи с моим примером OP, мои последние надежды были возложены на устаревший XPCOM API без перезапуска, который, к счастью, имеет повышенные привилегии для автономной полноэкранной активации. :-)   -  person Decent Dabbler    schedule 22.04.2016
comment
@Noitidart PS.: есть about:config предпочтение full-screen-api.allow-trusted-requests-only, которое также может повысить привилегии полноэкранного API, но это будет означать, что я открою пользователям моего дополнения доступ к любому веб-сайту, имеющему эту привилегию, и я не не хочу делать это с моими пользователями, конечно. :-) Я хочу, чтобы эта привилегия была только у моего собственного веб-сайта.   -  person Decent Dabbler    schedule 22.04.2016
comment
Спасибо, что поделился! Из аддона jpm вы можете сделать то же самое, getMostRecentWindow().fullScreen = true;   -  person Noitidart    schedule 22.04.2016
comment
@Noitidart Спасибо за это предложение! Я только что попробовал, и ты прав. Однако, похоже, это немного другой тип полноэкранного режима (тип ‹kbd›F11‹/kbd›). Поскольку мой веб-сайт также позволяет пользователю инициировать вход и выход из полноэкранного режима (с API html5), это конфликтует с этой функциональностью, поскольку ‹kbd›ESC‹/kbd› не работает с ‹kbd›F11‹/kbd› -тип полноэкранного режима. Но в любом случае приятно знать об этой полноэкранной возможности.   -  person Decent Dabbler    schedule 22.04.2016
comment
О, очень классное наблюдение, я не знал об этом, спасибо!   -  person Noitidart    schedule 22.04.2016


Ответы (2)


Арх... Я только что наткнулся на windows.update() метод, и когда я попытался установить state через объект параметра updateInfo, он действительно выдал уведомление:

Ошибка типа для параметра updateInfo (свойство «состояние» не поддерживается Firefox) для windows.update

Какая жалость.

person Decent Dabbler    schedule 18.04.2016

сейчас 2018 год, и кодовая база изменилась. Если вы работаете с Firefox Quantum, то windows.update () теперь работает как задумано. Вот краткий пример:

манифест.json:

{
  "manifest_version": 2,
  "name": "WootFullscreen",
  "version": "9000.0.0.1",
  "description": "Sends woot, gets fullscreen.",
  "author": "Mekronid",
  "content_scripts": [
  {
    "matches": ["<all_urls>"], 
    "js": ["messagesender.js"]
  }
  ],
  "background": {
    "scripts": ["messagereciever.js"]
  },
"permissions": ["tabs", "<all_urls>"]
}

сообщенияender.js:

browser.runtime.sendMessage({message: "woot"})

messagereceiver.js:

browser.runtime.onMessage.addListener(listener)

async function listener(findWoot) {
    console.log(findWoot.message)
    var val = await browser.windows.getCurrent()
    browser.windows.update(val.id, { state: "fullscreen"})
}
person Community    schedule 18.05.2018