Skip to content
This repository has been archived by the owner on Dec 11, 2019. It is now read-only.

Commit

Permalink
extension actions
Browse files Browse the repository at this point in the history
Fix #2224
  • Loading branch information
bridiver committed Sep 11, 2016
1 parent f6f9ac5 commit 9e77381
Show file tree
Hide file tree
Showing 22 changed files with 1,113 additions and 88 deletions.
47 changes: 47 additions & 0 deletions app/browser/extensions/browserActions.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
const extensionActions = require('../../common/actions/extensionActions')
const { makeImmutable } = require('../../common/state/immutableUtil')
const electron = require('electron')
const BrowserWindow = electron.BrowserWindow
const messages = require('../../../js/constants/messages')

const browserActions = {
init: () => {
// TODO - clear tab ids when tab is closed
process.on('chrome-browser-action-registered', (extensionId, details) => {
extensionActions.browserActionRegistered(extensionId, makeImmutable(details))
})

process.on('chrome-browser-action-set-icon', (extensionId, details) => {
extensionActions.browserActionUpdated(extensionId, makeImmutable(details), details.tabId)
})

process.on('chrome-browser-action-set-badge-text', (extensionId, details) => {
extensionActions.browserActionUpdated(extensionId, makeImmutable(details), details.tabId)
})

process.on('chrome-browser-action-set-badge-background-color', (extensionId, details) => {
extensionActions.browserActionUpdated(extensionId, makeImmutable(details), details.tabId)
})

process.on('chrome-browser-action-set-title', (extensionId, details) => {
extensionActions.browserActionUpdated(extensionId, makeImmutable(details), details.tabId)
})

process.on('chrome-browser-action-popup', (extensionId, tabId, name, popup, props) => {
let nodeProps = {
left: props.x,
top: props.y + 20,
src: popup
}

let win = BrowserWindow.getFocusedWindow()
if (!win) {
return
}

win.webContents.send(messages.NEW_POPUP_WINDOW, extensionId, popup, nodeProps)
})
}
}

module.exports = browserActions
83 changes: 83 additions & 0 deletions app/common/actions/extensionActions.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */

'use strict'
const AppDispatcher = require('../../../js/dispatcher/appDispatcher')
const ExtensionConstants = require('../constants/extensionConstants')

const extensionActions = {
/**
* Dispatched when an extension browser action is added
*
* @param {string} extensionId - the extension id
* @param {object} browserAction - browser action details
*/
browserActionRegistered: function (extensionId, browserAction) {
AppDispatcher.dispatch({
actionType: ExtensionConstants.BROWSER_ACTION_REGISTERED,
extensionId,
browserAction
})
},

browserActionUpdated: function (extensionId, browserAction, tabId) {
AppDispatcher.dispatch({
actionType: ExtensionConstants.BROWSER_ACTION_UPDATED,
extensionId,
browserAction,
tabId
})
},

/**
* Dispatched when an extension has been installed
*
* @param {string} extensionId - the extension id
*/
extensionInstalled: function (extensionId, installInfo) {
AppDispatcher.dispatch({
actionType: ExtensionConstants.EXTENSION_INSTALLED,
extensionId,
installInfo
})
},

/**
* Dispatched when an extension has been uninstalled
*
* @param {string} extensionId - the extension id
*/
extensionUninstalled: function (extensionId) {
AppDispatcher.dispatch({
actionType: ExtensionConstants.EXTENSION_UNINSTALLED,
extensionId
})
},

/**
* Dispatched when an extension has been enabled
*
* @param {string} extensionId - the extension id
*/
extensionEnabled: function (extensionId) {
AppDispatcher.dispatch({
actionType: ExtensionConstants.EXTENSION_ENABLED,
extensionId
})
},

/**
* Dispatched when an extension has been disabled
*
* @param {string} extensionId - the extension id
*/
extensionDisabled: function (extensionId) {
AppDispatcher.dispatch({
actionType: ExtensionConstants.EXTENSION_DISABLED,
extensionId
})
}
}

module.exports = extensionActions
17 changes: 17 additions & 0 deletions app/common/constants/extensionConstants.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */

const mapValuesByKeys = require('../../../js/lib/functional').mapValuesByKeys

const _ = null
const ExtensionConstants = {
BROWSER_ACTION_REGISTERED: _,
BROWSER_ACTION_UPDATED: _,
EXTENSION_INSTALLED: _,
EXTENSION_UNINSTALLED: _,
EXTENSION_ENABLED: _,
EXTENSION_DISABLED: _
}

module.exports = mapValuesByKeys(ExtensionConstants)
126 changes: 126 additions & 0 deletions app/common/state/extensionState.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */

const tabState = require('./tabState')
const { makeImmutable } = require('./immutableUtil')
const Immutable = require('immutable')

let transientFields = []

tabState.addTransientFields(['browserAction'])

const browserActionDefaults = Immutable.fromJS({
tabs: {}
})

