Chromium Code Reviews| 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 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |