#!/usr/bin/env perl

# Copyright (C) 2005, 2007, 2013 Apple Inc. All rights reserved.
# Copyright (C) 2007 Staikos Computing Services, Inc.  <info@staikos.net>

#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1.  Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer. 
# 2.  Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution. 
# 3.  Neither the name of Apple Inc. ("Apple") nor the names of
#     its contributors may be used to endorse or promote products derived
#     from this software without specific prior written permission. 
#
# THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

# Simplified "run" script for launching the WebKit2 MiniBrowser.

use strict;
use warnings;
use File::Spec::Functions qw/catdir/;
use FindBin;
use lib $FindBin::Bin;
use webkitdirs;

my $launcherName;
my $launcherPath;
my @jhbuildWrapper;

prohibitUnknownPort();
setConfiguration();

if (isGtk()) {
    # Check to see that all the frameworks are built.
    checkFrameworks();

    $launcherPath = catdir(productDir(), "bin", "MiniBrowser");
    die "Can't find $launcherPath" unless -x $launcherPath;
    @jhbuildWrapper = wrapperPrefixIfNeeded();
    print "Starting MiniBrowser.\n";
    exec @jhbuildWrapper, $launcherPath, @ARGV or die;
} elsif (isWPE()) {
    # Check to see that all the frameworks are built.
    checkFrameworks();

    $launcherName = launcherName();
    @jhbuildWrapper = wrapperPrefixIfNeeded();
    $ENV{"WEBKIT_EXEC_PATH"} = catdir(productDir(), "bin");
    $ENV{"WEBKIT_INJECTED_BUNDLE_PATH"} = catdir(productDir(), "lib");
    $ENV{"LD_LIBRARY_PATH"} = catdir(productDir(), "lib") . (defined $ENV{"LD_LIBRARY_PATH"} ? ":" . $ENV{"LD_LIBRARY_PATH"} : "" );
    print "Starting $launcherName \n";
    exec @jhbuildWrapper, $launcherName, @ARGV or die;
} elsif (isAppleCocoaWebKit()) {
    printHelpAndExitForRunAndDebugWebKitAppIfNeeded();
    exit exitStatus(runMiniBrowser());
} else {
    die "Unsupported platform."
}
