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 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 #include "core/fetch/ResourceFetcher.h" | 48 #include "core/fetch/ResourceFetcher.h" |
49 #include "core/frame/FrameHost.h" | 49 #include "core/frame/FrameHost.h" |
50 #include "core/frame/FrameView.h" | 50 #include "core/frame/FrameView.h" |
51 #include "core/frame/LocalFrame.h" | 51 #include "core/frame/LocalFrame.h" |
52 #include "core/frame/Settings.h" | 52 #include "core/frame/Settings.h" |
53 #include "core/html/HTMLAnchorElement.h" | 53 #include "core/html/HTMLAnchorElement.h" |
54 #include "core/html/HTMLFormElement.h" | 54 #include "core/html/HTMLFormElement.h" |
55 #include "core/html/HTMLInputElement.h" | 55 #include "core/html/HTMLInputElement.h" |
56 #include "core/html/HTMLPlugInElement.h" | 56 #include "core/html/HTMLPlugInElement.h" |
57 #include "core/input/EventHandler.h" | 57 #include "core/input/EventHandler.h" |
| 58 #include "core/layout/HitTestRequest.h" |
| 59 #include "core/layout/HitTestResult.h" |
| 60 #include "core/layout/LayoutImage.h" |
58 #include "core/layout/LayoutTheme.h" | 61 #include "core/layout/LayoutTheme.h" |
59 #include "core/layout/LayoutView.h" | 62 #include "core/layout/LayoutView.h" |
60 #include "core/loader/FrameLoadRequest.h" | 63 #include "core/loader/FrameLoadRequest.h" |
61 #include "core/loader/FrameLoader.h" | 64 #include "core/loader/FrameLoader.h" |
62 #include "core/page/ChromeClient.h" | 65 #include "core/page/ChromeClient.h" |
63 #include "core/page/DragClient.h" | |
64 #include "core/page/DragData.h" | 66 #include "core/page/DragData.h" |
65 #include "core/page/DragSession.h" | 67 #include "core/page/DragSession.h" |
66 #include "core/page/DragState.h" | 68 #include "core/page/DragState.h" |
67 #include "core/page/Page.h" | 69 #include "core/page/Page.h" |
68 #include "core/layout/HitTestRequest.h" | |
69 #include "core/layout/HitTestResult.h" | |
70 #include "core/layout/LayoutImage.h" | |
71 #include "platform/DragImage.h" | 70 #include "platform/DragImage.h" |
72 #include "platform/geometry/IntRect.h" | 71 #include "platform/geometry/IntRect.h" |
| 72 #include "platform/geometry/IntSize.h" |
73 #include "platform/graphics/BitmapImage.h" | 73 #include "platform/graphics/BitmapImage.h" |
74 #include "platform/graphics/Image.h" | 74 #include "platform/graphics/Image.h" |
75 #include "platform/graphics/ImageOrientation.h" | 75 #include "platform/graphics/ImageOrientation.h" |
76 #include "platform/network/ResourceRequest.h" | 76 #include "platform/network/ResourceRequest.h" |
77 #include "platform/weborigin/SecurityOrigin.h" | 77 #include "platform/weborigin/SecurityOrigin.h" |
| 78 #include "public/platform/WebCommon.h" |
| 79 #include "public/platform/WebDragData.h" |
| 80 #include "public/platform/WebDragOperation.h" |
| 81 #include "public/platform/WebImage.h" |
| 82 #include "public/platform/WebPoint.h" |
78 #include "public/platform/WebScreenInfo.h" | 83 #include "public/platform/WebScreenInfo.h" |
| 84 #include "wtf/Assertions.h" |
79 #include "wtf/CurrentTime.h" | 85 #include "wtf/CurrentTime.h" |
80 #include "wtf/OwnPtr.h" | 86 #include "wtf/OwnPtr.h" |
81 #include "wtf/PassOwnPtr.h" | 87 #include "wtf/PassOwnPtr.h" |
82 #include "wtf/RefPtr.h" | 88 #include "wtf/RefPtr.h" |
83 | 89 |
84 #if OS(WIN) | 90 #if OS(WIN) |
85 #include <windows.h> | 91 #include <windows.h> |
86 #endif | 92 #endif |
87 | 93 |
88 namespace blink { | 94 namespace blink { |
(...skipping 28 matching lines...) Expand all Loading... |
117 LeftButton, PlatformEvent::MouseMoved, 0, | 123 LeftButton, PlatformEvent::MouseMoved, 0, |
118 static_cast<PlatformEvent::Modifiers>(dragData->modifiers()), | 124 static_cast<PlatformEvent::Modifiers>(dragData->modifiers()), |
119 PlatformMouseEvent::RealOrIndistinguishable, monotonicallyIncreasingTime
()); | 125 PlatformMouseEvent::RealOrIndistinguishable, monotonicallyIncreasingTime
()); |
120 } | 126 } |
121 | 127 |
122 static DataTransfer* createDraggingDataTransfer(DataTransferAccessPolicy policy,
DragData* dragData) | 128 static DataTransfer* createDraggingDataTransfer(DataTransferAccessPolicy policy,
DragData* dragData) |
123 { | 129 { |
124 return DataTransfer::create(DataTransfer::DragAndDrop, policy, dragData->pla
tformData()); | 130 return DataTransfer::create(DataTransfer::DragAndDrop, policy, dragData->pla
tformData()); |
125 } | 131 } |
126 | 132 |
127 DragController::DragController(Page* page, DragClient* client) | 133 DragController::DragController(Page* page) |
128 : m_page(page) | 134 : m_page(page) |
129 , m_client(client) | |
130 , m_documentUnderMouse(nullptr) | 135 , m_documentUnderMouse(nullptr) |
131 , m_dragInitiator(nullptr) | 136 , m_dragInitiator(nullptr) |
132 , m_fileInputElementUnderMouse(nullptr) | 137 , m_fileInputElementUnderMouse(nullptr) |
133 , m_documentIsHandlingDrag(false) | 138 , m_documentIsHandlingDrag(false) |
134 , m_dragDestinationAction(DragDestinationActionNone) | 139 , m_dragDestinationAction(DragDestinationActionNone) |
135 , m_didInitiateDrag(false) | 140 , m_didInitiateDrag(false) |
136 { | 141 { |
137 ASSERT(m_client); | |
138 } | 142 } |
139 | 143 |
140 DragController::~DragController() | 144 DragController::~DragController() |
141 { | 145 { |
142 } | 146 } |
143 | 147 |
144 DragController* DragController::create(Page* page, DragClient* client) | 148 DragController* DragController::create(Page* page) |
145 { | 149 { |
146 return new DragController(page, client); | 150 return new DragController(page); |
147 } | 151 } |
148 | 152 |
149 static DocumentFragment* documentFragmentFromDragData(DragData* dragData, LocalF
rame* frame, Range* context, bool allowPlainText, bool& chosePlainText) | 153 static DocumentFragment* documentFragmentFromDragData(DragData* dragData, LocalF
rame* frame, Range* context, bool allowPlainText, bool& chosePlainText) |
150 { | 154 { |
151 ASSERT(dragData); | 155 ASSERT(dragData); |
152 chosePlainText = false; | 156 chosePlainText = false; |
153 | 157 |
154 Document& document = context->ownerDocument(); | 158 Document& document = context->ownerDocument(); |
155 if (dragData->containsCompatibleContent()) { | 159 if (dragData->containsCompatibleContent()) { |
156 if (DocumentFragment* fragment = dragData->asFragment(frame)) | 160 if (DocumentFragment* fragment = dragData->asFragment(frame)) |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
286 cancelDrag(); | 290 cancelDrag(); |
287 m_documentUnderMouse = newDocument; | 291 m_documentUnderMouse = newDocument; |
288 } | 292 } |
289 | 293 |
290 DragSession DragController::dragEnteredOrUpdated(DragData* dragData) | 294 DragSession DragController::dragEnteredOrUpdated(DragData* dragData) |
291 { | 295 { |
292 ASSERT(dragData); | 296 ASSERT(dragData); |
293 ASSERT(m_page->mainFrame()); | 297 ASSERT(m_page->mainFrame()); |
294 mouseMovedIntoDocument(m_page->deprecatedLocalMainFrame()->documentAtPoint(d
ragData->clientPosition())); | 298 mouseMovedIntoDocument(m_page->deprecatedLocalMainFrame()->documentAtPoint(d
ragData->clientPosition())); |
295 | 299 |
296 m_dragDestinationAction = m_client->actionMaskForDrag(dragData); | 300 // TODO(esprehn): Replace acceptsLoadDrops with a Setting used in core. |
| 301 m_dragDestinationAction = m_page->chromeClient().acceptsLoadDrops() |
| 302 ? DragDestinationActionAny |
| 303 : static_cast<DragDestinationAction>(DragDestinationActionDHTML | DragDe
stinationActionEdit); |
297 if (m_dragDestinationAction == DragDestinationActionNone) { | 304 if (m_dragDestinationAction == DragDestinationActionNone) { |
298 cancelDrag(); // FIXME: Why not call mouseMovedIntoDocument(0)? | 305 cancelDrag(); // FIXME: Why not call mouseMovedIntoDocument(0)? |
299 return DragSession(); | 306 return DragSession(); |
300 } | 307 } |
301 | 308 |
302 DragSession dragSession; | 309 DragSession dragSession; |
303 m_documentIsHandlingDrag = tryDocumentDrag(dragData, m_dragDestinationAction
, dragSession); | 310 m_documentIsHandlingDrag = tryDocumentDrag(dragData, m_dragDestinationAction
, dragSession); |
304 if (!m_documentIsHandlingDrag && (m_dragDestinationAction & DragDestinationA
ctionLoad)) | 311 if (!m_documentIsHandlingDrag && (m_dragDestinationAction & DragDestinationA
ctionLoad)) |
305 dragSession.operation = operationForLoad(dragData); | 312 dragSession.operation = operationForLoad(dragData); |
306 return dragSession; | 313 return dragSession; |
(...skipping 619 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
926 } else if (state.m_dragType == DragSourceActionDHTML) { | 933 } else if (state.m_dragType == DragSourceActionDHTML) { |
927 doSystemDrag(dragImage.get(), dragLocation, dragOrigin, dataTransfer, sr
c, false); | 934 doSystemDrag(dragImage.get(), dragLocation, dragOrigin, dataTransfer, sr
c, false); |
928 } else { | 935 } else { |
929 ASSERT_NOT_REACHED(); | 936 ASSERT_NOT_REACHED(); |
930 return false; | 937 return false; |
931 } | 938 } |
932 | 939 |
933 return true; | 940 return true; |
934 } | 941 } |
935 | 942 |
| 943 // TODO(esprehn): forLink is dead code, what was it for? |
936 void DragController::doSystemDrag(DragImage* image, const IntPoint& dragLocation
, const IntPoint& eventPos, DataTransfer* dataTransfer, LocalFrame* frame, bool
forLink) | 944 void DragController::doSystemDrag(DragImage* image, const IntPoint& dragLocation
, const IntPoint& eventPos, DataTransfer* dataTransfer, LocalFrame* frame, bool
forLink) |
937 { | 945 { |
938 // TODO(dcheng): Drag and drop is not yet supported for OOPI. | 946 // TODO(dcheng): Drag and drop is not yet supported for OOPI. |
939 if (m_page->mainFrame()->isRemoteFrame()) | 947 if (m_page->mainFrame()->isRemoteFrame()) |
940 return; | 948 return; |
941 m_didInitiateDrag = true; | 949 m_didInitiateDrag = true; |
942 m_dragInitiator = frame->document(); | 950 m_dragInitiator = frame->document(); |
943 // Protect this frame and view, as a load may occur mid drag and attempt to
unload this frame | 951 |
944 LocalFrame* mainFrame = m_page->deprecatedLocalMainFrame(); | 952 LocalFrame* mainFrame = m_page->deprecatedLocalMainFrame(); |
945 FrameView* mainFrameView = mainFrame->view(); | 953 FrameView* mainFrameView = mainFrame->view(); |
| 954 IntPoint adjustedDragLocation = mainFrameView->rootFrameToContents(frame->vi
ew()->contentsToRootFrame(dragLocation)); |
| 955 IntPoint adjustedEventPos = mainFrameView->rootFrameToContents(frame->view()
->contentsToRootFrame(eventPos)); |
| 956 WebDragData dragData = dataTransfer->dataObject()->toWebDragData(); |
| 957 WebDragOperationsMask dragOperationMask = static_cast<WebDragOperationsMask>
(dataTransfer->sourceOperation()); |
| 958 IntSize offsetSize(adjustedEventPos - adjustedDragLocation); |
| 959 WebPoint offsetPoint(offsetSize.width(), offsetSize.height()); |
| 960 WebImage dragImage; |
946 | 961 |
947 m_client->startDrag(image, mainFrameView->rootFrameToContents(frame->view()-
>contentsToRootFrame(dragLocation)), | 962 if (image) { |
948 mainFrameView->rootFrameToContents(frame->view()->contentsToRootFrame(ev
entPos)), dataTransfer, frame, forLink); | 963 float resolutionScale = image->resolutionScale(); |
949 // DragClient::startDrag can cause our Page to dispear, deallocating |this|. | 964 float deviceScaleFactor = m_page->chromeClient().screenInfo().deviceScal
eFactor; |
950 if (!frame->page()) | 965 if (deviceScaleFactor != resolutionScale) { |
951 return; | 966 DCHECK_GT(resolutionScale, 0); |
| 967 float scale = deviceScaleFactor / resolutionScale; |
| 968 image->scale(scale, scale); |
| 969 } |
| 970 dragImage = image->bitmap(); |
| 971 } |
952 | 972 |
953 cleanupAfterSystemDrag(); | 973 m_page->chromeClient().startDragging(frame, dragData, dragOperationMask, dra
gImage, offsetPoint); |
954 } | 974 } |
955 | 975 |
956 DragOperation DragController::dragOperation(DragData* dragData) | 976 DragOperation DragController::dragOperation(DragData* dragData) |
957 { | 977 { |
958 // FIXME: To match the MacOS behaviour we should return DragOperationNone | 978 // FIXME: To match the MacOS behaviour we should return DragOperationNone |
959 // if we are a modal window, we are the drag source, or the window is an | 979 // if we are a modal window, we are the drag source, or the window is an |
960 // attached sheet If this can be determined from within WebCore | 980 // attached sheet If this can be determined from within WebCore |
961 // operationForDrag can be pulled into WebCore itself | 981 // operationForDrag can be pulled into WebCore itself |
962 ASSERT(dragData); | 982 ASSERT(dragData); |
963 return dragData->containsURL() && !m_didInitiateDrag ? DragOperationCopy : D
ragOperationNone; | 983 return dragData->containsURL() && !m_didInitiateDrag ? DragOperationCopy : D
ragOperationNone; |
964 } | 984 } |
965 | 985 |
966 bool DragController::isCopyKeyDown(DragData* dragData) | 986 bool DragController::isCopyKeyDown(DragData* dragData) |
967 { | 987 { |
968 int modifiers = dragData->modifiers(); | 988 int modifiers = dragData->modifiers(); |
969 | 989 |
970 #if OS(MACOSX) | 990 #if OS(MACOSX) |
971 return modifiers & PlatformEvent::AltKey; | 991 return modifiers & PlatformEvent::AltKey; |
972 #else | 992 #else |
973 return modifiers & PlatformEvent::CtrlKey; | 993 return modifiers & PlatformEvent::CtrlKey; |
974 #endif | 994 #endif |
975 } | 995 } |
976 | 996 |
977 void DragController::cleanupAfterSystemDrag() | |
978 { | |
979 } | |
980 | |
981 DEFINE_TRACE(DragController) | 997 DEFINE_TRACE(DragController) |
982 { | 998 { |
983 visitor->trace(m_page); | 999 visitor->trace(m_page); |
984 visitor->trace(m_documentUnderMouse); | 1000 visitor->trace(m_documentUnderMouse); |
985 visitor->trace(m_dragInitiator); | 1001 visitor->trace(m_dragInitiator); |
986 visitor->trace(m_fileInputElementUnderMouse); | 1002 visitor->trace(m_fileInputElementUnderMouse); |
987 } | 1003 } |
988 | 1004 |
989 } // namespace blink | 1005 } // namespace blink |
OLD | NEW |