window.screenX和window.screen.availLeft在Chrome扩展程序中均为0

时间:2016-04-22 08:24:42

标签: google-chrome google-chrome-extension

我正在编写一个Chrome扩展程序,用于在单击按钮时调整当前窗口的大小并重新定位,它用于重新定位显示窗口的当前监视器上的窗口。它旨在使当前的Chrome窗口填充当前的监视器,但没有最大化。

这是我的代码:

function start(tab) {
    // Type: `(tab: tabs.Tab): void`
    // `tabs.Tab`: https://developer.chrome.com/extensions/tabs#type-Tab

    chrome.windows.getCurrent( getCurrentWindowCallback );
}

function getCurrentWindowCallback( currentWindow ) {
    // Type: `(window: Window): void`
    // `Window`: https://developer.chrome.com/extensions/windows#type-Window

    if( !'id' in currentWindow ) return;

    var s = window.screen;

    var newState = {
        left: s.availLeft,
        top: s.availTop,
        width: s.width,
        height: s.availHeight,
        state: "normal"
    };

    chrome.windows.update(
        /*windowId:*/ currentWindow.id,
        /*updateInfo: */ newState,
        /*callback: */ null
    );
}

chrome.browserAction.onClicked.addListener( start );

但是,当我运行此功能时,window.screen的值始终与我计算机上的第一台显示器相对应,无论当前Chrome浏览器窗口所在的屏幕是什么。

{ availLeft: 0, availTop: 0, width: 1920, availHeight: 1170 }

currentWindow对象是一个特殊的Chrome扩展程序API对象,不会共享全局screen对象所具有的window属性。我怀疑这是因为window指的是后台脚本执行的隐藏窗口。

是否可以在不需要DOM权限/访问权限的情况下获取当前Chrome浏览器窗口的screen对象?

1 个答案:

答案 0 :(得分:1)

我通过使用chrome.tabs.executeScript运行一个脚本来解决这个问题,该脚本从当前窗口复制window.screen对象并将其传递回我的脚本以重新定位并调整窗口大小:

var getScreenScript = `var screenInfo = {
    screen: {
        availTop   : window.screen.availTop,
        availLeft  : window.screen.availLeft,
        availHeight: window.screen.availHeight,
        availWidth : window.screen.availWidth,
        colorDepth : window.screen.colorDepth,
        height     : window.screen.height,
        left       : window.screen.left,
        orientation: window.screen.orientation,
        pixelDepth : window.screen.pixelDepth,
        top        : window.screen.top,
        width      : window.screen.width
    },
    screenX   : window.screenX,
    screenY   : window.screenY,
    screenLeft: window.screenLeft,
    screenTop : window.screenTop,
}; screenInfo`;

function start(tab) {
    // Type: `(tab: tabs.Tab): void`
    // `tabs.Tab`: https://developer.chrome.com/extensions/tabs#type-Tab

    if( !'id' in tab ) return;

    // Ensure the `tabId` is set, otherwise I got permissions errors.
    chrome.tabs.executeScript( /*tabId:*/ tab.id, { code: getScreenScript }, getScreenScriptResultCallback );
}

function getScreenScriptResultCallback( args ) {

    var screenInfo = args[0];

    chrome.windows.getCurrent( function(currentWindow) {

        if( !'id' in currentWindow ) return;

        transformWindow( currentWindow, screenInfo );
    } );
}

function transformWindow( currentWindow, screenInfo ) {
    // Type: `(currentWindow: Window, screenInfo: object): void`
    // `Window`: https://developer.chrome.com/extensions/windows#type-Window

    var newState = {
        left  : screenInfo.screen.availLeft, // `availLeft` is the X coordinate of the current screen in the multi-mon workspace.
        top   : screenInfo.screen.availTop,
        width : screenInfo.screen.availWidth,
        height: screenInfo.screen.availHeight,
        state: "normal"
    };

    chrome.windows.update( currentWindow.id, newState, /*callback: */ null );
}

chrome.browserAction.onClicked.addListener( start );