| Index: chrome/browser/chrome_content_browser_client.cc
|
| diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
|
| index 14511ccb2f4e6338d19183360e97712d99f0743c..1cf5c79c9bb111fe9a084475f714be8623e3eb96 100644
|
| --- a/chrome/browser/chrome_content_browser_client.cc
|
| +++ b/chrome/browser/chrome_content_browser_client.cc
|
| @@ -232,6 +232,7 @@
|
| #include "chrome/browser/guest_view/guest_view_constants.h"
|
| #include "chrome/browser/guest_view/guest_view_manager.h"
|
| #include "chrome/browser/guest_view/web_view/web_view_guest.h"
|
| +#include "chrome/browser/guest_view/web_view/web_view_permission_helper.h"
|
| #include "chrome/browser/guest_view/web_view/web_view_renderer_state.h"
|
| #include "chrome/browser/renderer_host/chrome_extension_message_filter.h"
|
| #include "chrome/browser/sync_file_system/local/sync_file_system_backend.h"
|
| @@ -648,7 +649,8 @@ float GetDeviceScaleAdjustment() {
|
| namespace chrome {
|
|
|
| ChromeContentBrowserClient::ChromeContentBrowserClient()
|
| - : prerender_tracker_(NULL) {
|
| + : prerender_tracker_(NULL),
|
| + weak_factory_(this) {
|
| #if defined(ENABLE_PLUGINS)
|
| for (size_t i = 0; i < arraysize(kPredefinedAllowedDevChannelOrigins); ++i)
|
| allowed_dev_channel_origins_.insert(kPredefinedAllowedDevChannelOrigins[i]);
|
| @@ -1819,25 +1821,97 @@ bool ChromeContentBrowserClient::AllowWorkerDatabase(
|
| return allow;
|
| }
|
|
|
| -bool ChromeContentBrowserClient::AllowWorkerFileSystem(
|
| +void ChromeContentBrowserClient::AllowWorkerFileSystem(
|
| const GURL& url,
|
| content::ResourceContext* context,
|
| - const std::vector<std::pair<int, int> >& render_frames) {
|
| + const std::vector<std::pair<int, int> >& render_frames,
|
| + base::Callback<void(bool)> callback) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| ProfileIOData* io_data = ProfileIOData::FromResourceContext(context);
|
| CookieSettings* cookie_settings = io_data->GetCookieSettings();
|
| bool allow = cookie_settings->IsSettingCookieAllowed(url, url);
|
|
|
| +#if defined(ENABLE_EXTENSIONS)
|
| + GuestPermissionRequestHelper(url, render_frames, callback, allow);
|
| +#else
|
| + FileSystemAccessed(url, render_frames, callback, allow);
|
| +#endif
|
| +}
|
| +
|
| +#if defined(ENABLE_EXTENSIONS)
|
| +void ChromeContentBrowserClient::GuestPermissionRequestHelper(
|
| + const GURL& url,
|
| + const std::vector<std::pair<int, int> >& render_frames,
|
| + base::Callback<void(bool)> callback,
|
| + bool allow) {
|
| + DCHECK(BrowserThread:: CurrentlyOn(BrowserThread::IO));
|
| + std::vector<std::pair<int, int> >::const_iterator i;
|
| + std::map<int, int> process_map;
|
| + std::map<int, int>::const_iterator it;
|
| + bool has_web_view_guest = false;
|
| + // Record access to file system for potential display in UI.
|
| + for (i = render_frames.begin(); i != render_frames.end(); ++i) {
|
| + if (process_map.find(i->first) != process_map.end())
|
| + continue;
|
| +
|
| + process_map.insert(std::pair<int, int>(i->first, i->second));
|
| +
|
| + if (WebViewRendererState::GetInstance()->IsGuest(i->first))
|
| + has_web_view_guest = true;
|
| + }
|
| + if (!has_web_view_guest) {
|
| + FileSystemAccessed(url, render_frames, callback, allow);
|
| + return;
|
| + }
|
| + DCHECK(process_map.size() == 1);
|
| + it = process_map.begin();
|
| + BrowserThread::PostTask(
|
| + BrowserThread::UI,
|
| + FROM_HERE,
|
| + base::Bind(&ChromeContentBrowserClient::
|
| + RequestFileSystemPermissionOnUIThread,
|
| + it->first,
|
| + it->second,
|
| + url,
|
| + allow,
|
| + base::Bind(&ChromeContentBrowserClient::FileSystemAccessed,
|
| + weak_factory_.GetWeakPtr(),
|
| + url,
|
| + render_frames,
|
| + callback)));
|
| +}
|
| +
|
| +void ChromeContentBrowserClient::RequestFileSystemPermissionOnUIThread(
|
| + int render_process_id,
|
| + int render_frame_id,
|
| + const GURL& url,
|
| + bool allowed_by_default,
|
| + const base::Callback<void(bool)>& callback) {
|
| + DCHECK(BrowserThread:: CurrentlyOn(BrowserThread::UI));
|
| + WebViewPermissionHelper* web_view_permission_helper =
|
| + WebViewPermissionHelper::FromFrameID(render_process_id,
|
| + render_frame_id);
|
| + web_view_permission_helper->RequestFileSystemPermission(url,
|
| + allowed_by_default,
|
| + callback);
|
| +}
|
| +#endif
|
| +
|
| +void ChromeContentBrowserClient::FileSystemAccessed(
|
| + const GURL& url,
|
| + const std::vector<std::pair<int, int> >& render_frames,
|
| + base::Callback<void(bool)> callback,
|
| + bool allow) {
|
| // Record access to file system for potential display in UI.
|
| std::vector<std::pair<int, int> >::const_iterator i;
|
| for (i = render_frames.begin(); i != render_frames.end(); ++i) {
|
| BrowserThread::PostTask(
|
| - BrowserThread::UI, FROM_HERE,
|
| + BrowserThread::UI,
|
| + FROM_HERE,
|
| base::Bind(&TabSpecificContentSettings::FileSystemAccessed,
|
| i->first, i->second, url, !allow));
|
| }
|
| -
|
| - return allow;
|
| + callback.Run(allow);
|
| }
|
|
|
| bool ChromeContentBrowserClient::AllowWorkerIndexedDB(
|
|
|