Home | History | Annotate | Download | only in renderer
      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_WEB_UI_MOJO_CONTEXT_STATE_H_
      6 #define CONTENT_RENDERER_WEB_UI_MOJO_CONTEXT_STATE_H_
      7 
      8 #include <set>
      9 #include <string>
     10 
     11 #include "base/memory/scoped_ptr.h"
     12 #include "base/memory/scoped_vector.h"
     13 #include "gin/modules/module_registry_observer.h"
     14 #include "mojo/public/cpp/system/core.h"
     15 #include "v8/include/v8.h"
     16 
     17 namespace blink {
     18 class WebFrame;
     19 class WebURLResponse;
     20 }
     21 
     22 namespace gin {
     23 class ContextHolder;
     24 struct PendingModule;
     25 }
     26 
     27 namespace content {
     28 
     29 class ResourceFetcher;
     30 class WebUIRunner;
     31 
     32 // WebUIMojoContextState manages the modules needed for mojo bindings. It does
     33 // this by way of gin. Non-builtin modules are downloaded by way of
     34 // ResourceFetchers.
     35 class WebUIMojoContextState : public gin::ModuleRegistryObserver {
     36  public:
     37   WebUIMojoContextState(blink::WebFrame* frame,
     38                         v8::Handle<v8::Context> context);
     39   virtual ~WebUIMojoContextState();
     40 
     41   // Called once the mojo::Handle is available.
     42   void SetHandle(mojo::ScopedMessagePipeHandle handle);
     43 
     44   // Returns true if at least one module was added.
     45   bool module_added() const { return module_added_; }
     46 
     47  private:
     48   class Loader;
     49 
     50   // Invokes FetchModule() for any modules that have not already been
     51   // downloaded.
     52   void FetchModules(const std::vector<std::string>& ids);
     53 
     54   // Creates a ResourceFetcher to download |module|.
     55   void FetchModule(const std::string& module);
     56 
     57   // Callback once a module has finished downloading. Passes data to |runner_|.
     58   void OnFetchModuleComplete(ResourceFetcher* fetcher,
     59                              const blink::WebURLResponse& response,
     60                              const std::string& data);
     61 
     62   // gin::ModuleRegistryObserver overrides:
     63   virtual void OnDidAddPendingModule(
     64       const std::string& id,
     65       const std::vector<std::string>& dependencies) OVERRIDE;
     66 
     67   // Frame script is executed in. Also used to download resources.
     68   blink::WebFrame* frame_;
     69 
     70   // See description above getter.
     71   bool module_added_;
     72 
     73   // Executes the script from gin.
     74   scoped_ptr<WebUIRunner> runner_;
     75 
     76   // Set of fetchers we're waiting on to download script.
     77   ScopedVector<ResourceFetcher> module_fetchers_;
     78 
     79   // Set of modules we've fetched script from.
     80   std::set<std::string> fetched_modules_;
     81 
     82   DISALLOW_COPY_AND_ASSIGN(WebUIMojoContextState);
     83 };
     84 
     85 }  // namespace content
     86 
     87 #endif  // CONTENT_RENDERER_WEB_UI_MOJO_CONTEXT_STATE_H_
     88