| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- import Foundation
- enum RedditShareBridgeStyle {
- static let messageHandlerName = "reddoraShare"
- /// WKWebView does not implement navigator.share. Reddit's share button relies on it
- /// in Safari, so we bridge to the native macOS share sheet.
- static let injectionScript = """
- (function() {
- if (window.__reddoraShareBridgeInstalled) return;
- window.__reddoraShareBridgeInstalled = true;
- function hasBridge() {
- return !!(
- window.webkit &&
- window.webkit.messageHandlers &&
- window.webkit.messageHandlers.reddoraShare
- );
- }
- window.__reddoraShareCallback = function(success) {
- const resolve = window.__reddoraShareResolve;
- const reject = window.__reddoraShareReject;
- window.__reddoraShareResolve = null;
- window.__reddoraShareReject = null;
- if (success && resolve) {
- resolve();
- } else if (!success && reject) {
- reject(new DOMException('Share canceled', 'AbortError'));
- }
- };
- function nativeShare(data) {
- return new Promise(function(resolve, reject) {
- if (!hasBridge()) {
- reject(new DOMException('Share unavailable', 'NotSupportedError'));
- return;
- }
- window.__reddoraShareResolve = resolve;
- window.__reddoraShareReject = reject;
- window.webkit.messageHandlers.reddoraShare.postMessage({
- title: data && data.title ? String(data.title) : '',
- text: data && data.text ? String(data.text) : '',
- url: data && data.url ? String(data.url) : ''
- });
- });
- }
- function canShare(data) {
- if (!hasBridge()) return false;
- if (!data) return true;
- if (data.files && data.files.length) return false;
- return !!(data.url || data.text || data.title);
- }
- try {
- Object.defineProperty(navigator, 'share', {
- value: nativeShare,
- configurable: true,
- writable: true
- });
- Object.defineProperty(navigator, 'canShare', {
- value: canShare,
- configurable: true,
- writable: true
- });
- } catch (error) {
- navigator.share = nativeShare;
- navigator.canShare = canShare;
- }
- })();
- """
- }
|