blob: 2ceb07a7a404bff10fed3b27402e550cdc32e53c [file] [log] [blame]
#!/usr/bin/env ruby
#
# 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.
#
# 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.
require "fileutils"
require 'erb'
require 'optparse'
require 'yaml'
options = {
:input => nil,
:outputDirectory => nil
}
optparse = OptionParser.new do |opts|
opts.banner = "Usage: #{File.basename($0)} --input file"
opts.separator ""
opts.on("--input input", "file to generate settings from") { |input| options[:input] = input }
opts.on("--outputDir output", "directory to generate file in") { |output| options[:outputDirectory] = output }
end
optparse.parse!
if !options[:input]
puts optparse
exit -1
end
if !options[:outputDirectory]
options[:outputDirectory] = Dir.getwd
end
FileUtils.mkdir_p(options[:outputDirectory])
parsedPreferences = begin
YAML.load_file(options[:input])
rescue ArgumentError => e
puts "Could not parse input file: #{e.message}"
exit(-1)
end
class Preference
attr_accessor :name
attr_accessor :type
attr_accessor :defaultValue
attr_accessor :humanReadableName
attr_accessor :humanReadableDescription
attr_accessor :category
attr_accessor :webcoreBinding
attr_accessor :condition
attr_accessor :hidden
def initialize(name, opts)
@name = name
@type = opts["type"]
@defaultValue = opts["defaultValue"]
@humanReadableName = '"' + (opts["humanReadableName"] || "") + '"'
@humanReadableDescription = '"' + (opts["humanReadableDescription"] || "") + '"'
@category = opts["category"]
@getter = opts["getter"]
@webcoreBinding = opts["webcoreBinding"]
@webcoreName = opts["webcoreName"]
@condition = opts["condition"]
@hidden = opts["hidden"] || false
end
def nameLower
if @getter
@getter
elsif @name.start_with?("CSS", "XSS", "FTP", "DOM", "DNS", "PDF", "ICE")
@name[0..2].downcase + @name[3..@name.length]
elsif @name.start_with?("HTTP")
@name[0..3].downcase + @name[4..@name.length]
else
@name[0].downcase + @name[1..@name.length]
end
end
def webcoreNameUpper
if @webcoreName
@webcoreName[0].upcase + @webcoreName[1..@webcoreName.length]
else
@name
end
end
def typeUpper
if @type == "uint32_t"
"UInt32"
else
@type.capitalize
end
end
end
class Conditional
attr_accessor :condition
attr_accessor :preferences
def initialize(condition, settings)
@condition = condition
@preferences = preferences
end
end
class Preferences
attr_accessor :preferences
def initialize(hash, outputDirectory)
@outputDirectory = outputDirectory
@preferences = []
hash.each do |name, options|
@preferences << Preference.new(name, options)
end
@preferences.sort! { |x, y| x.name <=> y.name }
@preferencesNotDebug = @preferences.select { |p| !p.category }
@preferencesDebug = @preferences.select { |p| p.category == "debug" }
@experimentalFeatures = @preferences.select { |p| p.category == "experimental" }.sort! { |x, y| x.humanReadableName <=> y.humanReadableName }
@internalDebugFeatures = @preferences.select { |p| p.category == "internal" }.sort! { |x, y| x.humanReadableName <=> y.humanReadableName }
@preferencesBoundToSetting = @preferences.select { |p| !p.webcoreBinding }
@preferencesBoundToDeprecatedGlobalSettings = @preferences.select { |p| p.webcoreBinding == "DeprecatedGlobalSettings" }
@preferencesBoundToRuntimeEnabledFeatures = @preferences.select { |p| p.webcoreBinding == "RuntimeEnabledFeatures" }
@warning = "THIS FILE WAS AUTOMATICALLY GENERATED, DO NOT EDIT."
end
def renderTemplate(template)
templateFile = File.join(File.dirname(__FILE__), "PreferencesTemplates", template + ".erb")
output = ERB.new(File.read(templateFile), 0, "-").result(binding)
File.open(File.join(@outputDirectory, template), "w+") do |f|
f.write(output)
end
end
end
preferences = Preferences.new(parsedPreferences, options[:outputDirectory])
preferences.renderTemplate("WebPreferencesDefinitions.h")
preferences.renderTemplate("WebPageUpdatePreferences.cpp")
preferences.renderTemplate("WebPreferencesKeys.h")
preferences.renderTemplate("WebPreferencesKeys.cpp")
preferences.renderTemplate("WebPreferencesStoreDefaultsMap.cpp")
preferences.renderTemplate("WebPreferencesInternalDebugFeatures.cpp")
preferences.renderTemplate("WebPreferencesExperimentalFeatures.cpp")