Index: Source/bindings/scripts/preprocess-idls.pl |
diff --git a/Source/bindings/scripts/preprocess-idls.pl b/Source/bindings/scripts/preprocess-idls.pl |
index f4a81506fc791d86e8b90ed6c33e842e06b23e59..89f5699f6d552b41724ab6dd60124d5298619f98 100644 |
--- a/Source/bindings/scripts/preprocess-idls.pl |
+++ b/Source/bindings/scripts/preprocess-idls.pl |
@@ -28,13 +28,16 @@ my $defines; |
my $preprocessor; |
my $idlFilesList; |
my $supplementalDependencyFile; |
+my $windowConstructorsFile; |
GetOptions('defines=s' => \$defines, |
'preprocessor=s' => \$preprocessor, |
'idlFilesList=s' => \$idlFilesList, |
- 'supplementalDependencyFile=s' => \$supplementalDependencyFile); |
+ 'supplementalDependencyFile=s' => \$supplementalDependencyFile, |
+ 'windowConstructorsFile=s' => \$windowConstructorsFile); |
die('Must specify an output file using --supplementalDependencyFile.') unless defined($supplementalDependencyFile); |
+die('Must specify an output file using --windowConstructorsFile.') unless defined($windowConstructorsFile); |
die('Must specify the file listing all IDLs using --idlFilesList.') unless defined($idlFilesList); |
open FH, "< $idlFilesList" or die "Cannot open $idlFilesList\n"; |
@@ -47,18 +50,35 @@ my %interfaceNameToIdlFile; |
my %idlFileToInterfaceName; |
my %supplementalDependencies; |
my %supplementals; |
+my $constructorAttributesCode = ""; |
foreach my $idlFile (@idlFiles) { |
my $fullPath = Cwd::realpath($idlFile); |
- my $partialInterfaceName = getPartialInterfaceNameFromIDLFile($fullPath); |
+ my $idlFileContents = getFileContents($fullPath); |
+ my $partialInterfaceName = getPartialInterfaceNameFromIDL($idlFileContents); |
if ($partialInterfaceName) { |
$supplementalDependencies{$fullPath} = $partialInterfaceName; |
+ next; |
} |
my $interfaceName = fileparse(basename($idlFile), ".idl"); |
+ unless (isCallbackInterfaceFromIDL($idlFileContents)) { |
+ my $extendedAttributes = getInterfaceExtendedAttributesFromIDL($idlFileContents); |
+ unless ($extendedAttributes->{"NoInterfaceObject"}) { |
+ $constructorAttributesCode .= GenerateConstructorAttribute($interfaceName, $extendedAttributes); |
+ } |
+ } |
$interfaceNameToIdlFile{$interfaceName} = $fullPath; |
$idlFileToInterfaceName{$fullPath} = $interfaceName; |
$supplementals{$fullPath} = []; |
} |
+# Generate DOMWindow Constructors partial interface. |
+open PARTIAL_WINDOW_FH, "> $windowConstructorsFile" or die "Cannot open $windowConstructorsFile\n"; |
+print PARTIAL_WINDOW_FH "partial interface DOMWindow {\n"; |
+print PARTIAL_WINDOW_FH $constructorAttributesCode; |
+print PARTIAL_WINDOW_FH "};\n"; |
+close PARTIAL_WINDOW_FH; |
+$supplementalDependencies{$windowConstructorsFile} = "DOMWindow"; |
+ |
# Resolves partial interfaces dependencies. |
foreach my $idlFile (keys %supplementalDependencies) { |
my $baseFile = $supplementalDependencies{$idlFile}; |
@@ -86,7 +106,38 @@ foreach my $idlFile (sort keys %supplementals) { |
} |
close FH; |
-sub getPartialInterfaceNameFromIDLFile |
+sub GenerateConstructorAttribute |
+{ |
+ my $interfaceName = shift; |
+ my $extendedAttributes = shift; |
+ |
+ my $code = " "; |
+ my @extendedAttributesList; |
+ foreach my $attributeName (keys %{$extendedAttributes}) { |
+ next unless ($attributeName eq "Conditional" || $attributeName eq "EnabledAtRuntime" || $attributeName eq "EnabledPerContext"); |
+ my $extendedAttribute = $attributeName; |
+ $extendedAttribute .= "=" . $extendedAttributes->{$attributeName} unless $extendedAttributes->{$attributeName} eq "VALUE_IS_MISSING"; |
+ push(@extendedAttributesList, $extendedAttribute); |
+ } |
+ $code .= "[" . join(', ', @extendedAttributesList) . "] " if @extendedAttributesList; |
+ |
+ my $originalInterfaceName = $interfaceName; |
+ $interfaceName = $extendedAttributes->{"InterfaceName"} if $extendedAttributes->{"InterfaceName"}; |
+ $code .= "attribute " . $originalInterfaceName . "Constructor $interfaceName;\n"; |
+ |
+ # In addition to the regular property, for every [NamedConstructor] extended attribute on an interface, |
+ # a corresponding property MUST exist on the ECMAScript global object. |
+ if ($extendedAttributes->{"NamedConstructor"}) { |
+ my $constructorName = $extendedAttributes->{"NamedConstructor"}; |
+ $constructorName =~ s/\(.*//g; # Extract function name. |
+ $code .= " "; |
+ $code .= "[" . join(', ', @extendedAttributesList) . "] " if @extendedAttributesList; |
+ $code .= "attribute " . $originalInterfaceName . "ConstructorConstructor $constructorName;\n"; |
+ } |
+ return $code; |
+} |
+ |
+sub getFileContents |
{ |
my $idlFile = shift; |
@@ -94,8 +145,51 @@ sub getPartialInterfaceNameFromIDLFile |
my @lines = <FILE>; |
close FILE; |
- my $fileContents = join('', @lines); |
+ # Filter out preprocessor lines. |
+ @lines = grep(!/^\s*#/, @lines); |
+ |
+ return join('', @lines); |
+} |
+ |
+sub getPartialInterfaceNameFromIDL |
+{ |
+ my $fileContents = shift; |
+ |
if ($fileContents =~ /partial\s+interface\s+(\w+)/gs) { |
return $1; |
} |
} |
+ |
+sub isCallbackInterfaceFromIDL |
+{ |
+ my $fileContents = shift; |
+ return ($fileContents =~ /callback\s+interface\s+\w+/gs); |
+} |
+ |
+sub trim |
+{ |
+ my $string = shift; |
+ $string =~ s/^\s+|\s+$//g; |
+ return $string; |
+} |
+ |
+sub getInterfaceExtendedAttributesFromIDL |
+{ |
+ my $fileContents = shift; |
+ |
+ my $extendedAttributes = {}; |
+ |
+ if ($fileContents =~ /\[(.*)\]\s+(interface|exception)\s+(\w+)/gs) { |
+ my @parts = split(',', $1); |
+ foreach my $part (@parts) { |
+ my @keyValue = split('=', $part); |
+ my $key = trim($keyValue[0]); |
+ next unless length($key); |
+ my $value = "VALUE_IS_MISSING"; |
+ $value = trim($keyValue[1]) if @keyValue > 1; |
+ $extendedAttributes->{$key} = $value; |
+ } |
+ } |
+ |
+ return $extendedAttributes; |
+} |