Index: chrome/renderer/media/chrome_key_systems_provider.cc |
diff --git a/chrome/renderer/media/chrome_key_systems_provider.cc b/chrome/renderer/media/chrome_key_systems_provider.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d53bd9dbe9a4f5ea122fef1251b10957719af85b |
--- /dev/null |
+++ b/chrome/renderer/media/chrome_key_systems_provider.cc |
@@ -0,0 +1,83 @@ |
+// Copyright 2017 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/renderer/media/chrome_key_systems_provider.h" |
+ |
+#include "base/time/default_tick_clock.h" |
+#include "chrome/renderer/media/chrome_key_systems.h" |
+ |
+#include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR. |
+ |
+namespace chrome { |
+ |
+ChromeKeySystemsProvider::ChromeKeySystemsProvider() |
+ : has_updated_(false), |
+ is_update_needed_(true), |
+ tick_clock_(new base::DefaultTickClock()) {} |
+ |
+ChromeKeySystemsProvider::~ChromeKeySystemsProvider() {} |
+ |
+void ChromeKeySystemsProvider::AddSupportedKeySystems( |
+ std::vector<std::unique_ptr<media::KeySystemProperties>>* key_systems) { |
+ DCHECK(key_systems); |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
+ if (!test_provider_.is_null()) { |
+ test_provider_.Run(key_systems); |
+ } else { |
+ AddChromeKeySystems(key_systems); |
+ } |
+ |
+ has_updated_ = true; |
+ last_update_time_ticks_ = tick_clock_->NowTicks(); |
+ |
+// Check whether all potentially supported key systems are supported. If so, |
+// no need to update again. |
+#if defined(WIDEVINE_CDM_AVAILABLE) && defined(WIDEVINE_CDM_IS_COMPONENT) |
+ for (const auto& properties : *key_systems) { |
+ if (properties->GetKeySystemName() == kWidevineKeySystem) { |
+ is_update_needed_ = false; |
+ } |
+ } |
+#else |
+ is_update_needed_ = false; |
+#endif |
+} |
+ |
+bool ChromeKeySystemsProvider::IsKeySystemsUpdateNeeded() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
+ // Always needs update if we have never updated, regardless the |
+ // |last_update_time_ticks_|'s initial value. |
+ if (!has_updated_) { |
+ DCHECK(is_update_needed_); |
+ return true; |
+ } |
+ |
+ if (!is_update_needed_) |
+ return false; |
+ |
+ // The update could be expensive. For example, it could involve a sync IPC to |
+ // the browser process. Use a minimum update interval to avoid unnecessarily |
+ // frequent update. |
+ static const int kMinUpdateIntervalInMilliseconds = 1000; |
+ if ((tick_clock_->NowTicks() - last_update_time_ticks_).InMilliseconds() < |
+ kMinUpdateIntervalInMilliseconds) { |
+ return false; |
+ } |
+ |
+ return true; |
+} |
+ |
+void ChromeKeySystemsProvider::SetTickClockForTesting( |
+ std::unique_ptr<base::TickClock> tick_clock) { |
+ tick_clock_.swap(tick_clock); |
+} |
+ |
+void ChromeKeySystemsProvider::SetProviderDelegateForTesting( |
+ const KeySystemsProviderDelegate& test_provider) { |
+ test_provider_ = test_provider; |
+} |
+ |
+} // namespace chrome |