Let RenderObjectWidgets use inherited properties

This prepares us for depending on the LTR/RTL inherited property in
RenderObjectWidgets.
diff --git a/packages/flutter/lib/src/widgets/framework.dart b/packages/flutter/lib/src/widgets/framework.dart
index 4e61e86..990499c 100644
--- a/packages/flutter/lib/src/widgets/framework.dart
+++ b/packages/flutter/lib/src/widgets/framework.dart
@@ -1165,6 +1165,13 @@
     assert(_debugLifecycleState == _ElementLifecycle.active);
     assert(() {
       if (_debugBuilding) {
+        if (_debugCurrentBuildTarget == null) {
+          // If _debugCurrentBuildTarget is null, we're not actually building a
+          // widget but instead building the root of the tree via runApp.
+          // TODO(abarth): Remove these cases and ensure that we always have
+          // a current build target when we're building.
+          return true;
+        }
         bool foundTarget = false;
         visitAncestorElements((Element element) {
           if (element == _debugCurrentBuildTarget) {
@@ -1214,17 +1221,12 @@
       _debugCurrentBuildTarget = this;
      return true;
     });
-    try {
-      performRebuild();
-    } catch (e, stack) {
-      _debugReportException('rebuilding $this', e, stack);
-    } finally {
-      assert(() {
-        assert(_debugCurrentBuildTarget == this);
-        _debugCurrentBuildTarget = debugPreviousBuildTarget;
-        return true;
-      });
-    }
+    performRebuild();
+    assert(() {
+      assert(_debugCurrentBuildTarget == this);
+      _debugCurrentBuildTarget = debugPreviousBuildTarget;
+      return true;
+    });
     assert(!_dirty);
   }
 
@@ -1618,6 +1620,7 @@
 
   @override
   void performRebuild() {
+    widget.updateRenderObject(this, renderObject);
     _dirty = false;
   }
 
diff --git a/packages/flutter/test/widget/render_object_widget_test.dart b/packages/flutter/test/widget/render_object_widget_test.dart
index f7301b6..e1e72c5 100644
--- a/packages/flutter/test/widget/render_object_widget_test.dart
+++ b/packages/flutter/test/widget/render_object_widget_test.dart
@@ -20,6 +20,27 @@
   Widget build(BuildContext context) => child;
 }
 
+class TestOrientedBox extends SingleChildRenderObjectWidget {
+  TestOrientedBox({ Key key, Widget child }) : super(key: key, child: child);
+
+  Decoration _getDecoration(BuildContext context) {
+    switch (MediaQuery.of(context).orientation) {
+      case Orientation.landscape:
+        return new BoxDecoration(backgroundColor: const Color(0xFF00FF00));
+      case Orientation.portrait:
+        return new BoxDecoration(backgroundColor: const Color(0xFF0000FF));
+    }
+  }
+
+  @override
+  RenderDecoratedBox createRenderObject(BuildContext context) => new RenderDecoratedBox(decoration: _getDecoration(context));
+
+  @override
+  void updateRenderObject(BuildContext context, RenderDecoratedBox renderObject) {
+    renderObject.decoration = _getDecoration(context);
+  }
+}
+
 void main() {
   test('RenderObjectWidget smoke test', () {
     testWidgets((WidgetTester tester) {
@@ -171,4 +192,28 @@
       expect(grandChild.child, isNull);
     });
   });
+
+  test('Can watch inherited widgets', () {
+    testWidgets((WidgetTester tester) {
+      Key boxKey = new UniqueKey();
+      TestOrientedBox box = new TestOrientedBox(key: boxKey);
+
+      tester.pumpWidget(new MediaQuery(
+        data: new MediaQueryData(size: const Size(400.0, 300.0)),
+        child: box
+      ));
+
+      RenderDecoratedBox renderBox = tester.findElementByKey(boxKey).renderObject;
+      BoxDecoration decoration = renderBox.decoration;
+      expect(decoration.backgroundColor, equals(new Color(0xFF00FF00)));
+
+      tester.pumpWidget(new MediaQuery(
+        data: new MediaQueryData(size: const Size(300.0, 400.0)),
+        child: box
+      ));
+
+      decoration = renderBox.decoration;
+      expect(decoration.backgroundColor, equals(new Color(0xFF0000FF)));
+    });
+  });
 }