165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/*
281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * Copyright (C) 2010, 2011 Apple Inc. All rights reserved.
365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Redistribution and use in source and binary forms, with or without
565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modification, are permitted provided that the following conditions
665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * are met:
765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1. Redistributions of source code must retain the above copyright
865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer.
965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright
1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer in the
1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    documentation and/or other materials provided with the distribution.
1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE POSSIBILITY OF SUCH DAMAGE.
2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */
2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import "config.h"
2765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "WebProcessMain.h"
2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "CommandLine.h"
3065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "RunLoop.h"
3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "WebProcess.h"
3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "WebSystemInterface.h"
3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <WebKit2/WKView.h>
3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <WebKitSystemInterface.h>
3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <objc/objc-auto.h>
3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <runtime/InitializeThreading.h>
3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <servers/bootstrap.h>
3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <signal.h>
3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <stdio.h>
4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <sysexits.h>
4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <unistd.h>
4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <wtf/RetainPtr.h>
4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <wtf/Threading.h>
4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <wtf/text/CString.h>
4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// FIXME: We should be doing this another way.
4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochextern "C" kern_return_t bootstrap_look_up2(mach_port_t, const name_t, mach_port_t*, pid_t, uint64_t);
4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block@interface NSApplication (WebNSApplicationDetails)
502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block-(void)_installAutoreleasePoolsOnCurrentThreadIfNecessary;
512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block@end
522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#define SHOW_CRASH_REPORTER 1
5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace WebCore;
5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit {
5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochint WebProcessMain(const CommandLine& commandLine)
6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    String serviceName = commandLine["servicename"];
6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (serviceName.isEmpty())
6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return EXIT_FAILURE;
6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Get the server port.
6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    mach_port_t serverPort;
6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    kern_return_t kr = bootstrap_look_up2(bootstrap_port, serviceName.utf8().data(), &serverPort, 0, 0);
7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (kr) {
7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        printf("bootstrap_look_up2 result: %x", kr);
7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 2;
7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    String localization = commandLine["localization"];
7681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    RetainPtr<CFStringRef> cfLocalization(AdoptCF, CFStringCreateWithCharacters(0, reinterpret_cast<const UniChar*>(localization.characters()), localization.length()));
7781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (cfLocalization)
7881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        WKSetDefaultLocalization(cfLocalization.get());
7981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if !SHOW_CRASH_REPORTER
8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Installs signal handlers that exit on a crash so that CrashReporter does not show up.
8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    signal(SIGILL, _exit);
8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    signal(SIGFPE, _exit);
8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    signal(SIGBUS, _exit);
8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    signal(SIGSEGV, _exit);
8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    InitWebCoreSystemInterface();
8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    JSC::initializeThreading();
9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WTF::initializeMainThread();
9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RunLoop::initializeMainRunLoop();
9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Create the connection.
9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WebProcess::shared().initialize(serverPort, RunLoop::main());
9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [pool drain];
9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch     // Initialize AppKit.
9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [NSApplication sharedApplication];
10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Installs autorelease pools on the current CFRunLoop which prevents memory from accumulating between user events.
1022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // FIXME: Remove when <rdar://problem/8929426> is fixed.
1032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    [[NSApplication sharedApplication] _installAutoreleasePoolsOnCurrentThreadIfNecessary];
1042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if !defined(BUILDING_ON_SNOW_LEOPARD)
10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WKAXRegisterRemoteApp();
10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RunLoop::run();
11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // FIXME: Do more cleanup here.
11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit
11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
118