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 1026 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1037 SetNeedsStyleRecalc(change_type, | 1037 SetNeedsStyleRecalc(change_type, |
1038 StyleChangeReasonForTracing::CreateWithExtraData( | 1038 StyleChangeReasonForTracing::CreateWithExtraData( |
1039 StyleChangeReason::kPseudoClass, | 1039 StyleChangeReason::kPseudoClass, |
1040 StyleChangeExtraData::g_focus_within)); | 1040 StyleChangeExtraData::g_focus_within)); |
1041 } | 1041 } |
1042 if (IsElementNode() && | 1042 if (IsElementNode() && |
1043 ToElement(this)->ChildrenOrSiblingsAffectedByFocusWithin()) | 1043 ToElement(this)->ChildrenOrSiblingsAffectedByFocusWithin()) |
1044 ToElement(this)->PseudoStateChanged(CSSSelector::kPseudoFocusWithin); | 1044 ToElement(this)->PseudoStateChanged(CSSSelector::kPseudoFocusWithin); |
1045 } | 1045 } |
1046 | 1046 |
1047 void ContainerNode::SetFocused(bool received, WebFocusType focus_type) { | 1047 void ContainerNode::SetFocused(bool received, |
1048 WebFocusType focus_type, | |
1049 Node* common_ancestor) { | |
1048 // Recurse up author shadow trees to mark shadow hosts if it matches :focus. | 1050 // Recurse up author shadow trees to mark shadow hosts if it matches :focus. |
1049 // TODO(kochi): Handle UA shadows which marks multiple nodes as focused such | 1051 // TODO(kochi): Handle UA shadows which marks multiple nodes as focused such |
1050 // as <input type="date"> the same way as author shadow. | 1052 // as <input type="date"> the same way as author shadow. |
1051 if (ShadowRoot* root = ContainingShadowRoot()) { | 1053 if (ShadowRoot* root = ContainingShadowRoot()) { |
1052 if (root->GetType() != ShadowRootType::kUserAgent) | 1054 if (root->GetType() != ShadowRootType::kUserAgent) |
1053 OwnerShadowHost()->SetFocused(received, focus_type); | 1055 OwnerShadowHost()->SetFocused(received, focus_type); |
rune
2017/04/20 09:22:17
Having a default argument for common_ancestor look
Manuel Rego
2017/04/20 15:20:37
Yeah, this is an oversight in this version of the
| |
1054 } | 1056 } |
1055 | 1057 |
1056 // If this is an author shadow host and indirectly focused (has focused | 1058 // If this is an author shadow host and indirectly focused (has focused |
1057 // element within its shadow root), update focus. | 1059 // element within its shadow root), update focus. |
1058 if (IsElementNode() && GetDocument().FocusedElement() && | 1060 if (IsElementNode() && GetDocument().FocusedElement() && |
1059 GetDocument().FocusedElement() != this) { | 1061 GetDocument().FocusedElement() != this) { |
1060 if (ToElement(this)->AuthorShadowRoot()) | 1062 if (ToElement(this)->AuthorShadowRoot()) |
1061 received = | 1063 received = |
1062 received && ToElement(this)->AuthorShadowRoot()->delegatesFocus(); | 1064 received && ToElement(this)->AuthorShadowRoot()->delegatesFocus(); |
1063 } | 1065 } |
1064 | 1066 |
1065 if (IsFocused() == received) | 1067 if (IsFocused() == received) |
1066 return; | 1068 return; |
1067 | 1069 |
1068 Node::SetFocused(received, focus_type); | 1070 Node::SetFocused(received, focus_type); |
1069 | 1071 |
1070 FocusStateChanged(); | 1072 FocusStateChanged(); |
1071 | 1073 |
1072 UpdateDistribution(); | 1074 UpdateDistribution(); |
1073 for (ContainerNode* node = this; node; | 1075 for (ContainerNode* node = this; node && node != common_ancestor; |
1074 node = FlatTreeTraversal::Parent(*node)) { | 1076 node = FlatTreeTraversal::Parent(*node)) { |
1075 node->SetHasFocusWithin(received); | 1077 node->SetHasFocusWithin(received); |
1076 node->FocusWithinStateChanged(); | 1078 node->FocusWithinStateChanged(); |
1077 } | 1079 } |
1078 | 1080 |
1079 if (GetLayoutObject() || received) | 1081 if (GetLayoutObject() || received) |
1080 return; | 1082 return; |
1081 | 1083 |
1082 // If :focus sets display: none, we lose focus but still need to recalc our | 1084 // If :focus sets display: none, we lose focus but still need to recalc our |
1083 // style. | 1085 // style. |
(...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1519 return true; | 1521 return true; |
1520 | 1522 |
1521 if (node->IsElementNode() && ToElement(node)->Shadow()) | 1523 if (node->IsElementNode() && ToElement(node)->Shadow()) |
1522 return true; | 1524 return true; |
1523 | 1525 |
1524 return false; | 1526 return false; |
1525 } | 1527 } |
1526 #endif | 1528 #endif |
1527 | 1529 |
1528 } // namespace blink | 1530 } // namespace blink |
OLD | NEW |