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 <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <memory> | 10 #include <memory> |
(...skipping 11 matching lines...) Expand all Loading... | |
22 #include "base/strings/string_util.h" | 22 #include "base/strings/string_util.h" |
23 #include "base/strings/utf_string_conversions.h" | 23 #include "base/strings/utf_string_conversions.h" |
24 #include "base/time/time.h" | 24 #include "base/time/time.h" |
25 #include "base/values.h" | 25 #include "base/values.h" |
26 #include "chromeos/login/login_state.h" | 26 #include "chromeos/login/login_state.h" |
27 #include "content/public/browser/browser_thread.h" | 27 #include "content/public/browser/browser_thread.h" |
28 #include "content/public/browser/resource_request_info.h" | 28 #include "content/public/browser/resource_request_info.h" |
29 #include "content/public/browser/user_metrics.h" | 29 #include "content/public/browser/user_metrics.h" |
30 #include "content/public/common/browser_side_navigation_policy.h" | 30 #include "content/public/common/browser_side_navigation_policy.h" |
31 #include "content/public/common/child_process_host.h" | 31 #include "content/public/common/child_process_host.h" |
32 #include "content/public/common/resource_type.h" | |
32 #include "extensions/browser/api/activity_log/web_request_constants.h" | 33 #include "extensions/browser/api/activity_log/web_request_constants.h" |
33 #include "extensions/browser/api/declarative/rules_registry_service.h" | 34 #include "extensions/browser/api/declarative/rules_registry_service.h" |
34 #include "extensions/browser/api/declarative_webrequest/request_stage.h" | 35 #include "extensions/browser/api/declarative_webrequest/request_stage.h" |
35 #include "extensions/browser/api/declarative_webrequest/webrequest_constants.h" | 36 #include "extensions/browser/api/declarative_webrequest/webrequest_constants.h" |
36 #include "extensions/browser/api/declarative_webrequest/webrequest_rules_registr y.h" | 37 #include "extensions/browser/api/declarative_webrequest/webrequest_rules_registr y.h" |
37 #include "extensions/browser/api/extensions_api_client.h" | 38 #include "extensions/browser/api/extensions_api_client.h" |
38 #include "extensions/browser/api/web_request/web_request_api_constants.h" | 39 #include "extensions/browser/api/web_request/web_request_api_constants.h" |
39 #include "extensions/browser/api/web_request/web_request_api_helpers.h" | 40 #include "extensions/browser/api/web_request/web_request_api_helpers.h" |
40 #include "extensions/browser/api/web_request/web_request_event_details.h" | 41 #include "extensions/browser/api/web_request/web_request_event_details.h" |
41 #include "extensions/browser/api/web_request/web_request_event_router_delegate.h " | 42 #include "extensions/browser/api/web_request/web_request_event_router_delegate.h " |
43 #include "extensions/browser/api/web_request/web_request_resource_type.h" | |
42 #include "extensions/browser/api/web_request/web_request_time_tracker.h" | 44 #include "extensions/browser/api/web_request/web_request_time_tracker.h" |
43 #include "extensions/browser/api_activity_monitor.h" | 45 #include "extensions/browser/api_activity_monitor.h" |
44 #include "extensions/browser/event_router.h" | 46 #include "extensions/browser/event_router.h" |
45 #include "extensions/browser/extension_navigation_ui_data.h" | 47 #include "extensions/browser/extension_navigation_ui_data.h" |
46 #include "extensions/browser/extension_prefs.h" | 48 #include "extensions/browser/extension_prefs.h" |
47 #include "extensions/browser/extension_registry.h" | 49 #include "extensions/browser/extension_registry.h" |
48 #include "extensions/browser/extension_system.h" | 50 #include "extensions/browser/extension_system.h" |
49 #include "extensions/browser/extensions_browser_client.h" | 51 #include "extensions/browser/extensions_browser_client.h" |
50 #include "extensions/browser/guest_view/guest_view_events.h" | 52 #include "extensions/browser/guest_view/guest_view_events.h" |
51 #include "extensions/browser/guest_view/web_view/web_view_constants.h" | 53 #include "extensions/browser/guest_view/web_view/web_view_constants.h" |
(...skipping 450 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
502 return false; | 504 return false; |
503 } | 505 } |
504 urls.AddPattern(pattern); | 506 urls.AddPattern(pattern); |
505 } | 507 } |
506 } else if (it.key() == "types") { | 508 } else if (it.key() == "types") { |
507 const base::ListValue* types_value = NULL; | 509 const base::ListValue* types_value = NULL; |
508 if (!it.value().GetAsList(&types_value)) | 510 if (!it.value().GetAsList(&types_value)) |
509 return false; | 511 return false; |
510 for (size_t i = 0; i < types_value->GetSize(); ++i) { | 512 for (size_t i = 0; i < types_value->GetSize(); ++i) { |
511 std::string type_str; | 513 std::string type_str; |
512 if (!types_value->GetString(i, &type_str) || | 514 auto resource_type = WebRequestResourceType::UNDEFINED; |
513 !helpers::ParseResourceType(type_str, &types)) { | 515 if (types_value->GetString(i, &type_str)) |
516 resource_type = ParseWebRequestResourceType(type_str); | |
517 if (resource_type == WebRequestResourceType::UNDEFINED) | |
514 return false; | 518 return false; |
515 } | 519 types.push_back(resource_type); |
516 } | 520 } |
517 } else if (it.key() == "tabId") { | 521 } else if (it.key() == "tabId") { |
518 if (!it.value().GetAsInteger(&tab_id)) | 522 if (!it.value().GetAsInteger(&tab_id)) |
519 return false; | 523 return false; |
520 } else if (it.key() == "windowId") { | 524 } else if (it.key() == "windowId") { |
521 if (!it.value().GetAsInteger(&window_id)) | 525 if (!it.value().GetAsInteger(&window_id)) |
522 return false; | 526 return false; |
523 } else { | 527 } else { |
524 return false; | 528 return false; |
525 } | 529 } |
(...skipping 800 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1326 } | 1330 } |
1327 | 1331 |
1328 void ExtensionWebRequestEventRouter::AddCallbackForPageLoad( | 1332 void ExtensionWebRequestEventRouter::AddCallbackForPageLoad( |
1329 const base::Closure& callback) { | 1333 const base::Closure& callback) { |
1330 callbacks_for_page_load_.push_back(callback); | 1334 callbacks_for_page_load_.push_back(callback); |
1331 } | 1335 } |
1332 | 1336 |
1333 bool ExtensionWebRequestEventRouter::IsPageLoad( | 1337 bool ExtensionWebRequestEventRouter::IsPageLoad( |
1334 const net::URLRequest* request) const { | 1338 const net::URLRequest* request) const { |
1335 const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request); | 1339 const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request); |
1336 if (!info) | 1340 return info && info->GetResourceType() == content::RESOURCE_TYPE_MAIN_FRAME; |
1337 return false; | |
1338 | |
1339 return info->GetResourceType() == content::RESOURCE_TYPE_MAIN_FRAME; | |
1340 } | 1341 } |
1341 | 1342 |
1342 void ExtensionWebRequestEventRouter::NotifyPageLoad() { | 1343 void ExtensionWebRequestEventRouter::NotifyPageLoad() { |
1343 for (const auto& callback : callbacks_for_page_load_) | 1344 for (const auto& callback : callbacks_for_page_load_) |
1344 callback.Run(); | 1345 callback.Run(); |
1345 callbacks_for_page_load_.clear(); | 1346 callbacks_for_page_load_.clear(); |
1346 } | 1347 } |
1347 | 1348 |
1348 void* ExtensionWebRequestEventRouter::GetCrossBrowserContext( | 1349 void* ExtensionWebRequestEventRouter::GetCrossBrowserContext( |
1349 void* browser_context) const { | 1350 void* browser_context) const { |
(...skipping 23 matching lines...) Expand all Loading... | |
1373 void ExtensionWebRequestEventRouter::GetMatchingListenersImpl( | 1374 void ExtensionWebRequestEventRouter::GetMatchingListenersImpl( |
1374 void* browser_context, | 1375 void* browser_context, |
1375 const net::URLRequest* request, | 1376 const net::URLRequest* request, |
1376 const InfoMap* extension_info_map, | 1377 const InfoMap* extension_info_map, |
1377 ExtensionNavigationUIData* navigation_ui_data, | 1378 ExtensionNavigationUIData* navigation_ui_data, |
1378 bool crosses_incognito, | 1379 bool crosses_incognito, |
1379 const std::string& event_name, | 1380 const std::string& event_name, |
1380 const GURL& url, | 1381 const GURL& url, |
1381 int render_process_host_id, | 1382 int render_process_host_id, |
1382 int routing_id, | 1383 int routing_id, |
1383 content::ResourceType resource_type, | 1384 WebRequestResourceType resource_type, |
1384 bool is_async_request, | 1385 bool is_async_request, |
1385 bool is_request_from_extension, | 1386 bool is_request_from_extension, |
1386 int* extra_info_spec, | 1387 int* extra_info_spec, |
1387 RawListeners* matching_listeners) { | 1388 RawListeners* matching_listeners) { |
1388 std::string web_request_event_name(event_name); | 1389 std::string web_request_event_name(event_name); |
1389 WebViewRendererState::WebViewInfo web_view_info; | 1390 WebViewRendererState::WebViewInfo web_view_info; |
1390 bool is_web_view_guest = | 1391 bool is_web_view_guest = |
1391 WebViewRendererState::GetInstance()->GetInfo( | 1392 WebViewRendererState::GetInstance()->GetInfo( |
1392 render_process_host_id, routing_id, &web_view_info) || | 1393 render_process_host_id, routing_id, &web_view_info) || |
1393 (navigation_ui_data && navigation_ui_data->is_web_view()); | 1394 (navigation_ui_data && navigation_ui_data->is_web_view()); |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1445 } | 1446 } |
1446 // Check if the tab id and window id match, if they were set in the | 1447 // Check if the tab id and window id match, if they were set in the |
1447 // listener params. | 1448 // listener params. |
1448 if ((listener->filter.tab_id != -1 && | 1449 if ((listener->filter.tab_id != -1 && |
1449 frame_data.tab_id != listener->filter.tab_id) || | 1450 frame_data.tab_id != listener->filter.tab_id) || |
1450 (listener->filter.window_id != -1 && | 1451 (listener->filter.window_id != -1 && |
1451 frame_data.window_id != listener->filter.window_id)) { | 1452 frame_data.window_id != listener->filter.window_id)) { |
1452 continue; | 1453 continue; |
1453 } | 1454 } |
1454 | 1455 |
1455 const std::vector<content::ResourceType>& types = listener->filter.types; | 1456 const std::vector<WebRequestResourceType>& types = listener->filter.types; |
1456 if (!types.empty() && | 1457 if (!types.empty() && |
1457 std::find(types.begin(), types.end(), resource_type) == types.end()) { | 1458 std::find(types.begin(), types.end(), resource_type) == types.end()) { |
1458 continue; | 1459 continue; |
1459 } | 1460 } |
1460 | 1461 |
1461 if (!is_web_view_guest) { | 1462 if (!is_web_view_guest) { |
1462 PermissionsData::AccessType access = | 1463 PermissionsData::AccessType access = |
1463 WebRequestPermissions::CanExtensionAccessURL( | 1464 WebRequestPermissions::CanExtensionAccessURL( |
1464 extension_info_map, listener->id.extension_id, url, | 1465 extension_info_map, listener->id.extension_id, url, |
1465 frame_data.tab_id, crosses_incognito, | 1466 frame_data.tab_id, crosses_incognito, |
(...skipping 13 matching lines...) Expand all Loading... | |
1479 (ExtraInfoSpec::BLOCKING | ExtraInfoSpec::ASYNC_BLOCKING)) != 0; | 1480 (ExtraInfoSpec::BLOCKING | ExtraInfoSpec::ASYNC_BLOCKING)) != 0; |
1480 | 1481 |
1481 // We do not want to notify extensions about XHR requests that are | 1482 // We do not want to notify extensions about XHR requests that are |
1482 // triggered by themselves. This is a workaround to prevent deadlocks | 1483 // triggered by themselves. This is a workaround to prevent deadlocks |
1483 // in case of synchronous XHR requests that block the extension renderer | 1484 // in case of synchronous XHR requests that block the extension renderer |
1484 // and therefore prevent the extension from processing the request | 1485 // and therefore prevent the extension from processing the request |
1485 // handler. This is only a problem for blocking listeners. | 1486 // handler. This is only a problem for blocking listeners. |
1486 // http://crbug.com/105656 | 1487 // http://crbug.com/105656 |
1487 bool synchronous_xhr_from_extension = | 1488 bool synchronous_xhr_from_extension = |
1488 !is_async_request && is_request_from_extension && | 1489 !is_async_request && is_request_from_extension && |
1489 resource_type == content::RESOURCE_TYPE_XHR; | 1490 resource_type == WebRequestResourceType::XHR; |
1490 | 1491 |
1491 // Only send webRequest events for URLs the extension has access to. | 1492 // Only send webRequest events for URLs the extension has access to. |
1492 if (blocking_listener && synchronous_xhr_from_extension) | 1493 if (blocking_listener && synchronous_xhr_from_extension) |
1493 continue; | 1494 continue; |
1494 | 1495 |
1495 matching_listeners->push_back(listener.get()); | 1496 matching_listeners->push_back(listener.get()); |
1496 *extra_info_spec |= listener->extra_info_spec; | 1497 *extra_info_spec |= listener->extra_info_spec; |
1497 } | 1498 } |
1498 } | 1499 } |
1499 | 1500 |
1500 ExtensionWebRequestEventRouter::RawListeners | 1501 ExtensionWebRequestEventRouter::RawListeners |
1501 ExtensionWebRequestEventRouter::GetMatchingListeners( | 1502 ExtensionWebRequestEventRouter::GetMatchingListeners( |
1502 void* browser_context, | 1503 void* browser_context, |
1503 const InfoMap* extension_info_map, | 1504 const InfoMap* extension_info_map, |
1504 ExtensionNavigationUIData* navigation_ui_data, | 1505 ExtensionNavigationUIData* navigation_ui_data, |
1505 const std::string& event_name, | 1506 const std::string& event_name, |
1506 const net::URLRequest* request, | 1507 const net::URLRequest* request, |
1507 int* extra_info_spec) { | 1508 int* extra_info_spec) { |
1508 // TODO(mpcomplete): handle browser_context == NULL (should collect all | 1509 // TODO(mpcomplete): handle browser_context == NULL (should collect all |
1509 // listeners). | 1510 // listeners). |
1510 *extra_info_spec = 0; | 1511 *extra_info_spec = 0; |
1511 | 1512 |
1512 const GURL& url = request->url(); | 1513 const GURL& url = request->url(); |
1513 int render_process_host_id = content::ChildProcessHost::kInvalidUniqueID; | 1514 int render_process_host_id = content::ChildProcessHost::kInvalidUniqueID; |
1514 int routing_id = MSG_ROUTING_NONE; | 1515 int routing_id = MSG_ROUTING_NONE; |
1515 content::ResourceType resource_type = content::RESOURCE_TYPE_LAST_TYPE; | 1516 auto resource_type = GetWebRequestResourceType(request); |
pkalinnikov
2017/02/16 21:01:05
A have looked at the failing test, and apparently
pkalinnikov
2017/02/16 21:24:46
Done.
| |
1516 // We are conservative here and assume requests are asynchronous in case | 1517 // We are conservative here and assume requests are asynchronous in case |
1517 // we don't have an info object. We don't want to risk a deadlock. | 1518 // we don't have an info object. We don't want to risk a deadlock. |
1518 bool is_async_request = false; | 1519 bool is_async_request = false; |
1519 bool is_request_from_extension = | 1520 bool is_request_from_extension = |
1520 IsRequestFromExtension(request, extension_info_map); | 1521 IsRequestFromExtension(request, extension_info_map); |
1521 | 1522 |
1522 const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request); | 1523 const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request); |
1523 if (info) { | 1524 if (info) { |
1524 is_async_request = info->IsAsync(); | 1525 is_async_request = info->IsAsync(); |
1525 if (helpers::IsRelevantResourceType(info->GetResourceType())) | |
1526 resource_type = info->GetResourceType(); | |
1527 render_process_host_id = info->GetChildID(); | 1526 render_process_host_id = info->GetChildID(); |
1528 routing_id = info->GetRouteID(); | 1527 routing_id = info->GetRouteID(); |
1529 } | 1528 } |
1530 | 1529 |
1531 RawListeners matching_listeners; | 1530 RawListeners matching_listeners; |
1532 GetMatchingListenersImpl(browser_context, request, extension_info_map, | 1531 GetMatchingListenersImpl(browser_context, request, extension_info_map, |
1533 navigation_ui_data, false, event_name, url, | 1532 navigation_ui_data, false, event_name, url, |
1534 render_process_host_id, routing_id, resource_type, | 1533 render_process_host_id, routing_id, resource_type, |
1535 is_async_request, is_request_from_extension, | 1534 is_async_request, is_request_from_extension, |
1536 extra_info_spec, &matching_listeners); | 1535 extra_info_spec, &matching_listeners); |
(...skipping 853 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2390 // Since EventListeners are segmented by browser_context, check that | 2389 // Since EventListeners are segmented by browser_context, check that |
2391 // last, as it is exceedingly unlikely to be different. | 2390 // last, as it is exceedingly unlikely to be different. |
2392 return extension_id == that.extension_id && | 2391 return extension_id == that.extension_id && |
2393 sub_event_name == that.sub_event_name && | 2392 sub_event_name == that.sub_event_name && |
2394 web_view_instance_id == that.web_view_instance_id && | 2393 web_view_instance_id == that.web_view_instance_id && |
2395 embedder_process_id == that.embedder_process_id && | 2394 embedder_process_id == that.embedder_process_id && |
2396 browser_context == that.browser_context; | 2395 browser_context == that.browser_context; |
2397 } | 2396 } |
2398 | 2397 |
2399 } // namespace extensions | 2398 } // namespace extensions |
OLD | NEW |