#!/usr/bin/env python

# Copyright (C) 2017 Apple Inc. All rights reserved.
#
# 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.

import os, platform, subprocess

SAFARI_FOR_WEBKIT_DEVELOPMENT='/Applications/Safari.app/Contents/MacOS/SafariForWebKitDevelopment'

def check_for_valid_platform():
    if 'Darwin' not in platform.system():
        print('Unsupported OS, exiting.')
        exit(1)

def find_dyld_framework_path(script_path):
    current_directory = os.path.dirname(script_path)
    sub_directories = [name for name in os.listdir(current_directory) if os.path.isdir(name)]
    if 'Debug' in sub_directories:
        return current_directory + '/Debug'
    elif 'Release' in sub_directories:
        return current_directory + '/Release'
    else:
        print('No Release or Debug framework directories found in the current folder, exiting.')
        exit(1)

def run_safari_for_webkit_development():
    subprocess.call(SAFARI_FOR_WEBKIT_DEVELOPMENT)

def set_dyld_framework_path(script_path):
    dyld_path = find_dyld_framework_path(script_path)
    print('Setting DYLD FRAMEWORK and LIBRARY paths to {}'.format(dyld_path))
    os.environ['DYLD_FRAMEWORK_PATH'] = dyld_path
    os.environ['DYLD_LIBRARY_PATH'] = dyld_path
    
def main():
    check_for_valid_platform()
    script_path = os.path.abspath(__file__)
    os.chdir(os.path.dirname(script_path))
    set_dyld_framework_path(script_path)
    run_safari_for_webkit_development()
    
if __name__ == '__main__':
    try:
        main()    
    except KeyboardInterrupt:
        exit("Aborting.")