Import Cobalt 6.18938

Change-Id: Ief58a17a0507849f192d40268256b4e4f695405d
diff --git a/src/cobalt/build/build.id b/src/cobalt/build/build.id
index 40a5cc2..66145f8 100644
--- a/src/cobalt/build/build.id
+++ b/src/cobalt/build/build.id
@@ -1 +1 @@
-16440
\ No newline at end of file
+18938
\ No newline at end of file
diff --git a/src/cobalt/dom/font_cache.cc b/src/cobalt/dom/font_cache.cc
index 9c9750e..831d15e 100644
--- a/src/cobalt/dom/font_cache.cc
+++ b/src/cobalt/dom/font_cache.cc
@@ -35,7 +35,7 @@
     : cached_remote_typeface_reference_(
           new loader::font::CachedRemoteTypefaceReferenceWithCallbacks(
               cached_remote_typeface, typeface_load_event_callback,
-              typeface_load_event_callback, typeface_load_event_callback)),
+              typeface_load_event_callback)),
       request_timer_(new base::Timer(false, false)) {
   request_timer_->Start(FROM_HERE,
                         base::TimeDelta::FromMilliseconds(kRequestTimerDelay),
diff --git a/src/cobalt/dom/font_cache_test.cc b/src/cobalt/dom/font_cache_test.cc
index a46b631..b283272 100644
--- a/src/cobalt/dom/font_cache_test.cc
+++ b/src/cobalt/dom/font_cache_test.cc
@@ -98,7 +98,7 @@
       CreateFontFaceMapHelper(family_name, postscript_font_name);
   font_cache_->SetFontFaceMap(ffm.Pass());
 
-  EXPECT_CALL(loader_factory_, CreateTypefaceLoaderMock(_, _, _, _, _))
+  EXPECT_CALL(loader_factory_, CreateTypefaceLoaderMock(_, _, _, _))
       .Times(0);
 
   EXPECT_CALL(mock_resource_provider_,
@@ -122,7 +122,7 @@
   EXPECT_CALL(mock_resource_provider_,
               GetLocalTypefaceIfAvailableMock(invalid_postscript_font_name))
       .Times(1);
-  EXPECT_CALL(loader_factory_, CreateTypefaceLoaderMock(_, _, _, _, _));
+  EXPECT_CALL(loader_factory_, CreateTypefaceLoaderMock(_, _, _, _));
 
   FontListFont::State state;
   scoped_refptr<render_tree::Font> f =
diff --git a/src/cobalt/dom/html_element.cc b/src/cobalt/dom/html_element.cc
index fbd71cd..14c79f4 100644
--- a/src/cobalt/dom/html_element.cc
+++ b/src/cobalt/dom/html_element.cc
@@ -1060,8 +1060,7 @@
             &HTMLElement::OnBackgroundImageLoaded, base::Unretained(this));
         cached_images.push_back(
             new loader::image::CachedImageReferenceWithCallbacks(
-                cached_image, loaded_callback, base::Closure(),
-                base::Closure()));
+                cached_image, loaded_callback, base::Closure()));
       }
     }
 
diff --git a/src/cobalt/dom/html_image_element.cc b/src/cobalt/dom/html_image_element.cc
index 007192d..f3f2fa7 100644
--- a/src/cobalt/dom/html_image_element.cc
+++ b/src/cobalt/dom/html_image_element.cc
@@ -143,8 +143,6 @@
       new loader::image::CachedImage::OnLoadedCallbackHandler(
           cached_image, base::Bind(&HTMLImageElement::OnLoadingSuccess,
                                    base::Unretained(this)),
-          base::Bind(&HTMLImageElement::OnLoadingFailure,
-                     base::Unretained(this)),
           base::Bind(&HTMLImageElement::OnLoadingError,
                      base::Unretained(this))));
   node_document()->IncreaseLoadingCounter();
@@ -157,14 +155,6 @@
   cached_image_loaded_callback_handler_.reset();
 }
 
