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

Side by Side Diff: content/browser/background_sync/background_sync_manager.cc

Issue 1874893002: Convert //content/browser from scoped_ptr to std::unique_ptr (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "content/browser/background_sync/background_sync_manager.h" 5 #include "content/browser/background_sync/background_sync_manager.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/barrier_closure.h" 9 #include "base/barrier_closure.h"
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/location.h" 11 #include "base/location.h"
12 #include "base/memory/ptr_util.h"
12 #include "base/single_thread_task_runner.h" 13 #include "base/single_thread_task_runner.h"
13 #include "base/thread_task_runner_handle.h" 14 #include "base/thread_task_runner_handle.h"
14 #include "base/time/default_clock.h" 15 #include "base/time/default_clock.h"
15 #include "build/build_config.h" 16 #include "build/build_config.h"
16 #include "content/browser/background_sync/background_sync_metrics.h" 17 #include "content/browser/background_sync/background_sync_metrics.h"
17 #include "content/browser/background_sync/background_sync_network_observer.h" 18 #include "content/browser/background_sync/background_sync_network_observer.h"
18 #include "content/browser/background_sync/background_sync_registration_options.h " 19 #include "content/browser/background_sync/background_sync_registration_options.h "
19 #include "content/browser/service_worker/service_worker_context_wrapper.h" 20 #include "content/browser/service_worker/service_worker_context_wrapper.h"
20 #include "content/browser/service_worker/service_worker_storage.h" 21 #include "content/browser/service_worker/service_worker_storage.h"
21 #include "content/browser/storage_partition_impl.h" 22 #include "content/browser/storage_partition_impl.h"
(...skipping 17 matching lines...) Expand all
39 const char kBackgroundSyncUserDataKey[] = "BackgroundSyncUserData"; 40 const char kBackgroundSyncUserDataKey[] = "BackgroundSyncUserData";
40 41
41 void RecordFailureAndPostError( 42 void RecordFailureAndPostError(
42 BackgroundSyncStatus status, 43 BackgroundSyncStatus status,
43 const BackgroundSyncManager::StatusAndRegistrationCallback& callback) { 44 const BackgroundSyncManager::StatusAndRegistrationCallback& callback) {
44 BackgroundSyncMetrics::CountRegisterFailure(status); 45 BackgroundSyncMetrics::CountRegisterFailure(status);
45 46
46 base::ThreadTaskRunnerHandle::Get()->PostTask( 47 base::ThreadTaskRunnerHandle::Get()->PostTask(
47 FROM_HERE, 48 FROM_HERE,
48 base::Bind(callback, status, 49 base::Bind(callback, status,
49 base::Passed(scoped_ptr<BackgroundSyncRegistration>()))); 50 base::Passed(std::unique_ptr<BackgroundSyncRegistration>())));
50 } 51 }
51 52
52 // Returns nullptr if the browser context cannot be accessed for any reason. 53 // Returns nullptr if the browser context cannot be accessed for any reason.
53 BrowserContext* GetBrowserContextOnUIThread( 54 BrowserContext* GetBrowserContextOnUIThread(
54 const scoped_refptr<ServiceWorkerContextWrapper>& service_worker_context) { 55 const scoped_refptr<ServiceWorkerContextWrapper>& service_worker_context) {
55 DCHECK_CURRENTLY_ON(BrowserThread::UI); 56 DCHECK_CURRENTLY_ON(BrowserThread::UI);
56 57
57 if (!service_worker_context) 58 if (!service_worker_context)
58 return nullptr; 59 return nullptr;
59 StoragePartitionImpl* storage_partition_impl = 60 StoragePartitionImpl* storage_partition_impl =
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 int64_t min_ms) { 120 int64_t min_ms) {
120 DCHECK_CURRENTLY_ON(BrowserThread::UI); 121 DCHECK_CURRENTLY_ON(BrowserThread::UI);
121 122
122 BackgroundSyncController* background_sync_controller = 123 BackgroundSyncController* background_sync_controller =
123 GetBackgroundSyncControllerOnUIThread(sw_context_wrapper); 124 GetBackgroundSyncControllerOnUIThread(sw_context_wrapper);
124 if (background_sync_controller) { 125 if (background_sync_controller) {
125 background_sync_controller->RunInBackground(enabled, min_ms); 126 background_sync_controller->RunInBackground(enabled, min_ms);
126 } 127 }
127 } 128 }
128 129
129 scoped_ptr<BackgroundSyncParameters> GetControllerParameters( 130 std::unique_ptr<BackgroundSyncParameters> GetControllerParameters(
130 const scoped_refptr<ServiceWorkerContextWrapper>& sw_context_wrapper, 131 const scoped_refptr<ServiceWorkerContextWrapper>& sw_context_wrapper,
131 scoped_ptr<BackgroundSyncParameters> parameters) { 132 std::unique_ptr<BackgroundSyncParameters> parameters) {
132 DCHECK_CURRENTLY_ON(BrowserThread::UI); 133 DCHECK_CURRENTLY_ON(BrowserThread::UI);
133 134
134 BackgroundSyncController* background_sync_controller = 135 BackgroundSyncController* background_sync_controller =
135 GetBackgroundSyncControllerOnUIThread(sw_context_wrapper); 136 GetBackgroundSyncControllerOnUIThread(sw_context_wrapper);
136 137
137 if (!background_sync_controller) { 138 if (!background_sync_controller) {
138 // If there is no controller then BackgroundSync can't run in the 139 // If there is no controller then BackgroundSync can't run in the
139 // background, disable it. 140 // background, disable it.
140 parameters->disable = true; 141 parameters->disable = true;
141 return parameters; 142 return parameters;
(...skipping 24 matching lines...) Expand all
166 } 167 }
167 168
168 BackgroundSyncManager::BackgroundSyncRegistrations::BackgroundSyncRegistrations( 169 BackgroundSyncManager::BackgroundSyncRegistrations::BackgroundSyncRegistrations(
169 const BackgroundSyncRegistrations& other) = default; 170 const BackgroundSyncRegistrations& other) = default;
170 171
171 BackgroundSyncManager::BackgroundSyncRegistrations:: 172 BackgroundSyncManager::BackgroundSyncRegistrations::
172 ~BackgroundSyncRegistrations() { 173 ~BackgroundSyncRegistrations() {
173 } 174 }
174 175
175 // static 176 // static
176 scoped_ptr<BackgroundSyncManager> BackgroundSyncManager::Create( 177 std::unique_ptr<BackgroundSyncManager> BackgroundSyncManager::Create(
177 const scoped_refptr<ServiceWorkerContextWrapper>& service_worker_context) { 178 const scoped_refptr<ServiceWorkerContextWrapper>& service_worker_context) {
178 DCHECK_CURRENTLY_ON(BrowserThread::IO); 179 DCHECK_CURRENTLY_ON(BrowserThread::IO);
179 180
180 BackgroundSyncManager* sync_manager = 181 BackgroundSyncManager* sync_manager =
181 new BackgroundSyncManager(service_worker_context); 182 new BackgroundSyncManager(service_worker_context);
182 sync_manager->Init(); 183 sync_manager->Init();
183 return make_scoped_ptr(sync_manager); 184 return base::WrapUnique(sync_manager);
184 } 185 }
185 186
186 BackgroundSyncManager::~BackgroundSyncManager() { 187 BackgroundSyncManager::~BackgroundSyncManager() {
187 DCHECK_CURRENTLY_ON(BrowserThread::IO); 188 DCHECK_CURRENTLY_ON(BrowserThread::IO);
188 189
189 service_worker_context_->RemoveObserver(this); 190 service_worker_context_->RemoveObserver(this);
190 } 191 }
191 192
192 void BackgroundSyncManager::Register( 193 void BackgroundSyncManager::Register(
193 int64_t sw_registration_id, 194 int64_t sw_registration_id,
(...skipping 15 matching lines...) Expand all
209 void BackgroundSyncManager::GetRegistrations( 210 void BackgroundSyncManager::GetRegistrations(
210 int64_t sw_registration_id, 211 int64_t sw_registration_id,
211 const StatusAndRegistrationsCallback& callback) { 212 const StatusAndRegistrationsCallback& callback) {
212 DCHECK_CURRENTLY_ON(BrowserThread::IO); 213 DCHECK_CURRENTLY_ON(BrowserThread::IO);
213 214
214 if (disabled_) { 215 if (disabled_) {
215 base::ThreadTaskRunnerHandle::Get()->PostTask( 216 base::ThreadTaskRunnerHandle::Get()->PostTask(
216 FROM_HERE, 217 FROM_HERE,
217 base::Bind( 218 base::Bind(
218 callback, BACKGROUND_SYNC_STATUS_STORAGE_ERROR, 219 callback, BACKGROUND_SYNC_STATUS_STORAGE_ERROR,
219 base::Passed(scoped_ptr<ScopedVector<BackgroundSyncRegistration>>( 220 base::Passed(
220 new ScopedVector<BackgroundSyncRegistration>())))); 221 std::unique_ptr<ScopedVector<BackgroundSyncRegistration>>(
222 new ScopedVector<BackgroundSyncRegistration>()))));
221 return; 223 return;
222 } 224 }
223 225
224 op_scheduler_.ScheduleOperation( 226 op_scheduler_.ScheduleOperation(
225 base::Bind(&BackgroundSyncManager::GetRegistrationsImpl, 227 base::Bind(&BackgroundSyncManager::GetRegistrationsImpl,
226 weak_ptr_factory_.GetWeakPtr(), sw_registration_id, 228 weak_ptr_factory_.GetWeakPtr(), sw_registration_id,
227 MakeStatusAndRegistrationsCompletion(callback))); 229 MakeStatusAndRegistrationsCompletion(callback)));
228 } 230 }
229 231
230 void BackgroundSyncManager::OnRegistrationDeleted(int64_t sw_registration_id, 232 void BackgroundSyncManager::OnRegistrationDeleted(int64_t sw_registration_id,
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
293 295
294 void BackgroundSyncManager::InitImpl(const base::Closure& callback) { 296 void BackgroundSyncManager::InitImpl(const base::Closure& callback) {
295 DCHECK_CURRENTLY_ON(BrowserThread::IO); 297 DCHECK_CURRENTLY_ON(BrowserThread::IO);
296 298
297 if (disabled_) { 299 if (disabled_) {
298 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, 300 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
299 base::Bind(callback)); 301 base::Bind(callback));
300 return; 302 return;
301 } 303 }
302 304
303 scoped_ptr<BackgroundSyncParameters> parameters_copy( 305 std::unique_ptr<BackgroundSyncParameters> parameters_copy(
304 new BackgroundSyncParameters(*parameters_)); 306 new BackgroundSyncParameters(*parameters_));
305 307
306 BrowserThread::PostTaskAndReplyWithResult( 308 BrowserThread::PostTaskAndReplyWithResult(
307 BrowserThread::UI, FROM_HERE, 309 BrowserThread::UI, FROM_HERE,
308 base::Bind(&GetControllerParameters, service_worker_context_, 310 base::Bind(&GetControllerParameters, service_worker_context_,
309 base::Passed(std::move(parameters_copy))), 311 base::Passed(std::move(parameters_copy))),
310 base::Bind(&BackgroundSyncManager::InitDidGetControllerParameters, 312 base::Bind(&BackgroundSyncManager::InitDidGetControllerParameters,
311 weak_ptr_factory_.GetWeakPtr(), callback)); 313 weak_ptr_factory_.GetWeakPtr(), callback));
312 } 314 }
313 315
314 void BackgroundSyncManager::InitDidGetControllerParameters( 316 void BackgroundSyncManager::InitDidGetControllerParameters(
315 const base::Closure& callback, 317 const base::Closure& callback,
316 scoped_ptr<BackgroundSyncParameters> updated_parameters) { 318 std::unique_ptr<BackgroundSyncParameters> updated_parameters) {
317 DCHECK_CURRENTLY_ON(BrowserThread::IO); 319 DCHECK_CURRENTLY_ON(BrowserThread::IO);
318 320
319 parameters_ = std::move(updated_parameters); 321 parameters_ = std::move(updated_parameters);
320 if (parameters_->disable) { 322 if (parameters_->disable) {
321 disabled_ = true; 323 disabled_ = true;
322 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, 324 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
323 base::Bind(callback)); 325 base::Bind(callback));
324 return; 326 return;
325 } 327 }
326 328
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
502 BackgroundSyncMetrics::REGISTRATION_IS_DUPLICATE); 504 BackgroundSyncMetrics::REGISTRATION_IS_DUPLICATE);
503 505
504 if (existing_registration->IsFiring()) { 506 if (existing_registration->IsFiring()) {
505 existing_registration->set_sync_state( 507 existing_registration->set_sync_state(
506 mojom::BackgroundSyncState::REREGISTERED_WHILE_FIRING); 508 mojom::BackgroundSyncState::REREGISTERED_WHILE_FIRING);
507 } 509 }
508 510
509 base::ThreadTaskRunnerHandle::Get()->PostTask( 511 base::ThreadTaskRunnerHandle::Get()->PostTask(
510 FROM_HERE, 512 FROM_HERE,
511 base::Bind(callback, BACKGROUND_SYNC_STATUS_OK, 513 base::Bind(callback, BACKGROUND_SYNC_STATUS_OK,
512 base::Passed(make_scoped_ptr(new BackgroundSyncRegistration( 514 base::Passed(base::WrapUnique(new BackgroundSyncRegistration(
513 *existing_registration))))); 515 *existing_registration)))));
514 return; 516 return;
515 } 517 }
516 518
517 BackgroundSyncRegistration new_registration; 519 BackgroundSyncRegistration new_registration;
518 520
519 *new_registration.options() = options; 521 *new_registration.options() = options;
520 522
521 BackgroundSyncRegistrations* registrations = 523 BackgroundSyncRegistrations* registrations =
522 &active_registrations_[sw_registration_id]; 524 &active_registrations_[sw_registration_id];
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
655 active_registrations_.erase(sw_registration_id); 657 active_registrations_.erase(sw_registration_id);
656 RecordFailureAndPostError(BACKGROUND_SYNC_STATUS_STORAGE_ERROR, callback); 658 RecordFailureAndPostError(BACKGROUND_SYNC_STATUS_STORAGE_ERROR, callback);
657 return; 659 return;
658 } 660 }
659 661
660 if (status != SERVICE_WORKER_OK) { 662 if (status != SERVICE_WORKER_OK) {
661 LOG(ERROR) << "BackgroundSync failed to store registration due to backend " 663 LOG(ERROR) << "BackgroundSync failed to store registration due to backend "
662 "failure."; 664 "failure.";
663 BackgroundSyncMetrics::CountRegisterFailure( 665 BackgroundSyncMetrics::CountRegisterFailure(
664 BACKGROUND_SYNC_STATUS_STORAGE_ERROR); 666 BACKGROUND_SYNC_STATUS_STORAGE_ERROR);
665 DisableAndClearManager( 667 DisableAndClearManager(base::Bind(
666 base::Bind(callback, BACKGROUND_SYNC_STATUS_STORAGE_ERROR, 668 callback, BACKGROUND_SYNC_STATUS_STORAGE_ERROR,
667 base::Passed(scoped_ptr<BackgroundSyncRegistration>()))); 669 base::Passed(std::unique_ptr<BackgroundSyncRegistration>())));
668 return; 670 return;
669 } 671 }
670 672
671 BackgroundSyncMetrics::RegistrationCouldFire registration_could_fire = 673 BackgroundSyncMetrics::RegistrationCouldFire registration_could_fire =
672 AreOptionConditionsMet(*new_registration.options()) 674 AreOptionConditionsMet(*new_registration.options())
673 ? BackgroundSyncMetrics::REGISTRATION_COULD_FIRE 675 ? BackgroundSyncMetrics::REGISTRATION_COULD_FIRE
674 : BackgroundSyncMetrics::REGISTRATION_COULD_NOT_FIRE; 676 : BackgroundSyncMetrics::REGISTRATION_COULD_NOT_FIRE;
675 BackgroundSyncMetrics::CountRegisterSuccess( 677 BackgroundSyncMetrics::CountRegisterSuccess(
676 registration_could_fire, 678 registration_could_fire,
677 BackgroundSyncMetrics::REGISTRATION_IS_NOT_DUPLICATE); 679 BackgroundSyncMetrics::REGISTRATION_IS_NOT_DUPLICATE);
678 680
679 FireReadyEvents(); 681 FireReadyEvents();
680 682
681 base::ThreadTaskRunnerHandle::Get()->PostTask( 683 base::ThreadTaskRunnerHandle::Get()->PostTask(
682 FROM_HERE, 684 FROM_HERE,
683 base::Bind(callback, BACKGROUND_SYNC_STATUS_OK, 685 base::Bind(callback, BACKGROUND_SYNC_STATUS_OK,
684 base::Passed(make_scoped_ptr( 686 base::Passed(base::WrapUnique(
685 new BackgroundSyncRegistration(new_registration))))); 687 new BackgroundSyncRegistration(new_registration)))));
686 } 688 }
687 689
688 void BackgroundSyncManager::RemoveActiveRegistration(int64_t sw_registration_id, 690 void BackgroundSyncManager::RemoveActiveRegistration(int64_t sw_registration_id,
689 const std::string& tag) { 691 const std::string& tag) {
690 DCHECK_CURRENTLY_ON(BrowserThread::IO); 692 DCHECK_CURRENTLY_ON(BrowserThread::IO);
691 DCHECK(LookupActiveRegistration(sw_registration_id, tag)); 693 DCHECK(LookupActiveRegistration(sw_registration_id, tag));
692 694
693 BackgroundSyncRegistrations* registrations = 695 BackgroundSyncRegistrations* registrations =
694 &active_registrations_[sw_registration_id]; 696 &active_registrations_[sw_registration_id];
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
775 const GURL& origin, 777 const GURL& origin,
776 const BoolCallback& callback) { 778 const BoolCallback& callback) {
777 service_worker_context_->HasMainFrameProviderHost(origin, callback); 779 service_worker_context_->HasMainFrameProviderHost(origin, callback);
778 } 780 }
779 781
780 void BackgroundSyncManager::GetRegistrationsImpl( 782 void BackgroundSyncManager::GetRegistrationsImpl(
781 int64_t sw_registration_id, 783 int64_t sw_registration_id,
782 const StatusAndRegistrationsCallback& callback) { 784 const StatusAndRegistrationsCallback& callback) {
783 DCHECK_CURRENTLY_ON(BrowserThread::IO); 785 DCHECK_CURRENTLY_ON(BrowserThread::IO);
784 786
785 scoped_ptr<ScopedVector<BackgroundSyncRegistration>> out_registrations( 787 std::unique_ptr<ScopedVector<BackgroundSyncRegistration>> out_registrations(
786 new ScopedVector<BackgroundSyncRegistration>()); 788 new ScopedVector<BackgroundSyncRegistration>());
787 789
788 if (disabled_) { 790 if (disabled_) {
789 base::ThreadTaskRunnerHandle::Get()->PostTask( 791 base::ThreadTaskRunnerHandle::Get()->PostTask(
790 FROM_HERE, base::Bind(callback, BACKGROUND_SYNC_STATUS_STORAGE_ERROR, 792 FROM_HERE, base::Bind(callback, BACKGROUND_SYNC_STATUS_STORAGE_ERROR,
791 base::Passed(std::move(out_registrations)))); 793 base::Passed(std::move(out_registrations))));
792 return; 794 return;
793 } 795 }
794 796
795 SWIdToRegistrationsMap::iterator it = 797 SWIdToRegistrationsMap::iterator it =
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after
1178 Params... parameters) { 1180 Params... parameters) {
1179 DCHECK_CURRENTLY_ON(BrowserThread::IO); 1181 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1180 1182
1181 callback.Run(parameters...); 1183 callback.Run(parameters...);
1182 op_scheduler_.CompleteOperationAndRunNext(); 1184 op_scheduler_.CompleteOperationAndRunNext();
1183 } 1185 }
1184 1186
1185 void BackgroundSyncManager::CompleteStatusAndRegistrationCallback( 1187 void BackgroundSyncManager::CompleteStatusAndRegistrationCallback(
1186 StatusAndRegistrationCallback callback, 1188 StatusAndRegistrationCallback callback,
1187 BackgroundSyncStatus status, 1189 BackgroundSyncStatus status,
1188 scoped_ptr<BackgroundSyncRegistration> registration) { 1190 std::unique_ptr<BackgroundSyncRegistration> registration) {
1189 DCHECK_CURRENTLY_ON(BrowserThread::IO); 1191 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1190 1192
1191 callback.Run(status, std::move(registration)); 1193 callback.Run(status, std::move(registration));
1192 op_scheduler_.CompleteOperationAndRunNext(); 1194 op_scheduler_.CompleteOperationAndRunNext();
1193 } 1195 }
1194 1196
1195 void BackgroundSyncManager::CompleteStatusAndRegistrationsCallback( 1197 void BackgroundSyncManager::CompleteStatusAndRegistrationsCallback(
1196 StatusAndRegistrationsCallback callback, 1198 StatusAndRegistrationsCallback callback,
1197 BackgroundSyncStatus status, 1199 BackgroundSyncStatus status,
1198 scoped_ptr<ScopedVector<BackgroundSyncRegistration>> registrations) { 1200 std::unique_ptr<ScopedVector<BackgroundSyncRegistration>> registrations) {
1199 DCHECK_CURRENTLY_ON(BrowserThread::IO); 1201 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1200 1202
1201 callback.Run(status, std::move(registrations)); 1203 callback.Run(status, std::move(registrations));
1202 op_scheduler_.CompleteOperationAndRunNext(); 1204 op_scheduler_.CompleteOperationAndRunNext();
1203 } 1205 }
1204 1206
1205 base::Closure BackgroundSyncManager::MakeEmptyCompletion() { 1207 base::Closure BackgroundSyncManager::MakeEmptyCompletion() {
1206 DCHECK_CURRENTLY_ON(BrowserThread::IO); 1208 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1207 1209
1208 return MakeClosureCompletion(base::Bind(base::DoNothing)); 1210 return MakeClosureCompletion(base::Bind(base::DoNothing));
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1241 BackgroundSyncManager::MakeStatusCompletion(const StatusCallback& callback) { 1243 BackgroundSyncManager::MakeStatusCompletion(const StatusCallback& callback) {
1242 DCHECK_CURRENTLY_ON(BrowserThread::IO); 1244 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1243 1245
1244 return base::Bind( 1246 return base::Bind(
1245 &BackgroundSyncManager::CompleteOperationCallback<StatusCallback, 1247 &BackgroundSyncManager::CompleteOperationCallback<StatusCallback,
1246 BackgroundSyncStatus>, 1248 BackgroundSyncStatus>,
1247 weak_ptr_factory_.GetWeakPtr(), callback); 1249 weak_ptr_factory_.GetWeakPtr(), callback);
1248 } 1250 }
1249 1251
1250 } // namespace content 1252 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698