Diff
Modified: trunk/Source/WebCore/ChangeLog (231506 => 231507)
--- trunk/Source/WebCore/ChangeLog 2018-05-08 19:42:20 UTC (rev 231506)
+++ trunk/Source/WebCore/ChangeLog 2018-05-08 20:12:24 UTC (rev 231507)
@@ -1,3 +1,31 @@
+2018-05-08 Dean Jackson <[email protected]>
+
+ System Preview links should trigger a download
+ https://bugs.webkit.org/show_bug.cgi?id=185439
+ <rdar://problem/40065545>
+
+ Reviewed by Jon Lee.
+
+ Add a new field to FrameLoadRequest, which then is copied
+ into ResourceRequest, identifying if the link clicked
+ is a system preview.
+
+ * html/HTMLAnchorElement.cpp:
+ (WebCore::HTMLAnchorElement::handleClick): Look for isSystemPreviewLink().
+ * loader/FrameLoadRequest.cpp:
+ (WebCore::FrameLoadRequest::FrameLoadRequest):
+ * loader/FrameLoadRequest.h: New property.
+ (WebCore::FrameLoadRequest::FrameLoadRequest):
+ (WebCore::FrameLoadRequest::isSystemPreview const):
+ * loader/FrameLoader.cpp:
+ (WebCore::FrameLoader::urlSelected):
+ (WebCore::FrameLoader::loadURL):
+ * loader/FrameLoader.h:
+ * platform/network/ResourceRequestBase.cpp:
+ (WebCore::ResourceRequestBase::isSystemPreview const):
+ (WebCore::ResourceRequestBase::setSystemPreview):
+ * platform/network/ResourceRequestBase.h:
+
2018-05-08 Commit Queue <[email protected]>
Unreviewed, rolling out r231491.
Modified: trunk/Source/WebCore/html/HTMLAnchorElement.cpp (231506 => 231507)
--- trunk/Source/WebCore/html/HTMLAnchorElement.cpp 2018-05-08 19:42:20 UTC (rev 231506)
+++ trunk/Source/WebCore/html/HTMLAnchorElement.cpp 2018-05-08 20:12:24 UTC (rev 231507)
@@ -417,9 +417,14 @@
}
#endif
+ bool isSystemPreview = false;
+#if USE(SYSTEM_PREVIEW)
+ isSystemPreview = isSystemPreviewLink();
+#endif
+
ShouldSendReferrer shouldSendReferrer = hasRel(Relation::NoReferrer) ? NeverSendReferrer : MaybeSendReferrer;
auto newFrameOpenerPolicy = hasRel(Relation::NoOpener) ? std::make_optional(NewFrameOpenerPolicy::Suppress) : std::nullopt;
- frame->loader().urlSelected(completedURL, target(), &event, LockHistory::No, LockBackForwardList::No, shouldSendReferrer, document().shouldOpenExternalURLsPolicyToPropagate(), newFrameOpenerPolicy, downloadAttribute);
+ frame->loader().urlSelected(completedURL, target(), &event, LockHistory::No, LockBackForwardList::No, shouldSendReferrer, document().shouldOpenExternalURLsPolicyToPropagate(), newFrameOpenerPolicy, downloadAttribute, isSystemPreview);
sendPings(completedURL);
}
Modified: trunk/Source/WebCore/loader/FrameLoadRequest.cpp (231506 => 231507)
--- trunk/Source/WebCore/loader/FrameLoadRequest.cpp 2018-05-08 19:42:20 UTC (rev 231506)
+++ trunk/Source/WebCore/loader/FrameLoadRequest.cpp 2018-05-08 20:12:24 UTC (rev 231507)
@@ -37,7 +37,7 @@
namespace WebCore {
-FrameLoadRequest::FrameLoadRequest(Document& requester, SecurityOrigin& requesterSecurityOrigin, const ResourceRequest& resourceRequest, const String& frameName, LockHistory lockHistory, LockBackForwardList lockBackForwardList, ShouldSendReferrer shouldSendReferrer, AllowNavigationToInvalidURL allowNavigationToInvalidURL, NewFrameOpenerPolicy newFrameOpenerPolicy, ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy, InitiatedByMainFrame initiatedByMainFrame, ShouldReplaceDocumentIfJavaScriptURL shouldReplaceDocumentIfJavaScriptURL, const AtomicString& downloadAttribute)
+FrameLoadRequest::FrameLoadRequest(Document& requester, SecurityOrigin& requesterSecurityOrigin, const ResourceRequest& resourceRequest, const String& frameName, LockHistory lockHistory, LockBackForwardList lockBackForwardList, ShouldSendReferrer shouldSendReferrer, AllowNavigationToInvalidURL allowNavigationToInvalidURL, NewFrameOpenerPolicy newFrameOpenerPolicy, ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy, InitiatedByMainFrame initiatedByMainFrame, ShouldReplaceDocumentIfJavaScriptURL shouldReplaceDocumentIfJavaScriptURL, const AtomicString& downloadAttribute, bool isSystemPreview)
: m_requester { makeRef(requester) }
, m_requesterSecurityOrigin { makeRef(requesterSecurityOrigin) }
, m_resourceRequest { resourceRequest }
@@ -51,6 +51,7 @@
, m_shouldOpenExternalURLsPolicy { shouldOpenExternalURLsPolicy }
, m_downloadAttribute { downloadAttribute }
, m_initiatedByMainFrame { initiatedByMainFrame }
+ , m_isSystemPreview { isSystemPreview }
{
}
Modified: trunk/Source/WebCore/loader/FrameLoadRequest.h (231506 => 231507)
--- trunk/Source/WebCore/loader/FrameLoadRequest.h 2018-05-08 19:42:20 UTC (rev 231506)
+++ trunk/Source/WebCore/loader/FrameLoadRequest.h 2018-05-08 20:12:24 UTC (rev 231507)
@@ -38,7 +38,7 @@
class FrameLoadRequest {
public:
- WEBCORE_EXPORT FrameLoadRequest(Document&, SecurityOrigin&, const ResourceRequest&, const String& frameName, LockHistory, LockBackForwardList, ShouldSendReferrer, AllowNavigationToInvalidURL, NewFrameOpenerPolicy, ShouldOpenExternalURLsPolicy, InitiatedByMainFrame, ShouldReplaceDocumentIfJavaScriptURL = ReplaceDocumentIfJavaScriptURL, const AtomicString& downloadAttribute = { });
+ WEBCORE_EXPORT FrameLoadRequest(Document&, SecurityOrigin&, const ResourceRequest&, const String& frameName, LockHistory, LockBackForwardList, ShouldSendReferrer, AllowNavigationToInvalidURL, NewFrameOpenerPolicy, ShouldOpenExternalURLsPolicy, InitiatedByMainFrame, ShouldReplaceDocumentIfJavaScriptURL = ReplaceDocumentIfJavaScriptURL, const AtomicString& downloadAttribute = { }, bool isSystemPreview = false);
WEBCORE_EXPORT FrameLoadRequest(Frame&, const ResourceRequest&, ShouldOpenExternalURLsPolicy, const SubstituteData& = SubstituteData());
WEBCORE_EXPORT ~FrameLoadRequest();
@@ -87,6 +87,8 @@
void setIsCrossOriginWindowOpenNavigation(bool value) { m_isCrossOriginWindowOpenNavigation = value; }
bool isCrossOriginWindowOpenNavigation() const { return m_isCrossOriginWindowOpenNavigation; }
+ bool isSystemPreview() const { return m_isSystemPreview; }
+
private:
Ref<Document> m_requester;
Ref<SecurityOrigin> m_requesterSecurityOrigin;
@@ -106,6 +108,7 @@
AtomicString m_downloadAttribute;
InitiatedByMainFrame m_initiatedByMainFrame { InitiatedByMainFrame::Unknown };
bool m_isCrossOriginWindowOpenNavigation { false };
+ bool m_isSystemPreview { false };
};
} // namespace WebCore
Modified: trunk/Source/WebCore/loader/FrameLoader.cpp (231506 => 231507)
--- trunk/Source/WebCore/loader/FrameLoader.cpp 2018-05-08 19:42:20 UTC (rev 231506)
+++ trunk/Source/WebCore/loader/FrameLoader.cpp 2018-05-08 20:12:24 UTC (rev 231507)
@@ -370,13 +370,13 @@
urlSelected(WTFMove(request), nullptr);
}
-void FrameLoader::urlSelected(const URL& url, const String& passedTarget, Event* triggeringEvent, LockHistory lockHistory, LockBackForwardList lockBackForwardList, ShouldSendReferrer shouldSendReferrer, ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy, std::optional<NewFrameOpenerPolicy> openerPolicy, const AtomicString& downloadAttribute)
+void FrameLoader::urlSelected(const URL& url, const String& passedTarget, Event* triggeringEvent, LockHistory lockHistory, LockBackForwardList lockBackForwardList, ShouldSendReferrer shouldSendReferrer, ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy, std::optional<NewFrameOpenerPolicy> openerPolicy, const AtomicString& downloadAttribute, bool isSystemPreview)
{
auto* frame = lexicalFrameFromCommonVM();
auto initiatedByMainFrame = frame && frame->isMainFrame() ? InitiatedByMainFrame::Yes : InitiatedByMainFrame::Unknown;
NewFrameOpenerPolicy newFrameOpenerPolicy = openerPolicy.value_or(shouldSendReferrer == NeverSendReferrer ? NewFrameOpenerPolicy::Suppress : NewFrameOpenerPolicy::Allow);
- urlSelected(FrameLoadRequest(*m_frame.document(), m_frame.document()->securityOrigin(), { url }, passedTarget, lockHistory, lockBackForwardList, shouldSendReferrer, AllowNavigationToInvalidURL::Yes, newFrameOpenerPolicy, shouldOpenExternalURLsPolicy, initiatedByMainFrame, DoNotReplaceDocumentIfJavaScriptURL, downloadAttribute), triggeringEvent);
+ urlSelected(FrameLoadRequest(*m_frame.document(), m_frame.document()->securityOrigin(), { url }, passedTarget, lockHistory, lockBackForwardList, shouldSendReferrer, AllowNavigationToInvalidURL::Yes, newFrameOpenerPolicy, shouldOpenExternalURLsPolicy, initiatedByMainFrame, DoNotReplaceDocumentIfJavaScriptURL, downloadAttribute, isSystemPreview), triggeringEvent);
}
void FrameLoader::urlSelected(FrameLoadRequest&& frameRequest, Event* triggeringEvent)
@@ -1354,8 +1354,9 @@
return;
}
- // must grab this now, since this load may stop the previous load and clear this flag
+ // Must grab this now, since this load may stop the previous load and clear this flag.
bool isRedirect = m_quickRedirectComing;
+ request.setSystemPreview(frameLoadRequest.isSystemPreview());
loadWithNavigationAction(request, action, lockHistory, newLoadType, formState, allowNavigationToInvalidURL, [this, isRedirect, sameURL, newLoadType, protectedFrame = makeRef(m_frame), completionHandler = completionHandlerCaller.release()] {
if (isRedirect) {
m_quickRedirectComing = false;
Modified: trunk/Source/WebCore/loader/FrameLoader.h (231506 => 231507)
--- trunk/Source/WebCore/loader/FrameLoader.h 2018-05-08 19:42:20 UTC (rev 231506)
+++ trunk/Source/WebCore/loader/FrameLoader.h 2018-05-08 20:12:24 UTC (rev 231507)
@@ -121,7 +121,7 @@
unsigned long loadResourceSynchronously(const ResourceRequest&, ClientCredentialPolicy, const FetchOptions&, const HTTPHeaderMap&, ResourceError&, ResourceResponse&, RefPtr<SharedBuffer>& data);
void changeLocation(FrameLoadRequest&&);
- WEBCORE_EXPORT void urlSelected(const URL&, const String& target, Event*, LockHistory, LockBackForwardList, ShouldSendReferrer, ShouldOpenExternalURLsPolicy, std::optional<NewFrameOpenerPolicy> = std::nullopt, const AtomicString& downloadAttribute = nullAtom());
+ WEBCORE_EXPORT void urlSelected(const URL&, const String& target, Event*, LockHistory, LockBackForwardList, ShouldSendReferrer, ShouldOpenExternalURLsPolicy, std::optional<NewFrameOpenerPolicy> = std::nullopt, const AtomicString& downloadAttribute = nullAtom(), bool isSystemPreview = false);
void submitForm(Ref<FormSubmission>&&);
WEBCORE_EXPORT void reload(OptionSet<ReloadOption> = { });
Modified: trunk/Source/WebCore/platform/network/ResourceRequestBase.cpp (231506 => 231507)
--- trunk/Source/WebCore/platform/network/ResourceRequestBase.cpp 2018-05-08 19:42:20 UTC (rev 231506)
+++ trunk/Source/WebCore/platform/network/ResourceRequestBase.cpp 2018-05-08 20:12:24 UTC (rev 231507)
@@ -576,6 +576,16 @@
m_platformRequestUpdated = false;
}
+bool ResourceRequestBase::isSystemPreview() const
+{
+ return m_isSystemPreview;
+}
+
+void ResourceRequestBase::setSystemPreview(bool s)
+{
+ m_isSystemPreview = s;
+}
+
bool equalIgnoringHeaderFields(const ResourceRequestBase& a, const ResourceRequestBase& b)
{
if (a.url() != b.url())
Modified: trunk/Source/WebCore/platform/network/ResourceRequestBase.h (231506 => 231507)
--- trunk/Source/WebCore/platform/network/ResourceRequestBase.h 2018-05-08 19:42:20 UTC (rev 231506)
+++ trunk/Source/WebCore/platform/network/ResourceRequestBase.h 2018-05-08 20:12:24 UTC (rev 231507)
@@ -171,6 +171,9 @@
String initiatorIdentifier() const { return m_initiatorIdentifier; }
void setInitiatorIdentifier(const String& identifier) { m_initiatorIdentifier = identifier; }
+ WEBCORE_EXPORT bool isSystemPreview() const;
+ WEBCORE_EXPORT void setSystemPreview(bool);
+
#if !PLATFORM(COCOA)
bool encodingRequiresPlatformData() const { return true; }
#endif
@@ -230,6 +233,7 @@
Requester m_requester { Requester::Unspecified };
String m_initiatorIdentifier;
String m_cachePartition { emptyString() };
+ bool m_isSystemPreview { false };
private:
const ResourceRequest& asResourceRequest() const;
Modified: trunk/Source/WebKit/ChangeLog (231506 => 231507)
--- trunk/Source/WebKit/ChangeLog 2018-05-08 19:42:20 UTC (rev 231506)
+++ trunk/Source/WebKit/ChangeLog 2018-05-08 20:12:24 UTC (rev 231507)
@@ -1,3 +1,21 @@
+2018-05-08 Dean Jackson <[email protected]>
+
+ System Preview links should trigger a download
+ https://bugs.webkit.org/show_bug.cgi?id=185439
+ <rdar://problem/40065545>
+
+ Reviewed by Jon Lee.
+
+ Encode the new field identifying a system preview. And
+ if you encounter such a resource request, trigger
+ a download.
+
+ * Shared/WebCoreArgumentCoders.cpp:
+ (IPC::ArgumentCoder<ResourceRequest>::encode):
+ (IPC::ArgumentCoder<ResourceRequest>::decode):
+ * UIProcess/WebPageProxy.cpp:
+ (WebKit::WebPageProxy::decidePolicyForNavigationAction):
+
2018-05-08 John Wilander <[email protected]>
Storage Access API: Add a request roundtrip to check whether prompting is needed
Modified: trunk/Source/WebKit/Shared/WebCoreArgumentCoders.cpp (231506 => 231507)
--- trunk/Source/WebKit/Shared/WebCoreArgumentCoders.cpp 2018-05-08 19:42:20 UTC (rev 231506)
+++ trunk/Source/WebKit/Shared/WebCoreArgumentCoders.cpp 2018-05-08 20:12:24 UTC (rev 231507)
@@ -1237,6 +1237,7 @@
{
encoder << resourceRequest.cachePartition();
encoder << resourceRequest.hiddenFromInspector();
+ encoder << resourceRequest.isSystemPreview();
if (resourceRequest.encodingRequiresPlatformData()) {
encoder << true;
@@ -1259,6 +1260,11 @@
return false;
resourceRequest.setHiddenFromInspector(isHiddenFromInspector);
+ bool isSystemPreview;
+ if (!decoder.decode(isSystemPreview))
+ return false;
+ resourceRequest.setSystemPreview(isSystemPreview);
+
bool hasPlatformData;
if (!decoder.decode(hasPlatformData))
return false;
Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (231506 => 231507)
--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp 2018-05-08 19:42:20 UTC (rev 231506)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp 2018-05-08 20:12:24 UTC (rev 231507)
@@ -3961,7 +3961,7 @@
uint64_t newNavigationID = navigation->navigationID();
navigation->setWasUserInitiated(!!navigationActionData.userGestureTokenIdentifier);
- navigation->setShouldForceDownload(!navigationActionData.downloadAttribute.isNull());
+ navigation->setShouldForceDownload(!navigationActionData.downloadAttribute.isNull() || request.isSystemPreview());
navigation->setCurrentRequest(ResourceRequest(request), m_process->coreProcessIdentifier());
navigation->setCurrentRequestIsRedirect(navigationActionData.isRedirect);
navigation->setTreatAsSameOriginNavigation(navigationActionData.treatAsSameOriginNavigation);