Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(35)

Side by Side Diff: Source/core/dom/ContainerNode.cpp

Issue 259213002: Ensure style resolver is created to avoid crash. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « LayoutTests/fast/dynamic/focus-clear-resolver-crash-expected.html ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2001 Dirk Mueller (mueller@kde.org) 4 * (C) 2001 Dirk Mueller (mueller@kde.org)
5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserv ed. 5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserv ed.
6 * 6 *
7 * This library is free software; you can redistribute it and/or 7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public 8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either 9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version. 10 * version 2 of the License, or (at your option) any later version.
(...skipping 801 matching lines...) Expand 10 before | Expand all | Expand 10 after
812 void ContainerNode::focusStateChanged() 812 void ContainerNode::focusStateChanged()
813 { 813 {
814 // If we're just changing the window's active state and the focused node has no 814 // If we're just changing the window's active state and the focused node has no
815 // renderer we can just ignore the state change. 815 // renderer we can just ignore the state change.
816 if (!renderer()) 816 if (!renderer())
817 return; 817 return;
818 818
819 if (renderStyle()->affectedByFocus() && renderStyle()->hasPseudoStyle(FIRST_ LETTER)) 819 if (renderStyle()->affectedByFocus() && renderStyle()->hasPseudoStyle(FIRST_ LETTER))
820 setNeedsStyleRecalc(SubtreeStyleChange); 820 setNeedsStyleRecalc(SubtreeStyleChange);
821 else if (isElementNode() && toElement(this)->childrenAffectedByFocus()) 821 else if (isElementNode() && toElement(this)->childrenAffectedByFocus())
822 document().styleResolver()->ensureUpdatedRuleFeatureSet().scheduleStyleI nvalidationForPseudoChange(CSSSelector::PseudoFocus, *toElement(this)); 822 document().ensureStyleResolver().ensureUpdatedRuleFeatureSet().scheduleS tyleInvalidationForPseudoChange(CSSSelector::PseudoFocus, *toElement(this));
823 else if (renderStyle()->affectedByFocus()) 823 else if (renderStyle()->affectedByFocus())
824 setNeedsStyleRecalc(LocalStyleChange); 824 setNeedsStyleRecalc(LocalStyleChange);
825 825
826 if (renderer() && renderer()->style()->hasAppearance()) 826 if (renderer() && renderer()->style()->hasAppearance())
827 RenderTheme::theme().stateChanged(renderer(), FocusState); 827 RenderTheme::theme().stateChanged(renderer(), FocusState);
828 } 828 }
829 829
830 void ContainerNode::setFocus(bool received) 830 void ContainerNode::setFocus(bool received)
831 { 831 {
832 if (focused() == received) 832 if (focused() == received)
833 return; 833 return;
834 834
835 Node::setFocus(received); 835 Node::setFocus(received);
836 836
837 focusStateChanged(); 837 focusStateChanged();
838 838
839 if (renderer() || received) 839 if (renderer() || received)
840 return; 840 return;
841 841
842 // If :focus sets display: none, we lose focus but still need to recalc our style. 842 // If :focus sets display: none, we lose focus but still need to recalc our style.
843 if (isElementNode() && toElement(this)->childrenAffectedByFocus()) 843 if (isElementNode() && toElement(this)->childrenAffectedByFocus())
844 document().styleResolver()->ensureUpdatedRuleFeatureSet().scheduleStyleI nvalidationForPseudoChange(CSSSelector::PseudoFocus, *toElement(this)); 844 document().ensureStyleResolver().ensureUpdatedRuleFeatureSet().scheduleS tyleInvalidationForPseudoChange(CSSSelector::PseudoFocus, *toElement(this));
845 else 845 else
846 setNeedsStyleRecalc(LocalStyleChange); 846 setNeedsStyleRecalc(LocalStyleChange);
847 } 847 }
848 848
849 void ContainerNode::setActive(bool down) 849 void ContainerNode::setActive(bool down)
850 { 850 {
851 if (down == active()) 851 if (down == active())
852 return; 852 return;
853 853
854 Node::setActive(down); 854 Node::setActive(down);
855 855
856 // FIXME: Why does this not need to handle the display: none transition like :hover does? 856 // FIXME: Why does this not need to handle the display: none transition like :hover does?
857 if (renderer()) { 857 if (renderer()) {
858 if (renderStyle()->affectedByActive() && renderStyle()->hasPseudoStyle(F IRST_LETTER)) 858 if (renderStyle()->affectedByActive() && renderStyle()->hasPseudoStyle(F IRST_LETTER))
859 setNeedsStyleRecalc(SubtreeStyleChange); 859 setNeedsStyleRecalc(SubtreeStyleChange);
860 else if (isElementNode() && toElement(this)->childrenAffectedByActive()) 860 else if (isElementNode() && toElement(this)->childrenAffectedByActive())
861 document().styleResolver()->ensureUpdatedRuleFeatureSet().scheduleSt yleInvalidationForPseudoChange(CSSSelector::PseudoActive, *toElement(this)); 861 document().ensureStyleResolver().ensureUpdatedRuleFeatureSet().sched uleStyleInvalidationForPseudoChange(CSSSelector::PseudoActive, *toElement(this)) ;
862 else if (renderStyle()->affectedByActive()) 862 else if (renderStyle()->affectedByActive())
863 setNeedsStyleRecalc(LocalStyleChange); 863 setNeedsStyleRecalc(LocalStyleChange);
864 864
865 if (renderStyle()->hasAppearance()) 865 if (renderStyle()->hasAppearance())
866 RenderTheme::theme().stateChanged(renderer(), PressedState); 866 RenderTheme::theme().stateChanged(renderer(), PressedState);
867 } 867 }
868 } 868 }
869 869
870 void ContainerNode::setHovered(bool over) 870 void ContainerNode::setHovered(bool over)
871 { 871 {
872 if (over == hovered()) 872 if (over == hovered())
873 return; 873 return;
874 874
875 Node::setHovered(over); 875 Node::setHovered(over);
876 876
877 // If :hover sets display: none we lose our hover but still need to recalc o ur style. 877 // If :hover sets display: none we lose our hover but still need to recalc o ur style.
878 if (!renderer()) { 878 if (!renderer()) {
879 if (over) 879 if (over)
880 return; 880 return;
881 if (isElementNode() && toElement(this)->childrenAffectedByHover()) 881 if (isElementNode() && toElement(this)->childrenAffectedByHover())
882 document().styleResolver()->ensureUpdatedRuleFeatureSet().scheduleSt yleInvalidationForPseudoChange(CSSSelector::PseudoHover, *toElement(this)); 882 document().ensureStyleResolver().ensureUpdatedRuleFeatureSet().sched uleStyleInvalidationForPseudoChange(CSSSelector::PseudoHover, *toElement(this));
883 else 883 else
884 setNeedsStyleRecalc(LocalStyleChange); 884 setNeedsStyleRecalc(LocalStyleChange);
885 return; 885 return;
886 } 886 }
887 887
888 if (renderStyle()->affectedByHover() && renderStyle()->hasPseudoStyle(FIRST_ LETTER)) 888 if (renderStyle()->affectedByHover() && renderStyle()->hasPseudoStyle(FIRST_ LETTER))
889 setNeedsStyleRecalc(SubtreeStyleChange); 889 setNeedsStyleRecalc(SubtreeStyleChange);
890 else if (isElementNode() && toElement(this)->childrenAffectedByHover()) 890 else if (isElementNode() && toElement(this)->childrenAffectedByHover())
891 document().styleResolver()->ensureUpdatedRuleFeatureSet().scheduleStyleI nvalidationForPseudoChange(CSSSelector::PseudoHover, *toElement(this)); 891 document().ensureStyleResolver().ensureUpdatedRuleFeatureSet().scheduleS tyleInvalidationForPseudoChange(CSSSelector::PseudoHover, *toElement(this));
892 else if (renderStyle()->affectedByHover()) 892 else if (renderStyle()->affectedByHover())
893 setNeedsStyleRecalc(LocalStyleChange); 893 setNeedsStyleRecalc(LocalStyleChange);
894 894
895 if (renderer()->style()->hasAppearance()) 895 if (renderer()->style()->hasAppearance())
896 RenderTheme::theme().stateChanged(renderer(), HoverState); 896 RenderTheme::theme().stateChanged(renderer(), HoverState);
897 } 897 }
898 898
899 PassRefPtr<HTMLCollection> ContainerNode::children() 899 PassRefPtr<HTMLCollection> ContainerNode::children()
900 { 900 {
901 return ensureRareData().ensureNodeLists().addCache<HTMLCollection>(*this, No deChildren); 901 return ensureRareData().ensureNodeLists().addCache<HTMLCollection>(*this, No deChildren);
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after
1197 return true; 1197 return true;
1198 1198
1199 if (node->isElementNode() && toElement(node)->shadow()) 1199 if (node->isElementNode() && toElement(node)->shadow())
1200 return true; 1200 return true;
1201 1201
1202 return false; 1202 return false;
1203 } 1203 }
1204 #endif 1204 #endif
1205 1205
1206 } // namespace WebCore 1206 } // namespace WebCore
OLDNEW
« no previous file with comments | « LayoutTests/fast/dynamic/focus-clear-resolver-crash-expected.html ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698