Home | History | Annotate | Download | only in dom
      1 /*
      2  * Copyright (C) 2013 Google Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions are
      6  * met:
      7  *
      8  *     * Redistributions of source code must retain the above copyright
      9  * notice, this list of conditions and the following disclaimer.
     10  *     * Neither the name of Google Inc. nor the names of its
     11  * contributors may be used to endorse or promote products derived from
     12  * this software without specific prior written permission.
     13  *
     14  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     15  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     16  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     17  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     18  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     19  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     20  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     25  */
     26 
     27 #include "config.h"
     28 #include "core/dom/StyleSheetCandidate.h"
     29 
     30 #include "core/HTMLNames.h"
     31 #include "core/dom/Element.h"
     32 #include "core/dom/ProcessingInstruction.h"
     33 #include "core/dom/StyleEngine.h"
     34 #include "core/html/HTMLLinkElement.h"
     35 #include "core/html/HTMLStyleElement.h"
     36 #include "core/html/imports/HTMLImport.h"
     37 #include "core/svg/SVGStyleElement.h"
     38 
     39 namespace blink {
     40 
     41 using namespace HTMLNames;
     42 
     43 AtomicString StyleSheetCandidate::title() const
     44 {
     45     return isElement() ? toElement(node()).fastGetAttribute(titleAttr) : nullAtom;
     46 }
     47 
     48 bool StyleSheetCandidate::isXSL() const
     49 {
     50     return !node().document().isHTMLDocument() && m_type == Pi && toProcessingInstruction(node()).isXSL();
     51 }
     52 
     53 bool StyleSheetCandidate::isImport() const
     54 {
     55     return m_type == HTMLLink && toHTMLLinkElement(node()).isImport();
     56 }
     57 
     58 Document* StyleSheetCandidate::importedDocument() const
     59 {
     60     ASSERT(isImport());
     61     return toHTMLLinkElement(node()).import();
     62 }
     63 
     64 bool StyleSheetCandidate::isAlternate() const
     65 {
     66     if (!isElement())
     67         return false;
     68     return toElement(node()).getAttribute(relAttr).contains("alternate");
     69 }
     70 
     71 bool StyleSheetCandidate::isEnabledViaScript() const
     72 {
     73     return isHTMLLink() && toHTMLLinkElement(node()).isEnabledViaScript();
     74 }
     75 
     76 bool StyleSheetCandidate::isEnabledAndLoading() const
     77 {
     78     return isHTMLLink() && !toHTMLLinkElement(node()).isDisabled() && toHTMLLinkElement(node()).styleSheetIsLoading();
     79 }
     80 
     81 bool StyleSheetCandidate::hasPreferrableName(const String& currentPreferrableName) const
     82 {
     83     ASSERT(isEnabledAndLoading() || sheet());
     84     return !isEnabledViaScript() && !title().isEmpty() && !isAlternate() && currentPreferrableName.isEmpty();
     85 }
     86 
     87 bool StyleSheetCandidate::canBeActivated(const String& currentPreferrableName) const
     88 {
     89     StyleSheet* sheet = this->sheet();
     90     if (!sheet || sheet->disabled() || !sheet->isCSSStyleSheet())
     91         return false;
     92     const AtomicString& title = this->title();
     93     if (!isEnabledViaScript() && !title.isEmpty() && title != currentPreferrableName)
     94         return false;
     95     if (isAlternate() && title.isEmpty())
     96         return false;
     97 
     98     return true;
     99 }
    100 
    101 StyleSheetCandidate::Type StyleSheetCandidate::typeOf(Node& node)
    102 {
    103     if (node.nodeType() == Node::PROCESSING_INSTRUCTION_NODE)
    104         return Pi;
    105 
    106     if (node.isHTMLElement()) {
    107         if (isHTMLLinkElement(node))
    108             return HTMLLink;
    109         if (isHTMLStyleElement(node))
    110             return HTMLStyle;
    111 
    112         ASSERT_NOT_REACHED();
    113         return HTMLStyle;
    114     }
    115 
    116     if (isSVGStyleElement(node))
    117         return SVGStyle;
    118 
    119     ASSERT_NOT_REACHED();
    120     return HTMLStyle;
    121 }
    122 
    123 StyleSheet* StyleSheetCandidate::sheet() const
    124 {
    125     switch (m_type) {
    126     case HTMLLink:
    127         return toHTMLLinkElement(node()).sheet();
    128     case HTMLStyle:
    129         return toHTMLStyleElement(node()).sheet();
    130     case SVGStyle:
    131         return toSVGStyleElement(node()).sheet();
    132     case Pi:
    133         return toProcessingInstruction(node()).sheet();
    134     }
    135 
    136     ASSERT_NOT_REACHED();
    137     return 0;
    138 }
    139 
    140 }
    141