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_