15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions in binary form must reproduce the above 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Neither the name of Google Inc. nor the names of its 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission. 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "CppVariant.h" 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 33926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#include "TestCommon.h" 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <limits> 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)using namespace blink; 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace std; 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 39926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)namespace WebTestRunner { 40926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)CppVariant::CppVariant() 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) type = NPVariantType_Null; 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Note that Set() performs a deep copy, which is necessary to safely 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// call FreeData() on the value in the destructor. 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)CppVariant::CppVariant(const CppVariant& original) 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) type = NPVariantType_Null; 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) set(original); 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// See comment for copy constructor, above. 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)CppVariant& CppVariant::operator=(const CppVariant& original) 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (&original != this) 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) set(original); 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return *this; 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)CppVariant::~CppVariant() 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) freeData(); 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void CppVariant::freeData() 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebBindings::releaseVariantValue(this); 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool CppVariant::isEqual(const CppVariant& other) const 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (type != other.type) 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (type) { 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case NPVariantType_Bool: 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (value.boolValue == other.value.boolValue); 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case NPVariantType_Int32: 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (value.intValue == other.value.intValue); 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case NPVariantType_Double: 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (value.doubleValue == other.value.doubleValue); 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case NPVariantType_String: { 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const NPString *this_value = &value.stringValue; 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const NPString *other_value = &other.value.stringValue; 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) uint32_t len = this_value->UTF8Length; 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return len == other_value->UTF8Length 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) && !strncmp(this_value->UTF8Characters, 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) other_value->UTF8Characters, len); 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case NPVariantType_Null: 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case NPVariantType_Void: 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case NPVariantType_Object: { 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NPObject* thisValue = value.objectValue; 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NPObject* otherValue = other.value.objectValue; 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return thisValue->_class == otherValue->_class 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) && thisValue->referenceCount == otherValue->referenceCount; 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void CppVariant::copyToNPVariant(NPVariant* result) const 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result->type = type; 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (type) { 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case NPVariantType_Bool: 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result->value.boolValue = value.boolValue; 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case NPVariantType_Int32: 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result->value.intValue = value.intValue; 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case NPVariantType_Double: 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result->value.doubleValue = value.doubleValue; 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case NPVariantType_String: 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebBindings::initializeVariantWithStringCopy(result, &value.stringValue); 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case NPVariantType_Null: 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case NPVariantType_Void: 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Nothing to set. 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case NPVariantType_Object: 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result->type = NPVariantType_Object; 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result->value.objectValue = WebBindings::retainObject(value.objectValue); 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void CppVariant::set(const NPVariant& newValue) 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) freeData(); 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (newValue.type) { 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case NPVariantType_Bool: 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) set(newValue.value.boolValue); 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case NPVariantType_Int32: 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) set(newValue.value.intValue); 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case NPVariantType_Double: 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) set(newValue.value.doubleValue); 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case NPVariantType_String: 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) set(newValue.value.stringValue); 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case NPVariantType_Null: 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case NPVariantType_Void: 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) type = newValue.type; 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case NPVariantType_Object: 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) set(newValue.value.objectValue); 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void CppVariant::setNull() 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) freeData(); 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) type = NPVariantType_Null; 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void CppVariant::set(bool newValue) 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) freeData(); 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) type = NPVariantType_Bool; 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) value.boolValue = newValue; 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void CppVariant::set(int32_t newValue) 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) freeData(); 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) type = NPVariantType_Int32; 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) value.intValue = newValue; 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void CppVariant::set(double newValue) 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) freeData(); 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) type = NPVariantType_Double; 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) value.doubleValue = newValue; 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// The newValue must be a null-terminated string. 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void CppVariant::set(const char* newValue) 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) freeData(); 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) type = NPVariantType_String; 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NPString newString = {newValue, 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static_cast<uint32_t>(strlen(newValue))}; 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebBindings::initializeVariantWithStringCopy(this, &newString); 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void CppVariant::set(const string& newValue) 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) freeData(); 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) type = NPVariantType_String; 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NPString newString = {newValue.data(), 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static_cast<uint32_t>(newValue.size())}; 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebBindings::initializeVariantWithStringCopy(this, &newString); 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void CppVariant::set(const NPString& newValue) 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) freeData(); 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) type = NPVariantType_String; 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebBindings::initializeVariantWithStringCopy(this, &newValue); 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void CppVariant::set(NPObject* newValue) 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) freeData(); 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) type = NPVariantType_Object; 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) value.objectValue = WebBindings::retainObject(newValue); 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)string CppVariant::toString() const 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2201e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) BLINK_ASSERT(isString()); 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return string(value.stringValue.UTF8Characters, 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) value.stringValue.UTF8Length); 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int32_t CppVariant::toInt32() const 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isInt32()) 2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return value.intValue; 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isDouble()) 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return static_cast<int32_t>(value.doubleValue); 2311e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) BLINK_ASSERT_NOT_REACHED(); 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double CppVariant::toDouble() const 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isInt32()) 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return static_cast<double>(value.intValue); 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isDouble()) 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return value.doubleValue; 2411e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) BLINK_ASSERT_NOT_REACHED(); 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool CppVariant::toBoolean() const 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2471e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) BLINK_ASSERT(isBool()); 2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return value.boolValue; 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 251926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)vector<string> CppVariant::toStringVector() const 2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2541e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) BLINK_ASSERT(isObject()); 255926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) vector<string> stringVector; 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NPObject* npValue = value.objectValue; 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NPIdentifier lengthId = WebBindings::getStringIdentifier("length"); 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!WebBindings::hasProperty(0, npValue, lengthId)) 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return stringVector; 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NPVariant lengthValue; 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!WebBindings::getProperty(0, npValue, lengthId, &lengthValue)) 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return stringVector; 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int length = 0; 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The length is a double in some cases. 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (NPVARIANT_IS_DOUBLE(lengthValue)) 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) length = static_cast<int>(NPVARIANT_TO_DOUBLE(lengthValue)); 2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (NPVARIANT_IS_INT32(lengthValue)) 2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) length = NPVARIANT_TO_INT32(lengthValue); 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebBindings::releaseVariantValue(&lengthValue); 2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // For sanity, only allow 100 items. 2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) length = min(100, length); 2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (int i = 0; i < length; ++i) { 2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Get each of the items. 2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) char indexInChar[20]; // Enough size to store 32-bit integer 2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) snprintf(indexInChar, 20, "%d", i); 2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) string index(indexInChar); 2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NPIdentifier indexId = WebBindings::getStringIdentifier(index.c_str()); 2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!WebBindings::hasProperty(0, npValue, indexId)) 2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NPVariant indexValue; 2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!WebBindings::getProperty(0, npValue, indexId, &indexValue)) 2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (NPVARIANT_IS_STRING(indexValue)) { 2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) string item(NPVARIANT_TO_STRING(indexValue).UTF8Characters, 2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NPVARIANT_TO_STRING(indexValue).UTF8Length); 290926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) stringVector.push_back(item); 2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebBindings::releaseVariantValue(&indexValue); 2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return stringVector; 2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 297e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochbool CppVariant::invoke(const string& method, const CppVariant* arguments, 2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) uint32_t argumentCount, CppVariant& result) const 2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3001e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) BLINK_ASSERT(isObject()); 3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NPIdentifier methodName = WebBindings::getStringIdentifier(method.c_str()); 3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NPObject* npObject = value.objectValue; 303e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch if (!WebBindings::hasMethod(0, npObject, methodName)) 3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NPVariant r; 306e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch bool status = WebBindings::invoke(0, npObject, methodName, arguments, argumentCount, &r); 3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result.set(r); 3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return status; 3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 311e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochbool CppVariant::invokeDefault(const CppVariant* arguments, uint32_t argumentCount, 3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CppVariant& result) const 3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3141e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) BLINK_ASSERT(isObject()); 3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NPObject* npObject = value.objectValue; 3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NPVariant r; 317e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch bool status = WebBindings::invokeDefault(0, npObject, arguments, argumentCount, &r); 3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result.set(r); 3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return status; 3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 321926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 322926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 323