Import Cobalt 11.107787
diff --git a/src/cobalt/accessibility/screen_reader_tests.cc b/src/cobalt/accessibility/screen_reader_tests.cc
index 714f243..611d7ed 100644
--- a/src/cobalt/accessibility/screen_reader_tests.cc
+++ b/src/cobalt/accessibility/screen_reader_tests.cc
@@ -173,9 +173,9 @@
       base::Bind(&LiveRegionMutationTest::OnError, base::Unretained(this)),
       base::Bind(&LiveRegionMutationTest::OnClose, base::Unretained(this)),
       base::Closure(), /* window_minimize_callback */
-      NULL /* media_module */, &network_module, kDefaultViewportSize,
-      kDefaultVideoPixelRatio, &resource_provider, kRefreshRate,
-      web_module_options);
+      NULL /* can_play_type_handler */, NULL /* web_media_player_factory */,
+      &network_module, kDefaultViewportSize, kDefaultVideoPixelRatio,
+      &resource_provider, kRefreshRate, web_module_options);
 
   // Wait for the test to quit.
   quit_event_.Wait();
diff --git a/src/cobalt/browser/browser_module.cc b/src/cobalt/browser/browser_module.cc
index 4768d1a..3ad8844 100644
--- a/src/cobalt/browser/browser_module.cc
+++ b/src/cobalt/browser/browser_module.cc
@@ -223,6 +223,7 @@
           new ResourceProviderArrayBufferAllocator(GetResourceProvider())),
       array_buffer_cache_(new dom::ArrayBuffer::Cache(3 * 1024 * 1024)),
 #endif  // defined(ENABLE_GPU_ARRAY_BUFFER_ALLOCATOR)
+      can_play_type_handler_(media::MediaModule::CreateCanPlayTypeHandler()),
       network_module_(&storage_manager_, event_dispatcher_,
                       options_.network_module_options),
       web_module_loaded_(true /* manually_reset */,
@@ -255,6 +256,7 @@
       render_timeout_count_(0),
 #endif
       on_error_retry_count_(0),
+      waiting_for_error_retry_(false),
       will_quit_(false),
       application_state_(initial_application_state),
       splash_screen_cache_(new SplashScreenCache()),
@@ -354,9 +356,7 @@
 
 BrowserModule::~BrowserModule() {
   DCHECK_EQ(MessageLoop::current(), self_message_loop_);
-  if (on_error_retry_timer_.IsRunning()) {
-    on_error_retry_timer_.Stop();
-  }
+  on_error_retry_timer_.Stop();
 #if SB_HAS(CORE_DUMP_HANDLER_SUPPORT)
   SbCoreDumpUnregisterHandler(BrowserModule::CoreDumpHandler, this);
 #endif
@@ -384,9 +384,10 @@
     return;
   }
 
-  if (on_error_retry_timer_.IsRunning()) {
-    on_error_retry_timer_.Stop();
-  }
+  // Clear error handling once we're told to navigate, either because it's the
+  // retry from the error or something decided we should navigate elsewhere.
+  on_error_retry_timer_.Stop();
+  waiting_for_error_retry_ = false;
 
   // Navigations aren't allowed if the app is suspended. If this is the case,
   // simply set the pending navigate url, which will cause the navigation to
@@ -483,8 +484,9 @@
       base::Bind(&BrowserModule::OnError, base::Unretained(this)),
       base::Bind(&BrowserModule::OnWindowClose, base::Unretained(this)),
       base::Bind(&BrowserModule::OnWindowMinimize, base::Unretained(this)),
-      media_module_.get(), &network_module_, viewport_size, video_pixel_ratio,
-      GetResourceProvider(), kLayoutMaxRefreshFrequencyInHz, options));
+      can_play_type_handler_.get(), media_module_.get(), &network_module_,
+      viewport_size, video_pixel_ratio, GetResourceProvider(),
+      kLayoutMaxRefreshFrequencyInHz, options));
   lifecycle_observers_.AddObserver(web_module_.get());
   if (!web_module_recreated_callback_.is_null()) {
     web_module_recreated_callback_.Run();
@@ -891,6 +893,7 @@
 void BrowserModule::OnErrorRetry() {
   ++on_error_retry_count_;
   on_error_retry_time_ = base::TimeTicks::Now();
+  waiting_for_error_retry_ = true;
   TryURLHandlers(
       GURL("h5vcc://network-failure?retry-url=" + pending_navigate_url_));
 }
@@ -1236,7 +1239,7 @@
 
   if (web_module_) {
     web_module_->SetCamera3D(input_device_manager_->camera_3d());
-    web_module_->SetMediaModule(media_module_.get());
+    web_module_->SetWebMediaPlayerFactory(media_module_.get());
     web_module_->SetSize(size, video_pixel_ratio);
   }
 }
@@ -1335,8 +1338,8 @@
   TRACE_EVENT0("cobalt::browser",
                "BrowserModule::StartOrResumeInternalPostStateUpdate");
   // If there's a navigation that's pending, then attempt to navigate to its
-  // specified URL now.
-  if (!pending_navigate_url_.empty()) {
+  // specified URL now, unless we're still waiting for an error retry.
+  if (!pending_navigate_url_.empty() && !waiting_for_error_retry_) {
     Navigate(GURL(pending_navigate_url_));
   }
 }
diff --git a/src/cobalt/browser/browser_module.h b/src/cobalt/browser/browser_module.h
index 2ecdbcf..f3cf4a2 100644
--- a/src/cobalt/browser/browser_module.h
+++ b/src/cobalt/browser/browser_module.h
@@ -44,6 +44,8 @@
 #include "cobalt/dom/wheel_event_init.h"
 #include "cobalt/input/input_device_manager.h"
 #include "cobalt/layout/layout_manager.h"
+#include "cobalt/media/can_play_type_handler.h"
+#include "cobalt/media/media_module.h"
 #include "cobalt/network/network_module.h"
 #include "cobalt/render_tree/resource_provider.h"
 #include "cobalt/render_tree/resource_provider_stub.h"
@@ -390,6 +392,9 @@
   // Controls all media playback related objects/resources.
   scoped_ptr<media::MediaModule> media_module_;
 
+  // Allows checking if particular media type can be played.
+  scoped_ptr<media::CanPlayTypeHandler> can_play_type_handler_;
+
   // Sets up the network component for requesting internet resources.
   network::NetworkModule network_module_;
 
@@ -496,6 +501,11 @@
   // when it is not already active.
   base::OneShotTimer<BrowserModule> on_error_retry_timer_;
 
+  // Set when we've posted a system error for network failure until we receive
+  // the next navigation. This is used to suppress retrying the current URL on
+  // resume until the error retry occurs.
+  bool waiting_for_error_retry_;
+
   // Set when the application is about to quit. May be set from a thread other
   // than the one hosting this object, and read from another.
   bool will_quit_;
diff --git a/src/cobalt/browser/debug_console.cc b/src/cobalt/browser/debug_console.cc
index 5c594a1..b660c60 100644
--- a/src/cobalt/browser/debug_console.cc
+++ b/src/cobalt/browser/debug_console.cc
@@ -188,15 +188,15 @@
       base::Bind(&CreateDebugHub,
                  base::Bind(&DebugConsole::GetMode, base::Unretained(this)),
                  get_debug_server_callback);
