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