Use Chrome's navigation controller for in-page navigations
authorCheng Zhao <zcbenz@gmail.com>
Mon, 11 May 2015 06:30:26 +0000 (14:30 +0800)
committerCheng Zhao <zcbenz@gmail.com>
Mon, 11 May 2015 06:30:26 +0000 (14:30 +0800)
atom/browser/api/atom_api_web_contents.cc
atom/browser/api/atom_api_web_contents.h
atom/browser/api/lib/navigation-controller.coffee

index 2fedd10..558b26b 100644 (file)
@@ -443,6 +443,14 @@ void WebContents::ReloadIgnoringCache() {
   web_contents()->GetController().ReloadIgnoringCache(false);
 }
 
+void WebContents::GoBack() {
+  web_contents()->GetController().GoBack();
+}
+
+void WebContents::GoForward() {
+  web_contents()->GetController().GoForward();
+}
+
 int WebContents::GetRoutingID() const {
   return web_contents()->GetRoutingID();
 }
@@ -611,6 +619,8 @@ mate::ObjectTemplateBuilder WebContents::GetObjectTemplateBuilder(
         .SetMethod("isWaitingForResponse", &WebContents::IsWaitingForResponse)
         .SetMethod("_stop", &WebContents::Stop)
         .SetMethod("_reloadIgnoringCache", &WebContents::ReloadIgnoringCache)
+        .SetMethod("_goBack", &WebContents::GoBack)
+        .SetMethod("_goForward", &WebContents::GoForward)
         .SetMethod("getRoutingId", &WebContents::GetRoutingID)
         .SetMethod("getProcessId", &WebContents::GetProcessID)
         .SetMethod("isCrashed", &WebContents::IsCrashed)
index cc2fd30..aa0ee8d 100644 (file)
@@ -53,6 +53,9 @@ class WebContents : public mate::EventEmitter,
   bool IsWaitingForResponse() const;
   void Stop();
   void ReloadIgnoringCache();
+  void GoBack();
+  void GoForward();
+  void GoToIndex();
   int GetRoutingID() const;
   int GetProcessID() const;
   bool IsCrashed() const;
index 28404b1..675f34e 100644 (file)
@@ -10,20 +10,20 @@ class NavigationController
     @pendingIndex = -1
 
     @webContents.on 'navigation-entry-commited', (event, url, inPage, replaceEntry) =>
-      if replaceEntry
-        @history[@currentIndex] = {url, inPage}
-        return
+      console.log 'navigation-entry-commited', url, inPage, replaceEntry
 
-      if @pendingIndex is -1  # Normal navigation.
+      if @pendingIndex >= 0 # Go to index.
+        @currentIndex = @pendingIndex
+        @pendingIndex = -1
+        @history[@currentIndex] = {url, inPage}
+      else if replaceEntry # Non-user initialized navigation.
+        @history[@currentIndex] = {url, inPage}
+      else  # Normal navigation.
         @history = @history.slice 0, @currentIndex + 1  # Clear history.
         currentEntry = @history[@currentIndex]
         if currentEntry?.url isnt url or currentEntry?.inPage isnt inPage
           @currentIndex++
           @history.push {url, inPage}
-      else  # Go to index.
-        @currentIndex = @pendingIndex
-        @pendingIndex = -1
-        @history[@currentIndex] = {url, inPage}
 
   loadUrl: (url, options={}) ->
     @pendingIndex = -1
@@ -62,12 +62,20 @@ class NavigationController
   goBack: ->
     return unless @canGoBack()
     @pendingIndex = @getActiveIndex() - 1
-    @webContents._loadUrl @history[@pendingIndex].url, {}
+    pendingEntry = @history[@pendingIndex]
+    if pendingEntry.inPage
+      @webContents._goBack()
+    else
+      @webContents._loadUrl pendingEntry.url, {}
 
   goForward: ->
     return unless @canGoForward()
     @pendingIndex = @getActiveIndex() + 1
-    @webContents._loadUrl @history[@pendingIndex].url, {}
+    pendingEntry = @history[@pendingIndex]
+    if pendingEntry.inPage
+      @webContents._goForward()
+    else
+      @webContents._loadUrl pendingEntry.url, {}
 
   goToIndex: (index) ->
     return unless @canGoToIndex index