summaryrefslogtreecommitdiffstats
path: root/chrome/browser/renderer_host/database_permission_request.cc
diff options
context:
space:
mode:
authorjorlow@chromium.org <jorlow@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-17 11:29:45 +0000
committerjorlow@chromium.org <jorlow@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-17 11:29:45 +0000
commite37f934991547accccd176d1d57d733eacde21ef (patch)
tree0e80c599ed5597bf5d9217e351795439b2564985 /chrome/browser/renderer_host/database_permission_request.cc
parent026a135063abda1ad446c049bbea1a971bf0ec4a (diff)
downloadchromium_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.cc86
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_);
}