Merge pull request #1490 from Hixie/navigator-ensure-pop

Handle a route being dismissed before being popped
diff --git a/packages/flutter/lib/src/widgets/navigator.dart b/packages/flutter/lib/src/widgets/navigator.dart
index f47c70a..d69d75a 100644
--- a/packages/flutter/lib/src/widgets/navigator.dart
+++ b/packages/flutter/lib/src/widgets/navigator.dart
@@ -136,8 +136,13 @@
         direction: (i <= _currentPosition) ? AnimationDirection.forward : AnimationDirection.reverse
       );
       route._onDismissed = () {
+        assert(_history.contains(route));
+        if (_history.lastIndexOf(route) <= _currentPosition)
+          popRoute(route);
+      };
+      route._onRemoveRoute = () {
+        assert(_history.contains(route));
         setState(() {
-          assert(_history.contains(route));
           _history.remove(route);
         });
       };
@@ -170,14 +175,19 @@
   PerformanceView get performance => _performance?.view;
   Performance _performance;
   NotificationCallback _onDismissed;
+  NotificationCallback _onRemoveRoute;
 
   Performance createPerformance() {
     Duration duration = transitionDuration;
     if (duration > Duration.ZERO) {
       return new Performance(duration: duration)
         ..addStatusListener((PerformanceStatus status) {
-          if (status == PerformanceStatus.dismissed && _onDismissed != null)
-            _onDismissed();
+          if (status == PerformanceStatus.dismissed) {
+            if (_onDismissed != null)
+              _onDismissed();
+            if (_onRemoveRoute != null)
+              _onRemoveRoute();
+          }
         });
     }
     return null;
@@ -253,8 +263,8 @@
 
   Widget build(NavigatorState navigator, PerformanceView nextRoutePerformance);
   void didPop([dynamic result]) {
-    if (performance == null && _onDismissed != null)
-      _onDismissed();
+    if (performance == null && _onRemoveRoute != null)
+      _onRemoveRoute();
   }
 
   String toString() => '$runtimeType()';