Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6)

Side by Side Diff: extensions/renderer/dispatcher.cc

Issue 890083002: [Extensions] Propagate activeTab hosts to extension background pages (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "extensions/renderer/dispatcher.h" 5 #include "extensions/renderer/dispatcher.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/callback.h" 8 #include "base/callback.h"
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/debug/alias.h" 10 #include "base/debug/alias.h"
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 #include "extensions/renderer/render_view_observer_natives.h" 70 #include "extensions/renderer/render_view_observer_natives.h"
71 #include "extensions/renderer/request_sender.h" 71 #include "extensions/renderer/request_sender.h"
72 #include "extensions/renderer/runtime_custom_bindings.h" 72 #include "extensions/renderer/runtime_custom_bindings.h"
73 #include "extensions/renderer/safe_builtins.h" 73 #include "extensions/renderer/safe_builtins.h"
74 #include "extensions/renderer/script_context.h" 74 #include "extensions/renderer/script_context.h"
75 #include "extensions/renderer/script_context_set.h" 75 #include "extensions/renderer/script_context_set.h"
76 #include "extensions/renderer/script_injection.h" 76 #include "extensions/renderer/script_injection.h"
77 #include "extensions/renderer/script_injection_manager.h" 77 #include "extensions/renderer/script_injection_manager.h"
78 #include "extensions/renderer/send_request_natives.h" 78 #include "extensions/renderer/send_request_natives.h"
79 #include "extensions/renderer/set_icon_natives.h" 79 #include "extensions/renderer/set_icon_natives.h"
80 #include "extensions/renderer/tab_finder.h"
80 #include "extensions/renderer/test_features_native_handler.h" 81 #include "extensions/renderer/test_features_native_handler.h"
81 #include "extensions/renderer/user_gestures_native_handler.h" 82 #include "extensions/renderer/user_gestures_native_handler.h"
82 #include "extensions/renderer/utils_native_handler.h" 83 #include "extensions/renderer/utils_native_handler.h"
83 #include "extensions/renderer/v8_context_native_handler.h" 84 #include "extensions/renderer/v8_context_native_handler.h"
84 #include "grit/extensions_renderer_resources.h" 85 #include "grit/extensions_renderer_resources.h"
85 #include "third_party/WebKit/public/platform/WebString.h" 86 #include "third_party/WebKit/public/platform/WebString.h"
86 #include "third_party/WebKit/public/platform/WebURLRequest.h" 87 #include "third_party/WebKit/public/platform/WebURLRequest.h"
87 #include "third_party/WebKit/public/web/WebCustomElement.h" 88 #include "third_party/WebKit/public/web/WebCustomElement.h"
88 #include "third_party/WebKit/public/web/WebDataSource.h" 89 #include "third_party/WebKit/public/web/WebDataSource.h"
89 #include "third_party/WebKit/public/web/WebDocument.h" 90 #include "third_party/WebKit/public/web/WebDocument.h"
(...skipping 672 matching lines...) Expand 10 before | Expand all | Expand 10 after
762 IPC_MESSAGE_HANDLER(ExtensionMsg_SetChannel, OnSetChannel) 763 IPC_MESSAGE_HANDLER(ExtensionMsg_SetChannel, OnSetChannel)
763 IPC_MESSAGE_HANDLER(ExtensionMsg_SetFunctionNames, OnSetFunctionNames) 764 IPC_MESSAGE_HANDLER(ExtensionMsg_SetFunctionNames, OnSetFunctionNames)
764 IPC_MESSAGE_HANDLER(ExtensionMsg_SetScriptingWhitelist, 765 IPC_MESSAGE_HANDLER(ExtensionMsg_SetScriptingWhitelist,
765 OnSetScriptingWhitelist) 766 OnSetScriptingWhitelist)
766 IPC_MESSAGE_HANDLER(ExtensionMsg_SetSystemFont, OnSetSystemFont) 767 IPC_MESSAGE_HANDLER(ExtensionMsg_SetSystemFont, OnSetSystemFont)
767 IPC_MESSAGE_HANDLER(ExtensionMsg_ShouldSuspend, OnShouldSuspend) 768 IPC_MESSAGE_HANDLER(ExtensionMsg_ShouldSuspend, OnShouldSuspend)
768 IPC_MESSAGE_HANDLER(ExtensionMsg_Suspend, OnSuspend) 769 IPC_MESSAGE_HANDLER(ExtensionMsg_Suspend, OnSuspend)
769 IPC_MESSAGE_HANDLER(ExtensionMsg_TransferBlobs, OnTransferBlobs) 770 IPC_MESSAGE_HANDLER(ExtensionMsg_TransferBlobs, OnTransferBlobs)
770 IPC_MESSAGE_HANDLER(ExtensionMsg_Unloaded, OnUnloaded) 771 IPC_MESSAGE_HANDLER(ExtensionMsg_Unloaded, OnUnloaded)
771 IPC_MESSAGE_HANDLER(ExtensionMsg_UpdatePermissions, OnUpdatePermissions) 772 IPC_MESSAGE_HANDLER(ExtensionMsg_UpdatePermissions, OnUpdatePermissions)
773 IPC_MESSAGE_HANDLER(ExtensionMsg_UpdateTabSpecificPermissions,
774 OnUpdateTabSpecificPermissions)
775 IPC_MESSAGE_HANDLER(ExtensionMsg_ClearTabSpecificPermissions,
776 OnClearTabSpecificPermissions)
772 IPC_MESSAGE_HANDLER(ExtensionMsg_UsingWebRequestAPI, OnUsingWebRequestAPI) 777 IPC_MESSAGE_HANDLER(ExtensionMsg_UsingWebRequestAPI, OnUsingWebRequestAPI)
773 IPC_MESSAGE_FORWARD(ExtensionMsg_WatchPages, 778 IPC_MESSAGE_FORWARD(ExtensionMsg_WatchPages,
774 content_watcher_.get(), 779 content_watcher_.get(),
775 ContentWatcher::OnWatchPages) 780 ContentWatcher::OnWatchPages)
776 IPC_MESSAGE_UNHANDLED(handled = false) 781 IPC_MESSAGE_UNHANDLED(handled = false)
777 IPC_END_MESSAGE_MAP() 782 IPC_END_MESSAGE_MAP()
778 783
779 return handled; 784 return handled;
780 } 785 }
781 786
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
1021 const ExtensionMsg_UpdatePermissions_Params& params) { 1026 const ExtensionMsg_UpdatePermissions_Params& params) {
1022 const Extension* extension = extensions_.GetByID(params.extension_id); 1027 const Extension* extension = extensions_.GetByID(params.extension_id);
1023 if (!extension) 1028 if (!extension)
1024 return; 1029 return;
1025 1030
1026 scoped_refptr<const PermissionSet> active = 1031 scoped_refptr<const PermissionSet> active =
1027 params.active_permissions.ToPermissionSet(); 1032 params.active_permissions.ToPermissionSet();
1028 scoped_refptr<const PermissionSet> withheld = 1033 scoped_refptr<const PermissionSet> withheld =
1029 params.withheld_permissions.ToPermissionSet(); 1034 params.withheld_permissions.ToPermissionSet();
1030 1035
1031 if (is_webkit_initialized_) { 1036 URLPatternSet old_effective =
1032 UpdateOriginPermissions( 1037 extension->permissions_data()->GetEffectiveHostPermissions();
1033 extension, 1038 extension->permissions_data()->SetPermissions(active, withheld);
1034 extension->permissions_data()->GetEffectiveHostPermissions(), 1039
1035 active->effective_hosts()); 1040 if (is_webkit_initialized_)
1041 UpdateOriginPermissions(extension, old_effective);
1042
1043 UpdateBindings(extension->id());
1044 }
1045
1046 void Dispatcher::OnUpdateTabSpecificPermissions(
1047 const GURL& visible_url,
1048 const std::string& extension_id,
1049 const URLPatternSet& new_hosts,
1050 int tab_id) {
1051 // Check against the URL to avoid races. If we can't find the tab, it's
1052 // because this is an extension's background page (run in a different
1053 // process) - in this case, we can't perform the security check. However,
1054 // since activeTab is only granted via user action, this isn't a huge concern.
1055 content::RenderView* render_view = TabFinder::Find(tab_id);
1056 if (render_view &&
1057 render_view->GetWebView()->mainFrame()->document().url() != visible_url) {
1058 return;
1036 } 1059 }
1037 1060
1038 extension->permissions_data()->SetPermissions(active, withheld); 1061 const Extension* extension = extensions_.GetByID(extension_id);
1039 UpdateBindings(extension->id()); 1062 if (!extension)
1063 return;
1064
1065 URLPatternSet old_effective =
1066 extension->permissions_data()->GetEffectiveHostPermissions();
1067 extension->permissions_data()->UpdateTabSpecificPermissions(
1068 tab_id,
1069 new extensions::PermissionSet(extensions::APIPermissionSet(),
1070 extensions::ManifestPermissionSet(),
1071 new_hosts,
1072 extensions::URLPatternSet()));
1073
1074 if (is_webkit_initialized_ &&
1075 ExtensionHelper::GetBackgroundPage(extension_id)) {
1076 UpdateOriginPermissions(extension, old_effective);
not at google - send to devlin 2015/02/03 19:29:12 I was wondering why this is only happening for the
Devlin 2015/02/04 22:26:02 As discussed offline, we don't want to update the
1077 }
1078 }
1079
1080 void Dispatcher::OnClearTabSpecificPermissions(
1081 const std::vector<std::string>& extension_ids,
1082 int tab_id) {
1083 for (const std::string& id : extension_ids) {
1084 const Extension* extension = extensions_.GetByID(id);
1085 if (extension) {
1086 URLPatternSet old_effective =
1087 extension->permissions_data()->GetEffectiveHostPermissions();
1088 extension->permissions_data()->ClearTabSpecificPermissions(tab_id);
1089 if (ExtensionHelper::GetBackgroundPage(id))
1090 UpdateOriginPermissions(extension, old_effective);
1091 }
1092 }
1040 } 1093 }
1041 1094
1042 void Dispatcher::OnUsingWebRequestAPI(bool webrequest_used) { 1095 void Dispatcher::OnUsingWebRequestAPI(bool webrequest_used) {
1043 webrequest_used_ = webrequest_used; 1096 webrequest_used_ = webrequest_used;
1044 } 1097 }
1045 1098
1046 void Dispatcher::OnUserScriptsUpdated( 1099 void Dispatcher::OnUserScriptsUpdated(
1047 const std::set<std::string>& changed_extensions, 1100 const std::set<std::string>& changed_extensions,
1048 const std::vector<UserScript*>& scripts) { 1101 const std::vector<UserScript*>& scripts) {
1049 UpdateActiveExtensions(); 1102 UpdateActiveExtensions();
1050 } 1103 }
1051 1104
1052 void Dispatcher::UpdateActiveExtensions() { 1105 void Dispatcher::UpdateActiveExtensions() {
1053 std::set<std::string> active_extensions = active_extension_ids_; 1106 std::set<std::string> active_extensions = active_extension_ids_;
1054 user_script_set_manager_->GetAllActiveExtensionIds(&active_extensions); 1107 user_script_set_manager_->GetAllActiveExtensionIds(&active_extensions);
1055 delegate_->OnActiveExtensionsUpdated(active_extensions); 1108 delegate_->OnActiveExtensionsUpdated(active_extensions);
1056 } 1109 }
1057 1110
1058 void Dispatcher::InitOriginPermissions(const Extension* extension) { 1111 void Dispatcher::InitOriginPermissions(const Extension* extension) {
1059 delegate_->InitOriginPermissions(extension, 1112 delegate_->InitOriginPermissions(extension,
1060 IsExtensionActive(extension->id())); 1113 IsExtensionActive(extension->id()));
1061 UpdateOriginPermissions( 1114 UpdateOriginPermissions(extension, URLPatternSet()); // No old permissions.
1062 extension,
1063 URLPatternSet(), // No old permissions.
1064 extension->permissions_data()->GetEffectiveHostPermissions());
1065 } 1115 }
1066 1116
1067 void Dispatcher::UpdateOriginPermissions( 1117 void Dispatcher::UpdateOriginPermissions(const Extension* extension,
not at google - send to devlin 2015/02/03 19:29:12 Even though this method can determine new_patterns
Devlin 2015/02/04 22:26:02 Dumbified.
1068 const Extension* extension, 1118 const URLPatternSet& old_patterns) {
1069 const URLPatternSet& old_patterns,
1070 const URLPatternSet& new_patterns) {
1071 static const char* kSchemes[] = { 1119 static const char* kSchemes[] = {
1072 url::kHttpScheme, 1120 url::kHttpScheme,
1073 url::kHttpsScheme, 1121 url::kHttpsScheme,
1074 url::kFileScheme, 1122 url::kFileScheme,
1075 content::kChromeUIScheme, 1123 content::kChromeUIScheme,
1076 url::kFtpScheme, 1124 url::kFtpScheme,
1077 }; 1125 };
1126 URLPatternSet new_patterns =
1127 extension->permissions_data()->GetEffectiveHostPermissions();
1128
1129 // Remove those patterns that aren't present in the current permissions...
1130 URLPatternSet to_remove;
1131 URLPatternSet::CreateDifference(old_patterns, new_patterns, &to_remove);
1132
1133 // ...And add the new ones.
1134 URLPatternSet to_add;
1135 URLPatternSet::CreateDifference(new_patterns, old_patterns, &to_add);
1136
1078 for (size_t i = 0; i < arraysize(kSchemes); ++i) { 1137 for (size_t i = 0; i < arraysize(kSchemes); ++i) {
1079 const char* scheme = kSchemes[i]; 1138 const char* scheme = kSchemes[i];
1080 // Remove all old patterns... 1139 for (const URLPattern& pattern : to_remove) {
1081 for (URLPatternSet::const_iterator pattern = old_patterns.begin(); 1140 if (pattern.MatchesScheme(scheme)) {
1082 pattern != old_patterns.end(); ++pattern) {
1083 if (pattern->MatchesScheme(scheme)) {
1084 WebSecurityPolicy::removeOriginAccessWhitelistEntry( 1141 WebSecurityPolicy::removeOriginAccessWhitelistEntry(
1085 extension->url(), 1142 extension->url(),
1086 WebString::fromUTF8(scheme), 1143 WebString::fromUTF8(scheme),
1087 WebString::fromUTF8(pattern->host()), 1144 WebString::fromUTF8(pattern.host()),
1088 pattern->match_subdomains()); 1145 pattern.match_subdomains());
1089 } 1146 }
1090 } 1147 }
1091 // ...And add the new ones. 1148
1092 for (URLPatternSet::const_iterator pattern = new_patterns.begin(); 1149 for (const URLPattern& pattern : to_add) {
1093 pattern != new_patterns.end(); ++pattern) { 1150 if (pattern.MatchesScheme(scheme)) {
1094 if (pattern->MatchesScheme(scheme)) {
1095 WebSecurityPolicy::addOriginAccessWhitelistEntry( 1151 WebSecurityPolicy::addOriginAccessWhitelistEntry(
1096 extension->url(), 1152 extension->url(),
1097 WebString::fromUTF8(scheme), 1153 WebString::fromUTF8(scheme),
1098 WebString::fromUTF8(pattern->host()), 1154 WebString::fromUTF8(pattern.host()),
1099 pattern->match_subdomains()); 1155 pattern.match_subdomains());
1100 } 1156 }
1101 } 1157 }
1102 } 1158 }
1103 } 1159 }
1104 1160
1105 void Dispatcher::EnableCustomElementWhiteList() { 1161 void Dispatcher::EnableCustomElementWhiteList() {
1106 blink::WebCustomElement::addEmbedderCustomElementName("appview"); 1162 blink::WebCustomElement::addEmbedderCustomElementName("appview");
1107 blink::WebCustomElement::addEmbedderCustomElementName("appviewbrowserplugin"); 1163 blink::WebCustomElement::addEmbedderCustomElementName("appviewbrowserplugin");
1108 blink::WebCustomElement::addEmbedderCustomElementName("extensionoptions"); 1164 blink::WebCustomElement::addEmbedderCustomElementName("extensionoptions");
1109 blink::WebCustomElement::addEmbedderCustomElementName( 1165 blink::WebCustomElement::addEmbedderCustomElementName(
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after
1443 return v8::Handle<v8::Object>(); 1499 return v8::Handle<v8::Object>();
1444 1500
1445 if (bind_name) 1501 if (bind_name)
1446 *bind_name = split.back(); 1502 *bind_name = split.back();
1447 1503
1448 return bind_object.IsEmpty() ? AsObjectOrEmpty(GetOrCreateChrome(context)) 1504 return bind_object.IsEmpty() ? AsObjectOrEmpty(GetOrCreateChrome(context))
1449 : bind_object; 1505 : bind_object;
1450 } 1506 }
1451 1507
1452 } // namespace extensions 1508 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698