Indicate in the tab UI if appcache creation was blocked by privacy settings.

TEST=manual
BUG=38362

Review URL: http://codereview.chromium.org/1600002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@44079 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/appcache/appcache_frontend_proxy.cc b/chrome/browser/appcache/appcache_frontend_proxy.cc
index c0448592..d81244c 100644
--- a/chrome/browser/appcache/appcache_frontend_proxy.cc
+++ b/chrome/browser/appcache/appcache_frontend_proxy.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
@@ -20,3 +20,7 @@
                                           appcache::EventID event_id) {
   sender_->Send(new AppCacheMsg_EventRaised(host_ids, event_id));
 }
+
+void AppCacheFrontendProxy::OnContentBlocked(int host_id) {
+  sender_->Send(new AppCacheMsg_ContentBlocked(host_id));
+}
diff --git a/chrome/browser/appcache/appcache_frontend_proxy.h b/chrome/browser/appcache/appcache_frontend_proxy.h
index 78865ab..234e36cf 100644
--- a/chrome/browser/appcache/appcache_frontend_proxy.h
+++ b/chrome/browser/appcache/appcache_frontend_proxy.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
@@ -24,6 +24,7 @@
                                appcache::Status status);
   virtual void OnEventRaised(const std::vector<int>& host_ids,
                              appcache::EventID event_id);
+  virtual void OnContentBlocked(int host_id);
 
  private:
   IPC::Message::Sender* sender_;
diff --git a/chrome/chrome_renderer.gypi b/chrome/chrome_renderer.gypi
index 7598f35..774af6d 100755
--- a/chrome/chrome_renderer.gypi
+++ b/chrome/chrome_renderer.gypi
@@ -133,6 +133,8 @@
         'renderer/renderer_main_platform_delegate_win.cc',
         'renderer/renderer_sandbox_support_linux.cc',
         'renderer/renderer_sandbox_support_linux.h',
+        'renderer/renderer_webapplicationcachehost_impl.cc',
+        'renderer/renderer_webapplicationcachehost_impl.h',
         'renderer/renderer_webcookiejar_impl.cc',
         'renderer/renderer_webcookiejar_impl.h',
         'renderer/renderer_webkitclient_impl.cc',
diff --git a/chrome/common/appcache/appcache_dispatcher.cc b/chrome/common/appcache/appcache_dispatcher.cc
index 71461ba3..eabb6906 100644
--- a/chrome/common/appcache/appcache_dispatcher.cc
+++ b/chrome/common/appcache/appcache_dispatcher.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
@@ -13,6 +13,7 @@
     IPC_MESSAGE_HANDLER(AppCacheMsg_CacheSelected, OnCacheSelected)
     IPC_MESSAGE_HANDLER(AppCacheMsg_StatusChanged, OnStatusChanged)
     IPC_MESSAGE_HANDLER(AppCacheMsg_EventRaised, OnEventRaised)
+    IPC_MESSAGE_HANDLER(AppCacheMsg_ContentBlocked, OnContentBlocked)
     IPC_MESSAGE_UNHANDLED(handled = false)
   IPC_END_MESSAGE_MAP()
   return handled;
@@ -32,3 +33,7 @@
                                        appcache::EventID event_id) {
   frontend_impl_.OnEventRaised(host_ids, event_id);
 }
+
+void AppCacheDispatcher::OnContentBlocked(int host_id) {
+  frontend_impl_.OnContentBlocked(host_id);
+}
diff --git a/chrome/common/appcache/appcache_dispatcher.h b/chrome/common/appcache/appcache_dispatcher.h
index 9eaef6a9..4f3b50c6 100644
--- a/chrome/common/appcache/appcache_dispatcher.h
+++ b/chrome/common/appcache/appcache_dispatcher.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
@@ -31,6 +31,7 @@
                        appcache::Status status);
   void OnEventRaised(const std::vector<int>& host_ids,
                      appcache::EventID event_id);
+  void OnContentBlocked(int host_id);
 
   AppCacheBackendProxy backend_proxy_;
   appcache::AppCacheFrontendImpl frontend_impl_;
diff --git a/chrome/common/render_messages_internal.h b/chrome/common/render_messages_internal.h
index 17e5689..93b1a76 100644
--- a/chrome/common/render_messages_internal.h
+++ b/chrome/common/render_messages_internal.h
@@ -625,6 +625,10 @@
                        std::vector<int> /* host_ids */,
                        appcache::EventID)
 
