OLD | NEW |
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 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
72 #include "extensions/renderer/render_view_observer_natives.h" | 72 #include "extensions/renderer/render_view_observer_natives.h" |
73 #include "extensions/renderer/request_sender.h" | 73 #include "extensions/renderer/request_sender.h" |
74 #include "extensions/renderer/runtime_custom_bindings.h" | 74 #include "extensions/renderer/runtime_custom_bindings.h" |
75 #include "extensions/renderer/safe_builtins.h" | 75 #include "extensions/renderer/safe_builtins.h" |
76 #include "extensions/renderer/script_context.h" | 76 #include "extensions/renderer/script_context.h" |
77 #include "extensions/renderer/script_context_set.h" | 77 #include "extensions/renderer/script_context_set.h" |
78 #include "extensions/renderer/script_injection.h" | 78 #include "extensions/renderer/script_injection.h" |
79 #include "extensions/renderer/script_injection_manager.h" | 79 #include "extensions/renderer/script_injection_manager.h" |
80 #include "extensions/renderer/send_request_natives.h" | 80 #include "extensions/renderer/send_request_natives.h" |
81 #include "extensions/renderer/set_icon_natives.h" | 81 #include "extensions/renderer/set_icon_natives.h" |
| 82 #include "extensions/renderer/tab_finder.h" |
82 #include "extensions/renderer/test_features_native_handler.h" | 83 #include "extensions/renderer/test_features_native_handler.h" |
83 #include "extensions/renderer/user_gestures_native_handler.h" | 84 #include "extensions/renderer/user_gestures_native_handler.h" |
84 #include "extensions/renderer/utils_native_handler.h" | 85 #include "extensions/renderer/utils_native_handler.h" |
85 #include "extensions/renderer/v8_context_native_handler.h" | 86 #include "extensions/renderer/v8_context_native_handler.h" |
86 #include "grit/extensions_renderer_resources.h" | 87 #include "grit/extensions_renderer_resources.h" |
87 #include "third_party/WebKit/public/platform/WebString.h" | 88 #include "third_party/WebKit/public/platform/WebString.h" |
88 #include "third_party/WebKit/public/platform/WebURLRequest.h" | 89 #include "third_party/WebKit/public/platform/WebURLRequest.h" |
89 #include "third_party/WebKit/public/web/WebCustomElement.h" | 90 #include "third_party/WebKit/public/web/WebCustomElement.h" |
90 #include "third_party/WebKit/public/web/WebDataSource.h" | 91 #include "third_party/WebKit/public/web/WebDataSource.h" |
91 #include "third_party/WebKit/public/web/WebDocument.h" | 92 #include "third_party/WebKit/public/web/WebDocument.h" |
(...skipping 705 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
797 IPC_MESSAGE_HANDLER(ExtensionMsg_SetChannel, OnSetChannel) | 798 IPC_MESSAGE_HANDLER(ExtensionMsg_SetChannel, OnSetChannel) |
798 IPC_MESSAGE_HANDLER(ExtensionMsg_SetFunctionNames, OnSetFunctionNames) | 799 IPC_MESSAGE_HANDLER(ExtensionMsg_SetFunctionNames, OnSetFunctionNames) |
799 IPC_MESSAGE_HANDLER(ExtensionMsg_SetScriptingWhitelist, | 800 IPC_MESSAGE_HANDLER(ExtensionMsg_SetScriptingWhitelist, |
800 OnSetScriptingWhitelist) | 801 OnSetScriptingWhitelist) |
801 IPC_MESSAGE_HANDLER(ExtensionMsg_SetSystemFont, OnSetSystemFont) | 802 IPC_MESSAGE_HANDLER(ExtensionMsg_SetSystemFont, OnSetSystemFont) |
802 IPC_MESSAGE_HANDLER(ExtensionMsg_ShouldSuspend, OnShouldSuspend) | 803 IPC_MESSAGE_HANDLER(ExtensionMsg_ShouldSuspend, OnShouldSuspend) |
803 IPC_MESSAGE_HANDLER(ExtensionMsg_Suspend, OnSuspend) | 804 IPC_MESSAGE_HANDLER(ExtensionMsg_Suspend, OnSuspend) |
804 IPC_MESSAGE_HANDLER(ExtensionMsg_TransferBlobs, OnTransferBlobs) | 805 IPC_MESSAGE_HANDLER(ExtensionMsg_TransferBlobs, OnTransferBlobs) |
805 IPC_MESSAGE_HANDLER(ExtensionMsg_Unloaded, OnUnloaded) | 806 IPC_MESSAGE_HANDLER(ExtensionMsg_Unloaded, OnUnloaded) |
806 IPC_MESSAGE_HANDLER(ExtensionMsg_UpdatePermissions, OnUpdatePermissions) | 807 IPC_MESSAGE_HANDLER(ExtensionMsg_UpdatePermissions, OnUpdatePermissions) |
| 808 IPC_MESSAGE_HANDLER(ExtensionMsg_UpdateTabSpecificPermissions, |
| 809 OnUpdateTabSpecificPermissions) |
| 810 IPC_MESSAGE_HANDLER(ExtensionMsg_ClearTabSpecificPermissions, |
| 811 OnClearTabSpecificPermissions) |
807 IPC_MESSAGE_HANDLER(ExtensionMsg_UsingWebRequestAPI, OnUsingWebRequestAPI) | 812 IPC_MESSAGE_HANDLER(ExtensionMsg_UsingWebRequestAPI, OnUsingWebRequestAPI) |
808 IPC_MESSAGE_FORWARD(ExtensionMsg_WatchPages, | 813 IPC_MESSAGE_FORWARD(ExtensionMsg_WatchPages, |
809 content_watcher_.get(), | 814 content_watcher_.get(), |
810 ContentWatcher::OnWatchPages) | 815 ContentWatcher::OnWatchPages) |
811 IPC_MESSAGE_UNHANDLED(handled = false) | 816 IPC_MESSAGE_UNHANDLED(handled = false) |
812 IPC_END_MESSAGE_MAP() | 817 IPC_END_MESSAGE_MAP() |
813 | 818 |
814 return handled; | 819 return handled; |
815 } | 820 } |
816 | 821 |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1058 if (!extension) | 1063 if (!extension) |
1059 return; | 1064 return; |
1060 | 1065 |
1061 scoped_refptr<const PermissionSet> active = | 1066 scoped_refptr<const PermissionSet> active = |
1062 params.active_permissions.ToPermissionSet(); | 1067 params.active_permissions.ToPermissionSet(); |
1063 scoped_refptr<const PermissionSet> withheld = | 1068 scoped_refptr<const PermissionSet> withheld = |
1064 params.withheld_permissions.ToPermissionSet(); | 1069 params.withheld_permissions.ToPermissionSet(); |
1065 | 1070 |
1066 if (is_webkit_initialized_) { | 1071 if (is_webkit_initialized_) { |
1067 UpdateOriginPermissions( | 1072 UpdateOriginPermissions( |
1068 extension, | 1073 extension->url(), |
1069 extension->permissions_data()->GetEffectiveHostPermissions(), | 1074 extension->permissions_data()->GetEffectiveHostPermissions(), |
1070 active->effective_hosts()); | 1075 active->effective_hosts()); |
1071 } | 1076 } |
1072 | 1077 |
1073 extension->permissions_data()->SetPermissions(active, withheld); | 1078 extension->permissions_data()->SetPermissions(active, withheld); |
1074 UpdateBindings(extension->id()); | 1079 UpdateBindings(extension->id()); |
1075 } | 1080 } |
1076 | 1081 |
| 1082 void Dispatcher::OnUpdateTabSpecificPermissions(const GURL& visible_url, |
| 1083 const std::string& extension_id, |
| 1084 const URLPatternSet& new_hosts, |
| 1085 bool update_origin_whitelist, |
| 1086 int tab_id) { |
| 1087 // Check against the URL to avoid races. If we can't find the tab, it's |
| 1088 // because this is an extension's background page (run in a different |
| 1089 // process) - in this case, we can't perform the security check. However, |
| 1090 // since activeTab is only granted via user action, this isn't a huge concern. |
| 1091 content::RenderView* render_view = TabFinder::Find(tab_id); |
| 1092 if (render_view && |
| 1093 render_view->GetWebView()->mainFrame()->document().url() != visible_url) { |
| 1094 return; |
| 1095 } |
| 1096 |
| 1097 const Extension* extension = extensions_.GetByID(extension_id); |
| 1098 if (!extension) |
| 1099 return; |
| 1100 |
| 1101 URLPatternSet old_effective = |
| 1102 extension->permissions_data()->GetEffectiveHostPermissions(); |
| 1103 extension->permissions_data()->UpdateTabSpecificPermissions( |
| 1104 tab_id, |
| 1105 new extensions::PermissionSet(extensions::APIPermissionSet(), |
| 1106 extensions::ManifestPermissionSet(), |
| 1107 new_hosts, |
| 1108 extensions::URLPatternSet())); |
| 1109 |
| 1110 if (is_webkit_initialized_ && update_origin_whitelist) { |
| 1111 UpdateOriginPermissions( |
| 1112 extension->url(), |
| 1113 old_effective, |
| 1114 extension->permissions_data()->GetEffectiveHostPermissions()); |
| 1115 } |
| 1116 } |
| 1117 |
| 1118 void Dispatcher::OnClearTabSpecificPermissions( |
| 1119 const std::vector<std::string>& extension_ids, |
| 1120 bool update_origin_whitelist, |
| 1121 int tab_id) { |
| 1122 for (const std::string& id : extension_ids) { |
| 1123 const Extension* extension = extensions_.GetByID(id); |
| 1124 if (extension) { |
| 1125 URLPatternSet old_effective = |
| 1126 extension->permissions_data()->GetEffectiveHostPermissions(); |
| 1127 extension->permissions_data()->ClearTabSpecificPermissions(tab_id); |
| 1128 if (is_webkit_initialized_ && update_origin_whitelist) { |
| 1129 UpdateOriginPermissions( |
| 1130 extension->url(), |
| 1131 old_effective, |
| 1132 extension->permissions_data()->GetEffectiveHostPermissions()); |
| 1133 } |
| 1134 } |
| 1135 } |
| 1136 } |
| 1137 |
1077 void Dispatcher::OnUsingWebRequestAPI(bool webrequest_used) { | 1138 void Dispatcher::OnUsingWebRequestAPI(bool webrequest_used) { |
1078 webrequest_used_ = webrequest_used; | 1139 webrequest_used_ = webrequest_used; |
1079 } | 1140 } |
1080 | 1141 |
1081 void Dispatcher::OnUserScriptsUpdated( | 1142 void Dispatcher::OnUserScriptsUpdated( |
1082 const std::set<std::string>& changed_extensions, | 1143 const std::set<std::string>& changed_extensions, |
1083 const std::vector<UserScript*>& scripts) { | 1144 const std::vector<UserScript*>& scripts) { |
1084 UpdateActiveExtensions(); | 1145 UpdateActiveExtensions(); |
1085 } | 1146 } |
1086 | 1147 |
1087 void Dispatcher::UpdateActiveExtensions() { | 1148 void Dispatcher::UpdateActiveExtensions() { |
1088 std::set<std::string> active_extensions = active_extension_ids_; | 1149 std::set<std::string> active_extensions = active_extension_ids_; |
1089 user_script_set_manager_->GetAllActiveExtensionIds(&active_extensions); | 1150 user_script_set_manager_->GetAllActiveExtensionIds(&active_extensions); |
1090 delegate_->OnActiveExtensionsUpdated(active_extensions); | 1151 delegate_->OnActiveExtensionsUpdated(active_extensions); |
1091 } | 1152 } |
1092 | 1153 |
1093 void Dispatcher::InitOriginPermissions(const Extension* extension) { | 1154 void Dispatcher::InitOriginPermissions(const Extension* extension) { |
1094 delegate_->InitOriginPermissions(extension, | 1155 delegate_->InitOriginPermissions(extension, |
1095 IsExtensionActive(extension->id())); | 1156 IsExtensionActive(extension->id())); |
1096 UpdateOriginPermissions( | 1157 UpdateOriginPermissions( |
1097 extension, | 1158 extension->url(), |
1098 URLPatternSet(), // No old permissions. | 1159 URLPatternSet(), // No old permissions. |
1099 extension->permissions_data()->GetEffectiveHostPermissions()); | 1160 extension->permissions_data()->GetEffectiveHostPermissions()); |
1100 } | 1161 } |
1101 | 1162 |
1102 void Dispatcher::UpdateOriginPermissions( | 1163 void Dispatcher::UpdateOriginPermissions(const GURL& extension_url, |
1103 const Extension* extension, | 1164 const URLPatternSet& old_patterns, |
1104 const URLPatternSet& old_patterns, | 1165 const URLPatternSet& new_patterns) { |
1105 const URLPatternSet& new_patterns) { | |
1106 static const char* kSchemes[] = { | 1166 static const char* kSchemes[] = { |
1107 url::kHttpScheme, | 1167 url::kHttpScheme, |
1108 url::kHttpsScheme, | 1168 url::kHttpsScheme, |
1109 url::kFileScheme, | 1169 url::kFileScheme, |
1110 content::kChromeUIScheme, | 1170 content::kChromeUIScheme, |
1111 url::kFtpScheme, | 1171 url::kFtpScheme, |
1112 }; | 1172 }; |
1113 for (size_t i = 0; i < arraysize(kSchemes); ++i) { | 1173 for (size_t i = 0; i < arraysize(kSchemes); ++i) { |
1114 const char* scheme = kSchemes[i]; | 1174 const char* scheme = kSchemes[i]; |
1115 // Remove all old patterns... | 1175 // Remove all old patterns... |
1116 for (URLPatternSet::const_iterator pattern = old_patterns.begin(); | 1176 for (URLPatternSet::const_iterator pattern = old_patterns.begin(); |
1117 pattern != old_patterns.end(); ++pattern) { | 1177 pattern != old_patterns.end(); ++pattern) { |
1118 if (pattern->MatchesScheme(scheme)) { | 1178 if (pattern->MatchesScheme(scheme)) { |
1119 WebSecurityPolicy::removeOriginAccessWhitelistEntry( | 1179 WebSecurityPolicy::removeOriginAccessWhitelistEntry( |
1120 extension->url(), | 1180 extension_url, |
1121 WebString::fromUTF8(scheme), | 1181 WebString::fromUTF8(scheme), |
1122 WebString::fromUTF8(pattern->host()), | 1182 WebString::fromUTF8(pattern->host()), |
1123 pattern->match_subdomains()); | 1183 pattern->match_subdomains()); |
1124 } | 1184 } |
1125 } | 1185 } |
1126 // ...And add the new ones. | 1186 // ...And add the new ones. |
1127 for (URLPatternSet::const_iterator pattern = new_patterns.begin(); | 1187 for (URLPatternSet::const_iterator pattern = new_patterns.begin(); |
1128 pattern != new_patterns.end(); ++pattern) { | 1188 pattern != new_patterns.end(); ++pattern) { |
1129 if (pattern->MatchesScheme(scheme)) { | 1189 if (pattern->MatchesScheme(scheme)) { |
1130 WebSecurityPolicy::addOriginAccessWhitelistEntry( | 1190 WebSecurityPolicy::addOriginAccessWhitelistEntry( |
1131 extension->url(), | 1191 extension_url, |
1132 WebString::fromUTF8(scheme), | 1192 WebString::fromUTF8(scheme), |
1133 WebString::fromUTF8(pattern->host()), | 1193 WebString::fromUTF8(pattern->host()), |
1134 pattern->match_subdomains()); | 1194 pattern->match_subdomains()); |
1135 } | 1195 } |
1136 } | 1196 } |
1137 } | 1197 } |
1138 } | 1198 } |
1139 | 1199 |
1140 void Dispatcher::EnableCustomElementWhiteList() { | 1200 void Dispatcher::EnableCustomElementWhiteList() { |
1141 blink::WebCustomElement::addEmbedderCustomElementName("appview"); | 1201 blink::WebCustomElement::addEmbedderCustomElementName("appview"); |
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1478 return v8::Handle<v8::Object>(); | 1538 return v8::Handle<v8::Object>(); |
1479 | 1539 |
1480 if (bind_name) | 1540 if (bind_name) |
1481 *bind_name = split.back(); | 1541 *bind_name = split.back(); |
1482 | 1542 |
1483 return bind_object.IsEmpty() ? AsObjectOrEmpty(GetOrCreateChrome(context)) | 1543 return bind_object.IsEmpty() ? AsObjectOrEmpty(GetOrCreateChrome(context)) |
1484 : bind_object; | 1544 : bind_object; |
1485 } | 1545 } |
1486 | 1546 |
1487 } // namespace extensions | 1547 } // namespace extensions |
OLD | NEW |