| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * Copyright (C) 2007, 2009, 2010 Apple Inc. All rights reserved. | 2  * Copyright (C) 2007, 2009, 2010 Apple Inc. All rights reserved. | 
| 3  * Copyright (C) 2008 Google Inc. | 3  * Copyright (C) 2008 Google Inc. | 
| 4  * | 4  * | 
| 5  * Redistribution and use in source and binary forms, with or without | 5  * Redistribution and use in source and binary forms, with or without | 
| 6  * modification, are permitted provided that the following conditions | 6  * modification, are permitted provided that the following conditions | 
| 7  * are met: | 7  * are met: | 
| 8  * 1. Redistributions of source code must retain the above copyright | 8  * 1. Redistributions of source code must retain the above copyright | 
| 9  *    notice, this list of conditions and the following disclaimer. | 9  *    notice, this list of conditions and the following disclaimer. | 
| 10  * 2. Redistributions in binary form must reproduce the above copyright | 10  * 2. Redistributions in binary form must reproduce the above copyright | 
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 122 } | 122 } | 
| 123 | 123 | 
| 124 static PassRefPtr<Clipboard> createDraggingClipboard(ClipboardAccessPolicy polic
     y, DragData* dragData) | 124 static PassRefPtr<Clipboard> createDraggingClipboard(ClipboardAccessPolicy polic
     y, DragData* dragData) | 
| 125 { | 125 { | 
| 126     return Clipboard::create(Clipboard::DragAndDrop, policy, dragData->platformD
     ata()); | 126     return Clipboard::create(Clipboard::DragAndDrop, policy, dragData->platformD
     ata()); | 
| 127 } | 127 } | 
| 128 | 128 | 
| 129 DragController::DragController(Page* page, DragClient* client) | 129 DragController::DragController(Page* page, DragClient* client) | 
| 130     : m_page(page) | 130     : m_page(page) | 
| 131     , m_client(client) | 131     , m_client(client) | 
| 132     , m_documentUnderMouse(0) | 132     , m_documentUnderMouse(nullptr) | 
| 133     , m_dragInitiator(0) | 133     , m_dragInitiator(nullptr) | 
| 134     , m_fileInputElementUnderMouse(0) | 134     , m_fileInputElementUnderMouse(nullptr) | 
| 135     , m_documentIsHandlingDrag(false) | 135     , m_documentIsHandlingDrag(false) | 
| 136     , m_dragDestinationAction(DragDestinationActionNone) | 136     , m_dragDestinationAction(DragDestinationActionNone) | 
| 137     , m_didInitiateDrag(false) | 137     , m_didInitiateDrag(false) | 
| 138 { | 138 { | 
| 139     ASSERT(m_client); | 139     ASSERT(m_client); | 
| 140 } | 140 } | 
| 141 | 141 | 
| 142 DragController::~DragController() | 142 DragController::~DragController() | 
| 143 { | 143 { | 
| 144 } | 144 } | 
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 178                 fragment->appendChild(anchor); | 178                 fragment->appendChild(anchor); | 
| 179                 return fragment.release(); | 179                 return fragment.release(); | 
| 180             } | 180             } | 
| 181         } | 181         } | 
| 182     } | 182     } | 
| 183     if (allowPlainText && dragData->containsPlainText()) { | 183     if (allowPlainText && dragData->containsPlainText()) { | 
| 184         chosePlainText = true; | 184         chosePlainText = true; | 
| 185         return createFragmentFromText(context.get(), dragData->asPlainText()).ge
     t(); | 185         return createFragmentFromText(context.get(), dragData->asPlainText()).ge
     t(); | 
| 186     } | 186     } | 
| 187 | 187 | 
| 188     return 0; | 188     return nullptr; | 
| 189 } | 189 } | 
| 190 | 190 | 
| 191 bool DragController::dragIsMove(FrameSelection& selection, DragData* dragData) | 191 bool DragController::dragIsMove(FrameSelection& selection, DragData* dragData) | 
| 192 { | 192 { | 
| 193     return m_documentUnderMouse == m_dragInitiator && selection.isContentEditabl
     e() && selection.isRange() && !isCopyKeyDown(dragData); | 193     return m_documentUnderMouse == m_dragInitiator && selection.isContentEditabl
     e() && selection.isRange() && !isCopyKeyDown(dragData); | 
| 194 } | 194 } | 
| 195 | 195 | 
| 196 // FIXME: This method is poorly named.  We're just clearing the selection from t
     he document this drag is exiting. | 196 // FIXME: This method is poorly named.  We're just clearing the selection from t
     he document this drag is exiting. | 
