window.state ='fullscreen'来自后台脚本应该有效吗?

时间:2016-04-18 20:30:31

标签: ubuntu firefox-addon fullscreen firefox-webextensions

在这里使用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偏好可能是罪魁祸首吗?

  5. 相关的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 );
    

2 个答案:

答案 0 :(得分:1)

唉...我刚刚遇到了windows.update()方法,当我尝试通过state参数对象设置updateInfo时,做了给出了注意:

  

对于windows.update参数updateInfo(Firefox不支持属性“state”)的类型错误

那太可怜了。

答案 1 :(得分:1)

这是2018年,代码库发生了变化。如果您正在使用Firefox Quantum,那么windows.update()现在可以按预期运行。这是一个简单的例子:

的manifest.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>"]
}

messagesender.js:

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

messagereciever.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"})
}