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

Unified Diff: chrome/browser/chromeos/arc/fileapi/arc_deferred_file_system_operation_runner.cc

Issue 2637163002: Defer ARC file system operations while ARC is booting. (Closed)
Patch Set: Addressed hidehiko's comments. Created 3 years, 11 months 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/chromeos/arc/fileapi/arc_deferred_file_system_operation_runner.cc
diff --git a/chrome/browser/chromeos/arc/fileapi/arc_deferred_file_system_operation_runner.cc b/chrome/browser/chromeos/arc/fileapi/arc_deferred_file_system_operation_runner.cc
new file mode 100644
index 0000000000000000000000000000000000000000..f1ac71a91a05aae27b294353ea3e930ebabde401
--- /dev/null
+++ b/chrome/browser/chromeos/arc/fileapi/arc_deferred_file_system_operation_runner.cc
@@ -0,0 +1,166 @@
+// 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/browser/chromeos/arc/fileapi/arc_deferred_file_system_operation_runner.h"
+
+#include "base/bind.h"
+#include "base/optional.h"
+#include "components/arc/arc_bridge_service.h"
+#include "content/public/browser/browser_thread.h"
+#include "url/gurl.h"
+
+using content::BrowserThread;
+
+namespace arc {
+
+ArcDeferredFileSystemOperationRunner::ArcDeferredFileSystemOperationRunner(
+ ArcBridgeService* bridge_service)
+ : ArcDeferredFileSystemOperationRunner(bridge_service, true) {}
+
+ArcDeferredFileSystemOperationRunner::ArcDeferredFileSystemOperationRunner(
+ ArcBridgeService* bridge_service,
+ bool observe_events)
+ : ArcFileSystemOperationRunner(bridge_service),
+ observe_events_(observe_events),
+ weak_ptr_factory_(this) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+ if (observe_events_) {
+ ArcSessionManager::Get()->AddObserver(this);
+ arc_bridge_service()->file_system()->AddObserver(this);
+ OnStateChanged();
+ }
+}
+
+ArcDeferredFileSystemOperationRunner::~ArcDeferredFileSystemOperationRunner() {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+ if (observe_events_) {
+ ArcSessionManager::Get()->RemoveObserver(this);
+ arc_bridge_service()->file_system()->RemoveObserver(this);
+ }
+ // On destruction, deferred operations are discarded.
+}
+
+void ArcDeferredFileSystemOperationRunner::GetFileSize(
+ const GURL& url,
+ const GetFileSizeCallback& callback) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ if (should_defer_) {
+ deferred_operations_.emplace_back(
+ base::Bind(&ArcDeferredFileSystemOperationRunner::GetFileSize,
+ weak_ptr_factory_.GetWeakPtr(), url, callback));
+ return;
+ }
+ auto* file_system_instance = ARC_GET_INSTANCE_FOR_METHOD(
+ arc_bridge_service()->file_system(), GetFileSize);
+ if (!file_system_instance) {
+ callback.Run(-1);
hashimoto 2017/01/23 08:28:42 Could you run the callback asynchronously here, us
Shuhei Takahashi 2017/01/23 09:17:51 Done.
+ return;
+ }
+ file_system_instance->GetFileSize(url.spec(), callback);
+}
+
+void ArcDeferredFileSystemOperationRunner::OpenFileToRead(
+ const GURL& url,
+ const OpenFileToReadCallback& callback) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ if (should_defer_) {
+ deferred_operations_.emplace_back(
+ base::Bind(&ArcDeferredFileSystemOperationRunner::OpenFileToRead,
+ weak_ptr_factory_.GetWeakPtr(), url, callback));
+ return;
+ }
+ auto* file_system_instance = ARC_GET_INSTANCE_FOR_METHOD(
+ arc_bridge_service()->file_system(), OpenFileToRead);
+ if (!file_system_instance) {
+ callback.Run(mojo::ScopedHandle());
+ return;
+ }
+ file_system_instance->OpenFileToRead(url.spec(), callback);
+}
+
+void ArcDeferredFileSystemOperationRunner::GetDocument(
+ const std::string& authority,
+ const std::string& document_id,
+ const GetDocumentCallback& callback) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ if (should_defer_) {
+ deferred_operations_.emplace_back(base::Bind(
+ &ArcDeferredFileSystemOperationRunner::GetDocument,
+ weak_ptr_factory_.GetWeakPtr(), authority, document_id, callback));
+ return;
+ }
+ auto* file_system_instance = ARC_GET_INSTANCE_FOR_METHOD(
+ arc_bridge_service()->file_system(), GetDocument);
+ if (!file_system_instance) {
+ callback.Run(mojom::DocumentPtr());
+ return;
+ }
+ file_system_instance->GetDocument(authority, document_id, callback);
+}
+
+void ArcDeferredFileSystemOperationRunner::GetChildDocuments(
+ const std::string& authority,
+ const std::string& parent_document_id,
+ const GetChildDocumentsCallback& callback) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ if (should_defer_) {
+ deferred_operations_.emplace_back(
+ base::Bind(&ArcDeferredFileSystemOperationRunner::GetChildDocuments,
+ weak_ptr_factory_.GetWeakPtr(), authority,
+ parent_document_id, callback));
+ return;
+ }
+ auto* file_system_instance = ARC_GET_INSTANCE_FOR_METHOD(
+ arc_bridge_service()->file_system(), GetChildDocuments);
+ if (!file_system_instance) {
+ callback.Run(base::nullopt);
+ return;
+ }
+ file_system_instance->GetChildDocuments(authority, parent_document_id,
+ callback);
+}
+
+void ArcDeferredFileSystemOperationRunner::OnArcOptInChanged(bool enabled) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ OnStateChanged();
+}
+
+void ArcDeferredFileSystemOperationRunner::OnInstanceReady() {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ OnStateChanged();
+}
+
+void ArcDeferredFileSystemOperationRunner::OnInstanceClosed() {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ OnStateChanged();
+}
+
+void ArcDeferredFileSystemOperationRunner::OnStateChanged() {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ SetShouldDefer(ArcSessionManager::Get()->IsArcEnabled() &&
+ !arc_bridge_service()->file_system()->has_instance());
+}
+
+void ArcDeferredFileSystemOperationRunner::SetShouldDefer(bool should_defer) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+ should_defer_ = should_defer;
+
+ if (should_defer_)
+ return;
+
+ // Run deferred operations.
+ std::vector<base::Closure> deferred_operations;
+ deferred_operations.swap(deferred_operations_);
+ for (const base::Closure& operation : deferred_operations) {
+ operation.Run();
+ }
+
+ // No deferred operations should be left at this point.
+ DCHECK(deferred_operations_.empty());
+}
+
+} // namespace arc

Powered by Google App Engine
This is Rietveld 408576698