Index: content/browser/indexed_db/idbbindingutilities_browsertest.cc |
diff --git a/content/browser/indexed_db/idbbindingutilities_browsertest.cc b/content/browser/indexed_db/idbbindingutilities_browsertest.cc |
deleted file mode 100644 |
index d23dd998387d36ca8958607cc750b24574fc64c2..0000000000000000000000000000000000000000 |
--- a/content/browser/indexed_db/idbbindingutilities_browsertest.cc |
+++ /dev/null |
@@ -1,440 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "base/bind.h" |
-#include "base/message_loop.h" |
-#include "base/utf_string_conversions.h" |
-#include "content/browser/utility_process_host_impl.h" |
-#include "content/public/browser/utility_process_host_client.h" |
-#include "content/common/indexed_db/indexed_db_key.h" |
-#include "content/common/indexed_db/indexed_db_key_path.h" |
-#include "content/common/utility_messages.h" |
-#include "content/common/webkitplatformsupport_impl.h" |
-#include "content/public/common/serialized_script_value.h" |
-#include "content/public/test/test_utils.h" |
-#include "content/test/content_browser_test.h" |
-#include "googleurl/src/gurl.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebKit.h" |
-#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebSerializedScriptValue.h" |
-#include "webkit/glue/idb_bindings.h" |
-#include "webkit/glue/web_io_operators.h" |
- |
-using WebKit::WebSerializedScriptValue; |
-using WebKit::WebIDBKeyPath; |
- |
-namespace content { |
- |
-// Enables calling WebKit::shutdown no matter where a "return" happens. |
-class ScopedShutdownWebKit { |
- public: |
- ScopedShutdownWebKit() { |
- } |
- |
- ~ScopedShutdownWebKit() { |
- WebKit::shutdown(); |
- } |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(ScopedShutdownWebKit); |
-}; |
- |
-// Sanity test, check the function call directly outside the sandbox. |
-TEST(IDBKeyPathWithoutSandbox, Value) { |
- WebKitPlatformSupportImpl webkit_platform_support; |
- WebKit::initialize(&webkit_platform_support); |
- ScopedShutdownWebKit shutdown_webkit; |
- |
- // {foo: "zoo"} |
- char16 data_foo_zoo[] = {0x0353,0x6f66,0x536f,0x7a03,0x6f6f,0x017b}; |
- std::vector<WebSerializedScriptValue> serialized_values; |
- serialized_values.push_back( |
- WebSerializedScriptValue::fromString(string16(data_foo_zoo, |
- arraysize(data_foo_zoo)))); |
- |
- // {foo: null} |
- char16 data_foo_null[] = {0x0353, 0x6f66, 0x306f, 0x017b}; |
- serialized_values.push_back(SerializedScriptValue( |
- false, false, string16(data_foo_null, arraysize(data_foo_null)))); |
- |
- // {} |
- char16 data_object[] = {0x017b}; |
- serialized_values.push_back(SerializedScriptValue( |
- false, false, string16(data_object, arraysize(data_object)))); |
- |
- // null |
- serialized_values.push_back( |
- WebSerializedScriptValue::fromString(string16())); |
- |
- std::vector<WebKit::WebIDBKey> values; |
- IndexedDBKeyPath key_path; |
- |
- key_path.SetString(UTF8ToUTF16("foo")); |
- webkit_glue::IDBKeysFromValuesAndKeyPath( |
- serialized_values, key_path, &values); |
- |
- ASSERT_EQ(size_t(4), values.size()); |
- ASSERT_EQ(WebKit::WebIDBKey::StringType, values[0].type()); |
- ASSERT_EQ(UTF8ToUTF16("zoo"), values[0].string()); |
- ASSERT_EQ(WebKit::WebIDBKey::InvalidType, values[1].type()); |
- ASSERT_EQ(WebKit::WebIDBKey::NullType, values[2].type()); |
- ASSERT_EQ(WebKit::WebIDBKey::NullType, values[3].type()); |
- |
- values.clear(); |
- key_path.SetString(UTF8ToUTF16("PropertyNotAvailable")); |
- webkit_glue::IDBKeysFromValuesAndKeyPath( |
- serialized_values, key_path, &values); |
- |
- ASSERT_EQ(size_t(4), values.size()); |
- ASSERT_EQ(WebKit::WebIDBKey::NullType, values[0].type()); |
- ASSERT_EQ(WebKit::WebIDBKey::NullType, values[1].type()); |
- ASSERT_EQ(WebKit::WebIDBKey::NullType, values[2].type()); |
- ASSERT_EQ(WebKit::WebIDBKey::NullType, values[3].type()); |
- |
- values.clear(); |
- key_path.SetString(UTF8ToUTF16("!+Invalid[KeyPath[[[")); |
- ASSERT_FALSE(key_path.IsValid()); |
-} |
- |
-class IDBKeyPathHelper : public UtilityProcessHostClient { |
- public: |
- IDBKeyPathHelper() |
- : expected_id_(0), |
- value_for_key_path_failed_(false) { |
- } |
- |
- void CreateUtilityProcess() { |
- if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- base::Bind(&IDBKeyPathHelper::CreateUtilityProcess, this)); |
- return; |
- } |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- utility_process_host_ = |
- (new UtilityProcessHostImpl(this, BrowserThread::IO))->AsWeakPtr(); |
- utility_process_host_->EnableZygote(); |
- utility_process_host_->StartBatchMode(); |
- BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
- MessageLoop::QuitClosure()); |
- } |
- |
- void DestroyUtilityProcess() { |
- if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- base::Bind(&IDBKeyPathHelper::DestroyUtilityProcess, this)); |
- return; |
- } |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- utility_process_host_->EndBatchMode(); |
- utility_process_host_.reset(); |
- BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
- MessageLoop::QuitClosure()); |
- } |
- |
- void SetExpectedKeys(int expected_id, |
- const std::vector<IndexedDBKey>& expected_keys, |
- bool failed) { |
- expected_id_ = expected_id; |
- expected_keys_ = expected_keys; |
- value_for_key_path_failed_ = failed; |
- } |
- |
- void SetExpectedValue(const SerializedScriptValue& expected_value) { |
- expected_value_ = expected_value; |
- } |
- |
- void CheckValuesForKeyPath( |
- int id, |
- const std::vector<SerializedScriptValue>& serialized_values, |
- const IndexedDBKeyPath& key_path) { |
- if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- base::Bind(&IDBKeyPathHelper::CheckValuesForKeyPath, this, id, |
- serialized_values, key_path)); |
- return; |
- } |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- bool ret = utility_process_host_->Send( |
- new UtilityMsg_IDBKeysFromValuesAndKeyPath( |
- id, serialized_values, key_path)); |
- ASSERT_TRUE(ret); |
- } |
- |
- void CheckInjectValue(const IndexedDBKey& key, |
- const SerializedScriptValue& value, |
- const IndexedDBKeyPath& key_path) { |
- if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- base::Bind(&IDBKeyPathHelper::CheckInjectValue, this, key, value, |
- key_path)); |
- return; |
- } |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- bool ret = utility_process_host_->Send(new UtilityMsg_InjectIDBKey( |
- key, value, key_path)); |
- ASSERT_TRUE(ret); |
- } |
- |
- // UtilityProcessHostClient |
- bool OnMessageReceived(const IPC::Message& message) { |
- bool msg_is_ok = true; |
- bool handled = true; |
- IPC_BEGIN_MESSAGE_MAP_EX(IDBKeyPathHelper, message, msg_is_ok) |
- IPC_MESSAGE_HANDLER(UtilityHostMsg_IDBKeysFromValuesAndKeyPath_Succeeded, |
- OnIDBKeysFromValuesAndKeyPathSucceeded) |
- IPC_MESSAGE_HANDLER(UtilityHostMsg_InjectIDBKey_Finished, |
- OnInjectIDBKeyFinished) |
- IPC_MESSAGE_UNHANDLED(handled = false) |
- IPC_END_MESSAGE_MAP_EX() |
- return handled; |
- } |
- |
- void OnIDBKeysFromValuesAndKeyPathSucceeded( |
- int id, const std::vector<IndexedDBKey>& values) { |
- EXPECT_EQ(expected_id_, id); |
- EXPECT_FALSE(value_for_key_path_failed_); |
- ASSERT_EQ(expected_keys_.size(), values.size()); |
- size_t pos = 0; |
- for (std::vector<IndexedDBKey>::const_iterator i(values.begin()); |
- i != values.end(); ++i, ++pos) { |
- ASSERT_EQ(expected_keys_[pos].type(), i->type()); |
- if (i->type() == WebKit::WebIDBKey::StringType) { |
- ASSERT_EQ(expected_keys_[pos].string(), i->string()); |
- } else if (i->type() == WebKit::WebIDBKey::NumberType) { |
- ASSERT_EQ(expected_keys_[pos].number(), i->number()); |
- } |
- } |
- BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
- MessageLoop::QuitClosure()); |
- } |
- |
- void OnIDBKeysFromValuesAndKeyPathFailed(int id) { |
- EXPECT_TRUE(value_for_key_path_failed_); |
- BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
- MessageLoop::QuitClosure()); |
- } |
- |
- void OnInjectIDBKeyFinished(const SerializedScriptValue& new_value) { |
- EXPECT_EQ(expected_value_.data(), new_value.data()); |
- BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
- MessageLoop::QuitClosure()); |
- } |
- |
- |
- private: |
- virtual ~IDBKeyPathHelper() {} |
- |
- int expected_id_; |
- std::vector<IndexedDBKey> expected_keys_; |
- base::WeakPtr<UtilityProcessHost> utility_process_host_; |
- bool value_for_key_path_failed_; |
- SerializedScriptValue expected_value_; |
-}; |
- |
-// This test fixture runs in the UI thread. However, most of the work done by |
-// UtilityProcessHost (and wrapped by IDBKeyPathHelper above) happens on the IO |
-// thread. This fixture delegates to IDBKeyPathHelper and blocks via |
-// "RunMessageLoop()", until IDBKeyPathHelper posts a quit |
-// message the MessageLoop. |
-class ScopedIDBKeyPathHelper { |
- public: |
- ScopedIDBKeyPathHelper() { |
- key_path_helper_ = new IDBKeyPathHelper(); |
- key_path_helper_->CreateUtilityProcess(); |
- RunMessageLoop(); |
- } |
- |
- ~ScopedIDBKeyPathHelper() { |
- key_path_helper_->DestroyUtilityProcess(); |
- RunMessageLoop(); |
- } |
- |
- void SetExpectedKeys(int id, |
- const std::vector<IndexedDBKey>& expected_keys, |
- bool failed) { |
- key_path_helper_->SetExpectedKeys(id, expected_keys, failed); |
- } |
- |
- void SetExpectedValue(const SerializedScriptValue& expected_value) { |
- key_path_helper_->SetExpectedValue(expected_value); |
- } |
- |
- void CheckValuesForKeyPath( |
- int id, |
- const std::vector<SerializedScriptValue>& |
- serialized_script_values, |
- const IndexedDBKeyPath& key_path) { |
- key_path_helper_->CheckValuesForKeyPath(id, serialized_script_values, |
- key_path); |
- RunMessageLoop(); |
- } |
- |
- void CheckInjectValue(const IndexedDBKey& key, |
- const SerializedScriptValue& value, |
- const IndexedDBKeyPath& key_path) { |
- key_path_helper_->CheckInjectValue(key, value, key_path); |
- RunMessageLoop(); |
- } |
- |
- private: |
- scoped_refptr<IDBKeyPathHelper> key_path_helper_; |
-}; |
- |
-// Cases: |
-IN_PROC_BROWSER_TEST_F(ContentBrowserTest, IDBKeyPathExtract) { |
- ScopedIDBKeyPathHelper scoped_helper; |
- const int kId = 7; |
- std::vector<IndexedDBKey> expected_keys; |
- std::vector<SerializedScriptValue> serialized_values; |
- |
- IndexedDBKey string_zoo_key; |
- string_zoo_key.SetString(UTF8ToUTF16("zoo")); |
- IndexedDBKey null_key; |
- null_key.SetNull(); |
- IndexedDBKey invalid_key; |
- invalid_key.SetInvalid(); |
- |
- // keypath: "foo", value: {foo: "zoo"}, expected: "zoo" |
- char16 data_foo_zoo[] = {0x0353,0x6f66,0x536f,0x7a03,0x6f6f,0x017b}; |
- serialized_values.push_back(SerializedScriptValue( |
- false, false, string16(data_foo_zoo, arraysize(data_foo_zoo)))); |
- expected_keys.push_back(string_zoo_key); |
- |
- // keypath: "foo", value: {foo: null}, expected: invalid |
- char16 data_foo_null[] = {0x0353, 0x6f66, 0x306f, 0x017b}; |
- serialized_values.push_back(SerializedScriptValue( |
- false, false, string16(data_foo_null, arraysize(data_foo_null)))); |
- expected_keys.push_back(invalid_key); |
- |
- // keypath: "foo", value: {}, expected: null |
- char16 data_object[] = {0x017b}; |
- serialized_values.push_back(SerializedScriptValue( |
- false, false, string16(data_object, arraysize(data_object)))); |
- expected_keys.push_back(null_key); |
- |
- // keypath: "foo", value: null, expected: null |
- serialized_values.push_back( |
- SerializedScriptValue(true, false, string16())); |
- expected_keys.push_back(null_key); |
- |
- scoped_helper.SetExpectedKeys(kId, expected_keys, false); |
- |
- IndexedDBKeyPath key_path; |
- key_path.SetString(UTF8ToUTF16("foo")); |
- scoped_helper.CheckValuesForKeyPath( |
- kId, serialized_values, key_path); |
-} |
- |
-IN_PROC_BROWSER_TEST_F(ContentBrowserTest, IDBKeyPathPropertyNotAvailable) { |
- ScopedIDBKeyPathHelper scoped_helper; |
- const int kId = 7; |
- std::vector<IndexedDBKey> expected_keys; |
- IndexedDBKey null_value; |
- null_value.SetNull(); |
- expected_keys.push_back(null_value); |
- expected_keys.push_back(null_value); |
- |
- scoped_helper.SetExpectedKeys(kId, expected_keys, false); |
- |
- std::vector<SerializedScriptValue> serialized_values; |
- // {foo: "zoo", bar: null} |
- char16 data[] = {0x0353, 0x6f66, 0x536f, 0x7a03, 0x6f6f, 0x0353, 0x6162, |
- 0x3072, 0x027b}; |
- serialized_values.push_back(SerializedScriptValue( |
- false, false, string16(data, arraysize(data)))); |
- |
- // null |
- serialized_values.push_back( |
- SerializedScriptValue(true, false, string16())); |
- |
- IndexedDBKeyPath key_path; |
- key_path.SetString(UTF8ToUTF16("PropertyNotAvailable")); |
- scoped_helper.CheckValuesForKeyPath(kId, serialized_values, key_path); |
-} |
- |
-IN_PROC_BROWSER_TEST_F(ContentBrowserTest, IDBKeyPathMultipleCalls) { |
- ScopedIDBKeyPathHelper scoped_helper; |
- const int kId = 7; |
- std::vector<IndexedDBKey> expected_keys; |
- |
- IndexedDBKey null_value; |
- null_value.SetNull(); |
- expected_keys.push_back(null_value); |
- expected_keys.push_back(null_value); |
- scoped_helper.SetExpectedKeys(kId, expected_keys, false); |
- |
- std::vector<SerializedScriptValue> serialized_values; |
- |
- // {foo: "zoo", bar: null} |
- char16 data[] = {0x0353, 0x6f66, 0x536f, 0x7a03, 0x6f6f, 0x0353, 0x6162, |
- 0x3072, 0x027b}; |
- serialized_values.push_back(SerializedScriptValue( |
- false, false, string16(data, arraysize(data)))); |
- |
- // null |
- serialized_values.push_back( |
- SerializedScriptValue(true, false, string16())); |
- |
- IndexedDBKeyPath key_path; |
- key_path.SetString(UTF8ToUTF16("PropertyNotAvailable")); |
- scoped_helper.CheckValuesForKeyPath(kId, serialized_values, key_path); |
- |
- // Call again with the Utility process in batch mode and with valid keys. |
- expected_keys.clear(); |
- IndexedDBKey value; |
- value.SetString(UTF8ToUTF16("zoo")); |
- expected_keys.push_back(value); |
- expected_keys.push_back(null_value); |
- scoped_helper.SetExpectedKeys(kId + 1, expected_keys, false); |
- key_path.SetString(UTF8ToUTF16("foo")); |
- scoped_helper.CheckValuesForKeyPath(kId + 1, serialized_values, key_path); |
-} |
- |
-IN_PROC_BROWSER_TEST_F(ContentBrowserTest, InjectIDBKey) { |
- // {foo: 'zoo'} |
- const char16 initial_data[] = {0x0353,0x6f66,0x536f,0x7a03,0x6f6f,0x017b}; |
- SerializedScriptValue value( |
- false, false, string16(initial_data, arraysize(initial_data))); |
- IndexedDBKey key; |
- key.SetString(UTF8ToUTF16("myNewKey")); |
- |
- ScopedIDBKeyPathHelper scoped_helper; |
- |
- // {foo: 'zoo', bar: 'myNewKey'} |
- const char16 expected_data[] = {0x01ff, 0x003f, 0x3f6f, 0x5301, 0x6603, |
- 0x6f6f, 0x013f, 0x0353, 0x6f7a, 0x3f6f, |
- 0x5301, 0x6203, 0x7261, 0x013f, 0x0853, |
- 0x796d, 0x654e, 0x4b77, 0x7965, 0x027b}; |
- SerializedScriptValue expected_value( |
- false, false, string16(expected_data, arraysize(expected_data))); |
- scoped_helper.SetExpectedValue(expected_value); |
- IndexedDBKeyPath key_path; |
- key_path.SetString(UTF8ToUTF16("bar")); |
- scoped_helper.CheckInjectValue(key, value, key_path); |
- |
- // Should fail - can't apply properties to string value of key foo |
- const SerializedScriptValue failure_value; |
- scoped_helper.SetExpectedValue(failure_value); |
- key_path.SetString(UTF8ToUTF16("foo.bad.path")); |
- scoped_helper.CheckInjectValue(key, value, key_path); |
- |
- // {foo: 'zoo', bar: {baz: 'myNewKey'}} |
- const char16 expected_data2[] = {0x01ff, 0x003f, 0x3f6f, 0x5301, 0x6603, |
- 0x6f6f, 0x013f, 0x0353, 0x6f7a, 0x3f6f, |
- 0x5301, 0x6203, 0x7261, 0x013f, 0x3f6f, |
- 0x5302, 0x6203, 0x7a61, 0x023f, 0x0853, |
- 0x796d, 0x654e, 0x4b77, 0x7965, 0x017b, |
- 0x027b}; |
- SerializedScriptValue expected_value2( |
- false, false, string16(expected_data2, arraysize(expected_data2))); |
- scoped_helper.SetExpectedValue(expected_value2); |
- key_path.SetString(UTF8ToUTF16("bar.baz")); |
- scoped_helper.CheckInjectValue(key, value, key_path); |
-} |
- |
-} // namespace content |