WebKit Bugzilla
Attachment 348241 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-20180827171224.patch (text/plain), 87.08 KB, created by
Olivia Barnett
on 2018-08-27 17:12:25 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Olivia Barnett
Created:
2018-08-27 17:12:25 PDT
Size:
87.08 KB
patch
obsolete
>Subversion Revision: 235412 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index ec62d76ad47d6abf230aba4c85aa9f1a84c196de..dd636a64f116d36bf91d6f2f4d506f5102849c38 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!). >+ >+ Added one test in fast/events/ios called share.html; adjusted expectations for existing tests. >+ >+ * 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-27 Keith Rollin <krollin@apple.com> > > Unreviewed build fix -- disable LTO for production builds >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index f55436ef0a9d906b09d153586592dd79bd89e775..3ab73867671b3146dddee24af62cb6ae40e404dd 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,95 @@ >+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!). >+ >+ * Platform/spi/ios/UIKitSPI.h: >+ Added NSURL _title property as in the WebCore UIKitSPI. >+ >+ * Scripts/webkit/messages.py: >+ ShareDataWithParsedURL special case for header for type. >+ >+ * Shared/ShareSheetCallbackID.h: >+ Added a typedef for a share sheet callback id. >+ >+ * 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/API/Cocoa/WKWebView.mm: >+ * UIProcess/API/Cocoa/WKWebViewPrivate.h: >+ Added hook for share sheet testing. >+ >+ * UIProcess/PageClient.h: >+ (WebKit::PageClient::showShareSheet): >+ 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::showShareSheet): >+ Page client implementation call to invoke share sheet. >+ >+ * UIProcess/ios/WKContentViewInteraction.h: >+ * UIProcess/ios/WKContentViewInteraction.mm: >+ (-[WKContentView cleanupInteraction]): >+ (-[WKContentView _showShareSheet:completionHandler:]): >+ (-[WKContentView shareSheetDidDismiss:]): >+ (-[WKContentView invokeShareSheetWithResolution:resolved): >+ Call to WKShareSheet to invoke the share sheet and callback. >+ Hook for share sheet resolution testing. >+ >+ * 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:]): >+ (-[WKShareSheet invokeShareSheetWithResolution:resolved:]): >+ Completion handler call and creation of share sheet with parameters. >+ Hook that force resolves the share sheet completion handler for testing. >+ >+ * 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-27 Keith Rollin <krollin@apple.com> > > Unreviewed build fix -- disable LTO for production builds >diff --git a/Source/WebKitLegacy/ios/ChangeLog b/Source/WebKitLegacy/ios/ChangeLog >index 565a20d46224ab47eec5e87089ac2c3b3bc50d3d..559b3e1bec2e70623432c3165b893a945c7a922e 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-24 Ryosuke Niwa <rniwa@webkit.org> > > Pass in IsComposed flag to Event constructors >diff --git a/Source/WebKitLegacy/mac/ChangeLog b/Source/WebKitLegacy/mac/ChangeLog >index de2642c76ad3868a80190983b9720e6481e0b6ee..2cc206bbc8e7036c9580226fb97fa09d2b10bf45 100644 >--- a/Source/WebKitLegacy/mac/ChangeLog >+++ b/Source/WebKitLegacy/mac/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/WebChromeClient.h: >+ * WebCoreSupport/WebChromeClient.mm: >+ (WebChromeClient::runShareSheet): >+ Empty declaration of runShareSheet. >+ > 2018-08-27 Keith Rollin <krollin@apple.com> > > Unreviewed build fix -- disable LTO for production builds >diff --git a/Source/WebCore/CMakeLists.txt b/Source/WebCore/CMakeLists.txt >index a9c4a5f4347046cdacebbf8a1cb381a3f514856d..5c081ead27b0b2b1fd35ff2132c54490501e3d0f 100644 >--- a/Source/WebCore/CMakeLists.txt >+++ b/Source/WebCore/CMakeLists.txt >@@ -813,6 +813,7 @@ set(WebCore_NON_SVG_IDL_FILES > page/NavigatorLanguage.idl > page/NavigatorOnLine.idl > page/NavigatorServiceWorker.idl >+ page/NavigatorShare.idl > page/Performance.idl > page/PerformanceEntry.idl > page/PerformanceMark.idl >@@ -827,6 +828,7 @@ set(WebCore_NON_SVG_IDL_FILES > page/RemoteDOMWindow.idl > page/Screen.idl > page/ScrollToOptions.idl >+ page/ShareData.idl > page/VisualViewport.idl > page/WebKitPoint.idl > page/WindowEventHandlers.idl >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 80a74e4b506f7e94a583d37458c8aab0d2debb0a..6637d1af2b1149ee2f116dbce314e3089de9d0ad 100644 >--- a/Source/WebCore/Sources.txt >+++ b/Source/WebCore/Sources.txt >@@ -2783,6 +2783,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 7255d265c77215ec09ba38d967ca4cd7e8aa1658..427be79fcc49c9cbe6a942dca99b0cbecf668f69 100644 >--- a/Source/WebCore/WebCore.xcodeproj/project.pbxproj >+++ b/Source/WebCore/WebCore.xcodeproj/project.pbxproj >@@ -640,6 +640,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, ); }; }; >@@ -6317,6 +6318,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>"; }; >@@ -15240,8 +15244,8 @@ > 41103AA71E39790A00769F14 /* RealtimeOutgoingAudioSourceCocoa.cpp */, > 41103AA81E39790A00769F14 /* RealtimeOutgoingAudioSourceCocoa.h */, > 5CDD833B1E4324BB00621B83 /* RealtimeOutgoingVideoSourceCocoa.cpp */, >- 419242472127B7CC00634FCF /* RealtimeOutgoingVideoSourceCocoa.mm */, > 5CDD833C1E4324BB00621B83 /* RealtimeOutgoingVideoSourceCocoa.h */, >+ 419242472127B7CC00634FCF /* RealtimeOutgoingVideoSourceCocoa.mm */, > 070A9F5E1FFECC70003DF649 /* ScreenDisplayCaptureSourceMac.h */, > 070A9F601FFECC71003DF649 /* ScreenDisplayCaptureSourceMac.mm */, > 07D6373E1BB0B11300256CE9 /* WebAudioSourceProviderAVFObjC.h */, >@@ -19298,6 +19302,7 @@ > 7C5BEA3B1E9EE77100CC517B /* NavigatorLanguage.idl */, > 7C5BEA3C1E9EE77100CC517B /* NavigatorOnLine.idl */, > 5182C24B1F313AE00059BA7C /* NavigatorServiceWorker.idl */, >+ 1DC553FD211BA12A004B780E /* NavigatorShare.idl */, > 00146288103CD1DE000B20DB /* OriginAccessEntry.cpp */, > 00146289103CD1DE000B20DB /* OriginAccessEntry.h */, > 65FEA86809833ADE00BED4AB /* Page.cpp */, >@@ -19388,6 +19393,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 */, >@@ -30122,6 +30129,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 */, >@@ -31446,6 +31454,7 @@ > AA12DF491743DF83004DAFDF /* PlatformSpeechSynthesizerIOS.mm in Sources */, > CDA29A301CBF74D400901CCF /* PlaybackSessionInterfaceAVKit.mm in Sources */, > CDA29A161CBDA56C00901CCF /* PlaybackSessionInterfaceMac.mm in Sources */, >+ 419242492127B93E00634FCF /* RealtimeOutgoingVideoSourceCocoa.mm in Sources */, > 316DCB8A1E7A6996001B5F87 /* RTCIceTransport.cpp in Sources */, > BC51156E12B1749C00C96754 /* ScrollAnimatorMac.mm in Sources */, > BCEF869F0E844E9D00A85CD5 /* ScrollbarThemeMac.mm in Sources */, >@@ -31566,7 +31575,6 @@ > 538EC8A11F993F9D004D22A8 /* UnifiedSource48.cpp in Sources */, > DE5F85991FA1ABF4006DB63A /* UnifiedSource49-mm.mm in Sources */, > 538EC8A21F993F9D004D22A8 /* UnifiedSource49.cpp in Sources */, >- 419242492127B93E00634FCF /* RealtimeOutgoingVideoSourceCocoa.mm in Sources */, > DE5F859A1FA1ABF4006DB63A /* UnifiedSource50-mm.mm in Sources */, > 538EC8A31F993F9D004D22A8 /* UnifiedSource50.cpp in Sources */, > DE5F86501FA2AF24006DB63A /* UnifiedSource51-mm.mm in Sources */, >diff --git a/Source/WebCore/features.json b/Source/WebCore/features.json >index 16a73ecb1e1dfa8eae6dac0a3614ba5491daeb09..2ece761d1bb4411000b1bc32135949bd2d172b1a 100644 >--- a/Source/WebCore/features.json >+++ b/Source/WebCore/features.json >@@ -1230,7 +1230,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 d4b915ddbdf6bb9999c01540ced98833054928a9..7cd2cae6bd01951deeb74f2a09fa0ca025480c9b 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(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..e40d8b0f8083e1b71913ba69539e81a9702bb45c 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(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..d78ca359e8cfb071769fcfb6152292e0b56e0cee 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(ShareDataWithParsedURL& shareData, CompletionHandler<void(bool)>&& callback) >+{ >+ m_client.runShareSheet(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..861f6503a91bafca6cbd669dbbcee6b11c88712e 100644 >--- a/Source/WebCore/page/Chrome.h >+++ b/Source/WebCore/page/Chrome.h >@@ -59,6 +59,7 @@ class PopupOpeningObserver; > class SearchPopupMenu; > > struct DateTimeChooserParameters; >+struct ShareDataWithParsedURL; > struct ViewportArguments; > struct WindowFeatures; > >@@ -159,6 +160,7 @@ public: > #endif > > void runOpenPanel(Frame&, FileChooser&); >+ void runShareSheet(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..6b4461584ae3ad31c13f4d91a6e8aff90bf8983f 100644 >--- a/Source/WebCore/page/ChromeClient.h >+++ b/Source/WebCore/page/ChromeClient.h >@@ -101,6 +101,7 @@ class MediaPlayerRequestInstallMissingPluginsCallback; > > struct DateTimeChooserParameters; > struct GraphicsDeviceAdapter; >+struct ShareDataWithParsedURL; > struct ViewportArguments; > struct WindowFeatures; > >@@ -282,6 +283,8 @@ public: > #endif > > virtual void runOpenPanel(Frame&, FileChooser&) = 0; >+ virtual void runShareSheet(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..3de0d4ab499ca843ece6210012e9eccbdcf444e4 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,44 @@ bool Navigator::onLine() const > return platformStrategies()->loaderStrategy()->isOnLine(); > } > >+void Navigator::share(ScriptExecutionContext& context, ShareData data, Ref<DeferredPromise>&& promise) >+{ >+ if (!m_frame->page()) { >+ promise->reject(TypeError); >+ return; >+ } >+ >+ if (data.title.isEmpty() && data.url.isEmpty() && data.text.isEmpty()) { >+ promise->reject(TypeError); >+ return; >+ } >+ >+ if (!UserGestureIndicator::processingUserGesture()) { >+ promise->reject(NotAllowedError); >+ return; >+ } >+ >+ URL url = context.completeURL(data.url); >+ if (!url.isValid()) { >+ promise->reject(TypeError); >+ return; >+ } >+ >+ ShareDataWithParsedURL shareData = { >+ data, >+ url, >+ }; >+ >+ m_frame->page()->chrome().runShareSheet(shareData, [promise = WTFMove(promise)] (bool completed) { >+ if (completed) { >+ promise->resolve(); >+ return; >+ } >+ promise->reject(Exception { AbortError, "Abort due to cancellation of share."_s }); >+ }); >+ 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..126fb9424dcca73df965787086dd784a008c491c >--- /dev/null >+++ b/Source/WebCore/page/NavigatorShare.idl >@@ -0,0 +1,32 @@ >+/* >+* 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. >+*/ >+ >+ >+[ >+ 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..1f5b00b6c9bf4613ba0fdff136bded85f78feb31 >--- /dev/null >+++ b/Source/WebCore/page/ShareData.idl >@@ -0,0 +1,30 @@ >+/* >+* 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. >+*/ >+ >+dictionary ShareData { >+ USVString title; >+ USVString text; >+ USVString url; >+}; >diff --git a/Source/WebKit/Platform/spi/ios/UIKitSPI.h b/Source/WebKit/Platform/spi/ios/UIKitSPI.h >index 2874908fe8600b07643b1b56319b98169db1880d..95fff149101c3ae2c75d9af9882f42ad1797dc4e 100644 >--- a/Source/WebKit/Platform/spi/ios/UIKitSPI.h >+++ b/Source/WebKit/Platform/spi/ios/UIKitSPI.h >@@ -418,12 +418,17 @@ typedef enum { > @property (readonly) NSString *_hostApplicationBundleIdentifier; > @end > >+#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 110000 >+@interface NSURL () >+@property (nonatomic, copy, nullable, setter=_setTitle:) NSString *_title; >+@end >+#endif >+ > @protocol UIViewControllerContextTransitioningEx <UIViewControllerContextTransitioning> > - (void)__runAlongsideAnimations; > - (void)_interactivityDidChange:(BOOL)isInteractive; > @property (nonatomic, assign, setter=_setAllowUserInteraction:, getter=_allowUserInteraction) BOOL _allowUserInteraction; > @property (nonatomic, assign, setter=_setPercentOffset:) CGFloat _percentOffset; >-@property (nonatomic, retain, setter=_setContainerViews:) NSArray *_containerViews; > @end > > @interface _UIViewControllerTransitionContext : NSObject <UIViewControllerContextTransitioningEx> >diff --git a/Source/WebKit/Scripts/webkit/messages.py b/Source/WebKit/Scripts/webkit/messages.py >index 7af168c93419cb329452060a410c8703ea10a359..5d5ab40dac669ca529f0f069b7771e49dea2a891 100644 >--- a/Source/WebKit/Scripts/webkit/messages.py >+++ b/Source/WebKit/Scripts/webkit/messages.py >@@ -381,6 +381,7 @@ def headers_for_type(type): > 'WebCore::AutoplayEventFlags': ['<WebCore/AutoplayEvent.h>'], > 'WebCore::ExceptionDetails': ['<WebCore/JSDOMExceptionHandling.h>'], > 'WebCore::FileChooserSettings': ['<WebCore/FileChooser.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/ShareSheetCallbackID.h b/Source/WebKit/Shared/ShareSheetCallbackID.h >new file mode 100644 >index 0000000000000000000000000000000000000000..b57baa216ddaa2e20bbe0f19c814063b63bdc478 >--- /dev/null >+++ b/Source/WebKit/Shared/ShareSheetCallbackID.h >@@ -0,0 +1,28 @@ >+/* >+ * 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. >+ */ >+ >+ >+typedef uint64_t ShareSheetCallbackID; >+ >diff --git a/Source/WebKit/Shared/WebCoreArgumentCoders.cpp b/Source/WebKit/Shared/WebCoreArgumentCoders.cpp >index 353d328542fb8ea91b6393da771be8565ba2e940..d2eb372ad39769a06ff6a7aee93b1cdb41b753bd 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 8ca760fcffdcd4d8f62f6233929303385aafc35f..f1b1395b25ed093993f1d4a5bb2bfcf609362a8e 100644 >--- a/Source/WebKit/Shared/WebCoreArgumentCoders.h >+++ b/Source/WebKit/Shared/WebCoreArgumentCoders.h >@@ -102,6 +102,8 @@ struct DictionaryPopupInfo; > struct EventTrackingRegions; > struct ExceptionDetails; > struct FileChooserSettings; >+struct ShareData; >+struct ShareDataWithParsedURL; > struct Length; > struct GrammarDetail; > struct MimeClassInfo; >@@ -474,6 +476,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..9f91f60883e64f12b3ab3485d6d3e74ade3ce396 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: DEFAULT_WEB_SHARE_ENABLED >+ humanReadableName: "Web Share" >+ humanReadableDescription: "Enable support for share sheet via Web Share API" >+ webcoreBinding: RuntimeEnabledFeatures >+ > ViewportFitEnabled: > type: bool > defaultValue: true >diff --git a/Source/WebKit/Shared/WebPreferencesDefaultValues.h b/Source/WebKit/Shared/WebPreferencesDefaultValues.h >index 47812b142f46c06962bfc96cfdc2dcc6a1dc9a72..7398a24a335fb110b526089d3136c26da2fde08b 100644 >--- a/Source/WebKit/Shared/WebPreferencesDefaultValues.h >+++ b/Source/WebKit/Shared/WebPreferencesDefaultValues.h >@@ -65,6 +65,7 @@ > #define DEFAULT_TEXT_AREAS_ARE_RESIZABLE false > #define DEFAULT_JAVASCRIPT_CAN_OPEN_WINDOWS_AUTOMATICALLY false > #define DEFAULT_SHOULD_RESPECT_IMAGE_ORIENTATION true >+#define DEFAULT_WEB_SHARE_ENABLED true > #define DEFAULT_PASSWORD_ECHO_ENABLED true > #define DEFAULT_ALLOWS_INLINE_MEDIA_PLAYBACK false > #define DEFAULT_ALLOWS_INLINE_MEDIA_PLAYBACK_AFTER_FULLSCREEN true >@@ -84,6 +85,7 @@ > #define DEFAULT_TEXT_AREAS_ARE_RESIZABLE true > #define DEFAULT_JAVASCRIPT_CAN_OPEN_WINDOWS_AUTOMATICALLY true > #define DEFAULT_SHOULD_RESPECT_IMAGE_ORIENTATION false >+#define DEFAULT_WEB_SHARE_ENABLED false > #define DEFAULT_PASSWORD_ECHO_ENABLED false > #define DEFAULT_ALLOWS_INLINE_MEDIA_PLAYBACK true > #define DEFAULT_ALLOWS_INLINE_MEDIA_PLAYBACK_AFTER_FULLSCREEN false >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..45d6e9e3e263962c4a005e09ec873a078dca4f77 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 true >+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/API/Cocoa/WKWebView.mm b/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm >index 2fa783ffea2a531a952b1c346455be12910212da..e804b99879c7b854dcfe096aff174c3eb4acdd32 100644 >--- a/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm >+++ b/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm >@@ -5931,6 +5931,11 @@ static WebCore::UserInterfaceLayoutDirection toUserInterfaceLayoutDirection(UISe > [_contentView setTimePickerValueToHour:hour minute:minute]; > } > >+- (void)invokeShareSheetWithResolution:(BOOL)resolved >+{ >+ [_contentView invokeShareSheetWithResolution:resolved]; >+} >+ > - (void)selectFormAccessoryPickerRow:(int)rowIndex > { > [_contentView selectFormAccessoryPickerRow:rowIndex]; >diff --git a/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h b/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h >index a3c5fa039f84c1c040d9f1886115c5415ef80af2..c7fbf7521fb4a0b3a8b9854687e469b8dfb450ff 100644 >--- a/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h >+++ b/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h >@@ -381,6 +381,8 @@ typedef NS_OPTIONS(NSUInteger, _WKRectEdge) { > @property (nonatomic, readonly) NSString *formInputLabel WK_API_AVAILABLE(ios(WK_IOS_TBA)); > - (void)setTimePickerValueToHour:(NSInteger)hour minute:(NSInteger)minute WK_API_AVAILABLE(ios(WK_IOS_TBA)); > >+- (void)invokeShareSheetWithResolution:(BOOL)resolved WK_API_AVAILABLE(ios(WK_IOS_TBA)); >+ > - (void)applyAutocorrection:(NSString *)newString toString:(NSString *)oldString withCompletionHandler:(void (^)(void))completionHandler WK_API_AVAILABLE(ios(11.0)); > > - (void)didStartFormControlInteraction WK_API_AVAILABLE(ios(10.3)); >diff --git a/Source/WebKit/UIProcess/PageClient.h b/Source/WebKit/UIProcess/PageClient.h >index 04c8115aa58b625aa6209b7d5714d5dc48b50362..2984d83229c5250968218aa05f2e8057eccaffaa 100644 >--- a/Source/WebKit/UIProcess/PageClient.h >+++ b/Source/WebKit/UIProcess/PageClient.h >@@ -80,6 +80,7 @@ struct DictionaryPopupInfo; > struct Highlight; > struct TextIndicatorData; > struct ViewportAttributes; >+struct ShareDataWithParsedURL; > > template <typename> class RectEdges; > using FloatBoxExtent = RectEdges<float>; >@@ -201,6 +202,7 @@ public: > virtual void handleDownloadRequest(DownloadProxy*) = 0; > > virtual bool handleRunOpenPanel(WebPageProxy*, WebFrameProxy*, API::OpenPanelParameters*, WebOpenPanelResultListenerProxy*) { return false; } >+ virtual bool showShareSheet(WebPageProxy*, 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 831c7296af449c2696e9f68d293e6ae4a9c6cc20..982b4111e5db790202eb5fcc9f0b1dc7a651caed 100644 >--- a/Source/WebKit/UIProcess/WebPageProxy.cpp >+++ b/Source/WebKit/UIProcess/WebPageProxy.cpp >@@ -77,6 +77,7 @@ > #include "PluginProcessManager.h" > #include "PrintInfo.h" > #include "SafeBrowsingResult.h" >+#include "ShareSheetCallbackID.h" > #include "TextChecker.h" > #include "TextCheckerState.h" > #include "UIMessagePortChannelProvider.h" >@@ -146,6 +147,7 @@ > #include <WebCore/ResourceLoadStatistics.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> >@@ -4586,6 +4588,15 @@ void WebPageProxy::runOpenPanel(uint64_t frameID, const SecurityOriginData& fram > } > } > >+void WebPageProxy::runShareSheet(const ShareDataWithParsedURL& shareData, ShareSheetCallbackID callbackID) >+{ >+ CompletionHandler<void(bool)> completionHandler = [this, protectedThis = makeRef(*this), callbackID] (bool access) { >+ m_process->send(Messages::WebPage::RunShareSheetResponse(access, callbackID), m_pageID); >+ }; >+ >+ m_pageClient.showShareSheet(this, shareData, WTFMove(completionHandler)); >+} >+ > void WebPageProxy::printFrame(uint64_t frameID) > { > ASSERT(!m_isPerformingDOMPrintOperation); >diff --git a/Source/WebKit/UIProcess/WebPageProxy.h b/Source/WebKit/UIProcess/WebPageProxy.h >index 8c55d2558f8b6decd00a4c587219a400f1b0e9a1..368b07fac6f6e75761ec99e68af7832f6292fecb 100644 >--- a/Source/WebKit/UIProcess/WebPageProxy.h >+++ b/Source/WebKit/UIProcess/WebPageProxy.h >@@ -187,6 +187,7 @@ struct FileChooserSettings; > struct GlobalWindowIdentifier; > struct MediaStreamRequest; > struct SecurityOriginData; >+struct ShareData; > struct TextAlternativeWithRange; > struct TextCheckingResult; > struct ViewportAttributes; >@@ -1475,6 +1476,7 @@ private: > void didChangeViewportProperties(const WebCore::ViewportAttributes&); > void pageDidScroll(); > void runOpenPanel(uint64_t frameID, const WebCore::SecurityOriginData&, const WebCore::FileChooserSettings&); >+ void runShareSheet(const WebCore::ShareDataWithParsedURL&, uint64_t callbackID); > 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 ed11e37c8a5d0b870a6424b28bc92a2ab408bc07..6ad43354954997c8f148ceba416ceec11341640f 100644 >--- a/Source/WebKit/UIProcess/WebPageProxy.messages.in >+++ b/Source/WebKit/UIProcess/WebPageProxy.messages.in >@@ -76,6 +76,7 @@ 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(struct WebCore::ShareDataWithParsedURL shareData, uint64_t callbackID) > 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 13fbd290e100642ffd86085471a166e7e504c0a4..182c4f9810d02ffec3cd49a1bf23687bfd2de569 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 showShareSheet(WebPageProxy*, 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 d79d0c2032829b557c7cd6b3bd7b85eb11eae60d..684ecafb9e51750d4fa7a7229dd2951e26f2de2d 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/PromisedAttachmentInfo.h> >+#import <WebCore/ShareData.h> > #import <WebCore/SharedBuffer.h> > #import <WebCore/TextIndicator.h> > #import <WebCore/ValidationBubble.h> >@@ -569,6 +570,12 @@ bool PageClientImpl::handleRunOpenPanel(WebPageProxy*, WebFrameProxy*, API::Open > return true; > } > >+bool PageClientImpl::showShareSheet(WebPageProxy*, 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 bfa67be1b31fa94263b6d5798783716a4da2b8fd..952588b17fa12a460e870884cc96aa4441b73a77 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 PromisedAttachmentInfo; > 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; >@@ -359,6 +363,7 @@ FOR_EACH_WKCONTENTVIEW_ACTION(DECLARE_WKCONTENTVIEW_ACTION_FOR_WEB_VIEW) > - (void)_simulateTextEntered:(NSString *)text; > - (void)selectFormAccessoryPickerRow:(NSInteger)rowIndex; > - (void)setTimePickerValueToHour:(NSInteger)hour minute:(NSInteger)minute; >+- (void)invokeShareSheetWithResolution:(BOOL)resolved; > - (NSDictionary *)_contentsOfUserInterfaceItem:(NSString *)userInterfaceItem; > > @property (nonatomic, readonly) NSString *textContentTypeForTesting; >diff --git a/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm b/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm >index 306f38b1e0e0278ab90a8dd4e8d48a74a1f99089..d86bcc5a15e39839a36d48622d1b9685fd865f78 100644 >--- a/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm >+++ b/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm >@@ -84,6 +84,7 @@ > #import <WebCore/PromisedAttachmentInfo.h> > #import <WebCore/RuntimeApplicationChecks.h> > #import <WebCore/Scrollbar.h> >+#import <WebCore/ShareData.h> > #import <WebCore/TextIndicator.h> > #import <WebCore/VisibleSelection.h> > #import <WebCore/WebCoreNSURLExtras.h> >@@ -779,6 +780,12 @@ static inline bool hasAssistedNode(WebKit::AssistedNodeInformation assistedNodeI > _fileUploadPanel = nil; > } > >+ if (_shareSheet) { >+ [_shareSheet setDelegate:nil]; >+ [_shareSheet dismiss]; >+ _shareSheet = nil; >+ } >+ > _inputViewUpdateDeferrer = nullptr; > _assistedNodeInformation = { }; > >@@ -4685,6 +4692,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); >@@ -4693,6 +4712,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 >@@ -5850,6 +5877,11 @@ static NSArray<UIItemProvider *> *extractItemProvidersFromDropSession(id <UIDrop > #endif > } > >+- (void)invokeShareSheetWithResolution:(BOOL)resolved >+{ >+ [_shareSheet invokeShareSheetWithResolution:resolved]; >+} >+ > - (NSDictionary *)_contentsOfUserInterfaceItem:(NSString *)userInterfaceItem > { > if ([userInterfaceItem isEqualToString:@"actionSheet"]) >diff --git a/Source/WebKit/UIProcess/ios/forms/WKShareSheet.h b/Source/WebKit/UIProcess/ios/forms/WKShareSheet.h >new file mode 100644 >index 0000000000000000000000000000000000000000..c9a2402a2d4fe5a3f6ee7b5b2ca9e03dfe521c64 >--- /dev/null >+++ b/Source/WebKit/UIProcess/ios/forms/WKShareSheet.h >@@ -0,0 +1,54 @@ >+/* >+ * 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/UIKit.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> >+ >+@class WKContentView; >+@protocol WKShareSheetDelegate; >+ >+@interface WKShareSheet : UIViewController >+- (instancetype)initWithView:(WKContentView *)view; >+ >+- (void)presentWithParameters:(const WebCore::ShareDataWithParsedURL&)data completionHandler:(WTF::CompletionHandler<void(bool)>&&)completionHandler; >+- (void)dismiss; >+- (void)invokeShareSheetWithResolution:(BOOL)resolved; >+ >+@property (nonatomic, weak) id <WKShareSheetDelegate> delegate; >+@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..0fa4baa3e21560483a4b9b5683cd487d48cbf6ae >--- /dev/null >+++ b/Source/WebKit/UIProcess/ios/forms/WKShareSheet.mm >@@ -0,0 +1,130 @@ >+/* >+ * 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 "UIKitSPI.h" >+#import "WKContentViewInteraction.h" >+#import "WebPageProxy.h" >+#import <WebCore/ShareData.h> >+#import <wtf/RetainPtr.h> >+#import <wtf/WeakObjCPtr.h> >+ >+using namespace WebKit; >+ >+@implementation WKShareSheet { >+ WeakObjCPtr<WKContentView> _view; >+ >+ RetainPtr<UIActivityViewController> _shareSheetViewController; >+ RetainPtr<UIViewController> _presentationViewController; >+ BOOL _shouldDismissWithAnimation; >+} >+ >+- (instancetype)initWithView:(WKContentView *)view >+{ >+ if (!(self = [super init])) >+ return nil; >+ _view = view; >+ _shouldDismissWithAnimation = YES; >+ return self; >+} >+ >+- (void)presentWithParameters:(const WebCore::ShareDataWithParsedURL &)data completionHandler:(WTF::CompletionHandler<void(bool)>&&)completionHandler >+{ >+ auto shareDataArray = adoptNS([[NSMutableArray alloc] init]); >+ >+ if (!data.shareData.text.isEmpty()) >+ [shareDataArray addObject:(NSString *)data.shareData.text]; >+ >+ if (!data.url.isNull()) { >+ NSURL *url = (NSURL *)data.url; >+ if (!data.shareData.title.isEmpty()) >+ url._title = data.shareData.title; >+ [shareDataArray addObject:url]; >+ } >+ >+ if (!data.shareData.title.isEmpty() && ![shareDataArray count]) >+ [shareDataArray addObject:(NSString *)data.shareData.title]; >+ >+ auto shareSheetController = adoptNS([[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.get().completionWithItemsHandler = completionHandlerBlock.get(); >+ _shareSheetViewController = WTFMove(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.getAutoreleased()] dismissViewControllerAnimated:_shouldDismissWithAnimation 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 >+{ >+ _presentationViewController = [UIViewController _viewControllerForFullScreenPresentationFromView:_view.getAutoreleased()]; >+ [_presentationViewController presentViewController:viewController animated:animated completion:nil]; >+} >+ >+- (void)invokeShareSheetWithResolution:(BOOL)resolved >+{ >+ _shouldDismissWithAnimation = NO; >+ _shareSheetViewController.get().completionWithItemsHandler(nil, resolved, nil, nil); >+} >+ >+@end >+#endif // PLATFORM(IOS) >diff --git a/Source/WebKit/WebKit.xcodeproj/project.pbxproj b/Source/WebKit/WebKit.xcodeproj/project.pbxproj >index c7715590ed71ccdd23df285a3aa7c36e543db7f6..f863bed756616c2474b83d3231f01f7da2e7ae7e 100644 >--- a/Source/WebKit/WebKit.xcodeproj/project.pbxproj >+++ b/Source/WebKit/WebKit.xcodeproj/project.pbxproj >@@ -439,6 +439,9 @@ > 1CA8B946127C882A00576C2B /* WebInspectorProxyMessages.h in Headers */ = {isa = PBXBuildFile; fileRef = 1CA8B944127C882A00576C2B /* WebInspectorProxyMessages.h */; }; > 1CBBE4A019B66C53006B7D81 /* WebInspectorUIMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1CBBE49E19B66C53006B7D81 /* WebInspectorUIMessageReceiver.cpp */; }; > 1CBBE4A119B66C53006B7D81 /* WebInspectorUIMessages.h in Headers */ = {isa = PBXBuildFile; fileRef = 1CBBE49F19B66C53006B7D81 /* WebInspectorUIMessages.h */; }; >+ 1D67B339212E1F6100FAA786 /* ShareSheetCallbackID.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D67B338212E1F6100FAA786 /* ShareSheetCallbackID.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 */; }; > 1F7506B11859163700EC0FF7 /* WKWebProcessPlugInFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F0181691858DC1500F92884 /* WKWebProcessPlugInFrame.h */; settings = {ATTRIBUTES = (Private, ); }; }; >@@ -2644,6 +2647,9 @@ > 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>"; }; >+ 1D67B338212E1F6100FAA786 /* ShareSheetCallbackID.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShareSheetCallbackID.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>"; }; >@@ -5243,6 +5249,7 @@ > 8313F7E71F7DAE0300B944EB /* SharedStringHashTable.h */, > 83F9644B1FA0F76200C47750 /* SharedStringHashTableReadOnly.cpp */, > 83F9644C1FA0F76300C47750 /* SharedStringHashTableReadOnly.h */, >+ 1D67B338212E1F6100FAA786 /* ShareSheetCallbackID.h */, > 5272B2881406985D0096A5D0 /* StatisticsData.cpp */, > 5272B2891406985D0096A5D0 /* StatisticsData.h */, > 1A5E4DA312D3BD3D0099A2BB /* TextCheckerState.h */, >@@ -8716,6 +8723,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 */, >@@ -9399,6 +9408,7 @@ > 8313F7EC1F7DAE0800B944EB /* SharedStringHashStore.h in Headers */, > 8313F7EE1F7DAE0800B944EB /* SharedStringHashTable.h in Headers */, > 83F9644E1FA0F76E00C47750 /* SharedStringHashTableReadOnly.h in Headers */, >+ 1D67B339212E1F6100FAA786 /* ShareSheetCallbackID.h in Headers */, > 995226D6207D184600F78420 /* SimulatedInputDispatcher.h in Headers */, > 2DAF06D618BD1A470081CEB1 /* SmartMagnificationController.h in Headers */, > 2DE6943E18BD2A68005C15E5 /* SmartMagnificationControllerMessages.h in Headers */, >@@ -9937,6 +9947,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 */, >@@ -11393,6 +11404,8 @@ > 51CD1C5D1B3493AF00142CA5 /* WKSecurityOriginRef.cpp 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 */, > BC407619124FF0370068F20A /* WKStringCF.mm in Sources */, >diff --git a/Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp b/Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp >index e7929de037f4ea741bdf05779094d9ad6e4906f2..ba21ac9936dd1dfd7c4764f49a0d9ae1f2156df5 100644 >--- a/Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp >+++ b/Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp >@@ -810,6 +810,11 @@ 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(ShareDataWithParsedURL& shareData, CompletionHandler<void(bool)>&& callback) >+{ >+ m_page.runShareSheet(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..730bd85efacc47ebea1581bfa373b248927acc3a 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::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 4b5f5ab8690efe69adcd1360e7c1988adf050ff5..4f7c28d825af4e774d2b3cd488b28029b73ca027 100644 >--- a/Source/WebKit/WebProcess/WebPage/WebPage.cpp >+++ b/Source/WebKit/WebProcess/WebPage/WebPage.cpp >@@ -61,6 +61,7 @@ > #include "SessionState.h" > #include "SessionStateConversion.h" > #include "SessionTracker.h" >+#include "ShareSheetCallbackID.h" > #include "ShareableBitmap.h" > #include "UserMediaPermissionRequestManager.h" > #include "ViewGestureGeometryCollector.h" >@@ -6063,6 +6064,29 @@ void WebPage::storageAccessResponse(bool wasGranted, uint64_t contextId) > callback(wasGranted); > } > #endif >+ >+static ShareSheetCallbackID nextShareSheetCallbackID() >+{ >+ static ShareSheetCallbackID nextCallbackID = 0; >+ return ++nextCallbackID; >+} >+ >+void WebPage::runShareSheet(ShareDataWithParsedURL& shareData, WTF::CompletionHandler<void(bool)>&& callback) >+{ >+ ShareSheetCallbackID callbackID = nextShareSheetCallbackID(); >+ auto addResult = m_shareSheetResponseCallbackMap.add(callbackID, WTFMove(callback)); >+ ASSERT(addResult.isNewEntry); >+ if (addResult.iterator->value) >+ send(Messages::WebPageProxy::RunShareSheet(WTFMove(shareData), callbackID)); >+ else >+ callback(false); >+} >+ >+void WebPage::runShareSheetResponse(bool wasGranted, ShareSheetCallbackID callbackID) >+{ >+ auto callback = m_shareSheetResponseCallbackMap.take(callbackID); >+ callback(wasGranted); >+} > > #if ENABLE(ATTACHMENT_ELEMENT) > >diff --git a/Source/WebKit/WebProcess/WebPage/WebPage.h b/Source/WebKit/WebProcess/WebPage/WebPage.h >index 4d4ae851b265ecb39e0f5eea40ae01069d440081..54fbb1c38dbb0043d6e758f8703ea2b7272e223d 100644 >--- a/Source/WebKit/WebProcess/WebPage/WebPage.h >+++ b/Source/WebKit/WebProcess/WebPage/WebPage.h >@@ -44,6 +44,7 @@ > #include "OptionalCallbackID.h" > #include "Plugin.h" > #include "SandboxExtension.h" >+#include "ShareSheetCallbackID.h" > #include "SharedMemory.h" > #include "UserData.h" > #include "WebBackForwardListProxy.h" >@@ -61,6 +62,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 +174,6 @@ struct PromisedAttachmentInfo; > struct TextCheckingResult; > struct ViewportArguments; > >- >- > #if ENABLE(ATTACHMENT_ELEMENT) > class HTMLAttachmentElement; > struct AttachmentDisplayOptions; >@@ -1074,6 +1074,9 @@ public: > void storageAccessResponse(bool wasGranted, uint64_t contextId); > #endif > >+ void runShareSheet(WebCore::ShareDataWithParsedURL&, WTF::CompletionHandler<void(bool)>&& callback); >+ void runShareSheetResponse(bool wasCompleted, uint64_t contextId); >+ > #if ENABLE(ATTACHMENT_ELEMENT) > void insertAttachment(const String& identifier, const WebCore::AttachmentDisplayOptions&, std::optional<uint64_t>&& fileSize, const String& fileName, const String& contentType, CallbackID); > void setAttachmentDisplayOptions(const String& identifier, const WebCore::AttachmentDisplayOptions&, CallbackID); >@@ -1728,7 +1731,8 @@ 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<ShareSheetCallbackID, WTF::Function<void(bool completed)>> m_shareSheetResponseCallbackMap; > > #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 289abda87f053b4bac25bead05524647d974659f..9c1a011819200a9251a11f8888231cc1055bd094 100644 >--- a/Source/WebKit/WebProcess/WebPage/WebPage.messages.in >+++ b/Source/WebKit/WebProcess/WebPage/WebPage.messages.in >@@ -290,6 +290,7 @@ messages -> WebPage LegacyReceiver { > #endif > DidChooseFilesForOpenPanel(Vector<String> fileURLs) > DidCancelForOpenPanel() >+ RunShareSheetResponse(bool wasGranted, uint64_t callbackID) > #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..341f268aea258fb0e3b0715dc92c40e73a75063a 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::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..4e97ae8232db19bf02bf4525ebcaa4a7124dd2c3 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(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..638dd976e2dbbea1ddcd9ff827c3e24591660ce3 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::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..e556b58078c0cad90588f8dc45cd00bd8d441c35 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(ShareDataWithParsedURL&, CompletionHandler<void(bool)>&&) >+{ >+} >+ > void WebChromeClient::loadIconForFiles(const Vector<String>& filenames, FileIconLoader& iconLoader) > { > iconLoader.iconLoaded(createIconForFiles(filenames)); >diff --git a/Tools/DumpRenderTree/ios/UIScriptControllerIOS.mm b/Tools/DumpRenderTree/ios/UIScriptControllerIOS.mm >index 76425b973611af04b363e03085b9226dd7c6f6c2..bc9b210eb252eedfe27ba753d62f6eaf838a77a6 100644 >--- a/Tools/DumpRenderTree/ios/UIScriptControllerIOS.mm >+++ b/Tools/DumpRenderTree/ios/UIScriptControllerIOS.mm >@@ -159,6 +159,10 @@ void UIScriptController::setTimePickerValue(long, long) > { > } > >+void UIScriptController::invokeShareSheetWithResolution(bool) >+{ >+} >+ > void UIScriptController::selectFormAccessoryPickerRow(long rowIndex) > { > } >diff --git a/Tools/TestRunnerShared/UIScriptContext/Bindings/UIScriptController.idl b/Tools/TestRunnerShared/UIScriptContext/Bindings/UIScriptController.idl >index abf84708576f3783a3c797f1a98cd4fe0801c5e0..ab6a92466e70e3b1ae025847d393f0e723898deb 100644 >--- a/Tools/TestRunnerShared/UIScriptContext/Bindings/UIScriptController.idl >+++ b/Tools/TestRunnerShared/UIScriptContext/Bindings/UIScriptController.idl >@@ -193,6 +193,9 @@ interface UIScriptController { > > void setTimePickerValue(long hour, long minute); > >+ // Share sheet >+ void invokeShareSheetWithResolution(boolean resolved); >+ > // <datalist> > readonly attribute boolean isShowingDataListSuggestions; > >diff --git a/Tools/TestRunnerShared/UIScriptContext/UIScriptController.h b/Tools/TestRunnerShared/UIScriptContext/UIScriptController.h >index 7fd74da9570476d05295e0c27f54602c37f9dddd..98e655707db3b297b48740b23e2f81914e9d21d4 100644 >--- a/Tools/TestRunnerShared/UIScriptContext/UIScriptController.h >+++ b/Tools/TestRunnerShared/UIScriptContext/UIScriptController.h >@@ -101,6 +101,8 @@ public: > JSRetainPtr<JSStringRef> formInputLabel() const; > void setTimePickerValue(long hour, long minute); > >+ void invokeShareSheetWithResolution(bool resolved); >+ > bool isShowingDataListSuggestions() const; > > JSObjectRef contentsOfUserInterfaceItem(JSStringRef) const; >diff --git a/Tools/WebKitTestRunner/ios/UIScriptControllerIOS.mm b/Tools/WebKitTestRunner/ios/UIScriptControllerIOS.mm >index 6597040384e3fe7ea39fdd1620ebb139df32c9c3..97db90a6068e272bee006c18f58a2c11067fe383 100644 >--- a/Tools/WebKitTestRunner/ios/UIScriptControllerIOS.mm >+++ b/Tools/WebKitTestRunner/ios/UIScriptControllerIOS.mm >@@ -409,6 +409,12 @@ void UIScriptController::setTimePickerValue(long hour, long minute) > TestRunnerWKWebView *webView = TestController::singleton().mainWebView()->platformView(); > [webView setTimePickerValueToHour:hour minute:minute]; > } >+ >+void UIScriptController::invokeShareSheetWithResolution(bool resolved) >+{ >+ TestRunnerWKWebView *webView = TestController::singleton().mainWebView()->platformView(); >+ [webView invokeShareSheetWithResolution:resolved]; >+} > > JSObjectRef UIScriptController::contentsOfUserInterfaceItem(JSStringRef interfaceItem) const > { >diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog >index dec5ae7e85597492849598fdc4d0e599c75fff00..44f6b991070cbe0dd9fe69cbdde85947f7deda4a 100644 >--- a/LayoutTests/ChangeLog >+++ b/LayoutTests/ChangeLog >@@ -1,3 +1,14 @@ >+2018-08-24 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!). >+ >+ * fast/dom/navigator-detached-no-crash-expected.txt: >+ Updated expected results. >+ > 2018-08-27 Youenn Fablet <youenn@apple.com> > > Various IndexDB tests abandon documents >diff --git a/LayoutTests/imported/w3c/ChangeLog b/LayoutTests/imported/w3c/ChangeLog >index f36cec5f20c743f358b75ffcc8e4f75dce7f24a5..a8c6eeea74323d6e7cdf738b00cb8970beea4038 100644 >--- a/LayoutTests/imported/w3c/ChangeLog >+++ b/LayoutTests/imported/w3c/ChangeLog >@@ -1,3 +1,17 @@ >+2018-08-24 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!). >+ >+ * web-platform-tests/web-share/idlharness.https-expected.txt: >+ * web-platform-tests/web-share/share-empty.https-expected.txt: >+ * web-platform-tests/web-share/share-url-invalid.https-expected.txt: >+ * web-platform-tests/web-share/share-without-user-gesture.https-expected.txt: >+ Updated expected results. >+ > 2018-08-27 Andy Estes <aestes@apple.com> > > [Payment Request] Update payment-request web platform tests >diff --git a/LayoutTests/fast/dom/navigator-detached-no-crash-expected.txt b/LayoutTests/fast/dom/navigator-detached-no-crash-expected.txt >index 333ec9608d8d4df57c1ff0f2d7e4e25378ba373f..d9f644f09c91d899f6ec71e262fbdc5fa598d8bd 100644 >--- a/LayoutTests/fast/dom/navigator-detached-no-crash-expected.txt >+++ b/LayoutTests/fast/dom/navigator-detached-no-crash-expected.txt >@@ -1,4 +1,5 @@ > CONSOLE MESSAGE: Unhandled Promise Rejection: TypeError: Not enough arguments >+CONSOLE MESSAGE: Unhandled Promise Rejection: TypeError: Not enough arguments > This tests that the navigator object of a deleted frame is disconnected properly. Accessing fields or methods shouldn't crash the browser. > Check Navigator > navigator.appCodeName is OK >@@ -20,6 +21,8 @@ navigator.productSub is OK > navigator.requestMediaKeySystemAccess() is OK > navigator.sendBeacon() threw err TypeError: Not enough arguments > navigator.serviceWorker is OK >+navigator.share() is OK >+navigator.standalone is OK > navigator.userAgent is OK > navigator.vendor is OK > navigator.vendorSub is OK >@@ -43,6 +46,8 @@ navigator.productSub is OK > navigator.requestMediaKeySystemAccess() is OK > navigator.sendBeacon() threw err TypeError: Not enough arguments > navigator.serviceWorker is OK >+navigator.share() is OK >+navigator.standalone is OK > navigator.userAgent is OK > navigator.vendor is OK > navigator.vendorSub is OK >diff --git a/LayoutTests/fast/events/ios/share-expected.txt b/LayoutTests/fast/events/ios/share-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..c67d83e32fb840cc749563eb5156ee6120164c2b >--- /dev/null >+++ b/LayoutTests/fast/events/ios/share-expected.txt >@@ -0,0 +1,2 @@ >+PASS: Share sheet invoked. >+ >diff --git a/LayoutTests/fast/events/ios/share.html b/LayoutTests/fast/events/ios/share.html >new file mode 100644 >index 0000000000000000000000000000000000000000..982ca8fbd22bdf45fc363345191be56142364b0c >--- /dev/null >+++ b/LayoutTests/fast/events/ios/share.html >@@ -0,0 +1,45 @@ >+<!DOCTYPE html> <!-- webkit-test-runner [ useFlexibleViewport=true ] --> >+ >+<html> >+<meta name="viewport" content="initial-scale=5, width=device-width"> >+<head> >+ >+ <script src="../../../resources/ui-helper.js"></script> >+ <script> >+ >+ if (window.testRunner) { >+ testRunner.dumpAsText(); >+ testRunner.waitUntilDone(); >+ } >+ >+ let write = (message) => output.innerHTML += (message + "<br>"); >+ >+ async function runTest() >+ { >+ document.getElementById("target").addEventListener("click", async () => { >+ navigator.share({ title: "Example Page", url: "url", text: "text" }).then((result) => { >+ write("PASS: Share sheet invoked."); >+ testRunner.notifyDone(); >+ }); >+ UIHelper.invokeShareSheetWithResolution(true); >+ }); >+ await UIHelper.activateAt(50, 50); >+ } >+ >+ </script> >+ <style> >+ #target { >+ height: 100px; >+ width: 100px; >+ background-color: silver; >+ } >+ </style> >+</head> >+<body onload="runTest()"> >+<pre id="output"></pre> >+<button id="target"> >+</button> >+ >+</body> >+</html> >+ >diff --git a/LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/web-share/idlharness.https-expected.txt b/LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/web-share/idlharness.https-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..fb04f7688d8d0e1ffe48e8f95aea486ed7cb91bb >--- /dev/null >+++ b/LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/web-share/idlharness.https-expected.txt >@@ -0,0 +1,7 @@ >+ >+PASS Test driver >+FAIL Navigator interface: operation share(ShareData) assert_equals: property has wrong .length expected 0 but got 1 >+PASS Unscopable handled correctly for share(ShareData) on Navigator >+PASS Navigator interface: navigator must inherit property "share(ShareData)" with the proper type >+PASS Navigator interface: calling share(ShareData) on navigator with too few arguments must throw TypeError >+ >diff --git a/LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/web-share/share-empty.https-expected.txt b/LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/web-share/share-empty.https-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..57d3291f932f948e0069056b38e808709c3dd8d3 >--- /dev/null >+++ b/LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/web-share/share-empty.https-expected.txt >@@ -0,0 +1,7 @@ >+ >+PASS share with no arguments (same as empty dictionary) >+PASS share with an empty dictionary >+PASS share with a undefined argument (same as empty dictionary) >+PASS share with a null argument (same as empty dictionary) >+PASS share with a dictionary containing only surplus fields >+ >diff --git a/LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/web-share/share-url-invalid.https-expected.txt b/LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/web-share/share-url-invalid.https-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..0e9044299dcc8b133c1312b6e5b29c3c541a619e >--- /dev/null >+++ b/LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/web-share/share-url-invalid.https-expected.txt >@@ -0,0 +1,3 @@ >+ >+PASS share with an invalid URL >+ >diff --git a/LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/web-share/share-without-user-gesture.https-expected.txt b/LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/web-share/share-without-user-gesture.https-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..1ddfa676084d0965d68acec86bc96fe63c38315a >--- /dev/null >+++ b/LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/web-share/share-without-user-gesture.https-expected.txt >@@ -0,0 +1,3 @@ >+ >+PASS share without a user gesture >+ >diff --git a/LayoutTests/resources/ui-helper.js b/LayoutTests/resources/ui-helper.js >index 90a82119be122be095cb85913e6357d9cac31868..4c06f8066f5db1f74897cb47317e3ffb2e9cfbac 100644 >--- a/LayoutTests/resources/ui-helper.js >+++ b/LayoutTests/resources/ui-helper.js >@@ -243,6 +243,12 @@ window.UIHelper = class UIHelper { > return new Promise(resolve => testRunner.runUIScript(setValueScript, resolve)); > } > >+ static invokeShareSheetWithResolution(resolved) >+ { >+ const resolveShareSheet = `(() => uiController.invokeShareSheetWithResolution(${resolved}))()`; >+ return new Promise(resolve => testRunner.runUIScript(resolveShareSheet, resolve)); >+ } >+ > static textContentType() > { > return new Promise(resolve => {
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