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