Forward will/did navigate events to extensions
authorKevin Sawicki <kevinsawicki@gmail.com>
Thu, 16 Jun 2016 19:07:59 +0000 (12:07 -0700)
committerKevin Sawicki <kevinsawicki@gmail.com>
Thu, 16 Jun 2016 19:07:59 +0000 (12:07 -0700)
lib/browser/chrome-extension.js
lib/renderer/chrome-api.js
lib/renderer/extensions/web-navigation.js

index 098f3aa..bd71feb 100644 (file)
@@ -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))
   })
index f467c8b..6c28c98 100644 (file)
@@ -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()
 }
index 01fbfc5..19faa80 100644 (file)
@@ -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()
+}