• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "fake_ppapi/fake_var_dictionary_interface.h"
6 
7 #include "fake_ppapi/fake_var_manager.h"
8 #include "gtest/gtest.h"
9 
FakeVarDictionaryInterface(FakeVarManager * manager,nacl_io::VarInterface * var_interface,nacl_io::VarArrayInterface * array_interface)10 FakeVarDictionaryInterface::FakeVarDictionaryInterface(FakeVarManager* manager,
11     nacl_io::VarInterface* var_interface,
12     nacl_io::VarArrayInterface* array_interface) :
13   manager_(manager),
14   var_interface_(var_interface),
15   array_interface_(array_interface) {}
16 
17 
Create()18 PP_Var FakeVarDictionaryInterface::Create() {
19   FakeVarData* var_data = manager_->CreateVarData();
20   var_data->type = PP_VARTYPE_DICTIONARY;
21 
22   struct PP_Var result = {PP_VARTYPE_DICTIONARY, 0, {PP_FALSE}};
23   result.value.as_id = var_data->id;
24   return result;
25 }
26 
Set(PP_Var var,PP_Var key,PP_Var value)27 PP_Bool FakeVarDictionaryInterface::Set(PP_Var var, PP_Var key, PP_Var value) {
28   EXPECT_EQ(PP_VARTYPE_DICTIONARY, var.type);
29   EXPECT_EQ(PP_VARTYPE_STRING, key.type);
30   FakeVarData* data = manager_->GetVarData(var);
31   FakeVarData* key_data = manager_->GetVarData(key);
32   EXPECT_NE(static_cast<FakeVarData*>(NULL), data);
33   EXPECT_NE(static_cast<FakeVarData*>(NULL), key_data);
34   const std::string& key_string = key_data->string_value;
35   FakeDictType& dict = data->dict_value;
36   manager_->AddRef(value);
37   // Release any existing value
38   if (dict.count(key_string) > 0) {
39     manager_->Release(dict[key_string]);
40   }
41   dict[key_string] = value;
42   return PP_TRUE;
43 }
44 
Get(PP_Var var,PP_Var key)45 PP_Var FakeVarDictionaryInterface::Get(PP_Var var, PP_Var key) {
46   EXPECT_EQ(PP_VARTYPE_DICTIONARY, var.type);
47   EXPECT_EQ(PP_VARTYPE_STRING, key.type);
48   FakeVarData* data = manager_->GetVarData(var);
49   FakeVarData* key_data = manager_->GetVarData(key);
50   EXPECT_NE(static_cast<FakeVarData*>(NULL), data);
51   EXPECT_NE(static_cast<FakeVarData*>(NULL), key_data);
52   FakeDictType& dict = data->dict_value;
53   const std::string& key_string = key_data->string_value;
54   PP_Var rtn = dict[key_string];
55   manager_->AddRef(rtn);
56   return rtn;
57 }
58 
Delete(PP_Var var,PP_Var key)59 void FakeVarDictionaryInterface::Delete(PP_Var var, PP_Var key) {
60   EXPECT_EQ(PP_VARTYPE_DICTIONARY, var.type);
61   EXPECT_EQ(PP_VARTYPE_STRING, key.type);
62   FakeVarData* data = manager_->GetVarData(var);
63   FakeVarData* key_data = manager_->GetVarData(key);
64   EXPECT_NE(static_cast<FakeVarData*>(NULL), data);
65   EXPECT_NE(static_cast<FakeVarData*>(NULL), key_data);
66   FakeDictType& dict = data->dict_value;
67   const std::string& key_string = key_data->string_value;
68   if (dict.count(key_string) > 0) {
69     manager_->Release(dict[key_string]);
70   }
71   dict.erase(key_string);
72 }
73 
HasKey(PP_Var var,PP_Var key)74 PP_Bool FakeVarDictionaryInterface::HasKey(PP_Var var, PP_Var key) {
75   EXPECT_EQ(PP_VARTYPE_DICTIONARY, var.type);
76   EXPECT_EQ(PP_VARTYPE_STRING, key.type);
77   FakeVarData* data = manager_->GetVarData(var);
78   FakeVarData* key_data = manager_->GetVarData(key);
79   EXPECT_NE(static_cast<FakeVarData*>(NULL), data);
80   EXPECT_NE(static_cast<FakeVarData*>(NULL), key_data);
81   FakeDictType& dict = data->dict_value;
82   const std::string& key_string = key_data->string_value;
83   if (dict.count(key_string) > 0)
84     return PP_FALSE;
85   return PP_TRUE;
86 }
87 
GetKeys(PP_Var var)88 PP_Var FakeVarDictionaryInterface::GetKeys(PP_Var var) {
89   EXPECT_EQ(PP_VARTYPE_DICTIONARY, var.type);
90   FakeVarData* data = manager_->GetVarData(var);
91   EXPECT_NE(static_cast<FakeVarData*>(NULL), data);
92   FakeDictType& dict = data->dict_value;
93   PP_Var rtn = array_interface_->Create();
94   array_interface_->SetLength(rtn, dict.size());
95   int index = 0;
96   for (FakeDictType::iterator it = dict.begin(); it != dict.end(); it++) {
97     PP_Var key = var_interface_->VarFromUtf8(it->first.c_str(),
98                                              it->first.size());
99     array_interface_->Set(rtn, index, key);
100     manager_->Release(key);
101     index++;
102   }
103   return rtn;
104 }
105