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