-void HTMLImageElement::OnLoadingFailure() {
-  TRACE_EVENT0("cobalt::dom", "HTMLImageElement::OnLoadingFailure()");
-  // No event is dispatched.
-  AllowGarbageCollection();
-  node_document()->DecreaseLoadingCounterAndMaybeDispatchLoadEvent();
-  cached_image_loaded_callback_handler_.reset();
-}
-
 void HTMLImageElement::OnLoadingError() {
   TRACE_EVENT0("cobalt::dom", "HTMLImageElement::OnLoadingError()");
   AllowGarbageCollectionAfterEventIsDispatched(base::Tokens::error());
diff --git a/src/cobalt/dom/html_image_element.h b/src/cobalt/dom/html_image_element.h
index 8fcf822..3a871a5 100644
--- a/src/cobalt/dom/html_image_element.h
+++ b/src/cobalt/dom/html_image_element.h
@@ -64,7 +64,6 @@
   void UpdateImageData();
 
   void OnLoadingSuccess();
-  void OnLoadingFailure();
   void OnLoadingError();
 
   void PreventGarbageCollectionUntilEventIsDispatched(base::Token event_name);
diff --git a/src/cobalt/loader/font/typeface_decoder.cc b/src/cobalt/loader/font/typeface_decoder.cc
index 9d2e6db..81fcedc 100644
--- a/src/cobalt/loader/font/typeface_decoder.cc
+++ b/src/cobalt/loader/font/typeface_decoder.cc
@@ -23,15 +23,12 @@
 TypefaceDecoder::TypefaceDecoder(
     render_tree::ResourceProvider* resource_provider,
     const SuccessCallback& success_callback,
-    const FailureCallback& failure_callback,
     const ErrorCallback& error_callback)
     : resource_provider_(resource_provider),
       success_callback_(success_callback),
       error_callback_(error_callback),
       is_raw_data_too_large_(false),
       suspended_(false) {
-  UNREFERENCED_PARAMETER(failure_callback);
-
   DCHECK(resource_provider_);
   DCHECK(!success_callback_.is_null());
   DCHECK(!error_callback_.is_null());
diff --git a/src/cobalt/loader/font/typeface_decoder.h b/src/cobalt/loader/font/typeface_decoder.h
index 83ed308..2a611c4 100644
--- a/src/cobalt/loader/font/typeface_decoder.h
+++ b/src/cobalt/loader/font/typeface_decoder.h
@@ -36,12 +36,10 @@
  public:
   typedef base::Callback<void(const scoped_refptr<render_tree::Typeface>&)>
       SuccessCallback;
-  typedef base::Callback<void(const std::string&)> FailureCallback;
   typedef base::Callback<void(const std::string&)> ErrorCallback;
 
   TypefaceDecoder(render_tree::ResourceProvider* resource_provider,
                   const SuccessCallback& success_callback,
-                  const FailureCallback& failure_callback,
                   const ErrorCallback& error_callback);
 
   // From Decoder.
diff --git a/src/cobalt/loader/font/typeface_decoder_test.cc b/src/cobalt/loader/font/typeface_decoder_test.cc
index 4d12892..ad4046d 100644
--- a/src/cobalt/loader/font/typeface_decoder_test.cc
+++ b/src/cobalt/loader/font/typeface_decoder_test.cc
@@ -40,7 +40,6 @@
     typeface = value;
   }
 
-  MOCK_METHOD1(FailureCallback, void(const std::string& message));
   MOCK_METHOD1(ErrorCallback, void(const std::string& message));
 
   scoped_refptr<render_tree::Typeface> typeface;
@@ -59,7 +58,6 @@
 
   scoped_refptr<render_tree::Typeface> Typeface();
 
-  void ExpectCallWithFailure(const std::string& message);
   void ExpectCallWithError(const std::string& message);
 
  protected:
@@ -73,8 +71,6 @@
       &resource_provider_,
       base::Bind(&MockTypefaceDecoderCallback::SuccessCallback,
                  base::Unretained(&typeface_decoder_callback_)),
-      base::Bind(&MockTypefaceDecoderCallback::FailureCallback,
-                 base::Unretained(&typeface_decoder_callback_)),
       base::Bind(&MockTypefaceDecoderCallback::ErrorCallback,
                  base::Unretained(&typeface_decoder_callback_))));
 }
@@ -96,10 +92,6 @@
   return typeface_decoder_callback_.typeface;
 }
 
-void MockTypefaceDecoder::ExpectCallWithFailure(const std::string& message) {
-  EXPECT_CALL(typeface_decoder_callback_, FailureCallback(message));
-}
-
 void MockTypefaceDecoder::ExpectCallWithError(const std::string& message) {
   EXPECT_CALL(typeface_decoder_callback_, ErrorCallback(message));
 }
