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 |