/* * (C) 1999-2003 Lars Knoll (knoll@kde.org) * Copyright (C) 2004, 2006, 2007, 2008, 2009, 2010, 2012 Apple Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef StyleSheetContents_h #define StyleSheetContents_h #include "CSSParserMode.h" #include "CachePolicy.h" #include "URL.h" #include #include #include #include #include #include namespace WebCore { class CSSStyleSheet; class CachedCSSStyleSheet; class CachedResource; class Document; class Node; class SecurityOrigin; class StyleRuleBase; class StyleRuleImport; class StyleSheetContents : public RefCounted { public: static Ref create(const CSSParserContext& context = CSSParserContext(CSSStrictMode)) { return adoptRef(*new StyleSheetContents(0, String(), context)); } static Ref create(const String& originalURL, const CSSParserContext& context) { return adoptRef(*new StyleSheetContents(0, originalURL, context)); } static Ref create(StyleRuleImport* ownerRule, const String& originalURL, const CSSParserContext& context) { return adoptRef(*new StyleSheetContents(ownerRule, originalURL, context)); } WEBCORE_EXPORT ~StyleSheetContents(); const CSSParserContext& parserContext() const { return m_parserContext; } const AtomicString& determineNamespace(const AtomicString& prefix); void parseAuthorStyleSheet(const CachedCSSStyleSheet*, const SecurityOrigin*); WEBCORE_EXPORT bool parseString(const String&); bool parseStringAtPosition(const String&, const TextPosition&, bool createdByParser); bool isCacheable() const; bool isLoading() const; bool subresourcesAllowReuse(CachePolicy) const; WEBCORE_EXPORT bool isLoadingSubresources() const; void checkLoaded(); void startLoadingDynamicSheet(); StyleSheetContents* rootStyleSheet() const; Node* singleOwnerNode() const; Document* singleOwnerDocument() const; const String& charset() const { return m_parserContext.charset; } bool loadCompleted() const { return m_loadCompleted; } URL completeURL(const String& url) const; void addSubresourceStyleURLs(ListHashSet&); bool traverseSubresources(const std::function& handler) const; void setIsUserStyleSheet(bool b) { m_isUserStyleSheet = b; } bool isUserStyleSheet() const { return m_isUserStyleSheet; } void setHasSyntacticallyValidCSSHeader(bool b) { m_hasSyntacticallyValidCSSHeader = b; } bool hasSyntacticallyValidCSSHeader() const { return m_hasSyntacticallyValidCSSHeader; } void parserAddNamespace(const AtomicString& prefix, const AtomicString& uri); void parserAppendRule(PassRefPtr); void parserSetEncodingFromCharsetRule(const String& encoding); void parserSetUsesRemUnits() { m_usesRemUnits = true; } void parserSetUsesStyleBasedEditability() { m_usesStyleBasedEditability = true; } void clearRules(); bool hasCharsetRule() const { return !m_encodingFromCharsetRule.isNull(); } String encodingFromCharsetRule() const { return m_encodingFromCharsetRule; } // Rules other than @charset and @import. const Vector>& childRules() const { return m_childRules; } const Vector>& importRules() const { return m_importRules; } void notifyLoadedSheet(const CachedCSSStyleSheet*); StyleSheetContents* parentStyleSheet() const; StyleRuleImport* ownerRule() const { return m_ownerRule; } void clearOwnerRule() { m_ownerRule = 0; } // Note that href is the URL that started the redirect chain that led to // this style sheet. This property probably isn't useful for much except // the JavaScript binding (which needs to use this value for security). String originalURL() const { return m_originalURL; } const URL& baseURL() const { return m_parserContext.baseURL; } unsigned ruleCount() const; StyleRuleBase* ruleAt(unsigned index) const; bool usesRemUnits() const { return m_usesRemUnits; } bool usesStyleBasedEditability() const { return m_usesStyleBasedEditability; } unsigned estimatedSizeInBytes() const; bool wrapperInsertRule(PassRefPtr, unsigned index); void wrapperDeleteRule(unsigned index); Ref copy() const { return adoptRef(*new StyleSheetContents(*this)); } void registerClient(CSSStyleSheet*); void unregisterClient(CSSStyleSheet*); bool hasOneClient() { return m_clients.size() == 1; } bool isMutable() const { return m_isMutable; } void setMutable() { m_isMutable = true; } bool isInMemoryCache() const { return m_isInMemoryCache; } void addedToMemoryCache(); void removedFromMemoryCache(); void shrinkToFit(); private: WEBCORE_EXPORT StyleSheetContents(StyleRuleImport* ownerRule, const String& originalURL, const CSSParserContext&); StyleSheetContents(const StyleSheetContents&); void clearCharsetRule(); StyleRuleImport* m_ownerRule; String m_originalURL; String m_encodingFromCharsetRule; Vector> m_importRules; Vector> m_childRules; typedef HashMap PrefixNamespaceURIMap; PrefixNamespaceURIMap m_namespaces; bool m_loadCompleted : 1; bool m_isUserStyleSheet : 1; bool m_hasSyntacticallyValidCSSHeader : 1; bool m_didLoadErrorOccur : 1; bool m_usesRemUnits : 1; bool m_usesStyleBasedEditability : 1; bool m_isMutable : 1; bool m_isInMemoryCache : 1; CSSParserContext m_parserContext; Vector m_clients; }; } // namespace #endif