@capgo/capacitor-inappbrowser 8.16.6 → 8.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -0
- package/android/src/main/java/ee/forgr/capacitor_inappbrowser/CapgoInAppBrowserPlugin.java +9 -0
- package/android/src/main/java/ee/forgr/capacitor_inappbrowser/CloseButtonPositionSupport.java +35 -0
- package/android/src/main/java/ee/forgr/capacitor_inappbrowser/Options.java +10 -0
- package/android/src/main/java/ee/forgr/capacitor_inappbrowser/OrientationLayoutSupport.java +6 -2
- package/android/src/main/java/ee/forgr/capacitor_inappbrowser/SystemUiChromeSupport.java +11 -0
- package/android/src/main/java/ee/forgr/capacitor_inappbrowser/WebViewDialog.java +102 -87
- package/dist/docs.json +36 -0
- package/dist/esm/definitions.d.ts +22 -0
- package/dist/esm/definitions.js +11 -0
- package/dist/esm/definitions.js.map +1 -1
- package/dist/plugin.cjs.js +11 -0
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +11 -0
- package/dist/plugin.js.map +1 -1
- package/ios/Sources/InAppBrowserPlugin/CloseButtonPositionSupport.swift +15 -0
- package/ios/Sources/InAppBrowserPlugin/InAppBrowserPlugin.swift +12 -1
- package/ios/Sources/InAppBrowserPlugin/WKWebViewController.swift +76 -76
- package/package.json +1 -1
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sources":["esm/bundled-asset-support.js","esm/definitions.js","esm/index.js","esm/web.js"],"sourcesContent":["/** Default Capacitor local URL settings used when no runtime config is available. */\nexport const BUNDLED_ASSET_DEFAULTS = {\n ios: { scheme: 'capacitor', host: 'localhost' },\n android: { scheme: 'https', host: 'localhost' },\n};\nconst ABSOLUTE_URL_PATTERN = /^[a-zA-Z][a-zA-Z\\d+\\-.]*:/;\nconst RESERVED_WEB_SCHEMES = ['http', 'https'];\n/** Returns true when the input looks like an absolute URL (including protocol-relative URLs). */\nexport function isAbsoluteUrl(url) {\n return ABSOLUTE_URL_PATTERN.test(url) || url.startsWith('//');\n}\n/** Returns true when any path segment is `..`. */\nexport function containsPathTraversal(path) {\n return path.split('/').includes('..');\n}\n/**\n * Normalizes a relative bundled asset path to a leading-slash form.\n * Returns null when the path contains traversal segments.\n */\nexport function normalizeBundledPath(path) {\n const trimmed = path.trim();\n if (!trimmed || trimmed === '/') {\n return '/';\n }\n if (containsPathTraversal(trimmed)) {\n return null;\n }\n return trimmed.startsWith('/') ? trimmed : `/${trimmed}`;\n}\n/** Parses a Capacitor local URL into scheme and host components. */\nexport function parseBundledLocalConfig(localUrl) {\n if (!localUrl) {\n return null;\n }\n try {\n const parsed = new URL(localUrl.endsWith('/') ? localUrl : `${localUrl}/`);\n if (!parsed.protocol || !parsed.hostname) {\n return null;\n }\n return {\n scheme: parsed.protocol.replace(/:$/, '').toLowerCase(),\n host: parsed.hostname.toLowerCase(),\n };\n }\n catch (_a) {\n return null;\n }\n}\n/** Returns the scheme WebView navigation should use for bundled assets on a platform. */\nexport function handlerSchemeForPlatform(platform, localConfig) {\n if (platform === 'ios' && RESERVED_WEB_SCHEMES.includes(localConfig.scheme)) {\n return BUNDLED_ASSET_DEFAULTS.ios.scheme;\n }\n if (platform === 'android') {\n if (localConfig.scheme === 'http' || localConfig.scheme === 'https') {\n return localConfig.scheme;\n }\n return BUNDLED_ASSET_DEFAULTS.android.scheme;\n }\n return localConfig.scheme;\n}\n/**\n * Returns true when the URL targets the configured Capacitor local host/scheme\n * (including the platform handler scheme rewrite).\n */\nexport function isBundledLocalUrl(url, platform, localConfig) {\n if (!isAbsoluteUrl(url)) {\n return false;\n }\n try {\n const parsed = new URL(url);\n const scheme = parsed.protocol.replace(/:$/, '').toLowerCase();\n const host = parsed.hostname.toLowerCase();\n const config = localConfig !== null && localConfig !== void 0 ? localConfig : BUNDLED_ASSET_DEFAULTS[platform];\n if (host !== config.host) {\n return false;\n }\n if (parsed.port !== '') {\n return false;\n }\n if (scheme === config.scheme || scheme === handlerSchemeForPlatform(platform, config)) {\n return true;\n }\n return RESERVED_WEB_SCHEMES.includes(scheme) && RESERVED_WEB_SCHEMES.includes(config.scheme);\n }\n catch (_a) {\n return false;\n }\n}\n/** Returns true when the input is a non-empty relative bundled asset path. */\nexport function isRelativeBundledPath(url) {\n const trimmed = url.trim();\n if (!trimmed) {\n return false;\n }\n return !isAbsoluteUrl(trimmed);\n}\nfunction rewriteBundledLocalUrl(url, localConfig, navigationScheme) {\n try {\n const parsed = new URL(url);\n const host = parsed.hostname.toLowerCase();\n const scheme = parsed.protocol.replace(/:$/, '').toLowerCase();\n if (host !== localConfig.host || scheme === navigationScheme) {\n return null;\n }\n const pathname = parsed.pathname || '/';\n const search = parsed.search;\n const hash = parsed.hash;\n const userinfo = parsed.username.length > 0 ? `${parsed.username}${parsed.password.length > 0 ? `:${parsed.password}` : ''}@` : '';\n return `${navigationScheme}://${userinfo}${host}${pathname}${search}${hash}`;\n }\n catch (_a) {\n return null;\n }\n}\n/**\n * Resolves a bundled asset URL for the given platform.\n * Relative paths become platform-local URLs; bundled local URLs may be rewritten to the handler scheme.\n */\nexport function resolveBundledAssetUrl(url, platform, localConfig) {\n const trimmed = url.trim();\n const config = localConfig !== null && localConfig !== void 0 ? localConfig : BUNDLED_ASSET_DEFAULTS[platform];\n const navigationScheme = handlerSchemeForPlatform(platform, config);\n if (isRelativeBundledPath(trimmed)) {\n const path = normalizeBundledPath(trimmed);\n if (path === null) {\n return null;\n }\n return {\n url: `${navigationScheme}://${config.host}${path}`,\n };\n }\n if (isBundledLocalUrl(trimmed, platform, config)) {\n const rewritten = rewriteBundledLocalUrl(trimmed, config, navigationScheme);\n return {\n url: rewritten !== null && rewritten !== void 0 ? rewritten : trimmed,\n };\n }\n return {\n url: trimmed,\n };\n}\n/**\n * Resolves relative bundled paths for legacy native plugins that do not perform native resolution.\n * Throws when the path is invalid.\n */\nexport function resolveLegacyNativeWebViewUrl(url, platform, localConfig) {\n if (!isRelativeBundledPath(url)) {\n return url;\n }\n const resolution = resolveBundledAssetUrl(url, platform, localConfig);\n if (resolution === null) {\n throw new Error('Invalid bundled asset path');\n }\n return resolution.url;\n}\n//# sourceMappingURL=bundled-asset-support.js.map","export var BackgroundColor;\n(function (BackgroundColor) {\n BackgroundColor[\"WHITE\"] = \"white\";\n BackgroundColor[\"BLACK\"] = \"black\";\n})(BackgroundColor || (BackgroundColor = {}));\nexport var ToolBarType;\n(function (ToolBarType) {\n /**\n * Shows a simple toolbar with just a close button and share button\n * @since 0.1.0\n */\n ToolBarType[\"ACTIVITY\"] = \"activity\";\n /**\n * Shows a simple toolbar with just a close button\n * @since 7.6.8\n */\n ToolBarType[\"COMPACT\"] = \"compact\";\n /**\n * Shows a full navigation toolbar with back/forward buttons\n * @since 0.1.0\n */\n ToolBarType[\"NAVIGATION\"] = \"navigation\";\n /**\n * Shows no toolbar\n * @since 0.1.0\n */\n ToolBarType[\"BLANK\"] = \"blank\";\n})(ToolBarType || (ToolBarType = {}));\nexport var InvisibilityMode;\n(function (InvisibilityMode) {\n /**\n * WebView is aware it is hidden (dimensions may be zero).\n */\n InvisibilityMode[\"AWARE\"] = \"AWARE\";\n /**\n * WebView is hidden but reports fullscreen dimensions (uses alpha=0 to remain invisible).\n */\n InvisibilityMode[\"FAKE_VISIBLE\"] = \"FAKE_VISIBLE\";\n})(InvisibilityMode || (InvisibilityMode = {}));\nexport var CloseAction;\n(function (CloseAction) {\n /**\n * The toolbar close button closes and destroys the webview.\n */\n CloseAction[\"CLOSE\"] = \"close\";\n /**\n * The toolbar close button hides the webview so it can be shown again.\n */\n CloseAction[\"HIDE\"] = \"hide\";\n})(CloseAction || (CloseAction = {}));\n//# sourceMappingURL=definitions.js.map","import { Capacitor, registerPlugin } from '@capacitor/core';\nimport { containsPathTraversal, isRelativeBundledPath, parseBundledLocalConfig, resolveLegacyNativeWebViewUrl, } from './bundled-asset-support';\nconst CAPGO_PLUGIN_NAME = 'CapgoInAppBrowser';\nconst PREVIOUS_PLUGIN_NAME = 'InAppBrowser';\nfunction resolvePluginName() {\n if (!Capacitor.isNativePlatform()) {\n return CAPGO_PLUGIN_NAME;\n }\n if (Capacitor.isPluginAvailable(CAPGO_PLUGIN_NAME)) {\n return CAPGO_PLUGIN_NAME;\n }\n if (Capacitor.isPluginAvailable(PREVIOUS_PLUGIN_NAME)) {\n return PREVIOUS_PLUGIN_NAME;\n }\n console.warn(`[InAppBrowser] Neither '${CAPGO_PLUGIN_NAME}' nor '${PREVIOUS_PLUGIN_NAME}' native plugin detected. ` +\n 'Ensure @capgo/capacitor-inappbrowser native code is installed.');\n return CAPGO_PLUGIN_NAME;\n}\nconst inAppBrowserImplementations = {\n web: () => import('./web').then((m) => new m.InAppBrowserWeb()),\n};\nfunction assertValidBundledAssetPath(url) {\n if (isRelativeBundledPath(url) && containsPathTraversal(url)) {\n throw new Error('Invalid bundled asset path');\n }\n}\nconst activePluginName = resolvePluginName();\nfunction bundledAssetPlatform() {\n return Capacitor.getPlatform() === 'ios' ? 'ios' : 'android';\n}\nfunction getConfiguredLocalConfig() {\n if (!Capacitor.isNativePlatform()) {\n return null;\n }\n const getServerUrl = Capacitor.getServerUrl;\n if (typeof getServerUrl !== 'function') {\n return null;\n }\n return parseBundledLocalConfig(getServerUrl());\n}\nfunction prepareUrlOptions(options) {\n assertValidBundledAssetPath(options.url);\n if (!Capacitor.isNativePlatform() || activePluginName !== PREVIOUS_PLUGIN_NAME) {\n return options;\n }\n return Object.assign(Object.assign({}, options), { url: resolveLegacyNativeWebViewUrl(options.url, bundledAssetPlatform(), getConfiguredLocalConfig()) });\n}\nconst baseInAppBrowser = registerPlugin(activePluginName, inAppBrowserImplementations);\nconst InAppBrowser = new Proxy(baseInAppBrowser, {\n get(target, prop, receiver) {\n if (prop === 'openWebView') {\n return (options) => target.openWebView(prepareUrlOptions(options));\n }\n if (prop === 'setUrl') {\n return (options) => target.setUrl(prepareUrlOptions(options));\n }\n const value = Reflect.get(target, prop, receiver);\n if (typeof value === 'function') {\n return value.bind(target);\n }\n return value;\n },\n});\nfunction arrayBufferToBase64(buffer) {\n const bytes = new Uint8Array(buffer);\n let binary = '';\n for (let i = 0; i < bytes.byteLength; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\nfunction headersToRecord(headers) {\n const result = {};\n headers.forEach((value, key) => {\n result[key] = value;\n });\n return result;\n}\nfunction errorMessage(error) {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === 'string') {\n return error;\n }\n if (error && typeof error === 'object' && 'message' in error && typeof error.message === 'string') {\n return error.message;\n }\n return String(error);\n}\nfunction isStaleProxyResponseError(error) {\n const message = errorMessage(error);\n return message.includes('No proxy handler found') || message.includes('Target WebView not found for proxy request');\n}\nfunction isProxyResponse(value) {\n return (value !== null &&\n typeof value === 'object' &&\n 'status' in value &&\n 'headers' in value &&\n !(value instanceof Response));\n}\nfunction isProxyRequestOverride(value) {\n return value !== null && typeof value === 'object' && 'url' in value && !(value instanceof Response);\n}\nfunction isProxyDecision(value) {\n return (value !== null && typeof value === 'object' && ('request' in value || 'response' in value || 'cancel' in value));\n}\nasync function sendProxyDecision(requestId, webviewId, decision, phase) {\n try {\n await InAppBrowser.handleProxyRequest({\n requestId,\n webviewId,\n decision,\n phase,\n });\n }\n catch (error) {\n if (isStaleProxyResponseError(error)) {\n return;\n }\n throw error;\n }\n}\nconst addProxyHandler = (callback) => {\n return InAppBrowser.addListener('proxyRequest', async (event) => {\n let decision = null;\n try {\n const result = await callback(event);\n if (result === null) {\n decision = null;\n }\n else if (isProxyDecision(result)) {\n decision = result;\n }\n else if (isProxyRequestOverride(result)) {\n decision = { request: result };\n }\n else if (isProxyResponse(result)) {\n decision = { response: result };\n }\n else {\n const cloned = result.clone();\n const buffer = await cloned.arrayBuffer();\n decision = {\n response: {\n body: arrayBufferToBase64(buffer),\n status: result.status,\n headers: headersToRecord(result.headers),\n },\n };\n }\n }\n catch (_error) {\n decision = null;\n }\n await sendProxyDecision(event.requestId, event.webviewId, decision, event.phase);\n });\n};\nexport * from './definitions';\nexport { InAppBrowser, addProxyHandler };\n//# sourceMappingURL=index.js.map","import { WebPlugin } from '@capacitor/core';\nexport class InAppBrowserWeb extends WebPlugin {\n clearAllCookies() {\n console.log('clearAllCookies');\n return Promise.resolve();\n }\n clearCache() {\n console.log('clearCache');\n return Promise.resolve();\n }\n clearAllBrowsingData() {\n console.log('clearAllBrowsingData');\n return Promise.resolve();\n }\n async open(options) {\n console.log('open', options);\n return options;\n }\n async clearCookies(options) {\n console.log('cleanCookies', options);\n return;\n }\n async getCookies(options) {\n // Web implementation to get cookies\n return options;\n }\n async openWebView(options) {\n console.log('openWebView', options);\n return options;\n }\n async executeScript({ code }) {\n console.log('code', code);\n return code;\n }\n async close(options) {\n console.log('close', options);\n return;\n }\n async hide(options) {\n console.log('hide', options);\n return;\n }\n async show(options) {\n console.log('show', options);\n return;\n }\n async sendToBack(options) {\n console.log('sendToBack not supported on web', options);\n return;\n }\n async bringToFront(options) {\n console.log('bringToFront not supported on web', options);\n return;\n }\n async dispatchInputEvent(options) {\n console.log('dispatchInputEvent not supported on web', options);\n return;\n }\n async setUrl(options) {\n console.log('setUrl', options.url);\n return;\n }\n async reload(options) {\n console.log('reload', options);\n return;\n }\n async postMessage(options) {\n console.log('postMessage', options);\n return options;\n }\n async takeScreenshot(options) {\n console.log('takeScreenshot not supported on web', options);\n throw this.unimplemented('Screenshots are not supported on web.');\n }\n async goBack() {\n console.log('goBack');\n return;\n }\n async getPluginVersion() {\n return { version: 'web' };\n }\n async updateDimensions(options) {\n console.log('updateDimensions', options);\n // Web platform doesn't support dimension control\n return;\n }\n async handleProxyRequest(options) {\n console.log('handleProxyRequest not supported on web', options);\n return;\n }\n async setEnabledSafeTopMargin(options) {\n console.log('setEnabledSafeTopMargin not supported on web', options);\n return;\n }\n async setEnabledSafeBottomMargin(options) {\n console.log('setEnabledSafeBottomMargin not supported on web', options);\n return;\n }\n async openSecureWindow(options) {\n const w = 600;\n const h = 550;\n const settings = [\n ['width', w],\n ['height', h],\n ['left', screen.width / 2 - w / 2],\n ['top', screen.height / 2 - h / 2],\n ]\n .map((x) => x.join('='))\n .join(',');\n const popup = window.open(options.authEndpoint, 'Authorization', settings);\n if (!popup) {\n throw new Error('Failed to open secure window');\n }\n if (typeof popup.focus === 'function') {\n popup.focus();\n }\n return new Promise((resolve, reject) => {\n const bc = new BroadcastChannel(options.broadcastChannelName || 'oauth-channel');\n bc.addEventListener('message', (event) => {\n if (event.data.startsWith(options.redirectUri)) {\n bc.close();\n resolve({ redirectedUri: event.data });\n }\n else {\n bc.close();\n reject(new Error('Redirect URI does not match, expected ' + options.redirectUri + ' but got ' + event.data));\n }\n });\n setTimeout(() => {\n bc.close();\n reject(new Error('The sign-in flow timed out'));\n }, 5 * 60000);\n });\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["BackgroundColor","ToolBarType","InvisibilityMode","CloseAction","Capacitor","registerPlugin","WebPlugin"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin.js","sources":["esm/bundled-asset-support.js","esm/definitions.js","esm/index.js","esm/web.js"],"sourcesContent":["/** Default Capacitor local URL settings used when no runtime config is available. */\nexport const BUNDLED_ASSET_DEFAULTS = {\n ios: { scheme: 'capacitor', host: 'localhost' },\n android: { scheme: 'https', host: 'localhost' },\n};\nconst ABSOLUTE_URL_PATTERN = /^[a-zA-Z][a-zA-Z\\d+\\-.]*:/;\nconst RESERVED_WEB_SCHEMES = ['http', 'https'];\n/** Returns true when the input looks like an absolute URL (including protocol-relative URLs). */\nexport function isAbsoluteUrl(url) {\n return ABSOLUTE_URL_PATTERN.test(url) || url.startsWith('//');\n}\n/** Returns true when any path segment is `..`. */\nexport function containsPathTraversal(path) {\n return path.split('/').includes('..');\n}\n/**\n * Normalizes a relative bundled asset path to a leading-slash form.\n * Returns null when the path contains traversal segments.\n */\nexport function normalizeBundledPath(path) {\n const trimmed = path.trim();\n if (!trimmed || trimmed === '/') {\n return '/';\n }\n if (containsPathTraversal(trimmed)) {\n return null;\n }\n return trimmed.startsWith('/') ? trimmed : `/${trimmed}`;\n}\n/** Parses a Capacitor local URL into scheme and host components. */\nexport function parseBundledLocalConfig(localUrl) {\n if (!localUrl) {\n return null;\n }\n try {\n const parsed = new URL(localUrl.endsWith('/') ? localUrl : `${localUrl}/`);\n if (!parsed.protocol || !parsed.hostname) {\n return null;\n }\n return {\n scheme: parsed.protocol.replace(/:$/, '').toLowerCase(),\n host: parsed.hostname.toLowerCase(),\n };\n }\n catch (_a) {\n return null;\n }\n}\n/** Returns the scheme WebView navigation should use for bundled assets on a platform. */\nexport function handlerSchemeForPlatform(platform, localConfig) {\n if (platform === 'ios' && RESERVED_WEB_SCHEMES.includes(localConfig.scheme)) {\n return BUNDLED_ASSET_DEFAULTS.ios.scheme;\n }\n if (platform === 'android') {\n if (localConfig.scheme === 'http' || localConfig.scheme === 'https') {\n return localConfig.scheme;\n }\n return BUNDLED_ASSET_DEFAULTS.android.scheme;\n }\n return localConfig.scheme;\n}\n/**\n * Returns true when the URL targets the configured Capacitor local host/scheme\n * (including the platform handler scheme rewrite).\n */\nexport function isBundledLocalUrl(url, platform, localConfig) {\n if (!isAbsoluteUrl(url)) {\n return false;\n }\n try {\n const parsed = new URL(url);\n const scheme = parsed.protocol.replace(/:$/, '').toLowerCase();\n const host = parsed.hostname.toLowerCase();\n const config = localConfig !== null && localConfig !== void 0 ? localConfig : BUNDLED_ASSET_DEFAULTS[platform];\n if (host !== config.host) {\n return false;\n }\n if (parsed.port !== '') {\n return false;\n }\n if (scheme === config.scheme || scheme === handlerSchemeForPlatform(platform, config)) {\n return true;\n }\n return RESERVED_WEB_SCHEMES.includes(scheme) && RESERVED_WEB_SCHEMES.includes(config.scheme);\n }\n catch (_a) {\n return false;\n }\n}\n/** Returns true when the input is a non-empty relative bundled asset path. */\nexport function isRelativeBundledPath(url) {\n const trimmed = url.trim();\n if (!trimmed) {\n return false;\n }\n return !isAbsoluteUrl(trimmed);\n}\nfunction rewriteBundledLocalUrl(url, localConfig, navigationScheme) {\n try {\n const parsed = new URL(url);\n const host = parsed.hostname.toLowerCase();\n const scheme = parsed.protocol.replace(/:$/, '').toLowerCase();\n if (host !== localConfig.host || scheme === navigationScheme) {\n return null;\n }\n const pathname = parsed.pathname || '/';\n const search = parsed.search;\n const hash = parsed.hash;\n const userinfo = parsed.username.length > 0 ? `${parsed.username}${parsed.password.length > 0 ? `:${parsed.password}` : ''}@` : '';\n return `${navigationScheme}://${userinfo}${host}${pathname}${search}${hash}`;\n }\n catch (_a) {\n return null;\n }\n}\n/**\n * Resolves a bundled asset URL for the given platform.\n * Relative paths become platform-local URLs; bundled local URLs may be rewritten to the handler scheme.\n */\nexport function resolveBundledAssetUrl(url, platform, localConfig) {\n const trimmed = url.trim();\n const config = localConfig !== null && localConfig !== void 0 ? localConfig : BUNDLED_ASSET_DEFAULTS[platform];\n const navigationScheme = handlerSchemeForPlatform(platform, config);\n if (isRelativeBundledPath(trimmed)) {\n const path = normalizeBundledPath(trimmed);\n if (path === null) {\n return null;\n }\n return {\n url: `${navigationScheme}://${config.host}${path}`,\n };\n }\n if (isBundledLocalUrl(trimmed, platform, config)) {\n const rewritten = rewriteBundledLocalUrl(trimmed, config, navigationScheme);\n return {\n url: rewritten !== null && rewritten !== void 0 ? rewritten : trimmed,\n };\n }\n return {\n url: trimmed,\n };\n}\n/**\n * Resolves relative bundled paths for legacy native plugins that do not perform native resolution.\n * Throws when the path is invalid.\n */\nexport function resolveLegacyNativeWebViewUrl(url, platform, localConfig) {\n if (!isRelativeBundledPath(url)) {\n return url;\n }\n const resolution = resolveBundledAssetUrl(url, platform, localConfig);\n if (resolution === null) {\n throw new Error('Invalid bundled asset path');\n }\n return resolution.url;\n}\n//# sourceMappingURL=bundled-asset-support.js.map","export var BackgroundColor;\n(function (BackgroundColor) {\n BackgroundColor[\"WHITE\"] = \"white\";\n BackgroundColor[\"BLACK\"] = \"black\";\n})(BackgroundColor || (BackgroundColor = {}));\nexport var ToolBarType;\n(function (ToolBarType) {\n /**\n * Shows a simple toolbar with just a close button and share button\n * @since 0.1.0\n */\n ToolBarType[\"ACTIVITY\"] = \"activity\";\n /**\n * Shows a simple toolbar with just a close button\n * @since 7.6.8\n */\n ToolBarType[\"COMPACT\"] = \"compact\";\n /**\n * Shows a full navigation toolbar with back/forward buttons\n * @since 0.1.0\n */\n ToolBarType[\"NAVIGATION\"] = \"navigation\";\n /**\n * Shows no toolbar\n * @since 0.1.0\n */\n ToolBarType[\"BLANK\"] = \"blank\";\n})(ToolBarType || (ToolBarType = {}));\nexport var InvisibilityMode;\n(function (InvisibilityMode) {\n /**\n * WebView is aware it is hidden (dimensions may be zero).\n */\n InvisibilityMode[\"AWARE\"] = \"AWARE\";\n /**\n * WebView is hidden but reports fullscreen dimensions (uses alpha=0 to remain invisible).\n */\n InvisibilityMode[\"FAKE_VISIBLE\"] = \"FAKE_VISIBLE\";\n})(InvisibilityMode || (InvisibilityMode = {}));\nexport var CloseAction;\n(function (CloseAction) {\n /**\n * The toolbar close button closes and destroys the webview.\n */\n CloseAction[\"CLOSE\"] = \"close\";\n /**\n * The toolbar close button hides the webview so it can be shown again.\n */\n CloseAction[\"HIDE\"] = \"hide\";\n})(CloseAction || (CloseAction = {}));\nexport var CloseButtonPosition;\n(function (CloseButtonPosition) {\n /**\n * Leading edge of the toolbar (left in left-to-right layouts).\n */\n CloseButtonPosition[\"START\"] = \"start\";\n /**\n * Trailing edge of the toolbar (right in left-to-right layouts).\n */\n CloseButtonPosition[\"END\"] = \"end\";\n})(CloseButtonPosition || (CloseButtonPosition = {}));\n//# sourceMappingURL=definitions.js.map","import { Capacitor, registerPlugin } from '@capacitor/core';\nimport { containsPathTraversal, isRelativeBundledPath, parseBundledLocalConfig, resolveLegacyNativeWebViewUrl, } from './bundled-asset-support';\nconst CAPGO_PLUGIN_NAME = 'CapgoInAppBrowser';\nconst PREVIOUS_PLUGIN_NAME = 'InAppBrowser';\nfunction resolvePluginName() {\n if (!Capacitor.isNativePlatform()) {\n return CAPGO_PLUGIN_NAME;\n }\n if (Capacitor.isPluginAvailable(CAPGO_PLUGIN_NAME)) {\n return CAPGO_PLUGIN_NAME;\n }\n if (Capacitor.isPluginAvailable(PREVIOUS_PLUGIN_NAME)) {\n return PREVIOUS_PLUGIN_NAME;\n }\n console.warn(`[InAppBrowser] Neither '${CAPGO_PLUGIN_NAME}' nor '${PREVIOUS_PLUGIN_NAME}' native plugin detected. ` +\n 'Ensure @capgo/capacitor-inappbrowser native code is installed.');\n return CAPGO_PLUGIN_NAME;\n}\nconst inAppBrowserImplementations = {\n web: () => import('./web').then((m) => new m.InAppBrowserWeb()),\n};\nfunction assertValidBundledAssetPath(url) {\n if (isRelativeBundledPath(url) && containsPathTraversal(url)) {\n throw new Error('Invalid bundled asset path');\n }\n}\nconst activePluginName = resolvePluginName();\nfunction bundledAssetPlatform() {\n return Capacitor.getPlatform() === 'ios' ? 'ios' : 'android';\n}\nfunction getConfiguredLocalConfig() {\n if (!Capacitor.isNativePlatform()) {\n return null;\n }\n const getServerUrl = Capacitor.getServerUrl;\n if (typeof getServerUrl !== 'function') {\n return null;\n }\n return parseBundledLocalConfig(getServerUrl());\n}\nfunction prepareUrlOptions(options) {\n assertValidBundledAssetPath(options.url);\n if (!Capacitor.isNativePlatform() || activePluginName !== PREVIOUS_PLUGIN_NAME) {\n return options;\n }\n return Object.assign(Object.assign({}, options), { url: resolveLegacyNativeWebViewUrl(options.url, bundledAssetPlatform(), getConfiguredLocalConfig()) });\n}\nconst baseInAppBrowser = registerPlugin(activePluginName, inAppBrowserImplementations);\nconst InAppBrowser = new Proxy(baseInAppBrowser, {\n get(target, prop, receiver) {\n if (prop === 'openWebView') {\n return (options) => target.openWebView(prepareUrlOptions(options));\n }\n if (prop === 'setUrl') {\n return (options) => target.setUrl(prepareUrlOptions(options));\n }\n const value = Reflect.get(target, prop, receiver);\n if (typeof value === 'function') {\n return value.bind(target);\n }\n return value;\n },\n});\nfunction arrayBufferToBase64(buffer) {\n const bytes = new Uint8Array(buffer);\n let binary = '';\n for (let i = 0; i < bytes.byteLength; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\nfunction headersToRecord(headers) {\n const result = {};\n headers.forEach((value, key) => {\n result[key] = value;\n });\n return result;\n}\nfunction errorMessage(error) {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === 'string') {\n return error;\n }\n if (error && typeof error === 'object' && 'message' in error && typeof error.message === 'string') {\n return error.message;\n }\n return String(error);\n}\nfunction isStaleProxyResponseError(error) {\n const message = errorMessage(error);\n return message.includes('No proxy handler found') || message.includes('Target WebView not found for proxy request');\n}\nfunction isProxyResponse(value) {\n return (value !== null &&\n typeof value === 'object' &&\n 'status' in value &&\n 'headers' in value &&\n !(value instanceof Response));\n}\nfunction isProxyRequestOverride(value) {\n return value !== null && typeof value === 'object' && 'url' in value && !(value instanceof Response);\n}\nfunction isProxyDecision(value) {\n return (value !== null && typeof value === 'object' && ('request' in value || 'response' in value || 'cancel' in value));\n}\nasync function sendProxyDecision(requestId, webviewId, decision, phase) {\n try {\n await InAppBrowser.handleProxyRequest({\n requestId,\n webviewId,\n decision,\n phase,\n });\n }\n catch (error) {\n if (isStaleProxyResponseError(error)) {\n return;\n }\n throw error;\n }\n}\nconst addProxyHandler = (callback) => {\n return InAppBrowser.addListener('proxyRequest', async (event) => {\n let decision = null;\n try {\n const result = await callback(event);\n if (result === null) {\n decision = null;\n }\n else if (isProxyDecision(result)) {\n decision = result;\n }\n else if (isProxyRequestOverride(result)) {\n decision = { request: result };\n }\n else if (isProxyResponse(result)) {\n decision = { response: result };\n }\n else {\n const cloned = result.clone();\n const buffer = await cloned.arrayBuffer();\n decision = {\n response: {\n body: arrayBufferToBase64(buffer),\n status: result.status,\n headers: headersToRecord(result.headers),\n },\n };\n }\n }\n catch (_error) {\n decision = null;\n }\n await sendProxyDecision(event.requestId, event.webviewId, decision, event.phase);\n });\n};\nexport * from './definitions';\nexport { InAppBrowser, addProxyHandler };\n//# sourceMappingURL=index.js.map","import { WebPlugin } from '@capacitor/core';\nexport class InAppBrowserWeb extends WebPlugin {\n clearAllCookies() {\n console.log('clearAllCookies');\n return Promise.resolve();\n }\n clearCache() {\n console.log('clearCache');\n return Promise.resolve();\n }\n clearAllBrowsingData() {\n console.log('clearAllBrowsingData');\n return Promise.resolve();\n }\n async open(options) {\n console.log('open', options);\n return options;\n }\n async clearCookies(options) {\n console.log('cleanCookies', options);\n return;\n }\n async getCookies(options) {\n // Web implementation to get cookies\n return options;\n }\n async openWebView(options) {\n console.log('openWebView', options);\n return options;\n }\n async executeScript({ code }) {\n console.log('code', code);\n return code;\n }\n async close(options) {\n console.log('close', options);\n return;\n }\n async hide(options) {\n console.log('hide', options);\n return;\n }\n async show(options) {\n console.log('show', options);\n return;\n }\n async sendToBack(options) {\n console.log('sendToBack not supported on web', options);\n return;\n }\n async bringToFront(options) {\n console.log('bringToFront not supported on web', options);\n return;\n }\n async dispatchInputEvent(options) {\n console.log('dispatchInputEvent not supported on web', options);\n return;\n }\n async setUrl(options) {\n console.log('setUrl', options.url);\n return;\n }\n async reload(options) {\n console.log('reload', options);\n return;\n }\n async postMessage(options) {\n console.log('postMessage', options);\n return options;\n }\n async takeScreenshot(options) {\n console.log('takeScreenshot not supported on web', options);\n throw this.unimplemented('Screenshots are not supported on web.');\n }\n async goBack() {\n console.log('goBack');\n return;\n }\n async getPluginVersion() {\n return { version: 'web' };\n }\n async updateDimensions(options) {\n console.log('updateDimensions', options);\n // Web platform doesn't support dimension control\n return;\n }\n async handleProxyRequest(options) {\n console.log('handleProxyRequest not supported on web', options);\n return;\n }\n async setEnabledSafeTopMargin(options) {\n console.log('setEnabledSafeTopMargin not supported on web', options);\n return;\n }\n async setEnabledSafeBottomMargin(options) {\n console.log('setEnabledSafeBottomMargin not supported on web', options);\n return;\n }\n async openSecureWindow(options) {\n const w = 600;\n const h = 550;\n const settings = [\n ['width', w],\n ['height', h],\n ['left', screen.width / 2 - w / 2],\n ['top', screen.height / 2 - h / 2],\n ]\n .map((x) => x.join('='))\n .join(',');\n const popup = window.open(options.authEndpoint, 'Authorization', settings);\n if (!popup) {\n throw new Error('Failed to open secure window');\n }\n if (typeof popup.focus === 'function') {\n popup.focus();\n }\n return new Promise((resolve, reject) => {\n const bc = new BroadcastChannel(options.broadcastChannelName || 'oauth-channel');\n bc.addEventListener('message', (event) => {\n if (event.data.startsWith(options.redirectUri)) {\n bc.close();\n resolve({ redirectedUri: event.data });\n }\n else {\n bc.close();\n reject(new Error('Redirect URI does not match, expected ' + options.redirectUri + ' but got ' + event.data));\n }\n });\n setTimeout(() => {\n bc.close();\n reject(new Error('The sign-in flow timed out'));\n }, 5 * 60000);\n });\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["BackgroundColor","ToolBarType","InvisibilityMode","CloseAction","CloseButtonPosition","Capacitor","registerPlugin","WebPlugin"],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
|
|
3
|
+
/// Maps the `closeButtonPosition` option onto the navigation bar side of the done button.
|
|
4
|
+
enum CloseButtonPositionSupport {
|
|
5
|
+
static func navigationBarPosition(for closeButtonPosition: String?) -> NavigationBarPosition? {
|
|
6
|
+
switch closeButtonPosition {
|
|
7
|
+
case "start":
|
|
8
|
+
return .left
|
|
9
|
+
case "end":
|
|
10
|
+
return .right
|
|
11
|
+
default:
|
|
12
|
+
return nil
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -446,7 +446,7 @@ public class CapgoInAppBrowserPlugin: CAPPlugin, CAPBridgedPlugin {
|
|
|
446
446
|
case aware = "AWARE"
|
|
447
447
|
case fakeVisible = "FAKE_VISIBLE"
|
|
448
448
|
}
|
|
449
|
-
private let pluginVersion: String = "8.
|
|
449
|
+
private let pluginVersion: String = "8.17.0"
|
|
450
450
|
public let identifier = "CapgoInAppBrowserPlugin"
|
|
451
451
|
public let jsName = "CapgoInAppBrowser"
|
|
452
452
|
public let pluginMethods: [CAPPluginMethod] = [
|
|
@@ -1349,6 +1349,12 @@ public class CapgoInAppBrowserPlugin: CAPPlugin, CAPBridgedPlugin {
|
|
|
1349
1349
|
call.reject("closeAction must be 'close' or 'hide'")
|
|
1350
1350
|
return
|
|
1351
1351
|
}
|
|
1352
|
+
let closeButtonPositionOption = call.getString("closeButtonPosition")?.lowercased()
|
|
1353
|
+
let closeButtonPosition = CloseButtonPositionSupport.navigationBarPosition(for: closeButtonPositionOption)
|
|
1354
|
+
guard closeButtonPositionOption == nil || closeButtonPosition != nil else {
|
|
1355
|
+
call.reject("closeButtonPosition must be 'start' or 'end'")
|
|
1356
|
+
return
|
|
1357
|
+
}
|
|
1352
1358
|
let titleFontFamily = call.getString("titleFontFamily")
|
|
1353
1359
|
let isInspectable = call.getBool("isInspectable", self.bridge?.config.isWebDebuggable ?? false)
|
|
1354
1360
|
let preventDeeplink = call.getBool("preventDeeplink", false)
|
|
@@ -1660,6 +1666,11 @@ public class CapgoInAppBrowserPlugin: CAPPlugin, CAPBridgedPlugin {
|
|
|
1660
1666
|
}
|
|
1661
1667
|
}
|
|
1662
1668
|
|
|
1669
|
+
// An explicit closeButtonPosition wins over the toolbarType/showArrow defaults above
|
|
1670
|
+
if let closeButtonPosition = closeButtonPosition {
|
|
1671
|
+
webViewController.doneBarButtonItemPosition = closeButtonPosition
|
|
1672
|
+
}
|
|
1673
|
+
|
|
1663
1674
|
// Set buttonNearDoneIcon if provided
|
|
1664
1675
|
if let buttonNearDoneIcon = buttonNearDoneIcon {
|
|
1665
1676
|
webViewController.buttonNearDoneIcon = buttonNearDoneIcon
|
|
@@ -1504,19 +1504,18 @@ open class WKWebViewController: UIViewController, WKScriptMessageHandler {
|
|
|
1504
1504
|
}
|
|
1505
1505
|
|
|
1506
1506
|
// Create buttonNearDone button with the correct tint color if it doesn't already exist
|
|
1507
|
-
if buttonNearDoneIcon != nil
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
navigationItem.rightBarButtonItems?.append(buttonItem)
|
|
1507
|
+
if buttonNearDoneIcon != nil {
|
|
1508
|
+
if doneBarButtonItemPosition == .left,
|
|
1509
|
+
navigationItem.leftBarButtonItems?.count == 1,
|
|
1510
|
+
navigationItem.leftBarButtonItems?.first == doneBarButtonItem {
|
|
1511
|
+
let buttonItem = makeButtonNearDoneBarButtonItem(tintColor: tintColor)
|
|
1512
|
+
navigationItem.leftBarButtonItems?.append(buttonItem)
|
|
1513
|
+
} else if doneBarButtonItemPosition == .right,
|
|
1514
|
+
navigationItem.rightBarButtonItems?.count == 1,
|
|
1515
|
+
navigationItem.rightBarButtonItems?.first == doneBarButtonItem {
|
|
1516
|
+
let buttonItem = makeButtonNearDoneBarButtonItem(tintColor: tintColor)
|
|
1517
|
+
navigationItem.rightBarButtonItems?.append(buttonItem)
|
|
1518
|
+
}
|
|
1520
1519
|
}
|
|
1521
1520
|
}
|
|
1522
1521
|
updateTitleAppearance()
|
|
@@ -2424,32 +2423,28 @@ open class WKWebViewController: UIViewController, WKScriptMessageHandler {
|
|
|
2424
2423
|
|
|
2425
2424
|
// Force add buttonNearDone if it's not visible yet
|
|
2426
2425
|
if buttonNearDoneIcon != nil {
|
|
2427
|
-
|
|
2428
|
-
let
|
|
2429
|
-
|
|
2430
|
-
} ?? false
|
|
2426
|
+
let doneOnLeft = doneBarButtonItemPosition == .left
|
|
2427
|
+
let existingItems = doneOnLeft ? navigationItem.leftBarButtonItems : navigationItem.rightBarButtonItems
|
|
2428
|
+
let buttonExists = buttonNearDoneAlreadyExists(in: existingItems)
|
|
2431
2429
|
|
|
2432
2430
|
if !buttonExists {
|
|
2433
|
-
|
|
2434
|
-
|
|
2435
|
-
|
|
2436
|
-
|
|
2437
|
-
|
|
2438
|
-
|
|
2439
|
-
|
|
2440
|
-
|
|
2441
|
-
|
|
2442
|
-
if let tintColor = self.tintColor ?? self.navigationController?.navigationBar.tintColor {
|
|
2443
|
-
buttonItem.tintColor = tintColor
|
|
2444
|
-
}
|
|
2445
|
-
|
|
2446
|
-
// Add to right items
|
|
2447
|
-
if navigationItem.rightBarButtonItems == nil {
|
|
2448
|
-
navigationItem.rightBarButtonItems = [buttonItem]
|
|
2431
|
+
let buttonItem = makeButtonNearDoneBarButtonItem()
|
|
2432
|
+
if doneOnLeft {
|
|
2433
|
+
if navigationItem.leftBarButtonItems == nil {
|
|
2434
|
+
navigationItem.leftBarButtonItems = [buttonItem]
|
|
2435
|
+
} else {
|
|
2436
|
+
var items = navigationItem.leftBarButtonItems ?? []
|
|
2437
|
+
items.append(buttonItem)
|
|
2438
|
+
navigationItem.leftBarButtonItems = items
|
|
2439
|
+
}
|
|
2449
2440
|
} else {
|
|
2450
|
-
|
|
2451
|
-
|
|
2452
|
-
|
|
2441
|
+
if navigationItem.rightBarButtonItems == nil {
|
|
2442
|
+
navigationItem.rightBarButtonItems = [buttonItem]
|
|
2443
|
+
} else {
|
|
2444
|
+
var items = navigationItem.rightBarButtonItems ?? []
|
|
2445
|
+
items.append(buttonItem)
|
|
2446
|
+
navigationItem.rightBarButtonItems = items
|
|
2447
|
+
}
|
|
2453
2448
|
}
|
|
2454
2449
|
|
|
2455
2450
|
print("[DEBUG] Force added buttonNearDone in viewDidAppear")
|
|
@@ -2745,7 +2740,7 @@ fileprivate extension WKWebViewController {
|
|
|
2745
2740
|
break
|
|
2746
2741
|
}
|
|
2747
2742
|
|
|
2748
|
-
|
|
2743
|
+
var leftBarButtons = leftNavigationBarItemTypes.map {
|
|
2749
2744
|
barButtonItemType in
|
|
2750
2745
|
if let barButtonItem = barButtonItem(barButtonItemType) {
|
|
2751
2746
|
return barButtonItem
|
|
@@ -2761,46 +2756,16 @@ fileprivate extension WKWebViewController {
|
|
|
2761
2756
|
return UIBarButtonItem()
|
|
2762
2757
|
}
|
|
2763
2758
|
|
|
2764
|
-
|
|
2765
|
-
|
|
2766
|
-
|
|
2767
|
-
|
|
2768
|
-
|
|
2769
|
-
|
|
2770
|
-
|
|
2771
|
-
|
|
2772
|
-
let selector = #selector(buttonNearDoneDidClick)
|
|
2773
|
-
return item.action == selector
|
|
2774
|
-
}
|
|
2775
|
-
|
|
2776
|
-
if !buttonExists {
|
|
2777
|
-
// Create button with proper tint and template rendering mode
|
|
2778
|
-
let buttonItem = UIBarButtonItem(
|
|
2779
|
-
image: buttonNearDoneIcon?.withRenderingMode(.alwaysTemplate),
|
|
2780
|
-
style: .plain,
|
|
2781
|
-
target: self,
|
|
2782
|
-
action: #selector(buttonNearDoneDidClick)
|
|
2783
|
-
)
|
|
2784
|
-
|
|
2785
|
-
// Apply tint from navigation bar or from tintColor property
|
|
2786
|
-
if let tintColor = self.tintColor ?? self.navigationController?.navigationBar.tintColor {
|
|
2787
|
-
buttonItem.tintColor = tintColor
|
|
2788
|
-
}
|
|
2789
|
-
|
|
2790
|
-
// Make sure the done button is there before adding this one
|
|
2791
|
-
if rightBarButtons.isEmpty && doneBarButtonItemPosition == .right {
|
|
2792
|
-
rightBarButtons.append(doneBarButtonItem)
|
|
2793
|
-
}
|
|
2794
|
-
|
|
2795
|
-
// Add the button
|
|
2796
|
-
rightBarButtons.append(buttonItem)
|
|
2797
|
-
|
|
2798
|
-
print("[DEBUG] Added buttonNearDone to right bar buttons, icon: \(String(describing: buttonNearDoneIcon))")
|
|
2799
|
-
} else {
|
|
2800
|
-
print("[DEBUG] buttonNearDone already exists in right bar buttons")
|
|
2801
|
-
}
|
|
2802
|
-
}
|
|
2759
|
+
appendButtonNearDoneIfNeeded(
|
|
2760
|
+
to: &leftBarButtons,
|
|
2761
|
+
doneExpectedOnThisSide: doneBarButtonItemPosition == .left
|
|
2762
|
+
)
|
|
2763
|
+
appendButtonNearDoneIfNeeded(
|
|
2764
|
+
to: &rightBarButtons,
|
|
2765
|
+
doneExpectedOnThisSide: doneBarButtonItemPosition == .right
|
|
2766
|
+
)
|
|
2803
2767
|
|
|
2768
|
+
navigationItem.leftBarButtonItems = leftBarButtons
|
|
2804
2769
|
navigationItem.rightBarButtonItems = rightBarButtons
|
|
2805
2770
|
|
|
2806
2771
|
// After all buttons are set up, apply tint color
|
|
@@ -3064,6 +3029,41 @@ fileprivate extension WKWebViewController {
|
|
|
3064
3029
|
webView?.goForward()
|
|
3065
3030
|
}
|
|
3066
3031
|
|
|
3032
|
+
func makeButtonNearDoneBarButtonItem(tintColor: UIColor? = nil) -> UIBarButtonItem {
|
|
3033
|
+
let buttonItem = UIBarButtonItem(
|
|
3034
|
+
image: buttonNearDoneIcon?.withRenderingMode(.alwaysTemplate),
|
|
3035
|
+
style: .plain,
|
|
3036
|
+
target: self,
|
|
3037
|
+
action: #selector(buttonNearDoneDidClick)
|
|
3038
|
+
)
|
|
3039
|
+
if let resolvedTint = tintColor ?? self.tintColor ?? self.navigationController?.navigationBar.tintColor {
|
|
3040
|
+
buttonItem.tintColor = resolvedTint
|
|
3041
|
+
}
|
|
3042
|
+
return buttonItem
|
|
3043
|
+
}
|
|
3044
|
+
|
|
3045
|
+
func buttonNearDoneAlreadyExists(in barButtons: [UIBarButtonItem]?) -> Bool {
|
|
3046
|
+
barButtons?.contains { $0.action == #selector(buttonNearDoneDidClick) } ?? false
|
|
3047
|
+
}
|
|
3048
|
+
|
|
3049
|
+
func appendButtonNearDoneIfNeeded(to barButtons: inout [UIBarButtonItem], doneExpectedOnThisSide: Bool) {
|
|
3050
|
+
guard buttonNearDoneIcon != nil else { return }
|
|
3051
|
+
|
|
3052
|
+
let shouldAdd = (barButtons.count == 1 && barButtons[0] == doneBarButtonItem) ||
|
|
3053
|
+
(barButtons.isEmpty && doneExpectedOnThisSide) ||
|
|
3054
|
+
barButtons.contains(doneBarButtonItem)
|
|
3055
|
+
guard shouldAdd else { return }
|
|
3056
|
+
guard !buttonNearDoneAlreadyExists(in: barButtons) else { return }
|
|
3057
|
+
|
|
3058
|
+
if barButtons.isEmpty && doneExpectedOnThisSide {
|
|
3059
|
+
barButtons.append(doneBarButtonItem)
|
|
3060
|
+
}
|
|
3061
|
+
|
|
3062
|
+
barButtons.append(makeButtonNearDoneBarButtonItem())
|
|
3063
|
+
let side = doneExpectedOnThisSide ? "expected" : "other"
|
|
3064
|
+
print("[DEBUG] Added buttonNearDone to \(side) bar buttons, icon: \(String(describing: buttonNearDoneIcon))")
|
|
3065
|
+
}
|
|
3066
|
+
|
|
3067
3067
|
@objc func buttonNearDoneDidClick(sender: AnyObject) {
|
|
3068
3068
|
if showScreenshotButton {
|
|
3069
3069
|
takeScreenshot { result in
|