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

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

Issue 10407105: Improve error messaging of webRequest API in case of conflicts (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Store ExtensionWarnings as values in set rather than pointers Created 8 years, 3 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 | Annotate | Revision Log
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 "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/json/json_writer.h" 11 #include "base/json/json_writer.h"
11 #include "base/metrics/histogram.h" 12 #include "base/metrics/histogram.h"
12 #include "base/string_number_conversions.h" 13 #include "base/string_number_conversions.h"
13 #include "base/string_util.h" 14 #include "base/string_util.h"
14 #include "base/time.h" 15 #include "base/time.h"
15 #include "base/utf_string_conversions.h" 16 #include "base/utf_string_conversions.h"
16 #include "base/values.h" 17 #include "base/values.h"
17 #include "chrome/browser/browser_process.h" 18 #include "chrome/browser/browser_process.h"
18 #include "chrome/browser/chrome_content_browser_client.h" 19 #include "chrome/browser/chrome_content_browser_client.h"
19 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_rule.h " 20 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_rule.h "
20 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_ registry.h" 21 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_ registry.h"
21 #include "chrome/browser/extensions/api/web_navigation/web_navigation_api_helper s.h" 22 #include "chrome/browser/extensions/api/web_navigation/web_navigation_api_helper s.h"
22 #include "chrome/browser/extensions/api/web_request/web_request_api_constants.h" 23 #include "chrome/browser/extensions/api/web_request/web_request_api_constants.h"
23 #include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h" 24 #include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h"
24 #include "chrome/browser/extensions/api/web_request/web_request_time_tracker.h" 25 #include "chrome/browser/extensions/api/web_request/web_request_time_tracker.h"
25 #include "chrome/browser/extensions/event_router.h" 26 #include "chrome/browser/extensions/event_router.h"
26 #include "chrome/browser/extensions/extension_info_map.h" 27 #include "chrome/browser/extensions/extension_info_map.h"
27 #include "chrome/browser/extensions/extension_prefs.h" 28 #include "chrome/browser/extensions/extension_prefs.h"
28 #include "chrome/browser/extensions/extension_service.h" 29 #include "chrome/browser/extensions/extension_service.h"
29 #include "chrome/browser/extensions/extension_tab_id_map.h" 30 #include "chrome/browser/extensions/extension_tab_id_map.h"
31 #include "chrome/browser/extensions/extension_warning_set.h"
30 #include "chrome/browser/profiles/profile.h" 32 #include "chrome/browser/profiles/profile.h"
31 #include "chrome/browser/profiles/profile_manager.h" 33 #include "chrome/browser/profiles/profile_manager.h"
32 #include "chrome/browser/renderer_host/chrome_render_message_filter.h" 34 #include "chrome/browser/renderer_host/chrome_render_message_filter.h"
33 #include "chrome/common/extensions/api/web_request.h" 35 #include "chrome/common/extensions/api/web_request.h"
34 #include "chrome/common/extensions/event_filtering_info.h" 36 #include "chrome/common/extensions/event_filtering_info.h"
35 #include "chrome/common/extensions/extension.h" 37 #include "chrome/common/extensions/extension.h"
36 #include "chrome/common/extensions/extension_constants.h" 38 #include "chrome/common/extensions/extension_constants.h"
37 #include "chrome/common/extensions/extension_error_utils.h" 39 #include "chrome/common/extensions/extension_error_utils.h"
38 #include "chrome/common/extensions/extension_messages.h" 40 #include "chrome/common/extensions/extension_messages.h"
39 #include "chrome/common/extensions/url_pattern.h" 41 #include "chrome/common/extensions/url_pattern.h"
40 #include "chrome/common/url_constants.h" 42 #include "chrome/common/url_constants.h"
41 #include "content/public/browser/browser_message_filter.h" 43 #include "content/public/browser/browser_message_filter.h"
42 #include "content/public/browser/browser_thread.h" 44 #include "content/public/browser/browser_thread.h"
43 #include "content/public/browser/render_process_host.h" 45 #include "content/public/browser/render_process_host.h"
44 #include "content/public/browser/resource_request_info.h" 46 #include "content/public/browser/resource_request_info.h"
45 #include "googleurl/src/gurl.h" 47 #include "googleurl/src/gurl.h"
46 #include "grit/generated_resources.h" 48 #include "grit/generated_resources.h"
47 #include "net/base/auth.h" 49 #include "net/base/auth.h"
48 #include "net/base/net_errors.h" 50 #include "net/base/net_errors.h"
49 #include "net/http/http_response_headers.h" 51 #include "net/http/http_response_headers.h"
50 #include "net/url_request/url_request.h" 52 #include "net/url_request/url_request.h"
51 #include "ui/base/l10n/l10n_util.h" 53 #include "ui/base/l10n/l10n_util.h"
52 54
53 using content::BrowserMessageFilter; 55 using content::BrowserMessageFilter;
54 using content::BrowserThread; 56 using content::BrowserThread;
55 using content::ResourceRequestInfo; 57 using content::ResourceRequestInfo;
56 using extensions::Extension; 58 using extensions::Extension;
59 using extensions::ExtensionWarning;
60 using extensions::ExtensionWarningService;
61 using extensions::ExtensionWarningSet;
57 62
58 using extensions::web_navigation_api_helpers::GetFrameId; 63 using extensions::web_navigation_api_helpers::GetFrameId;
59 64
60 namespace helpers = extension_web_request_api_helpers; 65 namespace helpers = extension_web_request_api_helpers;
61 namespace keys = extension_web_request_api_constants; 66 namespace keys = extension_web_request_api_constants;
62 namespace web_request = extensions::api::web_request; 67 namespace web_request = extensions::api::web_request;
63 68
64 namespace { 69 namespace {
65 70
66 // List of all the webRequest events. 71 // List of all the webRequest events.
(...skipping 1251 matching lines...) Expand 10 before | Expand all | Expand 10 after
1318 BlockedRequest& blocked_request = blocked_requests_[request_id]; 1323 BlockedRequest& blocked_request = blocked_requests_[request_id];
1319 CHECK(blocked_request.num_handlers_blocking == 0); 1324 CHECK(blocked_request.num_handlers_blocking == 0);
1320 helpers::EventResponseDeltas& deltas = blocked_request.response_deltas; 1325 helpers::EventResponseDeltas& deltas = blocked_request.response_deltas;
1321 base::TimeDelta block_time = 1326 base::TimeDelta block_time =
1322 base::Time::Now() - blocked_request.blocking_time; 1327 base::Time::Now() - blocked_request.blocking_time;
1323 request_time_tracker_->IncrementTotalBlockTime(request_id, block_time); 1328 request_time_tracker_->IncrementTotalBlockTime(request_id, block_time);
1324 1329
1325 bool credentials_set = false; 1330 bool credentials_set = false;
1326 1331
1327 deltas.sort(&helpers::InDecreasingExtensionInstallationTimeOrder); 1332 deltas.sort(&helpers::InDecreasingExtensionInstallationTimeOrder);
1328 std::set<std::string> conflicting_extensions; 1333 ExtensionWarningSet warnings;
1329 1334
1330 bool canceled = false; 1335 bool canceled = false;
1331 helpers::MergeCancelOfResponses( 1336 helpers::MergeCancelOfResponses(
1332 blocked_request.response_deltas, 1337 blocked_request.response_deltas,
1333 &canceled, 1338 &canceled,
1334 blocked_request.net_log); 1339 blocked_request.net_log);
1335 1340
1336 if (blocked_request.event == kOnBeforeRequest) { 1341 if (blocked_request.event == kOnBeforeRequest) {
1337 CHECK(!blocked_request.callback.is_null()); 1342 CHECK(!blocked_request.callback.is_null());
1338 helpers::MergeOnBeforeRequestResponses( 1343 helpers::MergeOnBeforeRequestResponses(
1339 blocked_request.response_deltas, 1344 blocked_request.response_deltas,
1340 blocked_request.new_url, 1345 blocked_request.new_url,
1341 &conflicting_extensions, 1346 &warnings,
1342 blocked_request.net_log); 1347 blocked_request.net_log);
1343 } else if (blocked_request.event == kOnBeforeSendHeaders) { 1348 } else if (blocked_request.event == kOnBeforeSendHeaders) {
1344 CHECK(!blocked_request.callback.is_null()); 1349 CHECK(!blocked_request.callback.is_null());
1345 helpers::MergeOnBeforeSendHeadersResponses( 1350 helpers::MergeOnBeforeSendHeadersResponses(
1346 blocked_request.response_deltas, 1351 blocked_request.response_deltas,
1347 blocked_request.request_headers, 1352 blocked_request.request_headers,
1348 &conflicting_extensions, 1353 &warnings,
1349 blocked_request.net_log); 1354 blocked_request.net_log);
1350 } else if (blocked_request.event == kOnHeadersReceived) { 1355 } else if (blocked_request.event == kOnHeadersReceived) {
1351 CHECK(!blocked_request.callback.is_null()); 1356 CHECK(!blocked_request.callback.is_null());
1352 helpers::MergeOnHeadersReceivedResponses( 1357 helpers::MergeOnHeadersReceivedResponses(
1353 blocked_request.response_deltas, 1358 blocked_request.response_deltas,
1354 blocked_request.original_response_headers.get(), 1359 blocked_request.original_response_headers.get(),
1355 blocked_request.override_response_headers, 1360 blocked_request.override_response_headers,
1356 &conflicting_extensions, 1361 &warnings,
1357 blocked_request.net_log); 1362 blocked_request.net_log);
1358 } else if (blocked_request.event == kOnAuthRequired) { 1363 } else if (blocked_request.event == kOnAuthRequired) {
1359 CHECK(blocked_request.callback.is_null()); 1364 CHECK(blocked_request.callback.is_null());
1360 CHECK(!blocked_request.auth_callback.is_null()); 1365 CHECK(!blocked_request.auth_callback.is_null());
1361 credentials_set = helpers::MergeOnAuthRequiredResponses( 1366 credentials_set = helpers::MergeOnAuthRequiredResponses(
1362 blocked_request.response_deltas, 1367 blocked_request.response_deltas,
1363 blocked_request.auth_credentials, 1368 blocked_request.auth_credentials,
1364 &conflicting_extensions, 1369 &warnings,
1365 blocked_request.net_log); 1370 blocked_request.net_log);
1366 } else { 1371 } else {
1367 NOTREACHED(); 1372 NOTREACHED();
1368 } 1373 }
1369 1374
1370 if (!conflicting_extensions.empty()) { 1375 if (!warnings.empty()) {
1371 BrowserThread::PostTask( 1376 BrowserThread::PostTask(
1372 BrowserThread::UI, 1377 BrowserThread::UI,
1373 FROM_HERE, 1378 FROM_HERE,
1374 base::Bind(&ExtensionWarningSet::NotifyWarningsOnUI, 1379 base::Bind(&ExtensionWarningService::NotifyWarningsOnUI,
1375 profile, 1380 profile, warnings));
1376 conflicting_extensions,
1377 ExtensionWarningSet::kNetworkConflict));
1378 } 1381 }
1379 1382
1380 if (canceled) { 1383 if (canceled) {
1381 request_time_tracker_->SetRequestCanceled(request_id); 1384 request_time_tracker_->SetRequestCanceled(request_id);
1382 } else if (blocked_request.new_url && 1385 } else if (blocked_request.new_url &&
1383 !blocked_request.new_url->is_empty()) { 1386 !blocked_request.new_url->is_empty()) {
1384 request_time_tracker_->SetRequestRedirected(request_id); 1387 request_time_tracker_->SetRequestRedirected(request_id);
1385 } 1388 }
1386 1389
1387 // This triggers onErrorOccurred if canceled is true. 1390 // This triggers onErrorOccurred if canceled is true.
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after
1796 QuotaLimitHeuristic::BucketMapper* bucket_mapper = 1799 QuotaLimitHeuristic::BucketMapper* bucket_mapper =
1797 new QuotaLimitHeuristic::SingletonBucketMapper(); 1800 new QuotaLimitHeuristic::SingletonBucketMapper();
1798 ClearCacheQuotaHeuristic* heuristic = 1801 ClearCacheQuotaHeuristic* heuristic =
1799 new ClearCacheQuotaHeuristic(config, bucket_mapper); 1802 new ClearCacheQuotaHeuristic(config, bucket_mapper);
1800 heuristics->push_back(heuristic); 1803 heuristics->push_back(heuristic);
1801 } 1804 }
1802 1805
1803 void WebRequestHandlerBehaviorChanged::OnQuotaExceeded( 1806 void WebRequestHandlerBehaviorChanged::OnQuotaExceeded(
1804 const std::string& violation_error) { 1807 const std::string& violation_error) {
1805 // Post warning message. 1808 // Post warning message.
1806 std::set<std::string> extension_ids; 1809 ExtensionWarningSet warnings;
1807 extension_ids.insert(extension_id()); 1810 warnings.insert(
1811 ExtensionWarning::CreateRepeatedCacheFlushesWarning(extension_id()));
1808 BrowserThread::PostTask( 1812 BrowserThread::PostTask(
1809 BrowserThread::UI, 1813 BrowserThread::UI,
1810 FROM_HERE, 1814 FROM_HERE,
1811 base::Bind(&ExtensionWarningSet::NotifyWarningsOnUI, 1815 base::Bind(&ExtensionWarningService::NotifyWarningsOnUI,
1812 profile_id(), 1816 profile_id(), warnings));
1813 extension_ids,
1814 ExtensionWarningSet::kRepeatedCacheFlushes));
1815 1817
1816 // Continue gracefully. 1818 // Continue gracefully.
1817 Run(); 1819 Run();
1818 } 1820 }
1819 1821
1820 bool WebRequestHandlerBehaviorChanged::RunImpl() { 1822 bool WebRequestHandlerBehaviorChanged::RunImpl() {
1821 helpers::ClearCacheOnNavigation(); 1823 helpers::ClearCacheOnNavigation();
1822 return true; 1824 return true;
1823 } 1825 }
1824 1826
(...skipping 15 matching lines...) Expand all
1840 } else if ((*it)->name().find("AdBlock") != std::string::npos) { 1842 } else if ((*it)->name().find("AdBlock") != std::string::npos) {
1841 adblock = true; 1843 adblock = true;
1842 } else { 1844 } else {
1843 other = true; 1845 other = true;
1844 } 1846 }
1845 } 1847 }
1846 } 1848 }
1847 1849
1848 host->Send(new ExtensionMsg_UsingWebRequestAPI(adblock, adblock_plus, other)); 1850 host->Send(new ExtensionMsg_UsingWebRequestAPI(adblock, adblock_plus, other));
1849 } 1851 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698