| Index: content/browser/webrtc/webrtc_internals.cc
|
| diff --git a/content/browser/webrtc/webrtc_internals.cc b/content/browser/webrtc/webrtc_internals.cc
|
| index 376cb139d2470bc4e5041f11c375920c4536c421..933d0a39f04301b83d75910c65b00700e13c739b 100644
|
| --- a/content/browser/webrtc/webrtc_internals.cc
|
| +++ b/content/browser/webrtc/webrtc_internals.cc
|
| @@ -17,10 +17,13 @@
|
| #include "content/public/browser/browser_thread.h"
|
| #include "content/public/browser/content_browser_client.h"
|
| #include "content/public/browser/web_contents.h"
|
| -#include "device/power_save_blocker/power_save_blocker.h"
|
| +#include "content/public/common/service_manager_connection.h"
|
| +#include "device/wake_lock/public/interfaces/wake_lock_provider.mojom.h"
|
| #include "ipc/ipc_platform_file.h"
|
| #include "media/audio/audio_manager.h"
|
| #include "media/media_features.h"
|
| +#include "services/device/public/interfaces/constants.mojom.h"
|
| +#include "services/service_manager/public/cpp/connector.h"
|
|
|
| #if defined(OS_WIN)
|
| #define IntToStringType base::IntToString16
|
| @@ -146,7 +149,7 @@ void WebRTCInternals::OnAddPeerConnection(int render_process_id,
|
|
|
| peer_connection_data_.Append(std::move(dict));
|
| ++num_open_connections_;
|
| - CreateOrReleasePowerSaveBlocker();
|
| + UpdateWakeLock();
|
|
|
| if (render_process_id_set_.insert(render_process_id).second) {
|
| RenderProcessHost* host = RenderProcessHost::FromID(render_process_id);
|
| @@ -464,7 +467,7 @@ void WebRTCInternals::OnRendererExit(int render_process_id) {
|
| peer_connection_data_.Remove(i, NULL);
|
| }
|
| }
|
| - CreateOrReleasePowerSaveBlocker();
|
| + UpdateWakeLock();
|
|
|
| bool found_any = false;
|
| // Iterates from the end of the list to remove the getUserMedia requests
|
| @@ -534,30 +537,49 @@ void WebRTCInternals::MaybeClosePeerConnection(base::DictionaryValue* record) {
|
| record->SetBoolean("isOpen", false);
|
| --num_open_connections_;
|
| DCHECK_GE(num_open_connections_, 0);
|
| - CreateOrReleasePowerSaveBlocker();
|
| + UpdateWakeLock();
|
| }
|
|
|
| -void WebRTCInternals::CreateOrReleasePowerSaveBlocker() {
|
| +void WebRTCInternals::UpdateWakeLock() {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| if (!should_block_power_saving_)
|
| return;
|
|
|
| - if (num_open_connections_ == 0 && power_save_blocker_) {
|
| - DVLOG(1) << ("Releasing the block on application suspension since no "
|
| - "PeerConnections are active anymore.");
|
| - power_save_blocker_.reset();
|
| - } else if (num_open_connections_ != 0 && !power_save_blocker_) {
|
| + if (num_open_connections_ == 0) {
|
| + DVLOG(1)
|
| + << ("Cancel the wake lock on application suspension since no "
|
| + "PeerConnections are active anymore.");
|
| + GetWakeLockService()->CancelWakeLock();
|
| + } else if (num_open_connections_ != 0) {
|
| DVLOG(1) << ("Preventing the application from being suspended while one or "
|
| "more PeerConnections are active.");
|
| - power_save_blocker_.reset(new device::PowerSaveBlocker(
|
| - device::PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension,
|
| - device::PowerSaveBlocker::kReasonOther,
|
| - "WebRTC has active PeerConnections",
|
| - BrowserThread::GetTaskRunnerForThread(BrowserThread::UI),
|
| - BrowserThread::GetTaskRunnerForThread(BrowserThread::FILE)));
|
| + GetWakeLockService()->RequestWakeLock();
|
| }
|
| }
|
|
|
| +device::mojom::WakeLockService* WebRTCInternals::GetWakeLockService() {
|
| + // Here is a lazy binding, and will not reconnect after connection error.
|
| + if (!wake_lock_service_) {
|
| + device::mojom::WakeLockServiceRequest request =
|
| + mojo::MakeRequest(&wake_lock_service_);
|
| + // In some testing contexts, the service manager connection isn't
|
| + // initialized.
|
| + if (ServiceManagerConnection::GetForProcess()) {
|
| + service_manager::Connector* connector =
|
| + ServiceManagerConnection::GetForProcess()->GetConnector();
|
| + DCHECK(connector);
|
| + device::mojom::WakeLockProviderPtr wake_lock_provider;
|
| + connector->BindInterface(device::mojom::kServiceName,
|
| + mojo::MakeRequest(&wake_lock_provider));
|
| + wake_lock_provider->GetWakeLockWithoutContext(
|
| + device::mojom::WakeLockType::PreventAppSuspension,
|
| + device::mojom::WakeLockReason::ReasonOther,
|
| + "WebRTC has active PeerConnections", std::move(request));
|
| + }
|
| + }
|
| + return wake_lock_service_.get();
|
| +}
|
| +
|
| void WebRTCInternals::ProcessPendingUpdates() {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| while (!pending_updates_.empty()) {
|
|
|