OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/browser/extensions/api/web_request/web_request_api.h" | 5 #include "chrome/browser/extensions/api/web_request/web_request_api.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
390 // NOTE(benjhayden) New APIs should not use this sub_event_name trick! It does | 390 // NOTE(benjhayden) New APIs should not use this sub_event_name trick! It does |
391 // not play well with event pages. See downloads.onDeterminingFilename and | 391 // not play well with event pages. See downloads.onDeterminingFilename and |
392 // ExtensionDownloadsEventRouter for an alternative approach. | 392 // ExtensionDownloadsEventRouter for an alternative approach. |
393 struct ExtensionWebRequestEventRouter::EventListener { | 393 struct ExtensionWebRequestEventRouter::EventListener { |
394 std::string extension_id; | 394 std::string extension_id; |
395 std::string extension_name; | 395 std::string extension_name; |
396 std::string sub_event_name; | 396 std::string sub_event_name; |
397 RequestFilter filter; | 397 RequestFilter filter; |
398 int extra_info_spec; | 398 int extra_info_spec; |
399 int embedder_process_id; | 399 int embedder_process_id; |
400 int embedder_routing_id; | |
401 int webview_instance_id; | 400 int webview_instance_id; |
402 base::WeakPtr<IPC::Sender> ipc_sender; | 401 base::WeakPtr<IPC::Sender> ipc_sender; |
403 mutable std::set<uint64> blocked_requests; | 402 mutable std::set<uint64> blocked_requests; |
404 | 403 |
405 // Comparator to work with std::set. | 404 // Comparator to work with std::set. |
406 bool operator<(const EventListener& that) const { | 405 bool operator<(const EventListener& that) const { |
407 if (extension_id < that.extension_id) | 406 if (extension_id < that.extension_id) |
408 return true; | 407 return true; |
409 if (extension_id == that.extension_id && | 408 if (extension_id == that.extension_id && |
410 sub_event_name < that.sub_event_name) | 409 sub_event_name < that.sub_event_name) |
(...skipping 755 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1166 | 1165 |
1167 bool ExtensionWebRequestEventRouter::AddEventListener( | 1166 bool ExtensionWebRequestEventRouter::AddEventListener( |
1168 void* profile, | 1167 void* profile, |
1169 const std::string& extension_id, | 1168 const std::string& extension_id, |
1170 const std::string& extension_name, | 1169 const std::string& extension_name, |
1171 const std::string& event_name, | 1170 const std::string& event_name, |
1172 const std::string& sub_event_name, | 1171 const std::string& sub_event_name, |
1173 const RequestFilter& filter, | 1172 const RequestFilter& filter, |
1174 int extra_info_spec, | 1173 int extra_info_spec, |
1175 int embedder_process_id, | 1174 int embedder_process_id, |
1176 int embedder_routing_id, | |
1177 int webview_instance_id, | 1175 int webview_instance_id, |
1178 base::WeakPtr<IPC::Sender> ipc_sender) { | 1176 base::WeakPtr<IPC::Sender> ipc_sender) { |
1179 | 1177 |
1180 if (!IsWebRequestEvent(event_name)) | 1178 if (!IsWebRequestEvent(event_name)) |
1181 return false; | 1179 return false; |
1182 | 1180 |
1183 EventListener listener; | 1181 EventListener listener; |
1184 listener.extension_id = extension_id; | 1182 listener.extension_id = extension_id; |
1185 listener.extension_name = extension_name; | 1183 listener.extension_name = extension_name; |
1186 listener.sub_event_name = sub_event_name; | 1184 listener.sub_event_name = sub_event_name; |
1187 listener.filter = filter; | 1185 listener.filter = filter; |
1188 listener.extra_info_spec = extra_info_spec; | 1186 listener.extra_info_spec = extra_info_spec; |
1189 listener.ipc_sender = ipc_sender; | 1187 listener.ipc_sender = ipc_sender; |
1190 listener.embedder_process_id = embedder_process_id; | 1188 listener.embedder_process_id = embedder_process_id; |
1191 listener.embedder_routing_id = embedder_routing_id; | |
1192 listener.webview_instance_id = webview_instance_id; | 1189 listener.webview_instance_id = webview_instance_id; |
1193 if (listener.webview_instance_id) | 1190 if (listener.webview_instance_id) |
1194 RecordAction(content::UserMetricsAction("WebView.WebRequest.AddListener")); | 1191 RecordAction(content::UserMetricsAction("WebView.WebRequest.AddListener")); |
1195 | 1192 |
1196 if (listeners_[profile][event_name].count(listener) != 0u) { | 1193 if (listeners_[profile][event_name].count(listener) != 0u) { |
1197 // This is likely an abuse of the API by a malicious extension. | 1194 // This is likely an abuse of the API by a malicious extension. |
1198 return false; | 1195 return false; |
1199 } | 1196 } |
1200 listeners_[profile][event_name].insert(listener); | 1197 listeners_[profile][event_name].insert(listener); |
1201 return true; | 1198 return true; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1234 | 1231 |
1235 listeners_[profile][event_name].erase(listener); | 1232 listeners_[profile][event_name].erase(listener); |
1236 | 1233 |
1237 helpers::ClearCacheOnNavigation(); | 1234 helpers::ClearCacheOnNavigation(); |
1238 } | 1235 } |
1239 | 1236 |
1240 void ExtensionWebRequestEventRouter::RemoveWebViewEventListeners( | 1237 void ExtensionWebRequestEventRouter::RemoveWebViewEventListeners( |
1241 void* profile, | 1238 void* profile, |
1242 const std::string& extension_id, | 1239 const std::string& extension_id, |
1243 int embedder_process_id, | 1240 int embedder_process_id, |
1244 int embedder_routing_id, | |
1245 int webview_instance_id) { | 1241 int webview_instance_id) { |
1246 // Iterate over all listeners of all WebRequest events to delete | 1242 // Iterate over all listeners of all WebRequest events to delete |
1247 // any listeners that belong to the provided <webview>. | 1243 // any listeners that belong to the provided <webview>. |
1248 ListenerMapForProfile& map_for_profile = listeners_[profile]; | 1244 ListenerMapForProfile& map_for_profile = listeners_[profile]; |
1249 for (ListenerMapForProfile::iterator event_iter = map_for_profile.begin(); | 1245 for (ListenerMapForProfile::iterator event_iter = map_for_profile.begin(); |
1250 event_iter != map_for_profile.end(); ++event_iter) { | 1246 event_iter != map_for_profile.end(); ++event_iter) { |
1251 std::vector<EventListener> listeners_to_delete; | 1247 std::vector<EventListener> listeners_to_delete; |
1252 std::set<EventListener>& listeners = event_iter->second; | 1248 std::set<EventListener>& listeners = event_iter->second; |
1253 for (std::set<EventListener>::iterator listener_iter = listeners.begin(); | 1249 for (std::set<EventListener>::iterator listener_iter = listeners.begin(); |
1254 listener_iter != listeners.end(); ++listener_iter) { | 1250 listener_iter != listeners.end(); ++listener_iter) { |
1255 const EventListener& listener = *listener_iter; | 1251 const EventListener& listener = *listener_iter; |
1256 // TODO(fsamuel): Investigate making <webview> instance IDs unique within | |
1257 // a process. | |
1258 if (listener.embedder_process_id == embedder_process_id && | 1252 if (listener.embedder_process_id == embedder_process_id && |
1259 listener.embedder_routing_id == embedder_routing_id && | |
1260 listener.webview_instance_id == webview_instance_id) | 1253 listener.webview_instance_id == webview_instance_id) |
1261 listeners_to_delete.push_back(listener); | 1254 listeners_to_delete.push_back(listener); |
1262 } | 1255 } |
1263 for (size_t i = 0; i < listeners_to_delete.size(); ++i) { | 1256 for (size_t i = 0; i < listeners_to_delete.size(); ++i) { |
1264 EventListener& listener = listeners_to_delete[i]; | 1257 EventListener& listener = listeners_to_delete[i]; |
1265 content::BrowserThread::PostTask( | 1258 content::BrowserThread::PostTask( |
1266 content::BrowserThread::UI, | 1259 content::BrowserThread::UI, |
1267 FROM_HERE, | 1260 FROM_HERE, |
1268 base::Bind(&RemoveEventListenerOnUI, | 1261 base::Bind(&RemoveEventListenerOnUI, |
1269 profile, | 1262 profile, |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1371 for (std::set<EventListener>::iterator it = listeners.begin(); | 1364 for (std::set<EventListener>::iterator it = listeners.begin(); |
1372 it != listeners.end(); ++it) { | 1365 it != listeners.end(); ++it) { |
1373 if (!it->ipc_sender.get()) { | 1366 if (!it->ipc_sender.get()) { |
1374 // The IPC sender has been deleted. This listener will be removed soon | 1367 // The IPC sender has been deleted. This listener will be removed soon |
1375 // via a call to RemoveEventListener. For now, just skip it. | 1368 // via a call to RemoveEventListener. For now, just skip it. |
1376 continue; | 1369 continue; |
1377 } | 1370 } |
1378 | 1371 |
1379 if (is_guest && | 1372 if (is_guest && |
1380 (it->embedder_process_id != webview_info.embedder_process_id || | 1373 (it->embedder_process_id != webview_info.embedder_process_id || |
1381 it->embedder_routing_id != webview_info.embedder_routing_id || | |
1382 it->webview_instance_id != webview_info.instance_id)) | 1374 it->webview_instance_id != webview_info.instance_id)) |
1383 continue; | 1375 continue; |
1384 | 1376 |
1385 if (!it->filter.urls.is_empty() && !it->filter.urls.MatchesURL(url)) | 1377 if (!it->filter.urls.is_empty() && !it->filter.urls.MatchesURL(url)) |
1386 continue; | 1378 continue; |
1387 if (it->filter.tab_id != -1 && tab_id != it->filter.tab_id) | 1379 if (it->filter.tab_id != -1 && tab_id != it->filter.tab_id) |
1388 continue; | 1380 continue; |
1389 if (it->filter.window_id != -1 && window_id != it->filter.window_id) | 1381 if (it->filter.window_id != -1 && window_id != it->filter.window_id) |
1390 continue; | 1382 continue; |
1391 if (!it->filter.types.empty() && | 1383 if (!it->filter.types.empty() && |
(...skipping 688 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2080 std::string sub_event_name; | 2072 std::string sub_event_name; |
2081 EXTENSION_FUNCTION_VALIDATE(args_->GetString(4, &sub_event_name)); | 2073 EXTENSION_FUNCTION_VALIDATE(args_->GetString(4, &sub_event_name)); |
2082 | 2074 |
2083 int webview_instance_id = 0; | 2075 int webview_instance_id = 0; |
2084 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(5, &webview_instance_id)); | 2076 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(5, &webview_instance_id)); |
2085 | 2077 |
2086 base::WeakPtr<ChromeRenderMessageFilter> ipc_sender = ipc_sender_weak(); | 2078 base::WeakPtr<ChromeRenderMessageFilter> ipc_sender = ipc_sender_weak(); |
2087 | 2079 |
2088 int embedder_process_id = | 2080 int embedder_process_id = |
2089 ipc_sender.get() ? ipc_sender->render_process_id() : -1; | 2081 ipc_sender.get() ? ipc_sender->render_process_id() : -1; |
2090 int embedder_routing_id = routing_id(); | |
2091 | 2082 |
2092 const Extension* extension = | 2083 const Extension* extension = |
2093 extension_info_map()->extensions().GetByID(extension_id()); | 2084 extension_info_map()->extensions().GetByID(extension_id()); |
2094 std::string extension_name = extension ? extension->name() : extension_id(); | 2085 std::string extension_name = extension ? extension->name() : extension_id(); |
2095 | 2086 |
2096 bool is_guest = webview_instance_id != 0; | 2087 bool is_guest = webview_instance_id != 0; |
2097 // We check automatically whether the extension has the 'webRequest' | 2088 // We check automatically whether the extension has the 'webRequest' |
2098 // permission. For blocking calls we require the additional permission | 2089 // permission. For blocking calls we require the additional permission |
2099 // 'webRequestBlocking'. | 2090 // 'webRequestBlocking'. |
2100 if ((!is_guest && extra_info_spec & | 2091 if ((!is_guest && extra_info_spec & |
(...skipping 14 matching lines...) Expand all Loading... |
2115 if (!is_guest && extensions::PermissionsData::GetEffectiveHostPermissions( | 2106 if (!is_guest && extensions::PermissionsData::GetEffectiveHostPermissions( |
2116 extension).is_empty()) { | 2107 extension).is_empty()) { |
2117 error_ = keys::kHostPermissionsRequired; | 2108 error_ = keys::kHostPermissionsRequired; |
2118 return false; | 2109 return false; |
2119 } | 2110 } |
2120 | 2111 |
2121 bool success = | 2112 bool success = |
2122 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( | 2113 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( |
2123 profile_id(), extension_id(), extension_name, | 2114 profile_id(), extension_id(), extension_name, |
2124 event_name, sub_event_name, filter, extra_info_spec, | 2115 event_name, sub_event_name, filter, extra_info_spec, |
2125 embedder_process_id, embedder_routing_id, webview_instance_id, | 2116 embedder_process_id, webview_instance_id, ipc_sender_weak()); |
2126 ipc_sender_weak()); | |
2127 EXTENSION_FUNCTION_VALIDATE(success); | 2117 EXTENSION_FUNCTION_VALIDATE(success); |
2128 | 2118 |
2129 helpers::ClearCacheOnNavigation(); | 2119 helpers::ClearCacheOnNavigation(); |
2130 | 2120 |
2131 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind( | 2121 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind( |
2132 &helpers::NotifyWebRequestAPIUsed, | 2122 &helpers::NotifyWebRequestAPIUsed, |
2133 profile_id(), make_scoped_refptr(GetExtension()))); | 2123 profile_id(), make_scoped_refptr(GetExtension()))); |
2134 | 2124 |
2135 return true; | 2125 return true; |
2136 } | 2126 } |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2296 } else if ((*it)->name().find("AdBlock") != std::string::npos) { | 2286 } else if ((*it)->name().find("AdBlock") != std::string::npos) { |
2297 adblock = true; | 2287 adblock = true; |
2298 } else { | 2288 } else { |
2299 other = true; | 2289 other = true; |
2300 } | 2290 } |
2301 } | 2291 } |
2302 } | 2292 } |
2303 | 2293 |
2304 host->Send(new ExtensionMsg_UsingWebRequestAPI(adblock, adblock_plus, other)); | 2294 host->Send(new ExtensionMsg_UsingWebRequestAPI(adblock, adblock_plus, other)); |
2305 } | 2295 } |
OLD | NEW |