WebKit Bugzilla
Attachment 347690 Details for
Bug 171100
: Implement the Web Share API
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-171100-20180821140939.patch (text/plain), 69.89 KB, created by
Olivia Barnett
on 2018-08-21 14:09:40 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Olivia Barnett
Created:
2018-08-21 14:09:40 PDT
Size:
69.89 KB
patch
obsolete
>Subversion Revision: 235092 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 9d5c8f7cd8e88e5402f5c8346313e2e1d95915aa..da8228a99dcfeced4b9328d091de4c967447f0ce 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,50 @@ >+2018-08-21 Olivia Barnett <obarnett@apple.com> >+ >+ Implement the Web Share API >+ https://bugs.webkit.org/show_bug.cgi?id=171100 >+ <rdar://problem/31751734> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ No new tests (OOPS!). >+ >+ * DerivedSources.make: >+ * Sources.txt: >+ * WebCore.xcodeproj/project.pbxproj: >+ * features.json: >+ * loader/EmptyClients.cpp: >+ (WebCore::EmptyChromeClient::runShareSheet): >+ * loader/EmptyClients.h: >+ Added empty runShareSheet function. >+ >+ * page/Chrome.cpp: >+ (WebCore::Chrome::runShareSheet): >+ * page/Chrome.h: >+ Added call to runShareSheet on client. >+ >+ * page/ChromeClient.h: >+ Virtual runShareSheet function. >+ >+ * page/Navigator.cpp: >+ (WebCore::Navigator::share): >+ * page/Navigator.h: >+ Share function that returns a promise and invokes the share sheet. >+ >+ * page/Navigator.idl: >+ Implements NavigatorShare >+ >+ * page/NavigatorShare.idl: Added. >+ Added definition of share function returning a promise. >+ >+ * page/RuntimeEnabledFeatures.h: >+ (WebCore::RuntimeEnabledFeatures::setWebShareEnabled): >+ (WebCore::RuntimeEnabledFeatures::webShareEnabled const): >+ Added RuntimeEnabledFeature switch. >+ >+ * page/ShareData.h: Added. >+ * page/ShareData.idl: Added. >+ Definition of ShareData struct. >+ > 2018-08-20 David Kilzer <ddkilzer@apple.com> > > REGRESSION (r223192): Remove invalid `path` for Modules/geolocation/ios folder >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index 7ab364a65b01bfbf9ea342601135fa8f192c898a..f6099bc6e55de0e2fbb632041131df00c7f48434 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,79 @@ >+2018-08-21 Olivia Barnett <obarnett@apple.com> >+ >+ Implement the Web Share API >+ https://bugs.webkit.org/show_bug.cgi?id=171100 >+ <rdar://problem/31751734> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * Scripts/webkit/messages.py: >+ * Shared/WebCoreArgumentCoders.cpp: >+ (IPC::ArgumentCoder<ShareData>::encode): >+ (IPC::ArgumentCoder<ShareData>::decode): >+ (IPC::ArgumentCoder<ShareDataWithParsedURL>::encode): >+ (IPC::ArgumentCoder<ShareDataWithParsedURL>::decode): >+ * Shared/WebCoreArgumentCoders.h: >+ Added encoding and decoding functionality for new structs. >+ >+ * Shared/WebPreferences.yaml: >+ * UIProcess/API/C/WKPreferences.cpp: >+ (WKPreferencesSetWebShareEnabled): >+ (WKPreferencesGetWebShareEnabled): >+ * UIProcess/API/C/WKPreferencesRefPrivate.h: >+ Added switch for RuntimeEnabledFeature. >+ >+ * UIProcess/PageClient.h: >+ (WebKit::PageClient::handleRunShareSheet): >+ Page client call to invoke share sheet. >+ >+ * UIProcess/WebPageProxy.cpp: >+ (WebKit::WebPageProxy::runShareSheet): >+ * UIProcess/WebPageProxy.h: >+ * UIProcess/WebPageProxy.messages.in: >+ Web page proxy handling of call to invoke share sheet. >+ Creates completion handler to send to WKShareSheet.mm >+ Completion handler sends message to WebPage with message id. >+ >+ * UIProcess/ios/PageClientImplIOS.h: >+ * UIProcess/ios/PageClientImplIOS.mm: >+ (WebKit::PageClientImpl::handleRunShareSheet): >+ Page client implementation call to invoke share sheet. >+ >+ * UIProcess/ios/WKContentViewInteraction.h: >+ * UIProcess/ios/WKContentViewInteraction.mm: >+ (-[WKContentView cleanupInteraction]): >+ (-[WKContentView _showShareSheet:completionHandler:]): >+ (-[WKContentView shareSheetDidDismiss:]): >+ Call to WKShareSheet to invoke the share sheet and callback. >+ >+ * UIProcess/ios/forms/WKShareSheet.h: Added. >+ * UIProcess/ios/forms/WKShareSheet.mm: Added. >+ (-[WKShareSheet initWithView:]): >+ (-[WKShareSheet presentWithParameters:completionHandler:]): >+ (-[WKShareSheet _dispatchDidDismiss]): >+ (-[WKShareSheet _cancel]): >+ (-[WKShareSheet dismiss]): >+ (-[WKShareSheet _dismissDisplayAnimated:]): >+ (-[WKShareSheet _presentFullscreenViewController:animated:]): >+ Completion handler call and creation of share sheet with parameters. >+ >+ * WebKit.xcodeproj/project.pbxproj: >+ >+ * WebProcess/WebCoreSupport/WebChromeClient.cpp: >+ (WebKit::WebChromeClient::runShareSheet): >+ Call to page to invoke share sheet. >+ >+ * WebProcess/WebCoreSupport/WebChromeClient.h: >+ * WebProcess/WebPage/WebPage.cpp: >+ (WebKit::nextShareSheetContextId): >+ (WebKit::WebPage::runShareSheet): >+ (WebKit::WebPage::runShareSheetResponse): >+ WebPage calls proxy and saves context id for promise. >+ >+ * WebProcess/WebPage/WebPage.h: >+ * WebProcess/WebPage/WebPage.messages.in: >+ Callback for completed response. >+ > 2018-08-20 Tim Horton <timothy_horton@apple.com> > > Fix the iOSMac build with unified sources >diff --git a/Source/WebKitLegacy/ios/ChangeLog b/Source/WebKitLegacy/ios/ChangeLog >index 2fe7fe9fbdd0bda3eb6e3971d1c243406736fef8..dec03e8738d365f47321116dd4a35902d3b38aca 100644 >--- a/Source/WebKitLegacy/ios/ChangeLog >+++ b/Source/WebKitLegacy/ios/ChangeLog >@@ -1,3 +1,16 @@ >+2018-08-21 Olivia Barnett <obarnett@apple.com> >+ >+ Implement the Web Share API >+ https://bugs.webkit.org/show_bug.cgi?id=171100 >+ <rdar://problem/31751734> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * WebCoreSupport/WebChromeClientIOS.h: >+ * WebCoreSupport/WebChromeClientIOS.mm: >+ (WebChromeClientIOS::runShareSheet): >+ Empty declaration of runShareSheet. >+ > 2018-08-16 Ryosuke Niwa <rniwa@webkit.org> > > Replace canBubble and cancelable booleans in Event by enum classes >diff --git a/Source/WebKitLegacy/mac/ChangeLog b/Source/WebKitLegacy/mac/ChangeLog >index 98581661ba40994932aab0d77b0c4a274a97f6cd..75138be552b294c0ee8244563e22fde19d500535 100644 >--- a/Source/WebKitLegacy/mac/ChangeLog >+++ b/Source/WebKitLegacy/mac/ChangeLog >@@ -1,3 +1,25 @@ >+2018-08-21 Olivia Barnett <obarnett@apple.com> >+ >+ Implement the Web Share API >+ https://bugs.webkit.org/show_bug.cgi?id=171100 >+ <rdar://problem/31751734> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * WebCoreSupport/WebChromeClient.h: >+ * WebCoreSupport/WebChromeClient.mm: >+ (WebChromeClient::runShareSheet): >+ Empty declaration of runShareSheet. >+ >+ * WebView/WebPreferenceKeysPrivate.h: >+ * WebView/WebPreferences.mm: >+ (-[WebPreferences webShareEnabled]): >+ (-[WebPreferences setWebShareEnabled:]): >+ * WebView/WebPreferencesPrivate.h: >+ * WebView/WebView.mm: >+ (-[WebView _preferencesChanged:]): >+ Set up for RuntimeEnabledFeature switch. >+ > 2018-08-17 Alex Christensen <achristensen@webkit.org> > > Add some plumbing for safe browsing >diff --git a/Source/WebCore/DerivedSources.make b/Source/WebCore/DerivedSources.make >index 6c9b2ce6b61c0059d69e7a99460aa70aec8c0a4d..46681f9daf9a75e640fdd1d2aab1a5a57210cc8f 100644 >--- a/Source/WebCore/DerivedSources.make >+++ b/Source/WebCore/DerivedSources.make >@@ -776,6 +776,8 @@ JS_BINDING_IDLS = \ > $(WebCore)/page/NavigatorID.idl \ > $(WebCore)/page/NavigatorLanguage.idl \ > $(WebCore)/page/NavigatorOnLine.idl \ >+ $(WebCore)/page/NavigatorShare.idl \ >+ $(WebCore)/page/ShareData.idl \ > $(WebCore)/page/NavigatorServiceWorker.idl \ > $(WebCore)/page/Performance.idl \ > $(WebCore)/page/PerformanceEntry.idl \ >diff --git a/Source/WebCore/Sources.txt b/Source/WebCore/Sources.txt >index f0ef78610dd046b367272c05aac6744585c938a2..8fe97a704c389d0a53e5f2dde8402ee6afddd272 100644 >--- a/Source/WebCore/Sources.txt >+++ b/Source/WebCore/Sources.txt >@@ -2781,6 +2781,8 @@ JSNavigatorLanguage.cpp > JSNavigatorMediaCapabilities.cpp > JSNavigatorMediaDevices.cpp > JSNavigatorOnLine.cpp >+JSNavigatorShare.cpp >+JSShareData.cpp > JSNavigatorServiceWorker.cpp > JSNavigatorUserMedia.cpp > JSNavigatorWebDriver.cpp >diff --git a/Source/WebCore/WebCore.xcodeproj/project.pbxproj b/Source/WebCore/WebCore.xcodeproj/project.pbxproj >index b39dab551141f3219ddf8db21318ea6406a62db7..18510cdd257be6fc6277482431ce337629737a7b 100644 >--- a/Source/WebCore/WebCore.xcodeproj/project.pbxproj >+++ b/Source/WebCore/WebCore.xcodeproj/project.pbxproj >@@ -642,6 +642,7 @@ > 1CAF34830A6C405200ABE06E /* WebScriptObjectPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1CAF34800A6C405200ABE06E /* WebScriptObjectPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; }; > 1CCDF5BE1990332400BCEBAD /* SVGToOTFFontConversion.h in Headers */ = {isa = PBXBuildFile; fileRef = 1CCDF5BC1990332400BCEBAD /* SVGToOTFFontConversion.h */; }; > 1CFAE3230A6D6A3F0032593D /* libobjc.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 1CFAE3220A6D6A3F0032593D /* libobjc.dylib */; }; >+ 1D9F0FC12122029B005D8FD4 /* ShareData.h in Headers */ = {isa = PBXBuildFile; fileRef = 1DC55400211BA8C8004B780E /* ShareData.h */; settings = {ATTRIBUTES = (Private, ); }; }; > 1F36EA9C1E21BA1700621E25 /* WebBackgroundTaskController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F36EA9A1E21BA1700621E25 /* WebBackgroundTaskController.h */; settings = {ATTRIBUTES = (Private, ); }; }; > 1F3C3BEB135CAF3C00B8C1AC /* MediaControls.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F3C3BE9135CAF3C00B8C1AC /* MediaControls.h */; }; > 1F72BF0B187FD45C0009BCB3 /* TileControllerMemoryHandlerIOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F72BF09187FD4270009BCB3 /* TileControllerMemoryHandlerIOS.h */; settings = {ATTRIBUTES = (Private, ); }; }; >@@ -6323,6 +6324,9 @@ > 1CDD45E50BA9C84600F90147 /* WebCore.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = WebCore.xcconfig; sourceTree = "<group>"; }; > 1CDD45E60BA9C84600F90147 /* Base.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Base.xcconfig; sourceTree = "<group>"; }; > 1CFAE3220A6D6A3F0032593D /* libobjc.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libobjc.dylib; path = /usr/lib/libobjc.dylib; sourceTree = "<absolute>"; }; >+ 1DC553FD211BA12A004B780E /* NavigatorShare.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = NavigatorShare.idl; sourceTree = "<group>"; }; >+ 1DC553FF211BA841004B780E /* ShareData.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ShareData.idl; sourceTree = "<group>"; }; >+ 1DC55400211BA8C8004B780E /* ShareData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShareData.h; sourceTree = "<group>"; }; > 1F36EA9A1E21BA1700621E25 /* WebBackgroundTaskController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebBackgroundTaskController.h; sourceTree = "<group>"; }; > 1F36EA9B1E21BA1700621E25 /* WebBackgroundTaskController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebBackgroundTaskController.mm; sourceTree = "<group>"; }; > 1F3C3BE8135CAF3C00B8C1AC /* MediaControls.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaControls.cpp; sourceTree = "<group>"; }; >@@ -19402,6 +19406,7 @@ > 7C5BEA3B1E9EE77100CC517B /* NavigatorLanguage.idl */, > 7C5BEA3C1E9EE77100CC517B /* NavigatorOnLine.idl */, > 5182C24B1F313AE00059BA7C /* NavigatorServiceWorker.idl */, >+ 1DC553FD211BA12A004B780E /* NavigatorShare.idl */, > 00146288103CD1DE000B20DB /* OriginAccessEntry.cpp */, > 00146289103CD1DE000B20DB /* OriginAccessEntry.h */, > 65FEA86809833ADE00BED4AB /* Page.cpp */, >@@ -19492,6 +19497,8 @@ > 7CC6609B1F93057900D500E9 /* SettingsBase.cpp */, > 7CC660991F93057800D500E9 /* SettingsBase.h */, > 7C6EFEEA1F946A2E00FFAD41 /* SettingsDefaultValues.h */, >+ 1DC55400211BA8C8004B780E /* ShareData.h */, >+ 1DC553FF211BA841004B780E /* ShareData.idl */, > 5C688AA21D38126F000B54FA /* SocketProvider.cpp */, > 5C7C88D71D0F1F2B009D2F6D /* SocketProvider.h */, > 626CDE0C1140424C001E5A68 /* SpatialNavigation.cpp */, >@@ -30297,6 +30304,7 @@ > FD45A95B175D41EE00C21EC8 /* ShapeInterval.h in Headers */, > FD45A952175D3F3E00C21EC8 /* ShapeOutsideInfo.h in Headers */, > FD1AF1501656F15100C6D4F7 /* ShapeValue.h in Headers */, >+ 1D9F0FC12122029B005D8FD4 /* ShareData.h in Headers */, > 1A4A954E0B4EDCCB002D8C3C /* SharedBuffer.h in Headers */, > 834DFAD01F7DAE5D00C2725B /* SharedStringHash.h in Headers */, > 93309EA3099EB78C0056E581 /* SharedTimer.h in Headers */, >diff --git a/Source/WebCore/features.json b/Source/WebCore/features.json >index 335558643bf5a3cfddd2342181352687651333e9..901eb2d0d2ee92220d7a6632a8bb617fbfd591d5 100644 >--- a/Source/WebCore/features.json >+++ b/Source/WebCore/features.json >@@ -1220,7 +1220,7 @@ > { > "name": "Web Share", > "status": { >- "status": "Under Consideration" >+ "status": "In Development" > }, > "url": "https://github.com/WICG/web-share/blob/master/docs/interface.md", > "webkit-url": "https://bugs.webkit.org/show_bug.cgi?id=171100", >diff --git a/Source/WebCore/loader/EmptyClients.cpp b/Source/WebCore/loader/EmptyClients.cpp >index 2f2fb08aaa3a15bb413038f443254a9e483e7353..2f225696e7a7db209891d12f18134d85945430bd 100644 >--- a/Source/WebCore/loader/EmptyClients.cpp >+++ b/Source/WebCore/loader/EmptyClients.cpp >@@ -436,6 +436,10 @@ std::unique_ptr<DataListSuggestionPicker> EmptyChromeClient::createDataListSugge > void EmptyChromeClient::runOpenPanel(Frame&, FileChooser&) > { > } >+ >+void EmptyChromeClient::runShareSheet(Frame&, ShareDataWithParsedURL&, CompletionHandler<void(bool)>&&) >+{ >+} > > PAL::SessionID EmptyFrameLoaderClient::sessionID() const > { >diff --git a/Source/WebCore/loader/EmptyClients.h b/Source/WebCore/loader/EmptyClients.h >index 9d052b0b9523fbc846693f22dc5fc78aa380765c..33a13f9a65f02374a379f263367d69ffd6cf15ac 100644 >--- a/Source/WebCore/loader/EmptyClients.h >+++ b/Source/WebCore/loader/EmptyClients.h >@@ -137,6 +137,7 @@ class EmptyChromeClient : public ChromeClient { > #endif > > void runOpenPanel(Frame&, FileChooser&) final; >+ void runShareSheet(Frame&, ShareDataWithParsedURL&, CompletionHandler<void(bool)>&&) final; > void loadIconForFiles(const Vector<String>&, FileIconLoader&) final { } > > void elementDidFocus(Element&) final { } >diff --git a/Source/WebCore/page/Chrome.cpp b/Source/WebCore/page/Chrome.cpp >index 1331cb1236c103a142fc5c19a5ee938f0979a4f7..2579b37e8306690ef49e44c2e3df92e75d420f86 100644 >--- a/Source/WebCore/page/Chrome.cpp >+++ b/Source/WebCore/page/Chrome.cpp >@@ -46,6 +46,7 @@ > #include "RenderObject.h" > #include "ResourceHandle.h" > #include "Settings.h" >+#include "ShareData.h" > #include "StorageNamespace.h" > #include "WindowFeatures.h" > #include <JavaScriptCore/VM.h> >@@ -449,6 +450,11 @@ void Chrome::runOpenPanel(Frame& frame, FileChooser& fileChooser) > m_client.runOpenPanel(frame, fileChooser); > } > >+void Chrome::runShareSheet(Frame& frame, ShareDataWithParsedURL& shareData, CompletionHandler<void(bool)>&& callback) >+{ >+ m_client.runShareSheet(frame, shareData, WTFMove(callback)); >+} >+ > void Chrome::loadIconForFiles(const Vector<String>& filenames, FileIconLoader& loader) > { > m_client.loadIconForFiles(filenames, loader); >diff --git a/Source/WebCore/page/Chrome.h b/Source/WebCore/page/Chrome.h >index ccbce93556ea94b5c110c5dc357c35d98831a9ff..00a5b29404b4523f252e86e784a37dce03d27e9f 100644 >--- a/Source/WebCore/page/Chrome.h >+++ b/Source/WebCore/page/Chrome.h >@@ -58,6 +58,7 @@ class PopupMenuClient; > class PopupOpeningObserver; > class SearchPopupMenu; > >+struct ShareDataWithParsedURL; > struct DateTimeChooserParameters; > struct ViewportArguments; > struct WindowFeatures; >@@ -159,6 +160,7 @@ public: > #endif > > void runOpenPanel(Frame&, FileChooser&); >+ void runShareSheet(Frame&, ShareDataWithParsedURL&, CompletionHandler<void(bool)>&&); > void loadIconForFiles(const Vector<String>&, FileIconLoader&); > > void dispatchDisabledAdaptationsDidChange(const OptionSet<DisabledAdaptations>&) const; >diff --git a/Source/WebCore/page/ChromeClient.h b/Source/WebCore/page/ChromeClient.h >index 472b6183fc7bc2dbffbea0a59735e7cab0f50ce9..051ea41568f9a1930c5bbdfe6d3f17fb60f90304 100644 >--- a/Source/WebCore/page/ChromeClient.h >+++ b/Source/WebCore/page/ChromeClient.h >@@ -103,6 +103,7 @@ struct DateTimeChooserParameters; > struct GraphicsDeviceAdapter; > struct ViewportArguments; > struct WindowFeatures; >+struct ShareDataWithParsedURL; > > enum class RouteSharingPolicy; > >@@ -282,6 +283,8 @@ public: > #endif > > virtual void runOpenPanel(Frame&, FileChooser&) = 0; >+ virtual void runShareSheet(Frame&, ShareDataWithParsedURL&, WTF::CompletionHandler<void(bool)>&& callback) { callback(false); } >+ > // Asynchronous request to load an icon for specified filenames. > virtual void loadIconForFiles(const Vector<String>&, FileIconLoader&) = 0; > >diff --git a/Source/WebCore/page/Navigator.cpp b/Source/WebCore/page/Navigator.cpp >index 78098006b72bc17a6d159fd2ad18dc7f773b659c..5a5dc752c4ac4ee6959195bba945866d5a270966 100644 >--- a/Source/WebCore/page/Navigator.cpp >+++ b/Source/WebCore/page/Navigator.cpp >@@ -23,6 +23,7 @@ > #include "config.h" > #include "Navigator.h" > >+#include "Chrome.h" > #include "CookieJar.h" > #include "DOMMimeTypeArray.h" > #include "DOMPluginArray.h" >@@ -31,6 +32,7 @@ > #include "FrameLoader.h" > #include "FrameLoaderClient.h" > #include "Geolocation.h" >+#include "JSDOMPromiseDeferred.h" > #include "LoaderStrategy.h" > #include "Page.h" > #include "PlatformStrategies.h" >@@ -40,6 +42,7 @@ > #include "Settings.h" > #include <wtf/Language.h> > #include <wtf/StdLibExtras.h> >+#include <wtf/WeakPtr.h> > > > namespace WebCore { >@@ -94,6 +97,35 @@ bool Navigator::onLine() const > return platformStrategies()->loaderStrategy()->isOnLine(); > } > >+void Navigator::share(ScriptExecutionContext& context, ShareData data, Ref<DeferredPromise>&& promise) >+{ >+ if (m_frame->page()) { >+ if (!data.title && !data.url && !data.text) { >+ promise->reject(TypeError); >+ return; >+ } >+ >+ URL url = context.completeURL(data.url); >+ if (!url.isValid()) >+ promise->reject(TypeError); >+ >+ ShareDataWithParsedURL shareData = { >+ data, >+ url, >+ }; >+ >+ m_frame->page()->chrome().runShareSheet(*m_frame, shareData, [documentReference = makeWeakPtr(m_frame->document()), promise = WTFMove(promise)] (bool completed) mutable { >+ if (completed) { >+ promise->resolve(); >+ return; >+ } >+ promise->reject(Exception { AbortError, "Aborted by AbortSignal."_s }); >+ return; >+ }); >+ } >+ return; >+} >+ > DOMPluginArray& Navigator::plugins() > { > if (!m_plugins) >diff --git a/Source/WebCore/page/Navigator.h b/Source/WebCore/page/Navigator.h >index b86ed89daff4b698a9c13790c2d75341f3a06a6a..bd260df7fa707a265013c032c2bcf20459783c2b 100644 >--- a/Source/WebCore/page/Navigator.h >+++ b/Source/WebCore/page/Navigator.h >@@ -20,8 +20,10 @@ > #pragma once > > #include "DOMWindowProperty.h" >+#include "JSDOMPromiseDeferred.h" > #include "NavigatorBase.h" > #include "ScriptWrappable.h" >+#include "ShareData.h" > #include "Supplementable.h" > > namespace WebCore { >@@ -42,6 +44,7 @@ public: > const String& userAgent() const final; > void userAgentChanged(); > bool onLine() const final; >+ void share(ScriptExecutionContext&, ShareData, Ref<DeferredPromise>&&); > > #if PLATFORM(IOS) > bool standalone() const; >diff --git a/Source/WebCore/page/Navigator.idl b/Source/WebCore/page/Navigator.idl >index b37eda900b431d2cbddc3d9af27c6f7abbcb1ae8..69d55c89bf0129fd5fd34885ae1415f791506844 100644 >--- a/Source/WebCore/page/Navigator.idl >+++ b/Source/WebCore/page/Navigator.idl >@@ -35,4 +35,4 @@ Navigator implements NavigatorID; > Navigator implements NavigatorLanguage; > Navigator implements NavigatorOnLine; > Navigator implements NavigatorServiceWorker; >- >+Navigator implements NavigatorShare; >diff --git a/Source/WebCore/page/NavigatorShare.idl b/Source/WebCore/page/NavigatorShare.idl >new file mode 100644 >index 0000000000000000000000000000000000000000..6ab4d3107e6ad724f217bf9a77229f7db79bfd93 >--- /dev/null >+++ b/Source/WebCore/page/NavigatorShare.idl >@@ -0,0 +1,35 @@ >+/* >+ * Copyright (C) 2018 Apple Inc. All rights reserved. >+ * >+ * 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. >+ * 3. Neither the name of Apple Inc. ("Apple") nor the names of >+ * its contributors may be used to endorse or promote products derived >+ * from this software without specific prior written permission. >+ * >+ * THIS SOFTWARE IS PROVIDED BY APPLE 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 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. >+ */ >+ >+ >+[ >+ NoInterfaceObject, >+ EnabledAtRuntime=WebShare >+] interface NavigatorShare { >+ [CallWith=ScriptExecutionContext] Promise<void> share(ShareData shareData); >+}; >diff --git a/Source/WebCore/page/RuntimeEnabledFeatures.h b/Source/WebCore/page/RuntimeEnabledFeatures.h >index 0e645b341d921f07900a4f15b448385c411c5226..c82bb6c249e2d6881020ebae15c491936259e3d9 100644 >--- a/Source/WebCore/page/RuntimeEnabledFeatures.h >+++ b/Source/WebCore/page/RuntimeEnabledFeatures.h >@@ -86,6 +86,9 @@ public: > > void setCustomPasteboardDataEnabled(bool isEnabled) { m_isCustomPasteboardDataEnabled = isEnabled; } > bool customPasteboardDataEnabled() const { return m_isCustomPasteboardDataEnabled; } >+ >+ void setWebShareEnabled(bool isEnabled) { m_isWebShareEnabled = isEnabled; } >+ bool webShareEnabled() const { return m_isWebShareEnabled; } > > #if ENABLE(ATTACHMENT_ELEMENT) > void setAttachmentElementEnabled(bool areEnabled) { m_isAttachmentElementEnabled = areEnabled; } >@@ -304,6 +307,7 @@ private: > bool m_isDirectoryUploadEnabled { false }; > bool m_areDataTransferItemsEnabled { false }; > bool m_isCustomPasteboardDataEnabled { false }; >+ bool m_isWebShareEnabled { false }; > bool m_inputEventsEnabled { true }; > > #if ENABLE(ATTACHMENT_ELEMENT) >diff --git a/Source/WebCore/page/ShareData.h b/Source/WebCore/page/ShareData.h >new file mode 100644 >index 0000000000000000000000000000000000000000..279f033a264813c21adf90cfa6c3658ac3843f23 >--- /dev/null >+++ b/Source/WebCore/page/ShareData.h >@@ -0,0 +1,42 @@ >+/* >+ * Copyright (C) 2018 Apple Inc. All rights reserved. >+ * >+ * 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. ``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 >+ * 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. >+ */ >+ >+#pragma once >+#include "URL.h" >+ >+namespace WebCore { >+ >+struct ShareData { >+ String title; >+ String text; >+ String url; >+}; >+ >+struct ShareDataWithParsedURL { >+ ShareData shareData; >+ URL url; >+}; >+ >+} >diff --git a/Source/WebCore/page/ShareData.idl b/Source/WebCore/page/ShareData.idl >new file mode 100644 >index 0000000000000000000000000000000000000000..15b660ea29b9a2297daeb1d6c316004e333150a0 >--- /dev/null >+++ b/Source/WebCore/page/ShareData.idl >@@ -0,0 +1,33 @@ >+/* >+ * Copyright (C) 2018 Apple Inc. All rights reserved. >+ * >+ * 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. >+ * 3. Neither the name of Apple Inc. ("Apple") nor the names of >+ * its contributors may be used to endorse or promote products derived >+ * from this software without specific prior written permission. >+ * >+ * THIS SOFTWARE IS PROVIDED BY APPLE 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 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. >+ */ >+ >+dictionary ShareData { >+ USVString title; >+ USVString text; >+ USVString url; >+}; >diff --git a/Source/WebKit/Scripts/webkit/messages.py b/Source/WebKit/Scripts/webkit/messages.py >index 09e464fcd7160b2ee8fe2c93362026eb4b380d89..5b16caed3af874bd6109330eea97b29433df1dc6 100644 >--- a/Source/WebKit/Scripts/webkit/messages.py >+++ b/Source/WebKit/Scripts/webkit/messages.py >@@ -382,6 +382,8 @@ def headers_for_type(type): > 'WebCore::AutoplayEventFlags': ['<WebCore/AutoplayEvent.h>'], > 'WebCore::ExceptionDetails': ['<WebCore/JSDOMExceptionHandling.h>'], > 'WebCore::FileChooserSettings': ['<WebCore/FileChooser.h>'], >+ 'WebCore::ShareData': ['<WebCore/ShareData.h>'], >+ 'WebCore::ShareDataWithParsedURL': ['<WebCore/ShareData.h>'], > 'WebCore::FrameLoadType': ['<WebCore/FrameLoaderTypes.h>'], > 'WebCore::GrammarDetail': ['<WebCore/TextCheckerClient.h>'], > 'WebCore::HasInsecureContent': ['<WebCore/FrameLoaderTypes.h>'], >diff --git a/Source/WebKit/Shared/WebCoreArgumentCoders.cpp b/Source/WebKit/Shared/WebCoreArgumentCoders.cpp >index baa2fcf03e9ab2c9cff6a8adb9ff330bb03d896e..10034bf42df0ada1ea8345bfd462fd3b84f2b4f1 100644 >--- a/Source/WebKit/Shared/WebCoreArgumentCoders.cpp >+++ b/Source/WebKit/Shared/WebCoreArgumentCoders.cpp >@@ -72,6 +72,7 @@ > #include <WebCore/ServiceWorkerClientData.h> > #include <WebCore/ServiceWorkerClientIdentifier.h> > #include <WebCore/ServiceWorkerData.h> >+#include <WebCore/ShareData.h> > #include <WebCore/TextCheckerClient.h> > #include <WebCore/TextIndicator.h> > #include <WebCore/TimingFunction.h> >@@ -1917,7 +1918,39 @@ bool ArgumentCoder<FileChooserSettings>::decode(Decoder& decoder, FileChooserSet > > return true; > } >+ >+void ArgumentCoder<ShareData>::encode(Encoder& encoder, const ShareData& settings) >+{ >+ encoder << settings.title; >+ encoder << settings.text; >+ encoder << settings.url; >+} >+ >+bool ArgumentCoder<ShareData>::decode(Decoder& decoder, ShareData& settings) >+{ >+ if (!decoder.decode(settings.title)) >+ return false; >+ if (!decoder.decode(settings.text)) >+ return false; >+ if (!decoder.decode(settings.url)) >+ return false; >+ return true; >+} >+ >+void ArgumentCoder<ShareDataWithParsedURL>::encode(Encoder& encoder, const ShareDataWithParsedURL& settings) >+{ >+ encoder << settings.shareData; >+ encoder << settings.url; >+} > >+bool ArgumentCoder<ShareDataWithParsedURL>::decode(Decoder& decoder, ShareDataWithParsedURL& settings) >+{ >+ if (!decoder.decode(settings.shareData)) >+ return false; >+ if (!decoder.decode(settings.url)) >+ return false; >+ return true; >+} > > void ArgumentCoder<GrammarDetail>::encode(Encoder& encoder, const GrammarDetail& detail) > { >diff --git a/Source/WebKit/Shared/WebCoreArgumentCoders.h b/Source/WebKit/Shared/WebCoreArgumentCoders.h >index f2afcad596033940f1b49ad0623a089a8c539a75..a9aaa0e8a4fd54c3e129e6948dd571abad6c4493 100644 >--- a/Source/WebKit/Shared/WebCoreArgumentCoders.h >+++ b/Source/WebKit/Shared/WebCoreArgumentCoders.h >@@ -103,6 +103,8 @@ struct DictionaryPopupInfo; > struct EventTrackingRegions; > struct ExceptionDetails; > struct FileChooserSettings; >+struct ShareData; >+struct ShareDataWithParsedURL; > struct Length; > struct GrammarDetail; > struct MimeClassInfo; >@@ -475,6 +477,16 @@ template<> struct ArgumentCoder<WebCore::FileChooserSettings> { > static void encode(Encoder&, const WebCore::FileChooserSettings&); > static bool decode(Decoder&, WebCore::FileChooserSettings&); > }; >+ >+template<> struct ArgumentCoder<WebCore::ShareData> { >+ static void encode(Encoder&, const WebCore::ShareData&); >+ static bool decode(Decoder&, WebCore::ShareData&); >+}; >+ >+template<> struct ArgumentCoder<WebCore::ShareDataWithParsedURL> { >+ static void encode(Encoder&, const WebCore::ShareDataWithParsedURL&); >+ static bool decode(Decoder&, WebCore::ShareDataWithParsedURL&); >+}; > > template<> struct ArgumentCoder<WebCore::GrammarDetail> { > static void encode(Encoder&, const WebCore::GrammarDetail&); >diff --git a/Source/WebKit/Shared/WebPreferences.yaml b/Source/WebKit/Shared/WebPreferences.yaml >index 260221cb30cd25bf524c22b74e6525187fb8001c..ab933c65cdc743e1dd95b3943328f12b5b308cbb 100644 >--- a/Source/WebKit/Shared/WebPreferences.yaml >+++ b/Source/WebKit/Shared/WebPreferences.yaml >@@ -757,6 +757,13 @@ CustomPasteboardDataEnabled: > humanReadableDescription: "Enable custom clipboard types and better security model for clipboard API." > webcoreBinding: RuntimeEnabledFeatures > >+WebShareEnabled: >+ type: bool >+ defaultValue: true >+ humanReadableName: "Web share" >+ humanReadableDescription: "Web share API" >+ webcoreBinding: RuntimeEnabledFeatures >+ > ViewportFitEnabled: > type: bool > defaultValue: true >diff --git a/Source/WebKit/UIProcess/API/C/WKPreferences.cpp b/Source/WebKit/UIProcess/API/C/WKPreferences.cpp >index cf3955012d34d9a4db515701fd4be0cd77505707..4f8a878d25822249eef5b21002d328077506df8c 100644 >--- a/Source/WebKit/UIProcess/API/C/WKPreferences.cpp >+++ b/Source/WebKit/UIProcess/API/C/WKPreferences.cpp >@@ -1738,6 +1738,16 @@ bool WKPreferencesGetCustomPasteboardDataEnabled(WKPreferencesRef preferencesRef > return toImpl(preferencesRef)->customPasteboardDataEnabled(); > } > >+void WKPreferencesSetWebShareEnabled(WKPreferencesRef preferencesRef, bool flag) >+{ >+ toImpl(preferencesRef)->setWebShareEnabled(flag); >+} >+ >+bool WKPreferencesGetWebShareEnabled(WKPreferencesRef preferencesRef) >+{ >+ return toImpl(preferencesRef)->webShareEnabled(); >+} >+ > void WKPreferencesSetDownloadAttributeEnabled(WKPreferencesRef preferencesRef, bool flag) > { > toImpl(preferencesRef)->setDownloadAttributeEnabled(flag); >diff --git a/Source/WebKit/UIProcess/API/C/WKPreferencesRefPrivate.h b/Source/WebKit/UIProcess/API/C/WKPreferencesRefPrivate.h >index 7cd482530467285d10e07ebdff1c6e1130abee36..3946a863b6dd40550f2b3cc597f11470296ab4c8 100644 >--- a/Source/WebKit/UIProcess/API/C/WKPreferencesRefPrivate.h >+++ b/Source/WebKit/UIProcess/API/C/WKPreferencesRefPrivate.h >@@ -496,6 +496,10 @@ WK_EXPORT bool WKPreferencesGetDataTransferItemsEnabled(WKPreferencesRef); > // Defaults to false > WK_EXPORT void WKPreferencesSetCustomPasteboardDataEnabled(WKPreferencesRef, bool flag); > WK_EXPORT bool WKPreferencesGetCustomPasteboardDataEnabled(WKPreferencesRef); >+ >+// Defaults to false >+WK_EXPORT void WKPreferencesSetWebShareEnabled(WKPreferencesRef, bool flag); >+WK_EXPORT bool WKPreferencesGetWebShareEnabled(WKPreferencesRef); > > // Defaults to false > WK_EXPORT void WKPreferencesSetUserTimingEnabled(WKPreferencesRef, bool flag); >diff --git a/Source/WebKit/UIProcess/PageClient.h b/Source/WebKit/UIProcess/PageClient.h >index e2c691e1cdc540c42cf8d51507828bac5740153f..93b6e7272f04ee62fcff62e50f8913abef411a61 100644 >--- a/Source/WebKit/UIProcess/PageClient.h >+++ b/Source/WebKit/UIProcess/PageClient.h >@@ -79,6 +79,7 @@ struct DictionaryPopupInfo; > struct Highlight; > struct TextIndicatorData; > struct ViewportAttributes; >+struct ShareDataWithParsedURL; > > template <typename> class RectEdges; > using FloatBoxExtent = RectEdges<float>; >@@ -200,6 +201,7 @@ public: > virtual void handleDownloadRequest(DownloadProxy*) = 0; > > virtual bool handleRunOpenPanel(WebPageProxy*, WebFrameProxy*, API::OpenPanelParameters*, WebOpenPanelResultListenerProxy*) { return false; } >+ virtual bool handleRunShareSheet(WebPageProxy*, WebFrameProxy*, const WebCore::ShareDataWithParsedURL&, WTF::CompletionHandler<void (bool)>&&) { return false; } > > virtual void didChangeContentSize(const WebCore::IntSize&) = 0; > >diff --git a/Source/WebKit/UIProcess/WebPageProxy.cpp b/Source/WebKit/UIProcess/WebPageProxy.cpp >index 8acd1b2574f210e69d2353476fad4aef422e5d1a..6db704f1f02ae3c05f649143045424e337cfa4ac 100644 >--- a/Source/WebKit/UIProcess/WebPageProxy.cpp >+++ b/Source/WebKit/UIProcess/WebPageProxy.cpp >@@ -145,6 +145,7 @@ > #include <WebCore/RenderEmbeddedObject.h> > #include <WebCore/SSLKeyGenerator.h> > #include <WebCore/SerializedCryptoKeyWrap.h> >+#include <WebCore/ShareData.h> > #include <WebCore/SharedBuffer.h> > #include <WebCore/ShouldSkipSafeBrowsingCheck.h> > #include <WebCore/ShouldTreatAsContinuingLoad.h> >@@ -4619,6 +4620,18 @@ void WebPageProxy::runOpenPanel(uint64_t frameID, const SecurityOriginData& fram > } > } > >+void WebPageProxy::runShareSheet(uint64_t frameID, const ShareDataWithParsedURL& shareData, uint64_t contextID) >+{ >+ CompletionHandler<void(bool)> completionHandler = [this, protectedThis = makeRef(*this), contextID] (bool access) { >+ m_process->send(Messages::WebPage::RunShareSheetResponse(access, contextID), m_pageID); >+ }; >+ >+ WebFrameProxy* frame = m_process->webFrame(frameID); >+ MESSAGE_CHECK(frame); >+ >+ m_pageClient.handleRunShareSheet(this, frame, shareData, WTFMove(completionHandler)); >+} >+ > void WebPageProxy::printFrame(uint64_t frameID) > { > ASSERT(!m_isPerformingDOMPrintOperation); >@@ -5281,7 +5294,7 @@ void WebPageProxy::didCancelForOpenPanel() > m_openPanelResultListener->invalidate(); > m_openPanelResultListener = nullptr; > } >- >+ > void WebPageProxy::advanceToNextMisspelling(bool startBeforeSelection) > { > m_process->send(Messages::WebPage::AdvanceToNextMisspelling(startBeforeSelection), m_pageID); >diff --git a/Source/WebKit/UIProcess/WebPageProxy.h b/Source/WebKit/UIProcess/WebPageProxy.h >index 9f625ddfb90c915723db35b17a0a6155b670b14c..da026a2b55cfad702c7c5b19e345013c9eb68b3f 100644 >--- a/Source/WebKit/UIProcess/WebPageProxy.h >+++ b/Source/WebKit/UIProcess/WebPageProxy.h >@@ -182,6 +182,7 @@ struct DataListSuggestionInformation; > struct DictionaryPopupInfo; > struct ExceptionDetails; > struct FileChooserSettings; >+struct ShareData; > struct GlobalWindowIdentifier; > struct MediaStreamRequest; > struct SecurityOriginData; >@@ -1477,6 +1478,7 @@ private: > void didChangeViewportProperties(const WebCore::ViewportAttributes&); > void pageDidScroll(); > void runOpenPanel(uint64_t frameID, const WebCore::SecurityOriginData&, const WebCore::FileChooserSettings&); >+ void runShareSheet(uint64_t frameID, const WebCore::ShareDataWithParsedURL&, uint64_t contextID); > void printFrame(uint64_t frameID); > void exceededDatabaseQuota(uint64_t frameID, const String& originIdentifier, const String& databaseName, const String& displayName, uint64_t currentQuota, uint64_t currentOriginUsage, uint64_t currentDatabaseUsage, uint64_t expectedUsage, Messages::WebPageProxy::ExceededDatabaseQuota::DelayedReply&&); > void reachedApplicationCacheOriginQuota(const String& originIdentifier, uint64_t currentQuota, uint64_t totalBytesNeeded, Messages::WebPageProxy::ReachedApplicationCacheOriginQuota::DelayedReply&&); >diff --git a/Source/WebKit/UIProcess/WebPageProxy.messages.in b/Source/WebKit/UIProcess/WebPageProxy.messages.in >index 89cafaea5f586d8397eeb8e2c43bd4fc85abf930..9ee38fb137d468916a787a6a7480461d9a756054 100644 >--- a/Source/WebKit/UIProcess/WebPageProxy.messages.in >+++ b/Source/WebKit/UIProcess/WebPageProxy.messages.in >@@ -76,6 +76,8 @@ messages -> WebPageProxy { > RunBeforeUnloadConfirmPanel(uint64_t frameID, struct WebCore::SecurityOriginData frameSecurityOrigin, String message) -> (bool shouldClose) Delayed > PageDidScroll() > RunOpenPanel(uint64_t frameID, struct WebCore::SecurityOriginData frameSecurityOrigin, struct WebCore::FileChooserSettings parameters) >+ RunShareSheet(uint64_t frameID, struct WebCore::ShareDataWithParsedURL shareData, uint64_t contextID) >+ > PrintFrame(uint64_t frameID) -> () > RunModal() > NotifyScrollerThumbIsVisibleInRect(WebCore::IntRect scrollerThumb) >diff --git a/Source/WebKit/UIProcess/ios/PageClientImplIOS.h b/Source/WebKit/UIProcess/ios/PageClientImplIOS.h >index 1c7abfc26c636d9480e3fddc7c6bea51332f26b9..a1d85f0cba5df1b73f68303f1bbae3dfba1e6305 100644 >--- a/Source/WebKit/UIProcess/ios/PageClientImplIOS.h >+++ b/Source/WebKit/UIProcess/ios/PageClientImplIOS.h >@@ -144,6 +144,8 @@ private: > void showPlaybackTargetPicker(bool hasVideo, const WebCore::IntRect& elementRect, WebCore::RouteSharingPolicy, const String&) override; > > bool handleRunOpenPanel(WebPageProxy*, WebFrameProxy*, API::OpenPanelParameters*, WebOpenPanelResultListenerProxy*) override; >+ bool handleRunShareSheet(WebPageProxy*, WebFrameProxy*, const WebCore::ShareDataWithParsedURL&, WTF::CompletionHandler<void(bool)>&&) override; >+ > void disableDoubleTapGesturesDuringTapIfNecessary(uint64_t requestID) override; > double minimumZoomScale() const override; > WebCore::FloatRect documentRect() const override; >diff --git a/Source/WebKit/UIProcess/ios/PageClientImplIOS.mm b/Source/WebKit/UIProcess/ios/PageClientImplIOS.mm >index f90a2f8a755d9b638244566ddd096270703e2115..e674bbb0f3f269fa3539f84c04c5da8820278248 100644 >--- a/Source/WebKit/UIProcess/ios/PageClientImplIOS.mm >+++ b/Source/WebKit/UIProcess/ios/PageClientImplIOS.mm >@@ -54,6 +54,7 @@ > #import <WebCore/NotImplemented.h> > #import <WebCore/PlatformScreen.h> > #import <WebCore/PromisedBlobInfo.h> >+#import <WebCore/ShareData.h> > #import <WebCore/SharedBuffer.h> > #import <WebCore/TextIndicator.h> > #import <WebCore/ValidationBubble.h> >@@ -571,6 +572,12 @@ bool PageClientImpl::handleRunOpenPanel(WebPageProxy*, WebFrameProxy*, API::Open > return true; > } > >+bool PageClientImpl::handleRunShareSheet(WebPageProxy*, WebFrameProxy*, const ShareDataWithParsedURL& shareData, WTF::CompletionHandler<void(bool)>&& completionHandler) >+{ >+ [m_contentView _showShareSheet:shareData completionHandler:WTFMove(completionHandler)]; >+ return true; >+} >+ > void PageClientImpl::showInspectorHighlight(const WebCore::Highlight& highlight) > { > [m_contentView _showInspectorHighlight:highlight]; >diff --git a/Source/WebKit/UIProcess/ios/WKContentViewInteraction.h b/Source/WebKit/UIProcess/ios/WKContentViewInteraction.h >index cc45c5cff220d325765f0a0721e11b9985149469..641e00c78e1b8c5f57e643fa839e16c214e18c06 100644 >--- a/Source/WebKit/UIProcess/ios/WKContentViewInteraction.h >+++ b/Source/WebKit/UIProcess/ios/WKContentViewInteraction.h >@@ -38,6 +38,7 @@ > #import "WKFileUploadPanel.h" > #import "WKFormPeripheral.h" > #import "WKKeyboardScrollingAnimator.h" >+#import "WKShareSheet.h" > #import "WKSyntheticClickTapGestureRecognizer.h" > #import <UIKit/UIView.h> > #import <WebCore/Color.h> >@@ -63,6 +64,7 @@ class IntSize; > class SelectionRect; > struct PromisedBlobInfo; > enum class RouteSharingPolicy; >+struct ShareDataWithParsedURL; > } > > #if ENABLE(DRAG_SUPPORT) >@@ -174,6 +176,7 @@ struct WKAutoCorrectionData { > #endif > RetainPtr<WKFormInputSession> _formInputSession; > RetainPtr<WKFileUploadPanel> _fileUploadPanel; >+ RetainPtr<WKShareSheet> _shareSheet; > RetainPtr<UIGestureRecognizer> _previewGestureRecognizer; > RetainPtr<UIGestureRecognizer> _previewSecondaryGestureRecognizer; > Vector<bool> _focusStateStack; >@@ -262,7 +265,7 @@ struct WKAutoCorrectionData { > > @end > >-@interface WKContentView (WKInteraction) <UIGestureRecognizerDelegate, UITextAutoscrolling, UITextInputMultiDocument, UITextInputPrivate, UIWebFormAccessoryDelegate, UIWebTouchEventsGestureRecognizerDelegate, UIWKInteractionViewProtocol, WKActionSheetAssistantDelegate, WKFileUploadPanelDelegate, WKKeyboardScrollable >+@interface WKContentView (WKInteraction) <UIGestureRecognizerDelegate, UITextAutoscrolling, UITextInputMultiDocument, UITextInputPrivate, UIWebFormAccessoryDelegate, UIWebTouchEventsGestureRecognizerDelegate, UIWKInteractionViewProtocol, WKActionSheetAssistantDelegate, WKFileUploadPanelDelegate, WKShareSheetDelegate, WKKeyboardScrollable > #if ENABLE(DATA_INTERACTION) > , UIDragInteractionDelegate, UIDropInteractionDelegate > #endif >@@ -317,6 +320,7 @@ FOR_EACH_WKCONTENTVIEW_ACTION(DECLARE_WKCONTENTVIEW_ACTION_FOR_WEB_VIEW) > - (void)_overflowScrollingDidEnd; > - (void)_showPlaybackTargetPicker:(BOOL)hasVideo fromRect:(const WebCore::IntRect&)elementRect routeSharingPolicy:(WebCore::RouteSharingPolicy)policy routingContextUID:(NSString *)contextUID; > - (void)_showRunOpenPanel:(API::OpenPanelParameters*)parameters resultListener:(WebKit::WebOpenPanelResultListenerProxy*)listener; >+- (void)_showShareSheet:(const WebCore::ShareDataWithParsedURL&)shareData completionHandler:(WTF::CompletionHandler<void(bool)>&&)completionHandler; > - (void)accessoryDone; > - (void)_didHandleKeyEvent:(::WebEvent *)event eventWasHandled:(BOOL)eventWasHandled; > - (Vector<WebKit::OptionItem>&) assistedNodeSelectOptions; >diff --git a/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm b/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm >index e829d450125f07c8523a739360a8016566a1f968..79bd0e52e648063a74ccd1162588116c7b67e4bf 100644 >--- a/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm >+++ b/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm >@@ -63,6 +63,7 @@ > #import "WebEvent.h" > #import "WebIOSEventFactory.h" > #import "WebPageMessages.h" >+#import <WebCore/ShareData.h> > #import "WebProcessProxy.h" > #import "_WKActivatedElementInfoInternal.h" > #import "_WKElementAction.h" >@@ -778,6 +779,12 @@ static inline bool hasAssistedNode(WebKit::AssistedNodeInformation assistedNodeI > _fileUploadPanel = nil; > } > >+ if (_shareSheet) { >+ [_shareSheet setDelegate:nil]; >+ [_shareSheet dismiss]; >+ _shareSheet = nil; >+ } >+ > _inputViewUpdateDeferrer = nullptr; > _assistedNodeInformation = { }; > >@@ -4644,6 +4651,18 @@ static bool isAssistableInputType(InputType type) > [_fileUploadPanel presentWithParameters:parameters resultListener:listener]; > } > >+- (void)_showShareSheet:(const ShareDataWithParsedURL&)data completionHandler:(CompletionHandler<void(bool)>&&)completionHandler >+{ >+ ASSERT(!_shareSheet); >+ if (_shareSheet) >+ return; >+ >+ _shareSheet = adoptNS([[WKShareSheet alloc] initWithView:self]); >+ [_shareSheet setDelegate:self]; >+ >+ [_shareSheet presentWithParameters:data completionHandler:WTFMove(completionHandler)]; >+} >+ > - (void)fileUploadPanelDidDismiss:(WKFileUploadPanel *)fileUploadPanel > { > ASSERT(_fileUploadPanel.get() == fileUploadPanel); >@@ -4652,6 +4671,14 @@ static bool isAssistableInputType(InputType type) > _fileUploadPanel = nil; > } > >+- (void)shareSheetDidDismiss:(WKShareSheet *)shareSheet >+{ >+ ASSERT(_shareSheet == shareSheet); >+ >+ [_shareSheet setDelegate:nil]; >+ _shareSheet = nil; >+} >+ > #pragma mark - UITextInputMultiDocument > > - (void)_restoreFocusWithToken:(id <NSCopying, NSSecureCoding>)token >diff --git a/Source/WebKit/UIProcess/ios/forms/WKShareSheet.h b/Source/WebKit/UIProcess/ios/forms/WKShareSheet.h >new file mode 100644 >index 0000000000000000000000000000000000000000..1f2ebd82f43323fd90279af78b85f31cf7f71a22 >--- /dev/null >+++ b/Source/WebKit/UIProcess/ios/forms/WKShareSheet.h >@@ -0,0 +1,62 @@ >+/* >+ * Copyright (C) 2018 Apple Inc. All rights reserved. >+ * >+ * 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. >+ */ >+ >+#if PLATFORM(IOS) >+ >+#import <UIKit/UIViewController.h> >+#import <WebCore/ShareData.h> >+#import <wtf/BlockPtr.h> >+#import <wtf/Forward.h> >+#import <wtf/Vector.h> >+#import <wtf/WeakObjCPtr.h> >+#import <wtf/text/WTFString.h> >+ >+namespace WTF { >+class TextStream; >+} >+ >+@class WKContentView; >+@protocol WKShareSheetDelegate; >+ >+namespace API { >+} >+ >+namespace WebKit { >+} >+ >+@interface WKShareSheet : UIViewController >+@property (nonatomic, assign) id <WKShareSheetDelegate> delegate; >+- (instancetype)initWithView:(WKContentView *)view; >+- (void)presentWithParameters:(const WebCore::ShareDataWithParsedURL&)data completionHandler:(WTF::CompletionHandler<void(bool)>&&)completionHandler; >+ >+- (void)dismiss; >+@end >+ >+@protocol WKShareSheetDelegate <NSObject> >+@optional >+- (void)shareSheetDidDismiss:(WKShareSheet *)shareSheet; >+@end >+ >+#endif // PLATFORM(IOS) >diff --git a/Source/WebKit/UIProcess/ios/forms/WKShareSheet.mm b/Source/WebKit/UIProcess/ios/forms/WKShareSheet.mm >new file mode 100644 >index 0000000000000000000000000000000000000000..529607cf47226412536163e805c64ac9ce804299 >--- /dev/null >+++ b/Source/WebKit/UIProcess/ios/forms/WKShareSheet.mm >@@ -0,0 +1,134 @@ >+/* >+ * Copyright (C) 2018 Apple Inc. All rights reserved. >+ * >+ * 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. >+ */ >+ >+#import "config.h" >+#import "WKShareSheet.h" >+ >+#if PLATFORM(IOS) >+ >+#import "APIArray.h" >+#import "APIData.h" >+#import "APIOpenPanelParameters.h" >+#import "APIString.h" >+#import "UIKitSPI.h" >+#import "WKContentViewInteraction.h" >+#import "WKData.h" >+#import "WKStringCF.h" >+#import "WKURLCF.h" >+#import "WebIconUtilities.h" >+#import "WebPageProxy.h" >+#import <MobileCoreServices/MobileCoreServices.h> >+#import <WebCore/LocalizedStrings.h> >+#import <WebCore/ShareData.h> >+#import <wtf/RetainPtr.h> >+#import <wtf/WeakObjCPtr.h> >+ >+using namespace WebKit; >+ >+@interface _WKShareSheetItem : NSObject >+@end >+ >+@implementation _WKShareSheetItem >+@end >+ >+@implementation WKShareSheet { >+ WeakObjCPtr<WKContentView> _view; >+ >+ RetainPtr<UIActivityViewController> _shareSheetViewController; >+ RetainPtr<UIViewController> _presentationViewController; >+} >+ >+- (instancetype)initWithView:(WKContentView *)view >+{ >+ if (!(self = [super init])) >+ return nil; >+ _view = view; >+ return self; >+} >+ >+- (void)presentWithParameters:(const WebCore::ShareDataWithParsedURL &)data completionHandler:(WTF::CompletionHandler<void(bool)>&&)completionHandler >+{ >+ auto shareDataArray = adoptNS([[NSMutableArray alloc] init]); >+ >+ if (!data.shareData.title.isEmpty()) >+ [shareDataArray addObject:(NSString*)data.shareData.title]; >+ if (!data.shareData.text.isEmpty()) >+ [shareDataArray addObject:(NSString*)data.shareData.text]; >+ if (!data.url.isNull()) >+ [shareDataArray addObject:(NSURL*)data.url]; >+ >+ UIActivityViewController *shareSheetController = [[UIActivityViewController alloc] initWithActivityItems:shareDataArray.get() applicationActivities:nil]; >+ >+ auto completionHandlerBlock = BlockPtr<void((NSString*, BOOL completed, NSArray*, NSError*))>::fromCallable([completionHandler = WTFMove(completionHandler), shareSheet = self](NSString*, BOOL completed, NSArray*, NSError*) mutable { >+ completionHandler(completed); >+ [shareSheet dismiss]; >+ }); >+ >+ shareSheetController.completionWithItemsHandler = completionHandlerBlock.get(); >+ _shareSheetViewController = adoptNS(shareSheetController); >+ [self _presentFullscreenViewController:_shareSheetViewController.get() animated:YES]; >+} >+ >+- (void)_dispatchDidDismiss >+{ >+ if ([_delegate respondsToSelector:@selector(shareSheetDidDismiss:)]) >+ [_delegate shareSheetDidDismiss:self]; >+} >+ >+- (void)_cancel >+{ >+ [self _dispatchDidDismiss]; >+} >+ >+- (void)dismiss >+{ >+ [[UIViewController _viewControllerForFullScreenPresentationFromView:_view.get().get()] dismissViewControllerAnimated:YES completion:nil]; >+ _presentationViewController = nil; >+ >+ [self _cancel]; >+} >+ >+- (void)_dismissDisplayAnimated:(BOOL)animated >+{ >+ if (_presentationViewController) { >+ UIViewController *currentPresentedViewController = [_presentationViewController presentedViewController]; >+ if (currentPresentedViewController == self) { >+ [currentPresentedViewController dismissViewControllerAnimated:animated completion:^{ >+ _presentationViewController = nil; >+ }]; >+ } >+ } >+} >+ >+- (void)_presentFullscreenViewController:(UIViewController *)viewController animated:(BOOL)animated >+{ >+ [self _dismissDisplayAnimated:NO]; >+ >+ _presentationViewController = [UIViewController _viewControllerForFullScreenPresentationFromView:_view.get().get()]; >+ [_presentationViewController presentViewController:viewController animated:animated completion:nil]; >+} >+ >+@end >+#endif // PLATFORM(IOS) >diff --git a/Source/WebKit/WebKit.xcodeproj/project.pbxproj b/Source/WebKit/WebKit.xcodeproj/project.pbxproj >index b653986ec5db592e1f2863115d75d3cb24f55f3f..ccfa59458475e3b74ada615ecb9bb2d638585c0b 100644 >--- a/Source/WebKit/WebKit.xcodeproj/project.pbxproj >+++ b/Source/WebKit/WebKit.xcodeproj/project.pbxproj >@@ -546,6 +546,8 @@ > 1CA8B954127C891500576C2B /* WebInspectorUIMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1C8E2DAD1278C5B200BC7BD0 /* WebInspectorUIMac.mm */; }; > 1CBBE4A019B66C53006B7D81 /* WebInspectorUIMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1CBBE49E19B66C53006B7D81 /* WebInspectorUIMessageReceiver.cpp */; }; > 1CBBE4A119B66C53006B7D81 /* WebInspectorUIMessages.h in Headers */ = {isa = PBXBuildFile; fileRef = 1CBBE49F19B66C53006B7D81 /* WebInspectorUIMessages.h */; }; >+ 1DB01943211CF002009FB3E8 /* WKShareSheet.h in Headers */ = {isa = PBXBuildFile; fileRef = 1DE0D095211CC21300439B5F /* WKShareSheet.h */; }; >+ 1DB01944211CF005009FB3E8 /* WKShareSheet.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1DBBB061211CC3CB00502ECC /* WKShareSheet.mm */; }; > 1F335BC0185B84F0001A201A /* WKWebProcessPlugInLoadDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F335BBF185B84D8001A201A /* WKWebProcessPlugInLoadDelegate.h */; settings = {ATTRIBUTES = (Private, ); }; }; > 1F604BAA1889FBB800EE0395 /* _WKRenderingProgressEventsInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F604BA71889FA7400EE0395 /* _WKRenderingProgressEventsInternal.h */; }; > 1F7506AD1859161C00EC0FF7 /* WKWebProcessPlugInFrame.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F01816A1858DC1500F92884 /* WKWebProcessPlugInFrame.mm */; }; >@@ -3019,6 +3021,8 @@ > 1CBBE49E19B66C53006B7D81 /* WebInspectorUIMessageReceiver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebInspectorUIMessageReceiver.cpp; sourceTree = "<group>"; }; > 1CBBE49F19B66C53006B7D81 /* WebInspectorUIMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebInspectorUIMessages.h; sourceTree = "<group>"; }; > 1CC417C912C00CCA002BE67B /* TextCheckerCompletion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextCheckerCompletion.h; sourceTree = "<group>"; }; >+ 1DBBB061211CC3CB00502ECC /* WKShareSheet.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = WKShareSheet.mm; path = ios/forms/WKShareSheet.mm; sourceTree = "<group>"; }; >+ 1DE0D095211CC21300439B5F /* WKShareSheet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WKShareSheet.h; path = ios/forms/WKShareSheet.h; sourceTree = "<group>"; }; > 1F0181691858DC1500F92884 /* WKWebProcessPlugInFrame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKWebProcessPlugInFrame.h; sourceTree = "<group>"; }; > 1F01816A1858DC1500F92884 /* WKWebProcessPlugInFrame.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKWebProcessPlugInFrame.mm; sourceTree = "<group>"; }; > 1F01816B1858DC1500F92884 /* WKWebProcessPlugInFrameInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKWebProcessPlugInFrameInternal.h; sourceTree = "<group>"; }; >@@ -8997,6 +9001,8 @@ > F4D5F51C206087A10038BBA8 /* WKQuickboardListViewController.mm */, > F4F59AD42065A5CA006CAA46 /* WKSelectMenuListViewController.h */, > F4F59AD32065A5C9006CAA46 /* WKSelectMenuListViewController.mm */, >+ 1DE0D095211CC21300439B5F /* WKShareSheet.h */, >+ 1DBBB061211CC3CB00502ECC /* WKShareSheet.mm */, > F4D5F519206087A00038BBA8 /* WKTextInputListViewController.h */, > F4D5F51A206087A10038BBA8 /* WKTextInputListViewController.mm */, > 2EB6FBFF203021960017E619 /* WKTimePickerViewController.h */, >@@ -10216,6 +10222,7 @@ > BC407604124FF0270068F20A /* WKSerializedScriptValue.h in Headers */, > 1ADE46B31954EC61000F7985 /* WKSessionStateRef.h in Headers */, > BCDDB32B124EC2AB0048D13C /* WKSharedAPICast.h in Headers */, >+ 1DB01943211CF002009FB3E8 /* WKShareSheet.h in Headers */, > 513E462D1AD837560016234A /* WKSharingServicePickerDelegate.h in Headers */, > 93F549B41E3174B7000E7239 /* WKSnapshotConfiguration.h in Headers */, > BC407606124FF0270068F20A /* WKString.h in Headers */, >@@ -12041,6 +12048,7 @@ > F4F59AD62065AEB1006CAA46 /* WKSelectMenuListViewController.mm in Sources */, > BC407603124FF0270068F20A /* WKSerializedScriptValue.cpp in Sources */, > 1ADE46B21954EC61000F7985 /* WKSessionStateRef.cpp in Sources */, >+ 1DB01944211CF005009FB3E8 /* WKShareSheet.mm in Sources */, > 513E462E1AD837560016234A /* WKSharingServicePickerDelegate.mm in Sources */, > 93F549B61E3174DA000E7239 /* WKSnapshotConfiguration.mm in Sources */, > BC407605124FF0270068F20A /* WKString.cpp in Sources */, >diff --git a/Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp b/Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp >index c0652f16dcd87f91641d56a47cf92fee3d53a6f5..7162f3fe74662ea647a8a45ca43afd98df9f69cd 100644 >--- a/Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp >+++ b/Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp >@@ -811,6 +811,13 @@ void WebChromeClient::runOpenPanel(Frame& frame, FileChooser& fileChooser) > ASSERT(webFrame); > m_page.send(Messages::WebPageProxy::RunOpenPanel(webFrame->frameID(), SecurityOriginData::fromFrame(&frame), fileChooser.settings())); > } >+ >+void WebChromeClient::runShareSheet(Frame& frame, ShareDataWithParsedURL& shareData, CompletionHandler<void(bool)>&& callback) >+{ >+ auto* webFrame = WebFrame::fromCoreFrame(frame); >+ ASSERT(webFrame); >+ m_page.runShareSheet(frame, webFrame->frameID(), shareData, WTFMove(callback)); >+} > > void WebChromeClient::loadIconForFiles(const Vector<String>& filenames, FileIconLoader& loader) > { >diff --git a/Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.h b/Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.h >index e5d8e433e4107032466963eaa8ea45a34987776f..c00ade70b17a27f3aacbaf9080d21bd1b648cb22 100644 >--- a/Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.h >+++ b/Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.h >@@ -187,6 +187,7 @@ private: > #endif > > void runOpenPanel(WebCore::Frame&, WebCore::FileChooser&) final; >+ void runShareSheet(WebCore::Frame&, WebCore::ShareDataWithParsedURL&, WTF::CompletionHandler<void(bool)>&&) final; > void loadIconForFiles(const Vector<String>&, WebCore::FileIconLoader&) final; > > #if !PLATFORM(IOS) >diff --git a/Source/WebKit/WebProcess/WebPage/WebPage.cpp b/Source/WebKit/WebProcess/WebPage/WebPage.cpp >index 17a00649717b105ed1544bb7fa4346319972fa57..e5e923e6cc00339aa8774f5aef500aa472a4478b 100644 >--- a/Source/WebKit/WebProcess/WebPage/WebPage.cpp >+++ b/Source/WebKit/WebProcess/WebPage/WebPage.cpp >@@ -3691,7 +3691,7 @@ void WebPage::didCancelForOpenPanel() > { > m_activeOpenPanelResultListener = nullptr; > } >- >+ > #if ENABLE(SANDBOX_EXTENSIONS) > void WebPage::extendSandboxForFilesFromOpenPanel(SandboxExtension::HandleArray&& handles) > { >@@ -6039,6 +6039,12 @@ static uint64_t nextRequestStorageAccessContextId() > static uint64_t nextContextId = 0; > return ++nextContextId; > } >+ >+static uint64_t nextShareSheetContextId() >+{ >+ static uint64_t nextContextId = 0; >+ return ++nextContextId; >+} > > void WebPage::hasStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, CompletionHandler<void(bool)>&& callback) > { >@@ -6070,6 +6076,24 @@ void WebPage::storageAccessResponse(bool wasGranted, uint64_t contextId) > callback(wasGranted); > } > #endif >+ >+void WebPage::runShareSheet(Frame& frame, uint64_t frameID, ShareDataWithParsedURL& shareData, WTF::CompletionHandler<void(bool)>&& callback) >+{ >+ auto contextID = nextShareSheetContextId(); >+ auto addResult = m_shareSheetResponseCallbackMap.add(contextID, WTFMove(callback)); >+ ASSERT(addResult.isNewEntry); >+ if (addResult.iterator->value) >+ send(Messages::WebPageProxy::RunShareSheet(frameID, WTFMove(shareData), contextID)); >+ else >+ callback(false); >+} >+ >+void WebPage::runShareSheetResponse(bool wasGranted, uint64_t contextId) >+{ >+ auto callback = m_shareSheetResponseCallbackMap.take(contextId); >+ ASSERT(callback); >+ callback(wasGranted); >+} > > #if ENABLE(ATTACHMENT_ELEMENT) > >diff --git a/Source/WebKit/WebProcess/WebPage/WebPage.h b/Source/WebKit/WebProcess/WebPage/WebPage.h >index e51a604c708e6e42ddf3c58024bc9c3576b8b359..47cb30ff808a90829d2d7cd730f884774846909c 100644 >--- a/Source/WebKit/WebProcess/WebPage/WebPage.h >+++ b/Source/WebKit/WebProcess/WebPage/WebPage.h >@@ -61,6 +61,7 @@ > #include <WebCore/PageOverlay.h> > #include <WebCore/PluginData.h> > #include <WebCore/SecurityPolicyViolationEvent.h> >+#include <WebCore/ShareData.h> > #include <WebCore/UserActivity.h> > #include <WebCore/UserContentTypes.h> > #include <WebCore/UserInterfaceLayoutDirection.h> >@@ -172,8 +173,6 @@ struct PromisedBlobInfo; > struct TextCheckingResult; > struct ViewportArguments; > >- >- > #if ENABLE(ATTACHMENT_ELEMENT) > class HTMLAttachmentElement; > struct AttachmentDisplayOptions; >@@ -1074,6 +1073,8 @@ public: > void storageAccessResponse(bool wasGranted, uint64_t contextId); > #endif > >+ void runShareSheet(WebCore::Frame&, uint64_t frameID, WebCore::ShareDataWithParsedURL&, WTF::CompletionHandler<void(bool)>&& callback); >+ > #if ENABLE(ATTACHMENT_ELEMENT) > void insertAttachment(const String& identifier, const WebCore::AttachmentDisplayOptions&, const String& filename, std::optional<String> contentType, const IPC::DataReference&, CallbackID); > void requestAttachmentInfo(const String& identifier, CallbackID); >@@ -1729,7 +1730,9 @@ private: > HashMap<String, RefPtr<WebURLSchemeHandlerProxy>> m_schemeToURLSchemeHandlerProxyMap; > HashMap<uint64_t, WebURLSchemeHandlerProxy*> m_identifierToURLSchemeHandlerProxyMap; > >- HashMap<uint64_t, WTF::Function<void (bool granted)>> m_storageAccessResponseCallbackMap; >+ HashMap<uint64_t, WTF::Function<void(bool granted)>> m_storageAccessResponseCallbackMap; >+ HashMap<uint64_t, WTF::Function<void(bool completed)>> m_shareSheetResponseCallbackMap; >+ void runShareSheetResponse(bool wasCompleted, uint64_t contextId); > > #if ENABLE(APPLICATION_MANIFEST) > HashMap<uint64_t, uint64_t> m_applicationManifestFetchCallbackMap; >diff --git a/Source/WebKit/WebProcess/WebPage/WebPage.messages.in b/Source/WebKit/WebProcess/WebPage/WebPage.messages.in >index b71f28b6dfa03424344dd92fbbe8918b0ce2c6c7..f893347477ed1a105085c99ad734ab7a021621f9 100644 >--- a/Source/WebKit/WebProcess/WebPage/WebPage.messages.in >+++ b/Source/WebKit/WebProcess/WebPage/WebPage.messages.in >@@ -290,6 +290,8 @@ messages -> WebPage LegacyReceiver { > #endif > DidChooseFilesForOpenPanel(Vector<String> fileURLs) > DidCancelForOpenPanel() >+ RunShareSheetResponse(bool wasGranted, uint64_t contextId) >+ > #if ENABLE(SANDBOX_EXTENSIONS) > ExtendSandboxForFilesFromOpenPanel(WebKit::SandboxExtension::HandleArray sandboxExtensions) > #endif >diff --git a/Source/WebKitLegacy/ios/WebCoreSupport/WebChromeClientIOS.h b/Source/WebKitLegacy/ios/WebCoreSupport/WebChromeClientIOS.h >index bc1583c1636b78a0792d484d02e4e93b834845f3..eb24d5760882cebc83b79b32ca9c9fe8a03b9fc1 100644 >--- a/Source/WebKitLegacy/ios/WebCoreSupport/WebChromeClientIOS.h >+++ b/Source/WebKitLegacy/ios/WebCoreSupport/WebChromeClientIOS.h >@@ -47,6 +47,7 @@ private: > bool runJavaScriptPrompt(WebCore::Frame&, const WTF::String& message, const WTF::String& defaultValue, WTF::String& result) final; > > void runOpenPanel(WebCore::Frame&, WebCore::FileChooser&) final; >+ void runShareSheet(WebCore::Frame&, WebCore::ShareDataWithParsedURL&, CompletionHandler<void(bool)>&&) final; > > #if ENABLE(TOUCH_EVENTS) > void didPreventDefaultForEvent() final; >diff --git a/Source/WebKitLegacy/ios/WebCoreSupport/WebChromeClientIOS.mm b/Source/WebKitLegacy/ios/WebCoreSupport/WebChromeClientIOS.mm >index c701870f4e0f1ecfc37918bb6b5dc38d1600c77f..23174cad415f06a6aa24cdc61be9e3f0b06f01cd 100644 >--- a/Source/WebKitLegacy/ios/WebCoreSupport/WebChromeClientIOS.mm >+++ b/Source/WebKitLegacy/ios/WebCoreSupport/WebChromeClientIOS.mm >@@ -157,6 +157,10 @@ void WebChromeClientIOS::runOpenPanel(Frame&, FileChooser& chooser) > [listener release]; > } > >+void WebChromeClientIOS::runShareSheet(Frame&, ShareDataWithParsedURL&, CompletionHandler<void(bool)>&&) >+{ >+} >+ > #if ENABLE(IOS_TOUCH_EVENTS) > > void WebChromeClientIOS::didPreventDefaultForEvent() >diff --git a/Source/WebKitLegacy/mac/WebCoreSupport/WebChromeClient.h b/Source/WebKitLegacy/mac/WebCoreSupport/WebChromeClient.h >index 4355a866d641037ba67f1aedccafc07e8ab2d9db..887048795f575fb183744e0cc523ad5994ddc1f6 100644 >--- a/Source/WebKitLegacy/mac/WebCoreSupport/WebChromeClient.h >+++ b/Source/WebKitLegacy/mac/WebCoreSupport/WebChromeClient.h >@@ -126,6 +126,8 @@ private: > #endif > > void runOpenPanel(WebCore::Frame&, WebCore::FileChooser&) override; >+ void runShareSheet(WebCore::Frame&, WebCore::ShareDataWithParsedURL&, CompletionHandler<void(bool)>&&) override; >+ > void loadIconForFiles(const Vector<String>&, WebCore::FileIconLoader&) final; > RefPtr<WebCore::Icon> createIconForFiles(const Vector<String>& filenames) override; > >diff --git a/Source/WebKitLegacy/mac/WebCoreSupport/WebChromeClient.mm b/Source/WebKitLegacy/mac/WebCoreSupport/WebChromeClient.mm >index 2884dfd5fd7c36a93c62020a44e7e95f6f9782fc..a823a725f296779dcb86a8eea4c95257779253bf 100644 >--- a/Source/WebKitLegacy/mac/WebCoreSupport/WebChromeClient.mm >+++ b/Source/WebKitLegacy/mac/WebCoreSupport/WebChromeClient.mm >@@ -776,6 +776,10 @@ void WebChromeClient::runOpenPanel(Frame&, FileChooser& chooser) > END_BLOCK_OBJC_EXCEPTIONS; > } > >+void WebChromeClient::runShareSheet(Frame&, ShareDataWithParsedURL&, CompletionHandler<void(bool)>&&) >+{ >+} >+ > void WebChromeClient::loadIconForFiles(const Vector<String>& filenames, FileIconLoader& iconLoader) > { > iconLoader.iconLoaded(createIconForFiles(filenames)); >diff --git a/Source/WebKitLegacy/mac/WebView/WebPreferenceKeysPrivate.h b/Source/WebKitLegacy/mac/WebView/WebPreferenceKeysPrivate.h >index fc7bf743c00b09de3b0df8fb52e35e4b1136e14e..68620382db7143b056b0cd5d4a5a60e21b07e621 100644 >--- a/Source/WebKitLegacy/mac/WebView/WebPreferenceKeysPrivate.h >+++ b/Source/WebKitLegacy/mac/WebView/WebPreferenceKeysPrivate.h >@@ -173,6 +173,7 @@ > #define WebKitCustomElementsEnabledPreferenceKey @"WebKitCustomElementsEnabled" > #define WebKitDataTransferItemsEnabledPreferenceKey @"WebKitDataTransferItemsEnabled" > #define WebKitCustomPasteboardDataEnabledPreferenceKey @"WebKitCustomPasteboardDataEnabled" >+#define WebKitWebShareEnabledPreferenceKey @"WebKitWebShareEnabled" > #define WebKitCacheAPIEnabledPreferenceKey @"WebKitCacheAPIEnabled" > #define WebKitCrossOriginWindowPolicySupportEnabledPreferenceKey @"WebKitCrossOriginWindowPolicySupportEnabled" > #define WebKitFetchAPIEnabledPreferenceKey @"WebKitFetchAPIEnabled" >diff --git a/Source/WebKitLegacy/mac/WebView/WebPreferences.mm b/Source/WebKitLegacy/mac/WebView/WebPreferences.mm >index 3a986070eb3cb6a7161a9925c09eee59d85eb1b8..6ca4eb9ad20af6b53780508510d69f9e4ab294c3 100644 >--- a/Source/WebKitLegacy/mac/WebView/WebPreferences.mm >+++ b/Source/WebKitLegacy/mac/WebView/WebPreferences.mm >@@ -3013,6 +3013,16 @@ static NSString *classIBCreatorID = nil; > [self _setBoolValue:flag forKey:WebKitCustomPasteboardDataEnabledPreferenceKey]; > } > >+- (BOOL)webShareEnabled >+{ >+ return [self _boolValueForKey:WebKitWebShareEnabledPreferenceKey]; >+} >+ >+- (void)setWebShareEnabled:(BOOL)flag >+{ >+ [self _setBoolValue:flag forKey:WebKitWebShareEnabledPreferenceKey]; >+} >+ > - (BOOL)cacheAPIEnabled > { > return [self _boolValueForKey:WebKitCacheAPIEnabledPreferenceKey]; >diff --git a/Source/WebKitLegacy/mac/WebView/WebPreferencesPrivate.h b/Source/WebKitLegacy/mac/WebView/WebPreferencesPrivate.h >index 2f1ddc4971ece4f3697199f3fa648fb6664d23b9..cc776782a9c8800b9fbbdea715320c0ecedf3bd2 100644 >--- a/Source/WebKitLegacy/mac/WebView/WebPreferencesPrivate.h >+++ b/Source/WebKitLegacy/mac/WebView/WebPreferencesPrivate.h >@@ -540,6 +540,9 @@ extern NSString *WebPreferencesCacheModelChangedInternalNotification WEBKIT_DEPR > - (void)setCustomPasteboardDataEnabled:(BOOL)flag; > - (BOOL)customPasteboardDataEnabled; > >+- (void)setWebShareEnabled:(BOOL)flag; >+- (BOOL)webShareEnabled; >+ > - (BOOL)cacheAPIEnabled; > - (void)setCacheAPIEnabled:(BOOL)enabled; > >diff --git a/Source/WebKitLegacy/mac/WebView/WebView.mm b/Source/WebKitLegacy/mac/WebView/WebView.mm >index 5617fb7c3394d1247b7c4de7db63eadf8de9263f..5abe1fd4b4ca3151859e74bb8265dffcbb463a6d 100644 >--- a/Source/WebKitLegacy/mac/WebView/WebView.mm >+++ b/Source/WebKitLegacy/mac/WebView/WebView.mm >@@ -3078,6 +3078,7 @@ static bool needsSelfRetainWhileLoadingQuirk() > RuntimeEnabledFeatures::sharedFeatures().setCustomElementsEnabled([preferences customElementsEnabled]); > RuntimeEnabledFeatures::sharedFeatures().setDataTransferItemsEnabled([preferences dataTransferItemsEnabled]); > RuntimeEnabledFeatures::sharedFeatures().setCustomPasteboardDataEnabled([preferences customPasteboardDataEnabled]); >+ RuntimeEnabledFeatures::sharedFeatures().setWebShareEnabled([preferences webShareEnabled]); > > #if ENABLE(ATTACHMENT_ELEMENT) > RuntimeEnabledFeatures::sharedFeatures().setAttachmentElementEnabled([preferences attachmentElementEnabled]);
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 171100
:
347525
|
347690
|
347979
|
348022
|
348033
|
348037
|
348062
|
348069
|
348071
|
348074
|
348153
|
348163
|
348171
|
348178
|
348225
|
348241
|
348299
|
348315
|
348332
|
348351
|
348366
|
348367
|
348377
|
348378
|
348379
|
348386
|
348391
|
348442