79257e83138c684bd82b553e962ce2d826594170
[WebKit-https.git] / Source / WebInspectorUI / Scripts / copy-user-interface-resources.pl
1 #!/usr/bin/env perl
2
3 # Copyright (C) 2015-2018 Apple Inc. All rights reserved.
4 #
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions
7 # are met:
8 # 1. Redistributions of source code must retain the above copyright
9 #    notice, this list of conditions and the following disclaimer.
10 # 2. Redistributions in binary form must reproduce the above copyright
11 #    notice, this list of conditions and the following disclaimer in the
12 #    documentation and/or other materials provided with the distribution.
13 #
14 # THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
15 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16 # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
18 # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
24 # THE POSSIBILITY OF SUCH DAMAGE.
25
26 use warnings;
27 use English;
28 use File::Basename qw(dirname);
29 use File::Copy qw(copy);
30 use File::Path qw(make_path remove_tree);
31 use File::Spec;
32 use Getopt::Long;
33
34 my $verbose = 0;
35 GetOptions('verbose' => \$verbose);
36
37 sub debugLog($)
38 {
39     my $logString = shift;
40     print "-- $logString\n" if $verbose;
41 }
42
43 my $useDirCopy = 0;
44
45 # Not all systems (e.g., OS X) include File::Copy::Recursive. Only
46 # use it if we have it installed.
47 eval "use File::Copy::Recursive";
48 unless ($@) {
49     $useDirCopy = 1;
50     File::Copy::Recursive->import();
51 }
52
53 sub ditto($$)
54 {
55     my ($source, $destination) = @_;
56
57     if ($useDirCopy) {
58         File::Copy::Recursive::dircopy($source, $destination) or die "Unable to copy directory $source to $destination: $!";
59     } elsif ($^O eq 'darwin') {
60         system('ditto', $source, $destination);
61     } elsif ($^O ne 'MSWin32') {
62         # Ditto copies the *contents* of the source directory, not the directory itself.
63         opendir(my $dh, $source) or die "Can't open $source: $!";
64         make_path($destination);
65         while (readdir $dh) {
66             if ($_ ne '..' and $_ ne '.') {
67                 system('cp', '-R', "${source}/$_", $destination) == 0 or die "Failed to copy ${source}/$_ to $destination";
68             }
69         }
70         closedir $dh;
71     } else {
72         die "Please install the PEP module File::Copy::Recursive";
73     }
74 }
75
76 sub seedFile($$)
77 {
78     my ($targetFile, $seedText) = @_;
79
80     if (open(TARGET_FILE, '>', $targetFile)) {
81         print TARGET_FILE $seedText;
82         close(TARGET_FILE);
83     }
84 }
85
86 sub appendFile($$)
87 {
88     my ($targetFile, $srcFile) = @_;
89
90     open(SRC_FILE, '<', $srcFile) or die "Unable to open $srcFile: $!";
91     my @srcText = <SRC_FILE>;
92     close(SRC_FILE);
93     open(TARGET_FILE, '>>', $targetFile) or die "Unable to open $targetFile: $!";
94     print TARGET_FILE @srcText;
95     close(TARGET_FILE);
96 }
97
98 sub readLicenseFile($)
99 {
100     my ($licenseFilePath) = @_;
101
102     open(LICENSE_FILE, '<', $licenseFilePath) or die "Unable to open $licenseFilePath: $!";
103
104     my $license = "/*\n";
105     $license .= ' * ' . $_ while <LICENSE_FILE>;
106     $license .= " */\n";
107
108     close(LICENSE_FILE);
109
110     return $license;
111 }
112
113 my $inspectorLicense = <<'EOF';
114 /*
115  * Copyright (C) 2007-2018 Apple Inc. All rights reserved.
116  * Copyright (C) 2008 Matt Lilek. All rights reserved.
117  * Copyright (C) 2008-2009 Anthony Ricaud <rik@webkit.org>
118  * Copyright (C) 2009-2010 Joseph Pecoraro. All rights reserved.
119  * Copyright (C) 2009-2011 Google Inc. All rights reserved.
120  * Copyright (C) 2009 280 North Inc. All Rights Reserved.
121  * Copyright (C) 2010 Nikita Vasilyev. All rights reserved.
122  * Copyright (C) 2011 Brian Grinstead All rights reserved.
123  * Copyright (C) 2013 Matt Holden <jftholden@yahoo.com>
124  * Copyright (C) 2013 Samsung Electronics. All rights reserved.
125  * Copyright (C) 2013 Seokju Kwon (seokju.kwon@gmail.com)
126  * Copyright (C) 2013 Adobe Systems Inc. All rights reserved.
127  * Copyright (C) 2013-2015 University of Washington. All rights reserved.
128  * Copyright (C) 2014-2015 Saam Barati <saambarati1@gmail.com>
129  * Copyright (C) 2014 Antoine Quint
130  * Copyright (C) 2015 Tobias Reiss <tobi+webkit@basecode.de>
131  * Copyright (C) 2015-2017 Devin Rousso <webkit@devinrousso.com>. All rights reserved.
132  * Copyright (C) 2017 Sony Interactive Entertainment Inc.
133  *
134  * Redistribution and use in source and binary forms, with or without
135  * modification, are permitted provided that the following conditions
136  * are met:
137  * 1. Redistributions of source code must retain the above copyright
138  *    notice, this list of conditions and the following disclaimer.
139  * 2. Redistributions in binary form must reproduce the above copyright
140  *    notice, this list of conditions and the following disclaimer in the
141  *    documentation and/or other materials provided with the distribution.
142  *
143  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
144  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
145  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
146  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
147  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
148  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
149  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
150  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
151  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
152  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
153  * THE POSSIBILITY OF SUCH DAMAGE.
154  */
155 EOF
156
157 my $perl = $^X;
158 my $python = ($OSNAME =~ /cygwin/) ? "/usr/bin/python" : "python";
159 my $derivedSourcesDir = $ENV{'DERIVED_SOURCES_DIR'};
160 my $scriptsRoot = File::Spec->catdir($ENV{'SRCROOT'}, 'Scripts');
161 my $sharedScriptsRoot = File::Spec->catdir($ENV{'JAVASCRIPTCORE_PRIVATE_HEADERS_DIR'});
162 my $uiRoot = File::Spec->catdir($ENV{'SRCROOT'}, 'UserInterface');
163 my $targetResourcePath = File::Spec->catdir($ENV{'TARGET_BUILD_DIR'}, $ENV{'UNLOCALIZED_RESOURCES_FOLDER_PATH'});
164 my $protocolDir = File::Spec->catdir($targetResourcePath, 'Protocol');
165 my $workersDir = File::Spec->catdir($targetResourcePath, 'Workers');
166 my $codeMirrorPath = File::Spec->catdir($uiRoot, 'External', 'CodeMirror');
167 my $esprimaPath = File::Spec->catdir($uiRoot, 'External', 'Esprima');
168 my $threejsPath = File::Spec->catdir($uiRoot, 'External', 'three.js');
169
170 $webInspectorUIAdditionsDir = &webInspectorUIAdditionsDir();
171
172 my $codeMirrorLicense = readLicenseFile(File::Spec->catfile($codeMirrorPath, 'LICENSE'));
173 my $esprimaLicense = readLicenseFile(File::Spec->catfile($esprimaPath, 'LICENSE'));
174 my $threejsLicense = readLicenseFile(File::Spec->catfile($threejsPath, 'LICENSE'));
175 make_path($protocolDir, $targetResourcePath);
176
177 $python = $ENV{"PYTHON"} if defined($ENV{"PYTHON"});
178
179 # Copy over dynamically loaded files from other frameworks, even if we aren't combining resources.
180 copy(File::Spec->catfile($ENV{'JAVASCRIPTCORE_PRIVATE_HEADERS_DIR'}, 'InspectorBackendCommands.js'), File::Spec->catfile($protocolDir, 'InspectorBackendCommands.js')) or die "Copy of InspectorBackendCommands.js failed: $!";
181
182 my $forceToolInstall = defined $ENV{'FORCE_TOOL_INSTALL'} && ($ENV{'FORCE_TOOL_INSTALL'} eq 'YES');
183 my $shouldCombineMain = defined $ENV{'COMBINE_INSPECTOR_RESOURCES'} && ($ENV{'COMBINE_INSPECTOR_RESOURCES'} eq 'YES');
184 my $shouldCombineTest = defined $ENV{'COMBINE_TEST_RESOURCES'} && ($ENV{'COMBINE_TEST_RESOURCES'} eq 'YES');
185 my $combineResourcesCmd = File::Spec->catfile($scriptsRoot, 'combine-resources.pl');
186
187 if ($forceToolInstall) {
188     # Copy all files over individually to ensure we have Test.html / Test.js and files included from Test.html.
189     # We may then proceed to include combined & optimized resources which will output mostly to different paths
190     # but overwrite Main.html / Main.js with optimized versions.
191     ditto($uiRoot, $targetResourcePath);
192
193     # Also force combining test resources for tool installs.
194     $shouldCombineTest = 1;
195 }
196
197 if (!$shouldCombineMain) {
198     # Keep the files separate for engineering builds. Copy these before altering Main.html
199     # in other ways, such as combining for WebKitAdditions or inlining files.
200     ditto($uiRoot, $targetResourcePath);
201 }
202
203 # Always refer to the copy in derived sources so the order of replacements does not matter.
204 make_path($derivedSourcesDir);
205 my $derivedSourcesMainHTML = File::Spec->catfile($derivedSourcesDir, 'Main.html');
206 copy(File::Spec->catfile($uiRoot, 'Main.html'), File::Spec->catfile($derivedSourcesDir, 'Main.html')) or die "Copy failed: $!";
207
208 sub webInspectorUIAdditionsDir() {
209     my $webkitAdditionsDir;
210     if (defined $ENV{'BUILT_PRODUCTS_DIR'}) {
211         $webkitAdditionsDir = File::Spec->catdir($ENV{'BUILT_PRODUCTS_DIR'}, 'usr', 'local', 'include', 'WebKitAdditions');
212         undef $webkitAdditionsDir unless -d $webkitAdditionsDir
213     }
214     if (!$webkitAdditionsDir and defined $ENV{'SDKROOT'}) {
215         $webkitAdditionsDir = File::Spec->catdir($ENV{'SDKROOT'}, 'usr', 'local', 'include', 'WebKitAdditions');
216         undef $webkitAdditionsDir unless -d $webkitAdditionsDir
217     }
218     return unless $webkitAdditionsDir;
219     debugLog("webkitAdditionsDir: $webkitAdditionsDir");
220     return File::Spec->catdir($webkitAdditionsDir, 'WebInspectorUI');
221 }
222
223 sub combineOrStripResourcesForWebKitAdditions() {
224     my $combineWebKitAdditions = 0;
225
226     if (!defined $webInspectorUIAdditionsDir) {
227         debugLog("Didn't define \$webInspectorUIAdditionsDir");
228     } elsif (-d $webInspectorUIAdditionsDir) {
229         debugLog("Found $webInspectorUIAdditionsDir");
230
231         opendir(DIR, $webInspectorUIAdditionsDir) || die "$!";
232         my @files = grep { !/^\.{1,2}$/ } readdir (DIR);
233         closedir(DIR);
234
235         # The WebKitAdditions/WebInspectorUI directory may exist without any files in it.
236         # Make sure that there is something to be processed in the directory before proceeding.
237         my $foundJSFile = 0;
238         my $foundCSSFile = 0;
239         foreach my $file (@files) {
240             my $path = File::Spec->catdir($$webInspectorUIAdditionsDir, $file);
241             next if -d $path;
242             if ($file =~ /\.js$/) {
243                 debugLog("Found a JavaScript file to combine: $file");
244                 $foundJSFile = 1;
245             } elsif ($file =~ /\.css$/) {
246                 debugLog("Found a CSS file to combine: $file");
247                 $foundCSSFile = 1;
248             }
249         }
250         $combineWebKitAdditions = 1 if $foundCSSFile or $foundJSFile;
251     } else {
252         debugLog("Didn't find $webInspectorUIAdditionsDir");
253     }
254
255     if ($combineWebKitAdditions) {
256         debugLog("Combining resources provided by WebKitAdditions.");
257         combineResourcesForWebKitAdditions();
258     } else {
259         debugLog("Stripping resources provided by WebKitAdditions.");
260         stripResourcesForWebKitAdditions();
261     }
262 }
263
264 sub stripResourcesForWebKitAdditions() {
265     system($perl, $combineResourcesCmd,
266         '--input-dir', 'WebKitAdditions',
267         '--input-html', $derivedSourcesMainHTML,
268         '--derived-sources-dir', $derivedSourcesDir,
269         '--output-dir', $derivedSourcesDir,
270         '--strip');
271 }
272
273 sub combineResourcesForWebKitAdditions() {
274     $rootPathForRelativeIncludes = dirname(dirname($webInspectorUIAdditionsDir));
275     system($perl, $combineResourcesCmd,
276         '--input-dir', 'WebKitAdditions',
277         '--input-html', $derivedSourcesMainHTML,
278         '--input-html-dir', $rootPathForRelativeIncludes,
279         '--derived-sources-dir', $derivedSourcesDir,
280         '--output-dir', $derivedSourcesDir,
281         '--output-script-name', 'WebKitAdditions.js',
282         '--output-style-name', 'WebKitAdditions.css');
283
284     # Export the license into WebKitAdditions files.
285     my $targetWebKitAdditionsJS = File::Spec->catfile($targetResourcePath, 'WebKitAdditions.js');
286     seedFile($targetWebKitAdditionsJS, $inspectorLicense);
287
288     my $targetWebKitAdditionsCSS = File::Spec->catfile($targetResourcePath, 'WebKitAdditions.css');
289     seedFile($targetWebKitAdditionsCSS, $inspectorLicense);
290
291     appendFile($targetWebKitAdditionsJS, File::Spec->catfile($derivedSourcesDir, 'WebKitAdditions.js'));
292     appendFile($targetWebKitAdditionsCSS, File::Spec->catfile($derivedSourcesDir, 'WebKitAdditions.css'));
293 }
294
295 if ($shouldCombineMain) {
296     # Remove Debug JavaScript and CSS files in Production builds.
297     system($perl, $combineResourcesCmd,
298         '--input-dir', 'Debug',
299         '--input-html', $derivedSourcesMainHTML,
300         '--input-html-dir', $uiRoot,
301         '--derived-sources-dir', $derivedSourcesDir,
302         '--output-dir', $derivedSourcesDir,
303         '--output-script-name', 'Debug.js',
304         '--output-style-name', 'Debug.css',
305         '--strip');
306
307     # Combine the JavaScript and CSS files in Production builds into single files (Main.js and Main.css).
308     system($perl, $combineResourcesCmd,
309        '--input-html', $derivedSourcesMainHTML,
310        '--input-html-dir', $uiRoot,
311        '--derived-sources-dir', $derivedSourcesDir,
312        '--output-dir', $derivedSourcesDir,
313        '--output-script-name', 'Main.js',
314        '--output-style-name', 'Main.css');
315
316     # Process WebKitAdditions.{css,js} after Main.{js,css}. Otherwise, the combined WebKitAdditions files
317     # will get slurped into Main.{js,css} because the 'WebKitAdditions' relative URL prefix will be removed.
318     combineOrStripResourcesForWebKitAdditions();
319
320     # Combine the CodeMirror JavaScript and CSS files in Production builds into single files (CodeMirror.js and CodeMirror.css).
321     system($perl, $combineResourcesCmd,
322        '--input-dir', 'External/CodeMirror',
323        '--input-html', $derivedSourcesMainHTML,
324        '--input-html-dir', $uiRoot,
325        '--derived-sources-dir', $derivedSourcesDir,
326        '--output-dir', $derivedSourcesDir,
327        '--output-script-name', 'CodeMirror.js',
328        '--output-style-name', 'CodeMirror.css');
329
330     # Combine the Esprima JavaScript files in Production builds into a single file (Esprima.js).
331     system($perl, $combineResourcesCmd,
332        '--input-dir', 'External/Esprima',
333        '--input-html', $derivedSourcesMainHTML,
334        '--input-html-dir', $uiRoot,
335        '--derived-sources-dir', $derivedSourcesDir,
336        '--output-dir', $derivedSourcesDir,
337        '--output-script-name', 'Esprima.js');
338
339     # Combine the three.js JavaScript files in Production builds into a single file (Three.js).
340     system($perl, $combineResourcesCmd,
341        '--input-dir', 'External/three.js',
342        '--input-html', $derivedSourcesMainHTML,
343        '--input-html-dir', $uiRoot,
344        '--derived-sources-dir', $derivedSourcesDir,
345        '--output-dir', $derivedSourcesDir,
346        '--output-script-name', 'Three.js');
347
348     # Remove console.assert calls from the Main.js file.
349     my $derivedSourcesMainJS = File::Spec->catfile($derivedSourcesDir, 'Main.js');
350     system($perl, File::Spec->catfile($scriptsRoot, 'remove-console-asserts.pl'),
351         '--input-script', $derivedSourcesMainJS,
352         '--output-script', $derivedSourcesMainJS);
353
354     # Fix Image URLs in the Main.css file by removing the "../".
355     my $derivedSourcesMainCSS = File::Spec->catfile($derivedSourcesDir, 'Main.css');
356     if (open(INPUT_MAIN, '<', $derivedSourcesMainCSS)) {
357         local $/;
358         my $cssContents = <INPUT_MAIN>;
359         close(INPUT_MAIN);
360         open(OUTPUT_MAIN, '>', $derivedSourcesMainCSS);
361         $cssContents =~ s/\.\.\/Images/Images/g;
362         print OUTPUT_MAIN $cssContents;
363         close(OUTPUT_MAIN);
364     }
365
366     # Export the license into Main.js.
367     my $targetMainJS = File::Spec->catfile($targetResourcePath, 'Main.js');
368     seedFile($targetMainJS, $inspectorLicense);
369
370     my $targetMainCSS = File::Spec->catfile($targetResourcePath, 'Main.css');
371     seedFile($targetMainCSS, $inspectorLicense);
372
373     # Export the license into CodeMirror.js and CodeMirror.css.
374     my $targetCodeMirrorJS = File::Spec->catfile($targetResourcePath, 'CodeMirror.js');
375     seedFile($targetCodeMirrorJS, $codeMirrorLicense);
376
377     my $targetCodeMirrorCSS = File::Spec->catfile($targetResourcePath, 'CodeMirror.css');
378     seedFile($targetCodeMirrorCSS, $codeMirrorLicense);
379
380     # Export the license into Esprima.js.
381     my $targetEsprimaJS = File::Spec->catfile($targetResourcePath, 'Esprima.js');
382     seedFile($targetEsprimaJS, $esprimaLicense);
383
384     # Export the license into Three.js.
385     my $targetThreejsJS = File::Spec->catfile($targetResourcePath, 'Three.js');
386     seedFile($targetThreejsJS, $threejsLicense);
387
388     # Minify the Main.js and Main.css files, with Main.js appending to the license that was exported above.
389     my $jsMinScript = File::Spec->catfile($sharedScriptsRoot, 'jsmin.py');
390     my $cssMinScript = File::Spec->catfile($sharedScriptsRoot, 'cssmin.py');
391     system(qq("$python" "$jsMinScript" < "$derivedSourcesMainJS" >> "$targetMainJS")) and die "Failed to minify $derivedSourcesMainJS: $!";
392     system(qq("$python" "$cssMinScript" < "$derivedSourcesMainCSS" >> "$targetMainCSS")) and die "Failed to minify $derivedSourcesMainCSS: $!";
393
394     # Minify the CodeMirror.js and CodeMirror.css files, appending to the license that was exported above.
395     my $derivedSourcesCodeMirrorJS = File::Spec->catfile($derivedSourcesDir, 'CodeMirror.js');
396     my $derivedSourcesCodeMirrorCSS = File::Spec->catfile($derivedSourcesDir, 'CodeMirror.css');
397     system(qq("$python" "$jsMinScript" < "$derivedSourcesCodeMirrorJS" >> "$targetCodeMirrorJS")) and die "Failed to minify $derivedSourcesCodeMirrorJS: $!";
398     system(qq("$python" "$cssMinScript" < "$derivedSourcesCodeMirrorCSS" >> "$targetCodeMirrorCSS")) and die "Failed to minify $derivedSourcesCodeMirrorCSS: $!";
399
400     # Minify the Esprima.js file, appending to the license that was exported above.
401     my $derivedSourcesEsprimaJS = File::Spec->catfile($derivedSourcesDir, 'Esprima.js');
402     system(qq("$python" "$jsMinScript" < "$derivedSourcesEsprimaJS" >> "$targetEsprimaJS")) and die "Failed to minify $derivedSourcesEsprimaJS: $!";
403
404     # Minify the Three.js file, appending to the license that was exported above.
405     my $derivedSourcesThreejsJS = File::Spec->catfile($derivedSourcesDir, 'Three.js');
406     system(qq("$python" "$jsMinScript" < "$derivedSourcesThreejsJS" >> "$targetThreejsJS")) and die "Failed to minify $derivedSourcesThreejsJS: $!";
407
408     # Copy over the Images directory.
409     ditto(File::Spec->catdir($uiRoot, 'Images'), File::Spec->catdir($targetResourcePath, 'Images'));
410
411     # Copy the Protocol/Legacy and Workers directories.
412     ditto(File::Spec->catfile($uiRoot, 'Protocol', 'Legacy'), File::Spec->catfile($protocolDir, 'Legacy'));
413     ditto(File::Spec->catfile($uiRoot, 'Workers'), $workersDir);
414
415     # Remove console.assert calls from the Worker js files.
416     system($perl, File::Spec->catfile($scriptsRoot, 'remove-console-asserts.pl'),
417         '--input-directory', $workersDir);
418
419     # Fix import references in Workers directories. This rewrites "../../External/script.js" import paths to their new locations.
420     system($perl, File::Spec->catfile($scriptsRoot, 'fix-worker-imports-for-optimized-builds.pl'),
421         '--input-directory', $workersDir) and die "Failed to update Worker imports for optimized builds.";
422 } else {
423     # Always process WebKitAdditions files because the 'WebKitAdditions' path prefix is not real,
424     # so it can't proceed as a normal load from the bundle as written. This function replaces the
425     # dummy prefix with the actual WebKitAdditions path when looking for files to inline and combine.
426     combineOrStripResourcesForWebKitAdditions();
427 }
428
429 # Always copy over Main.html because we may have combined WebKitAdditions files
430 # without minifying anything else. We always want to combine WKA so the relevant
431 # resources are copied out of Derived Sources rather than an arbitrary WKA directory.
432 copy($derivedSourcesMainHTML, File::Spec->catfile($targetResourcePath, 'Main.html'));
433
434 if ($shouldCombineTest) {
435     # Combine the JavaScript files for testing into a single file (TestCombined.js).
436     system($perl, $combineResourcesCmd,
437         '--input-html', File::Spec->catfile($uiRoot, 'Test.html'),
438         '--derived-sources-dir', $derivedSourcesDir,
439         '--output-dir', $derivedSourcesDir,
440         '--output-script-name', 'TestCombined.js',
441         '--output-style-name', 'TestCombined.css');
442
443     my $derivedSourcesTestHTML = File::Spec->catfile($derivedSourcesDir, 'Test.html');
444     my $derivedSourcesTestJS = File::Spec->catfile($derivedSourcesDir, 'TestCombined.js');
445     # Combine the CodeMirror JavaScript files into single file (TestCodeMirror.js).
446     system($perl, $combineResourcesCmd,
447         '--input-dir', 'External/CodeMirror',
448         '--input-html', $derivedSourcesTestHTML,
449         '--input-html-dir', $uiRoot,
450         '--derived-sources-dir', $derivedSourcesDir,
451         '--output-dir', $derivedSourcesDir,
452         '--output-script-name', 'TestCodeMirror.js');
453
454     # Combine the Esprima JavaScript files for testing into a single file (TestEsprima.js).
455     system($perl, $combineResourcesCmd,
456         '--input-dir', 'External/Esprima',
457         '--input-html', $derivedSourcesTestHTML,
458         '--input-html-dir', $uiRoot,
459         '--derived-sources-dir', $derivedSourcesDir,
460         '--output-dir', $derivedSourcesDir,
461         '--output-script-name', 'TestEsprima.js');
462
463     # Export the license into TestCombined.js.
464     my $targetTestJS = File::Spec->catfile($targetResourcePath, 'TestCombined.js');
465     seedFile($targetTestJS, $inspectorLicense);
466
467     # Export the license into TestCodeMirror.js.
468     my $targetCodeMirrorJS = File::Spec->catfile($targetResourcePath, 'TestCodeMirror.js');
469     seedFile($targetCodeMirrorJS, $codeMirrorLicense);
470
471     # Export the license into TestEsprima.js.
472     my $targetEsprimaJS = File::Spec->catfile($targetResourcePath, 'TestEsprima.js');
473     seedFile($targetEsprimaJS, $esprimaLicense);
474
475     # Append TestCombined.js to the license that was exported above.
476     appendFile($targetTestJS, $derivedSourcesTestJS);
477
478     # Append CodeMirror.js to the license that was exported above.
479     my $derivedSourcesCodeMirrorJS = File::Spec->catfile($derivedSourcesDir, 'TestCodeMirror.js');
480     appendFile($targetCodeMirrorJS, $derivedSourcesCodeMirrorJS);
481
482     # Append Esprima.js to the license that was exported above.
483     my $derivedSourcesEsprimaJS = File::Spec->catfile($derivedSourcesDir, 'TestEsprima.js');
484     appendFile($targetEsprimaJS, $derivedSourcesEsprimaJS);
485
486     # Copy over Test.html.
487     copy($derivedSourcesTestHTML, File::Spec->catfile($targetResourcePath, 'Test.html'));
488
489     # Combine the JavaScript files for testing into a single file (TestStub.js).
490     system($perl, $combineResourcesCmd,
491         '--input-html', File::Spec->catfile($uiRoot, 'TestStub.html'),
492         '--derived-sources-dir', $derivedSourcesDir,
493         '--output-dir', $derivedSourcesDir,
494         '--output-script-name', 'TestStubCombined.js');
495
496     # Copy over TestStub.html and TestStubCombined.js.
497     copy(File::Spec->catfile($derivedSourcesDir, 'TestStub.html'), File::Spec->catfile($targetResourcePath, 'TestStub.html'));
498     copy(File::Spec->catfile($derivedSourcesDir, 'TestStubCombined.js'), File::Spec->catfile($targetResourcePath, 'TestStubCombined.js'));
499
500     # Copy the Legacy directory.
501     ditto(File::Spec->catfile($uiRoot, 'Protocol', 'Legacy'), File::Spec->catfile($protocolDir, 'Legacy'));
502 }