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#import <CoreFoundation/CoreFoundation.h> 27#import "XPCPtr.h" 28 29namespace WebKit { 30 31static void XPCServiceEventHandler(xpc_connection_t peer) 32{ 33 xpc_connection_set_target_queue(peer, dispatch_get_main_queue()); 34 xpc_connection_set_event_handler(peer, ^(xpc_object_t event) { 35 xpc_type_t type = xpc_get_type(event); 36 if (type == XPC_TYPE_ERROR) { 37 if (event == XPC_ERROR_CONNECTION_INVALID || event == XPC_ERROR_TERMINATION_IMMINENT) { 38 // FIXME: Handle this case more gracefully. 39 exit(EXIT_FAILURE); 40 } 41 } else { 42 assert(type == XPC_TYPE_DICTIONARY); 43 44 if (!strcmp(xpc_dictionary_get_string(event, "message-name"), "bootstrap")) { 45 CFBundleRef webKitBundle = CFBundleGetBundleWithIdentifier(CFSTR("com.apple.WebKit")); 46 CFStringRef entryPointFunctionName = (CFStringRef)CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), CFSTR("WebKitEntryPoint")); 47 48 typedef void (*InitializerFunction)(xpc_connection_t, xpc_object_t); 49 InitializerFunction initializerFunctionPtr = reinterpret_cast<InitializerFunction>(CFBundleGetFunctionPointerForName(webKitBundle, entryPointFunctionName)); 50 if (!initializerFunctionPtr) { 51 NSLog(@"Unable to find entry point in WebKit.framework with name: %@", (NSString *)entryPointFunctionName); 52 exit(EXIT_FAILURE); 53 } 54 55 auto reply = IPC::adoptXPC(xpc_dictionary_create_reply(event)); 56 xpc_dictionary_set_string(reply.get(), "message-name", "process-finished-launching"); 57 xpc_connection_send_message(xpc_dictionary_get_remote_connection(event), reply.get()); 58 59 initializerFunctionPtr(peer, event); 60 } 61 62 // Leak a boost onto the NetworkProcess. 63 if (!strcmp(xpc_dictionary_get_string(event, "message-name"), "pre-bootstrap")) 64 xpc_retain(event); 65 } 66 }); 67 68 xpc_connection_resume(peer); 69} 70 71} // namespace WebKit 72 73using namespace WebKit; 74 75int main(int argc, char** argv) 76{ 77 xpc_main(XPCServiceEventHandler); 78 return 0; 79} 80