diff options
author | jorlow@chromium.org <jorlow@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-02-17 11:29:45 +0000 |
---|---|---|
committer | jorlow@chromium.org <jorlow@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-02-17 11:29:45 +0000 |
commit | e37f934991547accccd176d1d57d733eacde21ef (patch) | |
tree | 0e80c599ed5597bf5d9217e351795439b2564985 /chrome/browser/renderer_host/database_permission_request.cc | |
parent | 026a135063abda1ad446c049bbea1a971bf0ec4a (diff) | |
download | chromium_src-e37f934991547accccd176d1d57d733eacde21ef.zip chromium_src-e37f934991547accccd176d1d57d733eacde21ef.tar.gz chromium_src-e37f934991547accccd176d1d57d733eacde21ef.tar.bz2 |
Implement CONTENT_SETTING_ASK for database. Also some cleanup of the dialog for local storage.
BUG=34628
TEST=none
Review URL: http://codereview.chromium.org/605028
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@39214 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/renderer_host/database_permission_request.cc')
-rw-r--r-- | chrome/browser/renderer_host/database_permission_request.cc | 86 |
1 files changed, 73 insertions, 13 deletions
diff --git a/chrome/browser/renderer_host/database_permission_request.cc b/chrome/browser/renderer_host/database_permission_request.cc index 73a9977..32fa8e6 100644 --- a/chrome/browser/renderer_host/database_permission_request.cc +++ b/chrome/browser/renderer_host/database_permission_request.cc @@ -4,17 +4,23 @@ #include "chrome/browser/renderer_host/database_permission_request.h" + +#include "chrome/browser/browser_list.h" #include "chrome/browser/chrome_thread.h" +#include "chrome/browser/host_content_settings_map.h" +#include "chrome/browser/message_box_handler.h" DatabasePermissionRequest::DatabasePermissionRequest( - const string16& origin, + const GURL& url, const string16& database_name, Task* on_allow, - Task* on_block) - : origin_(origin), + Task* on_block, + HostContentSettingsMap* settings_map) + : url_(url), database_name_(database_name), on_allow_(on_allow), - on_block_(on_block) { + on_block_(on_block), + host_content_settings_map_(settings_map) { DCHECK(on_allow_.get()); DCHECK(on_block_.get()); } @@ -23,16 +29,70 @@ DatabasePermissionRequest::~DatabasePermissionRequest() { } void DatabasePermissionRequest::RequestPermission() { - DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); - ChromeThread::PostTask( - ChromeThread::UI, FROM_HERE, NewRunnableMethod( - this, &DatabasePermissionRequest::RequestPermissionUI)); + if (ChromeThread::CurrentlyOn(ChromeThread::IO)) { + ChromeThread::PostTask( + ChromeThread::UI, FROM_HERE, NewRunnableMethod( + this, &DatabasePermissionRequest::RequestPermission)); + return; + } + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); + + // Cookie settings may have changed. + ContentSetting setting = host_content_settings_map_->GetContentSetting( + url_, CONTENT_SETTINGS_TYPE_COOKIES); + if (setting != CONTENT_SETTING_ASK) { + SendResponse(setting, false); + return; + } + + Browser* browser = BrowserList::GetLastActive(); + if (!browser || !browser->GetSelectedTabContents()) { + BlockSiteData(false); + return; + } + +#if defined(OS_WIN) + self_ref_ = this; + // Will call either AllowSiteData or BlockSiteData which will NULL out our + // self reference. + RunDatabasePrompt(browser->GetSelectedTabContents(), url_, + database_name_, this); +#else + // TODO(jorlow): Enable prompting for other ports. + BlockSiteData(false); +#endif } -void DatabasePermissionRequest::RequestPermissionUI() { - DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); - bool allow = false; // TODO(jorlow/darin): Allow user to choose. +void DatabasePermissionRequest::AllowSiteData(bool remember, + bool session_expire) { + SendResponse(CONTENT_SETTING_ALLOW, remember); +} + +void DatabasePermissionRequest::BlockSiteData(bool remember) { + SendResponse(CONTENT_SETTING_BLOCK, remember); +} + +void DatabasePermissionRequest::SendResponse(ContentSetting content_setting, + bool remember) { + if (remember) { + host_content_settings_map_->SetContentSetting( + url_.host(), CONTENT_SETTINGS_TYPE_COOKIES, content_setting); + } + + if (content_setting == CONTENT_SETTING_ALLOW) { + ChromeThread::PostTask(ChromeThread::IO, FROM_HERE, on_allow_.release()); + } else { + DCHECK(content_setting == CONTENT_SETTING_BLOCK); + ChromeThread::PostTask(ChromeThread::IO, FROM_HERE, on_block_.release()); + } + + // Release all resources. + on_allow_.reset(); + on_block_.reset(); - Task* task = allow ? on_allow_.release() : on_block_.release(); - ChromeThread::PostTask(ChromeThread::IO, FROM_HERE, task); + // And lastly, release our self ref which may trigger delete. Do the release + // on a local variable instead of a member variable to avoid reentrancy + // nastiness if the ref count goes to 0. + scoped_refptr<DatabasePermissionRequest> self; + self.swap(self_ref_); } |