Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(482)

Unified Diff: content/browser/in_process_webkit/indexed_db_key_utility_client.cc

Issue 10834350: Remove all the indexeddb-related utility process code (Closed) Base URL: http://git.chromium.org/chromium/src.git@opencursor-cleanup
Patch Set: Rebase, attempt to reland Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/in_process_webkit/indexed_db_key_utility_client.cc
diff --git a/content/browser/in_process_webkit/indexed_db_key_utility_client.cc b/content/browser/in_process_webkit/indexed_db_key_utility_client.cc
deleted file mode 100644
index 7ca36675a47ff57287aeded6cb6020e76090e725..0000000000000000000000000000000000000000
--- a/content/browser/in_process_webkit/indexed_db_key_utility_client.cc
+++ /dev/null
@@ -1,408 +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 "content/browser/in_process_webkit/indexed_db_key_utility_client.h"
-
-#include "base/bind.h"
-#include "base/lazy_instance.h"
-#include "base/synchronization/waitable_event.h"
-#include "content/browser/utility_process_host_impl.h"
-#include "content/common/indexed_db/indexed_db_key.h"
-#include "content/common/indexed_db/indexed_db_key_path.h"
-#include "content/common/indexed_db/indexed_db_messages.h"
-#include "content/common/utility_messages.h"
-#include "content/public/browser/utility_process_host_client.h"
-#include "content/public/common/serialized_script_value.h"
-
-using content::BrowserThread;
-using content::IndexedDBKey;
-using content::IndexedDBKeyPath;
-using content::UtilityProcessHostClient;
-using content::SerializedScriptValue;
-
-// This class is used to obtain IndexedDBKeys from SerializedScriptValues
-// given an IDBKeyPath. It uses UtilityProcess to do this inside a sandbox
-// (a V8 lock is required there). At this level, all methods are synchronous
-// as required by the caller. The public API is used on WEBKIT thread,
-// but internally it moves around to UI and IO as needed.
-class KeyUtilityClientImpl
- : public base::RefCountedThreadSafe<KeyUtilityClientImpl> {
- public:
- KeyUtilityClientImpl();
-
- // Starts the UtilityProcess. Must be called before any other method.
- void StartUtilityProcess();
-
- // Stops the UtilityProcess. No further keys can be created after this.
- void Shutdown();
-
- // Synchronously obtain the |keys| from |values| for the given |key_path|.
- void CreateIDBKeysFromSerializedValuesAndKeyPath(
- const std::vector<SerializedScriptValue>& values,
- const IndexedDBKeyPath& key_path,
- std::vector<IndexedDBKey>* keys);
-
- // Synchronously inject |key| into |value| using the given |key_path|,
- // returning the new value.
- SerializedScriptValue InjectIDBKeyIntoSerializedValue(
- const IndexedDBKey& key,
- const SerializedScriptValue& value,
- const IndexedDBKeyPath& key_path);
-
- private:
- class Client : public UtilityProcessHostClient {
- public:
- explicit Client(KeyUtilityClientImpl* parent);
-
- // UtilityProcessHostClient
- virtual void OnProcessCrashed(int exit_code);
- virtual bool OnMessageReceived(const IPC::Message& message);
-
- // IPC message handlers
- void OnIDBKeysFromValuesAndKeyPathSucceeded(
- int id, const std::vector<IndexedDBKey>& keys);
- void OnIDBKeysFromValuesAndKeyPathFailed(int id);
- void OnInjectIDBKeyFinished(const SerializedScriptValue& value);
-
- private:
- virtual ~Client() {}
-
- KeyUtilityClientImpl* parent_;
-
- DISALLOW_COPY_AND_ASSIGN(Client);
- };
-
- friend class base::RefCountedThreadSafe<KeyUtilityClientImpl>;
- ~KeyUtilityClientImpl();
-
- void GetRDHAndStartUtilityProcess();
- void StartUtilityProcessInternal();
- void EndUtilityProcessInternal();
- void CallStartIDBKeyFromValueAndKeyPathFromIOThread(
- const std::vector<SerializedScriptValue>& values,
- const IndexedDBKeyPath& key_path);
- void CallStartInjectIDBKeyFromIOThread(
- const IndexedDBKey& key,
- const SerializedScriptValue& value,
- const IndexedDBKeyPath& key_path);
-
- void SetKeys(const std::vector<IndexedDBKey>& keys);
- void FinishCreatingKeys();
- void SetValueAfterInjection(const SerializedScriptValue& value);
- void FinishInjectingKey();
-
- base::WaitableEvent waitable_event_;
-
- // Used in both IO and WEBKIT threads, but guarded by WaitableEvent, i.e.,
- // these members are only set / read when the other thread is blocked.
- enum State {
- STATE_UNINITIALIZED,
- STATE_INITIALIZED,
- STATE_CREATING_KEYS,
- STATE_INJECTING_KEY,
- STATE_SHUTDOWN,
- };
- State state_;
- std::vector<IndexedDBKey> keys_;
- SerializedScriptValue value_after_injection_;
-
- // Used in the IO thread.
- base::WeakPtr<content::UtilityProcessHost> utility_process_host_;
- scoped_refptr<Client> client_;
-
- DISALLOW_COPY_AND_ASSIGN(KeyUtilityClientImpl);
-};
-
-// IndexedDBKeyUtilityClient definitions.
-
-static base::LazyInstance<IndexedDBKeyUtilityClient> client_instance =
- LAZY_INSTANCE_INITIALIZER;
-
-IndexedDBKeyUtilityClient::IndexedDBKeyUtilityClient()
- : is_shutdown_(false) {
- // Note that creating the impl_ object is deferred until it is first needed,
- // as this class can be constructed even though it never gets used.
-}
-
-IndexedDBKeyUtilityClient::~IndexedDBKeyUtilityClient() {
- DCHECK(!impl_ || is_shutdown_);
-}
-
-// static
-void IndexedDBKeyUtilityClient::Shutdown() {
- IndexedDBKeyUtilityClient* instance = client_instance.Pointer();
- if (!instance->impl_)
- return;
-
- instance->is_shutdown_ = true;
- instance->impl_->Shutdown();
-}
-
-// static
-void IndexedDBKeyUtilityClient::CreateIDBKeysFromSerializedValuesAndKeyPath(
- const std::vector<SerializedScriptValue>& values,
- const IndexedDBKeyPath& key_path,
- std::vector<IndexedDBKey>* keys) {
- IndexedDBKeyUtilityClient* instance = client_instance.Pointer();
-
- if (instance->is_shutdown_) {
- keys->clear();
- return;
- }
-
- if (!instance->impl_) {
- instance->impl_ = new KeyUtilityClientImpl();
- instance->impl_->StartUtilityProcess();
- }
-
- instance->impl_->CreateIDBKeysFromSerializedValuesAndKeyPath(values, key_path,
- keys);
-}
-
-// static
-SerializedScriptValue
-IndexedDBKeyUtilityClient::InjectIDBKeyIntoSerializedValue(
- const IndexedDBKey& key, const SerializedScriptValue& value,
- const IndexedDBKeyPath& key_path) {
- IndexedDBKeyUtilityClient* instance = client_instance.Pointer();
-
- if (instance->is_shutdown_)
- return SerializedScriptValue();
-
- if (!instance->impl_) {
- instance->impl_ = new KeyUtilityClientImpl();
- instance->impl_->StartUtilityProcess();
- }
-
- return instance->impl_->InjectIDBKeyIntoSerializedValue(key, value, key_path);
-}
-
-
-
-// KeyUtilityClientImpl definitions.
-
-void KeyUtilityClientImpl::Shutdown() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
-
- if (utility_process_host_) {
- utility_process_host_->EndBatchMode();
- utility_process_host_.reset();
- }
- client_ = NULL;
- state_ = STATE_SHUTDOWN;
-}
-
-KeyUtilityClientImpl::KeyUtilityClientImpl()
- : waitable_event_(false, false),
- state_(STATE_UNINITIALIZED) {
-}
-
-KeyUtilityClientImpl::~KeyUtilityClientImpl() {
- DCHECK(state_ == STATE_UNINITIALIZED || state_ == STATE_SHUTDOWN);
- DCHECK(!utility_process_host_);
- DCHECK(!client_.get());
-}
-
-void KeyUtilityClientImpl::StartUtilityProcess() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT_DEPRECATED));
- DCHECK(state_ == STATE_UNINITIALIZED);
-
- GetRDHAndStartUtilityProcess();
- waitable_event_.Wait();
-
- DCHECK(state_ == STATE_INITIALIZED);
-}
-
-void KeyUtilityClientImpl::CreateIDBKeysFromSerializedValuesAndKeyPath(
- const std::vector<SerializedScriptValue>& values,
- const IndexedDBKeyPath& key_path,
- std::vector<IndexedDBKey>* keys) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT_DEPRECATED));
- if (state_ == STATE_SHUTDOWN) {
- keys->clear();
- return;
- }
-
- DCHECK(state_ == STATE_INITIALIZED);
-
- state_ = STATE_CREATING_KEYS;
- CallStartIDBKeyFromValueAndKeyPathFromIOThread(values, key_path);
- waitable_event_.Wait();
- DCHECK(state_ == STATE_INITIALIZED);
-
- *keys = keys_;
-}
-
-SerializedScriptValue KeyUtilityClientImpl::InjectIDBKeyIntoSerializedValue(
- const IndexedDBKey& key,
- const SerializedScriptValue& value,
- const IndexedDBKeyPath& key_path) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT_DEPRECATED));
- if (state_ == STATE_SHUTDOWN)
- return SerializedScriptValue();
-
- DCHECK(state_ == STATE_INITIALIZED);
-
- state_ = STATE_INJECTING_KEY;
- CallStartInjectIDBKeyFromIOThread(key, value, key_path);
-
- waitable_event_.Wait();
- DCHECK(state_ == STATE_INITIALIZED);
-
- return value_after_injection_;
-}
-
-
-void KeyUtilityClientImpl::GetRDHAndStartUtilityProcess() {
- // In order to start the UtilityProcess, we need to grab
- // a pointer to the ResourceDispatcherHost. This can only
- // be done on the UI thread. See the comment at the top of
- // browser_process.h
- if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
- BrowserThread::PostTask(
- BrowserThread::UI, FROM_HERE,
- base::Bind(&KeyUtilityClientImpl::GetRDHAndStartUtilityProcess, this));
- return;
- }
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- StartUtilityProcessInternal();
-}
-
-void KeyUtilityClientImpl::StartUtilityProcessInternal() {
- // The ResourceDispatcherHost can only be used on the IO thread.
- if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- BrowserThread::PostTask(
- BrowserThread::IO, FROM_HERE,
- base::Bind(&KeyUtilityClientImpl::StartUtilityProcessInternal, this));
- return;
- }
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- DCHECK(state_ == STATE_UNINITIALIZED);
-
- client_ = new KeyUtilityClientImpl::Client(this);
- utility_process_host_ = (new UtilityProcessHostImpl(
- client_.get(), BrowserThread::IO))->AsWeakPtr();
- utility_process_host_->EnableZygote();
- utility_process_host_->StartBatchMode();
- state_ = STATE_INITIALIZED;
- waitable_event_.Signal();
-}
-
-void KeyUtilityClientImpl::EndUtilityProcessInternal() {
- if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
- BrowserThread::PostTask(
- BrowserThread::IO, FROM_HERE,
- base::Bind(&KeyUtilityClientImpl::EndUtilityProcessInternal, this));
- return;
- }
-
- if (utility_process_host_) {
- utility_process_host_->EndBatchMode();
- utility_process_host_.reset();
- }
- client_ = NULL;
- state_ = STATE_SHUTDOWN;
- waitable_event_.Signal();
-}
-
-void KeyUtilityClientImpl::CallStartIDBKeyFromValueAndKeyPathFromIOThread(
- const std::vector<SerializedScriptValue>& values,
- const IndexedDBKeyPath& key_path) {
- if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
- BrowserThread::PostTask(
- BrowserThread::IO, FROM_HERE,
- base::Bind(&KeyUtilityClientImpl::
- CallStartIDBKeyFromValueAndKeyPathFromIOThread,
- this, values, key_path));
- return;
- }
-
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- if (utility_process_host_) {
- utility_process_host_->Send(new UtilityMsg_IDBKeysFromValuesAndKeyPath(
- 0, values, key_path));
- }
-}
-
-void KeyUtilityClientImpl::CallStartInjectIDBKeyFromIOThread(
- const IndexedDBKey& key,
- const SerializedScriptValue& value,
- const IndexedDBKeyPath& key_path) {
- if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
- BrowserThread::PostTask(
- BrowserThread::IO, FROM_HERE,
- base::Bind(&KeyUtilityClientImpl::CallStartInjectIDBKeyFromIOThread,
- this, key, value, key_path));
- return;
- }
-
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- if (utility_process_host_)
- utility_process_host_->Send(new UtilityMsg_InjectIDBKey(
- key, value, key_path));
-}
-
-void KeyUtilityClientImpl::SetKeys(const std::vector<IndexedDBKey>& keys) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- keys_ = keys;
-}
-
-void KeyUtilityClientImpl::FinishCreatingKeys() {
- DCHECK(state_ == STATE_CREATING_KEYS);
- state_ = STATE_INITIALIZED;
- waitable_event_.Signal();
-}
-
-void KeyUtilityClientImpl::SetValueAfterInjection(
- const SerializedScriptValue& value) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- value_after_injection_ = value;
-}
-
-void KeyUtilityClientImpl::FinishInjectingKey() {
- DCHECK(state_ == STATE_INJECTING_KEY);
- state_ = STATE_INITIALIZED;
- waitable_event_.Signal();
-}
-
-KeyUtilityClientImpl::Client::Client(KeyUtilityClientImpl* parent)
- : parent_(parent) {
-}
-
-void KeyUtilityClientImpl::Client::OnProcessCrashed(int exit_code) {
- if (parent_->state_ == STATE_CREATING_KEYS)
- parent_->FinishCreatingKeys();
- parent_->Shutdown();
-}
-
-bool KeyUtilityClientImpl::Client::OnMessageReceived(
- const IPC::Message& message) {
- bool handled = true;
- IPC_BEGIN_MESSAGE_MAP(KeyUtilityClientImpl::Client, message)
- IPC_MESSAGE_HANDLER(UtilityHostMsg_IDBKeysFromValuesAndKeyPath_Succeeded,
- OnIDBKeysFromValuesAndKeyPathSucceeded)
- IPC_MESSAGE_HANDLER(UtilityHostMsg_InjectIDBKey_Finished,
- OnInjectIDBKeyFinished)
- IPC_MESSAGE_UNHANDLED(handled = false)
- IPC_END_MESSAGE_MAP()
- return handled;
-}
-
-void KeyUtilityClientImpl::Client::OnIDBKeysFromValuesAndKeyPathSucceeded(
- int id, const std::vector<IndexedDBKey>& keys) {
- parent_->SetKeys(keys);
- parent_->FinishCreatingKeys();
-}
-
-void KeyUtilityClientImpl::Client::OnInjectIDBKeyFinished(
- const SerializedScriptValue& value) {
- parent_->SetValueAfterInjection(value);
- parent_->FinishInjectingKey();
-}
-
-void KeyUtilityClientImpl::Client::OnIDBKeysFromValuesAndKeyPathFailed(
- int id) {
- parent_->FinishCreatingKeys();
-}
« no previous file with comments | « content/browser/in_process_webkit/indexed_db_key_utility_client.h ('k') | content/browser/indexed_db/OWNERS » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698