1ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// found in the LICENSE file. 4ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 5ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/child/indexed_db/indexed_db_key_builders.h" 6ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <algorithm> 8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <string> 9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <vector> 10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 11ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/logging.h" 12ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebVector.h" 13ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBKey; 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBKeyRange; 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBKeyTypeArray; 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBKeyTypeBinary; 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBKeyTypeDate; 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBKeyTypeInvalid; 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBKeyTypeMin; 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBKeyTypeNull; 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBKeyTypeNumber; 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBKeyTypeString; 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebVector; 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebString; 26ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 27ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochstatic content::IndexedDBKey::KeyArray CopyKeyArray(const WebIDBKey& other) { 28ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch content::IndexedDBKey::KeyArray result; 29ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (other.keyType() == WebIDBKeyTypeArray) { 30ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const WebVector<WebIDBKey>& array = other.array(); 31ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch for (size_t i = 0; i < array.size(); ++i) 32ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch result.push_back(content::IndexedDBKeyBuilder::Build(array[i])); 33ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 34ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return result; 35ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 36ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)static std::vector<base::string16> CopyArray( 38ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const WebVector<WebString>& array) { 39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::vector<base::string16> copy(array.size()); 40ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch for (size_t i = 0; i < array.size(); ++i) 41ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch copy[i] = array[i]; 42ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return copy; 43ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 44ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 45ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 46ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace content { 47ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IndexedDBKey IndexedDBKeyBuilder::Build(const blink::WebIDBKey& key) { 49ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch switch (key.keyType()) { 50ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch case WebIDBKeyTypeArray: 51ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return IndexedDBKey(CopyKeyArray(key)); 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case WebIDBKeyTypeBinary: 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return IndexedDBKey( 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string(key.binary().data(), key.binary().size())); 55ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch case WebIDBKeyTypeString: 56ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return IndexedDBKey(key.string()); 57ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch case WebIDBKeyTypeDate: 58ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return IndexedDBKey(key.date(), WebIDBKeyTypeDate); 59ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch case WebIDBKeyTypeNumber: 60ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return IndexedDBKey(key.number(), WebIDBKeyTypeNumber); 61ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch case WebIDBKeyTypeNull: 62ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch case WebIDBKeyTypeInvalid: 63ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return IndexedDBKey(key.keyType()); 64ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch case WebIDBKeyTypeMin: 654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) default: 66ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch NOTREACHED(); 67ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return IndexedDBKey(); 68ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 69ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 70ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 71ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochWebIDBKey WebIDBKeyBuilder::Build(const IndexedDBKey& key) { 72ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch switch (key.type()) { 73ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch case WebIDBKeyTypeArray: { 74ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const IndexedDBKey::KeyArray& array = key.array(); 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebVector<WebIDBKey> web_array(array.size()); 76ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch for (size_t i = 0; i < array.size(); ++i) { 77ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch web_array[i] = Build(array[i]); 78ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 79ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return WebIDBKey::createArray(web_array); 80ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case WebIDBKeyTypeBinary: 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return WebIDBKey::createBinary(key.binary()); 83ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch case WebIDBKeyTypeString: 84ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return WebIDBKey::createString(key.string()); 85ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch case WebIDBKeyTypeDate: 86ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return WebIDBKey::createDate(key.date()); 87ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch case WebIDBKeyTypeNumber: 88ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return WebIDBKey::createNumber(key.number()); 89ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch case WebIDBKeyTypeInvalid: 90ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return WebIDBKey::createInvalid(); 91ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch case WebIDBKeyTypeNull: 92ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return WebIDBKey::createNull(); 93ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch case WebIDBKeyTypeMin: 944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) default: 95ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch NOTREACHED(); 96ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return WebIDBKey::createInvalid(); 97ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 98ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 99ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 100ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochIndexedDBKeyRange IndexedDBKeyRangeBuilder::Build( 101ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const WebIDBKeyRange& key_range) { 102ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return IndexedDBKeyRange( 103ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch IndexedDBKeyBuilder::Build(key_range.lower()), 104ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch IndexedDBKeyBuilder::Build(key_range.upper()), 105ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch key_range.lowerOpen(), 106ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch key_range.upperOpen()); 107ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 108ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 109ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochIndexedDBKeyPath IndexedDBKeyPathBuilder::Build( 110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebIDBKeyPath& key_path) { 111ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch switch (key_path.keyPathType()) { 112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebIDBKeyPathTypeString: 113ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return IndexedDBKeyPath(key_path.string()); 114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebIDBKeyPathTypeArray: 115ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return IndexedDBKeyPath(CopyArray(key_path.array())); 116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebIDBKeyPathTypeNull: 117ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return IndexedDBKeyPath(); 11823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) default: 11923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) NOTREACHED(); 12023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return IndexedDBKeyPath(); 121ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 122ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 123ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebIDBKeyPath WebIDBKeyPathBuilder::Build( 125ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const IndexedDBKeyPath& key_path) { 126ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch switch (key_path.type()) { 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebIDBKeyPathTypeString: 128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return blink::WebIDBKeyPath::create(WebString(key_path.string())); 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebIDBKeyPathTypeArray: 130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return blink::WebIDBKeyPath::create(CopyArray(key_path.array())); 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebIDBKeyPathTypeNull: 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return blink::WebIDBKeyPath::createNull(); 13323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) default: 13423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) NOTREACHED(); 13523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return blink::WebIDBKeyPath::createNull(); 136ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 137ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 138ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 139ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} // namespace content 140