Index: extensions/browser/preload_check_group.cc |
diff --git a/extensions/browser/preload_check_group.cc b/extensions/browser/preload_check_group.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0f849771d9c27e9f714088c86b17656621d5f296 |
--- /dev/null |
+++ b/extensions/browser/preload_check_group.cc |
@@ -0,0 +1,60 @@ |
+// 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 "extensions/browser/preload_check_group.h" |
+ |
+#include "base/bind.h" |
+#include "base/callback_helpers.h" |
+#include "base/memory/ref_counted.h" |
+#include "extensions/common/extension.h" |
+ |
+namespace extensions { |
+ |
+PreloadCheckGroup::PreloadCheckGroup() |
+ : PreloadCheck(nullptr), weak_ptr_factory_(this) {} |
+ |
+PreloadCheckGroup::~PreloadCheckGroup() {} |
+ |
+void PreloadCheckGroup::AddCheck(PreloadCheck* check) { |
+ DCHECK(running_checks_ == 0); |
+ checks_.push_back(check); |
+} |
+ |
+void PreloadCheckGroup::Start(ResultCallback callback) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ DCHECK(running_checks_ == 0); |
Devlin
2017/04/04 01:37:26
nit: DCHECK_EQ(0, running_checks_)
michaelpg
2017/04/04 21:41:29
Done.
|
+ |
+ callback_ = std::move(callback); |
+ running_checks_ = checks_.size(); |
+ for (auto* check : checks_) { |
+ check->Start(base::Bind(&PreloadCheckGroup::OnCheckComplete, |
+ weak_ptr_factory_.GetWeakPtr())); |
+ // Synchronous checks may fail immediately. |
+ if (running_checks_ == 0) |
+ return; |
+ } |
+} |
+ |
+void PreloadCheckGroup::OnCheckComplete(Errors errors) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ errors_.insert(errors.begin(), errors.end()); |
+ running_checks_--; |
+ MaybeInvokeCallback(); |
+} |
+ |
+void PreloadCheckGroup::MaybeInvokeCallback() { |
+ // Only invoke callback if all checks are complete, or if there was at least |
+ // one failure and |stop_on_first_error_| is true. |
+ if (running_checks_ > 0 && (errors_.empty() || !stop_on_first_error_)) |
+ return; |
+ |
+ // If we are failing fast, discard any pending results. |
+ weak_ptr_factory_.InvalidateWeakPtrs(); |
+ running_checks_ = 0; |
+ |
+ DCHECK(!callback_.is_null()); |
+ base::ResetAndReturn(&callback_).Run(errors_); |
+} |
+ |
+} // namespace extensions |