OLD | NEW |
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, 2013 Apple Inc. All rights | 5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2013 Apple Inc. All rights |
6 * reserved. | 6 * reserved. |
7 * | 7 * |
8 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
9 * modify it under the terms of the GNU Library General Public | 9 * modify it under the terms of the GNU Library General Public |
10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
(...skipping 1007 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1018 SetNeedsStyleRecalc( | 1018 SetNeedsStyleRecalc( |
1019 change_type, | 1019 change_type, |
1020 StyleChangeReasonForTracing::CreateWithExtraData( | 1020 StyleChangeReasonForTracing::CreateWithExtraData( |
1021 StyleChangeReason::kPseudoClass, StyleChangeExtraData::g_focus)); | 1021 StyleChangeReason::kPseudoClass, StyleChangeExtraData::g_focus)); |
1022 } | 1022 } |
1023 if (IsElementNode() && ToElement(this)->ChildrenOrSiblingsAffectedByFocus()) | 1023 if (IsElementNode() && ToElement(this)->ChildrenOrSiblingsAffectedByFocus()) |
1024 ToElement(this)->PseudoStateChanged(CSSSelector::kPseudoFocus); | 1024 ToElement(this)->PseudoStateChanged(CSSSelector::kPseudoFocus); |
1025 | 1025 |
1026 LayoutTheme::GetTheme().ControlStateChanged(*GetLayoutObject(), | 1026 LayoutTheme::GetTheme().ControlStateChanged(*GetLayoutObject(), |
1027 kFocusControlState); | 1027 kFocusControlState); |
| 1028 FocusWithinStateChanged(); |
| 1029 } |
| 1030 |
| 1031 void ContainerNode::FocusWithinStateChanged() { |
| 1032 if (GetComputedStyle() && GetComputedStyle()->AffectedByFocusWithin()) { |
| 1033 StyleChangeType change_type = |
| 1034 GetComputedStyle()->HasPseudoStyle(kPseudoIdFirstLetter) |
| 1035 ? kSubtreeStyleChange |
| 1036 : kLocalStyleChange; |
| 1037 SetNeedsStyleRecalc(change_type, |
| 1038 StyleChangeReasonForTracing::CreateWithExtraData( |
| 1039 StyleChangeReason::kPseudoClass, |
| 1040 StyleChangeExtraData::g_focus_within)); |
| 1041 } |
| 1042 if (IsElementNode() && |
| 1043 ToElement(this)->ChildrenOrSiblingsAffectedByFocusWithin()) |
| 1044 ToElement(this)->PseudoStateChanged(CSSSelector::kPseudoFocusWithin); |
1028 } | 1045 } |
1029 | 1046 |
1030 void ContainerNode::SetFocused(bool received) { | 1047 void ContainerNode::SetFocused(bool received) { |
1031 // Recurse up author shadow trees to mark shadow hosts if it matches :focus. | 1048 // Recurse up author shadow trees to mark shadow hosts if it matches :focus. |
1032 // TODO(kochi): Handle UA shadows which marks multiple nodes as focused such | 1049 // TODO(kochi): Handle UA shadows which marks multiple nodes as focused such |
1033 // as <input type="date"> the same way as author shadow. | 1050 // as <input type="date"> the same way as author shadow. |
1034 if (ShadowRoot* root = ContainingShadowRoot()) { | 1051 if (ShadowRoot* root = ContainingShadowRoot()) { |
1035 if (root->GetType() != ShadowRootType::kUserAgent) | 1052 if (root->GetType() != ShadowRootType::kUserAgent) |
1036 OwnerShadowHost()->SetFocused(received); | 1053 OwnerShadowHost()->SetFocused(received); |
1037 } | 1054 } |
1038 | 1055 |
1039 // If this is an author shadow host and indirectly focused (has focused | 1056 // If this is an author shadow host and indirectly focused (has focused |
1040 // element within its shadow root), update focus. | 1057 // element within its shadow root), update focus. |
1041 if (IsElementNode() && GetDocument().FocusedElement() && | 1058 if (IsElementNode() && GetDocument().FocusedElement() && |
1042 GetDocument().FocusedElement() != this) { | 1059 GetDocument().FocusedElement() != this) { |
1043 if (ToElement(this)->AuthorShadowRoot()) | 1060 if (ToElement(this)->AuthorShadowRoot()) |
1044 received = | 1061 received = |
1045 received && ToElement(this)->AuthorShadowRoot()->delegatesFocus(); | 1062 received && ToElement(this)->AuthorShadowRoot()->delegatesFocus(); |
1046 } | 1063 } |
1047 | 1064 |
1048 if (IsFocused() == received) | 1065 if (IsFocused() == received) |
1049 return; | 1066 return; |
1050 | 1067 |
1051 Node::SetFocused(received); | 1068 Node::SetFocused(received); |
1052 | 1069 |
1053 FocusStateChanged(); | 1070 FocusStateChanged(); |
1054 | 1071 |
| 1072 UpdateDistribution(); |
| 1073 for (ContainerNode* node = this; node; |
| 1074 node = FlatTreeTraversal::Parent(*node)) { |
| 1075 node->SetHasFocusWithin(received); |
| 1076 node->FocusWithinStateChanged(); |
| 1077 } |
| 1078 |
1055 if (GetLayoutObject() || received) | 1079 if (GetLayoutObject() || received) |
1056 return; | 1080 return; |
1057 | 1081 |
1058 // If :focus sets display: none, we lose focus but still need to recalc our | 1082 // If :focus sets display: none, we lose focus but still need to recalc our |
1059 // style. | 1083 // style. |
1060 if (IsElementNode() && ToElement(this)->ChildrenOrSiblingsAffectedByFocus()) | 1084 if (IsElementNode() && ToElement(this)->ChildrenOrSiblingsAffectedByFocus()) |
1061 ToElement(this)->PseudoStateChanged(CSSSelector::kPseudoFocus); | 1085 ToElement(this)->PseudoStateChanged(CSSSelector::kPseudoFocus); |
1062 else | 1086 else |
1063 SetNeedsStyleRecalc( | 1087 SetNeedsStyleRecalc( |
1064 kLocalStyleChange, | 1088 kLocalStyleChange, |
1065 StyleChangeReasonForTracing::CreateWithExtraData( | 1089 StyleChangeReasonForTracing::CreateWithExtraData( |
1066 StyleChangeReason::kPseudoClass, StyleChangeExtraData::g_focus)); | 1090 StyleChangeReason::kPseudoClass, StyleChangeExtraData::g_focus)); |
| 1091 |
| 1092 if (IsElementNode() && |
| 1093 ToElement(this)->ChildrenOrSiblingsAffectedByFocusWithin()) { |
| 1094 ToElement(this)->PseudoStateChanged(CSSSelector::kPseudoFocusWithin); |
| 1095 } else { |
| 1096 SetNeedsStyleRecalc(kLocalStyleChange, |
| 1097 StyleChangeReasonForTracing::CreateWithExtraData( |
| 1098 StyleChangeReason::kPseudoClass, |
| 1099 StyleChangeExtraData::g_focus_within)); |
| 1100 } |
1067 } | 1101 } |
1068 | 1102 |
1069 void ContainerNode::SetActive(bool down) { | 1103 void ContainerNode::SetActive(bool down) { |
1070 if (down == IsActive()) | 1104 if (down == IsActive()) |
1071 return; | 1105 return; |
1072 | 1106 |
1073 Node::SetActive(down); | 1107 Node::SetActive(down); |
1074 | 1108 |
1075 if (!GetLayoutObject()) { | 1109 if (!GetLayoutObject()) { |
1076 if (IsElementNode() && | 1110 if (IsElementNode() && |
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1485 return true; | 1519 return true; |
1486 | 1520 |
1487 if (node->IsElementNode() && ToElement(node)->Shadow()) | 1521 if (node->IsElementNode() && ToElement(node)->Shadow()) |
1488 return true; | 1522 return true; |
1489 | 1523 |
1490 return false; | 1524 return false; |
1491 } | 1525 } |
1492 #endif | 1526 #endif |
1493 | 1527 |
1494 } // namespace blink | 1528 } // namespace blink |
OLD | NEW |