Index: content/browser/child_process_security_policy_impl.cc |
diff --git a/content/browser/child_process_security_policy_impl.cc b/content/browser/child_process_security_policy_impl.cc |
index b748a72fe73236016d23c5a514b2b828f8b26779..9e94f34602d5e56fd450224bf33110e05da68293 100644 |
--- a/content/browser/child_process_security_policy_impl.cc |
+++ b/content/browser/child_process_security_policy_impl.cc |
@@ -4,6 +4,8 @@ |
#include "content/browser/child_process_security_policy_impl.h" |
+#include <utility> |
+ |
#include "base/command_line.h" |
#include "base/files/file_path.h" |
#include "base/logging.h" |
@@ -87,6 +89,11 @@ class ChildProcessSecurityPolicyImpl::SecurityState { |
file_permissions_.size()); |
} |
+ // Grant permission to request URLs with the specified origin. |
+ void GrantOrigin(const url::Origin& origin) { |
+ origin_set_.insert(origin); |
+ } |
+ |
// Grant permission to request URLs with the specified scheme. |
void GrantScheme(const std::string& scheme) { |
scheme_policy_[scheme] = true; |
@@ -168,10 +175,15 @@ class ChildProcessSecurityPolicyImpl::SecurityState { |
// Determine whether permission has been granted to commit |url|. |
bool CanCommitURL(const GURL& url) { |
- // Having permission to a scheme implies permssion to all of its URLs. |
- SchemeMap::const_iterator judgment(scheme_policy_.find(url.scheme())); |
- if (judgment != scheme_policy_.end()) |
- return judgment->second; |
+ // Having permission to a scheme implies permission to all of its URLs. |
+ SchemeMap::const_iterator scheme_judgment( |
+ scheme_policy_.find(url.scheme())); |
+ if (scheme_judgment != scheme_policy_.end()) |
+ return scheme_judgment->second; |
+ |
+ // Otherwise, check for permission for specific origin. |
+ if (ContainsKey(origin_set_, url::Origin(url))) |
+ return true; |
// file:// URLs are more granular. The child may have been given |
// permission to a specific file but not the file:// scheme in general. |
@@ -242,6 +254,7 @@ class ChildProcessSecurityPolicyImpl::SecurityState { |
private: |
typedef std::map<std::string, bool> SchemeMap; |
+ typedef std::set<url::Origin> OriginSet; |
typedef int FilePermissionFlags; // bit-set of base::File::Flags |
typedef std::map<base::FilePath, FilePermissionFlags> FileMap; |
@@ -255,6 +268,10 @@ class ChildProcessSecurityPolicyImpl::SecurityState { |
// or revoked. |
SchemeMap scheme_policy_; |
+ // The set of URL origins to which the child process has been granted |
+ // permission. |
+ OriginSet origin_set_; |
+ |
// The set of files the child process is permited to upload to the web. |
FileMap file_permissions_; |
@@ -503,6 +520,17 @@ void ChildProcessSecurityPolicyImpl::GrantSendMidiSysExMessage(int child_id) { |
state->second->GrantPermissionForMidiSysEx(); |
} |
+void ChildProcessSecurityPolicyImpl::GrantOrigin(int child_id, |
+ const url::Origin& origin) { |
+ base::AutoLock lock(lock_); |
+ |
+ SecurityStateMap::iterator state = security_state_.find(child_id); |
+ if (state == security_state_.end()) |
+ return; |
+ |
+ state->second->GrantOrigin(origin); |
+} |
+ |
void ChildProcessSecurityPolicyImpl::GrantScheme(int child_id, |
const std::string& scheme) { |
base::AutoLock lock(lock_); |