--- old/modules/javafx.web/src/main/java/com/sun/javafx/webkit/PasteboardImpl.java 2017-10-17 14:01:47.911103424 +0530 +++ new/modules/javafx.web/src/main/java/com/sun/javafx/webkit/PasteboardImpl.java 2017-10-17 14:01:47.174735423 +0530 @@ -66,7 +66,7 @@ clipboard.setContent(content); } - @Override public void writeImage(WCImageFrame wcImage) { + @Override public void writeImage(WCImageFrame wcImage, String fileExt) { Object platformImage = WCGraphicsManager.getGraphicsManager(). toPlatformImage(wcImage.getFrame()); Image fxImage = Toolkit.getImageAccessor().fromPlatformImage(platformImage); @@ -74,10 +74,10 @@ ClipboardContent content = new ClipboardContent(); content.putImage(fxImage); try { - File imageDump = File.createTempFile("jfx", ".png"); + File imageDump = File.createTempFile("jfx", "." + fileExt); imageDump.deleteOnExit(); ImageIO.write(UIClientImpl.toBufferedImage(fxImage), - "png", + fileExt, imageDump); content.putFiles(Arrays.asList(imageDump)); } catch (IOException | SecurityException e) { --- old/modules/javafx.web/src/main/java/com/sun/javafx/webkit/UIClientImpl.java 2017-10-17 14:01:50.564429425 +0530 +++ new/modules/javafx.web/src/main/java/com/sun/javafx/webkit/UIClientImpl.java 2017-10-17 14:01:49.051673425 +0530 @@ -312,7 +312,8 @@ @Override public void startDrag(WCImage image, int imageOffsetX, int imageOffsetY, int eventPosX, int eventPosY, - String[] mimeTypes, Object[] values, boolean isImageSource + String[] mimeTypes, Object[] values, + boolean isImageSource, String imageFileExt ){ content = new ClipboardContent(); for (int i = 0; i < mimeTypes.length; ++i) if (values[i] != null) { @@ -351,7 +352,7 @@ image.getPlatformImage() : null; if (platformImage != null) { try { - File temp = File.createTempFile("jfx", ".png"); + File temp = File.createTempFile("jfx", "." + imageFileExt); temp.deleteOnExit(); ImageIO.write( toBufferedImage(Toolkit.getImageAccessor().fromPlatformImage( @@ -359,7 +360,7 @@ platformImage ) )), - "png", + imageFileExt, temp); content.put(DataFormat.FILES, Arrays.asList(temp)); } catch (IOException | SecurityException e) { --- old/modules/javafx.web/src/main/java/com/sun/javafx/webkit/drt/UIClientImpl.java 2017-10-17 14:01:52.961627424 +0530 +++ new/modules/javafx.web/src/main/java/com/sun/javafx/webkit/drt/UIClientImpl.java 2017-10-17 14:01:52.193243426 +0530 @@ -179,7 +179,8 @@ */ @Override public void startDrag(WCImage frame, int imageOffsetX, int imageOffsetY, - int eventPosX, int eventPosY, String[] mimeTypes, Object[] values, boolean isImageSource) + int eventPosX, int eventPosY, String[] mimeTypes, Object[] values, + boolean isImageSource, String imageFileExt) { throw new UnsupportedOperationException("Not supported yet"); } --- old/modules/javafx.web/src/main/java/com/sun/webkit/Pasteboard.java 2017-10-17 14:01:55.158725424 +0530 +++ new/modules/javafx.web/src/main/java/com/sun/webkit/Pasteboard.java 2017-10-17 14:01:54.238265425 +0530 @@ -32,6 +32,6 @@ public String getHtml(); public void writePlainText(String text); public void writeSelection(boolean canSmartCopyOrDelete, String text, String html); - public void writeImage(WCImageFrame img); + public void writeImage(WCImageFrame img, String fileExt); public void writeUrl(String url, String markup); } --- old/modules/javafx.web/src/main/java/com/sun/webkit/UIClient.java 2017-10-17 14:01:57.279785424 +0530 +++ new/modules/javafx.web/src/main/java/com/sun/webkit/UIClient.java 2017-10-17 14:01:56.567429424 +0530 @@ -51,7 +51,7 @@ int imageOffsetX, int imageOffsetY, int eventPosX, int eventPosY, String[] mimeTypes, Object[] values, - boolean isImageSource); + boolean isImageSource, String imageFileExt); public void confirmStartDrag(); public boolean isDragConfirmed(); } --- old/modules/javafx.web/src/main/java/com/sun/webkit/WCPasteboard.java 2017-10-17 14:01:59.012651424 +0530 +++ new/modules/javafx.web/src/main/java/com/sun/webkit/WCPasteboard.java 2017-10-17 14:01:58.384337425 +0530 @@ -66,9 +66,9 @@ pasteboard.writeSelection(canSmartCopyOrDelete, text, html); } - private static void writeImage(WCImageFrame img) { - log.log(Level.FINE, "writeImage(): img = {0}", new Object[] {img}); - pasteboard.writeImage(img); + private static void writeImage(WCImageFrame img, String fileExt) { + log.log(Level.FINE, "writeImage(): img = {0},\n fileType = {1}\n", new Object[] {img, fileExt}); + pasteboard.writeImage(img, fileExt); } private static void writeUrl(String url, String markup) { --- old/modules/javafx.web/src/main/java/com/sun/webkit/WebPage.java 2017-10-17 14:02:01.405847425 +0530 +++ new/modules/javafx.web/src/main/java/com/sun/webkit/WebPage.java 2017-10-17 14:02:00.581435424 +0530 @@ -2263,7 +2263,7 @@ int imageOffsetX, int imageOffsetY, int eventPosX, int eventPosY, String[] mimeTypes, Object[] values, - boolean isImageSource) + boolean isImageSource, String imageFileExt) { log.log(Level.FINER, "Start drag: "); if (uiClient != null) { @@ -2272,7 +2272,7 @@ imageOffsetX, imageOffsetY, eventPosX, eventPosY, mimeTypes, values, - isImageSource); + isImageSource, imageFileExt); } } --- old/modules/javafx.web/src/main/native/Source/WebCore/page/DragClient.h 2017-10-17 14:02:03.278783424 +0530 +++ new/modules/javafx.web/src/main/native/Source/WebCore/page/DragClient.h 2017-10-17 14:02:02.682485424 +0530 @@ -58,6 +58,9 @@ virtual void declareAndWriteAttachment(const String&, Element&, const URL&, const String&, Frame*) { } #endif #endif +#if PLATFORM(JAVA) + virtual void updateFileExtension(const URL&) { } +#endif virtual ~DragClient() { } }; --- old/modules/javafx.web/src/main/native/Source/WebCore/page/DragController.cpp 2017-10-17 14:02:05.491889425 +0530 +++ new/modules/javafx.web/src/main/native/Source/WebCore/page/DragController.cpp 2017-10-17 14:02:04.619453424 +0530 @@ -870,6 +870,9 @@ // We shouldn't be starting a drag for an image that can't provide an extension. // This is an early detection for problems encountered later upon drop. ASSERT(!image->filenameExtension().isEmpty()); +#if PLATFORM(JAVA) + m_client.updateFileExtension(imageURL); +#endif if (!dataTransfer.pasteboard().hasData()) { m_draggingImageURL = imageURL; if (element.isContentRichlyEditable()) --- old/modules/javafx.web/src/main/native/Source/WebCore/platform/java/DragClientJava.cpp 2017-10-17 14:02:07.200743424 +0530 +++ new/modules/javafx.web/src/main/native/Source/WebCore/platform/java/DragClientJava.cpp 2017-10-17 14:02:06.456371424 +0530 @@ -145,6 +145,7 @@ "[Ljava/lang/String;" "[Ljava/lang/Object;" "Z" + "Ljava/lang/String;" ")V"); ASSERT(mid); @@ -199,8 +200,27 @@ eventPos.y(), jobjectArray(jmimeTypes), jobjectArray(jvalues), - bool_to_jbool(isImageSource)); + bool_to_jbool(isImageSource), + (jstring)m_fileExt.toJavaString(env)); CheckAndClearException(env); } +void DragClientJava::updateFileExtension(const URL& imageURL) +{ + if (imageURL.isNull() || imageURL.isEmpty()) { + m_fileExt = emptyString(); + return; + } + + String lastPathComponent = imageURL.lastPathComponent(); + String extension; + size_t dotOffset = lastPathComponent.reverseFind('.'); + if (dotOffset != notFound) + extension = lastPathComponent.substring(dotOffset + 1); + else + extension = "png"; // Fallback to png if image does not have an extension + + m_fileExt = extension; +} + } // namespace WebCore --- old/modules/javafx.web/src/main/native/Source/WebCore/platform/java/DragClientJava.h 2017-10-17 14:02:09.021653426 +0530 +++ new/modules/javafx.web/src/main/native/Source/WebCore/platform/java/DragClientJava.h 2017-10-17 14:02:08.289287424 +0530 @@ -34,8 +34,10 @@ void startDrag(DragImage, const IntPoint& dragImageOrigin, const IntPoint& eventPos, const FloatPoint& dragImageAnchor, DataTransfer&, Frame&, DragSourceAction) override; void dragControllerDestroyed() override; + void updateFileExtension(const URL&) override; private: JGObject m_webPage; + String m_fileExt; }; } // namespace WebCore --- old/modules/javafx.web/src/main/native/Source/WebCore/platform/java/PasteboardJava.cpp 2017-10-17 14:02:11.254769424 +0530 +++ new/modules/javafx.web/src/main/native/Source/WebCore/platform/java/PasteboardJava.cpp 2017-10-17 14:02:10.534409425 +0530 @@ -107,10 +107,12 @@ (jstring)markup.toJavaString(env)); } -void jWriteImage(const Image& image) +void jWriteImage(const Image& image, const String& fileType) { - DEFINE_PB_STATIC_METHOD("writeImage", "(Lcom/sun/webkit/graphics/WCImageFrame;)V"); - CALL_PB_STATIC_VOID_METHOD(jobject(*const_cast(image).javaImage())); + DEFINE_PB_STATIC_METHOD("writeImage", "(Lcom/sun/webkit/graphics/WCImageFrame;Ljava/lang/String;)V"); + CALL_PB_STATIC_VOID_METHOD( + jobject(*const_cast(image).javaImage()), + (jstring)fileType.toJavaString(env)); } void jWriteURL(const String& url, const String& markup) @@ -324,13 +326,14 @@ // Write the bytes of the image to the file format writeImageToDataObject(m_dataObject, node, url); - + AtomicString imageURL = node.getAttribute(HTMLNames::srcAttr); + URL fullURL; if (!imageURL.isEmpty()) { - String fullURL = node.document().completeURL(stripLeadingAndTrailingHTMLSpaces(imageURL)); + fullURL = node.document().completeURL(stripLeadingAndTrailingHTMLSpaces(imageURL)); if (!fullURL.isEmpty()) { m_dataObject->setHTML( - imageToMarkup(fullURL, node), + imageToMarkup(fullURL.string(), node), node.document().url()); } } @@ -353,7 +356,15 @@ jWriteURL(url.string(), createMarkup(node)); } else { - jWriteImage(*image); + String lastPathComponent = fullURL.lastPathComponent(); + String extension; + size_t dotOffset = lastPathComponent.reverseFind('.'); + if (dotOffset != notFound) + extension = lastPathComponent.substring(dotOffset + 1); + else + extension = "png"; + + jWriteImage(*image, extension); } } }