idbbindingutilities_browsertest.cc revision 21d179b334e59e9a3bfcaed4c4430bef1bc5759d
13345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Copyright (c) 2010 The Chromium Authors. All rights reserved. 23345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Use of this source code is governed by a BSD-style license that can be 33345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// found in the LICENSE file. 43345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 53345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h" 63345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/browser_process.h" 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/renderer_host/resource_dispatcher_host.h" 84a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser.h" 93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/utility_process_host.h" 103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/common/indexed_db_key.h" 113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/common/serialized_script_value.h" 123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/test/in_process_browser_test.h" 133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/test/ui_test_utils.h" 143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "googleurl/src/gurl.h" 153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "testing/gtest/include/gtest/gtest.h" 164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "third_party/WebKit/WebKit/chromium/public/WebSerializedScriptValue.h" 173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "webkit/glue/idb_bindings.h" 18731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "webkit/glue/web_io_operators.h" 193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickusing WebKit::WebSerializedScriptValue; 213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Sanity test, check the function call directly outside the sandbox. 233345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST(IDBKeyPathWithoutSandbox, Value) { 243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick char16 data[] = {0x0353,0x6f66,0x536f,0x7a03,0x6f6f,0x017b}; 253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::vector<WebSerializedScriptValue> serialized_values; 263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick serialized_values.push_back( 273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick WebSerializedScriptValue::fromString(string16(data, arraysize(data)))); 283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick serialized_values.push_back( 293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick WebSerializedScriptValue::fromString(string16())); 303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::vector<WebKit::WebIDBKey> values; 323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 key_path(UTF8ToUTF16("foo")); 333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool error = webkit_glue::IDBKeysFromValuesAndKeyPath( 343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick serialized_values, key_path, &values); 353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(size_t(2), values.size()); 373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(WebKit::WebIDBKey::StringType, values[0].type()); 383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(UTF8ToUTF16("zoo"), values[0].string()); 393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(WebKit::WebIDBKey::InvalidType, values[1].type()); 403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_FALSE(error); 413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick values.clear(); 433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick key_path = UTF8ToUTF16("PropertyNotAvailable"); 443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick error = webkit_glue::IDBKeysFromValuesAndKeyPath( 453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick serialized_values, key_path, &values); 463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(size_t(2), values.size()); 483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(WebKit::WebIDBKey::InvalidType, values[0].type()); 493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(WebKit::WebIDBKey::InvalidType, values[1].type()); 503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_FALSE(error); 513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick values.clear(); 533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick key_path = UTF8ToUTF16("!+Invalid[KeyPath[[["); 543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick error = webkit_glue::IDBKeysFromValuesAndKeyPath( 553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick serialized_values, key_path, &values); 563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(error); 583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(size_t(2), values.size()); 593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(WebKit::WebIDBKey::InvalidType, values[0].type()); 603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(WebKit::WebIDBKey::InvalidType, values[1].type()); 613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass IDBKeyPathHelper : public UtilityProcessHost::Client { 643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public: 653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDBKeyPathHelper() 663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick : expected_id_(0), 673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick utility_process_host_(NULL), 683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick value_for_key_path_failed_(false) { 693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void CreateUtilityProcess(ResourceDispatcherHost* resource_dispatcher_host) { 72731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { 73731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask( 74731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::IO, FROM_HERE, 753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NewRunnableMethod(this, &IDBKeyPathHelper::CreateUtilityProcess, 763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick resource_dispatcher_host)); 773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return; 783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 79731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick utility_process_host_ = 813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick new UtilityProcessHost(resource_dispatcher_host, this, 82731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::IO); 833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick utility_process_host_->StartBatchMode(); 84731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 85731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick new MessageLoop::QuitTask()); 863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void DestroyUtilityProcess() { 89731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { 90731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask( 91731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::IO, FROM_HERE, 923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NewRunnableMethod(this, &IDBKeyPathHelper::DestroyUtilityProcess)); 933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return; 943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 95731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick utility_process_host_->EndBatchMode(); 973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick utility_process_host_ = NULL; 98731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 99731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick new MessageLoop::QuitTask()); 1003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void SetExpected(int expected_id, 1033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const std::vector<IndexedDBKey>& expected_values, 1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool failed) { 1053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick expected_id_ = expected_id; 1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick expected_values_ = expected_values; 1073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick value_for_key_path_failed_ = failed; 1083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void CheckValuesForKeyPath( 1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int id, const std::vector<SerializedScriptValue>& serialized_values, 1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const string16& key_path) { 113731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { 114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask( 115731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::IO, FROM_HERE, 1163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NewRunnableMethod(this, &IDBKeyPathHelper::CheckValuesForKeyPath, 1173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick id, serialized_values, key_path)); 1183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return; 1193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 1213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool ret = 1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick utility_process_host_->StartIDBKeysFromValuesAndKeyPath( 1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick id, serialized_values, key_path); 1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(ret); 1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // UtilityProcessHost::Client 1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual void OnIDBKeysFromValuesAndKeyPathSucceeded( 1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int id, const std::vector<IndexedDBKey>& values) { 1303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(expected_id_, id); 1313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_FALSE(value_for_key_path_failed_); 1323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(expected_values_.size(), values.size()); 1333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick size_t pos = 0; 1343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick for (std::vector<IndexedDBKey>::const_iterator i(values.begin()); 1353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick i != values.end(); ++i, ++pos) { 1363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(expected_values_[pos].type(), i->type()); 1373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (i->type() == WebKit::WebIDBKey::StringType) { 1383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(expected_values_[pos].string(), i->string()); 1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else if (i->type() == WebKit::WebIDBKey::NumberType) { 1403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(expected_values_[pos].number(), i->number()); 1413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 143731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 144731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick new MessageLoop::QuitTask()); 1453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual void OnIDBKeysFromValuesAndKeyPathFailed(int id) { 1483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(value_for_key_path_failed_); 149731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 150731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick new MessageLoop::QuitTask()); 1513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private: 1543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int expected_id_; 1553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::vector<IndexedDBKey> expected_values_; 1563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick UtilityProcessHost* utility_process_host_; 1573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool value_for_key_path_failed_; 1583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}; 1593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// This test fixture runs in the UI thread. However, most of the work done by 1613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// UtilityProcessHost (and wrapped by IDBKeyPathHelper above) happens on the IO 1623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// thread. This fixture delegates to IDBKeyPathHelper and blocks via 1633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// "ui_test_utils::RunMessageLoop()", until IDBKeyPathHelper posts a quit 1643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// message the MessageLoop. 1653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass ScopedIDBKeyPathHelper { 1663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public: 1673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ScopedIDBKeyPathHelper() { 1683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick key_path_helper_ = new IDBKeyPathHelper(); 1693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick key_path_helper_->CreateUtilityProcess( 1703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick g_browser_process->resource_dispatcher_host()); 1713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ui_test_utils::RunMessageLoop(); 1723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ~ScopedIDBKeyPathHelper() { 1753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick key_path_helper_->DestroyUtilityProcess(); 1763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ui_test_utils::RunMessageLoop(); 1773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void SetExpected(int id, const std::vector<IndexedDBKey>& expected_values, 1803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool failed) { 1813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick key_path_helper_->SetExpected(id, expected_values, failed); 1823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void CheckValuesForKeyPath( 1853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int id, 1863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const std::vector<SerializedScriptValue>& serialized_script_values, 1873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const string16& key_path) { 1883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick key_path_helper_->CheckValuesForKeyPath(id, serialized_script_values, 1893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick key_path); 1903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ui_test_utils::RunMessageLoop(); 1913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private: 1943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scoped_refptr<IDBKeyPathHelper> key_path_helper_; 1953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}; 1963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1973345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickIN_PROC_BROWSER_TEST_F(InProcessBrowserTest, IDBKeyPathExtract) { 1983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ScopedIDBKeyPathHelper scoped_helper; 1993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const int kId = 7; 2003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::vector<IndexedDBKey> expected_values; 2013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IndexedDBKey value; 20221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen value.SetString(UTF8ToUTF16("zoo")); 2033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick expected_values.push_back(value); 2043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IndexedDBKey invalid_value; 2063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick invalid_value.SetInvalid(); 2073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick expected_values.push_back(invalid_value); 2083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scoped_helper.SetExpected(kId, expected_values, false); 2103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick char16 data[] = {0x0353,0x6f66,0x536f,0x7a03,0x6f6f,0x017b}; 2123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::vector<SerializedScriptValue> serialized_values; 2133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick serialized_values.push_back( 2143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SerializedScriptValue(false, false, string16(data, arraysize(data)))); 2153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick serialized_values.push_back( 2163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SerializedScriptValue(true, false, string16())); 2173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scoped_helper.CheckValuesForKeyPath( 2183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick kId, serialized_values, UTF8ToUTF16("foo")); 2193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 2203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2213345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickIN_PROC_BROWSER_TEST_F(InProcessBrowserTest, IDBKeyPathPropertyNotAvailable) { 2223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ScopedIDBKeyPathHelper scoped_helper; 2233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const int kId = 7; 2243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::vector<IndexedDBKey> expected_values; 2253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IndexedDBKey invalid_value; 2263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick invalid_value.SetInvalid(); 2273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick expected_values.push_back(invalid_value); 2283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick expected_values.push_back(invalid_value); 2293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scoped_helper.SetExpected(kId, expected_values, false); 2313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick char16 data[] = {0x0353,0x6f66,0x536f,0x7a03,0x6f6f,0x017b}; 2333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::vector<SerializedScriptValue> serialized_values; 2343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick serialized_values.push_back( 2353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SerializedScriptValue(false, false, string16(data, arraysize(data)))); 2363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick serialized_values.push_back( 2373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SerializedScriptValue(true, false, string16())); 2383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scoped_helper.CheckValuesForKeyPath(kId, serialized_values, 2393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick UTF8ToUTF16("PropertyNotAvailable")); 2403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 2413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2423345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickIN_PROC_BROWSER_TEST_F(InProcessBrowserTest, IDBKeyPathMultipleCalls) { 2433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ScopedIDBKeyPathHelper scoped_helper; 2443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const int kId = 7; 2453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::vector<IndexedDBKey> expected_values; 2463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IndexedDBKey invalid_value; 2473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick invalid_value.SetInvalid(); 2483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick expected_values.push_back(invalid_value); 2493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick expected_values.push_back(invalid_value); 2503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scoped_helper.SetExpected(kId, expected_values, true); 2523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick char16 data[] = {0x0353,0x6f66,0x536f,0x7a03,0x6f6f,0x017b}; 2543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::vector<SerializedScriptValue> serialized_values; 2553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick serialized_values.push_back( 2563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SerializedScriptValue(false, false, string16(data, arraysize(data)))); 2573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick serialized_values.push_back( 2583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SerializedScriptValue(true, false, string16())); 2593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scoped_helper.CheckValuesForKeyPath(kId, serialized_values, 2603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick UTF8ToUTF16("!+Invalid[KeyPath[[[")); 2613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Call again with the Utility process in batch mode and with valid keys. 2633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick expected_values.clear(); 2643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IndexedDBKey value; 26521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen value.SetString(UTF8ToUTF16("zoo")); 2663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick expected_values.push_back(value); 2673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick expected_values.push_back(invalid_value); 2683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scoped_helper.SetExpected(kId + 1, expected_values, false); 2693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scoped_helper.CheckValuesForKeyPath(kId + 1, serialized_values, 2703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick UTF8ToUTF16("foo")); 2713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 272