Commit 7b9b71ae authored by Max Curran's avatar Max Curran Committed by Commit Bot

Connect TranslateMetricsLogger to TranslateManager.

This connection will eventually allow Chrome Translate to log metrics with the relevant TranslateMetricsLogger. The TranslateManager will keep a WeakPtr to the newest relevant TranslateMetricsLogger. Any part of Chrome Translate can request this “active” TranslateMetricsLogger in order to log metrics and/or events. In the event this WeakPtr is null, the TranslateManager will return a NullTranslateMetricsLogger (a null implementation of TranslateMetricsLogger), so that the callee doesn’t have to check if the returned value is null or not.

Bug: 1114868

Change-Id: Ifa775ccd5918d4111e8b4ae44ea7f1c1ea034043
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2419260Reviewed-by: default avatarMegan Jablonski <megjablon@chromium.org>
Reviewed-by: default avatarRyan Sturm <ryansturm@chromium.org>
Commit-Queue: Max Curran <curranmax@chromium.org>
Cr-Commit-Position: refs/heads/master@{#815751}
parent 60788459
...@@ -4,15 +4,25 @@ ...@@ -4,15 +4,25 @@
#include "chrome/browser/page_load_metrics/observers/translate_page_load_metrics_observer.h" #include "chrome/browser/page_load_metrics/observers/translate_page_load_metrics_observer.h"
#include "chrome/browser/translate/chrome_translate_client.h"
#include "components/translate/core/browser/translate_manager.h"
#include "components/translate/core/browser/translate_metrics_logger_impl.h" #include "components/translate/core/browser/translate_metrics_logger_impl.h"
std::unique_ptr<TranslatePageLoadMetricsObserver> std::unique_ptr<TranslatePageLoadMetricsObserver>
TranslatePageLoadMetricsObserver::CreateIfNeeded() { TranslatePageLoadMetricsObserver::CreateIfNeeded(
// TODO(curranamx): Connect the new TranslateMetricsLogger to a content::WebContents* web_contents) {
// TranslateManager. https://crbug.com/1114868. // Gets the |TranslateManager| associated with the same |WebContents| as this
// |TranslatePageLoadMetricsObserver|.
translate::TranslateManager* translate_manager =
ChromeTranslateClient::GetManagerFromWebContents(web_contents);
if (translate_manager == nullptr)
return nullptr;
// Creates a new |TranslateMetricsLoggerImpl| and associates with the above
// |TranslateManager|.
std::unique_ptr<translate::TranslateMetricsLogger> translate_metrics_logger = std::unique_ptr<translate::TranslateMetricsLogger> translate_metrics_logger =
std::make_unique<translate::TranslateMetricsLoggerImpl>(); std::make_unique<translate::TranslateMetricsLoggerImpl>(
translate_manager->GetWeakPtr());
return std::make_unique<TranslatePageLoadMetricsObserver>( return std::make_unique<TranslatePageLoadMetricsObserver>(
std::move(translate_metrics_logger)); std::move(translate_metrics_logger));
} }
...@@ -28,8 +38,6 @@ TranslatePageLoadMetricsObserver::OnStart( ...@@ -28,8 +38,6 @@ TranslatePageLoadMetricsObserver::OnStart(
content::NavigationHandle* navigation_handle, content::NavigationHandle* navigation_handle,
const GURL& currently_committed_url, const GURL& currently_committed_url,
bool started_in_foreground) { bool started_in_foreground) {
DCHECK(translate_metrics_logger_ != nullptr);
translate_metrics_logger_->OnPageLoadStart(started_in_foreground); translate_metrics_logger_->OnPageLoadStart(started_in_foreground);
return CONTINUE_OBSERVING; return CONTINUE_OBSERVING;
} }
...@@ -37,16 +45,12 @@ TranslatePageLoadMetricsObserver::OnStart( ...@@ -37,16 +45,12 @@ TranslatePageLoadMetricsObserver::OnStart(
page_load_metrics::PageLoadMetricsObserver::ObservePolicy page_load_metrics::PageLoadMetricsObserver::ObservePolicy
TranslatePageLoadMetricsObserver::OnHidden( TranslatePageLoadMetricsObserver::OnHidden(
const page_load_metrics::mojom::PageLoadTiming& timing) { const page_load_metrics::mojom::PageLoadTiming& timing) {
DCHECK(translate_metrics_logger_ != nullptr);
translate_metrics_logger_->OnForegroundChange(false); translate_metrics_logger_->OnForegroundChange(false);
return CONTINUE_OBSERVING; return CONTINUE_OBSERVING;
} }
page_load_metrics::PageLoadMetricsObserver::ObservePolicy page_load_metrics::PageLoadMetricsObserver::ObservePolicy
TranslatePageLoadMetricsObserver::OnShown() { TranslatePageLoadMetricsObserver::OnShown() {
DCHECK(translate_metrics_logger_ != nullptr);
translate_metrics_logger_->OnForegroundChange(true); translate_metrics_logger_->OnForegroundChange(true);
return CONTINUE_OBSERVING; return CONTINUE_OBSERVING;
} }
...@@ -54,15 +58,11 @@ TranslatePageLoadMetricsObserver::OnShown() { ...@@ -54,15 +58,11 @@ TranslatePageLoadMetricsObserver::OnShown() {
page_load_metrics::PageLoadMetricsObserver::ObservePolicy page_load_metrics::PageLoadMetricsObserver::ObservePolicy
TranslatePageLoadMetricsObserver::FlushMetricsOnAppEnterBackground( TranslatePageLoadMetricsObserver::FlushMetricsOnAppEnterBackground(
const page_load_metrics::mojom::PageLoadTiming& timing) { const page_load_metrics::mojom::PageLoadTiming& timing) {
DCHECK(translate_metrics_logger_ != nullptr);
translate_metrics_logger_->RecordMetrics(false); translate_metrics_logger_->RecordMetrics(false);
return CONTINUE_OBSERVING; return CONTINUE_OBSERVING;
} }
void TranslatePageLoadMetricsObserver::OnComplete( void TranslatePageLoadMetricsObserver::OnComplete(
const page_load_metrics::mojom::PageLoadTiming& timing) { const page_load_metrics::mojom::PageLoadTiming& timing) {
DCHECK(translate_metrics_logger_ != nullptr);
translate_metrics_logger_->RecordMetrics(true); translate_metrics_logger_->RecordMetrics(true);
} }
...@@ -24,7 +24,8 @@ class NavigationHandle; ...@@ -24,7 +24,8 @@ class NavigationHandle;
class TranslatePageLoadMetricsObserver class TranslatePageLoadMetricsObserver
: public page_load_metrics::PageLoadMetricsObserver { : public page_load_metrics::PageLoadMetricsObserver {
public: public:
static std::unique_ptr<TranslatePageLoadMetricsObserver> CreateIfNeeded(); static std::unique_ptr<TranslatePageLoadMetricsObserver> CreateIfNeeded(
content::WebContents* web_contents);
explicit TranslatePageLoadMetricsObserver( explicit TranslatePageLoadMetricsObserver(
std::unique_ptr<translate::TranslateMetricsLogger> std::unique_ptr<translate::TranslateMetricsLogger>
......
...@@ -167,8 +167,9 @@ void PageLoadMetricsEmbedder::RegisterEmbedderObservers( ...@@ -167,8 +167,9 @@ void PageLoadMetricsEmbedder::RegisterEmbedderObservers(
web_contents()->GetBrowserContext())); web_contents()->GetBrowserContext()));
tracker->AddObserver(std::make_unique<DataUseMetricsObserver>()); tracker->AddObserver(std::make_unique<DataUseMetricsObserver>());
std::unique_ptr<TranslatePageLoadMetricsObserver> translate_observer = std::unique_ptr<TranslatePageLoadMetricsObserver> translate_observer =
TranslatePageLoadMetricsObserver::CreateIfNeeded(); TranslatePageLoadMetricsObserver::CreateIfNeeded(
if (translate_observer != nullptr) tracker->GetWebContents());
if (translate_observer)
tracker->AddObserver(std::move(translate_observer)); tracker->AddObserver(std::move(translate_observer));
} }
......
...@@ -36,6 +36,8 @@ ...@@ -36,6 +36,8 @@
#include "components/translate/core/browser/translate_error_details.h" #include "components/translate/core/browser/translate_error_details.h"
#include "components/translate/core/browser/translate_init_details.h" #include "components/translate/core/browser/translate_init_details.h"
#include "components/translate/core/browser/translate_language_list.h" #include "components/translate/core/browser/translate_language_list.h"
#include "components/translate/core/browser/translate_metrics_logger.h"
#include "components/translate/core/browser/translate_metrics_logger_impl.h"
#include "components/translate/core/browser/translate_prefs.h" #include "components/translate/core/browser/translate_prefs.h"
#include "components/translate/core/browser/translate_ranker.h" #include "components/translate/core/browser/translate_ranker.h"
#include "components/translate/core/browser/translate_script.h" #include "components/translate/core/browser/translate_script.h"
...@@ -137,6 +139,8 @@ TranslateManager::TranslateManager(TranslateClient* translate_client, ...@@ -137,6 +139,8 @@ TranslateManager::TranslateManager(TranslateClient* translate_client,
translate_driver_(translate_client_->GetTranslateDriver()), translate_driver_(translate_client_->GetTranslateDriver()),
translate_ranker_(translate_ranker), translate_ranker_(translate_ranker),
language_model_(language_model), language_model_(language_model),
null_translate_metrics_logger_(
std::make_unique<NullTranslateMetricsLogger>()),
language_state_(translate_driver_), language_state_(translate_driver_),
translate_event_(std::make_unique<metrics::TranslateEventProto>()) {} translate_event_(std::make_unique<metrics::TranslateEventProto>()) {}
...@@ -1146,4 +1150,18 @@ void TranslateManager::SetPredefinedTargetLanguage( ...@@ -1146,4 +1150,18 @@ void TranslateManager::SetPredefinedTargetLanguage(
language_state_.SetPredefinedTargetLanguage(language_code); language_state_.SetPredefinedTargetLanguage(language_code);
} }
TranslateMetricsLogger* TranslateManager::GetActiveTranslateMetricsLogger() {
// If |active_translate_metrics_logger_| is not null, return that. Otherwise
// return |null_translate_metrics_logger_|. This way the callee doesn't have
// to check if the returned value is null.
return active_translate_metrics_logger_
? active_translate_metrics_logger_.get()
: null_translate_metrics_logger_.get();
}
void TranslateManager::RegisterTranslateMetricsLogger(
base::WeakPtr<TranslateMetricsLogger> translate_metrics_logger) {
active_translate_metrics_logger_ = translate_metrics_logger;
}
} // namespace translate } // namespace translate
...@@ -32,10 +32,13 @@ namespace translate { ...@@ -32,10 +32,13 @@ namespace translate {
class TranslateClient; class TranslateClient;
class TranslateDriver; class TranslateDriver;
class TranslateMetricsLogger;
class TranslatePrefs; class TranslatePrefs;
class TranslateRanker; class TranslateRanker;
struct TranslateTriggerDecision; struct TranslateTriggerDecision;
class NullTranslateMetricsLogger;
namespace testing { namespace testing {
class TranslateManagerTest; class TranslateManagerTest;
} // namespace testing } // namespace testing
...@@ -197,6 +200,17 @@ class TranslateManager { ...@@ -197,6 +200,17 @@ class TranslateManager {
// Sets target language. // Sets target language.
void SetPredefinedTargetLanguage(const std::string& language_code); void SetPredefinedTargetLanguage(const std::string& language_code);
// Returns a reference to |active_translate_metrics_logger_|. In the event
// that this value is null, a |NullTranslateMetricsLogger| (a null
// implementation) will be returned. This guarantees that the returned value
// is always non-null.
TranslateMetricsLogger* GetActiveTranslateMetricsLogger();
// Sets |active_translate_metrics_logger_| to the given
// |translate_metrics_logger|.
void RegisterTranslateMetricsLogger(
base::WeakPtr<TranslateMetricsLogger> translate_metrics_logger);
private: private:
friend class translate::testing::TranslateManagerTest; friend class translate::testing::TranslateManagerTest;
...@@ -306,6 +320,9 @@ class TranslateManager { ...@@ -306,6 +320,9 @@ class TranslateManager {
TranslateRanker* translate_ranker_; // Weak. TranslateRanker* translate_ranker_; // Weak.
language::LanguageModel* language_model_; // Weak. language::LanguageModel* language_model_; // Weak.
base::WeakPtr<TranslateMetricsLogger> active_translate_metrics_logger_;
std::unique_ptr<NullTranslateMetricsLogger> null_translate_metrics_logger_;
LanguageState language_state_; LanguageState language_state_;
std::unique_ptr<metrics::TranslateEventProto> translate_event_; std::unique_ptr<metrics::TranslateEventProto> translate_event_;
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include "components/translate/core/browser/translate_browser_metrics.h" #include "components/translate/core/browser/translate_browser_metrics.h"
#include "components/translate/core/browser/translate_client.h" #include "components/translate/core/browser/translate_client.h"
#include "components/translate/core/browser/translate_download_manager.h" #include "components/translate/core/browser/translate_download_manager.h"
#include "components/translate/core/browser/translate_metrics_logger_impl.h"
#include "components/translate/core/browser/translate_pref_names.h" #include "components/translate/core/browser/translate_pref_names.h"
#include "components/translate/core/browser/translate_prefs.h" #include "components/translate/core/browser/translate_prefs.h"
#include "components/translate/core/common/translate_constants.h" #include "components/translate/core/common/translate_constants.h"
...@@ -180,6 +181,10 @@ class TranslateManagerTest : public ::testing::Test { ...@@ -180,6 +181,10 @@ class TranslateManagerTest : public ::testing::Test {
translate_prefs_); translate_prefs_);
} }
NullTranslateMetricsLogger* null_translate_metrics_logger() {
return translate_manager_->null_translate_metrics_logger_.get();
}
// Required to instantiate a net::test::MockNetworkChangeNotifier, because it // Required to instantiate a net::test::MockNetworkChangeNotifier, because it
// uses ObserverListThreadSafe. // uses ObserverListThreadSafe.
base::test::TaskEnvironment task_environment_; base::test::TaskEnvironment task_environment_;
...@@ -1081,6 +1086,42 @@ TEST_F(TranslateManagerTest, InitiateManualTranslation) { ...@@ -1081,6 +1086,42 @@ TEST_F(TranslateManagerTest, InitiateManualTranslation) {
histogram_tester.ExpectTotalCount(kInitiationStatusName, 0); histogram_tester.ExpectTotalCount(kInitiationStatusName, 0);
} }
TEST_F(TranslateManagerTest, GetActiveTranslateMetricsLogger) {
PrepareTranslateManager();
std::unique_ptr<TranslateMetricsLogger> translate_metrics_logger_a =
std::make_unique<TranslateMetricsLoggerImpl>(
translate_manager_->GetWeakPtr());
std::unique_ptr<TranslateMetricsLogger> translate_metrics_logger_b =
std::make_unique<TranslateMetricsLoggerImpl>(
translate_manager_->GetWeakPtr());
// Before either |TranslateMetricsLogger| begins, we expect
// |GetActiveTranslateMetricsLogger| to return the null implementation.
EXPECT_EQ(translate_manager_->GetActiveTranslateMetricsLogger(),
null_translate_metrics_logger());
// Now that the page load has begun for |translate_metrics_logger_a|, we
// expect |GetActiveTranslateMetricsLogger| to return
// |translate_metrics_logger_a|.
translate_metrics_logger_a->OnPageLoadStart(true);
EXPECT_EQ(translate_manager_->GetActiveTranslateMetricsLogger(),
translate_metrics_logger_a.get());
// Once the page load starts for |translate_metrics_logger_b|, we
// expect |GetActiveTranslateMetricsLogger| to return
// |translate_metrics_logger_b|, even if |translate_metrics_logger_a| hasn't
// been destroyed yet.
translate_metrics_logger_b->OnPageLoadStart(true);
EXPECT_EQ(translate_manager_->GetActiveTranslateMetricsLogger(),
translate_metrics_logger_b.get());
// Once |translate_metrics_logger_b| is destroyed, we expect that
// |GetActiveTranslateMetricsLogger| to return the null implementation.
translate_metrics_logger_b.reset();
EXPECT_EQ(translate_manager_->GetActiveTranslateMetricsLogger(),
null_translate_metrics_logger());
}
} // namespace testing } // namespace testing
} // namespace translate } // namespace translate
...@@ -7,6 +7,8 @@ ...@@ -7,6 +7,8 @@
namespace translate { namespace translate {
class TranslateManager;
// TranslateMetricsLogger tracks and logs various UKM and UMA metrics for Chrome // TranslateMetricsLogger tracks and logs various UKM and UMA metrics for Chrome
// Translate over the course of a page load. // Translate over the course of a page load.
class TranslateMetricsLogger { class TranslateMetricsLogger {
...@@ -24,6 +26,11 @@ class TranslateMetricsLogger { ...@@ -24,6 +26,11 @@ class TranslateMetricsLogger {
// Logs all stored page load metrics. If is_final is |true| then RecordMetrics // Logs all stored page load metrics. If is_final is |true| then RecordMetrics
// won't be called again. // won't be called again.
virtual void RecordMetrics(bool is_final) = 0; virtual void RecordMetrics(bool is_final) = 0;
// TODO(curranmax): Split this into two interfaces. One for the interaction
// with the |TranslatePageLoadMetricsObserver|, and the other for the
// interaction with |TranslateManager| and the rest of the Translate code.
// https://crbug.com/1114868.
}; };
} // namespace translate } // namespace translate
......
...@@ -4,9 +4,21 @@ ...@@ -4,9 +4,21 @@
#include "components/translate/core/browser/translate_metrics_logger_impl.h" #include "components/translate/core/browser/translate_metrics_logger_impl.h"
#include "components/translate/core/browser/translate_manager.h"
namespace translate { namespace translate {
TranslateMetricsLoggerImpl::TranslateMetricsLoggerImpl(
base::WeakPtr<TranslateManager> translate_manager)
: translate_manager_(translate_manager) {}
TranslateMetricsLoggerImpl::~TranslateMetricsLoggerImpl() = default;
void TranslateMetricsLoggerImpl::OnPageLoadStart(bool is_foreground) { void TranslateMetricsLoggerImpl::OnPageLoadStart(bool is_foreground) {
if (translate_manager_)
translate_manager_->RegisterTranslateMetricsLogger(
weak_method_factory_.GetWeakPtr());
is_foreground_ = is_foreground; is_foreground_ = is_foreground;
} }
......
...@@ -7,16 +7,30 @@ ...@@ -7,16 +7,30 @@
#include <memory> #include <memory>
#include "base/memory/weak_ptr.h"
#include "components/translate/core/browser/translate_metrics_logger.h" #include "components/translate/core/browser/translate_metrics_logger.h"
namespace translate { namespace translate {
class NullTranslateMetricsLogger : public TranslateMetricsLogger {
public:
NullTranslateMetricsLogger() = default;
// TranslateMetricsLogger
void OnPageLoadStart(bool is_foreground) override {}
void OnForegroundChange(bool is_foreground) override {}
void RecordMetrics(bool is_final) override {}
};
class TranslateManager;
// TranslateMetricsLogger tracks and logs various UKM and UMA metrics for Chrome // TranslateMetricsLogger tracks and logs various UKM and UMA metrics for Chrome
// Translate over the course of a page load. // Translate over the course of a page load.
class TranslateMetricsLoggerImpl : public TranslateMetricsLogger { class TranslateMetricsLoggerImpl : public TranslateMetricsLogger {
public: public:
TranslateMetricsLoggerImpl() = default; explicit TranslateMetricsLoggerImpl(
~TranslateMetricsLoggerImpl() override = default; base::WeakPtr<TranslateManager> translate_manager);
~TranslateMetricsLoggerImpl() override;
TranslateMetricsLoggerImpl(const TranslateMetricsLoggerImpl&) = delete; TranslateMetricsLoggerImpl(const TranslateMetricsLoggerImpl&) = delete;
TranslateMetricsLoggerImpl& operator=(const TranslateMetricsLoggerImpl&) = TranslateMetricsLoggerImpl& operator=(const TranslateMetricsLoggerImpl&) =
...@@ -27,11 +41,11 @@ class TranslateMetricsLoggerImpl : public TranslateMetricsLogger { ...@@ -27,11 +41,11 @@ class TranslateMetricsLoggerImpl : public TranslateMetricsLogger {
void OnForegroundChange(bool is_foreground) override; void OnForegroundChange(bool is_foreground) override;
void RecordMetrics(bool is_final) override; void RecordMetrics(bool is_final) override;
// TODO(curranmax): Connect to TranslateManager so metrics can be collected
// from the rest of the Translate code. https://crbug.com/1114868.
// TODO(curranmax): Add appropriate functions for the Translate code to log // TODO(curranmax): Add appropriate functions for the Translate code to log
// relevant events. https://crbug.com/1114868. // relevant events. https://crbug.com/1114868.
private: private:
base::WeakPtr<TranslateManager> translate_manager_;
// Since |RecordMetrics()| can be called multiple times, such as when Chrome // Since |RecordMetrics()| can be called multiple times, such as when Chrome
// is backgrounded and reopened, we use |sequence_no_| to differentiate the // is backgrounded and reopened, we use |sequence_no_| to differentiate the
// recorded UKM protos. // recorded UKM protos.
...@@ -40,6 +54,8 @@ class TranslateMetricsLoggerImpl : public TranslateMetricsLogger { ...@@ -40,6 +54,8 @@ class TranslateMetricsLoggerImpl : public TranslateMetricsLogger {
// Tracks if the associated page is in the foreground (|true|) or the // Tracks if the associated page is in the foreground (|true|) or the
// background (|false|) // background (|false|)
bool is_foreground_{false}; bool is_foreground_{false};
base::WeakPtrFactory<TranslateMetricsLoggerImpl> weak_method_factory_{this};
}; };
} // namespace translate } // namespace translate
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment