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

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

Issue 2700553002: Introduce WebRequestResourceType. (Closed)
Patch Set: Make compiler happy; make type<->string mapping self-checking. 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;
514 types.push_back(WebRequestResourceType::OTHER);
512 if (!types_value->GetString(i, &type_str) || 515 if (!types_value->GetString(i, &type_str) ||
513 !helpers::ParseResourceType(type_str, &types)) { 516 !ParseWebRequestResourceType(type_str, &types.back())) {
514 return false; 517 return false;
515 } 518 }
516 } 519 }
517 } else if (it.key() == "tabId") { 520 } else if (it.key() == "tabId") {
518 if (!it.value().GetAsInteger(&tab_id)) 521 if (!it.value().GetAsInteger(&tab_id))
519 return false; 522 return false;
520 } else if (it.key() == "windowId") { 523 } else if (it.key() == "windowId") {
521 if (!it.value().GetAsInteger(&window_id)) 524 if (!it.value().GetAsInteger(&window_id))
522 return false; 525 return false;
523 } else { 526 } else {
(...skipping 802 matching lines...) Expand 10 before | Expand all | Expand 10 after
1326 } 1329 }
1327 1330
1328 void ExtensionWebRequestEventRouter::AddCallbackForPageLoad( 1331 void ExtensionWebRequestEventRouter::AddCallbackForPageLoad(
1329 const base::Closure& callback) { 1332 const base::Closure& callback) {
1330 callbacks_for_page_load_.push_back(callback); 1333 callbacks_for_page_load_.push_back(callback);
1331 } 1334 }
1332 1335
1333 bool ExtensionWebRequestEventRouter::IsPageLoad( 1336 bool ExtensionWebRequestEventRouter::IsPageLoad(
1334 const net::URLRequest* request) const { 1337 const net::URLRequest* request) const {
1335 const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request); 1338 const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request);
1336 if (!info) 1339 return info && info->GetResourceType() == content::RESOURCE_TYPE_MAIN_FRAME;
1337 return false;
1338
1339 return info->GetResourceType() == content::RESOURCE_TYPE_MAIN_FRAME;
1340 } 1340 }
1341 1341
1342 void ExtensionWebRequestEventRouter::NotifyPageLoad() { 1342 void ExtensionWebRequestEventRouter::NotifyPageLoad() {
1343 for (const auto& callback : callbacks_for_page_load_) 1343 for (const auto& callback : callbacks_for_page_load_)
1344 callback.Run(); 1344 callback.Run();
1345 callbacks_for_page_load_.clear(); 1345 callbacks_for_page_load_.clear();
1346 } 1346 }
1347 1347
1348 void* ExtensionWebRequestEventRouter::GetCrossBrowserContext( 1348 void* ExtensionWebRequestEventRouter::GetCrossBrowserContext(
1349 void* browser_context) const { 1349 void* browser_context) const {
(...skipping 23 matching lines...) Expand all
1373 void ExtensionWebRequestEventRouter::GetMatchingListenersImpl( 1373 void ExtensionWebRequestEventRouter::GetMatchingListenersImpl(
1374 void* browser_context, 1374 void* browser_context,
1375 const net::URLRequest* request, 1375 const net::URLRequest* request,
1376 const InfoMap* extension_info_map, 1376 const InfoMap* extension_info_map,
1377 ExtensionNavigationUIData* navigation_ui_data, 1377 ExtensionNavigationUIData* navigation_ui_data,
1378 bool crosses_incognito, 1378 bool crosses_incognito,
1379 const std::string& event_name, 1379 const std::string& event_name,
1380 const GURL& url, 1380 const GURL& url,
1381 int render_process_host_id, 1381 int render_process_host_id,
1382 int routing_id, 1382 int routing_id,
1383 content::ResourceType resource_type, 1383 WebRequestResourceType resource_type,
1384 bool is_async_request, 1384 bool is_async_request,
1385 bool is_request_from_extension, 1385 bool is_request_from_extension,
1386 int* extra_info_spec, 1386 int* extra_info_spec,
1387 RawListeners* matching_listeners) { 1387 RawListeners* matching_listeners) {
1388 std::string web_request_event_name(event_name); 1388 std::string web_request_event_name(event_name);
1389 WebViewRendererState::WebViewInfo web_view_info; 1389 WebViewRendererState::WebViewInfo web_view_info;
1390 bool is_web_view_guest = 1390 bool is_web_view_guest =
1391 WebViewRendererState::GetInstance()->GetInfo( 1391 WebViewRendererState::GetInstance()->GetInfo(
1392 render_process_host_id, routing_id, &web_view_info) || 1392 render_process_host_id, routing_id, &web_view_info) ||
1393 (navigation_ui_data && navigation_ui_data->is_web_view()); 1393 (navigation_ui_data && navigation_ui_data->is_web_view());
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
1445 } 1445 }
1446 // Check if the tab id and window id match, if they were set in the 1446 // Check if the tab id and window id match, if they were set in the
1447 // listener params. 1447 // listener params.
1448 if ((listener->filter.tab_id != -1 && 1448 if ((listener->filter.tab_id != -1 &&
1449 frame_data.tab_id != listener->filter.tab_id) || 1449 frame_data.tab_id != listener->filter.tab_id) ||
1450 (listener->filter.window_id != -1 && 1450 (listener->filter.window_id != -1 &&
1451 frame_data.window_id != listener->filter.window_id)) { 1451 frame_data.window_id != listener->filter.window_id)) {
1452 continue; 1452 continue;
1453 } 1453 }
1454 1454
1455 const std::vector<content::ResourceType>& types = listener->filter.types; 1455 const std::vector<WebRequestResourceType>& types = listener->filter.types;
1456 if (!types.empty() && 1456 if (!types.empty() &&
1457 std::find(types.begin(), types.end(), resource_type) == types.end()) { 1457 std::find(types.begin(), types.end(), resource_type) == types.end()) {
1458 continue; 1458 continue;
1459 } 1459 }
1460 1460
1461 if (!is_web_view_guest) { 1461 if (!is_web_view_guest) {
1462 PermissionsData::AccessType access = 1462 PermissionsData::AccessType access =
1463 WebRequestPermissions::CanExtensionAccessURL( 1463 WebRequestPermissions::CanExtensionAccessURL(
1464 extension_info_map, listener->id.extension_id, url, 1464 extension_info_map, listener->id.extension_id, url,
1465 frame_data.tab_id, crosses_incognito, 1465 frame_data.tab_id, crosses_incognito,
(...skipping 13 matching lines...) Expand all
1479 (ExtraInfoSpec::BLOCKING | ExtraInfoSpec::ASYNC_BLOCKING)) != 0; 1479 (ExtraInfoSpec::BLOCKING | ExtraInfoSpec::ASYNC_BLOCKING)) != 0;
1480 1480
1481 // We do not want to notify extensions about XHR requests that are 1481 // We do not want to notify extensions about XHR requests that are
1482 // triggered by themselves. This is a workaround to prevent deadlocks 1482 // triggered by themselves. This is a workaround to prevent deadlocks
1483 // in case of synchronous XHR requests that block the extension renderer 1483 // in case of synchronous XHR requests that block the extension renderer
1484 // and therefore prevent the extension from processing the request 1484 // and therefore prevent the extension from processing the request
1485 // handler. This is only a problem for blocking listeners. 1485 // handler. This is only a problem for blocking listeners.
1486 // http://crbug.com/105656 1486 // http://crbug.com/105656
1487 bool synchronous_xhr_from_extension = 1487 bool synchronous_xhr_from_extension =
1488 !is_async_request && is_request_from_extension && 1488 !is_async_request && is_request_from_extension &&
1489 resource_type == content::RESOURCE_TYPE_XHR; 1489 resource_type == WebRequestResourceType::XHR;
1490 1490
1491 // Only send webRequest events for URLs the extension has access to. 1491 // Only send webRequest events for URLs the extension has access to.
1492 if (blocking_listener && synchronous_xhr_from_extension) 1492 if (blocking_listener && synchronous_xhr_from_extension)
1493 continue; 1493 continue;
1494 1494
1495 matching_listeners->push_back(listener.get()); 1495 matching_listeners->push_back(listener.get());
1496 *extra_info_spec |= listener->extra_info_spec; 1496 *extra_info_spec |= listener->extra_info_spec;
1497 } 1497 }
1498 } 1498 }
1499 1499
1500 ExtensionWebRequestEventRouter::RawListeners 1500 ExtensionWebRequestEventRouter::RawListeners
1501 ExtensionWebRequestEventRouter::GetMatchingListeners( 1501 ExtensionWebRequestEventRouter::GetMatchingListeners(
1502 void* browser_context, 1502 void* browser_context,
1503 const InfoMap* extension_info_map, 1503 const InfoMap* extension_info_map,
1504 ExtensionNavigationUIData* navigation_ui_data, 1504 ExtensionNavigationUIData* navigation_ui_data,
1505 const std::string& event_name, 1505 const std::string& event_name,
1506 const net::URLRequest* request, 1506 const net::URLRequest* request,
1507 int* extra_info_spec) { 1507 int* extra_info_spec) {
1508 // TODO(mpcomplete): handle browser_context == NULL (should collect all 1508 // TODO(mpcomplete): handle browser_context == NULL (should collect all
1509 // listeners). 1509 // listeners).
1510 *extra_info_spec = 0; 1510 *extra_info_spec = 0;
1511 1511
1512 const GURL& url = request->url(); 1512 const GURL& url = request->url();
1513 int render_process_host_id = content::ChildProcessHost::kInvalidUniqueID; 1513 int render_process_host_id = content::ChildProcessHost::kInvalidUniqueID;
1514 int routing_id = MSG_ROUTING_NONE; 1514 int routing_id = MSG_ROUTING_NONE;
1515 content::ResourceType resource_type = content::RESOURCE_TYPE_LAST_TYPE; 1515 auto resource_type = GetWebRequestResourceType(request);
1516 // We are conservative here and assume requests are asynchronous in case 1516 // 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. 1517 // we don't have an info object. We don't want to risk a deadlock.
1518 bool is_async_request = false; 1518 bool is_async_request = false;
1519 bool is_request_from_extension = 1519 bool is_request_from_extension =
1520 IsRequestFromExtension(request, extension_info_map); 1520 IsRequestFromExtension(request, extension_info_map);
1521 1521
1522 const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request); 1522 const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request);
1523 if (info) { 1523 if (info) {
1524 is_async_request = info->IsAsync(); 1524 is_async_request = info->IsAsync();
1525 if (helpers::IsRelevantResourceType(info->GetResourceType()))
1526 resource_type = info->GetResourceType();
1527 render_process_host_id = info->GetChildID(); 1525 render_process_host_id = info->GetChildID();
1528 routing_id = info->GetRouteID(); 1526 routing_id = info->GetRouteID();
1529 } 1527 }
1530 1528
1531 RawListeners matching_listeners; 1529 RawListeners matching_listeners;
1532 GetMatchingListenersImpl(browser_context, request, extension_info_map, 1530 GetMatchingListenersImpl(browser_context, request, extension_info_map,
1533 navigation_ui_data, false, event_name, url, 1531 navigation_ui_data, false, event_name, url,
1534 render_process_host_id, routing_id, resource_type, 1532 render_process_host_id, routing_id, resource_type,
1535 is_async_request, is_request_from_extension, 1533 is_async_request, is_request_from_extension,
1536 extra_info_spec, &matching_listeners); 1534 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 2388 // Since EventListeners are segmented by browser_context, check that
2391 // last, as it is exceedingly unlikely to be different. 2389 // last, as it is exceedingly unlikely to be different.
2392 return extension_id == that.extension_id && 2390 return extension_id == that.extension_id &&
2393 sub_event_name == that.sub_event_name && 2391 sub_event_name == that.sub_event_name &&
2394 web_view_instance_id == that.web_view_instance_id && 2392 web_view_instance_id == that.web_view_instance_id &&
2395 embedder_process_id == that.embedder_process_id && 2393 embedder_process_id == that.embedder_process_id &&
2396 browser_context == that.browser_context; 2394 browser_context == that.browser_context;
2397 } 2395 }
2398 2396
2399 } // namespace extensions 2397 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698