| 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 |