+  // Notifies the renderer of the fact that AppCache access was blocked.
+  IPC_MESSAGE_CONTROL1(AppCacheMsg_ContentBlocked,
+                       int /* host_id */)
+
   // Reply to the ViewHostMsg_QueryFormFieldAutofill message with the
   // autofill suggestions.
   IPC_MESSAGE_ROUTED4(ViewMsg_AutoFillSuggestionsReturned,
diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc
index a1353f7..9dc64424 100644
--- a/chrome/renderer/render_view.cc
+++ b/chrome/renderer/render_view.cc
@@ -22,6 +22,7 @@
 #include "base/string_util.h"
 #include "base/time.h"
 #include "build/build_config.h"
+#include "chrome/common/appcache/appcache_dispatcher.h"
 #include "chrome/common/bindings_policy.h"
 #include "chrome/common/child_process_logging.h"
 #include "chrome/common/chrome_switches.h"
@@ -51,6 +52,7 @@
 #include "chrome/renderer/print_web_view_helper.h"
 #include "chrome/renderer/render_process.h"
 #include "chrome/renderer/render_thread.h"
+#include "chrome/renderer/renderer_webapplicationcachehost_impl.h"
 #include "chrome/renderer/renderer_webstoragenamespace_impl.h"
 #include "chrome/renderer/spellchecker/spellcheck.h"
 #include "chrome/renderer/user_script_slave.h"
@@ -143,6 +145,8 @@
 using webkit_glue::PasswordFormDomManager;
 using WebKit::WebAccessibilityCache;
 using WebKit::WebAccessibilityObject;
+using WebKit::WebApplicationCacheHost;
+using WebKit::WebApplicationCacheHostClient;
 using WebKit::WebColor;
 using WebKit::WebColorName;
 using WebKit::WebConsoleMessage;
@@ -2145,6 +2149,13 @@
   return new webkit_glue::WebMediaPlayerImpl(client, factory, factory_factory);
 }
 
+WebApplicationCacheHost* RenderView::createApplicationCacheHost(
+    WebFrame* frame, WebApplicationCacheHostClient* client) {
+  return new RendererWebApplicationCacheHostImpl(
+      FromWebView(frame->view()), client,
+      RenderThread::current()->appcache_dispatcher()->backend_proxy());
+}
+
 WebCookieJar* RenderView::cookieJar() {
   return &cookie_jar_;
 }
diff --git a/chrome/renderer/render_view.h b/chrome/renderer/render_view.h
index 3ef8732..6f67b4d 100644
--- a/chrome/renderer/render_view.h
+++ b/chrome/renderer/render_view.h
@@ -98,6 +98,8 @@
 
 namespace WebKit {
 class WebAccessibilityCache;
+class WebApplicationCacheHost;
+class WebApplicationCacheHostClient;
 class WebDataSource;
 class WebDragData;
 class WebGeolocationServiceInterface;
@@ -301,6 +303,8 @@
       const WebKit::WebString& name, unsigned long long documentId);
   virtual WebKit::WebMediaPlayer* createMediaPlayer(
       WebKit::WebFrame* frame, WebKit::WebMediaPlayerClient* client);
+  virtual WebKit::WebApplicationCacheHost* createApplicationCacheHost(
+      WebKit::WebFrame* frame, WebKit::WebApplicationCacheHostClient* client);
   virtual WebKit::WebCookieJar* cookieJar();
   virtual void willClose(WebKit::WebFrame* frame);
   virtual bool allowPlugins(WebKit::WebFrame* frame, bool enabled_per_settings);
