1e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch/* 2e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * Copyright (C) 2013 Google, Inc. 3e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 4e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. 5e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * 6e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * This library is free software; you can redistribute it and/or 7e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * modify it under the terms of the GNU Library General Public 8e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * License as published by the Free Software Foundation; either 9e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * version 2 of the License, or (at your option) any later version. 10e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * 11e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * This library is distributed in the hope that it will be useful, 12e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * but WITHOUT ANY WARRANTY; without even the implied warranty of 13e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * Library General Public License for more details. 15e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * 16e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * You should have received a copy of the GNU Library General Public License 17e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * along with this library; see the file COPYING.LIB. If not, write to 18e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 19e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * Boston, MA 02110-1301, USA. 20e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch */ 21e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 22e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#ifndef SharedStyleFinder_h 23e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#define SharedStyleFinder_h 24e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 25bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "core/css/resolver/ElementResolveContext.h" 26bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "core/dom/Element.h" 27bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 28c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 29e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 30e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochclass Element; 31e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochclass RenderStyle; 32e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochclass RuleFeatureSet; 33e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochclass RuleSet; 34e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochclass SpaceSplitString; 35e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochclass StyleResolver; 36e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 37e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochclass SharedStyleFinder { 38aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch STACK_ALLOCATED(); 39e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochpublic: 40e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch // RuleSets are passed non-const as the act of matching against them can cause them 41e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch // to be compacted. :( 42bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) SharedStyleFinder(const ElementResolveContext& context, 43bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) const RuleFeatureSet& features, RuleSet* siblingRuleSet, 44bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) RuleSet* uncommonAttributeRuleSet, StyleResolver& styleResolver) 45e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch : m_elementAffectedByClassRules(false) 46e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch , m_features(features) 47e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch , m_siblingRuleSet(siblingRuleSet) 48e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch , m_uncommonAttributeRuleSet(uncommonAttributeRuleSet) 49e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch , m_styleResolver(styleResolver) 50bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) , m_context(context) 51e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch { } 52e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 53bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) RenderStyle* findSharedStyle(); 54e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 55e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochprivate: 56bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) Element* findElementForStyleSharing() const; 57e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 58bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) // Only used when we're collecting stats on styles. 59bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) bool documentContainsValidCandidate() const; 607757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 61e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch bool classNamesAffectedByRules(const SpaceSplitString&) const; 62e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 63bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) bool canShareStyleWithElement(Element& candidate) const; 64bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) bool canShareStyleWithControl(Element& candidate) const; 65bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) bool sharingCandidateHasIdenticalStyleAffectingAttributes(Element& candidate) const; 666f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch bool sharingCandidateCanShareHostStyles(Element& candidate) const; 6709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) bool sharingCandidateDistributedToSameInsertionPoint(Element& candidate) const; 68bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) bool matchesRuleSet(RuleSet*); 69bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 70bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) Element& element() const { return *m_context.element(); } 71bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) Document& document() const { return element().document(); } 72e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 73e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch bool m_elementAffectedByClassRules; 74e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch const RuleFeatureSet& m_features; 75aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch RawPtrWillBeMember<RuleSet> m_siblingRuleSet; 76aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch RawPtrWillBeMember<RuleSet> m_uncommonAttributeRuleSet; 77bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) StyleResolver& m_styleResolver; 78bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) const ElementResolveContext& m_context; 79e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}; 80e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 81c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 82e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 83e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#endif // SharedStyleFinder_h 84