Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(59)

Side by Side Diff: extensions/browser/api/web_request/web_request_api.cc

Issue 2700553002: Introduce WebRequestResourceType. (Closed)
Patch Set: Address comments; add 'media'; make type mapping consistent. Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698