1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/proxy/raw_var_data.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <stack>
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/stl_util.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ipc/ipc_message.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/proxy/ppapi_param_traits.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/shared_impl/array_var.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/shared_impl/dictionary_var.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/shared_impl/ppapi_globals.h"
1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ppapi/shared_impl/resource_var.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/shared_impl/scoped_pp_var.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/shared_impl/var.h"
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/shared_impl/var_tracker.h"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using std::make_pair;
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace ppapi {
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace proxy {
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace {
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// When sending array buffers, if the size is over 256K, we use shared
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// memory instead of sending the data over IPC. Light testing suggests
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// shared memory is much faster for 256K and larger messages.
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static const uint32 kMinimumArrayBufferSizeForShmem = 256 * 1024;
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static uint32 g_minimum_array_buffer_size_for_shmem =
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    kMinimumArrayBufferSizeForShmem;
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)struct StackEntry {
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  StackEntry(PP_Var v, size_t i) : var(v), data_index(i) {}
377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  PP_Var var;
387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  size_t data_index;
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// For a given PP_Var, returns the RawVarData associated with it, or creates a
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// new one if there is no existing one. The data is appended to |data| if it
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// is newly created. The index into |data| pointing to the result is returned.
447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// |visited_map| keeps track of RawVarDatas that have already been created.
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)size_t GetOrCreateRawVarData(const PP_Var& var,
467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                             base::hash_map<int64_t, size_t>* visited_map,
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             ScopedVector<RawVarData>* data) {
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (VarTracker::IsVarTypeRefcounted(var.type)) {
497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    base::hash_map<int64_t, size_t>::iterator it = visited_map->find(
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        var.value.as_id);
517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (it != visited_map->end()) {
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return it->second;
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      data->push_back(RawVarData::Create(var.type));
557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      (*visited_map)[var.value.as_id] = data->size() - 1;
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    data->push_back(RawVarData::Create(var.type));
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return data->size() - 1;
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool CanHaveChildren(PP_Var var) {
647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return var.type == PP_VARTYPE_ARRAY || var.type == PP_VARTYPE_DICTIONARY;
657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// RawVarDataGraph ------------------------------------------------------------
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)RawVarDataGraph::RawVarDataGraph() {
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)RawVarDataGraph::~RawVarDataGraph() {
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// This function uses a stack-based DFS search to traverse the var graph. Each
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// iteration, the top node on the stack examined. If the node has not been
787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// visited yet (i.e. !initialized()) then it is added to the list of
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// |parent_ids| which contains all of the nodes on the path from the start node
807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// to the current node. Each of that nodes children are examined. If they appear
817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// in the list of |parent_ids| it means we have a cycle and we return NULL.
827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Otherwise, if they haven't been visited yet we add them to the stack, If the
837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// node at the top of the stack has already been visited, then we pop it off the
847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// stack and erase it from |parent_ids|.
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<RawVarDataGraph> RawVarDataGraph::Create(const PP_Var& var,
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                    PP_Instance instance) {
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RawVarDataGraph> graph(new RawVarDataGraph);
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Map of |var.value.as_id| to a RawVarData index in RawVarDataGraph.
907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::hash_map<int64_t, size_t> visited_map;
917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::hash_set<int64_t> parent_ids;
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::stack<StackEntry> stack;
947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  stack.push(StackEntry(var, GetOrCreateRawVarData(var, &visited_map,
957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                                   &graph->data_)));
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  while (!stack.empty()) {
987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    PP_Var current_var = stack.top().var;
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    RawVarData* current_var_data = graph->data_[stack.top().data_index];
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (current_var_data->initialized()) {
1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      stack.pop();
1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      if (CanHaveChildren(current_var))
1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        parent_ids.erase(current_var.value.as_id);
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      continue;
1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (CanHaveChildren(current_var))
1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      parent_ids.insert(current_var.value.as_id);
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!current_var_data->Init(current_var, instance)) {
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NOTREACHED();
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return scoped_ptr<RawVarDataGraph>();
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Add child nodes to the stack.
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (current_var.type == PP_VARTYPE_ARRAY) {
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ArrayVar* array_var = ArrayVar::FromPPVar(current_var);
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (!array_var) {
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        NOTREACHED();
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return scoped_ptr<RawVarDataGraph>();
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      for (ArrayVar::ElementVector::const_iterator iter =
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               array_var->elements().begin();
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)           iter != array_var->elements().end();
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)           ++iter) {
1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        const PP_Var& child = iter->get();
1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        // If a child of this node is already in parent_ids, we have a cycle so
1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        // we just return null.
1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        if (CanHaveChildren(child) && parent_ids.count(child.value.as_id) != 0)
1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          return scoped_ptr<RawVarDataGraph>();
1317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        size_t child_id = GetOrCreateRawVarData(child, &visited_map,
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                &graph->data_);
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        static_cast<ArrayRawVarData*>(current_var_data)->AddChild(child_id);
1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        if (!graph->data_[child_id]->initialized())
1357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          stack.push(StackEntry(child, child_id));
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else if (current_var.type == PP_VARTYPE_DICTIONARY) {
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      DictionaryVar* dict_var = DictionaryVar::FromPPVar(current_var);
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (!dict_var) {
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        NOTREACHED();
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return scoped_ptr<RawVarDataGraph>();
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      for (DictionaryVar::KeyValueMap::const_iterator iter =
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               dict_var->key_value_map().begin();
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)           iter != dict_var->key_value_map().end();
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)           ++iter) {
1477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        const PP_Var& child = iter->second.get();
1487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        if (CanHaveChildren(child) && parent_ids.count(child.value.as_id) != 0)
1497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          return scoped_ptr<RawVarDataGraph>();
1507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        size_t child_id = GetOrCreateRawVarData(child, &visited_map,
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                &graph->data_);
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        static_cast<DictionaryRawVarData*>(
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            current_var_data)->AddChild(iter->first, child_id);
1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        if (!graph->data_[child_id]->initialized())
1557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          stack.push(StackEntry(child, child_id));
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return graph.Pass();
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PP_Var RawVarDataGraph::CreatePPVar(PP_Instance instance) {
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Create and initialize each node in the graph.
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<PP_Var> graph;
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < data_.size(); ++i)
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    graph.push_back(data_[i]->CreatePPVar(instance));
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < data_.size(); ++i)
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    data_[i]->PopulatePPVar(graph[i], graph);
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Everything except the root will have one extra ref. Remove that ref.
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 1; i < data_.size(); ++i)
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ScopedPPVar(ScopedPPVar::PassRef(), graph[i]);
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The first element is the root.
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return graph[0];
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RawVarDataGraph::Write(IPC::Message* m,
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            const HandleWriter& handle_writer) {
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Write the size, followed by each node in the graph.
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  m->WriteUInt32(static_cast<uint32_t>(data_.size()));
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < data_.size(); ++i) {
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    m->WriteInt(data_[i]->Type());
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    data_[i]->Write(m, handle_writer);
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<RawVarDataGraph> RawVarDataGraph::Read(const IPC::Message* m,
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                  PickleIterator* iter) {
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RawVarDataGraph> result(new RawVarDataGraph);
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  uint32_t size = 0;
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!m->ReadUInt32(iter, &size))
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return scoped_ptr<RawVarDataGraph>();
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (uint32_t i = 0; i < size; ++i) {
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int32_t type;
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!m->ReadInt(iter, &type))
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return scoped_ptr<RawVarDataGraph>();
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PP_VarType var_type = static_cast<PP_VarType>(type);
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    result->data_.push_back(RawVarData::Create(var_type));
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!result->data_.back()->Read(var_type, m, iter))
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return scoped_ptr<RawVarDataGraph>();
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return result.Pass();
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::vector<SerializedHandle*> RawVarDataGraph::GetHandles() {
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<SerializedHandle*> result;
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < data_.size(); ++i) {
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SerializedHandle* handle = data_[i]->GetHandle();
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (handle)
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      result.push_back(handle);
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return result;
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RawVarDataGraph::SetMinimumArrayBufferSizeForShmemForTest(
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    uint32 threshold) {
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (threshold == 0)
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    g_minimum_array_buffer_size_for_shmem = kMinimumArrayBufferSizeForShmem;
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  else
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    g_minimum_array_buffer_size_for_shmem = threshold;
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// RawVarData ------------------------------------------------------------------
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)RawVarData* RawVarData::Create(PP_VarType type) {
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  switch (type) {
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case PP_VARTYPE_UNDEFINED:
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case PP_VARTYPE_NULL:
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case PP_VARTYPE_BOOL:
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case PP_VARTYPE_INT32:
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case PP_VARTYPE_DOUBLE:
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case PP_VARTYPE_OBJECT:
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return new BasicRawVarData();
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case PP_VARTYPE_STRING:
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return new StringRawVarData();
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case PP_VARTYPE_ARRAY_BUFFER:
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return new ArrayBufferRawVarData();
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case PP_VARTYPE_ARRAY:
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return new ArrayRawVarData();
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case PP_VARTYPE_DICTIONARY:
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return new DictionaryRawVarData();
244d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    case PP_VARTYPE_RESOURCE:
24568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return new ResourceRawVarData();
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NOTREACHED();
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return NULL;
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)RawVarData::RawVarData() : initialized_(false) {
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)RawVarData::~RawVarData() {
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SerializedHandle* RawVarData::GetHandle() {
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return NULL;
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// BasicRawVarData -------------------------------------------------------------
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)BasicRawVarData::BasicRawVarData() {
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)BasicRawVarData::~BasicRawVarData() {
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PP_VarType BasicRawVarData::Type() {
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return var_.type;
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool BasicRawVarData::Init(const PP_Var& var, PP_Instance /*instance*/) {
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  var_ = var;
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  initialized_ = true;
275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PP_Var BasicRawVarData::CreatePPVar(PP_Instance instance) {
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return var_;
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BasicRawVarData::PopulatePPVar(const PP_Var& var,
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    const std::vector<PP_Var>& graph) {
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BasicRawVarData::Write(
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    IPC::Message* m,
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const HandleWriter& handle_writer) {
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  switch (var_.type) {
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case PP_VARTYPE_UNDEFINED:
291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case PP_VARTYPE_NULL:
292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // These don't need any data associated with them other than the type we
293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // just serialized.
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case PP_VARTYPE_BOOL:
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      m->WriteBool(PP_ToBool(var_.value.as_bool));
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case PP_VARTYPE_INT32:
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      m->WriteInt(var_.value.as_int);
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case PP_VARTYPE_DOUBLE:
302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IPC::ParamTraits<double>::Write(m, var_.value.as_double);
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case PP_VARTYPE_OBJECT:
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      m->WriteInt64(var_.value.as_id);
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    default:
308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NOTREACHED();
309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool BasicRawVarData::Read(PP_VarType type,
314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           const IPC::Message* m,
315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           PickleIterator* iter) {
316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PP_Var result;
317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  result.type = type;
318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  switch (type) {
319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case PP_VARTYPE_UNDEFINED:
320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case PP_VARTYPE_NULL:
321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // These don't have any data associated with them other than the type we
322a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      // just deserialized.
323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case PP_VARTYPE_BOOL: {
325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      bool bool_value;
326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (!m->ReadBool(iter, &bool_value))
327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return false;
328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      result.value.as_bool = PP_FromBool(bool_value);
329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case PP_VARTYPE_INT32:
332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (!m->ReadInt(iter, &result.value.as_int))
333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return false;
334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case PP_VARTYPE_DOUBLE:
336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (!IPC::ParamTraits<double>::Read(m, iter, &result.value.as_double))
337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return false;
338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case PP_VARTYPE_OBJECT:
340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (!m->ReadInt64(iter, &result.value.as_id))
341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return false;
342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    default:
344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NOTREACHED();
345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return false;
346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  var_ = result;
348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// StringRawVarData ------------------------------------------------------------
352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)StringRawVarData::StringRawVarData() {
353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)StringRawVarData::~StringRawVarData() {
356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PP_VarType StringRawVarData::Type() {
359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return PP_VARTYPE_STRING;
360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool StringRawVarData::Init(const PP_Var& var, PP_Instance /*instance*/) {
363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(var.type == PP_VARTYPE_STRING);
364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  StringVar* string_var = StringVar::FromPPVar(var);
365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!string_var)
366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return false;
367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  data_ = string_var->value();
368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  initialized_ = true;
369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PP_Var StringRawVarData::CreatePPVar(PP_Instance instance) {
373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return StringVar::SwapValidatedUTF8StringIntoPPVar(&data_);
374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void StringRawVarData::PopulatePPVar(const PP_Var& var,
377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     const std::vector<PP_Var>& graph) {
378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void StringRawVarData::Write(IPC::Message* m,
381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             const HandleWriter& handle_writer) {
382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  m->WriteString(data_);
383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool StringRawVarData::Read(PP_VarType type,
386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            const IPC::Message* m,
387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            PickleIterator* iter) {
388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!m->ReadString(iter, &data_))
389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return false;
390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// ArrayBufferRawVarData -------------------------------------------------------
394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ArrayBufferRawVarData::ArrayBufferRawVarData() {
395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ArrayBufferRawVarData::~ArrayBufferRawVarData() {
398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PP_VarType ArrayBufferRawVarData::Type() {
401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return PP_VARTYPE_ARRAY_BUFFER;
402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ArrayBufferRawVarData::Init(const PP_Var& var,
405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 PP_Instance instance) {
406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(var.type == PP_VARTYPE_ARRAY_BUFFER);
407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ArrayBufferVar* buffer_var = ArrayBufferVar::FromPPVar(var);
408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!buffer_var)
409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return false;
410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool using_shmem = false;
411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (buffer_var->ByteLength() >= g_minimum_array_buffer_size_for_shmem &&
412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      instance != 0) {
413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int host_handle_id;
414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::SharedMemoryHandle plugin_handle;
415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    using_shmem = buffer_var->CopyToNewShmem(instance,
416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                             &host_handle_id,
417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                             &plugin_handle);
418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (using_shmem) {
419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (host_handle_id != -1) {
420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        DCHECK(!base::SharedMemory::IsHandleValid(plugin_handle));
421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        DCHECK(PpapiGlobals::Get()->IsPluginGlobals());
422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        type_ = ARRAY_BUFFER_SHMEM_HOST;
423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        host_shm_handle_id_ = host_handle_id;
424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      } else {
425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        DCHECK(base::SharedMemory::IsHandleValid(plugin_handle));
426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        DCHECK(PpapiGlobals::Get()->IsHostGlobals());
427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        type_ = ARRAY_BUFFER_SHMEM_PLUGIN;
428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        plugin_shm_handle_ = SerializedHandle(plugin_handle,
429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                              buffer_var->ByteLength());
430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!using_shmem) {
434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    type_ = ARRAY_BUFFER_NO_SHMEM;
435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    data_ = std::string(static_cast<const char*>(buffer_var->Map()),
436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        buffer_var->ByteLength());
437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  initialized_ = true;
439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PP_Var ArrayBufferRawVarData::CreatePPVar(PP_Instance instance) {
443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PP_Var result = PP_MakeUndefined();
444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  switch (type_) {
445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case ARRAY_BUFFER_SHMEM_HOST: {
446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::SharedMemoryHandle host_handle;
447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      uint32 size_in_bytes;
448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      bool ok = PpapiGlobals::Get()->GetVarTracker()->
449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          StopTrackingSharedMemoryHandle(host_shm_handle_id_,
450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                         instance,
451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                         &host_handle,
452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                         &size_in_bytes);
453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (ok) {
454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        result = PpapiGlobals::Get()->GetVarTracker()->MakeArrayBufferPPVar(
455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            size_in_bytes, host_handle);
456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      } else {
457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        LOG(ERROR) << "Couldn't find array buffer id: " << host_shm_handle_id_;
458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return PP_MakeUndefined();
459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case ARRAY_BUFFER_SHMEM_PLUGIN: {
463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      result = PpapiGlobals::Get()->GetVarTracker()->MakeArrayBufferPPVar(
464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          plugin_shm_handle_.size(),
465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          plugin_shm_handle_.shmem());
466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case ARRAY_BUFFER_NO_SHMEM: {
469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      result = PpapiGlobals::Get()->GetVarTracker()->MakeArrayBufferPPVar(
470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          static_cast<uint32>(data_.size()), data_.data());
471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    default:
474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NOTREACHED();
475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return PP_MakeUndefined();
476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(result.type == PP_VARTYPE_ARRAY_BUFFER);
478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return result;
479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ArrayBufferRawVarData::PopulatePPVar(const PP_Var& var,
482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                          const std::vector<PP_Var>& graph) {
483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ArrayBufferRawVarData::Write(
486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    IPC::Message* m,
487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const HandleWriter& handle_writer) {
488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  m->WriteInt(type_);
489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  switch (type_) {
490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case ARRAY_BUFFER_SHMEM_HOST:
491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      m->WriteInt(host_shm_handle_id_);
492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case ARRAY_BUFFER_SHMEM_PLUGIN:
494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      handle_writer.Run(m, plugin_shm_handle_);
495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case ARRAY_BUFFER_NO_SHMEM:
497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      m->WriteString(data_);
498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ArrayBufferRawVarData::Read(PP_VarType type,
503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 const IPC::Message* m,
504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 PickleIterator* iter) {
505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int shmem_type;
506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!m->ReadInt(iter, &shmem_type))
507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return false;
508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  type_ = static_cast<ShmemType>(shmem_type);
509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  switch (type_) {
510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case ARRAY_BUFFER_SHMEM_HOST:
511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (!m->ReadInt(iter, &host_shm_handle_id_))
512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return false;
513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case ARRAY_BUFFER_SHMEM_PLUGIN:
515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (!IPC::ParamTraits<SerializedHandle>::Read(
516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              m, iter, &plugin_shm_handle_)) {
517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return false;
518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case ARRAY_BUFFER_NO_SHMEM:
521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (!m->ReadString(iter, &data_))
522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return false;
523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    default:
525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // We read an invalid ID.
526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NOTREACHED();
527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return false;
528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SerializedHandle* ArrayBufferRawVarData::GetHandle() {
533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (type_ == ARRAY_BUFFER_SHMEM_PLUGIN && plugin_shm_handle_.size() != 0)
534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return &plugin_shm_handle_;
535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return NULL;
536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// ArrayRawVarData -------------------------------------------------------------
539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ArrayRawVarData::ArrayRawVarData() {
540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ArrayRawVarData::~ArrayRawVarData() {
543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ArrayRawVarData::AddChild(size_t element) {
546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  children_.push_back(element);
547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PP_VarType ArrayRawVarData::Type() {
550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return PP_VARTYPE_ARRAY;
551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ArrayRawVarData::Init(const PP_Var& var, PP_Instance /*instance*/) {
554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  initialized_ = true;
555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(var.type == PP_VARTYPE_ARRAY);
556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  initialized_ = true;
557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PP_Var ArrayRawVarData::CreatePPVar(PP_Instance instance) {
561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return (new ArrayVar())->GetPPVar();
562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ArrayRawVarData::PopulatePPVar(const PP_Var& var,
565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    const std::vector<PP_Var>& graph) {
566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (var.type != PP_VARTYPE_ARRAY) {
567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NOTREACHED();
568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ArrayVar* array_var = ArrayVar::FromPPVar(var);
571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(array_var->elements().empty());
572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < children_.size(); ++i)
573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    array_var->elements().push_back(ScopedPPVar(graph[children_[i]]));
574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ArrayRawVarData::Write(IPC::Message* m,
577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            const HandleWriter& handle_writer) {
578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  m->WriteUInt32(static_cast<uint32_t>(children_.size()));
579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < children_.size(); ++i)
580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    m->WriteUInt32(static_cast<uint32_t>(children_[i]));
581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ArrayRawVarData::Read(PP_VarType type,
584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           const IPC::Message* m,
585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           PickleIterator* iter) {
586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  uint32_t size;
587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!m->ReadUInt32(iter, &size))
588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return false;
589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (uint32_t i = 0; i < size; ++i) {
590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    uint32_t index;
591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!m->ReadUInt32(iter, &index))
592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return false;
593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    children_.push_back(index);
594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// DictionaryRawVarData --------------------------------------------------------
599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DictionaryRawVarData::DictionaryRawVarData() {
600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DictionaryRawVarData::~DictionaryRawVarData() {
603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DictionaryRawVarData::AddChild(const std::string& key,
606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    size_t value) {
607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  children_.push_back(make_pair(key, value));
608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PP_VarType DictionaryRawVarData::Type() {
611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return PP_VARTYPE_DICTIONARY;
612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool DictionaryRawVarData::Init(const PP_Var& var, PP_Instance /*instance*/) {
615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(var.type == PP_VARTYPE_DICTIONARY);
616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  initialized_ = true;
617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PP_Var DictionaryRawVarData::CreatePPVar(PP_Instance instance) {
621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return (new DictionaryVar())->GetPPVar();
622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DictionaryRawVarData::PopulatePPVar(const PP_Var& var,
625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                         const std::vector<PP_Var>& graph) {
626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (var.type != PP_VARTYPE_DICTIONARY) {
627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NOTREACHED();
628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DictionaryVar* dictionary_var = DictionaryVar::FromPPVar(var);
631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(dictionary_var->key_value_map().empty());
632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < children_.size(); ++i) {
633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool success = dictionary_var->SetWithStringKey(children_[i].first,
634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                    graph[children_[i].second]);
635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DCHECK(success);
636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DictionaryRawVarData::Write(
640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    IPC::Message* m,
641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const HandleWriter& handle_writer) {
642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  m->WriteUInt32(static_cast<uint32_t>(children_.size()));
643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < children_.size(); ++i) {
644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    m->WriteString(children_[i].first);
645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    m->WriteUInt32(static_cast<uint32_t>(children_[i].second));
646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool DictionaryRawVarData::Read(PP_VarType type,
650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                const IPC::Message* m,
651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                PickleIterator* iter) {
652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  uint32_t size;
653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!m->ReadUInt32(iter, &size))
654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return false;
655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (uint32_t i = 0; i < size; ++i) {
656c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::string key;
657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    uint32_t value;
658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!m->ReadString(iter, &key))
659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return false;
660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!m->ReadUInt32(iter, &value))
661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return false;
662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    children_.push_back(make_pair(key, value));
663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
66768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// ResourceRawVarData ----------------------------------------------------------
66868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)ResourceRawVarData::ResourceRawVarData()
66968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    : pp_resource_(0),
67068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      pending_renderer_host_id_(0),
67168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      pending_browser_host_id_(0) {}
67268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
67368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)ResourceRawVarData::~ResourceRawVarData() {
67468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
67568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
67668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)PP_VarType ResourceRawVarData::Type() {
67768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return PP_VARTYPE_RESOURCE;
67868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
67968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
68068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)bool ResourceRawVarData::Init(const PP_Var& var, PP_Instance /*instance*/) {
68168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DCHECK(var.type == PP_VARTYPE_RESOURCE);
68268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ResourceVar* resource_var = ResourceVar::FromPPVar(var);
68368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!resource_var)
68468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return false;
68568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  pp_resource_ = resource_var->GetPPResource();
68668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  const IPC::Message* message = resource_var->GetCreationMessage();
68768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (message)
68868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    creation_message_.reset(new IPC::Message(*message));
68968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  else
69068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    creation_message_.reset();
69168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  pending_renderer_host_id_ = resource_var->GetPendingRendererHostId();
69268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  pending_browser_host_id_ = resource_var->GetPendingBrowserHostId();
69368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  initialized_ = true;
69468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return true;
69568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
69668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
69768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)PP_Var ResourceRawVarData::CreatePPVar(PP_Instance instance) {
6980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // If this is not a pending resource host, just create the var.
6990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (pp_resource_ || !creation_message_) {
7000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return PpapiGlobals::Get()->GetVarTracker()->MakeResourcePPVar(
7010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        pp_resource_);
7020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
7030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
7040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // This is a pending resource host, so create the resource and var.
7050f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  return PpapiGlobals::Get()->GetVarTracker()->MakeResourcePPVarFromMessage(
7060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      instance,
7070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      *creation_message_,
7080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      pending_renderer_host_id_,
7090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      pending_browser_host_id_);
71068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
71168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
71268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void ResourceRawVarData::PopulatePPVar(const PP_Var& var,
71368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                       const std::vector<PP_Var>& graph) {
71468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
71568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
71668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void ResourceRawVarData::Write(IPC::Message* m,
71768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                               const HandleWriter& handle_writer) {
71868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  m->WriteInt(static_cast<int>(pp_resource_));
71968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  m->WriteInt(pending_renderer_host_id_);
72068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  m->WriteInt(pending_browser_host_id_);
72168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  m->WriteBool(creation_message_);
72268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (creation_message_)
72368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    IPC::ParamTraits<IPC::Message>::Write(m, *creation_message_);
72468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
72568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
72668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)bool ResourceRawVarData::Read(PP_VarType type,
72768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                              const IPC::Message* m,
72868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                              PickleIterator* iter) {
72968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  int value;
73068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!m->ReadInt(iter, &value))
73168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return false;
73268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  pp_resource_ = static_cast<PP_Resource>(value);
73368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!m->ReadInt(iter, &pending_renderer_host_id_))
73468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return false;
73568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!m->ReadInt(iter, &pending_browser_host_id_))
73668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return false;
73768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool has_creation_message;
73868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!m->ReadBool(iter, &has_creation_message))
73968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return false;
74068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (has_creation_message) {
74168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    creation_message_.reset(new IPC::Message());
74268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    if (!IPC::ParamTraits<IPC::Message>::Read(m, iter, creation_message_.get()))
74368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return false;
74468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  } else {
74568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    creation_message_.reset();
74668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
74768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return true;
74868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
74968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace proxy
751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace ppapi
752