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