From cc1a79eceb4599d34c61931c15223f92357957b8 Mon Sep 17 00:00:00 2001 From: Joel Einbinder Date: Wed, 6 Jan 2021 09:46:35 -0800 Subject: [PATCH] browser(webkit): drag and drop on windows (#4889) --- browser_patches/webkit/BUILD_NUMBER | 4 +- browser_patches/webkit/patches/bootstrap.diff | 432 ++++++++++++++---- 2 files changed, 355 insertions(+), 81 deletions(-) diff --git a/browser_patches/webkit/BUILD_NUMBER b/browser_patches/webkit/BUILD_NUMBER index 9acb3d83e6..0214ebaa41 100644 --- a/browser_patches/webkit/BUILD_NUMBER +++ b/browser_patches/webkit/BUILD_NUMBER @@ -1,2 +1,2 @@ -1415 -Changed: yurys@chromium.org Tue 05 Jan 2021 03:48:12 PM PST +1416 +Changed: joel.einbinder@gmail.com Wed, Jan 6, 2021 9:41:40 AM diff --git a/browser_patches/webkit/patches/bootstrap.diff b/browser_patches/webkit/patches/bootstrap.diff index a03de38382..a0507192e7 100644 --- a/browser_patches/webkit/patches/bootstrap.diff +++ b/browser_patches/webkit/patches/bootstrap.diff @@ -5930,7 +5930,7 @@ index 1939fb90c22564d02cadf65bdaf7f65ccb7ce9a7..f6a73e6ac480ed0d9b964617d6aa62f3 IntSize dragImageSize(DragImageRef) { diff --git a/Source/WebCore/platform/Pasteboard.h b/Source/WebCore/platform/Pasteboard.h -index aadc46698df79564362a03f5dfe89b0eb7811ce9..6cba1018128280b36842d59b385d3de16893c4fb 100644 +index aadc46698df79564362a03f5dfe89b0eb7811ce9..382298e06bdeee546cfb3105ea21a63c4efe0a61 100644 --- a/Source/WebCore/platform/Pasteboard.h +++ b/Source/WebCore/platform/Pasteboard.h @@ -43,7 +43,7 @@ OBJC_CLASS NSString; @@ -5994,7 +5994,15 @@ index aadc46698df79564362a03f5dfe89b0eb7811ce9..6cba1018128280b36842d59b385d3de1 #if PLATFORM(IOS_FAMILY) explicit Pasteboard(int64_t changeCount); explicit Pasteboard(const String& pasteboardName); -@@ -333,6 +340,10 @@ private: +@@ -286,6 +293,7 @@ public: + COMPtr dataObject() const { return m_dataObject; } + void setExternalDataObject(IDataObject*); + const DragDataMap& dragDataMap() const { return m_dragDataMap; } ++ WEBCORE_EXPORT DragDataMap createDragDataMap(); + void writeURLToWritableDataObject(const URL&, const String&); + COMPtr writableDataObject() const { return m_writableDataObject; } + void writeImageToDataObject(Element&, const URL&); // FIXME: Layering violation. +@@ -333,6 +341,10 @@ private: String m_name; #endif @@ -6005,6 +6013,14 @@ index aadc46698df79564362a03f5dfe89b0eb7811ce9..6cba1018128280b36842d59b385d3de1 #if PLATFORM(COCOA) String m_pasteboardName; int64_t m_changeCount; +@@ -348,6 +360,7 @@ private: + COMPtr m_dataObject; + COMPtr m_writableDataObject; + DragDataMap m_dragDataMap; ++ bool m_forDrag = false; + #endif + }; + diff --git a/Source/WebCore/platform/PlatformKeyboardEvent.h b/Source/WebCore/platform/PlatformKeyboardEvent.h index 1a1367f7a9df0ab1ace16d0365e55f6538d0cbd6..e24d748074295cc68f2eb89fb21adccc1acad149 100644 --- a/Source/WebCore/platform/PlatformKeyboardEvent.h @@ -7220,6 +7236,54 @@ index 3ecf866005da6da9cec7c7930e6a4f93cb39d6e0..d81dc9ac0c433e00ab4ad73e20685609 { RELEASE_ASSERT_NOT_REACHED(); } +diff --git a/Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp b/Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp +index 8789f11c3643999c30dfdb1c9b939ae45bb0a51f..422961d2b43e6da9e36df4cdeb06fe91ac57a644 100644 +--- a/Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp ++++ b/Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp +@@ -38,6 +38,7 @@ + #include + #include + #include ++#include "Pasteboard.h" + + #if USE(CF) + #include +@@ -724,7 +725,10 @@ template void getStringData(IDataObject* data, FORMATETC* format, Ve + STGMEDIUM store; + if (FAILED(data->GetData(format, &store))) + return; +- dataStrings.append(String(static_cast(GlobalLock(store.hGlobal)), ::GlobalSize(store.hGlobal) / sizeof(T))); ++ // The string here should be null terminated, but it could come from another app so lets lock it ++ // to the size to prevent an overflow. ++ String rawString = String(static_cast(GlobalLock(store.hGlobal)), ::GlobalSize(store.hGlobal) / sizeof(T)); ++ dataStrings.append(String::fromUTF8(rawString.utf8().data())); + GlobalUnlock(store.hGlobal); + ReleaseStgMedium(&store); + } +diff --git a/Source/WebCore/platform/win/ClipboardUtilitiesWin.h b/Source/WebCore/platform/win/ClipboardUtilitiesWin.h +index c50799b63e05adbe32bae3535d786c7d268f980f..9cf1cc7ec4eaae22947f80ba272dfae272167bd6 100644 +--- a/Source/WebCore/platform/win/ClipboardUtilitiesWin.h ++++ b/Source/WebCore/platform/win/ClipboardUtilitiesWin.h +@@ -34,6 +34,7 @@ namespace WebCore { + + class Document; + class DocumentFragment; ++class Pasteboard; + + HGLOBAL createGlobalData(const String&); + HGLOBAL createGlobalData(const Vector&); +diff --git a/Source/WebCore/platform/win/DragDataWin.cpp b/Source/WebCore/platform/win/DragDataWin.cpp +index 61ea4c47fa3522588f83a686d85c77c142909c24..4d377a6ca9e4c2f08e1f722391c853bd8cbf5109 100644 +--- a/Source/WebCore/platform/win/DragDataWin.cpp ++++ b/Source/WebCore/platform/win/DragDataWin.cpp +@@ -48,6 +48,7 @@ DragData::DragData(const DragDataMap& data, const IntPoint& clientPosition, cons + , m_draggingSourceOperationMask(sourceOperationMask) + , m_applicationFlags(flags) + , m_dragDataMap(data) ++ , m_dragDestinationActionMask(anyDragDestinationAction()) + { + } + diff --git a/Source/WebCore/platform/win/KeyEventWin.cpp b/Source/WebCore/platform/win/KeyEventWin.cpp index 44737686187a06a92c408ea60b63a48ac8481334..c754a763688b52e7ddd47493296ef9b0c6adc527 100644 --- a/Source/WebCore/platform/win/KeyEventWin.cpp @@ -7244,6 +7308,58 @@ index 44737686187a06a92c408ea60b63a48ac8481334..c754a763688b52e7ddd47493296ef9b0 } bool PlatformKeyboardEvent::currentCapsLockState() +diff --git a/Source/WebCore/platform/win/PasteboardWin.cpp b/Source/WebCore/platform/win/PasteboardWin.cpp +index 21b97f58b0ee39e44721e6f27d07e62912eb04d7..c535c19a9e4bdf37966019d48b270982aad6d3a3 100644 +--- a/Source/WebCore/platform/win/PasteboardWin.cpp ++++ b/Source/WebCore/platform/win/PasteboardWin.cpp +@@ -1131,7 +1131,21 @@ void Pasteboard::writeCustomData(const Vector& data) + } + + clear(); ++ if (m_dataObject) { ++ const auto& customData = data.first(); ++ customData.forEachPlatformString([&](auto& type, auto& string) { ++ writeString(type, string); ++ }); + ++ if (customData.hasSameOriginCustomData() || !customData.origin().isEmpty()) { ++ customData.forEachCustomString([&](auto& type, auto& string) { ++ writeString(type, string); ++ }); ++ } ++ return; ++ } ++ ++ // this is the real real clipboard. Prbaobly need to be doing drag data stuff. + if (::OpenClipboard(m_owner)) { + const auto& customData = data.first(); + customData.forEachPlatformStringOrBuffer([](auto& type, auto& stringOrBuffer) { +@@ -1170,4 +1184,25 @@ void Pasteboard::write(const Color&) + { + } + ++DragDataMap Pasteboard::createDragDataMap() { ++ DragDataMap dragDataMap; ++ auto dragObject = dataObject(); ++ if (!dragObject) ++ return dragDataMap; ++ // Enumerate clipboard content and load it in the map. ++ COMPtr itr; ++ ++ if (FAILED(dragObject->EnumFormatEtc(DATADIR_GET, &itr)) || !itr) ++ return dragDataMap; ++ ++ FORMATETC dataFormat; ++ while (itr->Next(1, &dataFormat, 0) == S_OK) { ++ Vector dataStrings; ++ getClipboardData(dragObject.get(), &dataFormat, dataStrings); ++ if (!dataStrings.isEmpty()) ++ dragDataMap.set(dataFormat.cfFormat, dataStrings); ++ } ++ return dragDataMap; ++} ++ + } // namespace WebCore diff --git a/Source/WebCore/platform/wpe/DragDataWPE.cpp b/Source/WebCore/platform/wpe/DragDataWPE.cpp new file mode 100644 index 0000000000000000000000000000000000000000..07fb260a5203167fdf94a552949394bb73ca8c61 @@ -8122,7 +8238,7 @@ index 047c375a1bb77609912b123e66e4e330c3b60ecf..f3bab44d6876ba02f6b7eec02d4b22a7 Cairo::Cairo Freetype::Freetype diff --git a/Source/WebKit/PlatformWin.cmake b/Source/WebKit/PlatformWin.cmake -index 03af565ed1ae39e77e183a4aebd1e64a2e247e0a..26a0463f3e5a9973932c29bd2ea4cafc170b117a 100644 +index 03af565ed1ae39e77e183a4aebd1e64a2e247e0a..7bf35d77e8989d50bfb81b67909b6c828cf50dde 100644 --- a/Source/WebKit/PlatformWin.cmake +++ b/Source/WebKit/PlatformWin.cmake @@ -65,8 +65,12 @@ list(APPEND WebKit_SOURCES @@ -8138,7 +8254,15 @@ index 03af565ed1ae39e77e183a4aebd1e64a2e247e0a..26a0463f3e5a9973932c29bd2ea4cafc UIProcess/win/WebPageProxyWin.cpp UIProcess/win/WebPopupMenuProxyWin.cpp UIProcess/win/WebProcessPoolWin.cpp -@@ -125,6 +129,63 @@ list(APPEND WebKit_INCLUDE_DIRECTORIES +@@ -84,6 +88,7 @@ list(APPEND WebKit_SOURCES + WebProcess/Plugins/Netscape/win/PluginProxyWin.cpp + + WebProcess/WebCoreSupport/win/WebPopupMenuWin.cpp ++ WebProcess/WebCoreSupport/win/WebDragClientWin.cpp + + WebProcess/WebPage/AcceleratedSurface.cpp + +@@ -125,6 +130,63 @@ list(APPEND WebKit_INCLUDE_DIRECTORIES "${WEBKIT_DIR}/win" ) @@ -8202,7 +8326,7 @@ index 03af565ed1ae39e77e183a4aebd1e64a2e247e0a..26a0463f3e5a9973932c29bd2ea4cafc set(WebKitCommonIncludeDirectories ${WebKit_INCLUDE_DIRECTORIES}) set(WebKitCommonSystemIncludeDirectories ${WebKit_SYSTEM_INCLUDE_DIRECTORIES}) -@@ -177,6 +238,7 @@ if (${WTF_PLATFORM_WIN_CAIRO}) +@@ -177,6 +239,7 @@ if (${WTF_PLATFORM_WIN_CAIRO}) OpenSSL::SSL mfuuid.lib strmiids.lib @@ -8287,7 +8411,7 @@ index b838fca9702c1432602176bb13ef052db224e82e..d802e555369176e74b37495ae924b04e NSEvent* nativeEvent() const { return m_nativeEvent.get(); } #elif PLATFORM(GTK) diff --git a/Source/WebKit/Shared/WebCoreArgumentCoders.cpp b/Source/WebKit/Shared/WebCoreArgumentCoders.cpp -index faaa2adcf991b136593c55960646ff1f480cf1d7..771c9a318b16b407b5f737805c695cdefc9d510f 100644 +index faaa2adcf991b136593c55960646ff1f480cf1d7..d34282d7d42f0f4f3ea705ced8a5f6b5afeef80f 100644 --- a/Source/WebKit/Shared/WebCoreArgumentCoders.cpp +++ b/Source/WebKit/Shared/WebCoreArgumentCoders.cpp @@ -113,6 +113,10 @@ @@ -8333,6 +8457,51 @@ index faaa2adcf991b136593c55960646ff1f480cf1d7..771c9a318b16b407b5f737805c695cde return true; } +@@ -1431,6 +1444,11 @@ void ArgumentCoder::encode(Encoder& encoder, const DragData& dragData) + #if PLATFORM(COCOA) + encoder << dragData.pasteboardName(); + encoder << dragData.fileNames(); ++#endif ++#if PLATFORM(WIN) ++ DragData dragDataCopy = dragData; ++ HashMap> hash = dragDataCopy.dragDataMap(); ++ encoder << hash; + #endif + encoder << dragData.dragDestinationActionMask(); + } +@@ -1453,9 +1471,16 @@ bool ArgumentCoder::decode(Decoder& decoder, DragData& dragData) + if (!decoder.decode(applicationFlags)) + return false; + ++#if PLATFORM(WIN) ++ DragDataMap dragDataMap; ++ if (!decoder.decode(dragDataMap)) ++ return false; ++#else + String pasteboardName; +- Vector fileNames; ++#endif ++ + #if PLATFORM(COCOA) ++ Vector fileNames; + if (!decoder.decode(pasteboardName)) + return false; + +@@ -1467,8 +1492,14 @@ bool ArgumentCoder::decode(Decoder& decoder, DragData& dragData) + if (!decoder.decode(dragDestinationActionMask)) + return false; + ++#if PLATFORM(WIN) ++ dragData = DragData(dragDataMap, clientPosition, globalPosition, draggingSourceOperationMask, applicationFlags); ++#else + dragData = DragData(pasteboardName, clientPosition, globalPosition, draggingSourceOperationMask, applicationFlags, dragDestinationActionMask); ++#endif ++#if PLATFORM(COCOA) + dragData.setFileNames(fileNames); ++#endif + + return true; + } diff --git a/Source/WebKit/Shared/WebEvent.h b/Source/WebKit/Shared/WebEvent.h index 3ae6504779d3917a79f69f32b58260afeda270b4..72d44c33953cc13bf2ed7c762b4f9a7b88571b56 100644 --- a/Source/WebKit/Shared/WebEvent.h @@ -14133,10 +14302,10 @@ index 0000000000000000000000000000000000000000..1353851472668b3e77c19db54f224c0c +} // namespace WebKit diff --git a/Source/WebKit/UIProcess/WebPageInspectorInputAgent.cpp b/Source/WebKit/UIProcess/WebPageInspectorInputAgent.cpp new file mode 100644 -index 0000000000000000000000000000000000000000..66526175997380bc8ac99d7f3d1941b72cf95be6 +index 0000000000000000000000000000000000000000..f92482b8ba7fd65727024f2f802a5927d8dc5a4d --- /dev/null +++ b/Source/WebKit/UIProcess/WebPageInspectorInputAgent.cpp -@@ -0,0 +1,294 @@ +@@ -0,0 +1,290 @@ +/* + * Copyright (C) 2019 Microsoft Corporation. + * @@ -14314,7 +14483,7 @@ index 0000000000000000000000000000000000000000..66526175997380bc8ac99d7f3d1941b7 + eventIsSystemKey = *isSystemKey; + WallTime timestamp = WallTime::now(); + -+#if PLATFORM(GTK) || PLATFORM(WPE) ++#if !PLATFORM(COCOA) + // cancel any active drag on Escape + if (eventType == WebKit::WebEvent::KeyDown && key == "Escape" && m_page.cancelDragIfNeeded()) { + callback->sendSuccess(); @@ -14412,17 +14581,13 @@ index 0000000000000000000000000000000000000000..66526175997380bc8ac99d7f3d1941b7 + eventClickCount, + eventModifiers, + timestamp); -+#if PLATFORM(WPE) || PLATFORM(GTK) + // We intercept any drags generated by this mouse event + // to prevent them from creating actual drags in the host + // operating system. + m_page.setInterceptDrags(true); -+#endif + m_page.handleMouseEvent(event); -+#if PLATFORM(WPE) || PLATFORM(GTK) + m_page.setInterceptDrags(false); +#endif -+#endif +} + +void WebPageInspectorInputAgent::dispatchTapEvent(int x, int y, Optional&& modifiers, Ref&& callback) { @@ -14523,7 +14688,7 @@ index 0000000000000000000000000000000000000000..01b8f65e87b4898b1418f47f4d95c401 + +} // namespace WebKit diff --git a/Source/WebKit/UIProcess/WebPageProxy.cpp b/Source/WebKit/UIProcess/WebPageProxy.cpp -index 5716d67d700e2d1a97b304a2949aabca24358d5c..57ade9830b106e7d9c2dba6dc2322a350ccb0aa8 100644 +index 5716d67d700e2d1a97b304a2949aabca24358d5c..9b63c511180c50907a3719ae854571adb58b5a2f 100644 --- a/Source/WebKit/UIProcess/WebPageProxy.cpp +++ b/Source/WebKit/UIProcess/WebPageProxy.cpp @@ -236,7 +236,7 @@ @@ -14627,7 +14792,7 @@ index 5716d67d700e2d1a97b304a2949aabca24358d5c..57ade9830b106e7d9c2dba6dc2322a35 { if (!hasRunningProcess()) return; -+#if PLATFORM(GTK) || PLATFORM(WPE) ++#if !PLATFORM(COCOA) + if (action == DragControllerAction::Entered || action == DragControllerAction::Updated) + m_dragEventsQueued++; +#endif @@ -14643,11 +14808,11 @@ index 5716d67d700e2d1a97b304a2949aabca24358d5c..57ade9830b106e7d9c2dba6dc2322a35 send(Messages::WebPage::PerformDragControllerAction(action, dragData.clientPosition(), dragData.globalPosition(), dragData.draggingSourceOperationMask(), *dragData.platformData(), dragData.flags())); #else send(Messages::WebPage::PerformDragControllerAction(action, dragData, sandboxExtensionHandle, sandboxExtensionsForUpload)); -@@ -2465,13 +2531,26 @@ void WebPageProxy::didPerformDragControllerAction(OptionaldidProcessAllPendingMouseEvents(); @@ -14673,11 +14838,27 @@ index 5716d67d700e2d1a97b304a2949aabca24358d5c..57ade9830b106e7d9c2dba6dc2322a35 didStartDrag(); } -@@ -2485,6 +2564,16 @@ void WebPageProxy::dragEnded(const IntPoint& clientPosition, const IntPoint& glo + #endif + ++#if PLATFORM(WIN) && ENABLE(DRAG_SUPPORT) ++void WebPageProxy::startDrag(WebCore::DragDataMap& dragDataMap) ++{ ++ if (m_interceptDrags) { ++ m_dragSelectionData = dragDataMap; ++ m_dragSourceOperationMask = WebCore::anyDragOperation(); ++ } ++ didStartDrag(); ++} ++#endif ++ ++ + void WebPageProxy::dragEnded(const IntPoint& clientPosition, const IntPoint& globalPosition, OptionSet dragOperationMask) + { + if (!hasRunningProcess()) +@@ -2485,6 +2576,14 @@ void WebPageProxy::dragEnded(const IntPoint& clientPosition, const IntPoint& glo setDragCaretRect({ }); } -+#if PLATFORM(GTK) || PLATFORM(WPE) +bool WebPageProxy::cancelDragIfNeeded() { + if (!m_dragSelectionData) + return false; @@ -14685,35 +14866,37 @@ index 5716d67d700e2d1a97b304a2949aabca24358d5c..57ade9830b106e7d9c2dba6dc2322a35 + dragEnded(m_lastMousePositionForDrag, IntPoint(), m_dragSourceOperationMask); + return true; +} -+#endif + void WebPageProxy::didPerformDragOperation(bool handled) { pageClient().didPerformDragOperation(handled); -@@ -2497,6 +2586,14 @@ void WebPageProxy::didStartDrag() +@@ -2497,8 +2596,18 @@ void WebPageProxy::didStartDrag() discardQueuedMouseEvents(); send(Messages::WebPage::DidStartDrag()); + -+#if PLATFORM(GTK) || PLATFORM(WPE) + if (m_interceptDrags) { ++#if PLATFORM(COCOA) || PLATFORM(WIN) ++ DragData dragData(*m_dragSelectionData, m_lastMousePositionForDrag, WebCore::IntPoint(), m_dragSourceOperationMask); ++#else + DragData dragData(&*m_dragSelectionData, m_lastMousePositionForDrag, WebCore::IntPoint(), m_dragSourceOperationMask); ++#endif + dragEntered(dragData); + dragUpdated(dragData); + } -+#endif } - +- ++ void WebPageProxy::dragCancelled() -@@ -2603,16 +2700,38 @@ void WebPageProxy::processNextQueuedMouseEvent() + { + if (hasRunningProcess()) +@@ -2603,16 +2712,38 @@ void WebPageProxy::processNextQueuedMouseEvent() m_process->startResponsivenessTimer(); } - Optional sandboxExtensions; -+#if PLATFORM(GTK) || PLATFORM(WPE) + m_lastMousePositionForDrag = event.position(); + if (!m_dragSelectionData) { -+#endif + Optional sandboxExtensions; #if PLATFORM(MAC) @@ -14723,13 +14906,19 @@ index 5716d67d700e2d1a97b304a2949aabca24358d5c..57ade9830b106e7d9c2dba6dc2322a35 + bool eventMayStartDrag = !m_currentDragOperation && eventType == WebEvent::MouseMove && event.button() != WebMouseEvent::Button::NoButton; + if (eventMayStartDrag) + sandboxExtensions = SandboxExtension::createHandlesForMachLookup({ "com.apple.iconservices"_s, "com.apple.iconservices.store"_s }, WTF::nullopt); -+#endif + #endif +- +- LOG(MouseHandling, "UIProcess: sent mouse event %s (queue size %zu)", webMouseEventTypeString(eventType), m_mouseEventQueue.size()); +- send(Messages::WebPage::MouseEvent(event, sandboxExtensions)); + + LOG(MouseHandling, "UIProcess: sent mouse event %s (queue size %zu)", webMouseEventTypeString(eventType), m_mouseEventQueue.size()); + send(Messages::WebPage::MouseEvent(event, sandboxExtensions)); -+#if PLATFORM(GTK) || PLATFORM(WPE) + } else { ++#if PLATFORM(COCOA) || PLATFORM(WIN) ++ DragData dragData(*m_dragSelectionData, event.position(), event.globalPosition(), m_dragSourceOperationMask); ++#else + DragData dragData(&*m_dragSelectionData, event.position(), event.globalPosition(), m_dragSourceOperationMask); ++#endif + if (eventType == WebEvent::MouseMove) { + dragUpdated(dragData); + } else if (eventType == WebEvent::MouseUp) { @@ -14744,14 +14933,10 @@ index 5716d67d700e2d1a97b304a2949aabca24358d5c..57ade9830b106e7d9c2dba6dc2322a35 + } + didReceiveEvent(eventType, true); + } - #endif -- -- LOG(MouseHandling, "UIProcess: sent mouse event %s (queue size %zu)", webMouseEventTypeString(eventType), m_mouseEventQueue.size()); -- send(Messages::WebPage::MouseEvent(event, sandboxExtensions)); } void WebPageProxy::doAfterProcessingAllPendingMouseEvents(WTF::Function&& action) -@@ -2793,7 +2912,7 @@ static TrackingType mergeTrackingTypes(TrackingType a, TrackingType b) +@@ -2793,7 +2924,7 @@ static TrackingType mergeTrackingTypes(TrackingType a, TrackingType b) void WebPageProxy::updateTouchEventTracking(const WebTouchEvent& touchStartEvent) { @@ -14760,7 +14945,7 @@ index 5716d67d700e2d1a97b304a2949aabca24358d5c..57ade9830b106e7d9c2dba6dc2322a35 const EventNames& names = eventNames(); for (auto& touchPoint : touchStartEvent.touchPoints()) { IntPoint location = touchPoint.location(); -@@ -2826,7 +2945,7 @@ void WebPageProxy::updateTouchEventTracking(const WebTouchEvent& touchStartEvent +@@ -2826,7 +2957,7 @@ void WebPageProxy::updateTouchEventTracking(const WebTouchEvent& touchStartEvent m_touchAndPointerEventTracking.touchStartTracking = TrackingType::Synchronous; m_touchAndPointerEventTracking.touchMoveTracking = TrackingType::Synchronous; m_touchAndPointerEventTracking.touchEndTracking = TrackingType::Synchronous; @@ -14769,7 +14954,7 @@ index 5716d67d700e2d1a97b304a2949aabca24358d5c..57ade9830b106e7d9c2dba6dc2322a35 } TrackingType WebPageProxy::touchEventTrackingType(const WebTouchEvent& touchStartEvent) const -@@ -3245,6 +3364,7 @@ void WebPageProxy::receivedNavigationPolicyDecision(PolicyAction policyAction, A +@@ -3245,6 +3376,7 @@ void WebPageProxy::receivedNavigationPolicyDecision(PolicyAction policyAction, A void WebPageProxy::receivedPolicyDecision(PolicyAction action, API::Navigation* navigation, RefPtr&& websitePolicies, Variant, Ref>&& navigationActionOrResponse, Ref&& sender, Optional sandboxExtensionHandle, WillContinueLoadInNewProcess willContinueLoadInNewProcess) { @@ -14777,7 +14962,7 @@ index 5716d67d700e2d1a97b304a2949aabca24358d5c..57ade9830b106e7d9c2dba6dc2322a35 if (!hasRunningProcess()) { sender->send(PolicyDecision { sender->identifier(), isNavigatingToAppBoundDomain(), PolicyAction::Ignore, 0, WTF::nullopt, WTF::nullopt }); return; -@@ -3954,6 +4074,11 @@ void WebPageProxy::pageScaleFactorDidChange(double scaleFactor) +@@ -3954,6 +4086,11 @@ void WebPageProxy::pageScaleFactorDidChange(double scaleFactor) m_pageScaleFactor = scaleFactor; } @@ -14789,7 +14974,7 @@ index 5716d67d700e2d1a97b304a2949aabca24358d5c..57ade9830b106e7d9c2dba6dc2322a35 void WebPageProxy::pluginScaleFactorDidChange(double pluginScaleFactor) { m_pluginScaleFactor = pluginScaleFactor; -@@ -4370,6 +4495,7 @@ void WebPageProxy::didDestroyNavigation(uint64_t navigationID) +@@ -4370,6 +4507,7 @@ void WebPageProxy::didDestroyNavigation(uint64_t navigationID) // FIXME: Message check the navigationID. m_navigationState->didDestroyNavigation(navigationID); @@ -14797,7 +14982,7 @@ index 5716d67d700e2d1a97b304a2949aabca24358d5c..57ade9830b106e7d9c2dba6dc2322a35 } void WebPageProxy::didStartProvisionalLoadForFrame(FrameIdentifier frameID, FrameInfoData&& frameInfo, ResourceRequest&& request, uint64_t navigationID, URL&& url, URL&& unreachableURL, const UserData& userData) -@@ -4592,6 +4718,8 @@ void WebPageProxy::didFailProvisionalLoadForFrameShared(Ref&& p +@@ -4592,6 +4730,8 @@ void WebPageProxy::didFailProvisionalLoadForFrameShared(Ref&& p m_failingProvisionalLoadURL = { }; @@ -14806,7 +14991,7 @@ index 5716d67d700e2d1a97b304a2949aabca24358d5c..57ade9830b106e7d9c2dba6dc2322a35 // If the provisional page's load fails then we destroy the provisional page. if (m_provisionalPage && m_provisionalPage->mainFrame() == frame && willContinueLoading == WillContinueLoading::No) m_provisionalPage = nullptr; -@@ -5040,7 +5168,14 @@ void WebPageProxy::decidePolicyForNavigationActionAsync(FrameIdentifier frameID, +@@ -5040,7 +5180,14 @@ void WebPageProxy::decidePolicyForNavigationActionAsync(FrameIdentifier frameID, NavigationActionData&& navigationActionData, FrameInfoData&& originatingFrameInfo, Optional originatingPageID, const WebCore::ResourceRequest& originalRequest, WebCore::ResourceRequest&& request, IPC::FormDataReference&& requestBody, WebCore::ResourceResponse&& redirectResponse, const UserData& userData, uint64_t listenerID) { @@ -14822,7 +15007,7 @@ index 5716d67d700e2d1a97b304a2949aabca24358d5c..57ade9830b106e7d9c2dba6dc2322a35 } void WebPageProxy::decidePolicyForNavigationActionAsyncShared(Ref&& process, PageIdentifier webPageID, FrameIdentifier frameID, FrameInfoData&& frameInfo, -@@ -5554,6 +5689,7 @@ void WebPageProxy::createNewPage(FrameInfoData&& originatingFrameInfoData, WebPa +@@ -5554,6 +5701,7 @@ void WebPageProxy::createNewPage(FrameInfoData&& originatingFrameInfoData, WebPa auto* originatingPage = m_process->webPage(originatingPageID); auto originatingFrameInfo = API::FrameInfo::create(WTFMove(originatingFrameInfoData), originatingPage); auto mainFrameURL = m_mainFrame ? m_mainFrame->url() : URL(); @@ -14830,7 +15015,7 @@ index 5716d67d700e2d1a97b304a2949aabca24358d5c..57ade9830b106e7d9c2dba6dc2322a35 auto completionHandler = [this, protectedThis = makeRef(*this), mainFrameURL, request, reply = WTFMove(reply), privateClickMeasurement = navigationActionData.privateClickMeasurement] (RefPtr newPage) mutable { if (!newPage) { reply(WTF::nullopt, WTF::nullopt); -@@ -5594,6 +5730,7 @@ void WebPageProxy::createNewPage(FrameInfoData&& originatingFrameInfoData, WebPa +@@ -5594,6 +5742,7 @@ void WebPageProxy::createNewPage(FrameInfoData&& originatingFrameInfoData, WebPa void WebPageProxy::showPage() { m_uiClient->showPage(this); @@ -14838,7 +15023,7 @@ index 5716d67d700e2d1a97b304a2949aabca24358d5c..57ade9830b106e7d9c2dba6dc2322a35 } void WebPageProxy::exitFullscreenImmediately() -@@ -5629,6 +5766,10 @@ void WebPageProxy::closePage() +@@ -5629,6 +5778,10 @@ void WebPageProxy::closePage() if (isClosed()) return; @@ -14849,7 +15034,7 @@ index 5716d67d700e2d1a97b304a2949aabca24358d5c..57ade9830b106e7d9c2dba6dc2322a35 RELEASE_LOG_IF_ALLOWED(Process, "closePage:"); pageClient().clearAllEditCommands(); m_uiClient->close(this); -@@ -5648,6 +5789,8 @@ void WebPageProxy::runJavaScriptAlert(FrameIdentifier frameID, FrameInfoData&& f +@@ -5648,6 +5801,8 @@ void WebPageProxy::runJavaScriptAlert(FrameIdentifier frameID, FrameInfoData&& f if (auto* automationSession = process().processPool().automationSession()) automationSession->willShowJavaScriptDialog(*this); } @@ -14858,7 +15043,7 @@ index 5716d67d700e2d1a97b304a2949aabca24358d5c..57ade9830b106e7d9c2dba6dc2322a35 m_uiClient->runJavaScriptAlert(*this, message, frame, WTFMove(frameInfo), WTFMove(reply)); } -@@ -5665,6 +5808,8 @@ void WebPageProxy::runJavaScriptConfirm(FrameIdentifier frameID, FrameInfoData&& +@@ -5665,6 +5820,8 @@ void WebPageProxy::runJavaScriptConfirm(FrameIdentifier frameID, FrameInfoData&& if (auto* automationSession = process().processPool().automationSession()) automationSession->willShowJavaScriptDialog(*this); } @@ -14867,7 +15052,7 @@ index 5716d67d700e2d1a97b304a2949aabca24358d5c..57ade9830b106e7d9c2dba6dc2322a35 m_uiClient->runJavaScriptConfirm(*this, message, frame, WTFMove(frameInfo), WTFMove(reply)); } -@@ -5683,6 +5828,8 @@ void WebPageProxy::runJavaScriptPrompt(FrameIdentifier frameID, FrameInfoData&& +@@ -5683,6 +5840,8 @@ void WebPageProxy::runJavaScriptPrompt(FrameIdentifier frameID, FrameInfoData&& if (auto* automationSession = process().processPool().automationSession()) automationSession->willShowJavaScriptDialog(*this); } @@ -14876,7 +15061,7 @@ index 5716d67d700e2d1a97b304a2949aabca24358d5c..57ade9830b106e7d9c2dba6dc2322a35 m_uiClient->runJavaScriptPrompt(*this, message, defaultValue, frame, WTFMove(frameInfo), WTFMove(reply)); } -@@ -5838,6 +5985,8 @@ void WebPageProxy::runBeforeUnloadConfirmPanel(FrameIdentifier frameID, FrameInf +@@ -5838,6 +5997,8 @@ void WebPageProxy::runBeforeUnloadConfirmPanel(FrameIdentifier frameID, FrameInf return; } } @@ -14885,18 +15070,18 @@ index 5716d67d700e2d1a97b304a2949aabca24358d5c..57ade9830b106e7d9c2dba6dc2322a35 // Since runBeforeUnloadConfirmPanel() can spin a nested run loop we need to turn off the responsiveness timer and the tryClose timer. m_process->stopResponsivenessTimer(); -@@ -7015,6 +7164,10 @@ void WebPageProxy::didReceiveEvent(uint32_t opaqueType, bool handled) +@@ -7015,6 +7176,10 @@ void WebPageProxy::didReceiveEvent(uint32_t opaqueType, bool handled) if (auto* automationSession = process().processPool().automationSession()) automationSession->mouseEventsFlushedForPage(*this); didFinishProcessingAllPendingMouseEvents(); -+#if PLATFORM(GTK) || PLATFORM(WPE) ++#if !PLATFORM(COCOA) + if (m_dragEventsQueued == 0) +#endif + m_inspectorController->didProcessAllPendingMouseEvents(); } break; } -@@ -7041,7 +7194,6 @@ void WebPageProxy::didReceiveEvent(uint32_t opaqueType, bool handled) +@@ -7041,7 +7206,6 @@ void WebPageProxy::didReceiveEvent(uint32_t opaqueType, bool handled) case WebEvent::RawKeyDown: case WebEvent::Char: { LOG(KeyHandling, "WebPageProxy::didReceiveEvent: %s (queue empty %d)", webKeyboardEventTypeString(type), m_keyEventQueue.isEmpty()); @@ -14904,7 +15089,7 @@ index 5716d67d700e2d1a97b304a2949aabca24358d5c..57ade9830b106e7d9c2dba6dc2322a35 MESSAGE_CHECK(m_process, !m_keyEventQueue.isEmpty()); auto event = m_keyEventQueue.takeFirst(); MESSAGE_CHECK(m_process, type == event.type()); -@@ -7060,7 +7212,6 @@ void WebPageProxy::didReceiveEvent(uint32_t opaqueType, bool handled) +@@ -7060,7 +7224,6 @@ void WebPageProxy::didReceiveEvent(uint32_t opaqueType, bool handled) // The call to doneWithKeyEvent may close this WebPage. // Protect against this being destroyed. Ref protect(*this); @@ -14912,7 +15097,7 @@ index 5716d67d700e2d1a97b304a2949aabca24358d5c..57ade9830b106e7d9c2dba6dc2322a35 pageClient().doneWithKeyEvent(event, handled); if (!handled) m_uiClient->didNotHandleKeyEvent(this, event); -@@ -7069,6 +7220,7 @@ void WebPageProxy::didReceiveEvent(uint32_t opaqueType, bool handled) +@@ -7069,6 +7232,7 @@ void WebPageProxy::didReceiveEvent(uint32_t opaqueType, bool handled) if (!canProcessMoreKeyEvents) { if (auto* automationSession = process().processPool().automationSession()) automationSession->keyboardEventsFlushedForPage(*this); @@ -14920,7 +15105,7 @@ index 5716d67d700e2d1a97b304a2949aabca24358d5c..57ade9830b106e7d9c2dba6dc2322a35 } break; } -@@ -7484,7 +7636,6 @@ static bool shouldReloadAfterProcessTermination(ProcessTerminationReason reason) +@@ -7484,7 +7648,6 @@ static bool shouldReloadAfterProcessTermination(ProcessTerminationReason reason) void WebPageProxy::dispatchProcessDidTerminate(ProcessTerminationReason reason) { RELEASE_LOG_ERROR_IF_ALLOWED(Loading, "dispatchProcessDidTerminate: reason = %d", reason); @@ -14928,7 +15113,7 @@ index 5716d67d700e2d1a97b304a2949aabca24358d5c..57ade9830b106e7d9c2dba6dc2322a35 // We notify the client asynchronously because several pages may share the same process // and we want to make sure all pages are aware their process has crashed before the // the client reacts to the process termination. -@@ -7492,7 +7643,10 @@ void WebPageProxy::dispatchProcessDidTerminate(ProcessTerminationReason reason) +@@ -7492,7 +7655,10 @@ void WebPageProxy::dispatchProcessDidTerminate(ProcessTerminationReason reason) if (!weakThis) return; @@ -14940,7 +15125,7 @@ index 5716d67d700e2d1a97b304a2949aabca24358d5c..57ade9830b106e7d9c2dba6dc2322a35 if (m_loaderClient) handledByClient = reason != ProcessTerminationReason::RequestedByClient && m_loaderClient->processDidCrash(*this); else -@@ -7852,6 +8006,7 @@ static const Vector& mediaRelatedIOKitClasses() +@@ -7852,6 +8018,7 @@ static const Vector& mediaRelatedIOKitClasses() WebPageCreationParameters WebPageProxy::creationParameters(WebProcessProxy& process, DrawingAreaProxy& drawingArea, RefPtr&& websitePolicies) { @@ -14948,7 +15133,7 @@ index 5716d67d700e2d1a97b304a2949aabca24358d5c..57ade9830b106e7d9c2dba6dc2322a35 WebPageCreationParameters parameters; parameters.processDisplayName = configuration().processDisplayName(); -@@ -8024,6 +8179,8 @@ WebPageCreationParameters WebPageProxy::creationParameters(WebProcessProxy& proc +@@ -8024,6 +8191,8 @@ WebPageCreationParameters WebPageProxy::creationParameters(WebProcessProxy& proc parameters.shouldRelaxThirdPartyCookieBlocking = m_configuration->shouldRelaxThirdPartyCookieBlocking(); parameters.canUseCredentialStorage = m_canUseCredentialStorage; @@ -14957,7 +15142,7 @@ index 5716d67d700e2d1a97b304a2949aabca24358d5c..57ade9830b106e7d9c2dba6dc2322a35 #if PLATFORM(GTK) parameters.themeName = pageClient().themeName(); #endif -@@ -8095,6 +8252,14 @@ void WebPageProxy::gamepadActivity(const Vector& gamepadDatas, Even +@@ -8095,6 +8264,14 @@ void WebPageProxy::gamepadActivity(const Vector& gamepadDatas, Even void WebPageProxy::didReceiveAuthenticationChallengeProxy(Ref&& authenticationChallenge, NegotiatedLegacyTLS negotiatedLegacyTLS) { @@ -14972,7 +15157,7 @@ index 5716d67d700e2d1a97b304a2949aabca24358d5c..57ade9830b106e7d9c2dba6dc2322a35 if (negotiatedLegacyTLS == NegotiatedLegacyTLS::Yes) { m_navigationClient->shouldAllowLegacyTLS(*this, authenticationChallenge.get(), [this, protectedThis = makeRef(*this), authenticationChallenge] (bool shouldAllowLegacyTLS) { if (shouldAllowLegacyTLS) -@@ -8180,7 +8345,8 @@ void WebPageProxy::requestGeolocationPermissionForFrame(GeolocationIdentifier ge +@@ -8180,7 +8357,8 @@ void WebPageProxy::requestGeolocationPermissionForFrame(GeolocationIdentifier ge MESSAGE_CHECK(m_process, frame); // FIXME: Geolocation should probably be using toString() as its string representation instead of databaseIdentifier(). @@ -14982,7 +15167,7 @@ index 5716d67d700e2d1a97b304a2949aabca24358d5c..57ade9830b106e7d9c2dba6dc2322a35 auto request = m_geolocationPermissionRequestManager.createRequest(geolocationID); Function completionHandler = [request = WTFMove(request)](bool allowed) { if (allowed) -@@ -8189,6 +8355,14 @@ void WebPageProxy::requestGeolocationPermissionForFrame(GeolocationIdentifier ge +@@ -8189,6 +8367,14 @@ void WebPageProxy::requestGeolocationPermissionForFrame(GeolocationIdentifier ge request->deny(); }; @@ -14998,7 +15183,7 @@ index 5716d67d700e2d1a97b304a2949aabca24358d5c..57ade9830b106e7d9c2dba6dc2322a35 // and make it one UIClient call that calls the completionHandler with false // if there is no delegate instead of returning the completionHandler diff --git a/Source/WebKit/UIProcess/WebPageProxy.h b/Source/WebKit/UIProcess/WebPageProxy.h -index 0df616b76fb75033ef20179fe5b296f28355e3e1..d17c19d01c9c5cc44f668dc94ab1d0c16b18524c 100644 +index 0df616b76fb75033ef20179fe5b296f28355e3e1..e641744506cb9103f0a79351fb6fab51bcf46ea0 100644 --- a/Source/WebKit/UIProcess/WebPageProxy.h +++ b/Source/WebKit/UIProcess/WebPageProxy.h @@ -39,6 +39,7 @@ @@ -15024,7 +15209,15 @@ index 0df616b76fb75033ef20179fe5b296f28355e3e1..d17c19d01c9c5cc44f668dc94ab1d0c1 #if ENABLE(WIRELESS_PLAYBACK_TARGET) && !PLATFORM(IOS_FAMILY) #include #include -@@ -224,7 +233,6 @@ class GraphicsLayer; +@@ -217,6 +226,7 @@ class AuthenticationChallenge; + class CertificateInfo; + class Cursor; + class DragData; ++typedef HashMap> DragDataMap; + class FloatRect; + class FontAttributeChanges; + class FontChanges; +@@ -224,7 +234,6 @@ class GraphicsLayer; class IntSize; class ProtectionSpace; class RunLoopObserver; @@ -15032,7 +15225,7 @@ index 0df616b76fb75033ef20179fe5b296f28355e3e1..d17c19d01c9c5cc44f668dc94ab1d0c1 class SharedBuffer; class TextIndicator; class ValidationBubble; -@@ -515,6 +523,8 @@ public: +@@ -515,6 +524,8 @@ public: void setControlledByAutomation(bool); WebPageInspectorController& inspectorController() { return *m_inspectorController; } @@ -15041,7 +15234,7 @@ index 0df616b76fb75033ef20179fe5b296f28355e3e1..d17c19d01c9c5cc44f668dc94ab1d0c1 #if PLATFORM(IOS_FAMILY) void showInspectorIndication(); -@@ -586,6 +596,11 @@ public: +@@ -586,6 +597,11 @@ public: void setPageLoadStateObserver(std::unique_ptr&&); @@ -15053,7 +15246,7 @@ index 0df616b76fb75033ef20179fe5b296f28355e3e1..d17c19d01c9c5cc44f668dc94ab1d0c1 void initializeWebPage(); void setDrawingArea(std::unique_ptr&&); -@@ -611,6 +626,7 @@ public: +@@ -611,6 +627,7 @@ public: void closePage(); void addPlatformLoadParameters(WebProcessProxy&, LoadParameters&); @@ -15061,7 +15254,7 @@ index 0df616b76fb75033ef20179fe5b296f28355e3e1..d17c19d01c9c5cc44f668dc94ab1d0c1 RefPtr loadRequest(WebCore::ResourceRequest&&, WebCore::ShouldOpenExternalURLsPolicy = WebCore::ShouldOpenExternalURLsPolicy::ShouldAllowExternalSchemesButNotAppLinks, API::Object* userData = nullptr); RefPtr loadFile(const String& fileURL, const String& resourceDirectoryURL, API::Object* userData = nullptr); RefPtr loadData(const IPC::DataReference&, const String& MIMEType, const String& encoding, const String& baseURL, API::Object* userData = nullptr, WebCore::ShouldOpenExternalURLsPolicy = WebCore::ShouldOpenExternalURLsPolicy::ShouldNotAllow); -@@ -1113,6 +1129,7 @@ public: +@@ -1113,6 +1130,7 @@ public: #endif void pageScaleFactorDidChange(double); @@ -15069,19 +15262,25 @@ index 0df616b76fb75033ef20179fe5b296f28355e3e1..d17c19d01c9c5cc44f668dc94ab1d0c1 void pluginScaleFactorDidChange(double); void pluginZoomFactorDidChange(double); -@@ -1192,8 +1209,10 @@ public: +@@ -1191,10 +1209,16 @@ public: + void startDrag(const WebCore::DragItem&, const ShareableBitmap::Handle& dragImageHandle); void setPromisedDataForImage(const String& pasteboardName, const SharedMemory::IPCHandle& imageHandle, const String& filename, const String& extension, const String& title, const String& url, const String& visibleURL, const SharedMemory::IPCHandle& archiveHandle); ++#else ++ void setInterceptDrags(bool shouldIntercept) { m_interceptDrags = true; }; ++ bool cancelDragIfNeeded(); #endif -#if PLATFORM(GTK) +#if PLATFORM(GTK) || PLATFORM(WPE) void startDrag(WebCore::SelectionData&&, OptionSet, const ShareableBitmap::Handle& dragImage); -+ void setInterceptDrags(bool shouldIntercept) { m_interceptDrags = true; }; -+ bool cancelDragIfNeeded(); #endif ++#if PLATFORM(WIN) ++ void startDrag(WebCore::DragDataMap& dragDataMap); ++#endif #endif -@@ -1433,6 +1452,8 @@ public: + void processDidBecomeUnresponsive(); +@@ -1433,6 +1457,8 @@ public: #if PLATFORM(COCOA) || PLATFORM(GTK) RefPtr takeViewSnapshot(Optional&&); @@ -15090,7 +15289,7 @@ index 0df616b76fb75033ef20179fe5b296f28355e3e1..d17c19d01c9c5cc44f668dc94ab1d0c1 #endif #if ENABLE(WEB_CRYPTO) -@@ -2450,6 +2471,7 @@ private: +@@ -2450,6 +2476,7 @@ private: String m_overrideContentSecurityPolicy; RefPtr m_inspector; @@ -15098,21 +15297,26 @@ index 0df616b76fb75033ef20179fe5b296f28355e3e1..d17c19d01c9c5cc44f668dc94ab1d0c1 #if ENABLE(FULLSCREEN_API) std::unique_ptr m_fullScreenManager; -@@ -2683,6 +2705,13 @@ private: +@@ -2683,6 +2710,18 @@ private: unsigned m_currentDragNumberOfFilesToBeAccepted { 0 }; WebCore::IntRect m_currentDragCaretRect; WebCore::IntRect m_currentDragCaretEditableElementRect; -+#if PLATFORM(GTK) || PLATFORM(WPE) ++#if !PLATOFORM(COCOA) + bool m_interceptDrags { false }; -+ Optional m_dragSelectionData; + OptionSet m_dragSourceOperationMask; + int m_dragEventsQueued = 0; + WebCore::IntPoint m_lastMousePositionForDrag; ++#endif ++#if PLATFORM(GTK) || PLATFORM(WPE) ++ Optional m_dragSelectionData; ++#endif ++#if PLATFORM(WIN) ++ Optional m_dragSelectionData; +#endif #endif PageLoadState m_pageLoadState; -@@ -2888,6 +2917,9 @@ private: +@@ -2888,6 +2927,9 @@ private: RefPtr messageBody; }; Vector m_pendingInjectedBundleMessages; @@ -15123,7 +15327,7 @@ index 0df616b76fb75033ef20179fe5b296f28355e3e1..d17c19d01c9c5cc44f668dc94ab1d0c1 #if PLATFORM(IOS_FAMILY) && ENABLE(DEVICE_ORIENTATION) std::unique_ptr m_webDeviceOrientationUpdateProviderProxy; diff --git a/Source/WebKit/UIProcess/WebPageProxy.messages.in b/Source/WebKit/UIProcess/WebPageProxy.messages.in -index ef9327d8f6ee7d3fec6527fa52a0b0dc71f397a1..ec0b01c090c02b382448cd44f3eb55f9c88b5876 100644 +index ef9327d8f6ee7d3fec6527fa52a0b0dc71f397a1..8fe26679da1bf27a577c9aea1bca223910a7078f 100644 --- a/Source/WebKit/UIProcess/WebPageProxy.messages.in +++ b/Source/WebKit/UIProcess/WebPageProxy.messages.in @@ -29,6 +29,7 @@ messages -> WebPageProxy { @@ -15142,7 +15346,7 @@ index ef9327d8f6ee7d3fec6527fa52a0b0dc71f397a1..ec0b01c090c02b382448cd44f3eb55f9 PluginScaleFactorDidChange(double zoomFactor) PluginZoomFactorDidChange(double zoomFactor) -@@ -320,7 +322,7 @@ messages -> WebPageProxy { +@@ -320,10 +322,12 @@ messages -> WebPageProxy { StartDrag(struct WebCore::DragItem dragItem, WebKit::ShareableBitmap::Handle dragImage) SetPromisedDataForImage(String pasteboardName, WebKit::SharedMemory::IPCHandle imageHandle, String filename, String extension, String title, String url, String visibleURL, WebKit::SharedMemory::IPCHandle archiveHandle) #endif @@ -15150,7 +15354,13 @@ index ef9327d8f6ee7d3fec6527fa52a0b0dc71f397a1..ec0b01c090c02b382448cd44f3eb55f9 +#if (PLATFORM(GTK) || PLATFORM(WPE)) && ENABLE(DRAG_SUPPORT) StartDrag(WebCore::SelectionData selectionData, OptionSet dragOperationMask, WebKit::ShareableBitmap::Handle dragImage) #endif - +- ++#if PLATFORM(WIN) && ENABLE(DRAG_SUPPORT) ++ StartDrag(HashMap> dragDataMap) ++#endif + #if ENABLE(DRAG_SUPPORT) + DidPerformDragOperation(bool handled) + #endif diff --git a/Source/WebKit/UIProcess/WebProcessPool.cpp b/Source/WebKit/UIProcess/WebProcessPool.cpp index 7383e302a7352b6f3b719c84bb531a8b4cd8fea9..a06038e67388689cd11e7ee3082e153bab2d2788 100644 --- a/Source/WebKit/UIProcess/WebProcessPool.cpp @@ -17332,7 +17542,7 @@ index fec0feefd553d6ec22c4d8cddf9a8ec7fe18fddb..8a2889454afaca72b67793d64093560d { if (m_page.activeOpenPanelResultListener()) diff --git a/Source/WebKit/WebProcess/WebCoreSupport/WebDragClient.cpp b/Source/WebKit/WebProcess/WebCoreSupport/WebDragClient.cpp -index 2eb0886f13ed035a53b8eaa60605de4dfe53fbe3..1c22f9d0451b0d09e1955cb5581174a8f650046b 100644 +index 2eb0886f13ed035a53b8eaa60605de4dfe53fbe3..c46393209cb4f80704bbc9268fad4371347d5b30 100644 --- a/Source/WebKit/WebProcess/WebCoreSupport/WebDragClient.cpp +++ b/Source/WebKit/WebProcess/WebCoreSupport/WebDragClient.cpp @@ -29,6 +29,13 @@ @@ -17354,7 +17564,7 @@ index 2eb0886f13ed035a53b8eaa60605de4dfe53fbe3..1c22f9d0451b0d09e1955cb5581174a8 } -#if !PLATFORM(COCOA) && !PLATFORM(GTK) -+#if !PLATFORM(COCOA) && !PLATFORM(GTK) && !PLATFORM(WPE) ++#if !PLATFORM(COCOA) && !PLATFORM(GTK) && !PLATFORM(WPE) && !PLATFORM(WIN) void WebDragClient::startDrag(DragItem, DataTransfer&, Frame&) { } @@ -17376,6 +17586,70 @@ index b0b4f573b051af835f6568427a5fb8459410acf7..5cd875e631ee27a63ad906ac5155cb20 } void WebFrameLoaderClient::didRestoreFromBackForwardCache() +diff --git a/Source/WebKit/WebProcess/WebCoreSupport/win/WebDragClientWin.cpp b/Source/WebKit/WebProcess/WebCoreSupport/win/WebDragClientWin.cpp +new file mode 100644 +index 0000000000000000000000000000000000000000..2606914d22e85affd9b2f71c361c9db3a14da4f3 +--- /dev/null ++++ b/Source/WebKit/WebProcess/WebCoreSupport/win/WebDragClientWin.cpp +@@ -0,0 +1,58 @@ ++/* ++ * Copyright (C) 2011 Igalia S.L. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in the ++ * documentation and/or other materials provided with the distribution. ++ * ++ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' ++ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, ++ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ++ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS ++ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ++ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ++ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS ++ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN ++ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ++ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF ++ * THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++#include "config.h" ++#include "WebDragClient.h" ++ ++#if ENABLE(DRAG_SUPPORT) ++ ++//#include "ArgumentCodersWPE.h" ++#include "ShareableBitmap.h" ++#include "WebPage.h" ++#include "WebPageProxyMessages.h" ++#include ++#include ++#include ++#include ++#include ++ ++//#include ++ ++namespace WebKit { ++using namespace WebCore; ++ ++void WebDragClient::didConcludeEditDrag() ++{ ++} ++ ++void WebDragClient::startDrag(DragItem, DataTransfer& dataTransfer, Frame& frame) ++{ ++ m_page->willStartDrag(); ++ m_page->send(Messages::WebPageProxy::StartDrag(dataTransfer.pasteboard().createDragDataMap())); ++} ++ ++}; // namespace WebKit. ++ ++#endif // ENABLE(DRAG_SUPPORT) diff --git a/Source/WebKit/WebProcess/WebCoreSupport/wpe/WebDragClientWPE.cpp b/Source/WebKit/WebProcess/WebCoreSupport/wpe/WebDragClientWPE.cpp new file mode 100644 index 0000000000000000000000000000000000000000..9b413bb8150a1633d29b6e2606127c9c1d02442b