Chromium Code Reviews| Index: chrome/browser/extensions/extension_webrequest_api.cc |
| diff --git a/chrome/browser/extensions/extension_webrequest_api.cc b/chrome/browser/extensions/extension_webrequest_api.cc |
| index 208554ab237ce310128d47b92956e1261391a06e..5aef46bf0e7b73b45428e3df6ea32fbd742b6340 100644 |
| --- a/chrome/browser/extensions/extension_webrequest_api.cc |
| +++ b/chrome/browser/extensions/extension_webrequest_api.cc |
| @@ -6,19 +6,21 @@ |
| #include <algorithm> |
| +#include "base/bind.h" |
| #include "base/json/json_writer.h" |
| #include "base/metrics/histogram.h" |
| #include "base/string_number_conversions.h" |
| #include "base/utf_string_conversions.h" |
| #include "base/values.h" |
| +#include "chrome/browser/browser_process.h" |
| #include "chrome/browser/extensions/extension_event_router.h" |
| #include "chrome/browser/extensions/extension_info_map.h" |
| #include "chrome/browser/extensions/extension_prefs.h" |
| #include "chrome/browser/extensions/extension_service.h" |
| #include "chrome/browser/extensions/extension_tab_id_map.h" |
| #include "chrome/browser/extensions/extension_webrequest_api_constants.h" |
| -#include "chrome/browser/extensions/extension_webrequest_time_tracker.h" |
| #include "chrome/browser/profiles/profile.h" |
| +#include "chrome/browser/profiles/profile_manager.h" |
| #include "chrome/browser/renderer_host/chrome_render_message_filter.h" |
| #include "chrome/browser/renderer_host/web_cache_manager.h" |
| #include "chrome/common/extensions/extension.h" |
| @@ -141,6 +143,28 @@ class NetLogModificationParameter : public NetLogExtensionIdParameter { |
| DISALLOW_COPY_AND_ASSIGN(NetLogModificationParameter); |
| }; |
| +// Handles ExtensionWebRequestTimeTrackerDelegate calls on UI thread. |
| +void NotifyExcessiveDelaysOnUI(void* profile, |
| + size_t num_delayed_messages, |
| + size_t total_num_messages, |
| + std::set<std::string> extension_ids) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + Profile* p = reinterpret_cast<Profile*>(profile); |
| + if (!p || !g_browser_process->profile_manager()->IsValidProfile(p)) |
| + return; |
| + |
| + ExtensionService* extension_service = p->GetExtensionService(); |
| + |
| + // We don't need to warn more than once. |
| + if (extension_service->HasWarning(ExtensionServiceWarning::kNetworkDelay)) |
| + return; |
| + |
| + // Override previous warning |
| + extension_service->SetWarning( |
| + ExtensionServiceWarning(ExtensionServiceWarning::kNetworkDelay, |
| + extension_ids)); |
| +} |
| + |
| // Returns the frame ID as it will be passed to the extension: |
| // 0 if the navigation happens in the main frame, or the frame ID |
| // modulo 32 bits otherwise. |
| @@ -466,11 +490,33 @@ ExtensionWebRequestEventRouter* ExtensionWebRequestEventRouter::GetInstance() { |
| ExtensionWebRequestEventRouter::ExtensionWebRequestEventRouter() |
| : request_time_tracker_(new ExtensionWebRequestTimeTracker) { |
| + request_time_tracker_->SetDelegate(this); |
| } |
| ExtensionWebRequestEventRouter::~ExtensionWebRequestEventRouter() { |
| } |
| +void ExtensionWebRequestEventRouter::NotifyExcessiveDelays( |
| + void* profile, |
| + size_t num_delayed_messages, |
| + size_t total_num_messages, |
| + const std::set<std::string>& extension_ids) { |
| + BrowserThread::PostTask( |
| + BrowserThread::UI, |
| + FROM_HERE, |
| + base::Bind(&NotifyExcessiveDelaysOnUI, |
| + profile, num_delayed_messages, total_num_messages, |
| + extension_ids)); |
| +} |
| + |
| +void ExtensionWebRequestEventRouter::NotifyModerateDelays( |
| + void* profile, |
| + size_t num_delayed_messages, |
| + size_t total_num_messages, |
| + const std::set<std::string>& extension_ids) { |
| + // We do not report these. |
|
Matt Perry
2011/10/06 22:55:54
why not?
The goal of the 2 buckets was to catch 2
battre
2011/10/07 14:09:24
Done.
I had not understood this properly before.
|
| +} |
| + |
| int ExtensionWebRequestEventRouter::OnBeforeRequest( |
| void* profile, |
| ExtensionInfoMap* extension_info_map, |
| @@ -486,7 +532,8 @@ int ExtensionWebRequestEventRouter::OnBeforeRequest( |
| request_time_tracker_->LogRequestStartTime(request->identifier(), |
| base::Time::Now(), |
| - request->url()); |
| + request->url(), |
| + profile); |
| int extra_info_spec = 0; |
| std::vector<const EventListener*> listeners = |