diff --git a/chrome/renderer/renderer_webapplicationcachehost_impl.cc b/chrome/renderer/renderer_webapplicationcachehost_impl.cc
new file mode 100644
index 0000000..88ffd2c
--- /dev/null
+++ b/chrome/renderer/renderer_webapplicationcachehost_impl.cc
@@ -0,0 +1,32 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/renderer/renderer_webapplicationcachehost_impl.h"
+
+#include "chrome/common/content_settings_types.h"
+#include "chrome/renderer/render_thread.h"
+#include "chrome/renderer/render_view.h"
+
+using appcache::AppCacheBackend;
+using WebKit::WebApplicationCacheHostClient;
+
+RendererWebApplicationCacheHostImpl::RendererWebApplicationCacheHostImpl(
+    RenderView* render_view,
+    WebApplicationCacheHostClient* client,
+    AppCacheBackend* backend)
+    : WebApplicationCacheHostImpl(client, backend),
+      content_blocked_(false),
+      routing_id_(render_view->routing_id()) {
+}
+
+RendererWebApplicationCacheHostImpl::~RendererWebApplicationCacheHostImpl() {
+}
+
+void RendererWebApplicationCacheHostImpl::OnContentBlocked() {
+  if (!content_blocked_) {
+    RenderThread::current()->Send(new ViewHostMsg_ContentBlocked(
+        routing_id_, CONTENT_SETTINGS_TYPE_COOKIES));
+    content_blocked_ = true;
+  }
+}
diff --git a/chrome/renderer/renderer_webapplicationcachehost_impl.h b/chrome/renderer/renderer_webapplicationcachehost_impl.h
new file mode 100644
index 0000000..8a00032
--- /dev/null
+++ b/chrome/renderer/renderer_webapplicationcachehost_impl.h
@@ -0,0 +1,31 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_RENDERER_RENDERER_WEBAPPLICATIONCACHEHOST_IMPL_H_
+#define CHROME_RENDERER_RENDERER_WEBAPPLICATIONCACHEHOST_IMPL_H_
+
+#include "webkit/appcache/web_application_cache_host_impl.h"
+
+class RenderView;
+
+class RendererWebApplicationCacheHostImpl
+    : public appcache::WebApplicationCacheHostImpl {
+ public:
+  RendererWebApplicationCacheHostImpl(
+      RenderView* render_view,
+      WebKit::WebApplicationCacheHostClient* client,
+      appcache::AppCacheBackend* backend);
+
+  virtual ~RendererWebApplicationCacheHostImpl();
+
+  // appcache::WebApplicationCacheHostImpl methods.
+  virtual void OnContentBlocked();
+
+ private:
+  bool content_blocked_;
+
+  int routing_id_;
+};
+
+#endif  // CHROME_RENDERER_RENDERER_WEBAPPLICATIONCACHEHOST_IMPL_H_
diff --git a/chrome/renderer/renderer_webkitclient_impl.cc b/chrome/renderer/renderer_webkitclient_impl.cc
index 70bccc9..c5b042a4 100644
--- a/chrome/renderer/renderer_webkitclient_impl.cc
+++ b/chrome/renderer/renderer_webkitclient_impl.cc
@@ -13,7 +13,6 @@
 #include "base/command_line.h"
 #include "base/file_path.h"
 #include "base/platform_file.h"
-#include "chrome/common/appcache/appcache_dispatcher.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/database_util.h"
 #include "chrome/common/render_messages.h"
@@ -32,7 +31,6 @@
 #include "third_party/WebKit/WebKit/chromium/public/WebString.h"
 #include "third_party/WebKit/WebKit/chromium/public/WebURL.h"
 #include "third_party/WebKit/WebKit/chromium/public/WebVector.h"
-#include "webkit/appcache/web_application_cache_host_impl.h"
 #include "webkit/glue/webkit_glue.h"
 
 #if defined(OS_LINUX)
@@ -43,8 +41,6 @@
 #include "base/file_descriptor_posix.h"
 #endif
 
-using WebKit::WebApplicationCacheHost;
-using WebKit::WebApplicationCacheHostClient;
 using WebKit::WebFrame;
 using WebKit::WebKitClient;
 using WebKit::WebStorageArea;
@@ -182,12 +178,6 @@
                                          url, is_local_storage);
 }
 
-WebApplicationCacheHost* RendererWebKitClientImpl::createApplicationCacheHost(
-      WebApplicationCacheHostClient* client) {
-  return new appcache::WebApplicationCacheHostImpl(client,
-      RenderThread::current()->appcache_dispatcher()->backend_proxy());
-}
-
 //------------------------------------------------------------------------------
 
 WebString RendererWebKitClientImpl::MimeRegistry::mimeTypeForExtension(
diff --git a/chrome/renderer/renderer_webkitclient_impl.h b/chrome/renderer/renderer_webkitclient_impl.h
index b9232d2..3606eaa 100644
--- a/chrome/renderer/renderer_webkitclient_impl.h
+++ b/chrome/renderer/renderer_webkitclient_impl.h
@@ -64,8 +64,6 @@
       unsigned key_size_index,
       const WebKit::WebString& challenge,
       const WebKit::WebURL& url);
-  virtual WebKit::WebApplicationCacheHost* createApplicationCacheHost(
-      WebKit::WebApplicationCacheHostClient*);
   virtual WebKit::WebSharedWorkerRepository* sharedWorkerRepository();
   virtual WebKit::WebGraphicsContext3D* createGraphicsContext3D();