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