18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// Copyright 2014 The Chromium Authors. All rights reserved.
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// Use of this source code is governed by a BSD-style license that can be
304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt// found in the LICENSE file.
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#ifndef CONTENT_RENDERER_MANIFEST_MANIFEST_MANAGER_H_
6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#define CONTENT_RENDERER_MANIFEST_MANIFEST_MANAGER_H_
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <list>
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "base/callback_forward.h"
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "base/memory/scoped_ptr.h"
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "content/public/common/manifest.h"
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "content/public/renderer/render_frame_observer.h"
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtclass GURL;
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnamespace blink {
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtclass WebURLResponse;
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnamespace content {
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtclass ManifestFetcher;
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// The ManifestManager is a helper class that takes care of fetching and parsing
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// the Manifest of the associated RenderFrame. It uses the ManifestFetcher and
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// the ManifestParser in order to do so.
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// There are two expected consumers of this helper: ManifestManagerHost, via IPC
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// messages and callers inside the renderer process. The latter should use
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// GetManifest().
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtclass ManifestManager : public RenderFrameObserver {
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt public:
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  typedef base::Callback<void(const Manifest&)> GetManifestCallback;
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  explicit ManifestManager(RenderFrame* render_frame);
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  virtual ~ManifestManager();
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // Will call the given |callback| with the Manifest associated with the
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // RenderFrame if any. Will pass an empty Manifest in case of error.
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  void GetManifest(const GetManifestCallback& callback);
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // RenderFrameObserver implementation.
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  virtual void DidChangeManifest() OVERRIDE;
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt private:
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  enum ResolveState {
48f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt    ResolveStateSuccess,
49f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt    ResolveStateFailure
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  };
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // Called when receiving a ManifestManagerMsg_RequestManifest from the browser
5361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  // process.
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  void OnRequestManifest(int request_id);
55a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt  void OnRequestManifestComplete(int request_id, const Manifest&);
56a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt
57cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  void FetchManifest();
58cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  void OnManifestFetchComplete(const GURL& document_url,
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                               const blink::WebURLResponse& response,
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                               const std::string& data);
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  void ResolveCallbacks(ResolveState state);
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  scoped_ptr<ManifestFetcher> fetcher_;
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // Whether the RenderFrame may have an associated Manifest. If true, the frame
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // may have a manifest, if false, it can't have one. This boolean is true when
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // DidChangeManifest() is called, if it is never called, it means that the
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // associated document has no <link rel='manifest'>.
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  bool may_have_manifest_;
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // Whether the current Manifest is dirty.
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  bool manifest_dirty_;
7361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
7461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  // Current Manifest. Might be outdated if manifest_dirty_ is true.
7561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  Manifest manifest_;
7661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  std::list<GetManifestCallback> pending_callbacks_;
788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  DISALLOW_COPY_AND_ASSIGN(ManifestManager);
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} // namespace content
838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif // CONTENT_RENDERER_MANIFEST_MANIFEST_MANAGER_H_
858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt