15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_RENDERER_EXTENSIONS_CHROME_V8_CONTEXT_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_RENDERER_EXTENSIONS_CHROME_V8_CONTEXT_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/compiler_specific.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/renderer/extensions/module_system.h" 13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/renderer/extensions/pepper_request_proxy.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/renderer/extensions/request_sender.h" 157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/renderer/extensions/safe_builtins.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/renderer/extensions/scoped_persistent.h" 173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/features/feature.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "v8/include/v8.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace blink { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebFrame; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderView; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Extension; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Chrome's wrapper for a v8 context. 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ChromeV8Context : public RequestSender::Source { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeV8Context(v8::Handle<v8::Context> context, 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFrame* frame, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Feature::Context context_type); 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~ChromeV8Context(); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Clears the WebFrame for this contexts and invalidates the associated 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ModuleSystem. 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void Invalidate(); 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Returns true if this context is still valid, false if it isn't. 45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // A context becomes invalid via Invalidate(). 46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool is_valid() const { 4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return !v8_context_.IsEmpty(); 48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v8::Handle<v8::Context> v8_context() const { 5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return v8_context_.NewHandle(v8::Isolate::GetCurrent()); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension() const { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension_.get(); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFrame* web_frame() const { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return web_frame_; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Feature::Context context_type() const { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return context_type_; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_module_system(scoped_ptr<ModuleSystem> module_system) { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) module_system_ = module_system.Pass(); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModuleSystem* module_system() { return module_system_.get(); } 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SafeBuiltins* safe_builtins() { 737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return &safe_builtins_; 747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const SafeBuiltins* safe_builtins() const { 767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return &safe_builtins_; 777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PepperRequestProxy* pepper_request_proxy() { 80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return &pepper_request_proxy_; 81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the ID of the extension associated with this context, or empty 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // string if there is no such extension. 857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::string GetExtensionID() const; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the RenderView associated with this context. Can return NULL if the 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // context is in the process of being destroyed. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderView* GetRenderView() const; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Get the URL of this context's web frame. 927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GURL GetURL() const; 937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Runs |function| with appropriate scopes. Doesn't catch exceptions, callers 95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // must do that if they want. 96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // 97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // USE THIS METHOD RATHER THAN v8::Function::Call WHEREVER POSSIBLE. 98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) v8::Local<v8::Value> CallFunction(v8::Handle<v8::Function> function, 99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int argc, 100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) v8::Handle<v8::Value> argv[]) const; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Fires the onunload event on the unload_event module. 103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void DispatchOnUnloadEvent(); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the availability of the API |api_name|. 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Feature::Availability GetAvailability(const std::string& api_name); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 108b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Returns whether the API |api_name| or any part of the API could be 109b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // available in this context without taking into account the context's 110b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // extension. 111b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) bool IsAnyFeatureAvailableToContext(const std::string& api_name); 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a string description of the type of context this is. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string GetContextTypeDescription(); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // RequestSender::Source implementation. 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ChromeV8Context* GetContext() OVERRIDE; 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnResponseReceived(const std::string& name, 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int request_id, 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool success, 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::ListValue& response, 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& error) OVERRIDE; 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) v8::Isolate* isolate() const { 12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return isolate_; 12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The v8 context the bindings are accessible to. 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedPersistent<v8::Context> v8_context_; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The WebFrame associated with this context. This can be NULL because this 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // object can outlive is destroyed asynchronously. 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFrame* web_frame_; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The extension associated with this context, or NULL if there is none. This 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // might be a hosted app in the case that this context is hosting a web URL. 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<const Extension> extension_; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The type of context. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Feature::Context context_type_; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Owns and structures the JS that is injected to set up extension bindings. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ModuleSystem> module_system_; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Contains safe copies of builtin objects like Function.prototype. 1477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SafeBuiltins safe_builtins_; 1487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // The proxy for this context for making API calls from Pepper via Javascript. 150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PepperRequestProxy pepper_request_proxy_; 151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) v8::Isolate* isolate_; 15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ChromeV8Context); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_RENDERER_EXTENSIONS_CHROME_V8_CONTEXT_H_ 160