Send history operations as asynchronous messages
authorCheng Zhao <zcbenz@gmail.com>
Mon, 11 May 2015 08:03:25 +0000 (16:03 +0800)
committerCheng Zhao <zcbenz@gmail.com>
Mon, 11 May 2015 08:03:25 +0000 (16:03 +0800)
Sending as sync message will cause weird results for
NavigationController

atom/browser/api/lib/navigation-controller.coffee
atom/browser/api/lib/web-contents.coffee
atom/renderer/lib/override.coffee

index 675f34e..9c3159c 100644 (file)
@@ -1,3 +1,9 @@
+ipc = require 'ipc'
+
+# The history operation in renderer is redirected to browser.
+ipc.on 'ATOM_SHELL_NAVIGATION_CONTROLLER', (event, method, args...) ->
+  event.sender[method] args...
+
 # JavaScript implementation of Chromium's NavigationController.
 # Instead of relying on Chromium for history control, we compeletely do history
 # control on user land, and only rely on WebContents.loadUrl for navigation.
index e249ccf..eb86c94 100644 (file)
@@ -29,7 +29,6 @@ module.exports.wrap = (webContents) ->
 
   # The navigation controller.
   controller = new NavigationController(webContents)
-  webContents.controller = controller
   for name, method of NavigationController.prototype when method instanceof Function
     do (name, method) ->
       webContents[name] = -> method.apply controller, arguments
index 3ac5177..1bc1e61 100644 (file)
@@ -74,15 +74,16 @@ window.confirm = (message, title='') ->
 window.prompt = ->
   throw new Error('prompt() is and will not be supported.')
 
-# Forward history operations to browser.
-window.history.back = ->
-  remote.getCurrentWebContents().goBack()
-window.history.forward = ->
-  remote.getCurrentWebContents().goForward()
-
+# Simple implementation of postMessage.
 window.opener =
   postMessage: (message, targetOrigin='*') ->
     ipc.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPENER_POSTMESSAGE', message, targetOrigin
 
 ipc.on 'ATOM_SHELL_GUEST_WINDOW_POSTMESSAGE', (message, targetOrigin) ->
   window.postMessage message, targetOrigin
+
+# Forward history operations to browser.
+sendHistoryOperation = (args...) ->
+  ipc.send 'ATOM_SHELL_NAVIGATION_CONTROLLER', args...
+window.history.back = -> sendHistoryOperation 'goBack'
+window.history.forward = -> sendHistoryOperation 'goForward'