| Index: Source/core/editing/FrameSelection.cpp
 | 
| diff --git a/Source/core/editing/FrameSelection.cpp b/Source/core/editing/FrameSelection.cpp
 | 
| index fe14377b9881103aafa44ea48e8220685f035f50..b17d02cffe1fd1c102dda897746bccb9de644ac7 100644
 | 
| --- a/Source/core/editing/FrameSelection.cpp
 | 
| +++ b/Source/core/editing/FrameSelection.cpp
 | 
| @@ -107,7 +107,11 @@ FrameSelection::FrameSelection(LocalFrame* frame)
 | 
|  
 | 
|  FrameSelection::~FrameSelection()
 | 
|  {
 | 
| +#if !ENABLE(OILPAN)
 | 
| +    // Oilpan: No need to clear out VisibleSelection observer;
 | 
| +    // it is finalized as a part object of FrameSelection.
 | 
|      stopObservingVisibleSelectionChangeIfNecessary();
 | 
| +#endif
 | 
|  }
 | 
|  
 | 
|  Element* FrameSelection::rootEditableElementOrDocumentElement() const
 | 
| @@ -934,11 +938,11 @@ static bool isBoundary(TextGranularity granularity)
 | 
|  bool FrameSelection::modify(EAlteration alter, SelectionDirection direction, TextGranularity granularity, EUserTriggered userTriggered)
 | 
|  {
 | 
|      if (userTriggered == UserTriggered) {
 | 
| -        FrameSelection trialFrameSelection;
 | 
| -        trialFrameSelection.setSelection(m_selection);
 | 
| -        trialFrameSelection.modify(alter, direction, granularity, NotUserTriggered);
 | 
| +        OwnPtrWillBeRawPtr<FrameSelection> trialFrameSelection = FrameSelection::create();
 | 
| +        trialFrameSelection->setSelection(m_selection);
 | 
| +        trialFrameSelection->modify(alter, direction, granularity, NotUserTriggered);
 | 
|  
 | 
| -        if (trialFrameSelection.selection().isRange() && m_selection.isCaret() && !dispatchSelectStart())
 | 
| +        if (trialFrameSelection->selection().isRange() && m_selection.isCaret() && !dispatchSelectStart())
 | 
|              return false;
 | 
|      }
 | 
|  
 | 
| @@ -1048,9 +1052,9 @@ bool FrameSelection::modify(EAlteration alter, unsigned verticalDistance, Vertic
 | 
|          return false;
 | 
|  
 | 
|      if (userTriggered == UserTriggered) {
 | 
| -        FrameSelection trialFrameSelection;
 | 
| -        trialFrameSelection.setSelection(m_selection);
 | 
| -        trialFrameSelection.modify(alter, verticalDistance, direction, NotUserTriggered);
 | 
| +        OwnPtrWillBeRawPtr<FrameSelection> trialFrameSelection = FrameSelection::create();
 | 
| +        trialFrameSelection->setSelection(m_selection);
 | 
| +        trialFrameSelection->modify(alter, verticalDistance, direction, NotUserTriggered);
 | 
|      }
 | 
|  
 | 
|      willBeModified(alter, direction == DirectionUp ? DirectionBackward : DirectionForward);
 | 
| @@ -1370,7 +1374,7 @@ void FrameSelection::selectAll()
 | 
|          }
 | 
|      }
 | 
|  
 | 
| -    RefPtr<Node> root = nullptr;
 | 
| +    RefPtrWillBeRawPtr<Node> root = nullptr;
 | 
|      Node* selectStartTarget = 0;
 | 
|      if (isContentEditable()) {
 | 
|          root = highestEditableRoot(m_selection.start());
 | 
| @@ -1448,7 +1452,7 @@ void FrameSelection::focusedOrActiveStateChanged()
 | 
|  {
 | 
|      bool activeAndFocused = isFocusedAndActive();
 | 
|  
 | 
| -    RefPtr<Document> document = m_frame->document();
 | 
| +    RefPtrWillBeRawPtr<Document> document = m_frame->document();
 | 
|      document->updateRenderTreeIfNeeded();
 | 
|  
 | 
|      // Because RenderObject::selectionBackgroundColor() and
 | 
| @@ -1863,6 +1867,16 @@ void FrameSelection::showTreeForThis() const
 | 
|  
 | 
|  #endif
 | 
|  
 | 
| +void FrameSelection::trace(Visitor* visitor)
 | 
| +{
 | 
| +    visitor->trace(m_selection);
 | 
| +    visitor->trace(m_originalBase);
 | 
| +    visitor->trace(m_logicalRange);
 | 
| +    visitor->trace(m_previousCaretNode);
 | 
| +    visitor->trace(m_typingStyle);
 | 
| +    VisibleSelection::ChangeObserver::trace(visitor);
 | 
| +}
 | 
| +
 | 
|  }
 | 
|  
 | 
|  #ifndef NDEBUG
 | 
| 
 |