Mozart: Fix 0x0 crashes in example views.

BUG=
R=abarth@google.com

Review URL: https://codereview.chromium.org/1868093002 .
diff --git a/apps/moterm/moterm_view.cc b/apps/moterm/moterm_view.cc
index 4bf6abe..f248b91 100644
--- a/apps/moterm/moterm_view.cc
+++ b/apps/moterm/moterm_view.cc
@@ -228,25 +228,32 @@
   // TODO(vtl): Draw only the dirty region(s)?
   model_state_changes_.Reset();
 
-  const mojo::Size& size = *properties()->view_layout->size;
-  mojo::RectF bounds;
-  bounds.width = size.width;
-  bounds.height = size.height;
-
   auto update = mojo::gfx::composition::SceneUpdate::New();
-  mojo::gfx::composition::ResourcePtr moterm_resource =
-      ganesh_renderer()->DrawCanvas(
-          size, base::Bind(&MotermView::DrawContent, base::Unretained(this)));
-  DCHECK(moterm_resource);
-  update->resources.insert(kMotermImageResourceId, moterm_resource.Pass());
 
-  auto root_node = mojo::gfx::composition::Node::New();
-  root_node->hit_test_behavior = mojo::gfx::composition::HitTestBehavior::New();
-  root_node->op = mojo::gfx::composition::NodeOp::New();
-  root_node->op->set_image(mojo::gfx::composition::ImageNodeOp::New());
-  root_node->op->get_image()->content_rect = bounds.Clone();
-  root_node->op->get_image()->image_resource_id = kMotermImageResourceId;
-  update->nodes.insert(kRootNodeId, root_node.Pass());
+  const mojo::Size& size = *properties()->view_layout->size;
+  if (size.width > 0 && size.height > 0) {
+    mojo::RectF bounds;
+    bounds.width = size.width;
+    bounds.height = size.height;
+
+    mojo::gfx::composition::ResourcePtr moterm_resource =
+        ganesh_renderer()->DrawCanvas(
+            size, base::Bind(&MotermView::DrawContent, base::Unretained(this)));
+    DCHECK(moterm_resource);
+    update->resources.insert(kMotermImageResourceId, moterm_resource.Pass());
+
+    auto root_node = mojo::gfx::composition::Node::New();
+    root_node->hit_test_behavior =
+        mojo::gfx::composition::HitTestBehavior::New();
+    root_node->op = mojo::gfx::composition::NodeOp::New();
+    root_node->op->set_image(mojo::gfx::composition::ImageNodeOp::New());
+    root_node->op->get_image()->content_rect = bounds.Clone();
+    root_node->op->get_image()->image_resource_id = kMotermImageResourceId;
+    update->nodes.insert(kRootNodeId, root_node.Pass());
+  } else {
+    auto root_node = mojo::gfx::composition::Node::New();
+    update->nodes.insert(kRootNodeId, root_node.Pass());
+  }
 
   scene()->Update(update.Pass());
 
diff --git a/examples/shadows/shadows_view.cc b/examples/shadows/shadows_view.cc
index 30c7c4a..ecde8f6 100644
--- a/examples/shadows/shadows_view.cc
+++ b/examples/shadows/shadows_view.cc
@@ -41,27 +41,36 @@
     return;
 
   // Update the contents of the scene.
-  const mojo::Size& size = *properties()->view_layout->size;
-  mojo::RectF bounds;
-  bounds.width = size.width;
-  bounds.height = size.height;
-
   auto update = mojo::gfx::composition::SceneUpdate::New();
-  mojo::gfx::composition::ResourcePtr content_resource = gl_renderer()->DrawGL(
-      size, true,
-      base::Bind(&ShadowsView::Render, base::Unretained(this), size));
-  DCHECK(content_resource);
-  update->resources.insert(kContentImageResourceId, content_resource.Pass());
 
