# Copyright (C) 2005, 2006, 2007, 2008, 2009, 2012 Apple Inc. All rights reserved
# Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com)
# Copyright (C) 2010 Andras Becsi (abecsi@inf.u-szeged.hu), University of Szeged
#
# 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.
# 3.  Neither the name of Apple Inc. ("Apple") nor the names of
#     its contributors may be used to endorse or promote products derived
#     from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY APPLE 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 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.

# Module to share code to detect the existance of features in built binaries.

use strict;
use warnings;

use FindBin;
use lib $FindBin::Bin;
use webkitdirs;

BEGIN {
   use Exporter   ();
   our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
   $VERSION     = 1.00;
   @ISA         = qw(Exporter);
   @EXPORT      = qw(&checkWebCoreFeatureSupport);
   %EXPORT_TAGS = ( );
   @EXPORT_OK   = ();
}

sub libraryContainsSymbol($$)
{
    my ($path, $symbol) = @_;

    if (isAnyWindows()) {
        # FIXME: Implement this for Windows.
        return 0;
    }

    my $foundSymbol = 0;
    if (-e $path) {
        open NM, "-|", nmPath(), $path or die;
        while (<NM>) {
            $foundSymbol = 1 if /$symbol/; # FIXME: This should probably check for word boundaries before/after the symbol name.
        }
        close NM;
    }
    return $foundSymbol;
}

sub hasFeature($$)
{
    my ($featureName, $path) = @_;
    my %symbolForFeature = (
        "MathML" => "MathMLElement",
        "SVG" => "SVGDefsElement", # We used to look for SVGElement but isSVGElement exists (and would match) in --no-svg builds.
        "Accelerated Compositing" => "GraphicsLayer",
        "3D Rendering" => "WebCoreHas3DRendering",
        "3D Canvas" => "WebGLShader",
        "MHTML" => "MHTMLArchive"
    );
    my $symbolName = $symbolForFeature{$featureName};
    die "Unknown feature: $featureName" unless $symbolName;
    return libraryContainsSymbol($path, $symbolName);
}

sub checkWebCoreFeatureSupport($$)
{
    my ($feature, $required) = @_;
    my $libraryName = "WebCore";
    my $path = builtDylibPathForName($libraryName);
    my $hasFeature = hasFeature($feature, $path);
    if ($required && !$hasFeature) {
        die "$libraryName at \"$path\" does not include $hasFeature support.  See build-webkit --help\n";
    }
    return $hasFeature;
}

1;
