Home | History | Annotate | Download | only in pepper
      1 // Copyright 2013 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_PEPPER_RESOURCE_CONVERTER_H
      6 #define CONTENT_RENDERER_PEPPER_RESOURCE_CONVERTER_H
      7 
      8 #include <vector>
      9 
     10 #include "base/basictypes.h"
     11 #include "base/callback.h"
     12 #include "base/compiler_specific.h"
     13 #include "base/memory/ref_counted.h"
     14 #include "content/common/content_export.h"
     15 #include "content/renderer/pepper/host_resource_var.h"
     16 #include "ppapi/c/pp_instance.h"
     17 #include "ppapi/c/pp_var.h"
     18 #include "v8/include/v8.h"
     19 
     20 namespace IPC {
     21 class Message;
     22 }
     23 
     24 namespace ppapi {
     25 class ScopedPPVar;
     26 }
     27 
     28 namespace content {
     29 
     30 class RendererPpapiHost;
     31 
     32 // This class is responsible for converting V8 vars to Pepper resources.
     33 class CONTENT_EXPORT ResourceConverter {
     34  public:
     35   virtual ~ResourceConverter();
     36 
     37   // Reset the state of the resource converter.
     38   virtual void Reset() = 0;
     39 
     40   // Returns true if Flush() needs to be called before using any vars created
     41   // by the resource converter.
     42   virtual bool NeedsFlush() = 0;
     43 
     44   // If NeedsFlush() is true then Flush() must be called before any vars created
     45   // by the ResourceConverter are valid. It handles creating any resource hosts
     46   // that need to be created. |callback| will always be called asynchronously.
     47   virtual void Flush(const base::Callback<void(bool)>& callback) = 0;
     48 
     49   // Attempts to convert a V8 object to a PP_Var with type PP_VARTYPE_RESOURCE.
     50   // On success, writes the resulting var to |result|, sets |was_resource| to
     51   // true and returns true. If |val| is not a resource, sets |was_resource| to
     52   // false and returns true. If an error occurs, returns false.
     53   virtual bool FromV8Value(v8::Handle<v8::Object> val,
     54                            v8::Handle<v8::Context> context,
     55                            PP_Var* result,
     56                            bool* was_resource) = 0;
     57 
     58   // Attempts to convert a PP_Var to a V8 object. |var| must have type
     59   // PP_VARTYPE_RESOURCE. On success, writes the resulting value to |result| and
     60   // returns true. If an error occurs, returns false.
     61   virtual bool ToV8Value(const PP_Var& var,
     62                          v8::Handle<v8::Context> context,
     63                          v8::Handle<v8::Value>* result) = 0;
     64 };
     65 
     66 class ResourceConverterImpl : public ResourceConverter {
     67  public:
     68   ResourceConverterImpl(PP_Instance instance, RendererPpapiHost* host);
     69   virtual ~ResourceConverterImpl();
     70 
     71   // ResourceConverter overrides.
     72   virtual void Reset() OVERRIDE;
     73   virtual bool NeedsFlush() OVERRIDE;
     74   virtual void Flush(const base::Callback<void(bool)>& callback) OVERRIDE;
     75   virtual bool FromV8Value(v8::Handle<v8::Object> val,
     76                            v8::Handle<v8::Context> context,
     77                            PP_Var* result,
     78                            bool* was_resource) OVERRIDE;
     79   virtual bool ToV8Value(const PP_Var& var,
     80                          v8::Handle<v8::Context> context,
     81                          v8::Handle<v8::Value>* result) OVERRIDE;
     82 
     83  private:
     84   // Creates a resource var with the given |pending_renderer_id| and
     85   // |create_message| to be sent to the plugin.
     86   scoped_refptr<HostResourceVar> CreateResourceVar(
     87       int pending_renderer_id,
     88       const IPC::Message& create_message);
     89   // Creates a resource var with the given |pending_renderer_id| and
     90   // |create_message| to be sent to the plugin. Also sends
     91   // |browser_host_create_message| to the browser, and asynchronously stores the
     92   // resulting browser host ID in the newly created var.
     93   scoped_refptr<HostResourceVar> CreateResourceVarWithBrowserHost(
     94       int pending_renderer_id,
     95       const IPC::Message& create_message,
     96       const IPC::Message& browser_host_create_message);
     97 
     98   // The instance this ResourceConverter is associated with.
     99   PP_Instance instance_;
    100   // The RendererPpapiHost to use to create browser hosts.
    101   RendererPpapiHost* host_;
    102 
    103   // A list of the messages to create the browser hosts. This is a parallel
    104   // array to |browser_vars|. It is kept as a parallel array so that it can be
    105   // conveniently passed to |CreateBrowserResourceHosts|.
    106   std::vector<IPC::Message> browser_host_create_messages_;
    107   // A list of the resource vars associated with browser hosts.
    108   std::vector<scoped_refptr<HostResourceVar> > browser_vars_;
    109 
    110   DISALLOW_COPY_AND_ASSIGN(ResourceConverterImpl);
    111 };
    112 
    113 }  // namespace content
    114 #endif  // CONTENT_RENDERER_PEPPER_RESOURCE_CONVERTER_H
    115