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

Side by Side Diff: chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.cc

Issue 2756393002: Deflake ImageWriterUtilityClient browsertest and clients (Closed)
Patch Set: Remove progress case from Cancel test. Created 3 years, 9 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/extensions/api/image_writer_private/image_writer_utilit y_client.h" 5 #include "chrome/browser/extensions/api/image_writer_private/image_writer_utilit y_client.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/files/file_path.h" 8 #include "base/files/file_path.h"
9 #include "base/location.h" 9 #include "base/location.h"
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
11 #include "base/optional.h" 11 #include "base/optional.h"
12 #include "base/single_thread_task_runner.h" 12 #include "base/single_thread_task_runner.h"
13 #include "base/threading/thread_task_runner_handle.h" 13 #include "base/threading/thread_task_runner_handle.h"
14 #include "chrome/common/extensions/removable_storage_writer.mojom.h" 14 #include "chrome/common/extensions/removable_storage_writer.mojom.h"
15 #include "chrome/grit/generated_resources.h" 15 #include "chrome/grit/generated_resources.h"
16 #include "content/public/browser/browser_thread.h" 16 #include "content/public/browser/browser_thread.h"
17 #include "content/public/browser/utility_process_mojo_client.h" 17 #include "content/public/browser/utility_process_mojo_client.h"
18 #include "mojo/public/cpp/bindings/binding.h" 18 #include "mojo/public/cpp/bindings/binding.h"
19 #include "ui/base/l10n/l10n_util.h" 19 #include "ui/base/l10n/l10n_util.h"
20 20
21 class ImageWriterUtilityClient::RemovableStorageWriterClientImpl 21 class ImageWriterUtilityClient::RemovableStorageWriterClientImpl
22 : public extensions::mojom::RemovableStorageWriterClient { 22 : public extensions::mojom::RemovableStorageWriterClient {
23 public: 23 public:
24 RemovableStorageWriterClientImpl( 24 RemovableStorageWriterClientImpl(
25 ImageWriterUtilityClient* owner, 25 ImageWriterUtilityClient* owner,
26 extensions::mojom::RemovableStorageWriterClientPtr* interface) 26 extensions::mojom::RemovableStorageWriterClientPtr* interface)
27 : binding_(this, interface), image_writer_utility_client_(owner) { 27 : binding_(this, interface), image_writer_utility_client_(owner) {
28 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 28 DCHECK_CURRENTLY_ON(content::BrowserThread::FILE);
29 29
30 binding_.set_connection_error_handler( 30 binding_.set_connection_error_handler(
31 base::Bind(&ImageWriterUtilityClient::UtilityProcessError, 31 base::Bind(&ImageWriterUtilityClient::UtilityProcessError,
32 image_writer_utility_client_)); 32 image_writer_utility_client_));
33 } 33 }
34 34
35 ~RemovableStorageWriterClientImpl() override = default; 35 ~RemovableStorageWriterClientImpl() override = default;
36 36
37 private: 37 private:
38 void Progress(int64_t progress) override { 38 void Progress(int64_t progress) override {
39 image_writer_utility_client_->OperationProgress(progress); 39 image_writer_utility_client_->OperationProgress(progress);
40 } 40 }
41 41
42 void Complete(const base::Optional<std::string>& error) override { 42 void Complete(const base::Optional<std::string>& error) override {
43 if (error) { 43 if (error) {
44 image_writer_utility_client_->OperationFailed(error.value()); 44 image_writer_utility_client_->OperationFailed(error.value());
45 } else { 45 } else {
46 image_writer_utility_client_->OperationSucceeded(); 46 image_writer_utility_client_->OperationSucceeded();
47 } 47 }
48 } 48 }
49 49
50 mojo::Binding<extensions::mojom::RemovableStorageWriterClient> binding_; 50 mojo::Binding<extensions::mojom::RemovableStorageWriterClient> binding_;
51 // |image_writer_utility_client_| owns |this|. 51 // |image_writer_utility_client_| owns |this|.
52 ImageWriterUtilityClient* const image_writer_utility_client_; 52 ImageWriterUtilityClient* const image_writer_utility_client_;
53 53
54 DISALLOW_COPY_AND_ASSIGN(RemovableStorageWriterClientImpl); 54 DISALLOW_COPY_AND_ASSIGN(RemovableStorageWriterClientImpl);
55 }; 55 };
56 56
57 ImageWriterUtilityClient::ImageWriterUtilityClient() 57 ImageWriterUtilityClient::ImageWriterUtilityClient() = default;
58 : task_runner_(base::ThreadTaskRunnerHandle::Get()) {
59 }
60 58
61 ImageWriterUtilityClient::~ImageWriterUtilityClient() = default; 59 ImageWriterUtilityClient::~ImageWriterUtilityClient() = default;
62 60
63 void ImageWriterUtilityClient::Write(const ProgressCallback& progress_callback, 61 void ImageWriterUtilityClient::Write(const ProgressCallback& progress_callback,
64 const SuccessCallback& success_callback, 62 const SuccessCallback& success_callback,
65 const ErrorCallback& error_callback, 63 const ErrorCallback& error_callback,
66 const base::FilePath& source, 64 const base::FilePath& source,
67 const base::FilePath& target) { 65 const base::FilePath& target) {
68 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 66 DCHECK_CURRENTLY_ON(content::BrowserThread::FILE);
69 DCHECK(!removable_storage_writer_client_); 67 DCHECK(!removable_storage_writer_client_);
70 68
71 progress_callback_ = progress_callback; 69 progress_callback_ = progress_callback;
72 success_callback_ = success_callback; 70 success_callback_ = success_callback;
73 error_callback_ = error_callback; 71 error_callback_ = error_callback;
74 72
75 StartUtilityProcessIfNeeded(); 73 StartUtilityProcessIfNeeded();
76 74
77 extensions::mojom::RemovableStorageWriterClientPtr client; 75 extensions::mojom::RemovableStorageWriterClientPtr client;
78 removable_storage_writer_client_ = 76 removable_storage_writer_client_ =
79 base::MakeUnique<RemovableStorageWriterClientImpl>(this, &client); 77 base::MakeUnique<RemovableStorageWriterClientImpl>(this, &client);
80 78
81 utility_process_mojo_client_->service()->Write(source, target, 79 utility_process_mojo_client_->service()->Write(source, target,
82 std::move(client)); 80 std::move(client));
83 } 81 }
84 82
85 void ImageWriterUtilityClient::Verify(const ProgressCallback& progress_callback, 83 void ImageWriterUtilityClient::Verify(const ProgressCallback& progress_callback,
86 const SuccessCallback& success_callback, 84 const SuccessCallback& success_callback,
87 const ErrorCallback& error_callback, 85 const ErrorCallback& error_callback,
88 const base::FilePath& source, 86 const base::FilePath& source,
89 const base::FilePath& target) { 87 const base::FilePath& target) {
90 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 88 DCHECK_CURRENTLY_ON(content::BrowserThread::FILE);
91 DCHECK(!removable_storage_writer_client_); 89 DCHECK(!removable_storage_writer_client_);
92 90
93 progress_callback_ = progress_callback; 91 progress_callback_ = progress_callback;
94 success_callback_ = success_callback; 92 success_callback_ = success_callback;
95 error_callback_ = error_callback; 93 error_callback_ = error_callback;
96 94
97 StartUtilityProcessIfNeeded(); 95 StartUtilityProcessIfNeeded();
98 96
99 extensions::mojom::RemovableStorageWriterClientPtr client; 97 extensions::mojom::RemovableStorageWriterClientPtr client;
100 removable_storage_writer_client_ = 98 removable_storage_writer_client_ =
101 base::MakeUnique<RemovableStorageWriterClientImpl>(this, &client); 99 base::MakeUnique<RemovableStorageWriterClientImpl>(this, &client);
102 100
103 utility_process_mojo_client_->service()->Verify(source, target, 101 utility_process_mojo_client_->service()->Verify(source, target,
104 std::move(client)); 102 std::move(client));
105 } 103 }
106 104
107 void ImageWriterUtilityClient::Cancel(const CancelCallback& cancel_callback) { 105 void ImageWriterUtilityClient::Cancel(const CancelCallback& cancel_callback) {
108 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 106 DCHECK_CURRENTLY_ON(content::BrowserThread::FILE);
107 DCHECK(cancel_callback);
109 108
110 ResetRequest(); 109 ResetRequest();
111 task_runner_->PostTask(FROM_HERE, cancel_callback); 110 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, cancel_callback);
112 } 111 }
113 112
114 void ImageWriterUtilityClient::Shutdown() { 113 void ImageWriterUtilityClient::Shutdown() {
115 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 114 DCHECK_CURRENTLY_ON(content::BrowserThread::FILE);
116 115
117 ResetRequest(); 116 ResetRequest();
118 utility_process_mojo_client_.reset(); 117 utility_process_mojo_client_.reset();
119 } 118 }
120 119
121 void ImageWriterUtilityClient::StartUtilityProcessIfNeeded() { 120 void ImageWriterUtilityClient::StartUtilityProcessIfNeeded() {
122 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 121 DCHECK_CURRENTLY_ON(content::BrowserThread::FILE);
123 122
124 if (utility_process_mojo_client_) 123 if (utility_process_mojo_client_)
125 return; 124 return;
126 125
127 utility_process_mojo_client_ = 126 utility_process_mojo_client_ =
128 base::MakeUnique<content::UtilityProcessMojoClient< 127 base::MakeUnique<content::UtilityProcessMojoClient<
129 extensions::mojom::RemovableStorageWriter>>( 128 extensions::mojom::RemovableStorageWriter>>(
130 l10n_util::GetStringUTF16(IDS_UTILITY_PROCESS_IMAGE_WRITER_NAME)); 129 l10n_util::GetStringUTF16(IDS_UTILITY_PROCESS_IMAGE_WRITER_NAME));
131 utility_process_mojo_client_->set_error_callback( 130 utility_process_mojo_client_->set_error_callback(
132 base::Bind(&ImageWriterUtilityClient::UtilityProcessError, this)); 131 base::Bind(&ImageWriterUtilityClient::UtilityProcessError, this));
133 132
134 utility_process_mojo_client_->set_disable_sandbox(); 133 utility_process_mojo_client_->set_disable_sandbox();
135 #if defined(OS_WIN) 134 #if defined(OS_WIN)
136 utility_process_mojo_client_->set_run_elevated(); 135 utility_process_mojo_client_->set_run_elevated();
137 #endif 136 #endif
138 137
139 utility_process_mojo_client_->Start(); 138 utility_process_mojo_client_->Start();
140 } 139 }
141 140
142 void ImageWriterUtilityClient::UtilityProcessError() { 141 void ImageWriterUtilityClient::UtilityProcessError() {
143 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 142 DCHECK_CURRENTLY_ON(content::BrowserThread::FILE);
144 143
145 OperationFailed("Utility process crashed or failed."); 144 OperationFailed("Utility process crashed or failed.");
146 utility_process_mojo_client_.reset(); 145 utility_process_mojo_client_.reset();
147 } 146 }
148 147
149 void ImageWriterUtilityClient::OperationProgress(int64_t progress) { 148 void ImageWriterUtilityClient::OperationProgress(int64_t progress) {
150 if (progress_callback_) 149 if (progress_callback_)
151 task_runner_->PostTask(FROM_HERE, base::Bind(progress_callback_, progress)); 150 progress_callback_.Run(progress);
152 } 151 }
153 152
154 void ImageWriterUtilityClient::OperationSucceeded() { 153 void ImageWriterUtilityClient::OperationSucceeded() {
155 SuccessCallback success_callback = success_callback_; 154 SuccessCallback success_callback = success_callback_;
156 ResetRequest(); 155 ResetRequest();
157 if (success_callback) 156 if (success_callback)
158 task_runner_->PostTask(FROM_HERE, success_callback); 157 success_callback.Run();
159 } 158 }
160 159
161 void ImageWriterUtilityClient::OperationFailed(const std::string& error) { 160 void ImageWriterUtilityClient::OperationFailed(const std::string& error) {
162 ErrorCallback error_callback = error_callback_; 161 ErrorCallback error_callback = error_callback_;
163 ResetRequest(); 162 ResetRequest();
164 if (error_callback) 163 if (error_callback)
165 task_runner_->PostTask(FROM_HERE, base::Bind(error_callback, error)); 164 error_callback.Run(error);
166 } 165 }
167 166
168 void ImageWriterUtilityClient::ResetRequest() { 167 void ImageWriterUtilityClient::ResetRequest() {
169 removable_storage_writer_client_.reset(); 168 removable_storage_writer_client_.reset();
170 169
171 // Clear handlers to not hold any reference to the caller. 170 // Clear handlers to not hold any reference to the caller.
172 progress_callback_.Reset(); 171 progress_callback_.Reset();
173 success_callback_.Reset(); 172 success_callback_.Reset();
174 error_callback_.Reset(); 173 error_callback_.Reset();
175 } 174 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698