diff --git a/src/cobalt/loader/image/image_decoder.cc b/src/cobalt/loader/image/image_decoder.cc
index eb95ee6..b50c0dc 100644
--- a/src/cobalt/loader/image/image_decoder.cc
+++ b/src/cobalt/loader/image/image_decoder.cc
@@ -81,11 +81,9 @@
 
 ImageDecoder::ImageDecoder(render_tree::ResourceProvider* resource_provider,
                            const SuccessCallback& success_callback,
-                           const FailureCallback& failure_callback,
                            const ErrorCallback& error_callback)
     : resource_provider_(resource_provider),
       success_callback_(success_callback),
-      failure_callback_(failure_callback),
       error_callback_(error_callback),
       state_(kWaitingForHeader) {
   TRACE_EVENT0("cobalt::loader::image", "ImageDecoder::ImageDecoder()");
@@ -111,20 +109,20 @@
     // The server successfully processed the request and expected some contents,
     // but it is not returning any content.
     state_ = kNotApplicable;
-    CacheMessage(&failure_message_, "No content returned, but expected some.");
+    CacheMessage(&error_message_, "No content returned, but expected some.");
   }
 
   if (headers->response_code() == net::HTTP_NO_CONTENT) {
     // The server successfully processed the request, but is not returning any
     // content.
     state_ = kNotApplicable;
-    CacheMessage(&failure_message_, "No content returned.");
+    CacheMessage(&error_message_, "No content returned.");
   }
 
   bool success = headers->GetMimeType(&mime_type_);
   if (!success || !net::IsSupportedImageMimeType(mime_type_)) {
     state_ = kNotApplicable;
-    CacheMessage(&failure_message_, "Not an image mime type.");
+    CacheMessage(&error_message_, "Not an image mime type.");
   }
 
   return kLoadResponseContinue;
@@ -171,7 +169,7 @@
     case kWaitingForHeader:
       if (signature_cache_.position == 0) {
         // no image is available.
-        failure_callback_.Run(failure_message_);
+        error_callback_.Run(error_message_);
       } else {
         error_callback_.Run("No enough image data for header.");
       }
@@ -180,14 +178,14 @@
       error_callback_.Run("Unsupported image format.");
       break;
     case kNoResourceProvider:
-      failure_callback_.Run("No resource provider was passed to the decoder.");
+      error_callback_.Run("No resource provider was passed to the decoder.");
       break;
     case kSuspended:
       DLOG(WARNING) << __FUNCTION__ << "[" << this << "] while suspended.";
       break;
     case kNotApplicable:
       // no image is available.
-      failure_callback_.Run(failure_message_);
+      error_callback_.Run(error_message_);
       break;
   }
 }
diff --git a/src/cobalt/loader/image/image_decoder.h b/src/cobalt/loader/image/image_decoder.h
index 00902bc..53e6cba 100644
--- a/src/cobalt/loader/image/image_decoder.h
+++ b/src/cobalt/loader/image/image_decoder.h
@@ -38,12 +38,10 @@
  public:
   typedef base::Callback<void(const scoped_refptr<render_tree::Image>&)>
       SuccessCallback;
-  typedef base::Callback<void(const std::string&)> FailureCallback;
   typedef base::Callback<void(const std::string&)> ErrorCallback;
 
   ImageDecoder(render_tree::ResourceProvider* resource_provider,
                const SuccessCallback& success_callback,
-               const FailureCallback& failure_callback,
                const ErrorCallback& error_callback);
 
   // From Decoder.
@@ -83,12 +81,11 @@
 
   render_tree::ResourceProvider* resource_provider_;
   const SuccessCallback success_callback_;
-  const FailureCallback failure_callback_;
   const ErrorCallback error_callback_;
   scoped_ptr<ImageDataDecoder> decoder_;
   SignatureCache signature_cache_;
   State state_;
-  std::string failure_message_;
+  std::string error_message_;
   std::string mime_type_;
 };
 
diff --git a/src/cobalt/loader/image/image_decoder_test.cc b/src/cobalt/loader/image/image_decoder_test.cc
index dafc54b..b2aa170 100644
--- a/src/cobalt/loader/image/image_decoder_test.cc
+++ b/src/cobalt/loader/image/image_decoder_test.cc
@@ -40,7 +40,6 @@
     image = value;
   }
 
-  MOCK_METHOD1(FailureCallback, void(const std::string& message));
   MOCK_METHOD1(ErrorCallback, void(const std::string& message));
 
   scoped_refptr<render_tree::Image> image;
