Index: chrome/browser/idbbindingutilities_browsertest.cc |
=================================================================== |
--- chrome/browser/idbbindingutilities_browsertest.cc (revision 110802) |
+++ chrome/browser/idbbindingutilities_browsertest.cc (working copy) |
@@ -1,371 +0,0 @@ |
-// Copyright (c) 2011 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/utf_string_conversions.h" |
-#include "chrome/browser/browser_process.h" |
-#include "chrome/test/base/in_process_browser_test.h" |
-#include "chrome/test/base/ui_test_utils.h" |
-#include "content/browser/renderer_host/resource_dispatcher_host.h" |
-#include "content/browser/utility_process_host.h" |
-#include "content/common/indexed_db_key.h" |
-#include "content/common/utility_messages.h" |
-#include "content/public/common/serialized_script_value.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/WebSerializedScriptValue.h" |
-#include "webkit/glue/idb_bindings.h" |
-#include "webkit/glue/web_io_operators.h" |
-#include "webkit/glue/webkitplatformsupport_impl.h" |
- |
-using content::BrowserThread; |
-using WebKit::WebSerializedScriptValue; |
- |
-// 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) { |
- webkit_glue::WebKitPlatformSupportImpl webkit_platform_support; |
- WebKit::initialize(&webkit_platform_support); |
- ScopedShutdownWebKit shutdown_webkit; |
- |
- char16 data[] = {0x0353,0x6f66,0x536f,0x7a03,0x6f6f,0x017b}; |
- std::vector<WebSerializedScriptValue> serialized_values; |
- serialized_values.push_back( |
- WebSerializedScriptValue::fromString(string16(data, arraysize(data)))); |
- serialized_values.push_back( |
- WebSerializedScriptValue::fromString(string16())); |
- |
- std::vector<WebKit::WebIDBKey> values; |
- string16 key_path(UTF8ToUTF16("foo")); |
- bool error = webkit_glue::IDBKeysFromValuesAndKeyPath( |
- serialized_values, key_path, &values); |
- |
- ASSERT_EQ(size_t(2), 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_FALSE(error); |
- |
- values.clear(); |
- key_path = UTF8ToUTF16("PropertyNotAvailable"); |
- error = webkit_glue::IDBKeysFromValuesAndKeyPath( |
- serialized_values, key_path, &values); |
- |
- ASSERT_EQ(size_t(2), values.size()); |
- ASSERT_EQ(WebKit::WebIDBKey::InvalidType, values[0].type()); |
- ASSERT_EQ(WebKit::WebIDBKey::InvalidType, values[1].type()); |
- ASSERT_FALSE(error); |
- |
- values.clear(); |
- key_path = UTF8ToUTF16("!+Invalid[KeyPath[[["); |
- error = webkit_glue::IDBKeysFromValuesAndKeyPath( |
- serialized_values, key_path, &values); |
- |
- ASSERT_TRUE(error); |
- ASSERT_EQ(size_t(2), values.size()); |
- ASSERT_EQ(WebKit::WebIDBKey::InvalidType, values[0].type()); |
- ASSERT_EQ(WebKit::WebIDBKey::InvalidType, values[1].type()); |
-} |
- |
-class IDBKeyPathHelper : public UtilityProcessHost::Client { |
- public: |
- IDBKeyPathHelper() |
- : expected_id_(0), |
- utility_process_host_(NULL), |
- value_for_key_path_failed_(false) { |
- } |
- |
- void CreateUtilityProcess() { |
- if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- NewRunnableMethod(this, &IDBKeyPathHelper::CreateUtilityProcess)); |
- return; |
- } |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- utility_process_host_ = |
- new UtilityProcessHost(this, BrowserThread::IO); |
- utility_process_host_->StartBatchMode(); |
- BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
- new MessageLoop::QuitTask()); |
- } |
- |
- void DestroyUtilityProcess() { |
- if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- NewRunnableMethod(this, &IDBKeyPathHelper::DestroyUtilityProcess)); |
- return; |
- } |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- utility_process_host_->EndBatchMode(); |
- utility_process_host_ = NULL; |
- BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
- new MessageLoop::QuitTask()); |
- } |
- |
- 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 content::SerializedScriptValue& expected_value) { |
- expected_value_ = expected_value; |
- } |
- |
- void CheckValuesForKeyPath( |
- int id, |
- const std::vector<content::SerializedScriptValue>& serialized_values, |
- const string16& key_path) { |
- if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- NewRunnableMethod(this, &IDBKeyPathHelper::CheckValuesForKeyPath, |
- 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 content::SerializedScriptValue& value, |
- const string16& key_path) { |
- if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- NewRunnableMethod(this, &IDBKeyPathHelper::CheckInjectValue, |
- 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); |
- } |
- |
- // UtilityProcessHost::Client |
- 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_IDBKeysFromValuesAndKeyPath_Failed, |
- OnIDBKeysFromValuesAndKeyPathFailed) |
- 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, |
- new MessageLoop::QuitTask()); |
- } |
- |
- void OnIDBKeysFromValuesAndKeyPathFailed(int id) { |
- EXPECT_TRUE(value_for_key_path_failed_); |
- BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
- new MessageLoop::QuitTask()); |
- } |
- |
- void OnInjectIDBKeyFinished(const content::SerializedScriptValue& new_value) { |
- EXPECT_EQ(expected_value_.data(), new_value.data()); |
- BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
- new MessageLoop::QuitTask()); |
- } |
- |
- |
- private: |
- int expected_id_; |
- std::vector<IndexedDBKey> expected_keys_; |
- UtilityProcessHost* utility_process_host_; |
- bool value_for_key_path_failed_; |
- content::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 |
-// "ui_test_utils::RunMessageLoop()", until IDBKeyPathHelper posts a quit |
-// message the MessageLoop. |
-class ScopedIDBKeyPathHelper { |
- public: |
- ScopedIDBKeyPathHelper() { |
- key_path_helper_ = new IDBKeyPathHelper(); |
- key_path_helper_->CreateUtilityProcess(); |
- ui_test_utils::RunMessageLoop(); |
- } |
- |
- ~ScopedIDBKeyPathHelper() { |
- key_path_helper_->DestroyUtilityProcess(); |
- ui_test_utils::RunMessageLoop(); |
- } |
- |
- void SetExpectedKeys(int id, const std::vector<IndexedDBKey>& expected_keys, |
- bool failed) { |
- key_path_helper_->SetExpectedKeys(id, expected_keys, failed); |
- } |
- |
- void SetExpectedValue(const content::SerializedScriptValue& expected_value) { |
- key_path_helper_->SetExpectedValue(expected_value); |
- } |
- |
- void CheckValuesForKeyPath( |
- int id, |
- const std::vector<content::SerializedScriptValue>& |
- serialized_script_values, |
- const string16& key_path) { |
- key_path_helper_->CheckValuesForKeyPath(id, serialized_script_values, |
- key_path); |
- ui_test_utils::RunMessageLoop(); |
- } |
- |
- void CheckInjectValue(const IndexedDBKey& key, |
- const content::SerializedScriptValue& value, |
- const string16& key_path) { |
- key_path_helper_->CheckInjectValue(key, value, key_path); |
- ui_test_utils::RunMessageLoop(); |
- } |
- |
- private: |
- scoped_refptr<IDBKeyPathHelper> key_path_helper_; |
-}; |
- |
-IN_PROC_BROWSER_TEST_F(InProcessBrowserTest, IDBKeyPathExtract) { |
- ScopedIDBKeyPathHelper scoped_helper; |
- const int kId = 7; |
- std::vector<IndexedDBKey> expected_keys; |
- IndexedDBKey value; |
- value.SetString(UTF8ToUTF16("zoo")); |
- expected_keys.push_back(value); |
- |
- IndexedDBKey invalid_value; |
- invalid_value.SetInvalid(); |
- expected_keys.push_back(invalid_value); |
- |
- scoped_helper.SetExpectedKeys(kId, expected_keys, false); |
- |
- char16 data[] = {0x0353,0x6f66,0x536f,0x7a03,0x6f6f,0x017b}; |
- std::vector<content::SerializedScriptValue> serialized_values; |
- serialized_values.push_back(content::SerializedScriptValue( |
- false, false, string16(data, arraysize(data)))); |
- serialized_values.push_back( |
- content::SerializedScriptValue(true, false, string16())); |
- scoped_helper.CheckValuesForKeyPath( |
- kId, serialized_values, UTF8ToUTF16("foo")); |
-} |
- |
-IN_PROC_BROWSER_TEST_F(InProcessBrowserTest, IDBKeyPathPropertyNotAvailable) { |
- ScopedIDBKeyPathHelper scoped_helper; |
- const int kId = 7; |
- std::vector<IndexedDBKey> expected_keys; |
- IndexedDBKey invalid_value; |
- invalid_value.SetInvalid(); |
- expected_keys.push_back(invalid_value); |
- expected_keys.push_back(invalid_value); |
- |
- scoped_helper.SetExpectedKeys(kId, expected_keys, false); |
- |
- char16 data[] = {0x0353,0x6f66,0x536f,0x7a03,0x6f6f,0x017b}; |
- std::vector<content::SerializedScriptValue> serialized_values; |
- serialized_values.push_back(content::SerializedScriptValue( |
- false, false, string16(data, arraysize(data)))); |
- serialized_values.push_back( |
- content::SerializedScriptValue(true, false, string16())); |
- scoped_helper.CheckValuesForKeyPath(kId, serialized_values, |
- UTF8ToUTF16("PropertyNotAvailable")); |
-} |
- |
-IN_PROC_BROWSER_TEST_F(InProcessBrowserTest, IDBKeyPathMultipleCalls) { |
- ScopedIDBKeyPathHelper scoped_helper; |
- const int kId = 7; |
- std::vector<IndexedDBKey> expected_keys; |
- IndexedDBKey invalid_value; |
- invalid_value.SetInvalid(); |
- expected_keys.push_back(invalid_value); |
- expected_keys.push_back(invalid_value); |
- |
- scoped_helper.SetExpectedKeys(kId, expected_keys, true); |
- |
- char16 data[] = {0x0353,0x6f66,0x536f,0x7a03,0x6f6f,0x017b}; |
- std::vector<content::SerializedScriptValue> serialized_values; |
- serialized_values.push_back(content::SerializedScriptValue( |
- false, false, string16(data, arraysize(data)))); |
- serialized_values.push_back( |
- content::SerializedScriptValue(true, false, string16())); |
- scoped_helper.CheckValuesForKeyPath(kId, serialized_values, |
- UTF8ToUTF16("!+Invalid[KeyPath[[[")); |
- |
- // 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(invalid_value); |
- scoped_helper.SetExpectedKeys(kId + 1, expected_keys, false); |
- scoped_helper.CheckValuesForKeyPath(kId + 1, serialized_values, |
- UTF8ToUTF16("foo")); |
-} |
- |
-IN_PROC_BROWSER_TEST_F(InProcessBrowserTest, InjectIDBKey) { |
- // {foo: 'zoo'} |
- const char16 data[] = {0x0353,0x6f66,0x536f,0x7a03,0x6f6f,0x017b}; |
- content::SerializedScriptValue value( |
- false, false, string16(data, arraysize(data))); |
- IndexedDBKey key; |
- key.SetString(UTF8ToUTF16("myNewKey")); |
- |
- // {foo: 'zoo', bar: 'myNewKey'} |
- const char16 expected_data[] = {0x353, 0x6f66, 0x536f, 0x7a03, 0x6f6f, 0x353, |
- 0x6162, 0x5372, 0x6d08, 0x4e79, 0x7765, |
- 0x654b, 0x7b79, 0x2}; |
- content::SerializedScriptValue expected_value( |
- false, false, string16(expected_data, arraysize(expected_data))); |
- |
- ScopedIDBKeyPathHelper scoped_helper; |
- scoped_helper.SetExpectedValue(expected_value); |
- // TODO(lukezarko@gmail.com): re-enable this after the changes described at |
- // https://bugs.webkit.org/show_bug.cgi?id=63481 land. |
- // scoped_helper.CheckInjectValue(key, value, UTF8ToUTF16("bar")); |
- |
- // Expect null. |
- scoped_helper.SetExpectedValue(content::SerializedScriptValue()); |
- scoped_helper.CheckInjectValue(key, value, UTF8ToUTF16("bad.key.path")); |
-} |