1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 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/utility_process_host.h" 83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/test/in_process_browser_test.h" 93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/test/ui_test_utils.h" 10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/resource_dispatcher_host.h" 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/indexed_db_key.h" 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/serialized_script_value.h" 133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "googleurl/src/gurl.h" 143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "testing/gtest/include/gtest/gtest.h" 1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebSerializedScriptValue.h" 163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "webkit/glue/idb_bindings.h" 17731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "webkit/glue/web_io_operators.h" 183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickusing WebKit::WebSerializedScriptValue; 203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Sanity test, check the function call directly outside the sandbox. 223345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST(IDBKeyPathWithoutSandbox, Value) { 233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick char16 data[] = {0x0353,0x6f66,0x536f,0x7a03,0x6f6f,0x017b}; 243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::vector<WebSerializedScriptValue> serialized_values; 253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick serialized_values.push_back( 263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick WebSerializedScriptValue::fromString(string16(data, arraysize(data)))); 273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick serialized_values.push_back( 283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick WebSerializedScriptValue::fromString(string16())); 293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::vector<WebKit::WebIDBKey> values; 313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 key_path(UTF8ToUTF16("foo")); 323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool error = webkit_glue::IDBKeysFromValuesAndKeyPath( 333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick serialized_values, key_path, &values); 343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(size_t(2), values.size()); 363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(WebKit::WebIDBKey::StringType, values[0].type()); 373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(UTF8ToUTF16("zoo"), values[0].string()); 383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(WebKit::WebIDBKey::InvalidType, values[1].type()); 393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_FALSE(error); 403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick values.clear(); 423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick key_path = UTF8ToUTF16("PropertyNotAvailable"); 433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick error = webkit_glue::IDBKeysFromValuesAndKeyPath( 443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick serialized_values, key_path, &values); 453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(size_t(2), values.size()); 473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(WebKit::WebIDBKey::InvalidType, values[0].type()); 483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(WebKit::WebIDBKey::InvalidType, values[1].type()); 493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_FALSE(error); 503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick values.clear(); 523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick key_path = UTF8ToUTF16("!+Invalid[KeyPath[[["); 533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick error = webkit_glue::IDBKeysFromValuesAndKeyPath( 543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick serialized_values, key_path, &values); 553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(error); 573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(size_t(2), values.size()); 583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(WebKit::WebIDBKey::InvalidType, values[0].type()); 593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(WebKit::WebIDBKey::InvalidType, values[1].type()); 603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass IDBKeyPathHelper : public UtilityProcessHost::Client { 633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public: 643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDBKeyPathHelper() 653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick : expected_id_(0), 663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick utility_process_host_(NULL), 673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick value_for_key_path_failed_(false) { 683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void CreateUtilityProcess() { 71731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { 72731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask( 73731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::IO, FROM_HERE, 74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NewRunnableMethod(this, &IDBKeyPathHelper::CreateUtilityProcess)); 753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return; 763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 77731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick utility_process_host_ = 79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen new UtilityProcessHost(this, BrowserThread::IO); 803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick utility_process_host_->StartBatchMode(); 81731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 82731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick new MessageLoop::QuitTask()); 833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void DestroyUtilityProcess() { 86731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { 87731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask( 88731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::IO, FROM_HERE, 893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NewRunnableMethod(this, &IDBKeyPathHelper::DestroyUtilityProcess)); 903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return; 913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 92731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick utility_process_host_->EndBatchMode(); 943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick utility_process_host_ = NULL; 95731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 96731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick new MessageLoop::QuitTask()); 973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 99dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void SetExpectedKeys(int expected_id, 100dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::vector<IndexedDBKey>& expected_keys, 101dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool failed) { 1023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick expected_id_ = expected_id; 103dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen expected_keys_ = expected_keys; 1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick value_for_key_path_failed_ = failed; 1053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 107dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void SetExpectedValue(const SerializedScriptValue& expected_value) { 108dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen expected_value_ = expected_value; 109dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void CheckValuesForKeyPath( 1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int id, const std::vector<SerializedScriptValue>& serialized_values, 1133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const string16& key_path) { 114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { 115731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask( 116731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::IO, FROM_HERE, 1173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NewRunnableMethod(this, &IDBKeyPathHelper::CheckValuesForKeyPath, 1183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick id, serialized_values, key_path)); 1193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return; 1203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 121731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool ret = 1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick utility_process_host_->StartIDBKeysFromValuesAndKeyPath( 1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick id, serialized_values, key_path); 1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(ret); 1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 128dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void CheckInjectValue(const IndexedDBKey& key, 129dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const SerializedScriptValue& value, 130dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const string16& key_path) { 131dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { 132dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen BrowserThread::PostTask( 133dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen BrowserThread::IO, FROM_HERE, 134dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen NewRunnableMethod(this, &IDBKeyPathHelper::CheckInjectValue, 135dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen key, value, key_path)); 136dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return; 137dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 138dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 139dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool ret = utility_process_host_->StartInjectIDBKey(key, value, key_path); 140dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ASSERT_TRUE(ret); 141dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 142dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // UtilityProcessHost::Client 1443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual void OnIDBKeysFromValuesAndKeyPathSucceeded( 1453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int id, const std::vector<IndexedDBKey>& values) { 1463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(expected_id_, id); 1473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_FALSE(value_for_key_path_failed_); 148dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ASSERT_EQ(expected_keys_.size(), values.size()); 1493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick size_t pos = 0; 1503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick for (std::vector<IndexedDBKey>::const_iterator i(values.begin()); 1513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick i != values.end(); ++i, ++pos) { 152dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ASSERT_EQ(expected_keys_[pos].type(), i->type()); 1533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (i->type() == WebKit::WebIDBKey::StringType) { 154dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ASSERT_EQ(expected_keys_[pos].string(), i->string()); 1553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else if (i->type() == WebKit::WebIDBKey::NumberType) { 156dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ASSERT_EQ(expected_keys_[pos].number(), i->number()); 1573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 159731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 160731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick new MessageLoop::QuitTask()); 1613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual void OnIDBKeysFromValuesAndKeyPathFailed(int id) { 1643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(value_for_key_path_failed_); 165731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 166731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick new MessageLoop::QuitTask()); 1673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 169dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void OnInjectIDBKeyFinished( 170dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const SerializedScriptValue& new_value) { 171dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_EQ(expected_value_.data(), new_value.data()); 172dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 173dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen new MessageLoop::QuitTask()); 174dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 175dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 176dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 1773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private: 1783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int expected_id_; 179dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::vector<IndexedDBKey> expected_keys_; 1803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick UtilityProcessHost* utility_process_host_; 1813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool value_for_key_path_failed_; 182dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen SerializedScriptValue expected_value_; 1833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}; 1843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// This test fixture runs in the UI thread. However, most of the work done by 1863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// UtilityProcessHost (and wrapped by IDBKeyPathHelper above) happens on the IO 1873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// thread. This fixture delegates to IDBKeyPathHelper and blocks via 1883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// "ui_test_utils::RunMessageLoop()", until IDBKeyPathHelper posts a quit 1893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// message the MessageLoop. 1903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass ScopedIDBKeyPathHelper { 1913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public: 1923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ScopedIDBKeyPathHelper() { 1933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick key_path_helper_ = new IDBKeyPathHelper(); 194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen key_path_helper_->CreateUtilityProcess(); 1953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ui_test_utils::RunMessageLoop(); 1963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ~ScopedIDBKeyPathHelper() { 1993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick key_path_helper_->DestroyUtilityProcess(); 2003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ui_test_utils::RunMessageLoop(); 2013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 2023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 203dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void SetExpectedKeys(int id, const std::vector<IndexedDBKey>& expected_keys, 2043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool failed) { 205dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen key_path_helper_->SetExpectedKeys(id, expected_keys, failed); 206dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 207dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 208dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void SetExpectedValue(const SerializedScriptValue& expected_value) { 209dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen key_path_helper_->SetExpectedValue(expected_value); 2103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 2113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void CheckValuesForKeyPath( 2133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int id, 2143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const std::vector<SerializedScriptValue>& serialized_script_values, 2153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const string16& key_path) { 2163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick key_path_helper_->CheckValuesForKeyPath(id, serialized_script_values, 2173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick key_path); 2183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ui_test_utils::RunMessageLoop(); 2193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 2203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 221dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void CheckInjectValue(const IndexedDBKey& key, 222dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const SerializedScriptValue& value, 223dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const string16& key_path) { 224dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen key_path_helper_->CheckInjectValue(key, value, key_path); 225dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ui_test_utils::RunMessageLoop(); 226dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 227dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 2283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private: 2293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scoped_refptr<IDBKeyPathHelper> key_path_helper_; 2303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}; 2313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2323345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickIN_PROC_BROWSER_TEST_F(InProcessBrowserTest, IDBKeyPathExtract) { 2333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ScopedIDBKeyPathHelper scoped_helper; 2343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const int kId = 7; 235dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::vector<IndexedDBKey> expected_keys; 2363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IndexedDBKey value; 23721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen value.SetString(UTF8ToUTF16("zoo")); 238dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen expected_keys.push_back(value); 2393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IndexedDBKey invalid_value; 2413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick invalid_value.SetInvalid(); 242dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen expected_keys.push_back(invalid_value); 2433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 244dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen scoped_helper.SetExpectedKeys(kId, expected_keys, false); 2453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick char16 data[] = {0x0353,0x6f66,0x536f,0x7a03,0x6f6f,0x017b}; 2473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::vector<SerializedScriptValue> serialized_values; 2483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick serialized_values.push_back( 2493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SerializedScriptValue(false, false, string16(data, arraysize(data)))); 2503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick serialized_values.push_back( 2513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SerializedScriptValue(true, false, string16())); 2523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scoped_helper.CheckValuesForKeyPath( 2533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick kId, serialized_values, UTF8ToUTF16("foo")); 2543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 2553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2563345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickIN_PROC_BROWSER_TEST_F(InProcessBrowserTest, IDBKeyPathPropertyNotAvailable) { 2573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ScopedIDBKeyPathHelper scoped_helper; 2583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const int kId = 7; 259dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::vector<IndexedDBKey> expected_keys; 2603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IndexedDBKey invalid_value; 2613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick invalid_value.SetInvalid(); 262dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen expected_keys.push_back(invalid_value); 263dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen expected_keys.push_back(invalid_value); 2643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 265dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen scoped_helper.SetExpectedKeys(kId, expected_keys, false); 2663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick char16 data[] = {0x0353,0x6f66,0x536f,0x7a03,0x6f6f,0x017b}; 2683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::vector<SerializedScriptValue> serialized_values; 2693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick serialized_values.push_back( 2703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SerializedScriptValue(false, false, string16(data, arraysize(data)))); 2713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick serialized_values.push_back( 2723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SerializedScriptValue(true, false, string16())); 2733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scoped_helper.CheckValuesForKeyPath(kId, serialized_values, 2743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick UTF8ToUTF16("PropertyNotAvailable")); 2753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 2763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2773345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickIN_PROC_BROWSER_TEST_F(InProcessBrowserTest, IDBKeyPathMultipleCalls) { 2783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ScopedIDBKeyPathHelper scoped_helper; 2793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const int kId = 7; 280dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::vector<IndexedDBKey> expected_keys; 2813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IndexedDBKey invalid_value; 2823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick invalid_value.SetInvalid(); 283dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen expected_keys.push_back(invalid_value); 284dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen expected_keys.push_back(invalid_value); 2853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 286dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen scoped_helper.SetExpectedKeys(kId, expected_keys, true); 2873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick char16 data[] = {0x0353,0x6f66,0x536f,0x7a03,0x6f6f,0x017b}; 2893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::vector<SerializedScriptValue> serialized_values; 2903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick serialized_values.push_back( 2913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SerializedScriptValue(false, false, string16(data, arraysize(data)))); 2923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick serialized_values.push_back( 2933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SerializedScriptValue(true, false, string16())); 2943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scoped_helper.CheckValuesForKeyPath(kId, serialized_values, 2953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick UTF8ToUTF16("!+Invalid[KeyPath[[[")); 2963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Call again with the Utility process in batch mode and with valid keys. 298dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen expected_keys.clear(); 2993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IndexedDBKey value; 30021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen value.SetString(UTF8ToUTF16("zoo")); 301dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen expected_keys.push_back(value); 302dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen expected_keys.push_back(invalid_value); 303dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen scoped_helper.SetExpectedKeys(kId + 1, expected_keys, false); 3043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scoped_helper.CheckValuesForKeyPath(kId + 1, serialized_values, 3053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick UTF8ToUTF16("foo")); 3063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 307dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 308dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenIN_PROC_BROWSER_TEST_F(InProcessBrowserTest, InjectIDBKey) { 309dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // {foo: 'zoo'} 310dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const char16 data[] = {0x0353,0x6f66,0x536f,0x7a03,0x6f6f,0x017b}; 311dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen SerializedScriptValue value(false, false, string16(data, arraysize(data))); 312dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen IndexedDBKey key; 313dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen key.SetString(UTF8ToUTF16("myNewKey")); 314dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 315dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // {foo: 'zoo', bar: 'myNewKey'} 316dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const char16 expected_data[] = {0x353, 0x6f66, 0x536f, 0x7a03, 0x6f6f, 0x353, 317dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 0x6162, 0x5372, 0x6d08, 0x4e79, 0x7765, 318dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 0x654b, 0x7b79, 0x2}; 319dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen SerializedScriptValue expected_value(false, false, 320dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen string16(expected_data, 321dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen arraysize(expected_data))); 322dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 323dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ScopedIDBKeyPathHelper scoped_helper; 324dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen scoped_helper.SetExpectedValue(expected_value); 325dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen scoped_helper.CheckInjectValue(key, value, UTF8ToUTF16("bar")); 326dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 327dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen scoped_helper.SetExpectedValue(SerializedScriptValue()); // Expect null. 328dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen scoped_helper.CheckInjectValue(key, value, UTF8ToUTF16("bad.key.path")); 329dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 330