-  auto root_node = mojo::gfx::composition::Node::New();
-  root_node->content_transform = mojo::Transform::New();
-  mojo::SetIdentityTransform(root_node->content_transform.get());
-  root_node->hit_test_behavior = mojo::gfx::composition::HitTestBehavior::New();
-  root_node->op = mojo::gfx::composition::NodeOp::New();
-  root_node->op->set_image(mojo::gfx::composition::ImageNodeOp::New());
-  root_node->op->get_image()->content_rect = bounds.Clone();
-  root_node->op->get_image()->image_resource_id = kContentImageResourceId;
-  update->nodes.insert(kRootNodeId, root_node.Pass());
+  const mojo::Size& size = *properties()->view_layout->size;
+  if (size.width > 0 && size.height > 0) {
+    mojo::RectF bounds;
+    bounds.width = size.width;
+    bounds.height = size.height;
+
+    mojo::gfx::composition::ResourcePtr content_resource =
+        gl_renderer()->DrawGL(
+            size, true,
+            base::Bind(&ShadowsView::Render, base::Unretained(this), size));
+    DCHECK(content_resource);
+    update->resources.insert(kContentImageResourceId, content_resource.Pass());
+
+    auto root_node = mojo::gfx::composition::Node::New();
+    root_node->content_transform = mojo::Transform::New();
+    mojo::SetIdentityTransform(root_node->content_transform.get());
+    root_node->hit_test_behavior =
+        mojo::gfx::composition::HitTestBehavior::New();
+    root_node->op = mojo::gfx::composition::NodeOp::New();
+    root_node->op->set_image(mojo::gfx::composition::ImageNodeOp::New());
+    root_node->op->get_image()->content_rect = bounds.Clone();
+    root_node->op->get_image()->image_resource_id = kContentImageResourceId;
+    update->nodes.insert(kRootNodeId, root_node.Pass());
+  } else {
+    auto root_node = mojo::gfx::composition::Node::New();
+    update->nodes.insert(kRootNodeId, root_node.Pass());
+  }
+
   scene()->Update(update.Pass());
 
   // Publish the scene.
