WebKit Bugzilla
Attachment 349348 Details for
Bug 189443
: Implement the Web Share API for mac
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-189443-20180910160117.patch (text/plain), 38.11 KB, created by
Olivia Barnett
on 2018-09-10 16:01:17 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Olivia Barnett
Created:
2018-09-10 16:01:17 PDT
Size:
38.11 KB
patch
obsolete
>Subversion Revision: 235870 >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index 1b1e4e270b14a0b48aa110e03393c18499ab4ae8..5db077785397883c216886bb19a3b0176fab88b1 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,39 @@ >+2018-09-07 Olivia Barnett <obarnett@apple.com> >+ >+ Implement the Web Share API for mac >+ https://bugs.webkit.org/show_bug.cgi?id=189443 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * Shared/WebPreferencesDefaultValues.h: >+ * UIProcess/API/Cocoa/WKWebView.mm: >+ (-[WKWebView shareSheetDidDismiss:]): >+ * UIProcess/API/Cocoa/WKWebViewInternal.h: >+ * UIProcess/API/mac/WKView.mm: >+ (-[WKView shareSheetDidDismiss:]): >+ * UIProcess/Cocoa/WebViewImpl.h: >+ * UIProcess/Cocoa/WebViewImpl.mm: >+ (WebKit::WebViewImpl::showShareSheet): >+ (WebKit::WebViewImpl::shareSheetDidDismiss): >+ Implemented function for WKShareSheetDelegate. >+ >+ * UIProcess/Cocoa/WKShareSheet.h: >+ * UIProcess/Cocoa/WKShareSheet.mm: >+ (-[WKShareSheet initWithView:initWithView:]): >+ (-[WKShareSheet presentWithParameters:completionHandler:]): >+ (-[WKShareSheet sharingServicePicker:didChooseSharingService:]): >+ (-[WKShareSheet _cancel]): >+ (-[WKShareSheet dismiss]): >+ (-[WKShareSheet _dismissDisplayAnimated:]): >+ (-[WKShareSheet invokeShareSheetWithResolution:]): >+ (-[WKShareSheet initWithView:]): Deleted. >+ Added mac platform checks and share sheet functionality. >+ >+ * UIProcess/mac/PageClientImplMac.h: >+ * UIProcess/mac/PageClientImplMac.mm: >+ (WebKit::PageClientImpl::showShareSheet): >+ Allows macos to invoke the system share sheet. >+ > 2018-09-10 James Savage <james.savage@apple.com> > > Long press on picture/link show menu obscured by keyboard. >diff --git a/Source/WebKit/Shared/WebPreferencesDefaultValues.h b/Source/WebKit/Shared/WebPreferencesDefaultValues.h >index 3735777c9125b0ede82d5b3b9d1018f9e4b69056..84c0668a4c203b59e2d19aae67f486068c4ef9ad 100644 >--- a/Source/WebKit/Shared/WebPreferencesDefaultValues.h >+++ b/Source/WebKit/Shared/WebPreferencesDefaultValues.h >@@ -84,7 +84,6 @@ > #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 >@@ -173,7 +172,7 @@ > > #endif > >-#if PLATFORM(IOS) && !PLATFORM(WATCHOS) && !PLATFORM(APPLETV) >+#if PLATFORM(COCOA) && !PLATFORM(WATCHOS) && !PLATFORM(APPLETV) > #define DEFAULT_WEB_SHARE_ENABLED true > #else > #define DEFAULT_WEB_SHARE_ENABLED false >diff --git a/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm b/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm >index e0c29c5e4b7fd91ed3ca064b9c923e48abac8fb8..709c7889af8c2de4e5050f6d46abea71fc23d6dd 100644 >--- a/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm >+++ b/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm >@@ -5647,6 +5647,11 @@ static WebCore::UserInterfaceLayoutDirection toUserInterfaceLayoutDirection(UISe > _impl->setWindowOcclusionDetectionEnabled(enabled); > } > >+- (void)shareSheetDidDismiss:(WKShareSheet *)shareSheet >+{ >+ _impl->shareSheetDidDismiss(shareSheet); >+} >+ > - (void)_setOverrideDeviceScaleFactor:(CGFloat)deviceScaleFactor > { > _impl->setOverrideDeviceScaleFactor(deviceScaleFactor); >diff --git a/Source/WebKit/UIProcess/API/Cocoa/WKWebViewInternal.h b/Source/WebKit/UIProcess/API/Cocoa/WKWebViewInternal.h >index 4f3abbcce58f84f3597c1e3ce3d7428349a0e9d4..da0f3eb1997f4c334efc92b75daa8323b51cafb7 100644 >--- a/Source/WebKit/UIProcess/API/Cocoa/WKWebViewInternal.h >+++ b/Source/WebKit/UIProcess/API/Cocoa/WKWebViewInternal.h >@@ -28,6 +28,7 @@ > #if WK_API_ENABLED > > #import "SameDocumentNavigationType.h" >+#import "WKShareSheet.h" > #import "WKWebViewConfiguration.h" > #import "_WKAttachmentInternal.h" > #import "_WKWebViewPrintFormatterInternal.h" >@@ -47,6 +48,10 @@ > #define WK_WEB_VIEW_PROTOCOLS <UIScrollViewDelegate> > #endif > >+#if PLATFORM(MAC) >+#define WK_WEB_VIEW_PROTOCOLS <WKShareSheetDelegate> >+#endif >+ > #if !defined(WK_WEB_VIEW_PROTOCOLS) > #define WK_WEB_VIEW_PROTOCOLS > #endif >diff --git a/Source/WebKit/UIProcess/API/mac/WKView.mm b/Source/WebKit/UIProcess/API/mac/WKView.mm >index fe8d9ca5f4c5eac61d3c10d60b9e94866a2e0bf5..3c3236e34a1b1f887d07b6943aac28f0985342a3 100644 >--- a/Source/WebKit/UIProcess/API/mac/WKView.mm >+++ b/Source/WebKit/UIProcess/API/mac/WKView.mm >@@ -1331,6 +1331,11 @@ static WebCore::UserInterfaceLayoutDirection toUserInterfaceLayoutDirection(NSUs > _data->_impl->setWindowOcclusionDetectionEnabled(enabled); > } > >+- (void)shareSheetDidDismiss:(WKShareSheet *)shareSheet >+{ >+ _data->_impl->shareSheetDidDismiss(shareSheet); >+} >+ > - (void)setAllowsBackForwardNavigationGestures:(BOOL)allowsBackForwardNavigationGestures > { > _data->_impl->setAllowsBackForwardNavigationGestures(allowsBackForwardNavigationGestures); >diff --git a/Source/WebKit/UIProcess/Cocoa/WKShareSheet.h b/Source/WebKit/UIProcess/Cocoa/WKShareSheet.h >new file mode 100644 >index 0000000000000000000000000000000000000000..d54f0e161f2bf564a673532b35763056a75e6634 >--- /dev/null >+++ b/Source/WebKit/UIProcess/Cocoa/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(COCOA) && !PLATFORM(WATCHOS) && !PLATFORM(APPLETV) >+ >+#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> >+ >+#if PLATFORM(IOS) >+#import <UIKit/UIKit.h> >+#endif >+ >+@class WKContentView; >+@protocol WKShareSheetDelegate; >+ >+#if PLATFORM(MAC) >+@interface WKShareSheet : NSObject <NSSharingServicePickerDelegate> >+- (instancetype)initWithView:(NSView *)view; >+#else >+@interface WKShareSheet : NSObject >+- (instancetype)initWithView:(WKContentView *)view; >+#endif >+ >+- (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(WATCHOS) && !PLATFORM(APPLETV) >diff --git a/Source/WebKit/UIProcess/Cocoa/WKShareSheet.mm b/Source/WebKit/UIProcess/Cocoa/WKShareSheet.mm >new file mode 100644 >index 0000000000000000000000000000000000000000..c1957efee1f6df8ba52b3a5063dccfd7a47f8599 >--- /dev/null >+++ b/Source/WebKit/UIProcess/Cocoa/WKShareSheet.mm >@@ -0,0 +1,180 @@ >+/* >+ * 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(COCOA) && !PLATFORM(WATCHOS) && !PLATFORM(APPLETV) >+ >+#import "WKContentViewInteraction.h" >+#import "WebPageProxy.h" >+#import <WebCore/ShareData.h> >+#import <wtf/RetainPtr.h> >+#import <wtf/WeakObjCPtr.h> >+ >+#if PLATFORM(IOS) >+#import "UIKitSPI.h" >+#endif >+ >+using namespace WebKit; >+ >+@implementation WKShareSheet { >+#if PLATFORM(MAC) >+ WeakObjCPtr<NSView> _view; >+ >+ BOOL _isShowingSharingServicePicker; >+ RetainPtr<NSSharingServicePicker> _sharingServicePickerForMenu; >+ WTF::CompletionHandler<void(bool)> _completionHandler; >+#else >+ WeakObjCPtr<WKContentView> _view; >+ >+ RetainPtr<UIActivityViewController> _shareSheetViewController; >+ RetainPtr<UIViewController> _presentationViewController; >+ BOOL _shouldDismissWithAnimation; >+#endif >+} >+ >+#if PLATFORM(MAC) >+- (instancetype)initWithView:(NSView *)view >+#else >+- (instancetype)initWithView:(WKContentView *)view >+#endif >+{ >+ if (!(self = [super init])) >+ return nil; >+ _view = view; >+#if PLATFORM(IOS) >+ _shouldDismissWithAnimation = YES; >+#endif >+ 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 PLATFORM(IOS) >+ if (!data.shareData.title.isEmpty()) >+ url._title = data.shareData.title; >+#endif >+ [shareDataArray addObject:url]; >+ } >+ >+ if (!data.shareData.title.isEmpty() && ![shareDataArray count]) >+ [shareDataArray addObject:(NSString *)data.shareData.title]; >+ >+#if PLATFORM(MAC) >+ _sharingServicePickerForMenu = adoptNS([[NSSharingServicePicker alloc] initWithItems:shareDataArray.get()]); >+ _sharingServicePickerForMenu.get().delegate = self; >+ _completionHandler = WTFMove(completionHandler); >+ >+ NSPoint location = [NSEvent mouseLocation]; >+ NSRect mouseLocationRect = NSMakeRect(location.x, location.y, 1.0, 1.0); >+ NSRect mouseLocationInWindow = [[_view window] convertRectFromScreen:mouseLocationRect]; >+ NSRect mouseLocationInView = [_view convertRect:mouseLocationInWindow fromView:nil]; >+ [_sharingServicePickerForMenu showRelativeToRect:mouseLocationInView ofView:_view.getAutoreleased() preferredEdge:NSMinYEdge]; >+#else >+ 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]; >+#endif >+} >+ >+#if PLATFORM(MAC) >+- (void)sharingServicePicker:(NSSharingServicePicker *)sharingServicePicker didChooseSharingService:(nullable NSSharingService *)service >+{ >+ self->_completionHandler(!service); >+ [self _dispatchDidDismiss]; >+} >+ >+#endif >+- (void)_dispatchDidDismiss >+{ >+ if ([_delegate respondsToSelector:@selector(shareSheetDidDismiss:)]) >+ [_delegate shareSheetDidDismiss:self]; >+} >+ >+- (void)_cancel >+{ >+#if PLATFORM(IOS) >+ [self _dispatchDidDismiss]; >+#endif >+} >+ >+- (void)dismiss >+{ >+#if PLATFORM(IOS) >+ [[UIViewController _viewControllerForFullScreenPresentationFromView:_view.getAutoreleased()] dismissViewControllerAnimated:_shouldDismissWithAnimation completion:nil]; >+ _presentationViewController = nil; >+ >+ [self _cancel]; >+#endif >+} >+ >+#if PLATFORM(IOS) >+ >+- (void)_dismissDisplayAnimated:(BOOL)animated >+{ >+ if (_presentationViewController) { >+ UIViewController *currentPresentedViewController = [_presentationViewController presentedViewController]; >+ if (currentPresentedViewController == _shareSheetViewController) { >+ [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]; >+} >+#endif >+ >+- (void)invokeShareSheetWithResolution:(BOOL)resolved >+{ >+#if PLATFORM(IOS) >+ _shouldDismissWithAnimation = NO; >+ _shareSheetViewController.get().completionWithItemsHandler(nil, resolved, nil, nil); >+#else >+ _completionHandler(resolved); >+#endif >+} >+ >+@end >+#endif // !PLATFORM(WATCHOS) && !PLATFORM(APPLETV) >diff --git a/Source/WebKit/UIProcess/Cocoa/WebViewImpl.h b/Source/WebKit/UIProcess/Cocoa/WebViewImpl.h >index d964d509d90bd3038ac9e58c39fe272bca17a8f3..8ec2154d1270c6772c174548c02124f85e90d6f6 100644 >--- a/Source/WebKit/UIProcess/Cocoa/WebViewImpl.h >+++ b/Source/WebKit/UIProcess/Cocoa/WebViewImpl.h >@@ -53,6 +53,7 @@ OBJC_CLASS WKBrowsingContextController; > OBJC_CLASS WKEditorUndoTargetObjC; > OBJC_CLASS WKFullScreenWindowController; > OBJC_CLASS WKImmediateActionController; >+OBJC_CLASS WKShareSheet; > OBJC_CLASS WKViewLayoutStrategy; > OBJC_CLASS WKWebView; > OBJC_CLASS WKWindowVisibilityObserver; >@@ -75,6 +76,10 @@ class Object; > class PageConfiguration; > } > >+namespace WebCore { >+struct ShareDataWithParsedURL; >+} >+ > @protocol WebViewImplDelegate > > - (NSTextInputContext *)_web_superInputContext; >@@ -313,6 +318,9 @@ public: > id validRequestorForSendAndReturnTypes(NSString *sendType, NSString *returnType); > void centerSelectionInVisibleArea(); > void selectionDidChange(); >+ void showShareSheet(const WebCore::ShareDataWithParsedURL&, WTF::CompletionHandler<void(bool)>&&, NSView *); >+ void shareSheetDidDismiss(WKShareSheet *); >+ > void didBecomeEditable(); > void updateFontPanelIfNeeded(); > void changeFontFromFontManager(); >@@ -646,7 +654,8 @@ private: > WeakObjCPtr<NSView<WebViewImplDelegate>> m_view; > std::unique_ptr<PageClient> m_pageClient; > Ref<WebPageProxy> m_page; >- >+ RetainPtr<WKShareSheet> _shareSheet; >+ > bool m_willBecomeFirstResponderAgain { false }; > bool m_inBecomeFirstResponder { false }; > bool m_inResignFirstResponder { false }; >diff --git a/Source/WebKit/UIProcess/Cocoa/WebViewImpl.mm b/Source/WebKit/UIProcess/Cocoa/WebViewImpl.mm >index 1af4addf1d7c47a7128629aee3618dd981770bb4..7f64196adffa437f6ea992d8bb8e25629820e7fd 100644 >--- a/Source/WebKit/UIProcess/Cocoa/WebViewImpl.mm >+++ b/Source/WebKit/UIProcess/Cocoa/WebViewImpl.mm >@@ -59,6 +59,7 @@ > #import "WKFullScreenWindowController.h" > #import "WKImmediateActionController.h" > #import "WKPrintingView.h" >+#import "WKShareSheet.h" > #import "WKTextInputWindowController.h" > #import "WKViewLayoutStrategy.h" > #import "WKWebViewPrivate.h" >@@ -2725,6 +2726,27 @@ void WebViewImpl::selectionDidChange() > > [m_view _web_editorStateDidChange]; > } >+ >+void WebViewImpl::showShareSheet(const WebCore::ShareDataWithParsedURL& data, WTF::CompletionHandler<void(bool)>&& completionHandler, NSView *view) >+{ >+ ASSERT(!_shareSheet); >+ if (_shareSheet) >+ return; >+ >+ ASSERT([view respondsToSelector:@selector(shareSheetDidDismiss:)]); >+ _shareSheet = adoptNS([[WKShareSheet alloc] initWithView:view]); >+ [_shareSheet setDelegate:(NSView<WKShareSheetDelegate> *)view]; >+ >+ [_shareSheet presentWithParameters:data completionHandler:WTFMove(completionHandler)]; >+} >+ >+void WebViewImpl::shareSheetDidDismiss(WKShareSheet *shareSheet) >+{ >+ ASSERT(_shareSheet == shareSheet); >+ >+ [_shareSheet setDelegate:nil]; >+ _shareSheet = nil; >+} > > void WebViewImpl::didBecomeEditable() > { >diff --git a/Source/WebKit/UIProcess/ios/forms/WKShareSheet.h b/Source/WebKit/UIProcess/ios/forms/WKShareSheet.h >deleted file mode 100644 >index 9447bc328fd8a26ccecc4cd1f0744532a6a9a4a9..0000000000000000000000000000000000000000 >--- a/Source/WebKit/UIProcess/ios/forms/WKShareSheet.h >+++ /dev/null >@@ -1,54 +0,0 @@ >-/* >- * 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) && !PLATFORM(WATCHOS) && !PLATFORM(APPLETV) >- >-#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) && !PLATFORM(WATCHOS) && !PLATFORM(APPLETV) >diff --git a/Source/WebKit/UIProcess/ios/forms/WKShareSheet.mm b/Source/WebKit/UIProcess/ios/forms/WKShareSheet.mm >deleted file mode 100644 >index cd0575ed97fb2be5b276a1d2ec606333865123c0..0000000000000000000000000000000000000000 >--- a/Source/WebKit/UIProcess/ios/forms/WKShareSheet.mm >+++ /dev/null >@@ -1,129 +0,0 @@ >-/* >- * 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) && !PLATFORM(WATCHOS) && !PLATFORM(APPLETV) >-#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) && !PLATFORM(WATCHOS) && !PLATFORM(APPLETV) >diff --git a/Source/WebKit/UIProcess/mac/PageClientImplMac.h b/Source/WebKit/UIProcess/mac/PageClientImplMac.h >index c538b5bcf613fd2cc85c9d70634e4497b3a1bcbf..4ebdf2063b7b5e587ed4f663af16650c3a49f848 100644 >--- a/Source/WebKit/UIProcess/mac/PageClientImplMac.h >+++ b/Source/WebKit/UIProcess/mac/PageClientImplMac.h >@@ -103,6 +103,7 @@ private: > void resetSecureInputState() override; > void notifyInputContextAboutDiscardedComposition() override; > void selectionDidChange() override; >+ bool showShareSheet(const WebCore::ShareDataWithParsedURL&, WTF::CompletionHandler<void(bool)>&&) override; > > WebCore::FloatRect convertToDeviceSpace(const WebCore::FloatRect&) override; > WebCore::FloatRect convertToUserSpace(const WebCore::FloatRect&) override; >diff --git a/Source/WebKit/UIProcess/mac/PageClientImplMac.mm b/Source/WebKit/UIProcess/mac/PageClientImplMac.mm >index 8c23b28b820b5be1e741b317e3d209ffa8161d0c..2a441aa0d67a08b4f45516a70d9012f2f3ea08da 100644 >--- a/Source/WebKit/UIProcess/mac/PageClientImplMac.mm >+++ b/Source/WebKit/UIProcess/mac/PageClientImplMac.mm >@@ -540,6 +540,12 @@ void PageClientImpl::selectionDidChange() > { > m_impl->selectionDidChange(); > } >+ >+bool PageClientImpl::showShareSheet(const ShareDataWithParsedURL& shareData, WTF::CompletionHandler<void(bool)>&& completionHandler) >+{ >+ m_impl->showShareSheet(shareData, WTFMove(completionHandler), m_view); >+ return true; >+} > > void PageClientImpl::wheelEventWasNotHandledByWebCore(const NativeWebWheelEvent& event) > { >diff --git a/Source/WebKit/WebKit.xcodeproj/project.pbxproj b/Source/WebKit/WebKit.xcodeproj/project.pbxproj >index 19ca35d73c3963ddbf233d7cd5584d7b2b302c90..e5757a6bc9729a776d1329a4595995ba763a1b30 100644 >--- a/Source/WebKit/WebKit.xcodeproj/project.pbxproj >+++ b/Source/WebKit/WebKit.xcodeproj/project.pbxproj >@@ -2416,8 +2416,8 @@ > 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>"; }; >+ 1DBBB061211CC3CB00502ECC /* WKShareSheet.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKShareSheet.mm; sourceTree = "<group>"; }; >+ 1DE0D095211CC21300439B5F /* WKShareSheet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 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>"; }; >@@ -5284,6 +5284,8 @@ > 2DFC7DBA1BCCC19500C1548C /* WebViewImpl.mm */, > 1AD01BCB1905D54900C9C45F /* WKReloadFrameErrorRecoveryAttempter.h */, > 1AD01BCA1905D54900C9C45F /* WKReloadFrameErrorRecoveryAttempter.mm */, >+ 1DE0D095211CC21300439B5F /* WKShareSheet.h */, >+ 1DBBB061211CC3CB00502ECC /* WKShareSheet.mm */, > 2D7AAFD218C8640600A7ACD4 /* WKWebViewContentProvider.h */, > 2DC6D9C118C44A610043BAD4 /* WKWebViewContentProviderRegistry.h */, > 2DC6D9C218C44A610043BAD4 /* WKWebViewContentProviderRegistry.mm */, >@@ -8491,8 +8493,6 @@ > F4D5F51C206087A10038BBA8 /* WKQuickboardListViewController.mm */, > F4F59AD42065A5CA006CAA46 /* WKSelectMenuListViewController.h */, > F4F59AD32065A5C9006CAA46 /* WKSelectMenuListViewController.mm */, >- 1DE0D095211CC21300439B5F /* WKShareSheet.h */, >- 1DBBB061211CC3CB00502ECC /* WKShareSheet.mm */, > F4D5F519206087A00038BBA8 /* WKTextInputListViewController.h */, > F4D5F51A206087A10038BBA8 /* WKTextInputListViewController.mm */, > 2EB6FBFF203021960017E619 /* WKTimePickerViewController.h */, >diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog >index 3a4d6d0d19d0095a8a4097cdf539a46a1675a726..97586169d3b0f0a7de3a57e00cd9e145ba4c898f 100644 >--- a/LayoutTests/ChangeLog >+++ b/LayoutTests/ChangeLog >@@ -1,3 +1,18 @@ >+2018-09-07 Olivia Barnett <obarnett@apple.com> >+ >+ Implement the Web Share API for mac >+ https://bugs.webkit.org/show_bug.cgi?id=189443 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * platform/mac-wk2/fast/dom/navigator-detached-no-crash-expected.txt: Added. >+ * platform/mac-wk2/imported/w3c/web-platform-tests/web-share/idlharness.https-expected.txt: Added. >+ * platform/mac-wk2/imported/w3c/web-platform-tests/web-share/share-empty.https-expected.txt: Added. >+ * platform/mac-wk2/imported/w3c/web-platform-tests/web-share/share-securecontext.http-expected.txt: Added. >+ * platform/mac-wk2/imported/w3c/web-platform-tests/web-share/share-url-invalid.https-expected.txt: Added. >+ * platform/mac-wk2/imported/w3c/web-platform-tests/web-share/share-without-user-gesture.https-expected.txt: Added. >+ Updated test expectations. >+ > 2018-09-10 Youenn Fablet <youenn@apple.com> > > ontrack events should be fired even if an existing transceiver exists >diff --git a/LayoutTests/platform/mac-highsierra/fast/dom/navigator-detached-no-crash-expected.txt b/LayoutTests/platform/mac-highsierra/fast/dom/navigator-detached-no-crash-expected.txt >index d4b707114e63f6943852784daba042255982c472..79bfbb4ce45f5c521963eb7d9c79dec977a596ad 100644 >--- a/LayoutTests/platform/mac-highsierra/fast/dom/navigator-detached-no-crash-expected.txt >+++ b/LayoutTests/platform/mac-highsierra/fast/dom/navigator-detached-no-crash-expected.txt >@@ -1,4 +1,5 @@ >-This tests that the navigator object of a deleted frame is disconnected properly. Accessing fields or methods shouldn't crash the browser. >+CONSOLE MESSAGE: Unhandled Promise Rejection: TypeError: Type error >+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 > navigator.appName is OK >@@ -18,6 +19,7 @@ navigator.product is OK > navigator.productSub is OK > navigator.sendBeacon() threw err TypeError: Not enough arguments > navigator.serviceWorker is OK >+navigator.share() is OK > navigator.userAgent is OK > navigator.vendor is OK > navigator.vendorSub is OK >@@ -40,6 +42,7 @@ navigator.product is OK > navigator.productSub is OK > navigator.sendBeacon() threw err TypeError: Not enough arguments > navigator.serviceWorker is OK >+navigator.share() is OK > navigator.userAgent is OK > navigator.vendor is OK > navigator.vendorSub is OK >diff --git a/LayoutTests/platform/mac-wk2/fast/dom/navigator-detached-no-crash-expected.txt b/LayoutTests/platform/mac-wk2/fast/dom/navigator-detached-no-crash-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..6c99ccb0d0a53ecba2df73034805ce1488d69468 >--- /dev/null >+++ b/LayoutTests/platform/mac-wk2/fast/dom/navigator-detached-no-crash-expected.txt >@@ -0,0 +1,53 @@ >+CONSOLE MESSAGE: Unhandled Promise Rejection: TypeError: Not enough arguments >+CONSOLE MESSAGE: Unhandled Promise Rejection: TypeError: Type error >+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 >+navigator.appName is OK >+navigator.appVersion is OK >+navigator.cookieEnabled is OK >+navigator.credentials is OK >+navigator.getStorageUpdates() is OK >+navigator.javaEnabled() is OK >+navigator.language is OK >+navigator.languages is OK >+navigator.mediaCapabilities is OK >+navigator.mimeTypes is OK >+navigator.onLine is OK >+navigator.platform is OK >+navigator.plugins is OK >+navigator.product is OK >+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.userAgent is OK >+navigator.vendor is OK >+navigator.vendorSub is OK >+navigator.webdriver is OK >+navigator.appCodeName is OK >+navigator.appName is OK >+navigator.appVersion is OK >+navigator.cookieEnabled is OK >+navigator.credentials is OK >+navigator.getStorageUpdates() is OK >+navigator.javaEnabled() is OK >+navigator.language is OK >+navigator.languages is OK >+navigator.mediaCapabilities is OK >+navigator.mimeTypes is OK >+navigator.onLine is OK >+navigator.platform is OK >+navigator.plugins is OK >+navigator.product is OK >+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.userAgent is OK >+navigator.vendor is OK >+navigator.vendorSub is OK >+navigator.webdriver is OK >+ >diff --git a/LayoutTests/platform/mac-wk2/imported/w3c/web-platform-tests/web-share/idlharness.https-expected.txt b/LayoutTests/platform/mac-wk2/imported/w3c/web-platform-tests/web-share/idlharness.https-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..2fff230c26c2cbf852cd6635f77aa16a382b637f >--- /dev/null >+++ b/LayoutTests/platform/mac-wk2/imported/w3c/web-platform-tests/web-share/idlharness.https-expected.txt >@@ -0,0 +1,7 @@ >+ >+PASS Test driver >+PASS Navigator interface: operation share(ShareData) >+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/mac-wk2/imported/w3c/web-platform-tests/web-share/share-empty.https-expected.txt b/LayoutTests/platform/mac-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/mac-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/mac-wk2/imported/w3c/web-platform-tests/web-share/share-securecontext.http-expected.txt b/LayoutTests/platform/mac-wk2/imported/w3c/web-platform-tests/web-share/share-securecontext.http-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..b39bcda3df4d8ade5ca5d148c691d7305f7c6d93 >--- /dev/null >+++ b/LayoutTests/platform/mac-wk2/imported/w3c/web-platform-tests/web-share/share-securecontext.http-expected.txt >@@ -0,0 +1,3 @@ >+ >+FAIL navigator.share must be undefined in non-secure context assert_false: navigator has attribute 'share'. expected false got true >+ >diff --git a/LayoutTests/platform/mac-wk2/imported/w3c/web-platform-tests/web-share/share-url-invalid.https-expected.txt b/LayoutTests/platform/mac-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/mac-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/mac-wk2/imported/w3c/web-platform-tests/web-share/share-without-user-gesture.https-expected.txt b/LayoutTests/platform/mac-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/mac-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 >+
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 189443
:
349217
|
349226
|
349322
|
349326
|
349329
|
349341
|
349348
|
349367
|
349416
|
349450
|
349469