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