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 "extensions/browser/api/web_request/web_request_api.h" | 5 #include "extensions/browser/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 440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
451 // NOTE(benjhayden) New APIs should not use this sub_event_name trick! It does | 451 // NOTE(benjhayden) New APIs should not use this sub_event_name trick! It does |
452 // not play well with event pages. See downloads.onDeterminingFilename and | 452 // not play well with event pages. See downloads.onDeterminingFilename and |
453 // ExtensionDownloadsEventRouter for an alternative approach. | 453 // ExtensionDownloadsEventRouter for an alternative approach. |
454 struct ExtensionWebRequestEventRouter::EventListener { | 454 struct ExtensionWebRequestEventRouter::EventListener { |
455 std::string extension_id; | 455 std::string extension_id; |
456 std::string extension_name; | 456 std::string extension_name; |
457 std::string sub_event_name; | 457 std::string sub_event_name; |
458 RequestFilter filter; | 458 RequestFilter filter; |
459 int extra_info_spec; | 459 int extra_info_spec; |
460 int embedder_process_id; | 460 int embedder_process_id; |
461 int webview_instance_id; | 461 int web_view_instance_id; |
Devlin
2015/01/21 22:31:45
why the change? It looks like webview is more pop
Fady Samuel
2015/01/21 23:05:41
This matches the naming in extensions/browser/gues
| |
462 base::WeakPtr<IPC::Sender> ipc_sender; | 462 base::WeakPtr<IPC::Sender> ipc_sender; |
463 mutable std::set<uint64> blocked_requests; | 463 mutable std::set<uint64> blocked_requests; |
464 | 464 |
465 // Comparator to work with std::set. | 465 // Comparator to work with std::set. |
466 bool operator<(const EventListener& that) const { | 466 bool operator<(const EventListener& that) const { |
467 if (extension_id < that.extension_id) | 467 if (extension_id < that.extension_id) |
Devlin
2015/01/21 22:31:45
instead, do:
if (extension_id != that.extension_id
Fady Samuel
2015/01/21 23:05:41
Done.
| |
468 return true; | 468 return true; |
469 | |
469 if (extension_id == that.extension_id && | 470 if (extension_id == that.extension_id && |
470 sub_event_name < that.sub_event_name) | 471 sub_event_name < that.sub_event_name) { |
471 return true; | 472 return true; |
473 } | |
474 | |
475 if (extension_id == that.extension_id && | |
476 sub_event_name == that.sub_event_name && | |
477 embedder_process_id < that.embedder_process_id) { | |
478 return true; | |
479 } | |
480 | |
481 if (extension_id == that.extension_id && | |
482 sub_event_name == that.sub_event_name && | |
483 embedder_process_id == that.embedder_process_id && | |
484 web_view_instance_id < that.web_view_instance_id) { | |
485 return true; | |
486 } | |
487 | |
472 return false; | 488 return false; |
473 } | 489 } |
474 | 490 |
475 EventListener() : extra_info_spec(0) {} | 491 EventListener() : extra_info_spec(0) {} |
476 }; | 492 }; |
477 | 493 |
478 // Contains info about requests that are blocked waiting for a response from | 494 // Contains info about requests that are blocked waiting for a response from |
479 // an extension. | 495 // an extension. |
480 struct ExtensionWebRequestEventRouter::BlockedRequest { | 496 struct ExtensionWebRequestEventRouter::BlockedRequest { |
481 // The request that is being blocked. | 497 // The request that is being blocked. |
(...skipping 790 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1272 | 1288 |
1273 bool ExtensionWebRequestEventRouter::AddEventListener( | 1289 bool ExtensionWebRequestEventRouter::AddEventListener( |
1274 void* browser_context, | 1290 void* browser_context, |
1275 const std::string& extension_id, | 1291 const std::string& extension_id, |
1276 const std::string& extension_name, | 1292 const std::string& extension_name, |
1277 const std::string& event_name, | 1293 const std::string& event_name, |
1278 const std::string& sub_event_name, | 1294 const std::string& sub_event_name, |
1279 const RequestFilter& filter, | 1295 const RequestFilter& filter, |
1280 int extra_info_spec, | 1296 int extra_info_spec, |
1281 int embedder_process_id, | 1297 int embedder_process_id, |
1282 int webview_instance_id, | 1298 int web_view_instance_id, |
1283 base::WeakPtr<IPC::Sender> ipc_sender) { | 1299 base::WeakPtr<IPC::Sender> ipc_sender) { |
1284 if (!IsWebRequestEvent(event_name)) | 1300 if (!IsWebRequestEvent(event_name)) |
1285 return false; | 1301 return false; |
1286 | 1302 |
1287 EventListener listener; | 1303 EventListener listener; |
1288 listener.extension_id = extension_id; | 1304 listener.extension_id = extension_id; |
1289 listener.extension_name = extension_name; | 1305 listener.extension_name = extension_name; |
1290 listener.sub_event_name = sub_event_name; | 1306 listener.sub_event_name = sub_event_name; |
1291 listener.filter = filter; | 1307 listener.filter = filter; |
1292 listener.extra_info_spec = extra_info_spec; | 1308 listener.extra_info_spec = extra_info_spec; |
1293 listener.ipc_sender = ipc_sender; | 1309 listener.ipc_sender = ipc_sender; |
1294 listener.embedder_process_id = embedder_process_id; | 1310 listener.embedder_process_id = embedder_process_id; |
1295 listener.webview_instance_id = webview_instance_id; | 1311 listener.web_view_instance_id = web_view_instance_id; |
1296 if (listener.webview_instance_id) { | 1312 if (listener.web_view_instance_id) { |
1297 content::RecordAction( | 1313 content::RecordAction( |
1298 base::UserMetricsAction("WebView.WebRequest.AddListener")); | 1314 base::UserMetricsAction("WebView.WebRequest.AddListener")); |
1299 } | 1315 } |
1300 | 1316 |
1301 if (listeners_[browser_context][event_name].count(listener) != 0u) { | 1317 if (listeners_[browser_context][event_name].count(listener) != 0u) { |
1302 // This is likely an abuse of the API by a malicious extension. | 1318 // This is likely an abuse of the API by a malicious extension. |
1303 return false; | 1319 return false; |
1304 } | 1320 } |
1305 listeners_[browser_context][event_name].insert(listener); | 1321 listeners_[browser_context][event_name].insert(listener); |
1306 return true; | 1322 return true; |
(...skipping 30 matching lines...) Expand all Loading... | |
1337 | 1353 |
1338 listeners_[browser_context][event_name].erase(listener); | 1354 listeners_[browser_context][event_name].erase(listener); |
1339 | 1355 |
1340 helpers::ClearCacheOnNavigation(); | 1356 helpers::ClearCacheOnNavigation(); |
1341 } | 1357 } |
1342 | 1358 |
1343 void ExtensionWebRequestEventRouter::RemoveWebViewEventListeners( | 1359 void ExtensionWebRequestEventRouter::RemoveWebViewEventListeners( |
1344 void* browser_context, | 1360 void* browser_context, |
1345 const std::string& extension_id, | 1361 const std::string& extension_id, |
1346 int embedder_process_id, | 1362 int embedder_process_id, |
1347 int webview_instance_id) { | 1363 int web_view_instance_id) { |
1348 // Iterate over all listeners of all WebRequest events to delete | 1364 // Iterate over all listeners of all WebRequest events to delete |
1349 // any listeners that belong to the provided <webview>. | 1365 // any listeners that belong to the provided <webview>. |
1350 ListenerMapForBrowserContext& map_for_browser_context = | 1366 ListenerMapForBrowserContext& map_for_browser_context = |
1351 listeners_[browser_context]; | 1367 listeners_[browser_context]; |
1352 for (ListenerMapForBrowserContext::iterator event_iter = | 1368 for (ListenerMapForBrowserContext::iterator event_iter = |
1353 map_for_browser_context.begin(); | 1369 map_for_browser_context.begin(); |
1354 event_iter != map_for_browser_context.end(); ++event_iter) { | 1370 event_iter != map_for_browser_context.end(); ++event_iter) { |
1355 std::vector<EventListener> listeners_to_delete; | 1371 std::vector<EventListener> listeners_to_delete; |
1356 std::set<EventListener>& listeners = event_iter->second; | 1372 std::set<EventListener>& listeners = event_iter->second; |
1357 for (std::set<EventListener>::iterator listener_iter = listeners.begin(); | 1373 for (std::set<EventListener>::iterator listener_iter = listeners.begin(); |
1358 listener_iter != listeners.end(); ++listener_iter) { | 1374 listener_iter != listeners.end(); ++listener_iter) { |
1359 const EventListener& listener = *listener_iter; | 1375 const EventListener& listener = *listener_iter; |
1360 if (listener.embedder_process_id == embedder_process_id && | 1376 if (listener.embedder_process_id == embedder_process_id && |
1361 listener.webview_instance_id == webview_instance_id) | 1377 listener.web_view_instance_id == web_view_instance_id) |
1362 listeners_to_delete.push_back(listener); | 1378 listeners_to_delete.push_back(listener); |
1363 } | 1379 } |
1364 for (size_t i = 0; i < listeners_to_delete.size(); ++i) { | 1380 for (size_t i = 0; i < listeners_to_delete.size(); ++i) { |
1365 EventListener& listener = listeners_to_delete[i]; | 1381 EventListener& listener = listeners_to_delete[i]; |
1366 content::BrowserThread::PostTask( | 1382 content::BrowserThread::PostTask( |
1367 content::BrowserThread::UI, | 1383 content::BrowserThread::UI, |
1368 FROM_HERE, | 1384 FROM_HERE, |
1369 base::Bind(&RemoveEventListenerOnUI, | 1385 base::Bind(&RemoveEventListenerOnUI, |
1370 browser_context, | 1386 browser_context, |
1371 listener.sub_event_name, | 1387 listener.sub_event_name, |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1475 for (std::set<EventListener>::iterator it = listeners.begin(); | 1491 for (std::set<EventListener>::iterator it = listeners.begin(); |
1476 it != listeners.end(); ++it) { | 1492 it != listeners.end(); ++it) { |
1477 if (!it->ipc_sender.get()) { | 1493 if (!it->ipc_sender.get()) { |
1478 // The IPC sender has been deleted. This listener will be removed soon | 1494 // The IPC sender has been deleted. This listener will be removed soon |
1479 // via a call to RemoveEventListener. For now, just skip it. | 1495 // via a call to RemoveEventListener. For now, just skip it. |
1480 continue; | 1496 continue; |
1481 } | 1497 } |
1482 | 1498 |
1483 if (is_web_view_guest && | 1499 if (is_web_view_guest && |
1484 (it->embedder_process_id != web_view_info.embedder_process_id || | 1500 (it->embedder_process_id != web_view_info.embedder_process_id || |
1485 it->webview_instance_id != web_view_info.instance_id)) | 1501 it->web_view_instance_id != web_view_info.instance_id)) |
1486 continue; | 1502 continue; |
1487 | 1503 |
1488 if (!it->filter.urls.is_empty() && !it->filter.urls.MatchesURL(url)) | 1504 if (!it->filter.urls.is_empty() && !it->filter.urls.MatchesURL(url)) |
1489 continue; | 1505 continue; |
1490 if (web_request_event_router_delegate_ && | 1506 if (web_request_event_router_delegate_ && |
1491 web_request_event_router_delegate_->OnGetMatchingListenersImplCheck( | 1507 web_request_event_router_delegate_->OnGetMatchingListenersImplCheck( |
1492 it->filter.tab_id, it->filter.window_id, request)) | 1508 it->filter.tab_id, it->filter.window_id, request)) |
1493 continue; | 1509 continue; |
1494 if (!it->filter.types.empty() && | 1510 if (!it->filter.types.empty() && |
1495 std::find(it->filter.types.begin(), it->filter.types.end(), | 1511 std::find(it->filter.types.begin(), it->filter.types.end(), |
(...skipping 702 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2198 ExtensionWebRequestEventRouter::ExtraInfoSpec::InitFromValue( | 2214 ExtensionWebRequestEventRouter::ExtraInfoSpec::InitFromValue( |
2199 *value, &extra_info_spec)); | 2215 *value, &extra_info_spec)); |
2200 } | 2216 } |
2201 | 2217 |
2202 std::string event_name; | 2218 std::string event_name; |
2203 EXTENSION_FUNCTION_VALIDATE(args_->GetString(3, &event_name)); | 2219 EXTENSION_FUNCTION_VALIDATE(args_->GetString(3, &event_name)); |
2204 | 2220 |
2205 std::string sub_event_name; | 2221 std::string sub_event_name; |
2206 EXTENSION_FUNCTION_VALIDATE(args_->GetString(4, &sub_event_name)); | 2222 EXTENSION_FUNCTION_VALIDATE(args_->GetString(4, &sub_event_name)); |
2207 | 2223 |
2208 int webview_instance_id = 0; | 2224 int web_view_instance_id = 0; |
2209 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(5, &webview_instance_id)); | 2225 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(5, &web_view_instance_id)); |
2210 | 2226 |
2211 base::WeakPtr<extensions::ExtensionMessageFilter> ipc_sender = | 2227 base::WeakPtr<extensions::ExtensionMessageFilter> ipc_sender = |
2212 ipc_sender_weak(); | 2228 ipc_sender_weak(); |
2213 int embedder_process_id = | 2229 int embedder_process_id = |
2214 ipc_sender.get() ? ipc_sender->render_process_id() : -1; | 2230 ipc_sender.get() ? ipc_sender->render_process_id() : -1; |
2215 | 2231 |
2216 const Extension* extension = | 2232 const Extension* extension = |
2217 extension_info_map()->extensions().GetByID(extension_id_safe()); | 2233 extension_info_map()->extensions().GetByID(extension_id_safe()); |
2218 std::string extension_name = | 2234 std::string extension_name = |
2219 extension ? extension->name() : extension_id_safe(); | 2235 extension ? extension->name() : extension_id_safe(); |
2220 | 2236 |
2221 if (webview_instance_id == 0) { | 2237 if (web_view_instance_id == 0) { |
2222 // We check automatically whether the extension has the 'webRequest' | 2238 // We check automatically whether the extension has the 'webRequest' |
2223 // permission. For blocking calls we require the additional permission | 2239 // permission. For blocking calls we require the additional permission |
2224 // 'webRequestBlocking'. | 2240 // 'webRequestBlocking'. |
2225 if ((extra_info_spec & | 2241 if ((extra_info_spec & |
2226 (ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING | | 2242 (ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING | |
2227 ExtensionWebRequestEventRouter::ExtraInfoSpec::ASYNC_BLOCKING)) && | 2243 ExtensionWebRequestEventRouter::ExtraInfoSpec::ASYNC_BLOCKING)) && |
2228 !extension->permissions_data()->HasAPIPermission( | 2244 !extension->permissions_data()->HasAPIPermission( |
2229 extensions::APIPermission::kWebRequestBlocking)) { | 2245 extensions::APIPermission::kWebRequestBlocking)) { |
2230 error_ = keys::kBlockingPermissionRequired; | 2246 error_ = keys::kBlockingPermissionRequired; |
2231 return false; | 2247 return false; |
(...skipping 10 matching lines...) Expand all Loading... | |
2242 .is_empty()) { | 2258 .is_empty()) { |
2243 error_ = keys::kHostPermissionsRequired; | 2259 error_ = keys::kHostPermissionsRequired; |
2244 return false; | 2260 return false; |
2245 } | 2261 } |
2246 } | 2262 } |
2247 | 2263 |
2248 bool success = | 2264 bool success = |
2249 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( | 2265 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( |
2250 profile_id(), extension_id_safe(), extension_name, | 2266 profile_id(), extension_id_safe(), extension_name, |
2251 event_name, sub_event_name, filter, extra_info_spec, | 2267 event_name, sub_event_name, filter, extra_info_spec, |
2252 embedder_process_id, webview_instance_id, ipc_sender_weak()); | 2268 embedder_process_id, web_view_instance_id, ipc_sender_weak()); |
2253 EXTENSION_FUNCTION_VALIDATE(success); | 2269 EXTENSION_FUNCTION_VALIDATE(success); |
2254 | 2270 |
2255 helpers::ClearCacheOnNavigation(); | 2271 helpers::ClearCacheOnNavigation(); |
2256 | 2272 |
2257 if (!extension_id_safe().empty()) { | 2273 if (!extension_id_safe().empty()) { |
2258 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 2274 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
2259 base::Bind(&helpers::NotifyWebRequestAPIUsed, | 2275 base::Bind(&helpers::NotifyWebRequestAPIUsed, |
2260 profile_id(), extension_id_safe())); | 2276 profile_id(), extension_id_safe())); |
2261 } | 2277 } |
2262 | 2278 |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2455 base::Bind(&WarningService::NotifyWarningsOnUI, profile_id(), warnings)); | 2471 base::Bind(&WarningService::NotifyWarningsOnUI, profile_id(), warnings)); |
2456 | 2472 |
2457 // Continue gracefully. | 2473 // Continue gracefully. |
2458 RunSync(); | 2474 RunSync(); |
2459 } | 2475 } |
2460 | 2476 |
2461 bool WebRequestHandlerBehaviorChangedFunction::RunSync() { | 2477 bool WebRequestHandlerBehaviorChangedFunction::RunSync() { |
2462 helpers::ClearCacheOnNavigation(); | 2478 helpers::ClearCacheOnNavigation(); |
2463 return true; | 2479 return true; |
2464 } | 2480 } |
OLD | NEW |