Home | History | Annotate | Download | only in manifest
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CONTENT_RENDERER_MANIFEST_MANIFEST_MANAGER_H_
      6 #define CONTENT_RENDERER_MANIFEST_MANIFEST_MANAGER_H_
      7 
      8 #include <list>
      9 
     10 #include "base/callback_forward.h"
     11 #include "base/memory/scoped_ptr.h"
     12 #include "content/public/common/manifest.h"
     13 #include "content/public/renderer/render_frame_observer.h"
     14 
     15 class GURL;
     16 
     17 namespace blink {
     18 class WebURLResponse;
     19 }
     20 
     21 namespace content {
     22 
     23 class ManifestFetcher;
     24 
     25 // The ManifestManager is a helper class that takes care of fetching and parsing
     26 // the Manifest of the associated RenderFrame. It uses the ManifestFetcher and
     27 // the ManifestParser in order to do so.
     28 // There are two expected consumers of this helper: ManifestManagerHost, via IPC
     29 // messages and callers inside the renderer process. The latter should use
     30 // GetManifest().
     31 class ManifestManager : public RenderFrameObserver {
     32  public:
     33   typedef base::Callback<void(const Manifest&)> GetManifestCallback;
     34 
     35   explicit ManifestManager(RenderFrame* render_frame);
     36   virtual ~ManifestManager();
     37 
     38   // Will call the given |callback| with the Manifest associated with the
     39   // RenderFrame if any. Will pass an empty Manifest in case of error.
     40   void GetManifest(const GetManifestCallback& callback);
     41 
     42   // RenderFrameObserver implementation.
     43   virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
     44   virtual void DidChangeManifest() OVERRIDE;
     45 
     46  private:
     47   enum ResolveState {
     48     ResolveStateSuccess,
     49     ResolveStateFailure
     50   };
     51 
     52   // Called when receiving a ManifestManagerMsg_RequestManifest from the browser
     53   // process.
     54   void OnRequestManifest(int request_id);
     55   void OnRequestManifestComplete(int request_id, const Manifest&);
     56 
     57   void FetchManifest();
     58   void OnManifestFetchComplete(const GURL& document_url,
     59                                const blink::WebURLResponse& response,
     60                                const std::string& data);
     61   void ResolveCallbacks(ResolveState state);
     62 
     63   scoped_ptr<ManifestFetcher> fetcher_;
     64 
     65   // Whether the RenderFrame may have an associated Manifest. If true, the frame
     66   // may have a manifest, if false, it can't have one. This boolean is true when
     67   // DidChangeManifest() is called, if it is never called, it means that the
     68   // associated document has no <link rel='manifest'>.
     69   bool may_have_manifest_;
     70 
     71   // Whether the current Manifest is dirty.
     72   bool manifest_dirty_;
     73 
     74   // Current Manifest. Might be outdated if manifest_dirty_ is true.
     75   Manifest manifest_;
     76 
     77   std::list<GetManifestCallback> pending_callbacks_;
     78 
     79   DISALLOW_COPY_AND_ASSIGN(ManifestManager);
     80 };
     81 
     82 } // namespace content
     83 
     84 #endif // CONTENT_RENDERER_MANIFEST_MANIFEST_MANAGER_H_
     85