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
20namespace IPC {
21class Message;
22}
23
24namespace ppapi {
25class ScopedPPVar;
26}
27
28namespace content {
29
30class RendererPpapiHost;
31
32// This class is responsible for converting V8 vars to Pepper resources.
33class 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
66class 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