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

Unified Diff: chrome/browser/component_updater/component_updater_resource_throttle.cc

Issue 421393002: Componentize component_updater: Split content::ResourceThrottle from CUS. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 4 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/component_updater/component_updater_resource_throttle.cc
diff --git a/chrome/browser/component_updater/component_updater_resource_throttle.cc b/chrome/browser/component_updater/component_updater_resource_throttle.cc
new file mode 100644
index 0000000000000000000000000000000000000000..2a38cf9c60fba1e3461caac9f0577c3192b85104
--- /dev/null
+++ b/chrome/browser/component_updater/component_updater_resource_throttle.cc
@@ -0,0 +1,108 @@
+// Copyright 2014 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/component_updater/component_updater_resource_throttle.h"
+
+#include "base/location.h"
+#include "base/memory/weak_ptr.h"
+#include "chrome/browser/component_updater/component_updater_service.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/resource_controller.h"
+#include "content/public/browser/resource_throttle.h"
+
+using content::BrowserThread;
+
+namespace component_updater {
+
+namespace {
+
+///////////////////////////////////////////////////////////////////////////////
+// In charge of blocking url requests until the |crx_id| component has been
+// updated. This class is touched solely from the IO thread. The UI thread
+// can post tasks to it via weak pointers. By default the request is blocked
+// unless the CrxUpdateService calls Unblock().
+// The lifetime is controlled by Chrome's resource loader so the component
+// updater cannot touch objects from this class except via weak pointers.
+class CUResourceThrottle : public content::ResourceThrottle,
+ public base::SupportsWeakPtr<CUResourceThrottle> {
+ public:
+ CUResourceThrottle();
+ virtual ~CUResourceThrottle();
+
+ // Overriden from ResourceThrottle.
+ virtual void WillStartRequest(bool* defer) OVERRIDE;
+ virtual void WillRedirectRequest(const GURL& new_url, bool* defer) OVERRIDE;
+ virtual const char* GetNameForLogging() const OVERRIDE;
+
+ // Component updater calls this function via PostTask to unblock the request.
+ void Unblock();
+
+ typedef std::vector<base::WeakPtr<CUResourceThrottle> > WeakPtrVector;
+
+ private:
+ enum State { NEW, BLOCKED, UNBLOCKED };
+
+ State state_;
+};
+
+CUResourceThrottle::CUResourceThrottle() : state_(NEW) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+}
+
+CUResourceThrottle::~CUResourceThrottle() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+}
+
+void CUResourceThrottle::WillStartRequest(bool* defer) {
+ if (state_ != UNBLOCKED) {
+ state_ = BLOCKED;
+ *defer = true;
+ } else {
+ *defer = false;
+ }
+}
+
+void CUResourceThrottle::WillRedirectRequest(const GURL& new_url, bool* defer) {
+ WillStartRequest(defer);
+}
+
+const char* CUResourceThrottle::GetNameForLogging() const {
+ return "ComponentUpdateResourceThrottle";
+}
+
+void CUResourceThrottle::Unblock() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ if (state_ == BLOCKED)
+ controller()->Resume();
+ state_ = UNBLOCKED;
+}
+
+void UnblockThrottleOnUIThread(base::WeakPtr<CUResourceThrottle> rt) {
+ BrowserThread::PostTask(BrowserThread::IO,
+ FROM_HERE,
+ base::Bind(&CUResourceThrottle::Unblock, rt));
+}
+
+} // namespace
+
+content::ResourceThrottle* GetOnDemandResourceThrottle(
+ ComponentUpdateService* cus,
+ const std::string& crx_id) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+
+ // We give the raw pointer to the caller, who will delete it at will
+ // and we keep for ourselves a weak pointer to it so we can post tasks
+ // from the UI thread without having to track lifetime directly.
+ CUResourceThrottle* rt = new CUResourceThrottle;
+ BrowserThread::PostTask(
+ BrowserThread::UI,
+ FROM_HERE,
+ base::Bind(&ComponentUpdateService::MaybeThrottle,
+ base::Unretained(cus),
+ crx_id,
+ base::Bind(&UnblockThrottleOnUIThread, rt->AsWeakPtr())));
+ return rt;
+}
+
+} // namespace component_updater

Powered by Google App Engine
This is Rietveld 408576698