diff --git a/examples/ui/noodles/rasterizer.cc b/examples/ui/noodles/rasterizer.cc
index 4ec1d30..4bd9095 100644
--- a/examples/ui/noodles/rasterizer.cc
+++ b/examples/ui/noodles/rasterizer.cc
@@ -28,24 +28,30 @@
 void Rasterizer::PublishFrame(std::unique_ptr<Frame> frame) {
   DCHECK(frame);
 
-  mojo::RectF bounds;
-  bounds.width = frame->size().width;
-  bounds.height = frame->size().height;
-
   auto update = mojo::gfx::composition::SceneUpdate::New();
-  mojo::gfx::composition::ResourcePtr content_resource =
-      ganesh_renderer_.DrawCanvas(
-          frame->size(),
-          base::Bind(&Frame::Paint, base::Unretained(frame.get())));
-  DCHECK(content_resource);
-  update->resources.insert(kContentImageResourceId, content_resource.Pass());
 
-  auto root_node = mojo::gfx::composition::Node::New();
-  root_node->op = mojo::gfx::composition::NodeOp::New();
-  root_node->op->set_image(mojo::gfx::composition::ImageNodeOp::New());
-  root_node->op->get_image()->content_rect = bounds.Clone();
-  root_node->op->get_image()->image_resource_id = kContentImageResourceId;
-  update->nodes.insert(kRootNodeId, root_node.Pass());
+  if (frame->size().width > 0 && frame->size().height > 0) {
+    mojo::RectF bounds;
+    bounds.width = frame->size().width;
+    bounds.height = frame->size().height;
+
+    mojo::gfx::composition::ResourcePtr content_resource =
+        ganesh_renderer_.DrawCanvas(
+            frame->size(),
+            base::Bind(&Frame::Paint, base::Unretained(frame.get())));
+    DCHECK(content_resource);
+    update->resources.insert(kContentImageResourceId, content_resource.Pass());
+
+    auto root_node = mojo::gfx::composition::Node::New();
+    root_node->op = mojo::gfx::composition::NodeOp::New();
+    root_node->op->set_image(mojo::gfx::composition::ImageNodeOp::New());
+    root_node->op->get_image()->content_rect = bounds.Clone();
+    root_node->op->get_image()->image_resource_id = kContentImageResourceId;
+    update->nodes.insert(kRootNodeId, root_node.Pass());
+  } else {
+    auto root_node = mojo::gfx::composition::Node::New();
+    update->nodes.insert(kRootNodeId, root_node.Pass());
+  }
 
   scene_->Update(update.Pass());
   scene_->Publish(frame->TakeSceneMetadata());
diff --git a/examples/ui/pdf_viewer/pdf_viewer.cc b/examples/ui/pdf_viewer/pdf_viewer.cc
index aad4d53..233ebe5 100644
--- a/examples/ui/pdf_viewer/pdf_viewer.cc
+++ b/examples/ui/pdf_viewer/pdf_viewer.cc
@@ -169,27 +169,34 @@
     if (!properties())
       return;
 
-    const mojo::Size& size = *properties()->view_layout->size;
-    mojo::RectF bounds;
-    bounds.width = size.width;
-    bounds.height = size.height;
-
     auto update = mojo::gfx::composition::SceneUpdate::New();
-    mojo::gfx::composition::ResourcePtr content_resource =
-        ganesh_renderer()->DrawCanvas(size,
-                                      base::Bind(&PDFDocumentView::DrawContent,
-                                                 base::Unretained(this), size));
-    DCHECK(content_resource);
-    update->resources.insert(kContentImageResourceId, content_resource.Pass());
 
-    auto root_node = mojo::gfx::composition::Node::New();
-    root_node->hit_test_behavior =
-        mojo::gfx::composition::HitTestBehavior::New();
-    root_node->op = mojo::gfx::composition::NodeOp::New();
-    root_node->op->set_image(mojo::gfx::composition::ImageNodeOp::New());
-    root_node->op->get_image()->content_rect = bounds.Clone();
-    root_node->op->get_image()->image_resource_id = kContentImageResourceId;
-    update->nodes.insert(kRootNodeId, root_node.Pass());
+    const mojo::Size& size = *properties()->view_layout->size;
+    if (size.width > 0 && size.height > 0) {
+      mojo::RectF bounds;
+      bounds.width = size.width;
+      bounds.height = size.height;
+
+      mojo::gfx::composition::ResourcePtr content_resource =
+          ganesh_renderer()->DrawCanvas(
+              size, base::Bind(&PDFDocumentView::DrawContent,
+                               base::Unretained(this), size));
+      DCHECK(content_resource);
+      update->resources.insert(kContentImageResourceId,
+                               content_resource.Pass());
+
+      auto root_node = mojo::gfx::composition::Node::New();
+      root_node->hit_test_behavior =
+          mojo::gfx::composition::HitTestBehavior::New();
+      root_node->op = mojo::gfx::composition::NodeOp::New();
+      root_node->op->set_image(mojo::gfx::composition::ImageNodeOp::New());
+      root_node->op->get_image()->content_rect = bounds.Clone();
+      root_node->op->get_image()->image_resource_id = kContentImageResourceId;
+      update->nodes.insert(kRootNodeId, root_node.Pass());
+    } else {
+      auto root_node = mojo::gfx::composition::Node::New();
+      update->nodes.insert(kRootNodeId, root_node.Pass());
+    }
 
     scene()->Update(update.Pass());
 
diff --git a/examples/ui/png_viewer/png_viewer.cc b/examples/ui/png_viewer/png_viewer.cc
index 12d20b8..994c9e6 100644
--- a/examples/ui/png_viewer/png_viewer.cc
+++ b/examples/ui/png_viewer/png_viewer.cc
@@ -49,25 +49,32 @@
     if (!properties())
       return;
 
-    const mojo::Size& size = *properties()->view_layout->size;
-    mojo::RectF bounds;
-    bounds.width = size.width;
-    bounds.height = size.height;
-
     auto update = mojo::gfx::composition::SceneUpdate::New();
-    mojo::gfx::composition::ResourcePtr content_resource =
-        ganesh_renderer()->DrawCanvas(
-            size,
-            base::Bind(&PNGView::DrawContent, base::Unretained(this), size));
-    DCHECK(content_resource);
-    update->resources.insert(kContentImageResourceId, content_resource.Pass());
 
-    auto root_node = mojo::gfx::composition::Node::New();
-    root_node->op = mojo::gfx::composition::NodeOp::New();
-    root_node->op->set_image(mojo::gfx::composition::ImageNodeOp::New());
-    root_node->op->get_image()->content_rect = bounds.Clone();
-    root_node->op->get_image()->image_resource_id = kContentImageResourceId;
-    update->nodes.insert(kRootNodeId, root_node.Pass());
+    const mojo::Size& size = *properties()->view_layout->size;
+    if (size.width > 0 && size.height > 0) {
+      mojo::RectF bounds;
+      bounds.width = size.width;
+      bounds.height = size.height;
+
+      mojo::gfx::composition::ResourcePtr content_resource =
+          ganesh_renderer()->DrawCanvas(
+              size,
+              base::Bind(&PNGView::DrawContent, base::Unretained(this), size));
+      DCHECK(content_resource);
+      update->resources.insert(kContentImageResourceId,
+                               content_resource.Pass());
+
+      auto root_node = mojo::gfx::composition::Node::New();
+      root_node->op = mojo::gfx::composition::NodeOp::New();
+      root_node->op->set_image(mojo::gfx::composition::ImageNodeOp::New());
+      root_node->op->get_image()->content_rect = bounds.Clone();
+      root_node->op->get_image()->image_resource_id = kContentImageResourceId;
+      update->nodes.insert(kRootNodeId, root_node.Pass());
+    } else {
+      auto root_node = mojo::gfx::composition::Node::New();
+      update->nodes.insert(kRootNodeId, root_node.Pass());
+    }
 
     scene()->Update(update.Pass());
 
diff --git a/examples/ui/shapes/shapes_view.cc b/examples/ui/shapes/shapes_view.cc
index c4e2c9d..ea18cb2 100644
--- a/examples/ui/shapes/shapes_view.cc
+++ b/examples/ui/shapes/shapes_view.cc
@@ -34,30 +34,35 @@
   if (!properties())
     return;
 
-  const mojo::Size& size = *properties()->view_layout->size;
-  mojo::RectF bounds;
-  bounds.width = size.width;
-  bounds.height = size.height;
-
   auto update = mojo::gfx::composition::SceneUpdate::New();
 
-  // Draw the content of the view to a texture and include it as an
-  // image resource in the scene.
-  mojo::gfx::composition::ResourcePtr content_resource =
-      ganesh_renderer()->DrawCanvas(
-          size,
-          base::Bind(&ShapesView::DrawContent, base::Unretained(this), size));
-  DCHECK(content_resource);
-  update->resources.insert(kContentImageResourceId, content_resource.Pass());
+  const mojo::Size& size = *properties()->view_layout->size;
+  if (size.width > 0 && size.height > 0) {
+    mojo::RectF bounds;
+    bounds.width = size.width;
+    bounds.height = size.height;
 
-  // Add a root node to the scene graph to draw the image resource to
-  // the screen such that it fills the entire view.
-  auto root_node = mojo::gfx::composition::Node::New();
-  root_node->op = mojo::gfx::composition::NodeOp::New();
-  root_node->op->set_image(mojo::gfx::composition::ImageNodeOp::New());
-  root_node->op->get_image()->content_rect = bounds.Clone();
-  root_node->op->get_image()->image_resource_id = kContentImageResourceId;
-  update->nodes.insert(kRootNodeId, root_node.Pass());
+    // Draw the content of the view to a texture and include it as an
+    // image resource in the scene.
+    mojo::gfx::composition::ResourcePtr content_resource =
+        ganesh_renderer()->DrawCanvas(
+            size,
+            base::Bind(&ShapesView::DrawContent, base::Unretained(this), size));
+    DCHECK(content_resource);
+    update->resources.insert(kContentImageResourceId, content_resource.Pass());
+
+    // Add a root node to the scene graph to draw the image resource to
+    // the screen such that it fills the entire view.
+    auto root_node = mojo::gfx::composition::Node::New();
+    root_node->op = mojo::gfx::composition::NodeOp::New();
+    root_node->op->set_image(mojo::gfx::composition::ImageNodeOp::New());
+    root_node->op->get_image()->content_rect = bounds.Clone();
+    root_node->op->get_image()->image_resource_id = kContentImageResourceId;
+    update->nodes.insert(kRootNodeId, root_node.Pass());
+  } else {
+    auto root_node = mojo::gfx::composition::Node::New();
+    update->nodes.insert(kRootNodeId, root_node.Pass());
+  }
 
   // Submit the scene update.
   scene()->Update(update.Pass());
diff --git a/examples/ui/spinning_cube/spinning_cube_view.cc b/examples/ui/spinning_cube/spinning_cube_view.cc
index e478bde..f4a806f 100644
--- a/examples/ui/spinning_cube/spinning_cube_view.cc
+++ b/examples/ui/spinning_cube/spinning_cube_view.cc
@@ -144,27 +144,34 @@
   cube_.UpdateForTimeDelta(time_delta.InSecondsF());
 
   // Update the contents of the scene.
-  const mojo::Size& size = *properties()->view_layout->size;
-  mojo::RectF bounds;
-  bounds.width = size.width;
-  bounds.height = size.height;
-
   auto update = mojo::gfx::composition::SceneUpdate::New();
-  mojo::gfx::composition::ResourcePtr cube_resource = gl_renderer()->DrawGL(
-      size, true, base::Bind(&SpinningCubeView::DrawCubeWithGL,
-                             base::Unretained(this), size));
-  DCHECK(cube_resource);
-  update->resources.insert(kCubeImageResourceId, cube_resource.Pass());
 
-  auto root_node = mojo::gfx::composition::Node::New();
-  root_node->content_transform = mojo::Transform::New();
-  mojo::SetIdentityTransform(root_node->content_transform.get());
-  root_node->hit_test_behavior = mojo::gfx::composition::HitTestBehavior::New();
-  root_node->op = mojo::gfx::composition::NodeOp::New();
-  root_node->op->set_image(mojo::gfx::composition::ImageNodeOp::New());
-  root_node->op->get_image()->content_rect = bounds.Clone();
-  root_node->op->get_image()->image_resource_id = kCubeImageResourceId;
-  update->nodes.insert(kRootNodeId, root_node.Pass());
+  const mojo::Size& size = *properties()->view_layout->size;
+  if (size.width > 0 && size.height > 0) {
+    mojo::RectF bounds;
+    bounds.width = size.width;
+    bounds.height = size.height;
+
+    mojo::gfx::composition::ResourcePtr cube_resource = gl_renderer()->DrawGL(
+        size, true, base::Bind(&SpinningCubeView::DrawCubeWithGL,
+                               base::Unretained(this), size));
+    DCHECK(cube_resource);
+    update->resources.insert(kCubeImageResourceId, cube_resource.Pass());
+
+    auto root_node = mojo::gfx::composition::Node::New();
+    root_node->content_transform = mojo::Transform::New();
+    mojo::SetIdentityTransform(root_node->content_transform.get());
+    root_node->hit_test_behavior =
+        mojo::gfx::composition::HitTestBehavior::New();
+    root_node->op = mojo::gfx::composition::NodeOp::New();
+    root_node->op->set_image(mojo::gfx::composition::ImageNodeOp::New());
+    root_node->op->get_image()->content_rect = bounds.Clone();
+    root_node->op->get_image()->image_resource_id = kCubeImageResourceId;
+    update->nodes.insert(kRootNodeId, root_node.Pass());
+  } else {
+    auto root_node = mojo::gfx::composition::Node::New();
+    update->nodes.insert(kRootNodeId, root_node.Pass());
+  }
 
   scene()->Update(update.Pass());