-  web_module_.reset(
-      new WebModule(GURL(kInitialDebugConsoleUrl), initial_application_state,
-                    render_tree_produced_callback,
-                    base::Bind(&DebugConsole::OnError, base::Unretained(this)),
-                    WebModule::CloseCallback(), /* window_close_callback */
-                    base::Closure(),            /* window_minimize_callback */
-                    &stub_media_module_, network_module, window_dimensions,
-                    1.f /*video_pixel_ratio*/, resource_provider,
-                    layout_refresh_rate, web_module_options));
+  web_module_.reset(new WebModule(
+      GURL(kInitialDebugConsoleUrl), initial_application_state,
+      render_tree_produced_callback,
+      base::Bind(&DebugConsole::OnError, base::Unretained(this)),
+      WebModule::CloseCallback(), /* window_close_callback */
+      base::Closure(),            /* window_minimize_callback */
+      NULL /* can_play_type_handler */, NULL /* web_media_player_factory */,
+      network_module, window_dimensions, 1.f /*video_pixel_ratio*/,
+      resource_provider, layout_refresh_rate, web_module_options));
 }
 
 DebugConsole::~DebugConsole() {}
diff --git a/src/cobalt/browser/debug_console.h b/src/cobalt/browser/debug_console.h
index 6ed291d..d01403f 100644
--- a/src/cobalt/browser/debug_console.h
+++ b/src/cobalt/browser/debug_console.h
@@ -26,7 +26,6 @@
 #include "cobalt/browser/web_module.h"
 #include "cobalt/debug/debug_hub.h"
 #include "cobalt/dom/keyboard_event_init.h"
-#include "cobalt/media/media_module_stub.h"
 #include "googleurl/src/gurl.h"
 
 namespace cobalt {
@@ -86,8 +85,6 @@
     LOG(ERROR) << error;
   }
 
-  media::MediaModuleStub stub_media_module_;
-
   // The current console visibility mode.  The mutex is required since the debug
   // console's visibility mode may be accessed from both the WebModule thread
   // and the DebugConsole's host thread.
diff --git a/src/cobalt/browser/splash_screen.cc b/src/cobalt/browser/splash_screen.cc
index 811baa0..0c4026b 100644
--- a/src/cobalt/browser/splash_screen.cc
+++ b/src/cobalt/browser/splash_screen.cc
@@ -100,9 +100,9 @@
       *url_to_pass, initial_application_state, render_tree_produced_callback_,
       base::Bind(&OnError), on_window_close,
       base::Closure(),  // window_minimize_callback
-      &stub_media_module_, network_module, window_dimensions,
-      1.f /*video_pixel_ratio*/, resource_provider, layout_refresh_rate,
-      web_module_options));
+      NULL /* can_play_type_handler */, NULL /* web_media_player_factory */,
+      network_module, window_dimensions, 1.f /*video_pixel_ratio*/,
+      resource_provider, layout_refresh_rate, web_module_options));
 }
 
 SplashScreen::~SplashScreen() {
diff --git a/src/cobalt/browser/splash_screen.h b/src/cobalt/browser/splash_screen.h
index f9315d2..bc21bbe 100644
--- a/src/cobalt/browser/splash_screen.h
+++ b/src/cobalt/browser/splash_screen.h
@@ -23,7 +23,6 @@
 #include "cobalt/browser/lifecycle_observer.h"
 #include "cobalt/browser/splash_screen_cache.h"
 #include "cobalt/browser/web_module.h"
-#include "cobalt/media/media_module_stub.h"
 #include "googleurl/src/gurl.h"
 
 namespace cobalt {
@@ -80,8 +79,6 @@
   void OnWindowClosed();
   void OnWindowClosedInternal();
 
-  media::MediaModuleStub stub_media_module_;
-
   WebModule::OnRenderTreeProducedCallback render_tree_produced_callback_;
 
   scoped_ptr<WebModule> web_module_;
diff --git a/src/cobalt/browser/web_module.cc b/src/cobalt/browser/web_module.cc
index 136d23f..0696278 100644
--- a/src/cobalt/browser/web_module.cc
+++ b/src/cobalt/browser/web_module.cc
@@ -183,7 +183,8 @@
 
   void SetSize(math::Size window_dimensions, float video_pixel_ratio);
   void SetCamera3D(const scoped_refptr<input::Camera3D>& camera_3d);
-  void SetMediaModule(media::MediaModule* media_module);
+  void SetWebMediaPlayerFactory(
+      media::WebMediaPlayerFactory* web_media_player_factory);
   void SetImageCacheCapacity(int64_t bytes);
   void SetRemoteTypefaceCacheCapacity(int64_t bytes);
   void SetJavascriptGcThreshold(int64_t bytes);
@@ -525,8 +526,9 @@
       dom_parser_.get(), fetcher_factory_.get(), &resource_provider_,
       animated_image_tracker_.get(), image_cache_.get(),
       reduced_image_cache_capacity_manager_.get(), remote_typeface_cache_.get(),
-      mesh_cache_.get(), local_storage_database_.get(), data.media_module,
-      data.media_module, execution_state_.get(), script_runner_.get(),
+      mesh_cache_.get(), local_storage_database_.get(),
+      data.can_play_type_handler, data.web_media_player_factory,
+      execution_state_.get(), script_runner_.get(),
       global_environment_->script_value_factory(), media_source_registry_.get(),
       web_module_stat_tracker_->dom_stat_tracker(), data.initial_url,
       data.network_module->GetUserAgent(),
@@ -556,9 +558,9 @@
   DCHECK(window_weak_);
 
   environment_settings_.reset(new dom::DOMSettings(
-      kDOMMaxElementDepth, fetcher_factory_.get(), data.network_module,
-      data.media_module, window_, media_source_registry_.get(),
-      blob_registry_.get(), data.media_module, javascript_engine_.get(),
+      kDOMMaxElementDepth, fetcher_factory_.get(), data.network_module, window_,
+      media_source_registry_.get(), blob_registry_.get(),
+      data.can_play_type_handler, javascript_engine_.get(),
       global_environment_.get(), &mutation_observer_task_manager_,
       data.options.dom_settings_options));
   DCHECK(environment_settings_);
@@ -859,11 +861,9 @@
   window_->SetCamera3D(camera_3d);
 }
 
-void WebModule::Impl::SetMediaModule(media::MediaModule* media_module) {
-  window_->set_can_play_type_handler(media_module);
-  window_->set_web_media_player_factory(media_module);
-  environment_settings_->set_media_module(media_module);
-  environment_settings_->set_can_play_type_handler(media_module);
+void WebModule::Impl::SetWebMediaPlayerFactory(
+    media::WebMediaPlayerFactory* web_media_player_factory) {
+  window_->set_web_media_player_factory(web_media_player_factory);
 }
 
 void WebModule::Impl::SetApplicationState(base::ApplicationState state) {
@@ -1044,16 +1044,18 @@
     const OnErrorCallback& error_callback,
     const CloseCallback& window_close_callback,
     const base::Closure& window_minimize_callback,
-    media::MediaModule* media_module, network::NetworkModule* network_module,
-    const math::Size& window_dimensions, float video_pixel_ratio,
-    render_tree::ResourceProvider* resource_provider, float layout_refresh_rate,
-    const Options& options)
+    media::CanPlayTypeHandler* can_play_type_handler,
+    media::WebMediaPlayerFactory* web_media_player_factory,
+    network::NetworkModule* network_module, const math::Size& window_dimensions,
+    float video_pixel_ratio, render_tree::ResourceProvider* resource_provider,
+    float layout_refresh_rate, const Options& options)
     : thread_(options.name.c_str()) {
   ConstructionData construction_data(
       initial_url, initial_application_state, render_tree_produced_callback,
       error_callback, window_close_callback, window_minimize_callback,
-      media_module, network_module, window_dimensions, video_pixel_ratio,
-      resource_provider, kDOMMaxElementDepth, layout_refresh_rate, options);
+      can_play_type_handler, web_media_player_factory, network_module,
+      window_dimensions, video_pixel_ratio, resource_provider,
+      kDOMMaxElementDepth, layout_refresh_rate, options);
 
   // Start the dedicated thread and create the internal implementation
   // object on that thread.
@@ -1254,10 +1256,12 @@
                             base::Unretained(impl_.get()), camera_3d));
 }
 
