summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorfmeawad <fmeawad@chromium.org>2015-06-19 17:53:09 -0700
committerCommit bot <commit-bot@chromium.org>2015-06-20 00:53:44 +0000
commitb0fd0c5a391fce6849ca4b3645713613d187ecfe (patch)
tree235602fa59f6eea0b85b8b915613d499a73093c2
parent3b08f4973d951753a94c51ec934e01ff3a214a04 (diff)
downloadchromium_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.cc7
-rw-r--r--chrome/browser/tracing/background_tracing_field_trial.cc10
-rw-r--r--chrome/browser/tracing/crash_service_uploader.cc3
-rw-r--r--chrome/browser/tracing/navigation_tracing.cc102
-rw-r--r--chrome/browser/tracing/navigation_tracing.h40
-rw-r--r--chrome/browser/ui/tab_helpers.cc8
-rw-r--r--chrome/chrome_browser.gypi2
-rw-r--r--chrome/common/chrome_switches.cc5
-rw-r--r--chrome/common/chrome_switches.h1
-rw-r--r--content/browser/tracing/background_tracing_manager_impl.cc2
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 "";