<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[183068] trunk/Source/WebKit2</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/183068">183068</a></dd>
<dt>Author</dt> <dd>timothy_horton@apple.com</dd>
<dt>Date</dt> <dd>2015-04-21 11:01:15 -0700 (Tue, 21 Apr 2015)</dd>
</dl>
<h3>Log Message</h3>
<pre>PDFs still don't snapshot properly in iOS Safari
https://bugs.webkit.org/show_bug.cgi?id=143976
<rdar://problem/18283459>
Reviewed by Anders Carlsson.
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::didLayoutForCustomContentProvider):
* UIProcess/WebPageProxy.h:
* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView _didFinishLoadingDataForCustomContentProviderWithSuggestedFilename:data:]):
Inform the client that we've passed all reasonable layout milestones
as soon as the custom content provider has been handed its data.
WKPDFView, the only custom content provider, synchronously lays out
its subviews upon initial receipt of data, so this works fine for it.
This ensures that clients that normally depend on layout milestones firing
won't break when a custom content view is installed.
(-[WKWebView _snapshotRect:intoImageOfWidth:completionHandler:]):
Fall back to renderInContext: if the custom content view is not parented
when a snapshot is requested.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoaWKWebViewmm">trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebPageProxycpp">trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebPageProxyh">trunk/Source/WebKit2/UIProcess/WebPageProxy.h</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (183067 => 183068)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-04-21 17:57:15 UTC (rev 183067)
+++ trunk/Source/WebKit2/ChangeLog        2015-04-21 18:01:15 UTC (rev 183068)
</span><span class="lines">@@ -1,3 +1,27 @@
</span><ins>+2015-04-21 Timothy Horton <timothy_horton@apple.com>
+
+ PDFs still don't snapshot properly in iOS Safari
+ https://bugs.webkit.org/show_bug.cgi?id=143976
+ <rdar://problem/18283459>
+
+ Reviewed by Anders Carlsson.
+
+ * UIProcess/WebPageProxy.cpp:
+ (WebKit::WebPageProxy::didLayoutForCustomContentProvider):
+ * UIProcess/WebPageProxy.h:
+ * UIProcess/API/Cocoa/WKWebView.mm:
+ (-[WKWebView _didFinishLoadingDataForCustomContentProviderWithSuggestedFilename:data:]):
+ Inform the client that we've passed all reasonable layout milestones
+ as soon as the custom content provider has been handed its data.
+ WKPDFView, the only custom content provider, synchronously lays out
+ its subviews upon initial receipt of data, so this works fine for it.
+ This ensures that clients that normally depend on layout milestones firing
+ won't break when a custom content view is installed.
+
+ (-[WKWebView _snapshotRect:intoImageOfWidth:completionHandler:]):
+ Fall back to renderInContext: if the custom content view is not parented
+ when a snapshot is requested.
+
</ins><span class="cx"> 2015-04-21 Dan Bernstein <mitz@apple.com>
</span><span class="cx">
</span><span class="cx"> Merged WKBackForwardListItem’s Internal category into the class extension in WKBackForwardListItemInternal.h.
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoaWKWebViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm (183067 => 183068)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm        2015-04-21 17:57:15 UTC (rev 183067)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm        2015-04-21 18:01:15 UTC (rev 183068)
</span><span class="lines">@@ -717,6 +717,10 @@
</span><span class="cx"> {
</span><span class="cx"> ASSERT(_customContentView);
</span><span class="cx"> [_customContentView web_setContentProviderData:data suggestedFilename:suggestedFilename];
</span><ins>+
+ // FIXME: It may make more sense for custom content providers to invoke this when they're ready,
+ // because there's no guarantee that all custom content providers will lay out synchronously.
+ _page->didLayoutForCustomContentProvider();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> - (void)_setViewportMetaTagWidth:(float)newWidth
</span><span class="lines">@@ -2637,8 +2641,16 @@
</span><span class="cx"> destinationRect.origin.y = -snapshotRectInContentCoordinates.origin.y * imageScale;
</span><span class="cx"> destinationRect.size.width *= imageScale;
</span><span class="cx"> destinationRect.size.height *= imageScale;
</span><del>- [customContentView drawViewHierarchyInRect:destinationRect afterScreenUpdates:NO];
</del><span class="cx">
</span><ins>+ if ([_customContentView window])
+ [customContentView drawViewHierarchyInRect:destinationRect afterScreenUpdates:NO];
+ else {
+ CGContextRef context = UIGraphicsGetCurrentContext();
+ CGContextTranslateCTM(context, destinationRect.origin.x, destinationRect.origin.y);
+ CGContextScaleCTM(context, imageScale, imageScale);
+ [customContentView.layer renderInContext:context];
+ }
+
</ins><span class="cx"> completionHandler([UIGraphicsGetImageFromCurrentImageContext() CGImage]);
</span><span class="cx">
</span><span class="cx"> UIGraphicsEndImageContext();
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp (183067 => 183068)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp        2015-04-21 17:57:15 UTC (rev 183067)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp        2015-04-21 18:01:15 UTC (rev 183068)
</span><span class="lines">@@ -3072,6 +3072,15 @@
</span><span class="cx"> m_pageClient.didFirstVisuallyNonEmptyLayoutForMainFrame();
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void WebPageProxy::didLayoutForCustomContentProvider()
+{
+ LayoutMilestones milestones = DidFirstLayout | DidFirstVisuallyNonEmptyLayout | DidHitRelevantRepaintedObjectsAreaThreshold;
+ if (m_navigationClient)
+ m_navigationClient->renderingProgressDidChange(*this, milestones, nullptr);
+ else
+ m_loaderClient->didLayout(*this, milestones, nullptr);
+}
+
</ins><span class="cx"> void WebPageProxy::didLayout(uint32_t layoutMilestones, const UserData& userData)
</span><span class="cx"> {
</span><span class="cx"> if (m_navigationClient)
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (183067 => 183068)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h        2015-04-21 17:57:15 UTC (rev 183067)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h        2015-04-21 18:01:15 UTC (rev 183068)
</span><span class="lines">@@ -1031,6 +1031,7 @@
</span><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> void didChangeBackgroundColor();
</span><ins>+ void didLayoutForCustomContentProvider();
</ins><span class="cx">
</span><span class="cx"> private:
</span><span class="cx"> WebPageProxy(PageClient&, WebProcessProxy&, uint64_t pageID, const WebPageConfiguration&);
</span></span></pre>
</div>
</div>
</body>
</html>