Index: chrome/browser/geolocation/geolocation_permission_context.cc |
diff --git a/chrome/browser/geolocation/geolocation_permission_context.cc b/chrome/browser/geolocation/geolocation_permission_context.cc |
index f9fa9e2e4bd9fe2311aa5b3c5da15a57d420e8a5..3620c38422f4ec1213ad4334c8c6f40abc9b2f65 100644 |
--- a/chrome/browser/geolocation/geolocation_permission_context.cc |
+++ b/chrome/browser/geolocation/geolocation_permission_context.cc |
@@ -6,11 +6,12 @@ |
#include "app/l10n_util.h" |
#include "app/resource_bundle.h" |
-#include "base/file_util.h" |
+#include "googleurl/src/gurl.h" |
#include "chrome/browser/browser.h" |
#include "chrome/browser/browser_list.h" |
#include "chrome/browser/chrome_thread.h" |
#include "chrome/browser/geolocation/geolocation_dispatcher_host.h" |
+#include "chrome/browser/host_content_settings_map.h" |
#include "chrome/browser/profile.h" |
#include "chrome/browser/renderer_host/render_process_host.h" |
#include "chrome/browser/renderer_host/render_view_host.h" |
@@ -18,18 +19,12 @@ |
#include "chrome/browser/tab_contents/infobar_delegate.h" |
#include "chrome/browser/tab_contents/tab_contents.h" |
#include "chrome/browser/tab_contents/tab_util.h" |
-#include "chrome/common/json_value_serializer.h" |
#include "chrome/common/render_messages.h" |
#include "grit/generated_resources.h" |
#include "grit/theme_resources.h" |
namespace { |
-const FilePath::CharType kGeolocationPermissionPath[] = |
- FILE_PATH_LITERAL("Geolocation"); |
- |
-const wchar_t kAllowedDictionaryKey[] = L"allowed"; |
- |
// This is the delegate used to display the confirmation info bar. |
class GeolocationConfirmInfoBarDelegate : public ConfirmInfoBarDelegate { |
public: |
@@ -73,7 +68,7 @@ class GeolocationConfirmInfoBarDelegate : public ConfirmInfoBarDelegate { |
private: |
bool SetPermission(bool confirm) { |
- context_->SetPermission( |
+ context_->SetPermissionFromInfobar( |
render_process_id_, render_view_id_, bridge_id_, host_, confirm); |
return true; |
} |
@@ -84,66 +79,12 @@ class GeolocationConfirmInfoBarDelegate : public ConfirmInfoBarDelegate { |
int bridge_id_; |
std::string host_; |
}; |
- |
-// TODO(bulach): use HostContentSettingsMap instead! |
-FilePath::StringType StdStringToFilePathString(const std::string& std_string) { |
-#if defined(OS_WIN) |
- return UTF8ToWide(std_string); |
-#else |
- return std_string; |
-#endif |
-} |
- |
-// Returns true if permission was successfully read from file, and *allowed |
-// be set accordingly. |
-// Returns false otherwise. |
-bool ReadPermissionFromFile( |
- const std::string& host, const FilePath& permissions_path, bool* allowed) { |
- DCHECK(allowed); |
- *allowed = false; |
- // TODO(bulach): this is probably wrong! is there any utility to convert a URL |
- // to FilePath? |
- FilePath permission_file( |
- permissions_path.Append(StdStringToFilePathString(host))); |
- if (!file_util::PathExists(permission_file)) |
- return false; |
- JSONFileValueSerializer serializer(permission_file); |
- scoped_ptr<Value> root_value(serializer.Deserialize(NULL)); |
- bool ret = root_value.get() && |
- root_value->GetType() == Value::TYPE_DICTIONARY; |
- DictionaryValue* dictionary = static_cast<DictionaryValue*>(root_value.get()); |
- return ret && |
- dictionary->GetBoolean(kAllowedDictionaryKey, allowed); |
-} |
- |
-void SavePermissionToFile( |
- const std::string& host, const FilePath& permissions_path, bool allowed) { |
-#if 0 |
- if (!file_util::DirectoryExists(permissions_path)) |
- file_util::CreateDirectory(permissions_path); |
- // TODO(bulach): this is probably wrong! is there any utility to convert a URL |
- // to FilePath? |
- FilePath permission_file( |
- permissions_path.Append(StdStringToFilePathString( |
- host))); |
- DictionaryValue dictionary; |
- dictionary.SetBoolean(kAllowedDictionaryKey, allowed); |
- std::string permission_data; |
- JSONStringValueSerializer serializer(&permission_data); |
- serializer.Serialize(dictionary); |
- file_util::WriteFile( |
- permission_file, permission_data.c_str(), permission_data.length()); |
-#endif // if 0 |
-} |
- |
} // namespace |
GeolocationPermissionContext::GeolocationPermissionContext( |
- Profile* profile) |
- : profile_(profile), |
- is_off_the_record_(profile->IsOffTheRecord()), |
- permissions_path_(profile->GetPath().Append(FilePath( |
- kGeolocationPermissionPath))) { |
+ HostContentSettingsMap* host_content_settings_map) |
+ : host_content_settings_map_(host_content_settings_map) { |
+ DCHECK(host_content_settings_map_); |
} |
GeolocationPermissionContext::~GeolocationPermissionContext() { |
@@ -153,50 +94,45 @@ void GeolocationPermissionContext::RequestGeolocationPermission( |
int render_process_id, int render_view_id, int bridge_id, |
const std::string& host) { |
DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); |
- std::map<std::string, bool>::const_iterator permission = |
- permissions_.find(host); |
- if (permission != permissions_.end()) { |
- NotifyPermissionSet( |
- render_process_id, render_view_id, bridge_id, permission->second); |
+ ContentSetting content_setting = |
+ host_content_settings_map_->GetContentSetting( |
+ host, CONTENT_SETTINGS_TYPE_GEOLOCATION); |
+ if (content_setting == CONTENT_SETTING_ASK) { |
+ RequestPermissionFromUI(render_process_id, render_view_id, bridge_id, host); |
+ } else if (content_setting == CONTENT_SETTING_ALLOW) { |
+ NotifyPermissionSet(render_process_id, render_view_id, bridge_id, host, |
+ true); |
+ } else if (content_setting == CONTENT_SETTING_BLOCK) { |
+ NotifyPermissionSet(render_process_id, render_view_id, bridge_id, host, |
+ false); |
} else { |
- HandlePermissionMemoryCacheMiss( |
- render_process_id, render_view_id, bridge_id, host); |
+ NOTREACHED() << "unknown content setting" << content_setting; |
} |
} |
-void GeolocationPermissionContext::SetPermission( |
+void GeolocationPermissionContext::SetPermissionFromInfobar( |
int render_process_id, int render_view_id, int bridge_id, |
const std::string& host, bool allowed) { |
- SetPermissionMemoryCacheOnIOThread(host, allowed); |
- SetPermissionOnFileThread(host, allowed); |
- NotifyPermissionSet(render_process_id, render_view_id, bridge_id, allowed); |
+ host_content_settings_map_->SetContentSetting( |
+ host, CONTENT_SETTINGS_TYPE_GEOLOCATION, |
+ allowed ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK); |
+ NotifyPermissionSet( |
+ render_process_id, render_view_id, bridge_id, host, allowed); |
} |
-void GeolocationPermissionContext::HandlePermissionMemoryCacheMiss( |
- int render_process_id, int render_view_id, int bridge_id, |
- const std::string& host) { |
- if (!ChromeThread::CurrentlyOn(ChromeThread::FILE)) { |
- ChromeThread::PostTask( |
- ChromeThread::FILE, FROM_HERE, |
- NewRunnableMethod( |
- this, |
- &GeolocationPermissionContext::HandlePermissionMemoryCacheMiss, |
- render_process_id, render_view_id, bridge_id, host)); |
- return; |
- } |
- |
- DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); |
- // TODO(bulach): should we save a file per host or have some smarter |
- // storage? Use HostContentSettingsMap instead. |
- bool allowed; |
- if (is_off_the_record_ || |
- !ReadPermissionFromFile(host, permissions_path_, &allowed)) { |
- RequestPermissionFromUI( |
- render_process_id, render_view_id, bridge_id, host); |
- } else { |
- SetPermissionMemoryCacheOnIOThread(host, allowed); |
- NotifyPermissionSet(render_process_id, render_view_id, bridge_id, allowed); |
- } |
+void GeolocationPermissionContext::SetPermissionFromContentBubble( |
+ TabContents* tab_contents, const std::string& host, bool allowed) { |
+ int render_process_id = tab_contents->render_view_host()->process()->id(); |
+ int render_view_id = tab_contents->render_view_host()->routing_id(); |
+ host_content_settings_map_->SetContentSetting( |
+ host, CONTENT_SETTINGS_TYPE_GEOLOCATION, |
+ allowed ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK); |
+ RenderViewHostDelegate::Resource* resource = tab_util::GetTabContentsByID( |
+ render_process_id, render_view_id); |
+ resource->OnGeolocationPermissionSet(host, allowed); |
+ // TODO(bulach): should we traverse all registered bridges? JS callbacks will |
+ // have already been triggered at this point, so they have already received |
+ // their position updated or error callbacks. |
} |
void GeolocationPermissionContext::RequestPermissionFromUI( |
@@ -219,7 +155,8 @@ void GeolocationPermissionContext::RequestPermissionFromUI( |
LOG(WARNING) << "Attempt to use geolocaiton tabless renderer: " |
<< render_process_id << "," << render_view_id << "," << bridge_id |
<< " (geolocation is not supported in extensions)"; |
- NotifyPermissionSet(render_process_id, render_view_id, bridge_id, false); |
+ NotifyPermissionSet(render_process_id, render_view_id, bridge_id, host, |
+ false); |
return; |
} |
tab_contents->AddInfoBar( |
@@ -229,58 +166,26 @@ void GeolocationPermissionContext::RequestPermissionFromUI( |
} |
void GeolocationPermissionContext::NotifyPermissionSet( |
- int render_process_id, int render_view_id, int bridge_id, bool allowed) { |
+ int render_process_id, int render_view_id, int bridge_id, |
+ const std::string& host, bool allowed) { |
if (!ChromeThread::CurrentlyOn(ChromeThread::UI)) { |
ChromeThread::PostTask( |
ChromeThread::UI, FROM_HERE, |
NewRunnableMethod( |
this, &GeolocationPermissionContext::NotifyPermissionSet, |
- render_process_id, render_view_id, bridge_id, allowed)); |
+ render_process_id, render_view_id, bridge_id, |
+ host, allowed)); |
return; |
} |
DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); |
+ |
+ RenderViewHostDelegate::Resource* resource = tab_util::GetTabContentsByID( |
+ render_process_id, render_view_id); |
+ resource->OnGeolocationPermissionSet(host, allowed); |
CallRenderViewHost( |
render_process_id, render_view_id, |
&RenderViewHost::Send, |
new ViewMsg_Geolocation_PermissionSet( |
render_view_id, bridge_id, allowed)); |
} |
- |
-void GeolocationPermissionContext::SetPermissionMemoryCacheOnIOThread( |
- const std::string& host, bool allowed) { |
- if (!ChromeThread::CurrentlyOn(ChromeThread::IO)) { |
- ChromeThread::PostTask( |
- ChromeThread::IO, FROM_HERE, |
- NewRunnableMethod( |
- this, |
- &GeolocationPermissionContext::SetPermissionMemoryCacheOnIOThread, |
- host, allowed)); |
- return; |
- } |
- |
- DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); |
- permissions_[host] = allowed; |
-} |
- |
-void GeolocationPermissionContext::SetPermissionOnFileThread( |
- const std::string& host, bool allowed) { |
- if (is_off_the_record_) |
- return; |
- if (!ChromeThread::CurrentlyOn(ChromeThread::FILE)) { |
- ChromeThread::PostTask( |
- ChromeThread::FILE, FROM_HERE, |
- NewRunnableMethod( |
- this, &GeolocationPermissionContext::SetPermissionOnFileThread, |
- host, allowed)); |
- return; |
- } |
- |
- DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); |
- |
- // TODO(bulach): should we save a file per host or have some smarter |
- // storage? Use HostContentSettingsMap instead. |
-#if 0 |
- SavePermissionToFile(host, permissions_path_, allowed); |
-#endif |
-} |