2

在此处使用 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 );
4

2 回答 2

1

啊......我刚刚遇到了这个windows.update()方法,当我尝试state通过updateInfo参数对象设置它时,它确实给出了一个通知:

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

真遗憾。

于 2016-04-18T20:56:18.640 回答
1

现在是 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>"]
}

消息发送器.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"})
}
于 2018-05-18T01:03:34.547 回答