| Index: third_party/WebKit/Source/core/editing/FrameSelection.cpp | 
| diff --git a/third_party/WebKit/Source/core/editing/FrameSelection.cpp b/third_party/WebKit/Source/core/editing/FrameSelection.cpp | 
| index 0a2138367e08782e4c98e35d6f156429ce0656a2..f558ccd64342b5a67f8f8cf4cbda09aac5d88868 100644 | 
| --- a/third_party/WebKit/Source/core/editing/FrameSelection.cpp | 
| +++ b/third_party/WebKit/Source/core/editing/FrameSelection.cpp | 
| @@ -798,6 +798,13 @@ void FrameSelection::selectFrameElementInParentIfFullySelected() | 
| toLocalFrame(parent)->selection().setSelection(newSelection); | 
| } | 
|  | 
| +// Returns a shadow tree node for legacy shadow trees, a child of the | 
| +// ShadowRoot node for new shadow trees, or 0 for non-shadow trees. | 
| +static Node* nonBoundaryShadowTreeRootNode(const Position& position) | 
| +{ | 
| +    return position.anchorNode() && !position.anchorNode()->isShadowRoot() ? position.anchorNode()->nonBoundaryShadowTreeRootNode() : nullptr; | 
| +} | 
| + | 
| void FrameSelection::selectAll() | 
| { | 
| Document* document = m_frame->document(); | 
| @@ -814,12 +821,12 @@ void FrameSelection::selectAll() | 
| Node* selectStartTarget = nullptr; | 
| if (isContentEditable()) { | 
| root = highestEditableRoot(selection().start()); | 
| -        if (Node* shadowRoot = selection().nonBoundaryShadowTreeRootNode()) | 
| +        if (Node* shadowRoot = nonBoundaryShadowTreeRootNode(selection().start())) | 
| selectStartTarget = shadowRoot->shadowHost(); | 
| else | 
| selectStartTarget = root; | 
| } else { | 
| -        root = selection().nonBoundaryShadowTreeRootNode(); | 
| +        root = nonBoundaryShadowTreeRootNode(selection().start()); | 
| if (root) { | 
| selectStartTarget = root->shadowHost(); | 
| } else { | 
|  |