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

Unified Diff: chrome/browser/translate/cld_data_harness_factory.cc

Issue 461633002: Refactor language detection logic to allow non-static CLD data sources. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Make some of the harness factory methods private Created 6 years, 1 month 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/translate/cld_data_harness_factory.cc
diff --git a/chrome/browser/translate/cld_data_harness_factory.cc b/chrome/browser/translate/cld_data_harness_factory.cc
new file mode 100644
index 0000000000000000000000000000000000000000..6ceafc53483c6247833d656ff18a15eac70df775
--- /dev/null
+++ b/chrome/browser/translate/cld_data_harness_factory.cc
@@ -0,0 +1,107 @@
+// Copyright 2014 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/translate/cld_data_harness_factory.h"
+
+#include "base/lazy_instance.h"
+#include "chrome/browser/translate/component_cld_data_harness.h"
+#include "chrome/browser/translate/standalone_cld_data_harness.h"
+#include "components/translate/content/browser/browser_cld_utils.h"
+#include "components/translate/content/common/cld_data_source.h"
+
+namespace {
+
+// This is the global instance managed by Get/Set
+test::CldDataHarnessFactory* g_instance = NULL;
+
+// The following three instances are used to "cheat" in Create(). Each of them
+// is just an instance of this class, but because they are singletons they can
+// be compared using "this" to pick different behaviors in Create() at runtime.
+// This avoids the need to explicitly define boilerplate classes with no
+// significant value.
+//
+// Embedders can of course specify a different implementation of this class
+// using Set(CldDataHarnessFactory*), in which case Create() will have whatever
+// custom behavior is desired.
+base::LazyInstance<test::CldDataHarnessFactory>::Leaky g_wrapped_component =
+ LAZY_INSTANCE_INITIALIZER;
+base::LazyInstance<test::CldDataHarnessFactory>::Leaky g_wrapped_standalone =
+ LAZY_INSTANCE_INITIALIZER;
+base::LazyInstance<test::CldDataHarnessFactory>::Leaky g_wrapped_static =
+ LAZY_INSTANCE_INITIALIZER;
+
+} // namespace
+
+namespace test {
+
+scoped_ptr<CldDataHarness> CldDataHarnessFactory::CreateCldDataHarness() {
+ // Cheat: Since the three "canned" implementations are all well-known, just
+ // check to see if "this" points to one of the singletons and then return
+ // the right answer. Embedder-provided CldDataHarnessFactory implementations
+ // will of course not have this behavior.
+ if (this == GetStaticDataHarnessFactory()) {
+ return CldDataHarness::CreateStaticDataHarness();
+ }
+ if (this == GetStandaloneDataHarnessFactory()) {
+ return CldDataHarness::CreateStandaloneDataHarness();
+ }
+ if (this == GetComponentDataHarnessFactory()) {
+ return CldDataHarness::CreateComponentDataHarness();
+ }
+
+ // Embedder did something wrong, failed to override this method.
+ NOTREACHED() << "Subclass failed to override CreateCldDataHarness()";
+ return CldDataHarness::CreateStaticDataHarness();
+}
+
+CldDataHarnessFactory* CldDataHarnessFactory::Get() {
+ // First honor any factory set by the embedder.
+ if (g_instance != NULL) return g_instance;
+
+ // Fall back to defaults: try to find a compatible harness for the currently-
+ // configured CldDataSource.
+ translate::BrowserCldUtils::ConfigureDefaultDataProvider();
+ if (translate::CldDataSource::IsUsingStaticDataSource()) {
+ return GetStaticDataHarnessFactory();
+ }
+ if (translate::CldDataSource::IsUsingComponentDataSource()) {
+ return GetComponentDataHarnessFactory();
+ }
+ if (translate::CldDataSource::IsUsingStandaloneDataSource()) {
+ return GetStandaloneDataHarnessFactory();
+ }
+
+ // The CldDataSource must have been set by an embedder, but the embedder has
+ // not configured a corresponding CldDataHarnessFactory. This is an error; the
+ // embedder must specify a harness that works with the corresponding
+ // CldDataSource. Crash for debug builds and return a no-op harness for
+ // everything else.
+ NOTREACHED() << "No CLD data harness factory was configured!";
+ return GetStaticDataHarnessFactory();
+}
+
+// static
+void CldDataHarnessFactory::Set(CldDataHarnessFactory* instance) {
+ g_instance = instance;
+}
+
+// static
+CldDataHarnessFactory*
+CldDataHarnessFactory::GetStaticDataHarnessFactory() {
+ return &g_wrapped_static.Get();
+}
+
+// static
+CldDataHarnessFactory*
+CldDataHarnessFactory::GetStandaloneDataHarnessFactory() {
+ return &g_wrapped_standalone.Get();
+}
+
+// static
+CldDataHarnessFactory*
+CldDataHarnessFactory::GetComponentDataHarnessFactory() {
+ return &g_wrapped_component.Get();
+}
+
+} // namespace test
« no previous file with comments | « chrome/browser/translate/cld_data_harness_factory.h ('k') | chrome/browser/translate/component_cld_data_harness.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698