Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / renderer_host / chrome_render_message_filter.cc
index 2df3e15..ef49c8e 100644 (file)
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/content_settings/cookie_settings.h"
 #include "chrome/browser/content_settings/tab_specific_content_settings.h"
-#include "chrome/browser/extensions/extension_renderer_state.h"
-
-#if defined(ENABLE_EXTENSIONS)
-#include "chrome/browser/guest_view/web_view/web_view_guest.h"
-#endif
-
 #include "chrome/browser/metrics/chrome_metrics_service_accessor.h"
 #include "chrome/browser/net/predictor.h"
 #include "chrome/browser/profiles/profile.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/browser/render_process_host.h"
 
+#if defined(ENABLE_EXTENSIONS)
+#include "chrome/browser/guest_view/web_view/web_view_permission_helper.h"
+#include "chrome/browser/guest_view/web_view/web_view_renderer_state.h"
+#endif
+
 #if defined(ENABLE_TASK_MANAGER)
 #include "chrome/browser/task_manager/task_manager.h"
 #endif
@@ -200,80 +199,147 @@ void ChromeRenderMessageFilter::OnRequestFileSystemAccessSync(
     const GURL& origin_url,
     const GURL& top_origin_url,
     IPC::Message* reply_msg) {
-  bool allowed =
-      cookie_settings_->IsSettingCookieAllowed(origin_url, top_origin_url);
+  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+  base::Callback<void(bool)> callback =
+      base::Bind(&ChromeRenderMessageFilter::
+                 OnRequestFileSystemAccessSyncResponse,
+                 make_scoped_refptr(this),
+                 reply_msg);
+  OnRequestFileSystemAccess(render_frame_id,
+                            origin_url,
+                            top_origin_url,
+                            callback);
+}
 
-#if defined(ENABLE_EXTENSIONS)
-  bool is_web_view_guest =
-      ExtensionRendererState::GetInstance()->IsWebViewRenderer(
-          render_process_id_);
-  if (is_web_view_guest) {
-    // Record access to file system for potential display in UI.
-    BrowserThread::PostTask(BrowserThread::UI,
-                            FROM_HERE,
-                            base::Bind(&WebViewGuest::FileSystemAccessedSync,
-                                       render_process_id_,
-                                       render_frame_id,
-                                       origin_url,
-                                       !allowed,
-                                       reply_msg));
-    return;
-  }
-#endif
+void ChromeRenderMessageFilter::OnRequestFileSystemAccessSyncResponse(
+    IPC::Message* reply_msg,
+    bool allowed) {
   ChromeViewHostMsg_RequestFileSystemAccessSync::WriteReplyParams(reply_msg,
                                                                   allowed);
   Send(reply_msg);
-  // Record access to file system for potential display in UI.
-  BrowserThread::PostTask(
-      BrowserThread::UI,
-      FROM_HERE,
-      base::Bind(&TabSpecificContentSettings::FileSystemAccessed,
-                 render_process_id_,
-                 render_frame_id,
-                 origin_url,
-                 !allowed));
 }
 
+#if defined(ENABLE_EXTENSIONS)
+void ChromeRenderMessageFilter::FileSystemAccessedSyncOnUIThread(
+    int render_process_id,
+    int render_frame_id,
+    const GURL& url,
+    bool blocked_by_policy,
+    IPC::Message* reply_msg) {
+  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+  extensions::WebViewPermissionHelper* web_view_permission_helper =
+      extensions::WebViewPermissionHelper::FromFrameID(
+          render_process_id, render_frame_id);
+  // Between the time the permission request is made and the time it is handled
+  // by the UI thread, the extensions::WebViewPermissionHelper might be gone.
+  if (!web_view_permission_helper)
+    return;
+  web_view_permission_helper->FileSystemAccessedSync(
+      render_process_id, render_frame_id, url, blocked_by_policy, reply_msg);
+}
+#endif
+
 void ChromeRenderMessageFilter::OnRequestFileSystemAccessAsync(
     int render_frame_id,
     int request_id,
     const GURL& origin_url,
     const GURL& top_origin_url) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+  base::Callback<void(bool)> callback =
+      base::Bind(&ChromeRenderMessageFilter::
+                 OnRequestFileSystemAccessAsyncResponse,
+                 make_scoped_refptr(this),
+                 render_frame_id,
+                 request_id);
+  OnRequestFileSystemAccess(render_frame_id,
+                            origin_url,
+                            top_origin_url,
+                            callback);
+}
+
+void ChromeRenderMessageFilter::OnRequestFileSystemAccessAsyncResponse(
+    int render_frame_id,
+    int request_id,
+    bool allowed) {
+  Send(new ChromeViewMsg_RequestFileSystemAccessAsyncResponse(
+      render_frame_id, request_id, allowed));
+}
+
+void ChromeRenderMessageFilter::OnRequestFileSystemAccess(
+    int render_frame_id,
+    const GURL& origin_url,
+    const GURL& top_origin_url,
+    base::Callback<void(bool)> callback) {
+  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
 
   bool allowed =
       cookie_settings_->IsSettingCookieAllowed(origin_url, top_origin_url);
 
 #if defined(ENABLE_EXTENSIONS)
-  bool is_web_view_guest =
-      ExtensionRendererState::GetInstance()->IsWebViewRenderer(
-          render_process_id_);
+  bool is_web_view_guest = extensions::WebViewRendererState::GetInstance()
+      ->IsGuest(render_process_id_);
   if (is_web_view_guest) {
     // Record access to file system for potential display in UI.
-    BrowserThread::PostTask(BrowserThread::UI,
-                            FROM_HERE,
-                            base::Bind(&WebViewGuest::FileSystemAccessedAsync,
-                                       render_process_id_,
-                                       render_frame_id,
-                                       request_id,
-                                       origin_url,
-                                       !allowed));
+    BrowserThread::PostTask(
+        BrowserThread::UI,
+        FROM_HERE,
+        base::Bind(&ChromeRenderMessageFilter::FileSystemAccessedOnUIThread,
+                   render_process_id_,
+                   render_frame_id,
+                   origin_url,
+                   allowed,
+                   callback));
     return;
   }
 #endif
-  Send(new ChromeViewMsg_RequestFileSystemAccessAsyncResponse(render_frame_id,
-                                                              request_id,
-                                                              allowed));
+  callback.Run(allowed);
   // Record access to file system for potential display in UI.
   BrowserThread::PostTask(
       BrowserThread::UI,
       FROM_HERE,
       base::Bind(&TabSpecificContentSettings::FileSystemAccessed,
-                render_process_id_,
-                render_frame_id,
-                origin_url,
-                !allowed));
+                 render_process_id_,
+                 render_frame_id,
+                 origin_url,
+                 !allowed));
+}
+
+#if defined(ENABLE_EXTENSIONS)
+void ChromeRenderMessageFilter::FileSystemAccessedOnUIThread(
+    int render_process_id,
+    int render_frame_id,
+    const GURL& url,
+    bool allowed,
+    base::Callback<void(bool)> callback) {
+  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+  extensions::WebViewPermissionHelper* web_view_permission_helper =
+      extensions::WebViewPermissionHelper::FromFrameID(
+          render_process_id, render_frame_id);
+  // Between the time the permission request is made and the time it is handled
+  // by the UI thread, the extensions::WebViewPermissionHelper might be gone.
+  if (!web_view_permission_helper)
+    return;
+  web_view_permission_helper->RequestFileSystemPermission(
+      url,
+      allowed,
+      base::Bind(&ChromeRenderMessageFilter::FileSystemAccessedResponse,
+                 render_process_id,
+                 render_frame_id,
+                 url,
+                 callback));
+}
+
+void ChromeRenderMessageFilter::FileSystemAccessedResponse(
+    int render_process_id,
+    int render_frame_id,
+    const GURL& url,
+    base::Callback<void(bool)> callback,
+    bool allowed) {
+  TabSpecificContentSettings::FileSystemAccessed(
+      render_process_id, render_frame_id, url, !allowed);
+  callback.Run(allowed);
 }
+#endif
 
 void ChromeRenderMessageFilter::OnAllowIndexedDB(int render_frame_id,
                                                  const GURL& origin_url,