13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 23551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 33551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// found in the LICENSE file. 43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#ifndef CONTENT_RENDERER_PEPPER_RESOURCE_CONVERTER_H 63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#define CONTENT_RENDERER_PEPPER_RESOURCE_CONVERTER_H 73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 8424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include <vector> 9424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/basictypes.h" 113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/callback.h" 123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/compiler_specific.h" 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/memory/ref_counted.h" 143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/common/content_export.h" 154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/renderer/pepper/host_resource_var.h" 16424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "ppapi/c/pp_instance.h" 17424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "ppapi/c/pp_var.h" 18424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "v8/include/v8.h" 19424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 20424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace IPC { 21424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class Message; 22424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 23424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 24424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace ppapi { 25424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class ScopedPPVar; 26424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace content { 293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 30424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class RendererPpapiHost; 31424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// This class is responsible for converting V8 vars to Pepper resources. 333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class CONTENT_EXPORT ResourceConverter { 343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public: 353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual ~ResourceConverter(); 363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Reset the state of the resource converter. 38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void Reset() = 0; 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Returns true if Flush() needs to be called before using any vars created 41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // by the resource converter. 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual bool NeedsFlush() = 0; 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // If NeedsFlush() is true then Flush() must be called before any vars created 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // by the ResourceConverter are valid. It handles creating any resource hosts 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // that need to be created. |callback| will always be called asynchronously. 47424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void Flush(const base::Callback<void(bool)>& callback) = 0; 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Attempts to convert a V8 object to a PP_Var with type PP_VARTYPE_RESOURCE. 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // On success, writes the resulting var to |result|, sets |was_resource| to 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // true and returns true. If |val| is not a resource, sets |was_resource| to 524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // false and returns true. If an error occurs, returns false. 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual bool FromV8Value(v8::Handle<v8::Object> val, 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) v8::Handle<v8::Context> context, 554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PP_Var* result, 564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool* was_resource) = 0; 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Attempts to convert a PP_Var to a V8 object. |var| must have type 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // PP_VARTYPE_RESOURCE. On success, writes the resulting value to |result| and 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // returns true. If an error occurs, returns false. 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool ToV8Value(const PP_Var& var, 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) v8::Handle<v8::Context> context, 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) v8::Handle<v8::Value>* result) = 0; 643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class ResourceConverterImpl : public ResourceConverter { 673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public: 68424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ResourceConverterImpl(PP_Instance instance, RendererPpapiHost* host); 693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual ~ResourceConverterImpl(); 70424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // ResourceConverter overrides. 72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void Reset() OVERRIDE; 73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual bool NeedsFlush() OVERRIDE; 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void Flush(const base::Callback<void(bool)>& callback) OVERRIDE; 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual bool FromV8Value(v8::Handle<v8::Object> val, 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) v8::Handle<v8::Context> context, 774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PP_Var* result, 784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool* was_resource) OVERRIDE; 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool ToV8Value(const PP_Var& var, 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) v8::Handle<v8::Context> context, 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) v8::Handle<v8::Value>* result) OVERRIDE; 823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private: 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Creates a resource var with the given |pending_renderer_id| and 854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // |create_message| to be sent to the plugin. 864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<HostResourceVar> CreateResourceVar( 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int pending_renderer_id, 884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const IPC::Message& create_message); 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Creates a resource var with the given |pending_renderer_id| and 904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // |create_message| to be sent to the plugin. Also sends 914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // |browser_host_create_message| to the browser, and asynchronously stores the 924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // resulting browser host ID in the newly created var. 934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<HostResourceVar> CreateResourceVarWithBrowserHost( 944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int pending_renderer_id, 95424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const IPC::Message& create_message, 96424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const IPC::Message& browser_host_create_message); 97424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 98424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // The instance this ResourceConverter is associated with. 99424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) PP_Instance instance_; 100424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // The RendererPpapiHost to use to create browser hosts. 101424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) RendererPpapiHost* host_; 102424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 103424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // A list of the messages to create the browser hosts. This is a parallel 1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // array to |browser_vars|. It is kept as a parallel array so that it can be 1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // conveniently passed to |CreateBrowserResourceHosts|. 106424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) std::vector<IPC::Message> browser_host_create_messages_; 107424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // A list of the resource vars associated with browser hosts. 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<scoped_refptr<HostResourceVar> > browser_vars_; 109424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ResourceConverterImpl); 1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} // namespace content 1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif // CONTENT_RENDERER_PEPPER_RESOURCE_CONVERTER_H 115