diff options
Diffstat (limited to 'Source/WebInspectorUI/Scripts/copy-user-interface-resources.pl')
-rwxr-xr-x | Source/WebInspectorUI/Scripts/copy-user-interface-resources.pl | 347 |
1 files changed, 347 insertions, 0 deletions
diff --git a/Source/WebInspectorUI/Scripts/copy-user-interface-resources.pl b/Source/WebInspectorUI/Scripts/copy-user-interface-resources.pl new file mode 100755 index 000000000..b632a5aa8 --- /dev/null +++ b/Source/WebInspectorUI/Scripts/copy-user-interface-resources.pl @@ -0,0 +1,347 @@ +#!/usr/bin/perl -w + +# Copyright (C) 2015 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. +# +# THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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. + +use English; +use File::Copy qw(copy); +use File::Path qw(make_path remove_tree); +use File::Spec; + +my $useDirCopy = 0; + +# Not all systems (e.g., OS X) include File::Copy::Recursive. Only +# use it if we have it installed. +eval "use File::Copy::Recursive"; +unless ($@) { + $useDirCopy = 1; + File::Copy::Recursive->import(); +} + +sub ditto($$) +{ + my ($source, $destination) = @_; + + if ($useDirCopy) { + File::Copy::Recursive::dircopy($source, $destination) or die "Unable to copy directory $source to $destination: $!"; + } elsif ($^O eq 'darwin') { + system('ditto', $source, $destination); + } else { + die "Please install the PEP module File::Copy::Recursive"; + } +} + +sub seedFile($$) +{ + my ($targetFile, $seedText) = @_; + + if (open(TARGET_FILE, '>', $targetFile)) { + print TARGET_FILE $seedText; + close(TARGET_FILE); + } +} + +sub appendFile($$) +{ + my ($targetFile, $srcFile) = @_; + + open(SRC_FILE, '<', $srcFile) or die "Unable to open $srcFile: $!"; + my @srcText = <SRC_FILE>; + close(SRC_FILE); + open(TARGET_FILE, '>>', $targetFile) or die "Unable to open $targetFile: $!"; + print TARGET_FILE @srcText; + close(TARGET_FILE); +} + +sub readLicenseFile($) +{ + my ($licenseFilePath) = @_; + + open(LICENSE_FILE, '<', $licenseFilePath) or die "Unable to open $licenseFilePath: $!"; + + my $license = "/*\n"; + $license .= ' * ' . $_ while <LICENSE_FILE>; + $license .= " */\n"; + + close(LICENSE_FILE); + + return $license; +} + +my $inspectorLicense = <<'EOF'; +/* + * Copyright (C) 2007-2016 Apple Inc. All rights reserved. + * Copyright (C) 2008 Matt Lilek. All rights reserved. + * Copyright (C) 2008-2009 Anthony Ricaud <rik@webkit.org> + * Copyright (C) 2009-2010 Joseph Pecoraro. All rights reserved. + * Copyright (C) 2009-2011 Google Inc. All rights reserved. + * Copyright (C) 2009 280 North Inc. All Rights Reserved. + * Copyright (C) 2010 Nikita Vasilyev. All rights reserved. + * Copyright (C) 2011 Brian Grinstead All rights reserved. + * Copyright (C) 2013 Matt Holden <jftholden@yahoo.com> + * Copyright (C) 2013 Samsung Electronics. All rights reserved. + * Copyright (C) 2013 Seokju Kwon (seokju.kwon@gmail.com) + * Copyright (C) 2013 Adobe Systems Inc. All rights reserved. + * Copyright (C) 2013-2015 University of Washington. All rights reserved. + * Copyright (C) 2014-2015 Saam Barati <saambarati1@gmail.com> + * Copyright (C) 2014 Antoine Quint + * Copyright (C) 2015 Tobias Reiss <tobi+webkit@basecode.de> + * Copyright (C) 2015-2016 Devin Rousso <dcrousso+webkit@gmail.com>. 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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. + */ +EOF + +my $perl = $^X; +my $python = ($OSNAME =~ /cygwin/) ? "/usr/bin/python" : "python"; +my $derivedSourcesDir = $ENV{'DERIVED_SOURCES_DIR'}; +my $scriptsRoot = File::Spec->catdir($ENV{'SRCROOT'}, 'Scripts'); +my $sharedScriptsRoot = File::Spec->catdir($ENV{'JAVASCRIPTCORE_PRIVATE_HEADERS_DIR'}); +my $uiRoot = File::Spec->catdir($ENV{'SRCROOT'}, 'UserInterface'); +my $targetResourcePath = File::Spec->catdir($ENV{'TARGET_BUILD_DIR'}, $ENV{'UNLOCALIZED_RESOURCES_FOLDER_PATH'}); +my $protocolDir = File::Spec->catdir($targetResourcePath, 'Protocol'); +my $workersDir = File::Spec->catdir($targetResourcePath, 'Workers'); +my $codeMirrorPath = File::Spec->catdir($uiRoot, 'External', 'CodeMirror'); +my $esprimaPath = File::Spec->catdir($uiRoot, 'External', 'Esprima'); +my $eslintPath = File::Spec->catdir($uiRoot, 'External', 'ESLint'); + +my $codeMirrorLicense = readLicenseFile(File::Spec->catfile($codeMirrorPath, 'LICENSE')); +my $esprimaLicense = readLicenseFile(File::Spec->catfile($esprimaPath, 'LICENSE')); +my $eslintLicense = readLicenseFile(File::Spec->catfile($eslintPath, 'LICENSE')); +make_path($protocolDir, $targetResourcePath); + +# Copy over dynamically loaded files from other frameworks, even if we aren't combining resources. +copy(File::Spec->catfile($ENV{'JAVASCRIPTCORE_PRIVATE_HEADERS_DIR'}, 'InspectorBackendCommands.js'), File::Spec->catfile($protocolDir, 'InspectorBackendCommands.js')) or die "Copy of InspectorBackendCommands.js failed: $!"; + +my $forceToolInstall = defined $ENV{'FORCE_TOOL_INSTALL'} && ($ENV{'FORCE_TOOL_INSTALL'} eq 'YES'); +my $shouldCombineMain = defined $ENV{'COMBINE_INSPECTOR_RESOURCES'} && ($ENV{'COMBINE_INSPECTOR_RESOURCES'} eq 'YES'); +my $shouldCombineTest = defined $ENV{'COMBINE_TEST_RESOURCES'} && ($ENV{'COMBINE_TEST_RESOURCES'} eq 'YES'); +my $combineResourcesCmd = File::Spec->catfile($scriptsRoot, 'combine-resources.pl'); + +if ($forceToolInstall) { + # Copy all files over individually to ensure we have Test.html / Test.js and files included from Test.html. + # We may then proceed to include combined & optimized resources which will output mostly to different paths + # but overwrite Main.html / Main.js with optimized versions. + ditto($uiRoot, $targetResourcePath); + + # Also force combining test resources for tool installs. + $shouldCombineTest = 1; +} + +if ($shouldCombineMain) { + # Remove Debug JavaScript and CSS files in Production builds. + system($perl, $combineResourcesCmd, + '--input-dir', 'Debug', + '--input-html', File::Spec->catfile($uiRoot, 'Main.html'), + '--input-html-dir', $uiRoot, + '--derived-sources-dir', $derivedSourcesDir, + '--output-dir', $derivedSourcesDir, + '--output-script-name', 'Debug.js', + '--output-style-name', 'Debug.css', + '--strip'); + + # Combine the JavaScript and CSS files in Production builds into single files (Main.js and Main.css). + my $derivedSourcesMainHTML = File::Spec->catfile($derivedSourcesDir, 'Main.html'); + system($perl, $combineResourcesCmd, + '--input-html', $derivedSourcesMainHTML, + '--input-html-dir', $uiRoot, + '--derived-sources-dir', $derivedSourcesDir, + '--output-dir', $derivedSourcesDir, + '--output-script-name', 'Main.js', + '--output-style-name', 'Main.css'); + + # Combine the CodeMirror JavaScript and CSS files in Production builds into single files (CodeMirror.js and CodeMirror.css). + system($perl, $combineResourcesCmd, + '--input-dir', 'External/CodeMirror', + '--input-html', $derivedSourcesMainHTML, + '--input-html-dir', $uiRoot, + '--derived-sources-dir', $derivedSourcesDir, + '--output-dir', $derivedSourcesDir, + '--output-script-name', 'CodeMirror.js', + '--output-style-name', 'CodeMirror.css'); + + # Combine the Esprima JavaScript files in Production builds into a single file (Esprima.js). + system($perl, $combineResourcesCmd, + '--input-dir', 'External/Esprima', + '--input-html', $derivedSourcesMainHTML, + '--input-html-dir', $uiRoot, + '--derived-sources-dir', $derivedSourcesDir, + '--output-dir', $derivedSourcesDir, + '--output-script-name', 'Esprima.js'); + + # Combine the ESLint JavaScript files in Production builds into a single file (ESLint.js). + system($perl, $combineResourcesCmd, + '--input-dir', 'External/ESLint', + '--input-html', $derivedSourcesMainHTML, + '--input-html-dir', $uiRoot, + '--derived-sources-dir', $derivedSourcesDir, + '--output-dir', $derivedSourcesDir, + '--output-script-name', 'ESLint.js'); + + # Remove console.assert calls from the Main.js file. + my $derivedSourcesMainJS = File::Spec->catfile($derivedSourcesDir, 'Main.js'); + system($perl, File::Spec->catfile($scriptsRoot, 'remove-console-asserts.pl'), + '--input-script', $derivedSourcesMainJS, + '--output-script', $derivedSourcesMainJS); + + # Fix Image URLs in the Main.css file by removing the "../". + my $derivedSourcesMainCSS = File::Spec->catfile($derivedSourcesDir, 'Main.css'); + if (open(INPUT_MAIN, '<', $derivedSourcesMainCSS)) { + local $/; + my $cssContents = <INPUT_MAIN>; + close(INPUT_MAIN); + open(OUTPUT_MAIN, '>', $derivedSourcesMainCSS); + $cssContents =~ s/\.\.\/Images/Images/g; + print OUTPUT_MAIN $cssContents; + close(OUTPUT_MAIN); + } + + # Export the license into Main.js. + my $targetMainJS = File::Spec->catfile($targetResourcePath, 'Main.js'); + seedFile($targetMainJS, $inspectorLicense); + + my $targetMainCSS = File::Spec->catfile($targetResourcePath, 'Main.css'); + seedFile($targetMainCSS, $inspectorLicense); + + # Export the license into CodeMirror.js and CodeMirror.css. + my $targetCodeMirrorJS = File::Spec->catfile($targetResourcePath, 'CodeMirror.js'); + seedFile($targetCodeMirrorJS, $codeMirrorLicense); + + my $targetCodeMirrorCSS = File::Spec->catfile($targetResourcePath, 'CodeMirror.css'); + seedFile($targetCodeMirrorCSS, $codeMirrorLicense); + + # Export the license into Esprima.js. + my $targetEsprimaJS = File::Spec->catfile($targetResourcePath, 'Esprima.js'); + seedFile($targetEsprimaJS, $esprimaLicense); + + # Export the license into ESLint.js. + my $targetESLintJS = File::Spec->catfile($targetResourcePath, 'ESLint.js'); + seedFile($targetESLintJS, $eslintLicense); + + # Minify the Main.js and Main.css files, with Main.js appending to the license that was exported above. + my $jsMinScript = File::Spec->catfile($sharedScriptsRoot, 'jsmin.py'); + my $cssMinScript = File::Spec->catfile($sharedScriptsRoot, 'cssmin.py'); + system(qq("$python" "$jsMinScript" < "$derivedSourcesMainJS" >> "$targetMainJS")) and die "Failed to minify $derivedSourcesMainJS: $!"; + system(qq("$python" "$cssMinScript" < "$derivedSourcesMainCSS" >> "$targetMainCSS")) and die "Failed to minify $derivedSourcesMainCSS: $!"; + + # Minify the CodeMirror.js and CodeMirror.css files, appending to the license that was exported above. + my $derivedSourcesCodeMirrorJS = File::Spec->catfile($derivedSourcesDir, 'CodeMirror.js'); + my $derivedSourcesCodeMirrorCSS = File::Spec->catfile($derivedSourcesDir, 'CodeMirror.css'); + system(qq("$python" "$jsMinScript" < "$derivedSourcesCodeMirrorJS" >> "$targetCodeMirrorJS")) and die "Failed to minify $derivedSourcesCodeMirrorJS: $!"; + system(qq("$python" "$cssMinScript" < "$derivedSourcesCodeMirrorCSS" >> "$targetCodeMirrorCSS")) and die "Failed to minify $derivedSourcesCodeMirrorCSS: $!"; + + # Minify the Esprima.js file, appending to the license that was exported above. + my $derivedSourcesEsprimaJS = File::Spec->catfile($derivedSourcesDir, 'Esprima.js'); + system(qq("$python" "$jsMinScript" < "$derivedSourcesEsprimaJS" >> "$targetEsprimaJS")) and die "Failed to minify $derivedSourcesEsprimaJS: $!"; + + # Minify the ESLint.js file, appending to the license that was exported above. + my $derivedSourcesESLintJS = File::Spec->catfile($derivedSourcesDir, 'ESLint.js'); + system(qq("$python" "$jsMinScript" < "$derivedSourcesESLintJS" >> "$targetESLintJS")) and die "Failed to minify $derivedSourcesESLintJS: $!"; + + # Copy over Main.html and the Images directory. + copy($derivedSourcesMainHTML, File::Spec->catfile($targetResourcePath, 'Main.html')); + + ditto(File::Spec->catdir($uiRoot, 'Images'), File::Spec->catdir($targetResourcePath, 'Images')); + + # Remove Images/gtk on Mac and Windows builds. + remove_tree(File::Spec->catdir($targetResourcePath, 'Images', 'gtk')) if defined $ENV{'MAC_OS_X_VERSION_MAJOR'} or defined $ENV{'OFFICIAL_BUILD'}; + + # Remove ESLint until needed: <https://webkit.org/b/136515> Web Inspector: JavaScript source text editor should have a linter + unlink $targetESLintJS; + + # Copy the Protocol/Legacy and Workers directories. + ditto(File::Spec->catfile($uiRoot, 'Protocol', 'Legacy'), File::Spec->catfile($protocolDir, 'Legacy')); + ditto(File::Spec->catfile($uiRoot, 'Workers'), $workersDir); + + # Remove console.assert calls from the Worker js files. + system($perl, File::Spec->catfile($scriptsRoot, 'remove-console-asserts.pl'), + '--input-directory', $workersDir); + + # Fix import references in Workers directories. This rewrites "../../External/script.js" import paths to their new locations. + system($perl, File::Spec->catfile($scriptsRoot, 'fix-worker-imports-for-optimized-builds.pl'), + '--input-directory', $workersDir) and die "Failed to update Worker imports for optimized builds."; +} else { + # Keep the files separate for engineering builds. + ditto($uiRoot, $targetResourcePath); +} + +if ($shouldCombineTest) { + # Combine the JavaScript files for testing into a single file (TestCombined.js). + system($perl, $combineResourcesCmd, + '--input-html', File::Spec->catfile($uiRoot, 'Test.html'), + '--derived-sources-dir', $derivedSourcesDir, + '--output-dir', $derivedSourcesDir, + '--output-script-name', 'TestCombined.js', + '--output-style-name', 'TestCombined.css'); + + my $derivedSourcesTestHTML = File::Spec->catfile($derivedSourcesDir, 'Test.html'); + my $derivedSourcesTestJS = File::Spec->catfile($derivedSourcesDir, 'TestCombined.js'); + # Combine the Esprima JavaScript files for testing into a single file (Esprima.js). + system($perl, $combineResourcesCmd, + '--input-dir', 'External/Esprima', + '--input-html', $derivedSourcesTestHTML, + '--input-html-dir', $uiRoot, + '--derived-sources-dir', $derivedSourcesDir, + '--output-dir', $derivedSourcesDir, + '--output-script-name', 'TestEsprima.js'); + + # Export the license into TestCombined.js. + my $targetTestJS = File::Spec->catfile($targetResourcePath, 'TestCombined.js'); + seedFile($targetTestJS, $inspectorLicense); + + # Export the license into Esprima.js. + my $targetEsprimaJS = File::Spec->catfile($targetResourcePath, 'TestEsprima.js'); + seedFile($targetEsprimaJS, $esprimaLicense); + + # Append TestCombined.js to the license that was exported above. + appendFile($targetTestJS, $derivedSourcesTestJS); + + # Append Esprima.js to the license that was exported above. + my $derivedSourcesEsprimaJS = File::Spec->catfile($derivedSourcesDir, 'TestEsprima.js'); + appendFile($targetEsprimaJS, $derivedSourcesEsprimaJS); + + # Copy over Test.html. + copy($derivedSourcesTestHTML, File::Spec->catfile($targetResourcePath, 'Test.html')); + + # Copy the Legacy directory. + ditto(File::Spec->catfile($uiRoot, 'Protocol', 'Legacy'), File::Spec->catfile($protocolDir, 'Legacy')); +} |