12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/dictionary_var.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted.h" 87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_util.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/array_var.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/ppapi_globals.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/var_tracker.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ppapi { 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DictionaryVar::DictionaryVar() { 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DictionaryVar::~DictionaryVar() { 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DictionaryVar* DictionaryVar::FromPPVar(const PP_Var& var) { 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (var.type != PP_VARTYPE_DICTIONARY) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<Var> var_object( 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiGlobals::Get()->GetVarTracker()->GetVar(var)); 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!var_object.get()) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return var_object->AsDictionaryVar(); 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DictionaryVar* DictionaryVar::AsDictionaryVar() { 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return this; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PP_VarType DictionaryVar::GetType() const { 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_VARTYPE_DICTIONARY; 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PP_Var DictionaryVar::Get(const PP_Var& key) const { 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StringVar* string_var = StringVar::FromPPVar(key); 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!string_var) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_MakeUndefined(); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) KeyValueMap::const_iterator iter = key_value_map_.find(string_var->value()); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter != key_value_map_.end()) { 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PpapiGlobals::Get()->GetVarTracker()->AddRefVar(iter->second.get())) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return iter->second.get(); 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_MakeUndefined(); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_MakeUndefined(); 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PP_Bool DictionaryVar::Set(const PP_Var& key, const PP_Var& value) { 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StringVar* string_var = StringVar::FromPPVar(key); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!string_var) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_FALSE; 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key_value_map_[string_var->value()] = value; 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_TRUE; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DictionaryVar::Delete(const PP_Var& key) { 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StringVar* string_var = StringVar::FromPPVar(key); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!string_var) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key_value_map_.erase(string_var->value()); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PP_Bool DictionaryVar::HasKey(const PP_Var& key) const { 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StringVar* string_var = StringVar::FromPPVar(key); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!string_var) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_FALSE; 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool result = 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key_value_map_.find(string_var->value()) != key_value_map_.end(); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_FromBool(result); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PP_Var DictionaryVar::GetKeys() const { 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ArrayVar> array_var(new ArrayVar()); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) array_var->elements().reserve(key_value_map_.size()); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (KeyValueMap::const_iterator iter = key_value_map_.begin(); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != key_value_map_.end(); ++iter) { 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) array_var->elements().push_back( 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedPPVar(ScopedPPVar::PassRef(), 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StringVar::StringToPPVar(iter->first))); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return array_var->GetPPVar(); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DictionaryVar::SetWithStringKey(const std::string& utf8_key, 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PP_Var& value) { 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!IsStringUTF8(utf8_key)) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key_value_map_[utf8_key] = value; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DictionaryVar::DeleteWithStringKey(const std::string& utf8_key) { 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key_value_map_.erase(utf8_key); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace ppapi 111