Chromium Code Reviews| Index: chrome/renderer/extensions/user_script_slave.cc |
| diff --git a/chrome/renderer/extensions/user_script_slave.cc b/chrome/renderer/extensions/user_script_slave.cc |
| index b8309ac74042484ad7ec7d5694f870a5cc8f8855..63a48ac08b7a705bd4cf8d9ad6206c566bbe8afa 100644 |
| --- a/chrome/renderer/extensions/user_script_slave.cc |
| +++ b/chrome/renderer/extensions/user_script_slave.cc |
| @@ -17,15 +17,20 @@ |
| #include "chrome/common/extensions/extension_set.h" |
| #include "chrome/common/url_constants.h" |
| #include "chrome/renderer/chrome_render_process_observer.h" |
| +#include "chrome/renderer/extensions/extension_dispatcher.h" |
| #include "chrome/renderer/extensions/extension_groups.h" |
| #include "googleurl/src/gurl.h" |
| #include "grit/renderer_resources.h" |
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" |
| +#include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h" |
| +#include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityPolicy.h" |
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebVector.h" |
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" |
| #include "ui/base/resource/resource_bundle.h" |
| using WebKit::WebFrame; |
| +using WebKit::WebSecurityOrigin; |
| +using WebKit::WebSecurityPolicy; |
| using WebKit::WebString; |
| using WebKit::WebVector; |
| using WebKit::WebView; |
| @@ -40,26 +45,60 @@ static const char kUserScriptTail[] = "\n})(window);"; |
| static const char kInitExtension[] = |
| "if (chrome.initExtension) chrome.initExtension('%s', true, %s);"; |
| - |
| -int UserScriptSlave::GetIsolatedWorldId(const std::string& extension_id) { |
| +// static |
| +int UserScriptSlave::GetIsolatedWorldId( |
| + const Extension* extension, WebFrame* frame) { |
| typedef std::map<std::string, int> IsolatedWorldMap; |
| static IsolatedWorldMap g_isolated_world_ids; |
| static int g_next_isolated_world_id = 1; |
| - IsolatedWorldMap::iterator iter = g_isolated_world_ids.find(extension_id); |
| - if (iter != g_isolated_world_ids.end()) |
| + IsolatedWorldMap::iterator iter = g_isolated_world_ids.find(extension->id()); |
| + if (iter != g_isolated_world_ids.end()) { |
| + frame->setIsolatedWorldSecurityOrigin( |
|
Matt Perry
2011/05/27 20:55:28
Is this necessary? If it's already in the map, thi
|
| + iter->second, |
| + WebSecurityOrigin::create(extension->url())); |
| return iter->second; |
| + } |
| int new_id = g_next_isolated_world_id; |
| ++g_next_isolated_world_id; |
| // This map will tend to pile up over time, but realistically, you're never |
| // going to have enough extensions for it to matter. |
| - g_isolated_world_ids[extension_id] = new_id; |
| + g_isolated_world_ids[extension->id()] = new_id; |
| + InitializeIsolatedWorld(new_id, extension); |
| + frame->setIsolatedWorldSecurityOrigin( |
| + new_id, |
| + WebSecurityOrigin::create(extension->url())); |
| return new_id; |
| } |
| +// static |
| +void UserScriptSlave::InitializeIsolatedWorld( |
| + int isolated_world_id, |
| + const Extension* extension) { |
| + const URLPatternList& permissions = |
| + extension->GetEffectiveHostPermissions().patterns(); |
| + for (size_t i = 0; i < permissions.size(); ++i) { |
| + const char* schemes[] = { |
| + chrome::kHttpScheme, |
| + chrome::kHttpsScheme, |
| + chrome::kFileScheme, |
| + chrome::kChromeUIScheme, |
| + }; |
| + for (size_t j = 0; j < arraysize(schemes); ++j) { |
| + if (permissions[i].MatchesScheme(schemes[j])) { |
| + WebSecurityPolicy::addOriginAccessWhitelistEntry( |
| + extension->url(), |
| + WebString::fromUTF8(schemes[j]), |
| + WebString::fromUTF8(permissions[i].host()), |
| + permissions[i].match_subdomains()); |
| + } |
| + } |
| + } |
| +} |
| + |
| UserScriptSlave::UserScriptSlave(const ExtensionSet* extensions) |
| : shared_memory_(NULL), |
| script_deleter_(&scripts_), |
| @@ -248,7 +287,7 @@ void UserScriptSlave::InjectScripts(WebFrame* frame, |
| // ID. |
| if (!script->extension_id().empty()) { |
| InsertInitExtensionCode(&sources, script->extension_id()); |
| - isolated_world_id = GetIsolatedWorldId(script->extension_id()); |
| + isolated_world_id = GetIsolatedWorldId(extension, frame); |
| } |
| PerfTimer exec_timer; |