| 197 void DragController::cancelDrag() | 197 void DragController::cancelDrag() | 
| 198 { | 198 { | 
| 199     m_page->dragCaretController().clear(); | 199     m_page->dragCaretController().clear(); | 
| 200 } | 200 } | 
| 201 | 201 | 
| 202 void DragController::dragEnded() | 202 void DragController::dragEnded() | 
| 203 { | 203 { | 
| 204     m_dragInitiator = 0; | 204     m_dragInitiator = nullptr; | 
| 205     m_didInitiateDrag = false; | 205     m_didInitiateDrag = false; | 
| 206     m_page->dragCaretController().clear(); | 206     m_page->dragCaretController().clear(); | 
| 207 } | 207 } | 
| 208 | 208 | 
| 209 DragSession DragController::dragEntered(DragData* dragData) | 209 DragSession DragController::dragEntered(DragData* dragData) | 
| 210 { | 210 { | 
| 211     return dragEnteredOrUpdated(dragData); | 211     return dragEnteredOrUpdated(dragData); | 
| 212 } | 212 } | 
| 213 | 213 | 
| 214 void DragController::dragExited(DragData* dragData) | 214 void DragController::dragExited(DragData* dragData) | 
| 215 { | 215 { | 
| 216     ASSERT(dragData); | 216     ASSERT(dragData); | 
| 217     Frame* mainFrame = m_page->mainFrame(); | 217     Frame* mainFrame = m_page->mainFrame(); | 
| 218 | 218 | 
| 219     if (RefPtr<FrameView> v = mainFrame->view()) { | 219     if (RefPtr<FrameView> v = mainFrame->view()) { | 
| 220         ClipboardAccessPolicy policy = (!m_documentUnderMouse || m_documentUnder
     Mouse->securityOrigin()->isLocal()) ? ClipboardReadable : ClipboardTypesReadable
     ; | 220         ClipboardAccessPolicy policy = (!m_documentUnderMouse || m_documentUnder
     Mouse->securityOrigin()->isLocal()) ? ClipboardReadable : ClipboardTypesReadable
     ; | 
| 221         RefPtr<Clipboard> clipboard = createDraggingClipboard(policy, dragData); | 221         RefPtr<Clipboard> clipboard = createDraggingClipboard(policy, dragData); | 
| 222         clipboard->setSourceOperation(dragData->draggingSourceOperationMask()); | 222         clipboard->setSourceOperation(dragData->draggingSourceOperationMask()); | 
| 223         mainFrame->eventHandler().cancelDragAndDrop(createMouseEvent(dragData), 
     clipboard.get()); | 223         mainFrame->eventHandler().cancelDragAndDrop(createMouseEvent(dragData), 
     clipboard.get()); | 
| 224         clipboard->setAccessPolicy(ClipboardNumb);    // invalidate clipboard he
     re for security | 224         clipboard->setAccessPolicy(ClipboardNumb);    // invalidate clipboard he
     re for security | 
| 225     } | 225     } | 
| 226     mouseMovedIntoDocument(0); | 226     mouseMovedIntoDocument(0); | 
| 227     if (m_fileInputElementUnderMouse) | 227     if (m_fileInputElementUnderMouse) | 
| 228         m_fileInputElementUnderMouse->setCanReceiveDroppedFiles(false); | 228         m_fileInputElementUnderMouse->setCanReceiveDroppedFiles(false); | 
| 229     m_fileInputElementUnderMouse = 0; | 229     m_fileInputElementUnderMouse = nullptr; | 
| 230 } | 230 } | 
| 231 | 231 | 
| 232 DragSession DragController::dragUpdated(DragData* dragData) | 232 DragSession DragController::dragUpdated(DragData* dragData) | 
| 233 { | 233 { | 
| 234     return dragEnteredOrUpdated(dragData); | 234     return dragEnteredOrUpdated(dragData); | 
| 235 } | 235 } | 
| 236 | 236 | 
| 237 bool DragController::performDrag(DragData* dragData) | 237 bool DragController::performDrag(DragData* dragData) | 
| 238 { | 238 { | 
| 239     ASSERT(dragData); | 239     ASSERT(dragData); | 
| 240     m_documentUnderMouse = m_page->mainFrame()->documentAtPoint(dragData->client
     Position()); | 240     m_documentUnderMouse = m_page->mainFrame()->documentAtPoint(dragData->client
     Position()); | 
| 241     if ((m_dragDestinationAction & DragDestinationActionDHTML) && m_documentIsHa
     ndlingDrag) { | 241     if ((m_dragDestinationAction & DragDestinationActionDHTML) && m_documentIsHa
     ndlingDrag) { | 
| 242         RefPtr<Frame> mainFrame = m_page->mainFrame(); | 242         RefPtr<Frame> mainFrame = m_page->mainFrame(); | 
| 243         bool preventedDefault = false; | 243         bool preventedDefault = false; | 
| 244         if (mainFrame->view()) { | 244         if (mainFrame->view()) { | 
| 245             // Sending an event can result in the destruction of the view and pa
     rt. | 245             // Sending an event can result in the destruction of the view and pa
     rt. | 
| 246             RefPtr<Clipboard> clipboard = createDraggingClipboard(ClipboardReada
     ble, dragData); | 246             RefPtr<Clipboard> clipboard = createDraggingClipboard(ClipboardReada
     ble, dragData); | 
| 247             clipboard->setSourceOperation(dragData->draggingSourceOperationMask(
     )); | 247             clipboard->setSourceOperation(dragData->draggingSourceOperationMask(
     )); | 
| 248             preventedDefault = mainFrame->eventHandler().performDragAndDrop(crea
     teMouseEvent(dragData), clipboard.get()); | 248             preventedDefault = mainFrame->eventHandler().performDragAndDrop(crea
     teMouseEvent(dragData), clipboard.get()); | 
| 249             clipboard->setAccessPolicy(ClipboardNumb); // Invalidate clipboard h
     ere for security | 249             clipboard->setAccessPolicy(ClipboardNumb); // Invalidate clipboard h
     ere for security | 
| 250         } | 250         } | 
| 251         if (preventedDefault) { | 251         if (preventedDefault) { | 
| 252             m_documentUnderMouse = 0; | 252             m_documentUnderMouse = nullptr; | 
| 253             return true; | 253             return true; | 
| 254         } | 254         } | 
| 255     } | 255     } | 
| 256 | 256 | 
| 257     if ((m_dragDestinationAction & DragDestinationActionEdit) && concludeEditDra
     g(dragData)) { | 257     if ((m_dragDestinationAction & DragDestinationActionEdit) && concludeEditDra
     g(dragData)) { | 
| 258         m_documentUnderMouse = 0; | 258         m_documentUnderMouse = nullptr; | 
| 259         return true; | 259         return true; | 
| 260     } | 260     } | 
| 261 | 261 | 
| 262     m_documentUnderMouse = 0; | 262     m_documentUnderMouse = nullptr; | 
| 263 | 263 | 
| 264     if (operationForLoad(dragData) == DragOperationNone) | 264     if (operationForLoad(dragData) == DragOperationNone) | 
| 265         return false; | 265         return false; | 
| 266 | 266 | 
| 267     if (m_page->settings().navigateOnDragDrop()) | 267     if (m_page->settings().navigateOnDragDrop()) | 
| 268         m_page->mainFrame()->loader().load(FrameLoadRequest(0, ResourceRequest(d
     ragData->asURL()))); | 268         m_page->mainFrame()->loader().load(FrameLoadRequest(0, ResourceRequest(d
     ragData->asURL()))); | 
| 269     return true; | 269     return true; | 
| 270 } | 270 } | 
| 271 | 271 | 
| 272 void DragController::mouseMovedIntoDocument(Document* newDocument) | 272 void DragController::mouseMovedIntoDocument(Document* newDocument) | 
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 403             dragSession.numberOfItemsToBeAccepted = numberOfFiles != 1 ? 0 : 1; | 403             dragSession.numberOfItemsToBeAccepted = numberOfFiles != 1 ? 0 : 1; | 
| 404         } | 404         } | 
| 405 | 405 | 
| 406         return true; | 406         return true; | 
| 407     } | 407     } | 
| 408 | 408 | 
| 409     // We are not over an editable region. Make sure we're clearing any prior dr
     ag cursor. | 409     // We are not over an editable region. Make sure we're clearing any prior dr
     ag cursor. | 
