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