#!/usr/bin/env python3

# 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.")