| 410     m_page->dragCaretController().clear(); | 410     m_page->dragCaretController().clear(); | 
| 411     if (m_fileInputElementUnderMouse) | 411     if (m_fileInputElementUnderMouse) | 
| 412         m_fileInputElementUnderMouse->setCanReceiveDroppedFiles(false); | 412         m_fileInputElementUnderMouse->setCanReceiveDroppedFiles(false); | 
| 413     m_fileInputElementUnderMouse = 0; | 413     m_fileInputElementUnderMouse = nullptr; | 
| 414     return false; | 414     return false; | 
| 415 } | 415 } | 
| 416 | 416 | 
| 417 DragOperation DragController::operationForLoad(DragData* dragData) | 417 DragOperation DragController::operationForLoad(DragData* dragData) | 
| 418 { | 418 { | 
| 419     ASSERT(dragData); | 419     ASSERT(dragData); | 
| 420     Document* doc = m_page->mainFrame()->documentAtPoint(dragData->clientPositio
     n()); | 420     Document* doc = m_page->mainFrame()->documentAtPoint(dragData->clientPositio
     n()); | 
| 421 | 421 | 
| 422     if (doc && (m_didInitiateDrag || doc->isPluginDocument() || doc->rendererIsE
     ditable())) | 422     if (doc && (m_didInitiateDrag || doc->isPluginDocument() || doc->rendererIsE
     ditable())) | 
| 423         return DragOperationNone; | 423         return DragOperationNone; | 
| (...skipping 19 matching lines...) Expand all  Loading... | 
| 443     return target->dispatchEvent(TextEvent::createForDrop(innerFrame->domWindow(
     ), text), IGNORE_EXCEPTION); | 443     return target->dispatchEvent(TextEvent::createForDrop(innerFrame->domWindow(
     ), text), IGNORE_EXCEPTION); | 
| 444 } | 444 } | 
| 445 | 445 | 
| 446 bool DragController::concludeEditDrag(DragData* dragData) | 446 bool DragController::concludeEditDrag(DragData* dragData) | 
| 447 { | 447 { | 
| 448     ASSERT(dragData); | 448     ASSERT(dragData); | 
| 449 | 449 | 
| 450     RefPtr<HTMLInputElement> fileInput = m_fileInputElementUnderMouse; | 450     RefPtr<HTMLInputElement> fileInput = m_fileInputElementUnderMouse; | 
| 451     if (m_fileInputElementUnderMouse) { | 451     if (m_fileInputElementUnderMouse) { | 
| 452         m_fileInputElementUnderMouse->setCanReceiveDroppedFiles(false); | 452         m_fileInputElementUnderMouse->setCanReceiveDroppedFiles(false); | 
| 453         m_fileInputElementUnderMouse = 0; | 453         m_fileInputElementUnderMouse = nullptr; | 
| 454     } | 454     } | 
| 455 | 455 | 
| 456     if (!m_documentUnderMouse) | 456     if (!m_documentUnderMouse) | 
| 457         return false; | 457         return false; | 
| 458 | 458 | 
| 459     IntPoint point = m_documentUnderMouse->view()->windowToContents(dragData->cl
     ientPosition()); | 459     IntPoint point = m_documentUnderMouse->view()->windowToContents(dragData->cl
     ientPosition()); | 
| 460     Element* element = elementUnderMouse(m_documentUnderMouse.get(), point); | 460     Element* element = elementUnderMouse(m_documentUnderMouse.get(), point); | 
| 461     if (!element) | 461     if (!element) | 
| 462         return false; | 462         return false; | 
| 463     RefPtr<Frame> innerFrame = element->ownerDocument()->frame(); | 463     RefPtr<Frame> innerFrame = element->ownerDocument()->frame(); | 
| (...skipping 494 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 958     return false; | 958     return false; | 
| 959 #endif | 959 #endif | 
| 960 } | 960 } | 
| 961 | 961 | 
| 962 void DragController::cleanupAfterSystemDrag() | 962 void DragController::cleanupAfterSystemDrag() | 
| 963 { | 963 { | 
| 964 } | 964 } | 
| 965 | 965 | 
| 966 } // namespace WebCore | 966 } // namespace WebCore | 
| 967 | 967 | 
| OLD | NEW | 
|---|