blob: 5af9a95711fd8e6a1b1fab975ea33e5d5ac2e63a [file] [log] [blame]
Ben Murdoche69819b2013-07-17 14:56:49 +01001/*
2 * Copyright (C) 2013 Google, Inc.
3 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Library General Public License for more details.
15 *
16 * You should have received a copy of the GNU Library General Public License
17 * along with this library; see the file COPYING.LIB. If not, write to
18 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 * Boston, MA 02110-1301, USA.
20 */
21
22#ifndef SharedStyleFinder_h
23#define SharedStyleFinder_h
24
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +010025#include "core/css/resolver/ElementResolveContext.h"
26#include "core/dom/Element.h"
27
Ben Murdoche69819b2013-07-17 14:56:49 +010028namespace WebCore {
29
30class Element;
Ben Murdoche69819b2013-07-17 14:56:49 +010031class Node;
32class RenderStyle;
33class RuleFeatureSet;
34class RuleSet;
35class SpaceSplitString;
36class StyleResolver;
37
38class SharedStyleFinder {
Ben Murdochaafa69c2014-04-03 12:30:15 +010039 STACK_ALLOCATED();
Ben Murdoche69819b2013-07-17 14:56:49 +010040public:
Ben Murdoche69819b2013-07-17 14:56:49 +010041 // RuleSets are passed non-const as the act of matching against them can cause them
42 // to be compacted. :(
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +010043 SharedStyleFinder(const ElementResolveContext& context,
44 const RuleFeatureSet& features, RuleSet* siblingRuleSet,
45 RuleSet* uncommonAttributeRuleSet, StyleResolver& styleResolver)
Ben Murdoche69819b2013-07-17 14:56:49 +010046 : m_elementAffectedByClassRules(false)
47 , m_features(features)
48 , m_siblingRuleSet(siblingRuleSet)
49 , m_uncommonAttributeRuleSet(uncommonAttributeRuleSet)
50 , m_styleResolver(styleResolver)
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +010051 , m_context(context)
Ben Murdoche69819b2013-07-17 14:56:49 +010052 { }
53
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +010054 RenderStyle* findSharedStyle();
Ben Murdoche69819b2013-07-17 14:56:49 +010055
56private:
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +010057 Element* findElementForStyleSharing() const;
Ben Murdoche69819b2013-07-17 14:56:49 +010058
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +010059 // Only used when we're collecting stats on styles.
60 bool documentContainsValidCandidate() const;
Ben Murdoch7757ec22013-07-23 11:17:36 +010061
Ben Murdoche69819b2013-07-17 14:56:49 +010062 bool classNamesAffectedByRules(const SpaceSplitString&) const;
63
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +010064 bool canShareStyleWithElement(Element& candidate) const;
65 bool canShareStyleWithControl(Element& candidate) const;
66 bool sharingCandidateHasIdenticalStyleAffectingAttributes(Element& candidate) const;
Ben Murdoch6f543c72014-04-16 11:17:22 +010067 bool sharingCandidateCanShareHostStyles(Element& candidate) const;
Torne (Richard Coles)09380292014-02-21 12:17:33 +000068 bool sharingCandidateDistributedToSameInsertionPoint(Element& candidate) const;
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +010069 bool matchesRuleSet(RuleSet*);
70
71 Element& element() const { return *m_context.element(); }
72 Document& document() const { return element().document(); }
Ben Murdoche69819b2013-07-17 14:56:49 +010073
74 bool m_elementAffectedByClassRules;
75 const RuleFeatureSet& m_features;
Ben Murdochaafa69c2014-04-03 12:30:15 +010076 RawPtrWillBeMember<RuleSet> m_siblingRuleSet;
77 RawPtrWillBeMember<RuleSet> m_uncommonAttributeRuleSet;
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +010078 StyleResolver& m_styleResolver;
79 const ElementResolveContext& m_context;
Ben Murdoche69819b2013-07-17 14:56:49 +010080};
81
82} // namespace WebCore
83
84#endif // SharedStyleFinder_h