Convert PowerSaveBlockResourceThrottle to be client of WakeLock mojo service.
Wake Lock is a Mojo interface that wraps PowerSaveBlocker. As part of the
creation of standalone Device Service, all browser-side clients of
PowerSaveBlocker should be converted to be clients of the Wake Lock Mojo
interface instead.
BUG=689410
[email protected], for mechanical changes to //content/browser/BUILD.gn
Review-Url: https://codereview.chromium.org/2893873002
Cr-Commit-Position: refs/heads/master@{#473076}
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index 5bc5787..785f909 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -892,8 +892,6 @@
"loader/netlog_observer.h",
"loader/null_resource_controller.cc",
"loader/null_resource_controller.h",
- "loader/power_save_block_resource_throttle.cc",
- "loader/power_save_block_resource_throttle.h",
"loader/redirect_to_file_resource_handler.cc",
"loader/redirect_to_file_resource_handler.h",
"loader/resource_buffer.cc",
@@ -935,6 +933,8 @@
"loader/upload_progress_tracker.h",
"loader/url_loader_factory_impl.cc",
"loader/url_loader_factory_impl.h",
+ "loader/wake_lock_resource_throttle.cc",
+ "loader/wake_lock_resource_throttle.h",
"loader_delegate_impl.cc",
"loader_delegate_impl.h",
"mach_broker_mac.h",
diff --git a/content/browser/loader/DEPS b/content/browser/loader/DEPS
index 59fe4dd..191c9259b 100644
--- a/content/browser/loader/DEPS
+++ b/content/browser/loader/DEPS
@@ -108,11 +108,6 @@
"+content/public/browser/browser_thread.h", # Only for DCHECK.
"+content/public/common/resource_devtools_info.h",
],
- "power_save_block_resource_throttle\.(cc|h)": [
- "-content",
- "+content/browser/loader/power_save_block_resource_throttle.h",
- "+content/public/browser/resource_throttle.h",
- ],
"resource_dispatcher_host_impl\.(cc|h)": [
"-content",
"+content/browser/loader/async_resource_handler.h",
@@ -120,7 +115,6 @@
"+content/browser/loader/loader_delegate.h",
"+content/browser/loader/mojo_async_resource_handler.h",
"+content/browser/loader/null_resource_controller.h",
- "+content/browser/loader/power_save_block_resource_throttle.h",
"+content/browser/loader/resource_dispatcher_host_impl.h",
"+content/browser/loader/resource_loader.h",
"+content/browser/loader/resource_loader_delegate.h",
@@ -131,6 +125,7 @@
"+content/browser/loader/stream_resource_handler.h",
"+content/browser/loader/sync_resource_handler.h",
"+content/browser/loader/throttling_resource_handler.h",
+ "+content/browser/loader/wake_lock_resource_throttle.h",
"+content/common/resource_request_body.h",
"+content/common/resource_request_body_impl.h",
"+content/common/url_loader.mojom.h",
@@ -349,4 +344,11 @@
#TODO: To be removed when PlzNavigate lands.
"+content/browser/loader/navigation_resource_throttle.h"
],
+ "wake_lock_resource_throttle\.(cc|h)": [
+ "-content",
+ "+content/browser/loader/wake_lock_resource_throttle.h",
+ "+content/browser/service_manager/service_manager_context.h",
+ "+content/public/browser/browser_thread.h",
+ "+content/public/browser/resource_throttle.h",
+ ],
}
diff --git a/content/browser/loader/power_save_block_resource_throttle.cc b/content/browser/loader/power_save_block_resource_throttle.cc
deleted file mode 100644
index 1af02c5..0000000
--- a/content/browser/loader/power_save_block_resource_throttle.cc
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (c) 2013 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 "content/browser/loader/power_save_block_resource_throttle.h"
-
-#include "device/power_save_blocker/power_save_blocker.h"
-
-namespace content {
-
-namespace {
-
-const int kPowerSaveBlockDelaySeconds = 30;
-
-} // namespace
-
-PowerSaveBlockResourceThrottle::PowerSaveBlockResourceThrottle(
- const std::string& host,
- scoped_refptr<base::SequencedTaskRunner> ui_task_runner,
- scoped_refptr<base::SingleThreadTaskRunner> blocking_task_runner)
- : host_(host),
- ui_task_runner_(ui_task_runner),
- blocking_task_runner_(blocking_task_runner) {}
-
-PowerSaveBlockResourceThrottle::~PowerSaveBlockResourceThrottle() {
-}
-
-void PowerSaveBlockResourceThrottle::WillStartRequest(bool* defer) {
- // Delay PowerSaveBlocker activation to dismiss small requests.
- timer_.Start(FROM_HERE,
- base::TimeDelta::FromSeconds(kPowerSaveBlockDelaySeconds),
- this,
- &PowerSaveBlockResourceThrottle::ActivatePowerSaveBlocker);
-}
-
-void PowerSaveBlockResourceThrottle::WillProcessResponse(bool* defer) {
- // Stop blocking power save after request finishes.
- power_save_blocker_.reset();
- timer_.Stop();
-}
-
-const char* PowerSaveBlockResourceThrottle::GetNameForLogging() const {
- return "PowerSaveBlockResourceThrottle";
-}
-
-void PowerSaveBlockResourceThrottle::ActivatePowerSaveBlocker() {
- power_save_blocker_.reset(new device::PowerSaveBlocker(
- device::PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension,
- device::PowerSaveBlocker::kReasonOther, "Uploading data to " + host_,
- ui_task_runner_, blocking_task_runner_));
-}
-
-} // namespace content
diff --git a/content/browser/loader/power_save_block_resource_throttle.h b/content/browser/loader/power_save_block_resource_throttle.h
deleted file mode 100644
index 67b8a9f..0000000
--- a/content/browser/loader/power_save_block_resource_throttle.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (c) 2013 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 CONTENT_BROWSER_LOADER_POWER_SAVE_BLOCK_RESOURCE_THROTTLE_H_
-#define CONTENT_BROWSER_LOADER_POWER_SAVE_BLOCK_RESOURCE_THROTTLE_H_
-
-#include <memory>
-#include <string>
-
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/sequenced_task_runner.h"
-#include "base/single_thread_task_runner.h"
-#include "base/timer/timer.h"
-#include "content/public/browser/resource_throttle.h"
-
-namespace device {
-class PowerSaveBlocker;
-} // namespace device
-
-namespace content {
-
-// This ResourceThrottle blocks power save until large upload request finishes.
-class PowerSaveBlockResourceThrottle : public ResourceThrottle {
- public:
- PowerSaveBlockResourceThrottle(
- const std::string& host,
- scoped_refptr<base::SequencedTaskRunner> ui_task_runner,
- scoped_refptr<base::SingleThreadTaskRunner> blocking_task_runner);
- ~PowerSaveBlockResourceThrottle() override;
-
- // ResourceThrottle overrides:
- void WillStartRequest(bool* defer) override;
- void WillProcessResponse(bool* defer) override;
- const char* GetNameForLogging() const override;
-
- private:
- void ActivatePowerSaveBlocker();
-
- const std::string host_;
- base::OneShotTimer timer_;
- std::unique_ptr<device::PowerSaveBlocker> power_save_blocker_;
- scoped_refptr<base::SequencedTaskRunner> ui_task_runner_;
- scoped_refptr<base::SingleThreadTaskRunner> blocking_task_runner_;
-
- DISALLOW_COPY_AND_ASSIGN(PowerSaveBlockResourceThrottle);
-};
-
-} // namespace content
-
-#endif // CONTENT_BROWSER_LOADER_POWER_SAVE_BLOCK_RESOURCE_THROTTLE_H_
diff --git a/content/browser/loader/resource_dispatcher_host_impl.cc b/content/browser/loader/resource_dispatcher_host_impl.cc
index 674e0321..3fdda26 100644
--- a/content/browser/loader/resource_dispatcher_host_impl.cc
+++ b/content/browser/loader/resource_dispatcher_host_impl.cc
@@ -51,7 +51,6 @@
#include "content/browser/loader/navigation_resource_throttle.h"
#include "content/browser/loader/navigation_url_loader_impl_core.h"
#include "content/browser/loader/null_resource_controller.h"
-#include "content/browser/loader/power_save_block_resource_throttle.h"
#include "content/browser/loader/redirect_to_file_resource_handler.h"
#include "content/browser/loader/resource_loader.h"
#include "content/browser/loader/resource_message_filter.h"
@@ -62,6 +61,7 @@
#include "content/browser/loader/sync_resource_handler.h"
#include "content/browser/loader/throttling_resource_handler.h"
#include "content/browser/loader/upload_data_stream_builder.h"
+#include "content/browser/loader/wake_lock_resource_throttle.h"
#include "content/browser/resource_context_impl.h"
#include "content/browser/service_worker/foreign_fetch_request_handler.h"
#include "content/browser/service_worker/link_header_support.h"
@@ -1550,10 +1550,9 @@
}
if (request->has_upload()) {
- // Block power save while uploading data.
- throttles.push_back(base::MakeUnique<PowerSaveBlockResourceThrottle>(
- request->url().host(), main_thread_task_runner_,
- BrowserThread::GetTaskRunnerForThread(BrowserThread::FILE)));
+ // Request wake lock while uploading data.
+ throttles.push_back(
+ base::MakeUnique<WakeLockResourceThrottle>(request->url().host()));
}
// TODO(ricea): Stop looking this up so much.
diff --git a/content/browser/loader/wake_lock_resource_throttle.cc b/content/browser/loader/wake_lock_resource_throttle.cc
new file mode 100644
index 0000000..6d9594f
--- /dev/null
+++ b/content/browser/loader/wake_lock_resource_throttle.cc
@@ -0,0 +1,70 @@
+// Copyright (c) 2013 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 "content/browser/loader/wake_lock_resource_throttle.h"
+
+#include "content/browser/service_manager/service_manager_context.h"
+#include "content/public/browser/browser_thread.h"
+#include "device/wake_lock/public/interfaces/wake_lock_provider.mojom.h"
+#include "mojo/public/cpp/bindings/interface_request.h"
+#include "services/device/public/interfaces/constants.mojom.h"
+#include "services/service_manager/public/cpp/connector.h"
+
+namespace content {
+
+namespace {
+
+const int kWakeLockDelaySeconds = 30;
+
+} // namespace
+
+WakeLockResourceThrottle::WakeLockResourceThrottle(const std::string& host)
+ : host_(host) {}
+
+WakeLockResourceThrottle::~WakeLockResourceThrottle() {}
+
+void WakeLockResourceThrottle::WillStartRequest(bool* defer) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+
+ // Delay wake lock request to dismiss small requests.
+ timer_.Start(FROM_HERE, base::TimeDelta::FromSeconds(kWakeLockDelaySeconds),
+ this, &WakeLockResourceThrottle::RequestWakeLock);
+}
+
+void WakeLockResourceThrottle::WillProcessResponse(bool* defer) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+
+ // Cancel wake lock after request finishes.
+ if (wake_lock_)
+ wake_lock_->CancelWakeLock();
+
+ timer_.Stop();
+}
+
+const char* WakeLockResourceThrottle::GetNameForLogging() const {
+ return "WakeLockResourceThrottle";
+}
+
+void WakeLockResourceThrottle::RequestWakeLock() {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+ DCHECK(!wake_lock_);
+
+ service_manager::Connector* connector =
+ ServiceManagerContext::GetConnectorForIOThread();
+ // |connector| might be nullptr in some testing contexts, in which the
+ // service manager connection isn't initialized.
+ if (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,
+ "Uploading data to " + host_, mojo::MakeRequest(&wake_lock_));
+
+ wake_lock_->RequestWakeLock();
+ }
+}
+
+} // namespace content
diff --git a/content/browser/loader/wake_lock_resource_throttle.h b/content/browser/loader/wake_lock_resource_throttle.h
new file mode 100644
index 0000000..1bef48c
--- /dev/null
+++ b/content/browser/loader/wake_lock_resource_throttle.h
@@ -0,0 +1,46 @@
+// Copyright (c) 2013 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 CONTENT_BROWSER_LOADER_WAKE_LOCK_RESOURCE_THROTTLE_H_
+#define CONTENT_BROWSER_LOADER_WAKE_LOCK_RESOURCE_THROTTLE_H_
+
+#include <memory>
+#include <string>
+
+#include "base/compiler_specific.h"
+#include "base/macros.h"
+#include "base/timer/timer.h"
+#include "content/public/browser/resource_throttle.h"
+#include "device/wake_lock/public/interfaces/wake_lock_service.mojom.h"
+
+namespace content {
+
+// This ResourceThrottle holds wake lock until large upload request finishes.
+class WakeLockResourceThrottle : public ResourceThrottle {
+ public:
+ WakeLockResourceThrottle(const std::string& host);
+ ~WakeLockResourceThrottle() override;
+
+ // ResourceThrottle overrides:
+ void WillStartRequest(bool* defer) override;
+ void WillProcessResponse(bool* defer) override;
+ const char* GetNameForLogging() const override;
+
+ private:
+ void RequestWakeLock();
+
+ const std::string host_;
+ base::OneShotTimer timer_;
+
+ // Destruction of wake_lock_ will trigger
+ // WakeLockServicImpl::OnConnectionError on the service side, so there is no
+ // need to call CancelWakeLock() in the destructor.
+ device::mojom::WakeLockServicePtr wake_lock_;
+
+ DISALLOW_COPY_AND_ASSIGN(WakeLockResourceThrottle);
+};
+
+} // namespace content
+
+#endif // CONTENT_BROWSER_LOADER_WAKE_LOCK_RESOURCE_THROTTLE_H_