diff --git a/app/browser/reducers/windowsReducer.js b/app/browser/reducers/windowsReducer.js index 358ca04b709..233bdc4132b 100644 --- a/app/browser/reducers/windowsReducer.js +++ b/app/browser/reducers/windowsReducer.js @@ -4,12 +4,280 @@ 'use strict' +const path = require('path') +const assert = require('assert') +const Immutable = require('immutable') const appConstants = require('../../../js/constants/appConstants') const windowConstants = require('../../../js/constants/windowConstants') const windowState = require('../../common/state/windowState') const windows = require('../windows') const sessionStoreShutdown = require('../../sessionStoreShutdown') -const {makeImmutable} = require('../../common/state/immutableUtil') +const {makeImmutable, isImmutable} = require('../../common/state/immutableUtil') +const electron = require('electron') +const BrowserWindow = electron.BrowserWindow +const firstDefinedValue = require('../../../js/lib/functional').firstDefinedValue +const appConfig = require('../../../js/constants/appConfig') +const messages = require('../../../js/constants/messages') +const appUrlUtil = require('../../../js/lib/appUrlUtil') +const settings = require('../../../js/constants/settings') +const getSetting = require('../../../js/settings').getSetting +const {zoomLevel} = require('../../common/constants/toolbarUserInterfaceScale') +const platformUtil = require('../../common/lib/platformUtil') +const {initWindowCacheState} = require('../../sessionStoreShutdown') + +const isDarwin = platformUtil.isDarwin() +const isWindows = platformUtil.isWindows() + +// TODO cleanup all this createWindow crap +function isModal (browserOpts) { + // this needs some better checks + return browserOpts.scrollbars === false +} + +const navbarHeight = () => { + // TODO there has to be a better way to get this or at least add a test + return 75 +} + +/** + * Determine window dimensions (width / height) + */ +const setWindowDimensions = (browserOpts, defaults, immutableWindowState) => { + assert(isImmutable(immutableWindowState)) + if (immutableWindowState.getIn(['ui', 'size'])) { + browserOpts.width = firstDefinedValue(browserOpts.width, immutableWindowState.getIn(['ui', 'size', 0])) + browserOpts.height = firstDefinedValue(browserOpts.height, immutableWindowState.getIn(['ui', 'size', 1])) + } + browserOpts.width = firstDefinedValue(browserOpts.width, browserOpts.innerWidth, defaults.width) + // height and innerHeight are the frame webview size + browserOpts.height = firstDefinedValue(browserOpts.height, browserOpts.innerHeight) + if (typeof browserOpts.height === 'number') { + // add navbar height to get total height for BrowserWindow + browserOpts.height = browserOpts.height + navbarHeight() + } else { + // no inner height so check outer height or use default + browserOpts.height = firstDefinedValue(browserOpts.outerHeight, defaults.height) + } + return browserOpts +} + +/** + * Determine window position (x / y) + */ +const setWindowPosition = (browserOpts, defaults, immutableWindowState) => { + if (browserOpts.positionByMouseCursor) { + const screenPos = electron.screen.getCursorScreenPoint() + browserOpts.x = screenPos.x + browserOpts.y = screenPos.y + } else if (immutableWindowState.getIn(['ui', 'position'])) { + // Position comes from window state + browserOpts.x = firstDefinedValue(browserOpts.x, immutableWindowState.getIn(['ui', 'position', 0])) + browserOpts.y = firstDefinedValue(browserOpts.y, immutableWindowState.getIn(['ui', 'position', 1])) + } else if (typeof defaults.x === 'number' && typeof defaults.y === 'number') { + // Position comes from the default position + browserOpts.x = firstDefinedValue(browserOpts.x, defaults.x) + browserOpts.y = firstDefinedValue(browserOpts.y, defaults.y) + } else { + // Default the position + browserOpts.x = firstDefinedValue(browserOpts.x, browserOpts.left, browserOpts.screenX) + browserOpts.y = firstDefinedValue(browserOpts.y, browserOpts.top, browserOpts.screenY) + } + return browserOpts +} + +function windowDefaults (state) { + return { + show: false, + width: state.getIn(['defaultWindowParams', 'width']) || state.get('defaultWindowWidth'), + height: state.getIn(['defaultWindowParams', 'height']) || state.get('defaultWindowHeight'), + x: state.getIn(['defaultWindowParams', 'x']) || undefined, + y: state.getIn(['defaultWindowParams', 'y']) || undefined, + minWidth: 480, + minHeight: 300, + minModalHeight: 100, + minModalWidth: 100, + windowOffset: 20, + webPreferences: { + sharedWorker: true, + nodeIntegration: false, + partition: 'default', + webSecurity: false, + allowFileAccessFromFileUrls: true, + allowUniversalAccessFromFileUrls: true + } + } +} + +/** + * set the default width and height if they + * haven't been initialized yet + */ +function setDefaultWindowSize (state) { + if (!state) { + return + } + const screen = electron.screen + const primaryDisplay = screen.getPrimaryDisplay() + if (!state.getIn(['defaultWindowParams', 'width']) && !state.get('defaultWindowWidth') && + !state.getIn(['defaultWindowParams', 'height']) && !state.get('defaultWindowHeight')) { + state = state.setIn(['defaultWindowParams', 'width'], primaryDisplay.workAreaSize.width) + state = state.setIn(['defaultWindowParams', 'height'], primaryDisplay.workAreaSize.height) + } + + return state +} + +const createWindow = (state, action) => { + const frameOpts = (action.get('frameOpts') || Immutable.Map()).toJS() + let browserOpts = (action.get('browserOpts') || Immutable.Map()).toJS() + const immutableWindowState = action.get('restoredState') || Immutable.Map() + state = setDefaultWindowSize(state) + const defaults = windowDefaults(state) + + browserOpts = setWindowDimensions(browserOpts, defaults, immutableWindowState) + browserOpts = setWindowPosition(browserOpts, defaults, immutableWindowState) + + delete browserOpts.left + delete browserOpts.top + + const screen = electron.screen + const primaryDisplay = screen.getPrimaryDisplay() + const parentWindowKey = browserOpts.parentWindowKey + const parentWindow = parentWindowKey ? BrowserWindow.fromId(parentWindowKey) : BrowserWindow.getFocusedWindow() + const bounds = parentWindow ? parentWindow.getBounds() : primaryDisplay.bounds + + // position on screen should be relative to focused window + // or the primary display if there is no focused window + const display = screen.getDisplayNearestPoint(bounds) + + // if no parentWindow, x, y or center is defined then go ahead + // and center it if it's smaller than the display width + // typeof and isNaN are used because 0 is falsey + if (!(parentWindow || + browserOpts.center === false || + browserOpts.x > 0 || + browserOpts.y > 0) && + browserOpts.width < display.bounds.width) { + browserOpts.center = true + } else { + browserOpts.center = false + // don't offset if focused window is at least as big as the screen it's on + if (bounds.width >= display.bounds.width && bounds.height >= display.bounds.height) { + browserOpts.x = firstDefinedValue(browserOpts.x, display.bounds.x) + browserOpts.y = firstDefinedValue(browserOpts.y, display.bounds.y) + } else { + browserOpts.x = firstDefinedValue(browserOpts.x, bounds.x + defaults.windowOffset) + browserOpts.y = firstDefinedValue(browserOpts.y, bounds.y + defaults.windowOffset) + } + + // make sure the browser won't be outside the viewable area of any display + // negative numbers aren't allowed so we don't need to worry about that + const displays = screen.getAllDisplays() + const maxX = Math.max(...displays.map((display) => { return display.bounds.x + display.bounds.width })) + const maxY = Math.max(...displays.map((display) => { return display.bounds.y + display.bounds.height })) + + browserOpts.x = Math.min(browserOpts.x, maxX - defaults.windowOffset) + browserOpts.y = Math.min(browserOpts.y, maxY - defaults.windowOffset) + } + + const minWidth = isModal(browserOpts) ? defaults.minModalWidth : defaults.minWidth + const minHeight = isModal(browserOpts) ? defaults.minModalHeight : defaults.minHeight + + // min width and height don't seem to work when the window is first created + browserOpts.width = browserOpts.width < minWidth ? minWidth : browserOpts.width + browserOpts.height = browserOpts.height < minHeight ? minHeight : browserOpts.height + + const autoHideMenuBarSetting = isDarwin || getSetting(settings.AUTO_HIDE_MENU) + + const windowProps = { + // smaller min size for "modal" windows + minWidth, + minHeight, + // Neither a frame nor a titlebar + // frame: false, + // A frame but no title bar and windows buttons in titlebar 10.10 OSX and up only? + titleBarStyle: 'hidden-inset', + autoHideMenuBar: autoHideMenuBarSetting, + title: appConfig.name, + webPreferences: defaults.webPreferences, + frame: !isWindows + } + + if (process.platform === 'linux') { + windowProps.icon = path.join(__dirname, '..', '..', 'res', 'app.png') + } + + const homepageSetting = getSetting(settings.HOMEPAGE) + const startupSetting = getSetting(settings.STARTUP_MODE) + const toolbarUserInterfaceScale = getSetting(settings.TOOLBAR_UI_SCALE) + + setImmediate(() => { + let mainWindow = new BrowserWindow(Object.assign(windowProps, browserOpts, {disposition: frameOpts.disposition})) + let restoredImmutableWindowState = action.get('restoredState') + initWindowCacheState(mainWindow.id, restoredImmutableWindowState) + + // initialize frames state + let frames = Immutable.List() + if (restoredImmutableWindowState) { + frames = restoredImmutableWindowState.get('frames') + restoredImmutableWindowState = restoredImmutableWindowState.set('frames', Immutable.List()) + restoredImmutableWindowState = restoredImmutableWindowState.set('tabs', Immutable.List()) + } else { + if (frameOpts && Object.keys(frameOpts).length > 0) { + if (frameOpts.forEach) { + frames = Immutable.fromJS(frameOpts) + } else { + frames = frames.push(Immutable.fromJS(frameOpts)) + } + } else if (startupSetting === 'homePage' && homepageSetting) { + frames = Immutable.fromJS(homepageSetting.split('|').map((homepage) => { + return { + location: homepage + } + })) + } + } + + if (frames.size === 0) { + frames = Immutable.fromJS([{}]) + } + + if (immutableWindowState.getIn(['ui', 'isMaximized'])) { + mainWindow.maximize() + } + + if (immutableWindowState.getIn(['ui', 'isFullScreen'])) { + mainWindow.setFullScreen(true) + } + + mainWindow.webContents.on('did-finish-load', (e) => { + const appStore = require('../../../js/stores/appStore') + mainWindow.webContents.setZoomLevel(zoomLevel[toolbarUserInterfaceScale] || 0.0) + + const mem = muon.shared_memory.create({ + windowValue: { + disposition: frameOpts.disposition, + id: mainWindow.id + }, + appState: appStore.getLastEmittedState().toJS(), + frames: frames.toJS(), + windowState: (restoredImmutableWindowState && restoredImmutableWindowState.toJS()) || undefined}) + + e.sender.sendShared(messages.INITIALIZE_WINDOW, mem) + if (action.cb) { + action.cb() + } + }) + + mainWindow.on('ready-to-show', () => { + mainWindow.show() + }) + + mainWindow.loadURL(appUrlUtil.getBraveExtIndexHTML()) + }) + + return state +} const windowsReducer = (state, action, immutableAction) => { action = immutableAction || makeImmutable(action) @@ -17,6 +285,9 @@ const windowsReducer = (state, action, immutableAction) => { case appConstants.APP_SET_STATE: state = windows.init(state, action) break + case appConstants.APP_NEW_WINDOW: + state = createWindow(state, action) + break case appConstants.APP_WINDOW_READY: windows.windowReady(action.get('windowId')) break diff --git a/js/stores/appStore.js b/js/stores/appStore.js index 7eb844ddd83..55313780011 100644 --- a/js/stores/appStore.js +++ b/js/stores/appStore.js @@ -7,26 +7,22 @@ const appConstants = require('../constants/appConstants') const windowConstants = require('../constants/windowConstants') const ExtensionConstants = require('../../app/common/constants/extensionConstants') const AppDispatcher = require('../dispatcher/appDispatcher') -const appConfig = require('../constants/appConfig') const settings = require('../constants/settings') const {STATE_SITES} = require('../constants/stateConstants') const syncUtil = require('../state/syncUtil') const siteSettings = require('../state/siteSettings') -const appUrlUtil = require('../lib/appUrlUtil') const electron = require('electron') const app = electron.app const messages = require('../constants/messages') const UpdateStatus = require('../constants/updateStatus') const BrowserWindow = electron.BrowserWindow const syncActions = require('../actions/syncActions') -const firstDefinedValue = require('../lib/functional').firstDefinedValue const dates = require('../../app/dates') -const getSetting = require('../settings').getSetting const EventEmitter = require('events').EventEmitter const Immutable = require('immutable') +const path = require('path') const diff = require('immutablediff') const debounce = require('../lib/debounce') -const path = require('path') const autofill = require('../../app/autofill') const nativeImage = require('../../app/nativeImage') const filtering = require('../../app/filtering') @@ -36,11 +32,10 @@ const {calculateTopSites} = require('../../app/browser/api/topSites') const assert = require('assert') const profiles = require('../../app/browser/profiles') const {zoomLevel} = require('../../app/common/constants/toolbarUserInterfaceScale') -const {initWindowCacheState} = require('../../app/sessionStoreShutdown') const {HrtimeLogger} = require('../../app/common/lib/logUtil') // state helpers -const {isImmutable, makeImmutable} = require('../../app/common/state/immutableUtil') +const {makeImmutable} = require('../../app/common/state/immutableUtil') const basicAuthState = require('../../app/common/state/basicAuthState') const extensionState = require('../../app/common/state/extensionState') const aboutNewTabState = require('../../app/common/state/aboutNewTabState') @@ -51,29 +46,14 @@ const bookmarkFoldersState = require('../../app/common/state/bookmarkFoldersStat const historyState = require('../../app/common/state/historyState') const urlUtil = require('../lib/urlutil') -const isDarwin = process.platform === 'darwin' -const isWindows = process.platform === 'win32' - // Only used internally const CHANGE_EVENT = 'app-state-change' const defaultProtocols = ['https', 'http'] let appState = null -let lastEmittedState let initialized = false -// TODO cleanup all this createWindow crap -function isModal (browserOpts) { - // this needs some better checks - return browserOpts.scrollbars === false -} - -const navbarHeight = () => { - // TODO there has to be a better way to get this or at least add a test - return 75 -} - /** * Enable reducer logging with env var REDUCER_TIME_LOG_THRESHOLD={time in ns} * Log format: `{unix timestamp (ms)},{label},{run time (ns)}` @@ -87,216 +67,26 @@ if (SHOULD_LOG_TIME) { } const timeLogger = new HrtimeLogger(TIME_LOG_PATH, TIME_LOG_THRESHOLD) -/** - * Determine window dimensions (width / height) - */ -const setWindowDimensions = (browserOpts, defaults, immutableWindowState) => { - assert(isImmutable(immutableWindowState)) - if (immutableWindowState.getIn(['ui', 'size'])) { - browserOpts.width = firstDefinedValue(browserOpts.width, immutableWindowState.getIn(['ui', 'size', 0])) - browserOpts.height = firstDefinedValue(browserOpts.height, immutableWindowState.getIn(['ui', 'size', 1])) - } - browserOpts.width = firstDefinedValue(browserOpts.width, browserOpts.innerWidth, defaults.width) - // height and innerHeight are the frame webview size - browserOpts.height = firstDefinedValue(browserOpts.height, browserOpts.innerHeight) - if (typeof browserOpts.height === 'number') { - // add navbar height to get total height for BrowserWindow - browserOpts.height = browserOpts.height + navbarHeight() - } else { - // no inner height so check outer height or use default - browserOpts.height = firstDefinedValue(browserOpts.outerHeight, defaults.height) - } - return browserOpts -} - -/** - * Determine window position (x / y) - */ -const setWindowPosition = (browserOpts, defaults, immutableWindowState) => { - if (browserOpts.positionByMouseCursor) { - const screenPos = electron.screen.getCursorScreenPoint() - browserOpts.x = screenPos.x - browserOpts.y = screenPos.y - } else if (immutableWindowState.getIn(['ui', 'position'])) { - // Position comes from window state - browserOpts.x = firstDefinedValue(browserOpts.x, immutableWindowState.getIn(['ui', 'position', 0])) - browserOpts.y = firstDefinedValue(browserOpts.y, immutableWindowState.getIn(['ui', 'position', 1])) - } else if (typeof defaults.x === 'number' && typeof defaults.y === 'number') { - // Position comes from the default position - browserOpts.x = firstDefinedValue(browserOpts.x, defaults.x) - browserOpts.y = firstDefinedValue(browserOpts.y, defaults.y) - } else { - // Default the position - browserOpts.x = firstDefinedValue(browserOpts.x, browserOpts.left, browserOpts.screenX) - browserOpts.y = firstDefinedValue(browserOpts.y, browserOpts.top, browserOpts.screenY) - } - return browserOpts -} - -const createWindow = (action) => { - const frameOpts = (action.frameOpts && action.frameOpts.toJS()) || {} - let browserOpts = (action.browserOpts && action.browserOpts.toJS()) || {} - const immutableWindowState = action.restoredState || Immutable.Map() - const defaults = windowDefaults() - - browserOpts = setWindowDimensions(browserOpts, defaults, immutableWindowState) - browserOpts = setWindowPosition(browserOpts, defaults, immutableWindowState) - - delete browserOpts.left - delete browserOpts.top - - const screen = electron.screen - const primaryDisplay = screen.getPrimaryDisplay() - const parentWindowKey = browserOpts.parentWindowKey - const parentWindow = parentWindowKey ? BrowserWindow.fromId(parentWindowKey) : BrowserWindow.getFocusedWindow() - const bounds = parentWindow ? parentWindow.getBounds() : primaryDisplay.bounds - - // position on screen should be relative to focused window - // or the primary display if there is no focused window - const display = screen.getDisplayNearestPoint(bounds) - - // if no parentWindow, x, y or center is defined then go ahead - // and center it if it's smaller than the display width - // typeof and isNaN are used because 0 is falsey - if (!(parentWindow || - browserOpts.center === false || - browserOpts.x > 0 || - browserOpts.y > 0) && - browserOpts.width < display.bounds.width) { - browserOpts.center = true - } else { - browserOpts.center = false - // don't offset if focused window is at least as big as the screen it's on - if (bounds.width >= display.bounds.width && bounds.height >= display.bounds.height) { - browserOpts.x = firstDefinedValue(browserOpts.x, display.bounds.x) - browserOpts.y = firstDefinedValue(browserOpts.y, display.bounds.y) - } else { - browserOpts.x = firstDefinedValue(browserOpts.x, bounds.x + defaults.windowOffset) - browserOpts.y = firstDefinedValue(browserOpts.y, bounds.y + defaults.windowOffset) - } - - // make sure the browser won't be outside the viewable area of any display - // negative numbers aren't allowed so we don't need to worry about that - const displays = screen.getAllDisplays() - const maxX = Math.max(...displays.map((display) => { return display.bounds.x + display.bounds.width })) - const maxY = Math.max(...displays.map((display) => { return display.bounds.y + display.bounds.height })) - - browserOpts.x = Math.min(browserOpts.x, maxX - defaults.windowOffset) - browserOpts.y = Math.min(browserOpts.y, maxY - defaults.windowOffset) - } - - const minWidth = isModal(browserOpts) ? defaults.minModalWidth : defaults.minWidth - const minHeight = isModal(browserOpts) ? defaults.minModalHeight : defaults.minHeight - - // min width and height don't seem to work when the window is first created - browserOpts.width = browserOpts.width < minWidth ? minWidth : browserOpts.width - browserOpts.height = browserOpts.height < minHeight ? minHeight : browserOpts.height - - const autoHideMenuBarSetting = isDarwin || getSetting(settings.AUTO_HIDE_MENU) - - const windowProps = { - // smaller min size for "modal" windows - minWidth, - minHeight, - // Neither a frame nor a titlebar - // frame: false, - // A frame but no title bar and windows buttons in titlebar 10.10 OSX and up only? - titleBarStyle: 'hidden-inset', - autoHideMenuBar: autoHideMenuBarSetting, - title: appConfig.name, - webPreferences: defaults.webPreferences, - frame: !isWindows - } - - if (process.platform === 'linux') { - windowProps.icon = path.join(__dirname, '..', '..', 'res', 'app.png') +class AppStore extends EventEmitter { + constructor () { + super() + this.lastEmittedState = null } - const homepageSetting = getSetting(settings.HOMEPAGE) - const startupSetting = getSetting(settings.STARTUP_MODE) - const toolbarUserInterfaceScale = getSetting(settings.TOOLBAR_UI_SCALE) - - setImmediate(() => { - let mainWindow = new BrowserWindow(Object.assign(windowProps, browserOpts, {disposition: frameOpts.disposition})) - let restoredImmutableWindowState = action.restoredState - initWindowCacheState(mainWindow.id, restoredImmutableWindowState) - - // initialize frames state - let frames = Immutable.List() - if (restoredImmutableWindowState) { - frames = restoredImmutableWindowState.get('frames') - restoredImmutableWindowState = restoredImmutableWindowState.set('frames', Immutable.List()) - restoredImmutableWindowState = restoredImmutableWindowState.set('tabs', Immutable.List()) - } else { - if (frameOpts && Object.keys(frameOpts).length > 0) { - if (frameOpts.forEach) { - frames = Immutable.fromJS(frameOpts) - } else { - frames = frames.push(Immutable.fromJS(frameOpts)) - } - } else if (startupSetting === 'homePage' && homepageSetting) { - frames = Immutable.fromJS(homepageSetting.split('|').map((homepage) => { - return { - location: homepage - } - })) - } - } - - if (frames.size === 0) { - frames = Immutable.fromJS([{}]) - } - - if (immutableWindowState.getIn(['ui', 'isMaximized'])) { - mainWindow.maximize() - } - - if (immutableWindowState.getIn(['ui', 'isFullScreen'])) { - mainWindow.setFullScreen(true) - } - - mainWindow.webContents.on('did-finish-load', (e) => { - lastEmittedState = appState - mainWindow.webContents.setZoomLevel(zoomLevel[toolbarUserInterfaceScale] || 0.0) - - const mem = muon.shared_memory.create({ - windowValue: { - disposition: frameOpts.disposition, - id: mainWindow.id - }, - appState: appState.toJS(), - frames: frames.toJS(), - windowState: (restoredImmutableWindowState && restoredImmutableWindowState.toJS()) || undefined}) - - e.sender.sendShared(messages.INITIALIZE_WINDOW, mem) - if (action.cb) { - action.cb() - } - }) - - mainWindow.on('ready-to-show', () => { - mainWindow.show() - }) - - mainWindow.loadURL(appUrlUtil.getBraveExtIndexHTML()) - }) -} - -class AppStore extends EventEmitter { getState () { return appState } - emitChanges (emitFullState) { - if (lastEmittedState) { - const d = diff(lastEmittedState, appState) + emitChanges () { + if (this.lastEmittedState) { + const d = diff(this.lastEmittedState, appState) if (!d.isEmpty()) { BrowserWindow.getAllWindows().forEach((wnd) => { if (wnd.webContents && !wnd.webContents.isDestroyed()) { wnd.webContents.send(messages.APP_STATE_CHANGE, { stateDiff: d.toJS() }) } }) - lastEmittedState = appState + this.lastEmittedState = appState this.emit(CHANGE_EVENT, d.toJS()) } } else { @@ -311,47 +101,13 @@ class AppStore extends EventEmitter { removeChangeListener (callback) { this.removeListener(CHANGE_EVENT, callback) } -} -function windowDefaults () { - setDefaultWindowSize() - - return { - show: false, - width: appState.getIn(['defaultWindowParams', 'width']) || appState.get('defaultWindowWidth'), - height: appState.getIn(['defaultWindowParams', 'height']) || appState.get('defaultWindowHeight'), - x: appState.getIn(['defaultWindowParams', 'x']) || undefined, - y: appState.getIn(['defaultWindowParams', 'y']) || undefined, - minWidth: 480, - minHeight: 300, - minModalHeight: 100, - minModalWidth: 100, - windowOffset: 20, - webPreferences: { - sharedWorker: true, - nodeIntegration: false, - partition: 'default', - webSecurity: false, - allowFileAccessFromFileUrls: true, - allowUniversalAccessFromFileUrls: true + getLastEmittedState () { + if (!this.lastEmittedState) { + this.lastEmittedState = appState } - } -} -/** - * set the default width and height if they - * haven't been initialized yet - */ -function setDefaultWindowSize () { - if (!appState) { - return - } - const screen = electron.screen - const primaryDisplay = screen.getPrimaryDisplay() - if (!appState.getIn(['defaultWindowParams', 'width']) && !appState.get('defaultWindowWidth') && - !appState.getIn(['defaultWindowParams', 'height']) && !appState.get('defaultWindowHeight')) { - appState = appState.setIn(['defaultWindowParams', 'width'], primaryDisplay.workAreaSize.width) - appState = appState.setIn(['defaultWindowParams', 'height'], primaryDisplay.workAreaSize.height) + return this.lastEmittedState } } @@ -452,9 +208,6 @@ const handleAppAction = (action) => { AppDispatcher.shutdown() app.quit() break - case appConstants.APP_NEW_WINDOW: - createWindow(action) - break case appConstants.APP_CHANGE_NEW_TAB_DETAIL: appState = aboutNewTabState.mergeDetails(appState, action) if (action.refresh) {