#!/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" } @internalDebugFeatures = @preferences.select { |p| p.category == "internal" } @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")