LCOV - code coverage report
Current view: top level - dom/svg - SVGTests.cpp (source / functions) Hit Total Coverage
Test: output.info Lines: 12 99 12.1 %
Date: 2017-07-14 16:53:18 Functions: 3 13 23.1 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
       2             : /* vim: set ts=8 sts=2 et sw=2 tw=80: */
       3             : /* This Source Code Form is subject to the terms of the Mozilla Public
       4             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       5             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
       6             : 
       7             : #include "mozilla/dom/SVGTests.h"
       8             : #include "DOMSVGStringList.h"
       9             : #include "nsSVGFeatures.h"
      10             : #include "mozilla/dom/SVGSwitchElement.h"
      11             : #include "nsCharSeparatedTokenizer.h"
      12             : #include "nsStyleUtil.h"
      13             : #include "mozilla/Preferences.h"
      14             : 
      15             : namespace mozilla {
      16             : namespace dom {
      17             : 
      18             : nsIAtom** SVGTests::sStringListNames[3] =
      19             : {
      20             :   &nsGkAtoms::requiredFeatures,
      21             :   &nsGkAtoms::requiredExtensions,
      22             :   &nsGkAtoms::systemLanguage,
      23             : };
      24             : 
      25         143 : SVGTests::SVGTests()
      26             : {
      27         143 :   mStringListAttributes[LANGUAGE].SetIsCommaSeparated(true);
      28         143 : }
      29             : 
      30             : already_AddRefed<DOMSVGStringList>
      31           0 : SVGTests::RequiredFeatures()
      32             : {
      33           0 :   nsCOMPtr<nsIDOMSVGElement> elem = do_QueryInterface(this);
      34           0 :   nsSVGElement* element = static_cast<nsSVGElement*>(elem.get());
      35             :   return DOMSVGStringList::GetDOMWrapper(
      36           0 :            &mStringListAttributes[FEATURES], element, true, FEATURES);
      37             : }
      38             : 
      39             : already_AddRefed<DOMSVGStringList>
      40           0 : SVGTests::RequiredExtensions()
      41             : {
      42           0 :   nsCOMPtr<nsIDOMSVGElement> elem = do_QueryInterface(this);
      43           0 :   nsSVGElement* element = static_cast<nsSVGElement*>(elem.get());
      44             :   return DOMSVGStringList::GetDOMWrapper(
      45           0 :            &mStringListAttributes[EXTENSIONS], element, true, EXTENSIONS);
      46             : }
      47             : 
      48             : already_AddRefed<DOMSVGStringList>
      49           0 : SVGTests::SystemLanguage()
      50             : {
      51           0 :   nsCOMPtr<nsIDOMSVGElement> elem = do_QueryInterface(this);
      52           0 :   nsSVGElement* element = static_cast<nsSVGElement*>(elem.get());
      53             :   return DOMSVGStringList::GetDOMWrapper(
      54           0 :            &mStringListAttributes[LANGUAGE], element, true, LANGUAGE);
      55             : }
      56             : 
      57             : bool
      58           0 : SVGTests::HasExtension(const nsAString& aExtension)
      59             : {
      60           0 :   return nsSVGFeatures::HasExtension(aExtension, IsInChromeDoc());
      61             : }
      62             : 
      63             : bool
      64           0 : SVGTests::IsConditionalProcessingAttribute(const nsIAtom* aAttribute) const
      65             : {
      66           0 :   for (uint32_t i = 0; i < ArrayLength(sStringListNames); i++) {
      67           0 :     if (aAttribute == *sStringListNames[i]) {
      68           0 :       return true;
      69             :     }
      70             :   }
      71           0 :   return false;
      72             : }
      73             : 
      74             : int32_t
      75           0 : SVGTests::GetBestLanguagePreferenceRank(const nsAString& aAcceptLangs) const
      76             : {
      77           0 :   const nsDefaultStringComparator defaultComparator;
      78             : 
      79           0 :   if (!mStringListAttributes[LANGUAGE].IsExplicitlySet()) {
      80           0 :     return -2;
      81             :   }
      82             : 
      83           0 :   int32_t lowestRank = -1;
      84             : 
      85           0 :   for (uint32_t i = 0; i < mStringListAttributes[LANGUAGE].Length(); i++) {
      86           0 :     nsCharSeparatedTokenizer languageTokenizer(aAcceptLangs, ',');
      87           0 :     int32_t index = 0;
      88           0 :     while (languageTokenizer.hasMoreTokens()) {
      89           0 :       const nsAString& languageToken = languageTokenizer.nextToken();
      90           0 :       bool exactMatch = (languageToken == mStringListAttributes[LANGUAGE][i]);
      91             :       bool prefixOnlyMatch =
      92           0 :         !exactMatch &&
      93           0 :         nsStyleUtil::DashMatchCompare(mStringListAttributes[LANGUAGE][i],
      94           0 :                                       languageTokenizer.nextToken(),
      95           0 :                                       defaultComparator);
      96           0 :       if (index == 0 && exactMatch) {
      97             :         // best possible match
      98           0 :         return 0;
      99             :       }
     100           0 :       if ((exactMatch || prefixOnlyMatch) &&
     101           0 :           (lowestRank == -1 || 2 * index + prefixOnlyMatch < lowestRank)) {
     102           0 :         lowestRank = 2 * index + prefixOnlyMatch;
     103             :       }
     104           0 :       ++index;
     105             :     }
     106             :   }
     107           0 :   return lowestRank;
     108             : }
     109             : 
     110             : const nsString * const SVGTests::kIgnoreSystemLanguage = (nsString *) 0x01;
     111             : 
     112             : bool
     113         136 : SVGTests::PassesConditionalProcessingTests(const nsString *aAcceptLangs) const
     114             : {
     115             :   // Required Extensions
     116             :   //
     117             :   // The requiredExtensions  attribute defines a list of required language
     118             :   // extensions. Language extensions are capabilities within a user agent that
     119             :   // go beyond the feature set defined in the SVG specification.
     120             :   // Each extension is identified by a URI reference.
     121             :   // For now, claim that mozilla's SVG implementation supports XHTML and MathML.
     122         136 :   if (mStringListAttributes[EXTENSIONS].IsExplicitlySet()) {
     123           0 :     if (mStringListAttributes[EXTENSIONS].IsEmpty()) {
     124           0 :       return false;
     125             :     }
     126           0 :     for (uint32_t i = 0; i < mStringListAttributes[EXTENSIONS].Length(); i++) {
     127           0 :       if (!nsSVGFeatures::HasExtension(mStringListAttributes[EXTENSIONS][i], IsInChromeDoc())) {
     128           0 :         return false;
     129             :       }
     130             :     }
     131             :   }
     132             : 
     133         136 :   if (aAcceptLangs == kIgnoreSystemLanguage) {
     134           0 :     return true;
     135             :   }
     136             : 
     137             :   // systemLanguage
     138             :   //
     139             :   // Evaluates to "true" if one of the languages indicated by user preferences
     140             :   // exactly equals one of the languages given in the value of this parameter,
     141             :   // or if one of the languages indicated by user preferences exactly equals a
     142             :   // prefix of one of the languages given in the value of this parameter such
     143             :   // that the first tag character following the prefix is "-".
     144         136 :   if (mStringListAttributes[LANGUAGE].IsExplicitlySet()) {
     145           0 :     if (mStringListAttributes[LANGUAGE].IsEmpty()) {
     146           0 :       return false;
     147             :     }
     148             : 
     149             :     // Get our language preferences
     150           0 :     const nsAutoString acceptLangs(aAcceptLangs ? *aAcceptLangs :
     151           0 :       Preferences::GetLocalizedString("intl.accept_languages"));
     152             : 
     153           0 :     if (acceptLangs.IsEmpty()) {
     154           0 :       NS_WARNING("no default language specified for systemLanguage conditional test");
     155           0 :       return false;
     156             :     }
     157             : 
     158           0 :     const nsDefaultStringComparator defaultComparator;
     159             : 
     160           0 :     for (uint32_t i = 0; i < mStringListAttributes[LANGUAGE].Length(); i++) {
     161           0 :       nsCharSeparatedTokenizer languageTokenizer(acceptLangs, ',');
     162           0 :       while (languageTokenizer.hasMoreTokens()) {
     163           0 :         if (nsStyleUtil::DashMatchCompare(mStringListAttributes[LANGUAGE][i],
     164           0 :                                           languageTokenizer.nextToken(),
     165             :                                           defaultComparator)) {
     166           0 :           return true;
     167             :         }
     168             :       }
     169             :     }
     170           0 :     return false;
     171             :   }
     172             : 
     173         136 :   return true;
     174             : }
     175             : 
     176             : bool
     177         134 : SVGTests::ParseConditionalProcessingAttribute(nsIAtom* aAttribute,
     178             :                                               const nsAString& aValue,
     179             :                                               nsAttrValue& aResult)
     180             : {
     181         536 :   for (uint32_t i = 0; i < ArrayLength(sStringListNames); i++) {
     182         402 :     if (aAttribute == *sStringListNames[i]) {
     183           0 :       nsresult rv = mStringListAttributes[i].SetValue(aValue);
     184           0 :       if (NS_FAILED(rv)) {
     185           0 :         mStringListAttributes[i].Clear();
     186             :       }
     187           0 :       MaybeInvalidate();
     188           0 :       return true;
     189             :     }
     190             :   }
     191         134 :   return false;
     192             : }
     193             : 
     194             : void
     195           0 : SVGTests::UnsetAttr(const nsIAtom* aAttribute)
     196             : {
     197           0 :   for (uint32_t i = 0; i < ArrayLength(sStringListNames); i++) {
     198           0 :     if (aAttribute == *sStringListNames[i]) {
     199           0 :       mStringListAttributes[i].Clear();
     200           0 :       MaybeInvalidate();
     201           0 :       return;
     202             :     }
     203             :   }
     204             : }
     205             : 
     206             : nsIAtom*
     207           0 : SVGTests::GetAttrName(uint8_t aAttrEnum) const
     208             : {
     209           0 :   return *sStringListNames[aAttrEnum];
     210             : }
     211             : 
     212             : void
     213           0 : SVGTests::GetAttrValue(uint8_t aAttrEnum, nsAttrValue& aValue) const
     214             : {
     215           0 :   MOZ_ASSERT(aAttrEnum < ArrayLength(sStringListNames),
     216             :              "aAttrEnum out of range");
     217           0 :   aValue.SetTo(mStringListAttributes[aAttrEnum], nullptr);
     218           0 : }
     219             : 
     220             : void
     221           0 : SVGTests::MaybeInvalidate()
     222             : {
     223           0 :   nsCOMPtr<nsIDOMSVGElement> elem = do_QueryInterface(this);
     224           0 :   nsSVGElement* element = static_cast<nsSVGElement*>(elem.get());
     225             : 
     226           0 :   nsIContent* parent = element->GetFlattenedTreeParent();
     227             : 
     228           0 :   if (parent &&
     229           0 :       parent->NodeInfo()->Equals(nsGkAtoms::svgSwitch, kNameSpaceID_SVG)) {
     230           0 :     static_cast<dom::SVGSwitchElement*>(parent)->MaybeInvalidate();
     231             :   }
     232           0 : }
     233             : 
     234             : } // namespace dom
     235             : } // namespace mozilla

Generated by: LCOV version 1.13