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

Unified Diff: content/renderer/manifest/manifest_manager.cc

Issue 537053002: Implement ManifestManager to handle manifest in content/ (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@manifest_fetcher
Patch Set: with tests Created 6 years, 3 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: content/renderer/manifest/manifest_manager.cc
diff --git a/content/renderer/manifest/manifest_manager.cc b/content/renderer/manifest/manifest_manager.cc
new file mode 100644
index 0000000000000000000000000000000000000000..c80bbe47958ea6f34716db6eadb41089d8659c73
--- /dev/null
+++ b/content/renderer/manifest/manifest_manager.cc
@@ -0,0 +1,123 @@
+// 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 "content/renderer/manifest/manifest_manager.h"
+
+#include "base/bind.h"
+#include "content/common/manifest_manager_messages.h"
+#include "content/public/renderer/render_frame.h"
+#include "content/renderer/fetchers/manifest_fetcher.h"
+#include "content/renderer/manifest/manifest_parser.h"
+#include "third_party/WebKit/public/platform/WebURLResponse.h"
+#include "third_party/WebKit/public/web/WebDocument.h"
+#include "third_party/WebKit/public/web/WebLocalFrame.h"
+
+namespace content {
+
+ManifestManager::ManifestManager(RenderFrame* render_frame)
+ : RenderFrameObserver(render_frame),
+ may_have_manifest_(false),
+ manifest_dirty_(true) {
+}
+
+ManifestManager::~ManifestManager() {
+}
+
+bool ManifestManager::OnMessageReceived(const IPC::Message& message) {
+ bool handled = true;
+
+ IPC_BEGIN_MESSAGE_MAP(ManifestManager, message)
+ IPC_MESSAGE_HANDLER(ManifestManagerMsg_RequestManifest, OnRequestManifest)
+ IPC_MESSAGE_UNHANDLED(handled = false)
+ IPC_END_MESSAGE_MAP()
+
+ return handled;
+}
+
+void ManifestManager::OnRequestManifest(int request_id) {
+ request_ids_.push_back(request_id);
Michael van Ouwerkerk 2014/09/09 15:34:56 Why store this list of ids separately? You can bin
mlamouri (slow - plz ping) 2014/09/10 17:06:20 Done.
+ GetManifest(base::Bind(&ManifestManager::OnRequestManifestComplete,
+ base::Unretained(this)));
+}
+
+void ManifestManager::OnRequestManifestComplete(
+ const Manifest& manifest) {
+ // The ManifestManager will run the callbacks in FIFO order so the request_ids
+ // list can be used the same way.
+ // This is an implementation detail that the browser process is not aware of.
+ int request_id = request_ids_.front();
+ request_ids_.pop_front();
+
+ Send(new ManifestManagerHostMsg_RequestManifestResponse(
+ routing_id(), request_id, manifest));
+}
+
+void ManifestManager::GetManifest(const GetManifestCallback& callback) {
+ if (!may_have_manifest_) {
+ callback.Run(Manifest());
+ return;
+ }
+
+ if (!manifest_dirty_) {
+ callback.Run(manifest_);
+ return;
+ }
+
+ pending_callbacks_.push_back(callback);
+
+ // Just wait for the running call to be done if there are other callbacks.
+ if (pending_callbacks_.size() > 1)
+ return;
+
+ DownloadManifest();
+}
+
+void ManifestManager::ManifestChanged() {
+ may_have_manifest_ = true;
+ manifest_dirty_ = true;
+}
+
+void ManifestManager::DownloadManifest() {
+ GURL url(render_frame()->GetWebFrame()->document().manifestURL());
+
+ if (url.is_empty()) {
+ ResolveCallbacks(ResolveStateFailure);
+ return;
+ }
+
+ fetcher_.reset(new ManifestFetcher(url));
+
+ // TODO(mlamouri,kenneth): this is not yet taking into account manifest-src
+ // CSP rule, see http://crbug.com/409996.
+ fetcher_->Start(render_frame()->GetWebFrame(),
+ base::Bind(&ManifestManager::OnManifestFetchComplete,
+ base::Unretained(this)));
+}
+
+void ManifestManager::OnManifestFetchComplete(
+ const blink::WebURLResponse& response,
+ const std::string& data) {
+ if (response.isNull() && data.empty()) {
+ ResolveCallbacks(ResolveStateFailure);
+ return;
+ }
+
+ manifest_ = ManifestParser::Parse(data);
+ ResolveCallbacks(ResolveStateSuccess);
+}
+
+void ManifestManager::ResolveCallbacks(ResolveState state) {
+ if (state == ResolveStateFailure)
+ manifest_ = Manifest();
+
+ for (std::list<GetManifestCallback>::const_iterator
+ it = pending_callbacks_.begin(); it != pending_callbacks_.end(); ++it) {
+ it->Run(manifest_);
+ }
+
+ pending_callbacks_.clear();
+ manifest_dirty_ = state != ResolveStateSuccess;
+}
+
+} // namespace content

Powered by Google App Engine
This is Rietveld 408576698