From 7f9fa92e2d29933b6c0d813d2c05b9401e33d7e3 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 16 Jun 2016 09:46:26 -0700 Subject: [PATCH 1/4] Add chrome.webNavigation stubs --- filenames.gypi | 1 + lib/renderer/chrome-api.js | 1 + lib/renderer/extensions/web-navigation.js | 19 +++++++++++++++++++ 3 files changed, 21 insertions(+) create mode 100644 lib/renderer/extensions/web-navigation.js diff --git a/filenames.gypi b/filenames.gypi index 2b87e36fa4d2..7d4e1924b521 100644 --- a/filenames.gypi +++ b/filenames.gypi @@ -65,6 +65,7 @@ 'lib/renderer/api/web-frame.js', 'lib/renderer/extensions/i18n.js', 'lib/renderer/extensions/storage.js', + 'lib/renderer/extensions/web-navigation.js', ], 'js2c_sources': [ 'lib/common/asar.js', diff --git a/lib/renderer/chrome-api.js b/lib/renderer/chrome-api.js index fdc16f7375d2..aa7aadf4fab1 100644 --- a/lib/renderer/chrome-api.js +++ b/lib/renderer/chrome-api.js @@ -196,4 +196,5 @@ exports.injectTo = function (extensionId, isBackgroundPage, context) { } chrome.i18n = require('./extensions/i18n.js').setup(extensionId) + chrome.webNavigation = require('./extensions/web-navigation.js') } diff --git a/lib/renderer/extensions/web-navigation.js b/lib/renderer/extensions/web-navigation.js new file mode 100644 index 000000000000..154806fcd35b --- /dev/null +++ b/lib/renderer/extensions/web-navigation.js @@ -0,0 +1,19 @@ +exports.onBeforeNavigate = { + addListener () { + + }, + + removeListener () { + + } +} + +exports.onCompleted = { + addListener () { + + }, + + removeListener () { + + } +} From 3aecb1109464218f3fd188b241e554ac8bc06a24 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 16 Jun 2016 09:51:54 -0700 Subject: [PATCH 2/4] Extract Event clas to own file --- filenames.gypi | 1 + lib/renderer/chrome-api.js | 24 +---------------------- lib/renderer/extensions/event.js | 24 +++++++++++++++++++++++ lib/renderer/extensions/web-navigation.js | 20 +++---------------- 4 files changed, 29 insertions(+), 40 deletions(-) create mode 100644 lib/renderer/extensions/event.js diff --git a/filenames.gypi b/filenames.gypi index 7d4e1924b521..87ff5dc9813e 100644 --- a/filenames.gypi +++ b/filenames.gypi @@ -63,6 +63,7 @@ 'lib/renderer/api/remote.js', 'lib/renderer/api/screen.js', 'lib/renderer/api/web-frame.js', + 'lib/renderer/extensions/event.js', 'lib/renderer/extensions/i18n.js', 'lib/renderer/extensions/storage.js', 'lib/renderer/extensions/web-navigation.js', diff --git a/lib/renderer/chrome-api.js b/lib/renderer/chrome-api.js index aa7aadf4fab1..f05da9382f06 100644 --- a/lib/renderer/chrome-api.js +++ b/lib/renderer/chrome-api.js @@ -1,31 +1,9 @@ const {ipcRenderer} = require('electron') +const Event = require('./extensions/event') const url = require('url') let nextId = 0 -class Event { - constructor () { - this.listeners = [] - } - - addListener (callback) { - this.listeners.push(callback) - } - - removeListener (callback) { - const index = this.listeners.indexOf(callback) - if (index !== -1) { - this.listeners.splice(index, 1) - } - } - - emit (...args) { - for (const listener of this.listeners) { - listener(...args) - } - } -} - class Tab { constructor (tabId) { this.id = tabId diff --git a/lib/renderer/extensions/event.js b/lib/renderer/extensions/event.js new file mode 100644 index 000000000000..4a951407f594 --- /dev/null +++ b/lib/renderer/extensions/event.js @@ -0,0 +1,24 @@ +class Event { + constructor () { + this.listeners = [] + } + + addListener (callback) { + this.listeners.push(callback) + } + + removeListener (callback) { + const index = this.listeners.indexOf(callback) + if (index !== -1) { + this.listeners.splice(index, 1) + } + } + + emit (...args) { + for (const listener of this.listeners) { + listener(...args) + } + } +} + +module.exports = Event diff --git a/lib/renderer/extensions/web-navigation.js b/lib/renderer/extensions/web-navigation.js index 154806fcd35b..01fbfc5c7fca 100644 --- a/lib/renderer/extensions/web-navigation.js +++ b/lib/renderer/extensions/web-navigation.js @@ -1,19 +1,5 @@ -exports.onBeforeNavigate = { - addListener () { +const Event = require('./event') - }, +exports.onBeforeNavigate = new Event() - removeListener () { - - } -} - -exports.onCompleted = { - addListener () { - - }, - - removeListener () { - - } -} +exports.onCompleted = new Event() From 567622c1260a997a6b89d22ef52c9e7e602e6f82 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 16 Jun 2016 09:52:14 -0700 Subject: [PATCH 3/4] Drop unneeded .js extensions --- lib/renderer/chrome-api.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/renderer/chrome-api.js b/lib/renderer/chrome-api.js index f05da9382f06..f467c8bb3ae2 100644 --- a/lib/renderer/chrome-api.js +++ b/lib/renderer/chrome-api.js @@ -161,7 +161,7 @@ exports.injectTo = function (extensionId, isBackgroundPage, context) { onMessage: chrome.runtime.onMessage } - chrome.storage = require('./extensions/storage.js') + chrome.storage = require('./extensions/storage') chrome.pageAction = { show () {}, @@ -173,6 +173,6 @@ exports.injectTo = function (extensionId, isBackgroundPage, context) { getPopup () {} } - chrome.i18n = require('./extensions/i18n.js').setup(extensionId) - chrome.webNavigation = require('./extensions/web-navigation.js') + chrome.i18n = require('./extensions/i18n').setup(extensionId) + chrome.webNavigation = require('./extensions/web-navigation') } From 65abaee29925dab95153052993522e8a94d87701 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 16 Jun 2016 12:07:59 -0700 Subject: [PATCH 4/4] Forward will/did navigate events to extensions --- lib/browser/chrome-extension.js | 41 ++++++++++++++++++----- lib/renderer/chrome-api.js | 2 +- lib/renderer/extensions/web-navigation.js | 20 +++++++++-- 3 files changed, 52 insertions(+), 11 deletions(-) diff --git a/lib/browser/chrome-extension.js b/lib/browser/chrome-extension.js index 098f3aa7c8af..bd71feb8844a 100644 --- a/lib/browser/chrome-extension.js +++ b/lib/browser/chrome-extension.js @@ -97,17 +97,42 @@ const removeBackgroundPages = function (manifest) { delete backgroundPages[manifest.extensionId] } -// Dispatch tabs events. -const hookWebContentsForTabEvents = function (webContents) { - const tabId = webContents.id +const sendToBackgroundPages = function (...args) { for (const page of objectValues(backgroundPages)) { - page.webContents.sendToAll('CHROME_TABS_ONCREATED', tabId) + page.webContents.sendToAll(...args) } +} + +// Dispatch web contents events to Chrome APIs +const hookWebContentsEvents = function (webContents) { + const tabId = webContents.id + + sendToBackgroundPages('CHROME_TABS_ONCREATED') + + webContents.on('will-navigate', (event, url) => { + sendToBackgroundPages('CHROME_WEBNAVIGATION_ONBEFORENAVIGATE', { + frameId: 0, + parentFrameId: -1, + processId: webContents.getId(), + tabId: tabId, + timeStamp: Date.now(), + url: url + }) + }) + + webContents.on('did-navigate', (event, url) => { + sendToBackgroundPages('CHROME_WEBNAVIGATION_ONCOMPLETED', { + frameId: 0, + parentFrameId: -1, + processId: webContents.getId(), + tabId: tabId, + timeStamp: Date.now(), + url: url + }) + }) webContents.once('destroyed', () => { - for (const page of objectValues(backgroundPages)) { - page.webContents.sendToAll('CHROME_TABS_ONREMOVED', tabId) - } + sendToBackgroundPages('CHROME_TABS_ONREMOVED', tabId) }) } @@ -245,7 +270,7 @@ const loadDevToolsExtensions = function (win, manifests) { app.on('web-contents-created', function (event, webContents) { if (!isWindowOrWebView(webContents)) return - hookWebContentsForTabEvents(webContents) + hookWebContentsEvents(webContents) webContents.on('devtools-opened', function () { loadDevToolsExtensions(webContents, objectValues(manifestMap)) }) diff --git a/lib/renderer/chrome-api.js b/lib/renderer/chrome-api.js index f467c8bb3ae2..6c28c98edf44 100644 --- a/lib/renderer/chrome-api.js +++ b/lib/renderer/chrome-api.js @@ -174,5 +174,5 @@ exports.injectTo = function (extensionId, isBackgroundPage, context) { } chrome.i18n = require('./extensions/i18n').setup(extensionId) - chrome.webNavigation = require('./extensions/web-navigation') + chrome.webNavigation = require('./extensions/web-navigation').setup() } diff --git a/lib/renderer/extensions/web-navigation.js b/lib/renderer/extensions/web-navigation.js index 01fbfc5c7fca..19faa8001911 100644 --- a/lib/renderer/extensions/web-navigation.js +++ b/lib/renderer/extensions/web-navigation.js @@ -1,5 +1,21 @@ const Event = require('./event') +const {ipcRenderer} = require('electron') -exports.onBeforeNavigate = new Event() +class WebNavigation { + constructor () { + this.onBeforeNavigate = new Event() + this.onCompleted = new Event() -exports.onCompleted = new Event() + ipcRenderer.on('CHROME_WEBNAVIGATION_ONBEFORENAVIGATE', (event, details) => { + this.onBeforeNavigate.emit(details) + }) + + ipcRenderer.on('CHROME_WEBNAVIGATION_ONCOMPLETED', (event, details) => { + this.onCompleted.emit(details) + }) + } +} + +exports.setup = () => { + return new WebNavigation() +}