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 39namespace blink { 40 41using namespace HTMLNames; 42 43AtomicString StyleSheetCandidate::title() const 44{ 45 return isElement() ? toElement(node()).fastGetAttribute(titleAttr) : nullAtom; 46} 47 48bool StyleSheetCandidate::isXSL() const 49{ 50 return !node().document().isHTMLDocument() && m_type == Pi && toProcessingInstruction(node()).isXSL(); 51} 52 53bool StyleSheetCandidate::isImport() const 54{ 55 return m_type == HTMLLink && toHTMLLinkElement(node()).isImport(); 56} 57 58Document* StyleSheetCandidate::importedDocument() const 59{ 60 ASSERT(isImport()); 61 return toHTMLLinkElement(node()).import(); 62} 63 64bool StyleSheetCandidate::isAlternate() const 65{ 66 if (!isElement()) 67 return false; 68 return toElement(node()).getAttribute(relAttr).contains("alternate"); 69} 70 71bool StyleSheetCandidate::isEnabledViaScript() const 72{ 73 return isHTMLLink() && toHTMLLinkElement(node()).isEnabledViaScript(); 74} 75 76bool StyleSheetCandidate::isEnabledAndLoading() const 77{ 78 return isHTMLLink() && !toHTMLLinkElement(node()).isDisabled() && toHTMLLinkElement(node()).styleSheetIsLoading(); 79} 80 81bool StyleSheetCandidate::hasPreferrableName(const String& currentPreferrableName) const 82{ 83 ASSERT(isEnabledAndLoading() || sheet()); 84 return !isEnabledViaScript() && !title().isEmpty() && !isAlternate() && currentPreferrableName.isEmpty(); 85} 86 87bool 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 101StyleSheetCandidate::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 123StyleSheet* 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