-void WebModule::SetMediaModule(media::MediaModule* media_module) {
+void WebModule::SetWebMediaPlayerFactory(
+    media::WebMediaPlayerFactory* web_media_player_factory) {
   message_loop()->PostTask(
-      FROM_HERE, base::Bind(&WebModule::Impl::SetMediaModule,
-                            base::Unretained(impl_.get()), media_module));
+      FROM_HERE,
+      base::Bind(&WebModule::Impl::SetWebMediaPlayerFactory,
+                 base::Unretained(impl_.get()), web_media_player_factory));
 }
 
 void WebModule::SetImageCacheCapacity(int64_t bytes) {
diff --git a/src/cobalt/browser/web_module.h b/src/cobalt/browser/web_module.h
index 494e786..e16a184 100644
--- a/src/cobalt/browser/web_module.h
+++ b/src/cobalt/browser/web_module.h
@@ -49,7 +49,8 @@
 #include "cobalt/layout/layout_manager.h"
 #include "cobalt/loader/fetcher_factory.h"
 #include "cobalt/math/size.h"
-#include "cobalt/media/media_module.h"
+#include "cobalt/media/can_play_type_handler.h"
+#include "cobalt/media/web_media_player_factory.h"
 #include "cobalt/network/network_module.h"
 #include "cobalt/render_tree/resource_provider.h"
 #include "cobalt/script/global_environment.h"
@@ -210,7 +211,8 @@
             const OnErrorCallback& error_callback,
             const CloseCallback& window_close_callback,
             const base::Closure& window_minimize_callback,
-            media::MediaModule* media_module,
+            media::CanPlayTypeHandler* can_play_type_handler,
+            media::WebMediaPlayerFactory* web_media_player_factory,
             network::NetworkModule* network_module,
             const math::Size& window_dimensions, float video_pixel_ratio,
             render_tree::ResourceProvider* resource_provider,
@@ -263,7 +265,8 @@
   void SetSize(const math::Size& window_dimensions, float video_pixel_ratio);
 
   void SetCamera3D(const scoped_refptr<input::Camera3D>& camera_3d);
-  void SetMediaModule(media::MediaModule* media_module);
+  void SetWebMediaPlayerFactory(
+      media::WebMediaPlayerFactory* web_media_player_factory);
   void SetImageCacheCapacity(int64_t bytes);
   void SetRemoteTypefaceCacheCapacity(int64_t bytes);
   void SetJavascriptGcThreshold(int64_t bytes);
@@ -291,7 +294,8 @@
         const OnErrorCallback& error_callback,
         const CloseCallback& window_close_callback,
         const base::Closure& window_minimize_callback,
-        media::MediaModule* media_module,
+        media::CanPlayTypeHandler* can_play_type_handler,
+        media::WebMediaPlayerFactory* web_media_player_factory,
         network::NetworkModule* network_module,
         const math::Size& window_dimensions, float video_pixel_ratio,
         render_tree::ResourceProvider* resource_provider,
@@ -303,7 +307,8 @@
           error_callback(error_callback),
           window_close_callback(window_close_callback),
           window_minimize_callback(window_minimize_callback),
-          media_module(media_module),
+          can_play_type_handler(can_play_type_handler),
+          web_media_player_factory(web_media_player_factory),
           network_module(network_module),
           window_dimensions(window_dimensions),
           video_pixel_ratio(video_pixel_ratio),
@@ -318,7 +323,8 @@
     OnErrorCallback error_callback;
     const CloseCallback& window_close_callback;
     const base::Closure& window_minimize_callback;
-    media::MediaModule* media_module;
+    media::CanPlayTypeHandler* can_play_type_handler;
+    media::WebMediaPlayerFactory* web_media_player_factory;
     network::NetworkModule* network_module;
     math::Size window_dimensions;
     float video_pixel_ratio;
diff --git a/src/cobalt/build/build.id b/src/cobalt/build/build.id
index 237f406..d5f2b2e 100644
--- a/src/cobalt/build/build.id
+++ b/src/cobalt/build/build.id
@@ -1 +1 @@
-104700
\ No newline at end of file
+107787
\ No newline at end of file
diff --git a/src/cobalt/dom/custom_event_test.cc b/src/cobalt/dom/custom_event_test.cc
index 5351d97..5c3447b 100644
--- a/src/cobalt/dom/custom_event_test.cc
+++ b/src/cobalt/dom/custom_event_test.cc
@@ -26,7 +26,6 @@
 #include "cobalt/dom/window.h"
 #include "cobalt/dom_parser/parser.h"
 #include "cobalt/loader/fetcher_factory.h"
-#include "cobalt/media/media_module_stub.h"
 #include "cobalt/media_session/media_session.h"
 #include "cobalt/network/network_module.h"
 #include "cobalt/script/global_environment.h"
@@ -59,14 +58,12 @@
         dom_parser_(new dom_parser::Parser(mock_error_callback_)),
         fetcher_factory_(new loader::FetcherFactory(&network_module_)),
         local_storage_database_(NULL),
-        stub_media_module_(new media::MediaModuleStub()),
         url_("about:blank"),
         window_(new Window(
             1920, 1080, 1.f, base::kApplicationStateStarted, css_parser_.get(),
             dom_parser_.get(), fetcher_factory_.get(), NULL, NULL, NULL, NULL,
-            NULL, NULL, &local_storage_database_, stub_media_module_.get(),
-            stub_media_module_.get(), NULL, NULL, NULL, NULL, NULL, url_, "",
-            "en-US", base::Callback<void(const GURL&)>(),
+            NULL, NULL, &local_storage_database_, NULL, NULL, NULL, NULL, NULL,
+            NULL, NULL, url_, "", "en-US", base::Callback<void(const GURL&)>(),
             base::Bind(&MockErrorCallback::Run,
                        base::Unretained(&mock_error_callback_)),
             NULL, network_bridge::PostSender(),
@@ -96,7 +93,6 @@
   network::NetworkModule network_module_;
   scoped_ptr<loader::FetcherFactory> fetcher_factory_;
   dom::LocalStorageDatabase local_storage_database_;
-  scoped_ptr<media::MediaModule> stub_media_module_;
   GURL url_;
   const scoped_refptr<Window> window_;
 };
diff --git a/src/cobalt/dom/dom_settings.cc b/src/cobalt/dom/dom_settings.cc
index 2bdaa40..806b912 100644
--- a/src/cobalt/dom/dom_settings.cc
+++ b/src/cobalt/dom/dom_settings.cc
@@ -22,8 +22,7 @@
 
 DOMSettings::DOMSettings(
     const int max_dom_element_depth, loader::FetcherFactory* fetcher_factory,
-    network::NetworkModule* network_module, media::MediaModule* media_module,
-    const scoped_refptr<Window>& window,
+    network::NetworkModule* network_module, const scoped_refptr<Window>& window,
     MediaSourceRegistry* media_source_registry, Blob::Registry* blob_registry,
     media::CanPlayTypeHandler* can_play_type_handler,
     script::JavaScriptEngine* engine,
@@ -34,7 +33,6 @@
       microphone_options_(options.microphone_options),
       fetcher_factory_(fetcher_factory),
       network_module_(network_module),
-      media_module_(media_module),
       window_(window),
       array_buffer_allocator_(options.array_buffer_allocator),
       array_buffer_cache_(options.array_buffer_cache),
diff --git a/src/cobalt/dom/dom_settings.h b/src/cobalt/dom/dom_settings.h
index c6b8895..afa242d 100644
--- a/src/cobalt/dom/dom_settings.h
+++ b/src/cobalt/dom/dom_settings.h
@@ -22,7 +22,6 @@
 #include "cobalt/dom/mutation_observer_task_manager.h"
 #include "cobalt/dom/url_registry.h"
 #include "cobalt/media/can_play_type_handler.h"
-#include "cobalt/media/media_module.h"
 #include "cobalt/script/environment_settings.h"
 #include "cobalt/speech/microphone.h"
 
@@ -67,7 +66,6 @@
   DOMSettings(const int max_dom_element_depth,
               loader::FetcherFactory* fetcher_factory,
               network::NetworkModule* network_module,
-              media::MediaModule* media_module,
               const scoped_refptr<Window>& window,
               MediaSourceRegistry* media_source_registry,
               Blob::Registry* blob_registry,
@@ -100,10 +98,6 @@
     network_module_ = network_module;
   }
   network::NetworkModule* network_module() const { return network_module_; }
-  media::MediaModule* media_module() const { return media_module_; }
-  void set_media_module(media::MediaModule* media_module) {
-    media_module_ = media_module;
-  }
   script::JavaScriptEngine* javascript_engine() const {
     return javascript_engine_;
   }
@@ -116,10 +110,6 @@
   media::CanPlayTypeHandler* can_play_type_handler() const {
     return can_play_type_handler_;
   }
-  void set_can_play_type_handler(
-      media::CanPlayTypeHandler* can_play_type_handler) {
-    can_play_type_handler_ = can_play_type_handler;
-  }
   MutationObserverTaskManager* mutation_observer_task_manager() const {
     return mutation_observer_task_manager_;
   }
@@ -133,7 +123,6 @@
   const speech::Microphone::Options microphone_options_;
   loader::FetcherFactory* fetcher_factory_;
   network::NetworkModule* network_module_;
-  media::MediaModule* media_module_;
   scoped_refptr<Window> window_;
   ArrayBuffer::Allocator* array_buffer_allocator_;
   ArrayBuffer::Cache* array_buffer_cache_;
diff --git a/src/cobalt/dom/error_event_test.cc b/src/cobalt/dom/error_event_test.cc
index c6c6f76..a115fb8 100644
--- a/src/cobalt/dom/error_event_test.cc
+++ b/src/cobalt/dom/error_event_test.cc
@@ -26,7 +26,6 @@
 #include "cobalt/dom/window.h"
 #include "cobalt/dom_parser/parser.h"
 #include "cobalt/loader/fetcher_factory.h"
-#include "cobalt/media/media_module_stub.h"
 #include "cobalt/media_session/media_session.h"
 #include "cobalt/network/network_module.h"
 #include "cobalt/script/global_environment.h"
@@ -59,14 +58,12 @@
         dom_parser_(new dom_parser::Parser(mock_error_callback_)),
         fetcher_factory_(new loader::FetcherFactory(&network_module_)),
         local_storage_database_(NULL),
-        stub_media_module_(new media::MediaModuleStub()),
         url_("about:blank"),
         window_(new Window(
             1920, 1080, 1.f, base::kApplicationStateStarted, css_parser_.get(),
             dom_parser_.get(), fetcher_factory_.get(), NULL, NULL, NULL, NULL,
-            NULL, NULL, &local_storage_database_, stub_media_module_.get(),
-            stub_media_module_.get(), NULL, NULL, NULL, NULL, NULL, url_, "",
-            "en-US", base::Callback<void(const GURL&)>(),
+            NULL, NULL, &local_storage_database_, NULL, NULL, NULL, NULL, NULL,
+            NULL, NULL, url_, "", "en-US", base::Callback<void(const GURL&)>(),
             base::Bind(&MockErrorCallback::Run,
                        base::Unretained(&mock_error_callback_)),
             NULL, network_bridge::PostSender(),
@@ -96,7 +93,6 @@
   network::NetworkModule network_module_;
   scoped_ptr<loader::FetcherFactory> fetcher_factory_;
   dom::LocalStorageDatabase local_storage_database_;
-  scoped_ptr<media::MediaModule> stub_media_module_;
   GURL url_;
   const scoped_refptr<Window> window_;
 };
diff --git a/src/cobalt/dom/html_element_context.h b/src/cobalt/dom/html_element_context.h
index d7054db..7847423 100644
--- a/src/cobalt/dom/html_element_context.h
+++ b/src/cobalt/dom/html_element_context.h
@@ -77,10 +77,6 @@
   media::CanPlayTypeHandler* can_play_type_handler() {
     return can_play_type_handler_;
   }
-  void set_can_play_type_handler(
-      media::CanPlayTypeHandler* can_play_type_handler) {
-    can_play_type_handler_ = can_play_type_handler;
-  }
   media::WebMediaPlayerFactory* web_media_player_factory() {
     return web_media_player_factory_;
   }
diff --git a/src/cobalt/dom/html_media_element.cc b/src/cobalt/dom/html_media_element.cc
index 7f719c0..006be93 100644
--- a/src/cobalt/dom/html_media_element.cc
+++ b/src/cobalt/dom/html_media_element.cc
@@ -207,11 +207,7 @@
 
 std::string HTMLMediaElement::CanPlayType(const std::string& mime_type,
                                           const std::string& key_system) {
-  if (!html_element_context()->can_play_type_handler()) {
-    DLOG(ERROR) << __FUNCTION__ << "(" << mime_type << ", " << key_system
-                << "): Media playback in PRELOADING is not supported.";
-    return "";
-  }
+  DCHECK(html_element_context()->can_play_type_handler());
 
 #if defined(COBALT_MEDIA_SOURCE_2016)
   DLOG_IF(ERROR, !key_system.empty())
diff --git a/src/cobalt/dom/testing/stub_window.h b/src/cobalt/dom/testing/stub_window.h
index 02ac023..10e3e53 100644
--- a/src/cobalt/dom/testing/stub_window.h
+++ b/src/cobalt/dom/testing/stub_window.h
@@ -25,7 +25,6 @@
 #include "cobalt/dom/window.h"
 #include "cobalt/dom_parser/parser.h"
 #include "cobalt/loader/fetcher_factory.h"
-#include "cobalt/media/media_module_stub.h"
 #include "cobalt/media_session/media_session.h"
 #include "cobalt/network/network_module.h"
 #include "cobalt/script/global_environment.h"
@@ -46,7 +45,6 @@
         dom_parser_(new dom_parser::Parser(base::Bind(&StubErrorCallback))),
         fetcher_factory_(new loader::FetcherFactory(&network_module_)),
         local_storage_database_(NULL),
-        stub_media_module_(new media::MediaModuleStub()),
         url_("about:blank"),
         dom_stat_tracker_(new dom::DomStatTracker("StubWindow")) {
     engine_ = script::JavaScriptEngine::CreateEngine();
@@ -54,8 +52,7 @@
     window_ = new dom::Window(
         1920, 1080, 1.f, base::kApplicationStateStarted, css_parser_.get(),
         dom_parser_.get(), fetcher_factory_.get(), NULL, NULL, NULL, NULL, NULL,
-        NULL, &local_storage_database_, stub_media_module_.get(),
-        stub_media_module_.get(), NULL, NULL, NULL, NULL,
+        NULL, &local_storage_database_, NULL, NULL, NULL, NULL, NULL, NULL,
         dom_stat_tracker_.get(), url_, "", "en-US",
         base::Callback<void(const GURL&)>(), base::Bind(&StubErrorCallback),
         NULL, network_bridge::PostSender(),
@@ -82,7 +79,6 @@
   network::NetworkModule network_module_;
   scoped_ptr<loader::FetcherFactory> fetcher_factory_;
   dom::LocalStorageDatabase local_storage_database_;
-  scoped_ptr<media::MediaModule> stub_media_module_;
   GURL url_;
   scoped_ptr<dom::DomStatTracker> dom_stat_tracker_;
   script::EnvironmentSettings environment_settings_;
diff --git a/src/cobalt/dom/window.h b/src/cobalt/dom/window.h
index 19ab51d..080aa88 100644
--- a/src/cobalt/dom/window.h
+++ b/src/cobalt/dom/window.h
@@ -304,11 +304,6 @@
 
   void SetCamera3D(const scoped_refptr<input::Camera3D>& camera_3d);
 
-  void set_can_play_type_handler(
-      media::CanPlayTypeHandler* can_play_type_handler) {
-    html_element_context_->set_can_play_type_handler(can_play_type_handler);
-  }
-
   void set_web_media_player_factory(
       media::WebMediaPlayerFactory* web_media_player_factory) {
     html_element_context_->set_web_media_player_factory(
diff --git a/src/cobalt/dom/window_test.cc b/src/cobalt/dom/window_test.cc
index dc7b5e4..f1ca6f4 100644
--- a/src/cobalt/dom/window_test.cc
+++ b/src/cobalt/dom/window_test.cc
@@ -24,7 +24,6 @@
 #include "cobalt/dom/screen.h"
 #include "cobalt/dom_parser/parser.h"
 #include "cobalt/loader/fetcher_factory.h"
-#include "cobalt/media/media_module_stub.h"
 #include "cobalt/media_session/media_session.h"
 #include "cobalt/network/network_module.h"
 #include "cobalt/network_bridge/net_poster.h"
@@ -48,14 +47,12 @@
         dom_parser_(new dom_parser::Parser(mock_error_callback_)),
         fetcher_factory_(new loader::FetcherFactory(&network_module_)),
         local_storage_database_(NULL),
-        stub_media_module_(new media::MediaModuleStub()),
         url_("about:blank"),
         window_(new Window(
             1920, 1080, 1.f, base::kApplicationStateStarted, css_parser_.get(),
             dom_parser_.get(), fetcher_factory_.get(), NULL, NULL, NULL, NULL,
-            NULL, NULL, &local_storage_database_, stub_media_module_.get(),
-            stub_media_module_.get(), NULL, NULL, NULL, NULL, NULL, url_, "",
-            "en-US", base::Callback<void(const GURL &)>(),
+            NULL, NULL, &local_storage_database_, NULL, NULL, NULL, NULL, NULL,
+            NULL, NULL, url_, "", "en-US", base::Callback<void(const GURL &)>(),
             base::Bind(&MockErrorCallback::Run,
                        base::Unretained(&mock_error_callback_)),
             NULL, network_bridge::PostSender(),
@@ -74,7 +71,6 @@
   network::NetworkModule network_module_;
   scoped_ptr<loader::FetcherFactory> fetcher_factory_;
   dom::LocalStorageDatabase local_storage_database_;
-  scoped_ptr<media::MediaModule> stub_media_module_;
   GURL url_;
   scoped_refptr<Window> window_;
 };
diff --git a/src/cobalt/layout_tests/layout_snapshot.cc b/src/cobalt/layout_tests/layout_snapshot.cc
index c7afe79..6818552 100644
--- a/src/cobalt/layout_tests/layout_snapshot.cc
+++ b/src/cobalt/layout_tests/layout_snapshot.cc
@@ -20,7 +20,6 @@
 #include "base/run_loop.h"
 #include "base/synchronization/waitable_event.h"
 #include "cobalt/browser/web_module.h"
-#include "cobalt/media/media_module_stub.h"
 #include "cobalt/network/network_module.h"
 #include "cobalt/render_tree/resource_provider.h"
 
@@ -64,10 +63,6 @@
   net_options.require_https = false;
   network::NetworkModule network_module(net_options);
 
-  // We do not support a media module in this mode.
-  scoped_ptr<media::MediaModule> stub_media_module(
-      new media::MediaModuleStub());
-
   // Use 128M of image cache to minimize the effect of image loading.
   const size_t kImageCacheCapacity = 128 * 1024 * 1024;
 
@@ -87,7 +82,8 @@
                  MessageLoop::current()),
       base::Bind(&WebModuleErrorCallback, &run_loop, MessageLoop::current()),
       browser::WebModule::CloseCallback() /* window_close_callback */,
-      base::Closure() /* window_minimize_callback */, stub_media_module.get(),
+      base::Closure() /* window_minimize_callback */,
+      NULL /* can_play_type_handler */, NULL /* web_media_player_factory */,
       &network_module, viewport_size, 1.f, resource_provider, 60.0f,
       web_module_options);
 
diff --git a/src/cobalt/layout_tests/web_platform_tests.cc b/src/cobalt/layout_tests/web_platform_tests.cc
index 2e3a63b..aab3f5f 100644
--- a/src/cobalt/layout_tests/web_platform_tests.cc
+++ b/src/cobalt/layout_tests/web_platform_tests.cc
@@ -159,6 +159,8 @@
   options.output_resolution_override = kDefaultViewportSize;
   scoped_ptr<media::MediaModule> media_module(
       media::MediaModule::Create(NULL, &resource_provider, options));
+  scoped_ptr<media::CanPlayTypeHandler> can_play_type_handler(
+      media::MediaModule::CreateCanPlayTypeHandler());
 
   dom::CspDelegateFactory::GetInstance()->OverrideCreator(
       dom::kCspEnforcementEnable, CspDelegatePermissive::Create);
@@ -178,9 +180,9 @@
                  MessageLoop::current()),
       base::Bind(&WebModuleErrorCallback, &run_loop, MessageLoop::current()),
       browser::WebModule::CloseCallback() /* window_close_callback */,
-      base::Closure() /* window_minimize_callback */, media_module.get(),
-      &network_module, kDefaultViewportSize, 1.f, &resource_provider, 60.0f,
-      web_module_options);
+      base::Closure() /* window_minimize_callback */,
+      can_play_type_handler.get(), media_module.get(), &network_module,
+      kDefaultViewportSize, 1.f, &resource_provider, 60.0f, web_module_options);
   run_loop.Run();
   const std::string extract_results =
       "document.getElementById(\"__testharness__results__\").textContent;";
diff --git a/src/cobalt/media/base/sbplayer_pipeline.cc b/src/cobalt/media/base/sbplayer_pipeline.cc
index eb5397c..d32d468 100644
--- a/src/cobalt/media/base/sbplayer_pipeline.cc
+++ b/src/cobalt/media/base/sbplayer_pipeline.cc
@@ -52,6 +52,7 @@
 
 namespace {
 
+static const int kRetryDelayAtSuspendInMilliseconds = 100;
 const char kVideoDumpFileName[] = "video_content.dmp";
 
 // Used to post parameters to SbPlayerPipeline::StartTask() as the number of
@@ -600,10 +601,15 @@
   DCHECK(audio_stream_);
   DCHECK(video_stream_);
 
+  if (stopped_) {
+    return;
+  }
+
   if (suspended_) {
-    message_loop_->PostTask(
+    message_loop_->PostDelayedTask(
         FROM_HERE,
-        base::Bind(&SbPlayerPipeline::CreatePlayer, this, drm_system));
+        base::Bind(&SbPlayerPipeline::CreatePlayer, this, drm_system),
+        TimeDelta::FromMilliseconds(kRetryDelayAtSuspendInMilliseconds));
     return;
   }
 
@@ -668,9 +674,10 @@
   }
 
   if (suspended_) {
-    message_loop_->PostTask(
+    message_loop_->PostDelayedTask(
         FROM_HERE,
-        base::Bind(&SbPlayerPipeline::OnDemuxerInitialized, this, status));
+        base::Bind(&SbPlayerPipeline::OnDemuxerInitialized, this, status),
+        TimeDelta::FromMilliseconds(kRetryDelayAtSuspendInMilliseconds));
     return;
   }
 
diff --git a/src/cobalt/media/base/starboard_player.cc b/src/cobalt/media/base/starboard_player.cc
index 5189de8..e5b6f4f 100644
--- a/src/cobalt/media/base/starboard_player.cc
+++ b/src/cobalt/media/base/starboard_player.cc
@@ -146,7 +146,6 @@
   }
 
   if (state_ == kSuspended) {
-    DCHECK(!SbPlayerIsValid(player_));
     return;
   }
 
@@ -201,7 +200,6 @@
 
 void StarboardPlayer::SetBounds(int z_index, const gfx::Rect& rect) {
   if (state_ == kSuspended) {
-    DCHECK(!SbPlayerIsValid(player_));
     pending_set_bounds_z_index_ = z_index;
     pending_set_bounds_rect_ = rect;
     return;
@@ -218,7 +216,6 @@
   seek_pending_ = true;
 
   if (state_ == kSuspended) {
-    DCHECK(!SbPlayerIsValid(player_));
     return;
   }
 
@@ -232,7 +229,6 @@
   decoder_buffer_cache_.ClearAll();
 
   if (state_ == kSuspended) {
-    DCHECK(!SbPlayerIsValid(player_));
     preroll_timestamp_ = time;
     return;
   }
@@ -257,7 +253,6 @@
   volume_ = volume;
 
   if (state_ == kSuspended) {
-    DCHECK(!SbPlayerIsValid(player_));
     return;
   }
 
@@ -271,7 +266,6 @@
   playback_rate_ = playback_rate;
 
   if (state_ == kSuspended) {
-    DCHECK(!SbPlayerIsValid(player_));
     return;
   }
 
@@ -289,8 +283,6 @@
 
   base::AutoLock auto_lock(lock_);
   if (state_ == kSuspended) {
-    DCHECK(!SbPlayerIsValid(player_));
-
     if (video_frames_decoded) {
       *video_frames_decoded = cached_video_frames_decoded_;
     }
@@ -323,7 +315,6 @@
 
   // Check if the player is already suspended.
   if (state_ == kSuspended) {
-    DCHECK(!SbPlayerIsValid(player_));
     return;
   }
 
@@ -356,8 +347,6 @@
     return;
   }
 
-  DCHECK(!SbPlayerIsValid(player_));
-
   decoder_buffer_cache_.StartResuming();
 
   CreatePlayer();
diff --git a/src/cobalt/media/can_play_type_handler.h b/src/cobalt/media/can_play_type_handler.h
index fe081a6..eddad62 100644
--- a/src/cobalt/media/can_play_type_handler.h
+++ b/src/cobalt/media/can_play_type_handler.h
@@ -22,12 +22,12 @@
 
 class CanPlayTypeHandler {
  public:
+  virtual ~CanPlayTypeHandler() {}
   virtual std::string CanPlayType(const std::string& mime_type,
                                   const std::string& key_system) = 0;
 
  protected:
   CanPlayTypeHandler() {}
-  ~CanPlayTypeHandler() {}
 
  private:
   DISALLOW_COPY_AND_ASSIGN(CanPlayTypeHandler);
diff --git a/src/cobalt/media/media.gyp b/src/cobalt/media/media.gyp
index c287bdb..cb21ecc 100644
--- a/src/cobalt/media/media.gyp
+++ b/src/cobalt/media/media.gyp
@@ -26,8 +26,6 @@
         'fetcher_buffered_data_source.h',
         'media_module.cc',
         'media_module.h',
-        'media_module_stub.cc',
-        'media_module_stub.h',
         'shell_video_data_allocator_common.cc',
         'shell_video_data_allocator_common.h',
         'web_media_player_factory.h',
diff --git a/src/cobalt/media/media2.gyp b/src/cobalt/media/media2.gyp
index 982b364..79fc225 100644
--- a/src/cobalt/media/media2.gyp
+++ b/src/cobalt/media/media2.gyp
@@ -29,8 +29,6 @@
         'fetcher_buffered_data_source.h',
         'media_module.cc',
         'media_module.h',
-        'media_module_stub.cc',
-        'media_module_stub.h',
         'media_module_starboard.cc',
 
         'base/audio_codecs.cc',
diff --git a/src/cobalt/media/media_module.h b/src/cobalt/media/media_module.h
index 7d21976..9391c89 100644
--- a/src/cobalt/media/media_module.h
+++ b/src/cobalt/media/media_module.h
@@ -52,8 +52,7 @@
 #endif  // !defined(COBALT_MEDIA_SOURCE_2016)
 
 // TODO: Collapse MediaModule into ShellMediaPlatform.
-class MediaModule : public CanPlayTypeHandler,
-                    public WebMediaPlayerFactory,
+class MediaModule : public WebMediaPlayerFactory,
                     public WebMediaPlayerDelegate {
  public:
   struct Options {
@@ -75,6 +74,9 @@
   static math::Size CalculateOutputResolution(
       system_window::SystemWindow* system_window,
       const base::optional<math::Size>& output_resolution_override);
+  // MediaModule implementation should implement this function to allow creation
+  // of CanPlayTypeHandler.
+  static scoped_ptr<CanPlayTypeHandler> CreateCanPlayTypeHandler();
 
   virtual ~MediaModule() {}
 
diff --git a/src/cobalt/media/media_module_starboard.cc b/src/cobalt/media/media_module_starboard.cc
index 558bdfb..6642d2f 100644
--- a/src/cobalt/media/media_module_starboard.cc
+++ b/src/cobalt/media/media_module_starboard.cc
@@ -44,15 +44,8 @@
 typedef ::media::ShellMediaPlatformStarboard ShellMediaPlatformStarboard;
 #endif  // !defined(COBALT_MEDIA_SOURCE_2016)
 
-class MediaModuleStarboard : public MediaModule {
+class CanPlayTypeHandlerStarboard : public CanPlayTypeHandler {
  public:
-  MediaModuleStarboard(system_window::SystemWindow* system_window,
-                       render_tree::ResourceProvider* resource_provider,
-                       const Options& options)
-      : options_(options),
-        system_window_(system_window),
-        media_platform_(resource_provider) {}
-
   std::string CanPlayType(const std::string& mime_type,
                           const std::string& key_system) OVERRIDE {
     SbMediaSupportType type =
@@ -68,6 +61,17 @@
     NOTREACHED();
     return "";
   }
+};
+
+class MediaModuleStarboard : public MediaModule {
+ public:
+  MediaModuleStarboard(system_window::SystemWindow* system_window,
+                       render_tree::ResourceProvider* resource_provider,
+                       const Options& options)
+      : options_(options),
+        system_window_(system_window),
+        media_platform_(resource_provider) {}
+
   scoped_ptr<WebMediaPlayer> CreateWebMediaPlayer(
       WebMediaPlayerClient* client) OVERRIDE {
     TRACK_MEMORY_SCOPE("Media");
@@ -124,5 +128,9 @@
       new MediaModuleStarboard(system_window, resource_provider, options));
 }
 
+scoped_ptr<CanPlayTypeHandler> MediaModule::CreateCanPlayTypeHandler() {
+  return make_scoped_ptr<CanPlayTypeHandler>(new CanPlayTypeHandlerStarboard);
+}
+
 }  // namespace media
 }  // namespace cobalt
diff --git a/src/cobalt/media/media_module_stub.h b/src/cobalt/media/media_module_stub.h
deleted file mode 100644
index d5d3d4e..0000000
--- a/src/cobalt/media/media_module_stub.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2015 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef COBALT_MEDIA_MEDIA_MODULE_STUB_H_
-#define COBALT_MEDIA_MEDIA_MODULE_STUB_H_
-
-#include <string>
-
-#include "cobalt/media/media_module.h"
-
-namespace cobalt {
-namespace media {
-
-#if !defined(COBALT_MEDIA_SOURCE_2016)
-typedef ::media::WebMediaPlayerClient WebMediaPlayerClient;
-#endif  // !defined(WebMediaPlayerDelegate)
-
-class MediaModuleStub : public MediaModule {
- public:
-  MediaModuleStub() {}
-
-  std::string CanPlayType(const std::string& mime_type,
-                          const std::string& key_system) OVERRIDE;
-  scoped_ptr<WebMediaPlayer> CreateWebMediaPlayer(
-      WebMediaPlayerClient* client) OVERRIDE;
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_MEDIA_MODULE_STUB_H_
diff --git a/src/cobalt/network/starboard/user_agent_string_factory_starboard.cc b/src/cobalt/network/starboard/user_agent_string_factory_starboard.cc
index 3487dd7..b021729 100644
--- a/src/cobalt/network/starboard/user_agent_string_factory_starboard.cc
+++ b/src/cobalt/network/starboard/user_agent_string_factory_starboard.cc
@@ -27,7 +27,8 @@
 
 #if SB_API_VERSION == SB_EXPERIMENTAL_API_VERSION
 const char kStarboardStabilitySuffix[] = "-Experimental";
-#elif SB_API_VERSION >= SB_RELEASE_CANDIDATE_API_VERSION && \
+#elif defined(SB_RELEASE_CANDIDATE_API_VERSION) && \
+    SB_API_VERSION >= SB_RELEASE_CANDIDATE_API_VERSION && \
     SB_API_VERSION < SB_EXPERIMENTAL_API_VERSION
 const char kStarboardStabilitySuffix[] = "-ReleaseCandidate";
 #else
diff --git a/src/cobalt/script/mozjs-45/conversion_helpers.h b/src/cobalt/script/mozjs-45/conversion_helpers.h
index c23b660..7683d8d 100644
--- a/src/cobalt/script/mozjs-45/conversion_helpers.h
+++ b/src/cobalt/script/mozjs-45/conversion_helpers.h
@@ -22,6 +22,7 @@
 #include "base/memory/scoped_ptr.h"
 #include "base/optional.h"
 #include "base/stringprintf.h"
+#include "cobalt/base/compiler.h"
 #include "cobalt/base/enable_if.h"
 #include "cobalt/base/token.h"
 #include "cobalt/script/mozjs-45/mozjs_callback_interface_holder.h"
@@ -121,7 +122,9 @@
   DCHECK_EQ(conversion_flags, kNoConversionFlags)
       << "No conversion flags supported.";
   DCHECK(out_boolean);
-  // ToBoolean implements the ECMAScript ToBoolean operation.
+  // |JS::ToBoolean| implements the ECMAScript ToBoolean operation.
+  // Note that |JS::ToBoolean| will handle the case in which |value| is of
+  // type Symbol without throwing.
   *out_boolean = JS::ToBoolean(value);
 }
 
@@ -197,6 +200,12 @@
   TRACK_MEMORY_SCOPE("Javascript");
   DCHECK(out_number);
 
+  if (UNLIKELY(value.isSymbol())) {
+    exception_state->SetSimpleException(
+        kTypeError, "Cannot convert a Symbol value to a number");
+    return;
+  }
+
   int32_t out;
   // Convert a JavaScript value to an integer type as specified by the
   // ECMAScript standard.
@@ -226,6 +235,13 @@
                                  (sizeof(T) > 4),
                              T>::type* = NULL) {
   TRACK_MEMORY_SCOPE("Javascript");
+
+  if (UNLIKELY(value.isSymbol())) {
+    exception_state->SetSimpleException(
+        kTypeError, "Cannot convert a Symbol value to a number");
+    return;
+  }
+
   double to_number;
   JS::ToNumber(context, value, &to_number);
 
@@ -294,6 +310,12 @@
   TRACK_MEMORY_SCOPE("Javascript");
   DCHECK(out_number);
 
+  if (UNLIKELY(value.isSymbol())) {
+    exception_state->SetSimpleException(
+        kTypeError, "Cannot convert a Symbol value to a number");
+    return;
+  }
+
   uint32_t out;
   // Convert a JavaScript value to an integer type as specified by the
   // ECMAScript standard.
@@ -327,6 +349,12 @@
   TRACK_MEMORY_SCOPE("Javascript");
   DCHECK(out_number);
 
+  if (UNLIKELY(value.isSymbol())) {
+    exception_state->SetSimpleException(
+        kTypeError, "Cannot convert a Symbol value to a number");
+    return;
+  }
+
   uint64_t out;
   // This produces and IDL unsigned long long.
   // TODO: Consider only creating |value_to_convert| if the conversion flag is
@@ -382,6 +410,13 @@
   DCHECK_EQ(conversion_flags & ~kConversionFlagsNumeric, 0)
       << "Unexpected conversion flags found.";
   DCHECK(out_number);
+
+  if (UNLIKELY(value.isSymbol())) {
+    exception_state->SetSimpleException(
+        kTypeError, "Cannot convert a Symbol value to a number");
+    return;
+  }
+
   double double_value;
   if (!JS::ToNumber(context, value, &double_value)) {
     exception_state->SetSimpleException(kNotNumberType);
diff --git a/src/cobalt/speech/sandbox/speech_sandbox.cc b/src/cobalt/speech/sandbox/speech_sandbox.cc
index 8638535..11e31f4 100644
--- a/src/cobalt/speech/sandbox/speech_sandbox.cc
+++ b/src/cobalt/speech/sandbox/speech_sandbox.cc
@@ -75,7 +75,7 @@
     const dom::DOMSettings::Options& dom_settings_options) {
   scoped_ptr<script::EnvironmentSettings> environment_settings(
       new dom::DOMSettings(kDOMMaxElementDepth, NULL, network_module_.get(),
-                           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+                           NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                            dom_settings_options));
   DCHECK(environment_settings);
 
diff --git a/src/cobalt/websocket/web_socket_test.cc b/src/cobalt/websocket/web_socket_test.cc
index ebca33f..5600dac 100644
--- a/src/cobalt/websocket/web_socket_test.cc
+++ b/src/cobalt/websocket/web_socket_test.cc
@@ -39,7 +39,7 @@
  public:
   FakeSettings()
       : dom::DOMSettings(0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-                         NULL, NULL),
+                         NULL),
         base_("https://example.com") {
     this->set_network_module(NULL);
   }
diff --git a/src/cobalt/xhr/xml_http_request_test.cc b/src/cobalt/xhr/xml_http_request_test.cc
index 5863f7f..329e9e8 100644
--- a/src/cobalt/xhr/xml_http_request_test.cc
+++ b/src/cobalt/xhr/xml_http_request_test.cc
@@ -94,7 +94,7 @@
  public:
   FakeSettings()
       : dom::DOMSettings(0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-                         NULL, NULL),
+                         NULL),
         example_("http://example.com") {}
   const GURL& base_url() const OVERRIDE { return example_; }
 
diff --git a/src/starboard/common/common.cc b/src/starboard/common/common.cc
index 82102fb..acf6e63 100644
--- a/src/starboard/common/common.cc
+++ b/src/starboard/common/common.cc
@@ -23,7 +23,8 @@
     "own risk!  We don't recommend this for third parties.")
 #endif
 
-#if SB_API_VERSION >= SB_RELEASE_CANDIDATE_API_VERSION && \
+#if defined(SB_RELEASE_CANDIDATE_API_VERSION) && \
+    SB_API_VERSION >= SB_RELEASE_CANDIDATE_API_VERSION && \
     SB_API_VERSION < SB_EXPERIMENTAL_API_VERSION
 #pragma message( \
     "Your platform's SB_API_VERSION >= SB_RELEASE_CANDIDATE_API_VERSION. " \
diff --git a/src/starboard/configuration.h b/src/starboard/configuration.h
index 057bb38..58d12c0 100644
--- a/src/starboard/configuration.h
+++ b/src/starboard/configuration.h
@@ -53,7 +53,8 @@
 // changes. It is reasonable to base a port on the Release Candidate API
 // version, but be aware that small incompatible changes may still be made to
 // it.
-#define SB_RELEASE_CANDIDATE_API_VERSION 7
+// The following will be uncommented when an API version is a release candidate.
+// #define SB_RELEASE_CANDIDATE_API_VERSION 8
 
 // --- Experimental Feature Defines ------------------------------------------
 
@@ -68,7 +69,6 @@
 //   #define SB_MY_EXPERIMENTAL_FEATURE_VERSION SB_EXPERIMENTAL_API_VERSION
 
 // --- Release Candidate Feature Defines -------------------------------------
-#define SB_DECODE_TARGET_PLANE_FORMAT_VERSION SB_RELEASE_CANDIDATE_API_VERSION
 
 // --- Common Detected Features ----------------------------------------------
 
diff --git a/src/starboard/raspi/shared/open_max/open_max_component.cc b/src/starboard/raspi/shared/open_max/open_max_component.cc
index 6a25305..665f74b 100644
--- a/src/starboard/raspi/shared/open_max/open_max_component.cc
+++ b/src/starboard/raspi/shared/open_max/open_max_component.cc
@@ -176,6 +176,10 @@
 
   {
     ScopedLock scoped_lock(mutex_);
+    if (output_buffers_.empty()) {
+      SB_DCHECK(outstanding_output_buffers_ == 0);
+      return;
+    }
     SB_DCHECK(outstanding_output_buffers_ > 0);
     --outstanding_output_buffers_;
 
diff --git a/src/starboard/raspi/shared/open_max/video_decoder.cc b/src/starboard/raspi/shared/open_max/video_decoder.cc
index f0e3909..2f87251 100644
--- a/src/starboard/raspi/shared/open_max/video_decoder.cc
+++ b/src/starboard/raspi/shared/open_max/video_decoder.cc
@@ -96,27 +96,24 @@
 }
 
 bool VideoDecoder::TryToDeliverOneFrame() {
-  OMX_BUFFERHEADERTYPE* buffer = NULL;
+  scoped_refptr<VideoFrame> frame;
   {
     ScopedLock scoped_lock(mutex_);
-    if (!filled_buffers_.empty()) {
-      buffer = filled_buffers_.front();
+    if (filled_buffers_.empty()) {
+      return false;
     }
-  }
-  if (buffer) {
-    if (scoped_refptr<VideoFrame> frame = CreateFrame(buffer)) {
-      host_->OnDecoderStatusUpdate(kNeedMoreInput, frame);
-      {
-        ScopedLock scoped_lock(mutex_);
-        SB_DCHECK(!filled_buffers_.empty());
-        filled_buffers_.pop();
-        freed_buffers_.push(buffer);
-      }
-      return true;
+    OMX_BUFFERHEADERTYPE* buffer = filled_buffers_.front();
+    frame = CreateFrame(buffer);
+    if (!frame) {
+      return false;
     }
-  }
 
-  return false;
+    SB_DCHECK(!filled_buffers_.empty());
+    filled_buffers_.pop();
+    freed_buffers_.push(buffer);
+  }
+  host_->OnDecoderStatusUpdate(kNeedMoreInput, frame);
+  return true;
 }
 
 // static
@@ -202,11 +199,11 @@
       eos_written = component.WriteEOS();
       stream_ended = true;
     } else if (event->type == Event::kReset) {
+      ScopedLock scoped_lock(mutex_);
       component.Flush();
       stream_ended = false;
       eos_written = false;
 
-      ScopedLock scoped_lock(mutex_);
       while (!freed_buffers_.empty()) {
         component.DropOutputBuffer(freed_buffers_.front());
         freed_buffers_.pop();
@@ -226,6 +223,7 @@
     delete event;
   }
 
+  ScopedLock scoped_lock(mutex_);
   while (!freed_buffers_.empty()) {
     component.DropOutputBuffer(freed_buffers_.front());
     freed_buffers_.pop();
diff --git a/src/starboard/shared/starboard/application.cc b/src/starboard/shared/starboard/application.cc
index 76aa778..45f3162 100644
--- a/src/starboard/shared/starboard/application.cc
+++ b/src/starboard/shared/starboard/application.cc
@@ -273,7 +273,7 @@
         return true;
       }
 
-      if (state() == kStatePaused) {
+      if (state() == kStatePaused || state() == kStatePreloading) {
         Inject(new Event(kSbEventTypeSuspend, NULL, NULL));
         Inject(scoped_event.release());
         return true;