mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-23 09:52:26 +01:00
ef1b1d5738
* Fix popup/notification when browser is in fullscreen, primarily on OSX. The issue was reported internally via Slack. User was running Mac OSX Chrome in fullscreen mode where Chrome is created in a new Desktop workspace. The issue reproduced on OSX Chrome in fullscreen/maximized view overrides the explicitly set width and height for `windows.create()`. Possibly not overrides, but creates a window based off of the window that it was created from. Found a related [Chromium bug](https://bugs.chromium.org/p/chromium/issues/detail?id=263092&q=window%20create%20width%20os%3DMac&can=2). The fullscreen `popup.left` pixel will calculate the window position incorrectly since we set and assume the width of the created window. The incorrect `left` position the window and transition the focus Desktop/Workspace incorrectly and make is seem to lose focus of the new window/workspace. Incidentally this will make the popup full width/height, and create a new workspace for the view, which we have no control over until Chrome fixes it. This will check if the popup is 'fullscreen', which it gets passed from the origin window, if so then don't reposition the window. If Chrome fixes the issue we can revert this change. * Feedback commit Co-authored-by: Mark Stacey <markjstacey@gmail.com> Co-authored-by: Mark Stacey <markjstacey@gmail.com>
94 lines
2.8 KiB
JavaScript
94 lines
2.8 KiB
JavaScript
import ExtensionPlatform from '../platforms/extension'
|
|
|
|
const NOTIFICATION_HEIGHT = 620
|
|
const NOTIFICATION_WIDTH = 360
|
|
|
|
export default class NotificationManager {
|
|
|
|
/**
|
|
* A collection of methods for controlling the showing and hiding of the notification popup.
|
|
*
|
|
* @typedef {Object} NotificationManager
|
|
*
|
|
*/
|
|
|
|
constructor () {
|
|
this.platform = new ExtensionPlatform()
|
|
}
|
|
|
|
/**
|
|
* Either brings an existing MetaMask notification window into focus, or creates a new notification window. New
|
|
* notification windows are given a 'popup' type.
|
|
*
|
|
*/
|
|
async showPopup () {
|
|
const popup = await this._getPopup()
|
|
|
|
// Bring focus to chrome popup
|
|
if (popup) {
|
|
// bring focus to existing chrome popup
|
|
await this.platform.focusWindow(popup.id)
|
|
} else {
|
|
let left = 0
|
|
let top = 0
|
|
try {
|
|
const lastFocused = await this.platform.getLastFocusedWindow()
|
|
// Position window in top right corner of lastFocused window.
|
|
top = lastFocused.top
|
|
left = lastFocused.left + (lastFocused.width - NOTIFICATION_WIDTH)
|
|
} catch (_) {
|
|
// The following properties are more than likely 0, due to being
|
|
// opened from the background chrome process for the extension that
|
|
// has no physical dimensions
|
|
const { screenX, screenY, outerWidth } = window
|
|
top = Math.max(screenY, 0)
|
|
left = Math.max(screenX + (outerWidth - NOTIFICATION_WIDTH), 0)
|
|
}
|
|
|
|
// create new notification popup
|
|
const popupWindow = await this.platform.openWindow({
|
|
url: 'notification.html',
|
|
type: 'popup',
|
|
width: NOTIFICATION_WIDTH,
|
|
height: NOTIFICATION_HEIGHT,
|
|
left,
|
|
top,
|
|
})
|
|
|
|
// Firefox currently ignores left/top for create, but it works for update
|
|
if (popupWindow.left !== left && popupWindow.state !== 'fullscreen') {
|
|
await this.platform.updateWindowPosition(popupWindow.id, left, top)
|
|
}
|
|
this._popupId = popupWindow.id
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Checks all open MetaMask windows, and returns the first one it finds that is a notification window (i.e. has the
|
|
* type 'popup')
|
|
*
|
|
* @private
|
|
* @param {Function} cb - A node style callback that to which the found notification window will be passed.
|
|
*
|
|
*/
|
|
async _getPopup () {
|
|
const windows = await this.platform.getAllWindows()
|
|
return this._getPopupIn(windows)
|
|
}
|
|
|
|
/**
|
|
* Given an array of windows, returns the 'popup' that has been opened by MetaMask, or null if no such window exists.
|
|
*
|
|
* @private
|
|
* @param {array} windows - An array of objects containing data about the open MetaMask extension windows.
|
|
*
|
|
*/
|
|
_getPopupIn (windows) {
|
|
return windows ? windows.find((win) => {
|
|
// Returns notification popup
|
|
return (win && win.type === 'popup' && win.id === this._popupId)
|
|
}) : null
|
|
}
|
|
|
|
}
|