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

Unified Diff: Source/core/page/DragController.cpp

Issue 517043003: Move Frame to the Oilpan heap. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebase past r181245 conflict Created 6 years, 3 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 side-by-side diff with in-line comments
Download patch
Index: Source/core/page/DragController.cpp
diff --git a/Source/core/page/DragController.cpp b/Source/core/page/DragController.cpp
index 0603715e990d4d7606896b0a495ec5112beec97c..28468bb59c357c1362f389a6dc9356f09ecb2706 100644
--- a/Source/core/page/DragController.cpp
+++ b/Source/core/page/DragController.cpp
@@ -47,6 +47,7 @@
#include "core/events/TextEvent.h"
#include "core/fetch/ImageResource.h"
#include "core/fetch/ResourceFetcher.h"
+#include "core/frame/FrameProtector.h"
#include "core/frame/FrameView.h"
#include "core/frame/LocalFrame.h"
#include "core/html/HTMLAnchorElement.h"
@@ -215,7 +216,8 @@ void DragController::dragExited(DragData* dragData)
ASSERT(dragData);
LocalFrame* mainFrame = m_page->deprecatedLocalMainFrame();
- if (RefPtr<FrameView> v = mainFrame->view()) {
+ if (FrameView* v = mainFrame->view()) {
+ FrameViewProtector protect(v);
DataTransferAccessPolicy policy = (!m_documentUnderMouse || m_documentUnderMouse->securityOrigin()->isLocal()) ? DataTransferReadable : DataTransferTypesReadable;
RefPtrWillBeRawPtr<DataTransfer> dataTransfer = createDraggingDataTransfer(policy, dragData);
dataTransfer->setSourceOperation(dragData->draggingSourceOperationMask());
@@ -238,7 +240,8 @@ bool DragController::performDrag(DragData* dragData)
ASSERT(dragData);
m_documentUnderMouse = m_page->deprecatedLocalMainFrame()->documentAtPoint(dragData->clientPosition());
if ((m_dragDestinationAction & DragDestinationActionDHTML) && m_documentIsHandlingDrag) {
- RefPtr<LocalFrame> mainFrame = m_page->deprecatedLocalMainFrame();
+ LocalFrame* mainFrame = m_page->deprecatedLocalMainFrame();
+ FrameProtector protect(mainFrame);
bool preventedDefault = false;
if (mainFrame->view()) {
// Sending an event can result in the destruction of the view and part.
@@ -352,7 +355,8 @@ bool DragController::tryDocumentDrag(DragData* dragData, DragDestinationAction a
// It's unclear why this check is after tryDHTMLDrag.
// We send drag events in tryDHTMLDrag and that may be the reason.
- RefPtr<FrameView> frameView = m_documentUnderMouse->view();
+ FrameView* frameView = m_documentUnderMouse->view();
+ FrameViewProtector protect(frameView);
if (!frameView)
return false;
@@ -459,10 +463,11 @@ bool DragController::concludeEditDrag(DragData* dragData)
Element* element = elementUnderMouse(m_documentUnderMouse.get(), point);
if (!element)
return false;
- RefPtr<LocalFrame> innerFrame = element->ownerDocument()->frame();
+ LocalFrame* innerFrame = element->ownerDocument()->frame();
+ FrameProtector protect(innerFrame);
ASSERT(innerFrame);
- if (m_page->dragCaretController().hasCaret() && !dispatchTextInputEventFor(innerFrame.get(), dragData))
+ if (m_page->dragCaretController().hasCaret() && !dispatchTextInputEventFor(innerFrame, dragData))
return true;
if (dragData->containsFiles() && fileInput) {
@@ -493,7 +498,7 @@ bool DragController::concludeEditDrag(DragData* dragData)
ResourceCacheValidationSuppressor validationSuppressor(fetcher);
if (dragIsMove(innerFrame->selection(), dragData) || dragCaret.isContentRichlyEditable()) {
bool chosePlainText = false;
- RefPtrWillBeRawPtr<DocumentFragment> fragment = documentFragmentFromDragData(dragData, innerFrame.get(), range, true, chosePlainText);
+ RefPtrWillBeRawPtr<DocumentFragment> fragment = documentFragmentFromDragData(dragData, innerFrame, range, true, chosePlainText);
if (!fragment)
return false;
@@ -504,7 +509,7 @@ bool DragController::concludeEditDrag(DragData* dragData)
bool smartInsert = smartDelete && innerFrame->selection().granularity() == WordGranularity && dragData->canSmartReplace();
MoveSelectionCommand::create(fragment, dragCaret.base(), smartInsert, smartDelete)->apply();
} else {
- if (setSelectionToDragCaret(innerFrame.get(), dragCaret, range, point)) {
+ if (setSelectionToDragCaret(innerFrame, dragCaret, range, point)) {
ReplaceSelectionCommand::CommandOptions options = ReplaceSelectionCommand::SelectReplacement | ReplaceSelectionCommand::PreventNesting;
if (dragData->canSmartReplace())
options |= ReplaceSelectionCommand::SmartReplace;
@@ -519,7 +524,7 @@ bool DragController::concludeEditDrag(DragData* dragData)
if (text.isEmpty())
return false;
- if (setSelectionToDragCaret(innerFrame.get(), dragCaret, range, point)) {
+ if (setSelectionToDragCaret(innerFrame, dragCaret, range, point)) {
ASSERT(m_documentUnderMouse);
ReplaceSelectionCommand::create(*m_documentUnderMouse.get(), createFragmentFromText(range.get(), text), ReplaceSelectionCommand::SelectReplacement | ReplaceSelectionCommand::MatchStyle | ReplaceSelectionCommand::PreventNesting)->apply();
}
@@ -589,11 +594,12 @@ bool DragController::tryDHTMLDrag(DragData* dragData, DragOperation& operation)
{
ASSERT(dragData);
ASSERT(m_documentUnderMouse);
- RefPtr<LocalFrame> mainFrame = m_page->deprecatedLocalMainFrame();
- RefPtr<FrameView> viewProtector = mainFrame->view();
- if (!viewProtector)
+ LocalFrame* mainFrame = m_page->deprecatedLocalMainFrame();
+ FrameProtector protect(mainFrame);
+ if (!mainFrame->view())
return false;
+ FrameViewProtector viewProtector(mainFrame->view());
DataTransferAccessPolicy policy = m_documentUnderMouse->securityOrigin()->isLocal() ? DataTransferReadable : DataTransferTypesReadable;
RefPtrWillBeRawPtr<DataTransfer> dataTransfer = createDraggingDataTransfer(policy, dragData);
DragOperation srcOpMask = dragData->draggingSourceOperationMask();
@@ -927,12 +933,15 @@ void DragController::doSystemDrag(DragImage* image, const IntPoint& dragLocation
m_didInitiateDrag = true;
m_dragInitiator = frame->document();
// Protect this frame and view, as a load may occur mid drag and attempt to unload this frame
- RefPtr<LocalFrame> frameProtector = m_page->deprecatedLocalMainFrame();
- RefPtr<FrameView> viewProtector = frameProtector->view();
- m_client->startDrag(image, viewProtector->rootViewToContents(frame->view()->contentsToRootView(dragLocation)),
- viewProtector->rootViewToContents(frame->view()->contentsToRootView(eventPos)), dataTransfer, frameProtector.get(), forLink);
+ LocalFrame* mainFrame = m_page->deprecatedLocalMainFrame();
+ FrameProtector frameProtector(mainFrame);
+ FrameView* mainFrameView = mainFrame->view();
+ FrameViewProtector viewProtector(mainFrameView);
+
+ m_client->startDrag(image, mainFrameView->rootViewToContents(frame->view()->contentsToRootView(dragLocation)),
+ mainFrameView->rootViewToContents(frame->view()->contentsToRootView(eventPos)), dataTransfer, frame, forLink);
// DragClient::startDrag can cause our Page to dispear, deallocating |this|.
- if (!frameProtector->page())
+ if (!frame->page())
return;
cleanupAfterSystemDrag();

Powered by Google App Engine
This is Rietveld 408576698