@@ -63,7 +62,6 @@
 
   scoped_refptr<render_tree::Image> Image();
 
-  void ExpectCallWithFailure(const std::string& message);
   void ExpectCallWithError(const std::string& message);
 
  protected:
@@ -77,8 +75,6 @@
       new ImageDecoder(&resource_provider_,
                        base::Bind(&MockImageDecoderCallback::SuccessCallback,
                                   base::Unretained(&image_decoder_callback_)),
-                       base::Bind(&MockImageDecoderCallback::FailureCallback,
-                                  base::Unretained(&image_decoder_callback_)),
                        base::Bind(&MockImageDecoderCallback::ErrorCallback,
                                   base::Unretained(&image_decoder_callback_))));
 }
@@ -105,10 +101,6 @@
   return image_decoder_callback_.image;
 }
 
-void MockImageDecoder::ExpectCallWithFailure(const std::string& message) {
-  EXPECT_CALL(image_decoder_callback_, FailureCallback(message));
-}
-
 void MockImageDecoder::ExpectCallWithError(const std::string& message) {
   EXPECT_CALL(image_decoder_callback_, ErrorCallback(message));
 }
@@ -164,7 +156,7 @@
 
 TEST(ImageDecoderTest, DecodeImageWithContentLength0) {
   MockImageDecoder image_decoder;
-  image_decoder.ExpectCallWithFailure(
+  image_decoder.ExpectCallWithError(
       "No content returned, but expected some.");
 
   const char kImageWithContentLength0Headers[] = {
@@ -188,7 +180,7 @@
 
 TEST(ImageDecoderTest, DecodeNonImageTypeWithContentLength0) {
   MockImageDecoder image_decoder;
-  image_decoder.ExpectCallWithFailure(
+  image_decoder.ExpectCallWithError(
       "No content returned, but expected some. Not an image mime type.");
 
   const char kHTMLWithContentLength0Headers[] = {
@@ -212,7 +204,7 @@
 
 TEST(ImageDecoderTest, DecodeNonImageType) {
   MockImageDecoder image_decoder;
-  image_decoder.ExpectCallWithFailure("Not an image mime type.");
+  image_decoder.ExpectCallWithError("Not an image mime type.");
 
   const char kHTMLHeaders[] = {
       "HTTP/1.1 200 OK\0"
@@ -237,7 +229,7 @@
 
 TEST(ImageDecoderTest, DecodeNoContentType) {
   MockImageDecoder image_decoder;
-  image_decoder.ExpectCallWithFailure("Not an image mime type.");
+  image_decoder.ExpectCallWithError("Not an image mime type.");
 
   const char kHTMLHeaders[] = {
       "HTTP/1.1 200 OK\0"
@@ -261,7 +253,7 @@
 
 TEST(ImageDecoderTest, DecodeImageWithNoContent) {
   MockImageDecoder image_decoder;
-  image_decoder.ExpectCallWithFailure(
+  image_decoder.ExpectCallWithError(
       "No content returned. Not an image mime type.");
 
   const char kHTMLWithNoContentHeaders[] = {
diff --git a/src/cobalt/loader/image/sandbox/image_decoder_sandbox.cc b/src/cobalt/loader/image/sandbox/image_decoder_sandbox.cc
index 9281e53..9371a8b 100644
--- a/src/cobalt/loader/image/sandbox/image_decoder_sandbox.cc
+++ b/src/cobalt/loader/image/sandbox/image_decoder_sandbox.cc
@@ -45,10 +45,6 @@
     image = value;
   }
 
-  void FailureCallback(const std::string& failure_message) {
-    LOG(WARNING) << failure_message;
-  }
-
   void ErrorCallback(const std::string& error_message) {
     LOG(ERROR) << error_message;
   }
@@ -107,8 +103,6 @@
     scoped_ptr<Decoder> image_decoder(new ImageDecoder(
         resource_provider, base::Bind(&ImageDecoderCallback::SuccessCallback,
                                       base::Unretained(&image_decoder_result)),
-        base::Bind(&ImageDecoderCallback::FailureCallback,
-                   base::Unretained(&image_decoder_result)),
         base::Bind(&ImageDecoderCallback::ErrorCallback,
                    base::Unretained(&image_decoder_result))));
 
diff --git a/src/cobalt/loader/image/threaded_image_decoder_proxy.cc b/src/cobalt/loader/image/threaded_image_decoder_proxy.cc
index 53fa8ce..18d4437 100644
--- a/src/cobalt/loader/image/threaded_image_decoder_proxy.cc
+++ b/src/cobalt/loader/image/threaded_image_decoder_proxy.cc
@@ -56,7 +56,6 @@
 ThreadedImageDecoderProxy::ThreadedImageDecoderProxy(
     render_tree::ResourceProvider* resource_provider,
     const SuccessCallback& success_callback,
-    const FailureCallback& failure_callback,
     const ErrorCallback& error_callback, MessageLoop* load_message_loop)
     : ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)),
       ALLOW_THIS_IN_INITIALIZER_LIST(
@@ -69,8 +68,6 @@
               &PostToMessageLoopChecked<SuccessCallback,
                                         scoped_refptr<render_tree::Image> >,
               weak_this_, success_callback, result_message_loop_),
-          base::Bind(&PostToMessageLoopChecked<FailureCallback, std::string>,
-                     weak_this_, failure_callback, result_message_loop_),
           base::Bind(&PostToMessageLoopChecked<ErrorCallback, std::string>,
                      weak_this_, error_callback, result_message_loop_))) {
   DCHECK(load_message_loop_);
diff --git a/src/cobalt/loader/image/threaded_image_decoder_proxy.h b/src/cobalt/loader/image/threaded_image_decoder_proxy.h
index c6b559b..e8a9322 100644
--- a/src/cobalt/loader/image/threaded_image_decoder_proxy.h
+++ b/src/cobalt/loader/image/threaded_image_decoder_proxy.h
@@ -40,12 +40,10 @@
  public:
   typedef base::Callback<void(const scoped_refptr<render_tree::Image>&)>
       SuccessCallback;
-  typedef base::Callback<void(const std::string&)> FailureCallback;
   typedef base::Callback<void(const std::string&)> ErrorCallback;
 
   ThreadedImageDecoderProxy(render_tree::ResourceProvider* resource_provider,
                             const SuccessCallback& success_callback,
-                            const FailureCallback& failure_callback,
                             const ErrorCallback& error_callback,
                             MessageLoop* load_message_loop_);
 
diff --git a/src/cobalt/loader/loader_factory.cc b/src/cobalt/loader/loader_factory.cc
index c227ed2..13240d0 100644
--- a/src/cobalt/loader/loader_factory.cc
+++ b/src/cobalt/loader/loader_factory.cc
@@ -43,14 +43,13 @@
 scoped_ptr<Loader> LoaderFactory::CreateImageLoader(
     const GURL& url, const csp::SecurityCallback& url_security_callback,
     const image::ImageDecoder::SuccessCallback& success_callback,
-    const image::ImageDecoder::FailureCallback& failure_callback,
     const image::ImageDecoder::ErrorCallback& error_callback) {
   DCHECK(thread_checker_.CalledOnValidThread());
 
   scoped_ptr<Loader> loader(new Loader(
       MakeFetcherCreator(url, url_security_callback),
       scoped_ptr<Decoder>(new image::ThreadedImageDecoderProxy(
-          resource_provider_, success_callback, failure_callback,
+          resource_provider_, success_callback,
           error_callback, load_thread_.message_loop())),
       error_callback,
       base::Bind(&LoaderFactory::OnLoaderDestroyed, base::Unretained(this))));
@@ -61,7 +60,6 @@
 scoped_ptr<Loader> LoaderFactory::CreateTypefaceLoader(
     const GURL& url, const csp::SecurityCallback& url_security_callback,
     const font::TypefaceDecoder::SuccessCallback& success_callback,
-    const font::TypefaceDecoder::FailureCallback& failure_callback,
     const font::TypefaceDecoder::ErrorCallback& error_callback) {
   DCHECK(thread_checker_.CalledOnValidThread());
 
@@ -69,7 +67,7 @@
       MakeFetcherCreator(url, url_security_callback),
       scoped_ptr<Decoder>(
           new font::TypefaceDecoder(resource_provider_, success_callback,
-                                    failure_callback, error_callback)),
+                                    error_callback)),
       error_callback,
       base::Bind(&LoaderFactory::OnLoaderDestroyed, base::Unretained(this))));
   OnLoaderCreated(loader.get());
diff --git a/src/cobalt/loader/loader_factory.h b/src/cobalt/loader/loader_factory.h
index 86bf2a4..b14ca10 100644
--- a/src/cobalt/loader/loader_factory.h
+++ b/src/cobalt/loader/loader_factory.h
@@ -44,14 +44,12 @@
   scoped_ptr<Loader> CreateImageLoader(
       const GURL& url, const csp::SecurityCallback& url_security_callback,
       const image::ImageDecoder::SuccessCallback& success_callback,
-      const image::ImageDecoder::FailureCallback& failure_callback,
       const image::ImageDecoder::ErrorCallback& error_callback);
 
   // Creates a loader that fetches and decodes a render_tree::Typeface.
   scoped_ptr<Loader> CreateTypefaceLoader(
       const GURL& url, const csp::SecurityCallback& url_security_callback,
       const font::TypefaceDecoder::SuccessCallback& success_callback,
-      const font::TypefaceDecoder::FailureCallback& failure_callback,
       const font::TypefaceDecoder::ErrorCallback& error_callback);
 
   // Clears out the loader factory's resource provider, aborting any in-progress
diff --git a/src/cobalt/loader/mock_loader_factory.h b/src/cobalt/loader/mock_loader_factory.h
index b5314d6..fe21d1b 100644
--- a/src/cobalt/loader/mock_loader_factory.h
+++ b/src/cobalt/loader/mock_loader_factory.h
@@ -33,20 +33,18 @@
 
 class MockLoaderFactory {
  public:
-  MOCK_METHOD5(CreateImageLoaderMock,
+  MOCK_METHOD4(CreateImageLoaderMock,
                loader::Loader*(
                    const GURL& url,
                    const csp::SecurityCallback& url_security_callback,
                    const image::ImageDecoder::SuccessCallback& success_callback,
-                   const image::ImageDecoder::FailureCallback& failure_callback,
                    const image::ImageDecoder::ErrorCallback& error_callback));
 
-  MOCK_METHOD5(
+  MOCK_METHOD4(
       CreateTypefaceLoaderMock,
       loader::Loader*(
           const GURL& url, const csp::SecurityCallback& url_security_callback,
           const font::TypefaceDecoder::SuccessCallback& success_callback,
-          const font::TypefaceDecoder::FailureCallback& failure_callback,
           const font::TypefaceDecoder::ErrorCallback& error_callback));
 
   // This workaround is required since scoped_ptr has no copy constructor.
@@ -55,21 +53,19 @@
   scoped_ptr<Loader> CreateImageLoader(
       const GURL& url, const csp::SecurityCallback& url_security_callback,
       const image::ImageDecoder::SuccessCallback& success_callback,
-      const image::ImageDecoder::FailureCallback& failure_callback,
       const image::ImageDecoder::ErrorCallback& error_callback) {
     return scoped_ptr<Loader>(
         CreateImageLoaderMock(url, url_security_callback, success_callback,
-                              failure_callback, error_callback));
+                              error_callback));
   }
 
   scoped_ptr<Loader> CreateTypefaceLoader(
       const GURL& url, const csp::SecurityCallback& url_security_callback,
       const font::TypefaceDecoder::SuccessCallback& success_callback,
-      const font::TypefaceDecoder::FailureCallback& failure_callback,
       const font::TypefaceDecoder::ErrorCallback& error_callback) {
     return scoped_ptr<Loader>(
         CreateTypefaceLoaderMock(url, url_security_callback, success_callback,
-                                 failure_callback, error_callback));
+                                 error_callback));
   }
 
   MOCK_METHOD0(Suspend, void());
diff --git a/src/cobalt/loader/resource_cache.h b/src/cobalt/loader/resource_cache.h
index 1c3e4e6..2847057 100644
--- a/src/cobalt/loader/resource_cache.h
+++ b/src/cobalt/loader/resource_cache.h
@@ -49,7 +49,6 @@
 
 enum CallbackType {
   kOnLoadingSuccessCallbackType,
-  kOnLoadingFailureCallbackType,
   kOnLoadingErrorCallbackType,
   kCallbackTypeCount,
 };
@@ -71,10 +70,9 @@
   typedef base::Callback<scoped_ptr<Loader>(
       const GURL&, const csp::SecurityCallback&,
       const base::Callback<void(const scoped_refptr<ResourceType>&)>&,
-      const base::Callback<void(const std::string&)>&,
       const base::Callback<void(const std::string&)>&)> CreateLoaderFunction;
 
-  // This class can be used to attach success, failure, or error callbacks to
+  // This class can be used to attach success or error callbacks to
   // CachedResource objects that are executed when the resource finishes
   // loading.
   // The callbacks are removed when the object is destroyed. If the resource has
@@ -84,7 +82,6 @@
     OnLoadedCallbackHandler(
         const scoped_refptr<CachedResource>& cached_resource,
         const base::Closure& success_callback,
-        const base::Closure& failure_callback,
         const base::Closure& error_callback);
     ~OnLoadedCallbackHandler();
 
@@ -93,11 +90,9 @@
 
     scoped_refptr<CachedResource> cached_resource_;
     base::Closure success_callback_;
-    base::Closure failure_callback_;
     base::Closure error_callback_;
 
     CallbackListIterator success_callback_list_iterator_;
-    CallbackListIterator failure_callback_list_iterator_;
     CallbackListIterator error_callback_list_iterator_;
 
     DISALLOW_COPY_AND_ASSIGN(OnLoadedCallbackHandler);
@@ -139,8 +134,6 @@
   //
   // Notify that the resource is loaded successfully.
   void OnLoadingSuccess(const scoped_refptr<ResourceType>& resource);
-  // Notify the loading failure and could be treated differently than error.
-  void OnLoadingFailure(const std::string& warning);
   // Notify the loading error.
   void OnLoadingError(const std::string& error);
 
@@ -172,10 +165,9 @@
 CachedResource<CacheType>::OnLoadedCallbackHandler::OnLoadedCallbackHandler(
     const scoped_refptr<CachedResource>& cached_resource,
     const base::Closure& success_callback,
-    const base::Closure& failure_callback, const base::Closure& error_callback)
+    const base::Closure& error_callback)
     : cached_resource_(cached_resource),
       success_callback_(success_callback),
-      failure_callback_(failure_callback),
       error_callback_(error_callback) {
   DCHECK(cached_resource_);
 
@@ -187,11 +179,6 @@
     }
   }
 
-  if (!failure_callback_.is_null()) {
-    failure_callback_list_iterator_ = cached_resource_->AddCallback(
-        kOnLoadingFailureCallbackType, failure_callback_);
-  }
-
   if (!error_callback_.is_null()) {
     error_callback_list_iterator_ = cached_resource_->AddCallback(
         kOnLoadingErrorCallbackType, error_callback_);
@@ -205,11 +192,6 @@
                                      success_callback_list_iterator_);
   }
 
-  if (!failure_callback_.is_null()) {
-    cached_resource_->RemoveCallback(kOnLoadingFailureCallbackType,
-                                     failure_callback_list_iterator_);
-  }
-
   if (!error_callback_.is_null()) {
     cached_resource_->RemoveCallback(kOnLoadingErrorCallbackType,
                                      error_callback_list_iterator_);
@@ -231,7 +213,6 @@
   loader_ = create_loader_function.Run(
       url, security_callback,
       base::Bind(&CachedResource::OnLoadingSuccess, base::Unretained(this)),
-      base::Bind(&CachedResource::OnLoadingFailure, base::Unretained(this)),
       base::Bind(&CachedResource::OnLoadingError, base::Unretained(this)));
 }
 
@@ -280,21 +261,10 @@
 }
 
 template <typename CacheType>
-void CachedResource<CacheType>::OnLoadingFailure(const std::string& message) {
-  DCHECK(cached_resource_thread_checker_.CalledOnValidThread());
-
-  LOG(WARNING) << "Warning while loading '" << url_ << "': " << message;
-
-  loader_.reset();
-  resource_cache_->NotifyResourceLoadingComplete(this,
-                                                 kOnLoadingFailureCallbackType);
-}
-
-template <typename CacheType>
 void CachedResource<CacheType>::OnLoadingError(const std::string& error) {
   DCHECK(cached_resource_thread_checker_.CalledOnValidThread());
 
-  LOG(ERROR) << "Error while loading '" << url_ << "': " << error;
+  LOG(WARNING) << "Error while loading '" << url_ << "': " << error;
 
   loader_.reset();
   resource_cache_->NotifyResourceLoadingComplete(this,
@@ -351,13 +321,11 @@
   CachedResourceReferenceWithCallbacks(
       const scoped_refptr<CachedResourceType>& cached_resource,
       const base::Closure& success_callback,
-      const base::Closure& failure_callback,
       const base::Closure& error_callback)
       : cached_resource_(cached_resource),
         cached_resource_loaded_callback_handler_(
             new CachedResourceTypeOnLoadedCallbackHandler(
-                cached_resource, success_callback, failure_callback,
-                error_callback)) {}
+                cached_resource, success_callback, error_callback)) {}
 
   scoped_refptr<CachedResourceType> cached_resource() {
     return cached_resource_;
diff --git a/src/cobalt/script/mozjs/mozjs_engine.cc b/src/cobalt/script/mozjs/mozjs_engine.cc
index 7b62f3f..fcd8c52 100644
--- a/src/cobalt/script/mozjs/mozjs_engine.cc
+++ b/src/cobalt/script/mozjs/mozjs_engine.cc
@@ -20,6 +20,7 @@
 
 #include "base/debug/trace_event.h"
 #include "base/logging.h"
+#include "base/message_loop.h"
 #include "cobalt/base/c_val.h"
 #include "cobalt/browser/stack_size_constants.h"
 #include "cobalt/script/mozjs/mozjs_global_environment.h"
@@ -33,6 +34,9 @@
 // After this many bytes have been allocated, the garbage collector will run.
 const uint32_t kGarbageCollectionThresholdBytes = 8 * 1024 * 1024;
 
+// Trigger garbage collection this many seconds after the last one.
+const int kGarbageCollectionIntervalSeconds = 60;
+
 JSBool CheckAccessStub(JSContext*, JS::Handle<JSObject*>, JS::Handle<jsid>,
                        JSAccessMode, JS::MutableHandle<JS::Value>) {
   return true;
@@ -140,6 +144,12 @@
   js::SetPreserveWrapperCallback(runtime_, DummyPreserveWrapperCallback);
 
   EngineStats::GetInstance()->EngineCreated();
+
+  if (MessageLoop::current()) {
+    gc_timer_.Start(FROM_HERE, base::TimeDelta::FromSeconds(
+                                   kGarbageCollectionIntervalSeconds),
+                    this, &MozjsEngine::TimerGarbageCollect);
+  }
 }
 
 MozjsEngine::~MozjsEngine() {
@@ -173,6 +183,11 @@
   return EngineStats::GetInstance()->UpdateMemoryStatsAndReturnReserved();
 }
 
+void MozjsEngine::TimerGarbageCollect() {
+  TRACE_EVENT0("cobalt::script", "MozjsEngine::TimerGarbageCollect()");
+  CollectGarbage();
+}
+
 JSBool MozjsEngine::ContextCallback(JSContext* context, unsigned context_op) {
   JSRuntime* runtime = JS_GetRuntime(context);
   MozjsEngine* engine =
@@ -195,6 +210,10 @@
       static_cast<MozjsEngine*>(JS_GetRuntimePrivate(runtime));
   if (status == JSGC_END) {
     engine->accumulated_extra_memory_cost_ = 0;
+    // Reset the GC timer to avoid having the timed GC come soon after this one.
+    if (engine->gc_timer_.IsRunning()) {
+      engine->gc_timer_.Reset();
+    }
   }
   for (int i = 0; i < engine->contexts_.size(); ++i) {
     MozjsGlobalEnvironment* global_environment =
diff --git a/src/cobalt/script/mozjs/mozjs_engine.h b/src/cobalt/script/mozjs/mozjs_engine.h
index 393f98d..5529394 100644
--- a/src/cobalt/script/mozjs/mozjs_engine.h
+++ b/src/cobalt/script/mozjs/mozjs_engine.h
@@ -19,6 +19,7 @@
 #include <vector>
 
 #include "base/threading/thread_checker.h"
+#include "base/timer.h"
 #include "cobalt/script/javascript_engine.h"
 #include "third_party/mozjs/js/src/jsapi.h"
 
@@ -37,6 +38,7 @@
   size_t UpdateMemoryStatsAndReturnReserved() OVERRIDE;
 
  private:
+  void TimerGarbageCollect();
   static JSBool ContextCallback(JSContext* context, unsigned context_op);
   static void GCCallback(JSRuntime* runtime, JSGCStatus status);
   static void FinalizeCallback(JSFreeOp* free_op, JSFinalizeStatus status,
@@ -54,6 +56,9 @@
 
   // The amount of externally allocated memory since last forced GC.
   size_t accumulated_extra_memory_cost_;
+
+  // Used to trigger a garbage collection periodically.
+  base::RepeatingTimer<MozjsEngine> gc_timer_;
 };
 }  // namespace mozjs
 }  // namespace script