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