1/* 2 * Copyright (C) 2013 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 23 * THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#include "config.h" 27#include "DatabaseToWebProcessConnection.h" 28 29#include "DatabaseProcessIDBConnection.h" 30#include "DatabaseProcessIDBConnectionMessages.h" 31#include "DatabaseToWebProcessConnectionMessages.h" 32#include <wtf/RunLoop.h> 33 34#if ENABLE(DATABASE_PROCESS) 35 36namespace WebKit { 37 38PassRefPtr<DatabaseToWebProcessConnection> DatabaseToWebProcessConnection::create(IPC::Connection::Identifier connectionIdentifier) 39{ 40 return adoptRef(new DatabaseToWebProcessConnection(connectionIdentifier)); 41} 42 43DatabaseToWebProcessConnection::DatabaseToWebProcessConnection(IPC::Connection::Identifier connectionIdentifier) 44{ 45 m_connection = IPC::Connection::createServerConnection(connectionIdentifier, this, RunLoop::main()); 46 m_connection->setOnlySendMessagesAsDispatchWhenWaitingForSyncReplyWhenProcessingSuchAMessage(true); 47 m_connection->open(); 48} 49 50DatabaseToWebProcessConnection::~DatabaseToWebProcessConnection() 51{ 52 53} 54 55void DatabaseToWebProcessConnection::didReceiveMessage(IPC::Connection* connection, IPC::MessageDecoder& decoder) 56{ 57 if (decoder.messageReceiverName() == Messages::DatabaseToWebProcessConnection::messageReceiverName()) { 58 didReceiveDatabaseToWebProcessConnectionMessage(connection, decoder); 59 return; 60 } 61 62 if (decoder.messageReceiverName() == Messages::DatabaseProcessIDBConnection::messageReceiverName()) { 63 IDBConnectionMap::iterator backendIterator = m_idbConnections.find(decoder.destinationID()); 64 if (backendIterator != m_idbConnections.end()) 65 backendIterator->value->didReceiveDatabaseProcessIDBConnectionMessage(connection, decoder); 66 return; 67 } 68 69 ASSERT_NOT_REACHED(); 70} 71 72void DatabaseToWebProcessConnection::didReceiveSyncMessage(IPC::Connection* connection, IPC::MessageDecoder& decoder, std::unique_ptr<IPC::MessageEncoder>& reply) 73{ 74 if (decoder.messageReceiverName() == Messages::DatabaseProcessIDBConnection::messageReceiverName()) { 75 IDBConnectionMap::iterator backendIterator = m_idbConnections.find(decoder.destinationID()); 76 if (backendIterator != m_idbConnections.end()) 77 backendIterator->value->didReceiveSyncDatabaseProcessIDBConnectionMessage(connection, decoder, reply); 78 return; 79 } 80 81 ASSERT_NOT_REACHED(); 82} 83 84void DatabaseToWebProcessConnection::didClose(IPC::Connection*) 85{ 86 // The WebProcess has disconnected, close all of the connections associated with it 87 while (!m_idbConnections.isEmpty()) 88 removeDatabaseProcessIDBConnection(m_idbConnections.begin()->key); 89} 90 91void DatabaseToWebProcessConnection::didReceiveInvalidMessage(IPC::Connection*, IPC::StringReference messageReceiverName, IPC::StringReference messageName) 92{ 93 94} 95 96void DatabaseToWebProcessConnection::establishIDBConnection(uint64_t serverConnectionIdentifier) 97{ 98 RefPtr<DatabaseProcessIDBConnection> idbConnection = DatabaseProcessIDBConnection::create(*this, serverConnectionIdentifier); 99 m_idbConnections.set(serverConnectionIdentifier, idbConnection.release()); 100} 101 102void DatabaseToWebProcessConnection::removeDatabaseProcessIDBConnection(uint64_t serverConnectionIdentifier) 103{ 104 ASSERT(m_idbConnections.contains(serverConnectionIdentifier)); 105 106 RefPtr<DatabaseProcessIDBConnection> idbConnection = m_idbConnections.take(serverConnectionIdentifier); 107 idbConnection->disconnectedFromWebProcess(); 108} 109 110 111} // namespace WebKit 112 113#endif // ENABLE(DATABASE_PROCESS) 114