const extensionState = {

getEnabledExtensions: (state) => {
return state.get('extensions').filter((installInfo, extensionId) => {
return installInfo.get('enabled') === true
})
},

getExtensionById: (state, extensionId) => {
return state.getIn(['extensions', extensionId])
},

getBrowserActionByTabId: (state, extensionId, tabId) => {
tabId = tabId ? tabId.toString() : '-1'
let extension = extensionState.getExtensionById(state, extensionId)
if (extension && extension.get('browserAction')) {
let tabBrowserAction = extension.getIn(['tabs', tabId]) || Immutable.Map()
return extension.get('browserAction').merge(tabBrowserAction).merge({base_path: extension.get('base_path')})
}
return null
},

browserActionRegistered: (state, action) => {
action = makeImmutable(action)
state = makeImmutable(state)
let extensionId = action.get('extensionId').toString()
let extension = extensionState.getExtensionById(state, extensionId)
if (extension) {
extension = extension.set('browserAction', browserActionDefaults.merge(action.get('browserAction')))
return state.setIn(['extensions', extensionId], extension)
} else {
return state
}
},

browserActionUpdated: (state, action) => {
action = makeImmutable(action)
state = makeImmutable(state)
let extensionId = action.get('extensionId').toString()
let extension = extensionState.getExtensionById(state, extensionId)
if (extension && extension.get('browserAction')) {
let tabId = action.get('tabId')
if (tabId) {
let tabs = extension.getIn(['browserAction', 'tabs'])
let tab = tabs.get(tabId) || Immutable.Map()
tabs = tabs.set(tabId, tab.merge(action.get('browserAction')))
extension = extension.setIn(['browserAction', 'tabs'], tabs)
} else {
extension = extension.set('browserAction', extension.get('browserAction').merge(action.get('browserAction')))
}
return state.setIn(['extensions', extensionId], extension)
} else {
return state
}
},

browserActionBackgroundImage: (browserAction) => {
// TODO(bridiver) - handle icon single
if (browserAction.get('base_path') && browserAction.getIn(['path', '19']) && browserAction.getIn(['path', '38'])) {
return '-webkit-image-set(url(\'' + browserAction.get('base_path') + '/' + browserAction.getIn(['path', '19']) +
'\') 1x, url(\'' + browserAction.get('base_path') + '/' + browserAction.getIn(['path', '38']) + '\') 2x'
}
return ''
},

extensionInstalled: (state, action) => {
action = makeImmutable(action)
state = makeImmutable(state)
let extensionId = action.get('extensionId').toString()
return state.setIn(['extensions', extensionId], action.get('installInfo'))
},

extensionEnabled: (state, action) => {
action = makeImmutable(action)
state = makeImmutable(state)
let extensionId = action.get('extensionId').toString()
let extension = extensionState.getExtensionById(state, extensionId)
if (extension) {
return state.setIn(['extensions', extensionId], extension.set('enabled', true))
} else {
return state
}
},

extensionDisabled: (state, action) => {
action = makeImmutable(action)
state = makeImmutable(state)
let extensionId = action.get('extensionId').toString()
let extension = extensionState.getExtensionById(state, extensionId)
if (extension) {
return state.setIn(['extensions', action.get('extensionId')], extension.set('enabled', false))
} else {
return state
}
},

getTransientFields: () => {
return transientFields
},

getPersistentTabState: (extension) => {
extension = makeImmutable(extension)
extensionState.getTransientFields().forEach((field) => {
extension = extension.delete(field)
})
return extension
}
}

module.exports = extensionState
24 changes: 11 additions & 13 deletions app/extensions.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
const electron = require('electron')
const BrowserWindow = electron.BrowserWindow
const browserActions = require('./browser/extensions/browserActions')
const extensionActions = require('./common/actions/extensionActions')
const AppStore = require('../js/stores/appStore')
const config = require('../js/constants/config')
const { fileUrl } = require('../js/lib/appUrlUtil')
const { getAppUrl, getExtensionsPath, getIndexHTML } = require('../js/lib/appUrlUtil')
const { getSetting } = require('../js/settings')
const messages = require('../js/constants/messages')
const settings = require('../js/constants/settings')
const {passwordManagers, extensionIds} = require('../js/constants/passwordManagers')

Expand Down Expand Up @@ -135,22 +135,18 @@ let generateBraveManifest = () => {
}

module.exports.init = () => {
process.on('chrome-browser-action-popup', function (extensionId, tabId, name, props, popup) {
// TODO(bridiver) find window from tabId
let win = BrowserWindow.getFocusedWindow()
if (!win) {
return
}

win.webContents.send(messages.NEW_POPUP_WINDOW, extensionId, popup, props)
})

browserActions.init()
let installedExtensions = {}
let extensionInstalled = (installInfo) => {
if (installInfo.error) {
console.error(installInfo.error)
// TODO(bridiver) extensionActions.extensionInstallFailed
return
}
installedExtensions[installInfo.id] = installInfo
installInfo.base_path = fileUrl(installInfo.base_path)

extensionActions.extensionInstalled(installInfo.id, installInfo)
}

let installExtension = (extensionId, path, options = {}) => {
Expand All @@ -163,13 +159,15 @@ module.exports.init = () => {
var installInfo = installedExtensions[extensionId]
if (installInfo) {
process.emit('enable-extension', installInfo.id)
extensionActions.extensionEnabled(installInfo.id)
}
}

let disableExtension = (extensionId) => {
var installInfo = installedExtensions[extensionId]
if (installInfo) {
process.emit('disable-extension', installInfo.id)
extensionActions.extensionDisabled(installInfo.id)
}
}

Expand Down
7 changes: 6 additions & 1 deletion app/filtering.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ const settings = require('../js/constants/settings')
const userPrefs = require('../js/state/userPrefs')
const config = require('../js/constants/config')
const locale = require('./locale')
const {isSessionPartition} = require('../js/state/frameStateUtil')
const ipcMain = electron.ipcMain
const dialog = electron.dialog
const app = electron.app
Expand Down Expand Up @@ -459,7 +460,11 @@ function initForPartition (partition) {
registerPermissionHandler,
registerForHeadersReceived,
registerForDownloadListener]
let ses = session.fromPartition(partition)
let options = {}
if (isSessionPartition(partition)) {
options.parent_partition = ''
}
let ses = session.fromPartition(partition, options)
fns.forEach((fn) => { fn(ses, partition) })
}

Expand Down

0 comments on commit 9e77381

Please sign in to comment.