bool DragController::performDrag(DragData* dragData) { ASSERT(dragData); m_documentUnderMouse = m_page->mainFrame()->documentAtPoint(dragData->clientPosition()); if (m_dragDestinationAction & DragDestinationActionDHTML) { m_client->willPerformDragDestinationAction(DragDestinationActionDHTML, dragData); RefPtr<Frame> mainFrame = m_page->mainFrame(); bool preventedDefault = false; if (mainFrame->view()) { // Sending an event can result in the destruction of the view and part. RefPtr<Clipboard> clipboard = Clipboard::create(ClipboardReadable, dragData, mainFrame.get()); clipboard->setSourceOperation(dragData->draggingSourceOperationMask()); preventedDefault = mainFrame->eventHandler()->performDragAndDrop(createMouseEvent(dragData), clipboard.get()); clipboard->setAccessPolicy(ClipboardNumb); // Invalidate clipboard here for security } if (preventedDefault) { m_documentUnderMouse = 0; return true; } } if ((m_dragDestinationAction & DragDestinationActionEdit) && concludeEditDrag(dragData)) { m_documentUnderMouse = 0; return true; } m_documentUnderMouse = 0; if (operationForLoad(dragData) == DragOperationNone) return false; m_client->willPerformDragDestinationAction(DragDestinationActionLoad, dragData); m_page->mainFrame()->loader()->load(ResourceRequest(dragData->asURL(m_page->mainFrame())), false); return true; }
DragOperation DragController::dragEnteredOrUpdated(DragData* dragData) { ASSERT(dragData); IntPoint windowPoint = dragData->clientPosition(); Document* newDraggingDoc = 0; if (Frame* frame = m_page->mainFrame()) newDraggingDoc = frame->documentAtPoint(windowPoint); if (m_document != newDraggingDoc) { if (m_document) cancelDrag(); m_document = newDraggingDoc; } m_dragDestinationAction = m_client->actionMaskForDrag(dragData); DragOperation operation = DragOperationNone; if (m_dragDestinationAction == DragDestinationActionNone) cancelDrag(); else { operation = tryDocumentDrag(dragData, m_dragDestinationAction); if (operation == DragOperationNone && (m_dragDestinationAction & DragDestinationActionLoad)) return operationForLoad(dragData); } return operation; }
DragSession DragController::dragEnteredOrUpdated(DragData* dragData) { ASSERT(dragData); ASSERT(m_page->mainFrame()); // It is not possible in Mac WebKit to have a Page without a mainFrame() mouseMovedIntoDocument(m_page->mainFrame()->documentAtPoint(dragData->clientPosition())); m_dragDestinationAction = m_client->actionMaskForDrag(dragData); if (m_dragDestinationAction == DragDestinationActionNone) { cancelDrag(); // FIXME: Why not call mouseMovedIntoDocument(0)? return DragSession(); } DragSession dragSession; bool handledByDocument = tryDocumentDrag(dragData, m_dragDestinationAction, dragSession); if (!handledByDocument && (m_dragDestinationAction & DragDestinationActionLoad)) dragSession.operation = operationForLoad(dragData); return dragSession; }