Title: [202863] trunk/Source/WebCore
Revision
202863
Author
[email protected]
Date
2016-07-06 10:34:19 -0700 (Wed, 06 Jul 2016)

Log Message

Long spin editing text at top of message containing Reader version of web page with many GIFs
https://bugs.webkit.org/show_bug.cgi?id=159444
<rdar://problem/26790386>

Reviewed by Sam Weinig.

* editing/cocoa/HTMLConverter.mm:
(fileWrapperForElement):
Instead of looking up the image's data in the cache by URL, just use the
CachedImage on the HTMLImageElement. There are situations (which seem to involve
cloning the DOM then having the cloned DOM get garbage collected) where the image
can be removed from the cache, but still be live in the document.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (202862 => 202863)


--- trunk/Source/WebCore/ChangeLog	2016-07-06 17:19:20 UTC (rev 202862)
+++ trunk/Source/WebCore/ChangeLog	2016-07-06 17:34:19 UTC (rev 202863)
@@ -1,3 +1,18 @@
+2016-07-06  Tim Horton  <[email protected]>
+
+        Long spin editing text at top of message containing Reader version of web page with many GIFs
+        https://bugs.webkit.org/show_bug.cgi?id=159444
+        <rdar://problem/26790386>
+
+        Reviewed by Sam Weinig.
+
+        * editing/cocoa/HTMLConverter.mm:
+        (fileWrapperForElement):
+        Instead of looking up the image's data in the cache by URL, just use the
+        CachedImage on the HTMLImageElement. There are situations (which seem to involve
+        cloning the DOM then having the cloned DOM get garbage collected) where the image
+        can be removed from the cache, but still be live in the document.
+
 2016-07-06  Brady Eidson  <[email protected]>
 
         Hold RefPtr<>'s to UniqueIDBDatabases while performing user delete.

Modified: trunk/Source/WebCore/editing/cocoa/HTMLConverter.mm (202862 => 202863)


--- trunk/Source/WebCore/editing/cocoa/HTMLConverter.mm	2016-07-06 17:19:20 UTC (rev 202862)
+++ trunk/Source/WebCore/editing/cocoa/HTMLConverter.mm	2016-07-06 17:34:19 UTC (rev 202863)
@@ -317,7 +317,7 @@
 
 #else
 static NSFileWrapper *fileWrapperForURL(DocumentLoader *, NSURL *);
-static NSFileWrapper *fileWrapperForElement(HTMLImageElement&);
+static RetainPtr<NSFileWrapper> fileWrapperForElement(HTMLImageElement&);
 
 @interface NSTextAttachment (WebCoreNSTextAttachment)
 - (void)setIgnoresOrientation:(BOOL)flag;
@@ -2453,24 +2453,24 @@
     return nil;
 }
 
-static NSFileWrapper *fileWrapperForElement(HTMLImageElement& element)
+static RetainPtr<NSFileWrapper> fileWrapperForElement(HTMLImageElement& element)
 {
-    // FIXME: Should this use currentSrc instead of src?
-    auto src = ""
-    NSFileWrapper *wrapper = src.isEmpty() ? nil : fileWrapperForURL(element.document().loader(), src);
+    if (CachedImage* cachedImage = element.cachedImage()) {
+        if (SharedBuffer* sharedBuffer = cachedImage->resourceBuffer())
+            return adoptNS([[NSFileWrapper alloc] initRegularFileWithContents:sharedBuffer->createNSData().get()]);
+    }
 
-    if (!wrapper) {
-        auto* renderer = element.renderer();
-        if (is<RenderImage>(renderer)) {
-            auto* image = downcast<RenderImage>(*renderer).cachedImage();
-            if (image && !image->errorOccurred()) {
-                wrapper = [[[NSFileWrapper alloc] initRegularFileWithContents:(NSData *)image->imageForRenderer(renderer)->getTIFFRepresentation()] autorelease];
-                [wrapper setPreferredFilename:@"image.tiff"];
-            }
+    auto* renderer = element.renderer();
+    if (is<RenderImage>(renderer)) {
+        auto* image = downcast<RenderImage>(*renderer).cachedImage();
+        if (image && !image->errorOccurred()) {
+            RetainPtr<NSFileWrapper> wrapper = adoptNS([[NSFileWrapper alloc] initRegularFileWithContents:(NSData *)image->imageForRenderer(renderer)->getTIFFRepresentation()]);
+            [wrapper setPreferredFilename:@"image.tiff"];
+            return wrapper;
         }
     }
 
-    return wrapper;
+    return nil;
 }
 
 #endif
@@ -2505,8 +2505,8 @@
             if (&startContainer == &endContainer && (startOffset == endOffset - 1)) {
                 Node* node = startContainer.traverseToChildAt(startOffset);
                 if (is<HTMLImageElement>(node)) {
-                    auto fileWrapper = fileWrapperForElement(downcast<HTMLImageElement>(*node));
-                    NSTextAttachment *attachment = [[NSTextAttachment alloc] initWithFileWrapper:fileWrapper];
+                    RetainPtr<NSFileWrapper> fileWrapper = fileWrapperForElement(downcast<HTMLImageElement>(*node));
+                    NSTextAttachment *attachment = [[NSTextAttachment alloc] initWithFileWrapper:fileWrapper.get()];
                     [string appendAttributedString:[NSAttributedString attributedStringWithAttachment:attachment]];
                     [attachment release];
                 }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to