diff options
author | fmeawad <fmeawad@chromium.org> | 2015-06-19 17:53:09 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-06-20 00:53:44 +0000 |
commit | b0fd0c5a391fce6849ca4b3645713613d187ecfe (patch) | |
tree | 235602fa59f6eea0b85b8b915613d499a73093c2 | |
parent | 3b08f4973d951753a94c51ec934e01ff3a214a04 (diff) | |
download | chromium_src-b0fd0c5a391fce6849ca4b3645713613d187ecfe.zip chromium_src-b0fd0c5a391fce6849ca4b3645713613d187ecfe.tar.gz chromium_src-b0fd0c5a391fce6849ca4b3645713613d187ecfe.tar.bz2 |
Implementing Navigation Tracing (aka Deep reports)
We implement Navigation Tracing as a Reactive configuration
using the background tracing manager.
It gets initialized in chrome, and triggered from navigator_impl (content).
Other issues:
Adjust the deep report categories.
Create a helper trace uploader to be used by navigation tracing as well as the field trial.
BUG=495183
Review URL: https://codereview.chromium.org/1153363007
Cr-Commit-Position: refs/heads/master@{#335406}
-rw-r--r-- | chrome/browser/chrome_browser_main.cc | 7 | ||||
-rw-r--r-- | chrome/browser/tracing/background_tracing_field_trial.cc | 10 | ||||
-rw-r--r-- | chrome/browser/tracing/crash_service_uploader.cc | 3 | ||||
-rw-r--r-- | chrome/browser/tracing/navigation_tracing.cc | 102 | ||||
-rw-r--r-- | chrome/browser/tracing/navigation_tracing.h | 40 | ||||
-rw-r--r-- | chrome/browser/ui/tab_helpers.cc | 8 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 2 | ||||
-rw-r--r-- | chrome/common/chrome_switches.cc | 5 | ||||
-rw-r--r-- | chrome/common/chrome_switches.h | 1 | ||||
-rw-r--r-- | content/browser/tracing/background_tracing_manager_impl.cc | 2 |
10 files changed, 172 insertions, 8 deletions
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc index 462a275..461ef82 100644 --- a/chrome/browser/chrome_browser_main.cc +++ b/chrome/browser/chrome_browser_main.cc @@ -85,6 +85,7 @@ #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/profiles/profiles_state.h" #include "chrome/browser/shell_integration.h" +#include "chrome/browser/tracing/navigation_tracing.h" #include "chrome/browser/translate/translate_service.h" #include "chrome/browser/ui/app_list/app_list_service.h" #include "chrome/browser/ui/browser.h" @@ -647,6 +648,12 @@ void ChromeBrowserMainParts::SetupMetricsAndFieldTrials() { // This must be called after |local_state_| is initialized. browser_field_trials_.SetupFieldTrials(); + // Enable Navigation Tracing only if a trace upload url is specified. + if (command_line->HasSwitch(switches::kEnableNavigationTracing) && + command_line->HasSwitch(switches::kTraceUploadURL)) { + tracing::SetupNavigationTracing(); + } + // Initialize FieldTrialSynchronizer system. This is a singleton and is used // for posting tasks via base::Bind. Its deleted when it goes out of scope. // Even though base::Bind does AddRef and Release, the object will not be diff --git a/chrome/browser/tracing/background_tracing_field_trial.cc b/chrome/browser/tracing/background_tracing_field_trial.cc index 8bf23c7..b64c0cd 100644 --- a/chrome/browser/tracing/background_tracing_field_trial.cc +++ b/chrome/browser/tracing/background_tracing_field_trial.cc @@ -27,13 +27,8 @@ const char kBackgroundTracingUploadUrl[] = "upload_url"; ConfigTextFilterForTesting g_config_text_filter_for_testing = nullptr; -void OnUploadProgress(int64, int64) { - // We don't actually care about the progress, but TraceUploader::DoUpload - // requires we pass something valid. -} - void OnUploadComplete(TraceCrashServiceUploader* uploader, - base::Closure done_callback, + const base::Closure& done_callback, bool success, const std::string& feedback) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); @@ -51,7 +46,8 @@ void UploadCallback(const std::string& upload_url, uploader->SetUploadURL(upload_url); uploader->DoUpload( - file_contents->data(), metadata.Pass(), base::Bind(&OnUploadProgress), + file_contents->data(), metadata.Pass(), + content::TraceUploader::UploadProgressCallback(), base::Bind(&OnUploadComplete, base::Owned(uploader), callback)); } diff --git a/chrome/browser/tracing/crash_service_uploader.cc b/chrome/browser/tracing/crash_service_uploader.cc index b3d715a..a8ba221 100644 --- a/chrome/browser/tracing/crash_service_uploader.cc +++ b/chrome/browser/tracing/crash_service_uploader.cc @@ -92,6 +92,9 @@ void TraceCrashServiceUploader::OnURLFetchUploadProgress( DCHECK(url_fetcher_.get()); LOG(WARNING) << "Upload progress: " << current << " of " << total; + + if (progress_callback_.is_null()) + return; content::BrowserThread::PostTask( content::BrowserThread::UI, FROM_HERE, base::Bind(progress_callback_, current, total)); diff --git a/chrome/browser/tracing/navigation_tracing.cc b/chrome/browser/tracing/navigation_tracing.cc new file mode 100644 index 0000000..eea4203 --- /dev/null +++ b/chrome/browser/tracing/navigation_tracing.cc @@ -0,0 +1,102 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/tracing/navigation_tracing.h" + +#include "base/bind.h" +#include "base/command_line.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/tracing/crash_service_uploader.h" +#include "chrome/common/chrome_switches.h" +#include "content/public/browser/background_tracing_manager.h" +#include "content/public/browser/background_tracing_reactive_config.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/browser/render_frame_host.h" + +DEFINE_WEB_CONTENTS_USER_DATA_KEY(tracing::NavigationTracingObserver); + +using content::RenderFrameHost; + +namespace tracing { + +namespace { + +const char kNavigationTracingConfig[] = "navigation-config"; + +void OnUploadComplete(TraceCrashServiceUploader* uploader, + const base::Closure& done_callback, + bool success, + const std::string& feedback) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + done_callback.Run(); +} + +void UploadCallback(const scoped_refptr<base::RefCountedString>& file_contents, + scoped_ptr<base::DictionaryValue> metadata, + base::Closure callback) { + TraceCrashServiceUploader* uploader = new TraceCrashServiceUploader( + g_browser_process->system_request_context()); + + uploader->DoUpload( + file_contents->data(), metadata.Pass(), + content::TraceUploader::UploadProgressCallback(), + base::Bind(&OnUploadComplete, base::Owned(uploader), callback)); +} + +} // namespace + +void SetupNavigationTracing() { + const base::CommandLine& command_line = + *base::CommandLine::ForCurrentProcess(); + if (!command_line.HasSwitch(switches::kEnableNavigationTracing) || + !command_line.HasSwitch(switches::kTraceUploadURL)) { + NOTREACHED(); + return; + } + + scoped_ptr<content::BackgroundTracingReactiveConfig> config; + config.reset(new content::BackgroundTracingReactiveConfig()); + + content::BackgroundTracingReactiveConfig::TracingRule rule; + rule.type = content::BackgroundTracingReactiveConfig:: + TRACE_FOR_10S_OR_TRIGGER_OR_FULL; + rule.trigger_name = kNavigationTracingConfig; + rule.category_preset = + content::BackgroundTracingConfig::CategoryPreset::BENCHMARK_DEEP; + config->configs.push_back(rule); + + content::BackgroundTracingManager::GetInstance()->SetActiveScenario( + config.Pass(), base::Bind(&UploadCallback), + content::BackgroundTracingManager::NO_DATA_FILTERING); +} + +NavigationTracingObserver::NavigationTracingObserver( + content::WebContents* web_contents) + : content::WebContentsObserver(web_contents) { + if (navigation_handle == -1) { + navigation_handle = + content::BackgroundTracingManager::GetInstance()->RegisterTriggerType( + kNavigationTracingConfig); + } +} + +NavigationTracingObserver::~NavigationTracingObserver() { +} + +void NavigationTracingObserver::DidStartProvisionalLoadForFrame( + content::RenderFrameHost* render_frame_host, + const GURL& validated_url, + bool is_error_page, + bool is_iframe_srcdoc) { + if (!render_frame_host->GetParent() && !is_error_page) { + content::BackgroundTracingManager::GetInstance()->TriggerNamedEvent( + navigation_handle, + content::BackgroundTracingManager::StartedFinalizingCallback()); + } +} + +content::BackgroundTracingManager::TriggerHandle + NavigationTracingObserver::navigation_handle = -1; + +} // namespace tracing diff --git a/chrome/browser/tracing/navigation_tracing.h b/chrome/browser/tracing/navigation_tracing.h new file mode 100644 index 0000000..80835ca --- /dev/null +++ b/chrome/browser/tracing/navigation_tracing.h @@ -0,0 +1,40 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_TRACING_NAVIGATION_TRACING_H_ +#define CHROME_BROWSER_TRACING_NAVIGATION_TRACING_H_ + +#include "content/public/browser/background_tracing_manager.h" +#include "content/public/browser/web_contents_observer.h" +#include "content/public/browser/web_contents_user_data.h" + +namespace tracing { + +void SetupNavigationTracing(); + +class NavigationTracingObserver + : public content::WebContentsObserver, + public content::WebContentsUserData<NavigationTracingObserver> { + private: + friend class content::WebContentsUserData<NavigationTracingObserver>; + + explicit NavigationTracingObserver(content::WebContents* web_contents); + + ~NavigationTracingObserver() override; + + // content::WebContentsObserver implementation. + void DidStartProvisionalLoadForFrame( + content::RenderFrameHost* render_frame_host, + const GURL& validated_url, + bool is_error_page, + bool is_iframe_srcdoc) override; + + static content::BackgroundTracingManager::TriggerHandle navigation_handle; + + DISALLOW_COPY_AND_ASSIGN(NavigationTracingObserver); +}; + +} // namespace tracing + +#endif // CHROME_BROWSER_TRACING_NAVIGATION_TRACING_H_ diff --git a/chrome/browser/ui/tab_helpers.cc b/chrome/browser/ui/tab_helpers.cc index 7d27f47..cf9e5f2 100644 --- a/chrome/browser/ui/tab_helpers.cc +++ b/chrome/browser/ui/tab_helpers.cc @@ -24,6 +24,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sessions/session_tab_helper.h" #include "chrome/browser/tab_contents/navigation_metrics_recorder.h" +#include "chrome/browser/tracing/navigation_tracing.h" #include "chrome/browser/translate/chrome_translate_client.h" #include "chrome/browser/ui/autofill/chrome_autofill_client.h" #include "chrome/browser/ui/blocked_content/popup_blocker_tab_helper.h" @@ -241,4 +242,11 @@ void TabHelpers::AttachTabHelpers(WebContents* web_contents) { predictors::ResourcePrefetchPredictorTabHelper::CreateForWebContents( web_contents); } + + if (base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kEnableNavigationTracing) && + base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kTraceUploadURL)) { + tracing::NavigationTracingObserver::CreateForWebContents(web_contents); + } } diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index 61e7d0b..293ca89 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -785,6 +785,8 @@ 'browser/tracing/chrome_tracing_delegate.h', 'browser/tracing/crash_service_uploader.cc', 'browser/tracing/crash_service_uploader.h', + 'browser/tracing/navigation_tracing.cc', + 'browser/tracing/navigation_tracing.h', 'browser/translate/chrome_translate_client.cc', 'browser/translate/chrome_translate_client.h', 'browser/translate/translate_accept_languages_factory.cc', diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc index 5b23265..fc53f0a 100644 --- a/chrome/common/chrome_switches.cc +++ b/chrome/common/chrome_switches.cc @@ -454,6 +454,11 @@ const char kEnableMediaRouter[] = "enable-media-router"; // (internally adds lEnableGpuPlugin to the command line). const char kEnableNaCl[] = "enable-nacl"; +// Enables tracing for each navigation. It will attempt to trace each navigation +// for 10s, until the buffer is full, or until the next navigation. +// It only works if a URL was provided by --trace-upload-url. +const char kEnableNavigationTracing[] = "enable-navigation-tracing"; + // Enables the network-related benchmarking extensions. const char kEnableNetBenchmarking[] = "enable-net-benchmarking"; diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h index 6485ef6..c76f2d3 100644 --- a/chrome/common/chrome_switches.h +++ b/chrome/common/chrome_switches.h @@ -132,6 +132,7 @@ extern const char kEnableLinkableEphemeralApps[]; extern const char kEnableMaterialDesignSettings[]; extern const char kEnableMediaRouter[]; extern const char kEnableNaCl[]; +extern const char kEnableNavigationTracing[]; extern const char kEnableNetBenchmarking[]; extern const char kEnableNewBookmarkApps[]; extern const char kEnableOfflineAutoReload[]; diff --git a/content/browser/tracing/background_tracing_manager_impl.cc b/content/browser/tracing/background_tracing_manager_impl.cc index 7325672..102264c5 100644 --- a/content/browser/tracing/background_tracing_manager_impl.cc +++ b/content/browser/tracing/background_tracing_manager_impl.cc @@ -490,7 +490,7 @@ BackgroundTracingManagerImpl::GetCategoryFilterStringForCategoryPreset( "disabled-by-default-toplevel.flow," "disabled-by-default-ipc.flow"; case BackgroundTracingConfig::CategoryPreset::BENCHMARK_DEEP: - return "*,disabled-by-default-blink.debug.layout"; + return "*,disabled-by-default-benchmark.detailed"; } NOTREACHED(); return ""; |