@capgo/inappbrowser 6.11.1 → 6.13.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 +50 -42
- package/android/src/main/java/ee/forgr/capacitor_inappbrowser/InAppBrowserPlugin.java +161 -41
- package/android/src/main/java/ee/forgr/capacitor_inappbrowser/Options.java +83 -22
- package/android/src/main/java/ee/forgr/capacitor_inappbrowser/WebViewCallbacks.java +2 -0
- package/android/src/main/java/ee/forgr/capacitor_inappbrowser/WebViewDialog.java +749 -96
- package/android/src/main/res/drawable/ic_share.xml +10 -0
- package/android/src/main/res/layout/activity_browser.xml +8 -0
- package/android/src/main/res/layout/content_browser.xml +10 -1
- package/android/src/main/res/layout/tool_bar.xml +19 -7
- package/android/src/main/res/values/strings.xml +2 -0
- package/android/src/main/res/values/themes.xml +27 -0
- package/dist/docs.json +211 -37
- package/dist/esm/definitions.d.ts +244 -31
- package/dist/esm/definitions.js +12 -1
- package/dist/esm/definitions.js.map +1 -1
- package/dist/plugin.cjs.js +12 -1
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +12 -1
- package/dist/plugin.js.map +1 -1
- package/ios/Plugin/InAppBrowserPlugin.swift +344 -44
- package/ios/Plugin/WKWebViewController.swift +499 -45
- package/package.json +7 -8
- package/ios/Plugin/Assets.xcassets/Back.imageset/Back.png +0 -0
- package/ios/Plugin/Assets.xcassets/Back.imageset/Back@2x.png +0 -0
- package/ios/Plugin/Assets.xcassets/Back.imageset/Back@3x.png +0 -0
- package/ios/Plugin/Assets.xcassets/Back.imageset/Contents.json +0 -26
- package/ios/Plugin/Assets.xcassets/Forward.imageset/Contents.json +0 -26
- package/ios/Plugin/Assets.xcassets/Forward.imageset/Forward.png +0 -0
- package/ios/Plugin/Assets.xcassets/Forward.imageset/Forward@2x.png +0 -0
- package/ios/Plugin/Assets.xcassets/Forward.imageset/Forward@3x.png +0 -0
|
@@ -161,10 +161,67 @@ open class WKWebViewController: UIViewController, WKScriptMessageHandler {
|
|
|
161
161
|
|
|
162
162
|
open var websiteTitleInNavigationBar = true
|
|
163
163
|
open var doneBarButtonItemPosition: NavigationBarPosition = .right
|
|
164
|
+
open var showArrowAsClose = false
|
|
164
165
|
open var preShowScript: String?
|
|
165
166
|
open var leftNavigationBarItemTypes: [BarButtonItemType] = []
|
|
166
167
|
open var rightNavigaionBarItemTypes: [BarButtonItemType] = []
|
|
167
|
-
open var toolbarItemTypes: [BarButtonItemType] = [.back, .forward, .
|
|
168
|
+
open var toolbarItemTypes: [BarButtonItemType] = [.back, .forward, .activity]
|
|
169
|
+
|
|
170
|
+
// Status bar style to be applied
|
|
171
|
+
open var statusBarStyle: UIStatusBarStyle = .default
|
|
172
|
+
|
|
173
|
+
// Status bar background view
|
|
174
|
+
private var statusBarBackgroundView: UIView?
|
|
175
|
+
|
|
176
|
+
// Status bar height
|
|
177
|
+
private var statusBarHeight: CGFloat {
|
|
178
|
+
return UIApplication.shared.windows.first?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Make status bar background with colored view underneath
|
|
182
|
+
open func setupStatusBarBackground(color: UIColor) {
|
|
183
|
+
// Remove any existing status bar view
|
|
184
|
+
statusBarBackgroundView?.removeFromSuperview()
|
|
185
|
+
|
|
186
|
+
// Create a new view to cover both status bar and navigation bar
|
|
187
|
+
statusBarBackgroundView = UIView()
|
|
188
|
+
|
|
189
|
+
if let navView = navigationController?.view {
|
|
190
|
+
// Add to back of view hierarchy
|
|
191
|
+
navView.insertSubview(statusBarBackgroundView!, at: 0)
|
|
192
|
+
statusBarBackgroundView?.translatesAutoresizingMaskIntoConstraints = false
|
|
193
|
+
|
|
194
|
+
// Calculate total height - status bar + navigation bar
|
|
195
|
+
let navBarHeight = navigationController?.navigationBar.frame.height ?? 44
|
|
196
|
+
let totalHeight = statusBarHeight + navBarHeight
|
|
197
|
+
|
|
198
|
+
// Position from top of screen to bottom of navigation bar
|
|
199
|
+
NSLayoutConstraint.activate([
|
|
200
|
+
statusBarBackgroundView!.topAnchor.constraint(equalTo: navView.topAnchor),
|
|
201
|
+
statusBarBackgroundView!.leadingAnchor.constraint(equalTo: navView.leadingAnchor),
|
|
202
|
+
statusBarBackgroundView!.trailingAnchor.constraint(equalTo: navView.trailingAnchor),
|
|
203
|
+
statusBarBackgroundView!.heightAnchor.constraint(equalToConstant: totalHeight)
|
|
204
|
+
])
|
|
205
|
+
|
|
206
|
+
// Set background color
|
|
207
|
+
statusBarBackgroundView?.backgroundColor = color
|
|
208
|
+
|
|
209
|
+
// Make navigation bar transparent to show our view underneath
|
|
210
|
+
navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
|
|
211
|
+
navigationController?.navigationBar.shadowImage = UIImage()
|
|
212
|
+
navigationController?.navigationBar.isTranslucent = true
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Override to use our custom status bar style
|
|
217
|
+
override open var preferredStatusBarStyle: UIStatusBarStyle {
|
|
218
|
+
return statusBarStyle
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Force status bar style update when needed
|
|
222
|
+
open func updateStatusBarStyle() {
|
|
223
|
+
setNeedsStatusBarAppearanceUpdate()
|
|
224
|
+
}
|
|
168
225
|
|
|
169
226
|
open var backBarButtonItemImage: UIImage?
|
|
170
227
|
open var forwardBarButtonItemImage: UIImage?
|
|
@@ -183,13 +240,21 @@ open class WKWebViewController: UIViewController, WKScriptMessageHandler {
|
|
|
183
240
|
fileprivate var originalUserAgent: String?
|
|
184
241
|
|
|
185
242
|
fileprivate lazy var backBarButtonItem: UIBarButtonItem = {
|
|
186
|
-
let
|
|
187
|
-
|
|
243
|
+
let navBackImage = UIImage(systemName: "chevron.backward")?.withRenderingMode(.alwaysTemplate)
|
|
244
|
+
let barButtonItem = UIBarButtonItem(image: navBackImage, style: .plain, target: self, action: #selector(backDidClick(sender:)))
|
|
245
|
+
if let tintColor = self.tintColor ?? self.navigationController?.navigationBar.tintColor {
|
|
246
|
+
barButtonItem.tintColor = tintColor
|
|
247
|
+
}
|
|
248
|
+
return barButtonItem
|
|
188
249
|
}()
|
|
189
250
|
|
|
190
251
|
fileprivate lazy var forwardBarButtonItem: UIBarButtonItem = {
|
|
191
|
-
let
|
|
192
|
-
|
|
252
|
+
let forwardImage = UIImage(systemName: "chevron.forward")?.withRenderingMode(.alwaysTemplate)
|
|
253
|
+
let barButtonItem = UIBarButtonItem(image: forwardImage, style: .plain, target: self, action: #selector(forwardDidClick(sender:)))
|
|
254
|
+
if let tintColor = self.tintColor ?? self.navigationController?.navigationBar.tintColor {
|
|
255
|
+
barButtonItem.tintColor = tintColor
|
|
256
|
+
}
|
|
257
|
+
return barButtonItem
|
|
193
258
|
}()
|
|
194
259
|
|
|
195
260
|
fileprivate lazy var reloadBarButtonItem: UIBarButtonItem = {
|
|
@@ -209,15 +274,54 @@ open class WKWebViewController: UIViewController, WKScriptMessageHandler {
|
|
|
209
274
|
}()
|
|
210
275
|
|
|
211
276
|
fileprivate lazy var activityBarButtonItem: UIBarButtonItem = {
|
|
277
|
+
// Check if custom image is provided
|
|
212
278
|
if let image = activityBarButtonItemImage {
|
|
213
|
-
|
|
279
|
+
let button = UIBarButtonItem(image: image.withRenderingMode(.alwaysTemplate),
|
|
280
|
+
style: .plain,
|
|
281
|
+
target: self,
|
|
282
|
+
action: #selector(activityDidClick(sender:)))
|
|
283
|
+
|
|
284
|
+
// Apply tint from navigation bar or from tintColor property
|
|
285
|
+
if let tintColor = self.tintColor ?? self.navigationController?.navigationBar.tintColor {
|
|
286
|
+
button.tintColor = tintColor
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
print("[DEBUG] Created activity button with custom image")
|
|
290
|
+
return button
|
|
214
291
|
} else {
|
|
215
|
-
|
|
292
|
+
// Use system share icon
|
|
293
|
+
let button = UIBarButtonItem(barButtonSystemItem: .action,
|
|
294
|
+
target: self,
|
|
295
|
+
action: #selector(activityDidClick(sender:)))
|
|
296
|
+
|
|
297
|
+
// Apply tint from navigation bar or from tintColor property
|
|
298
|
+
if let tintColor = self.tintColor ?? self.navigationController?.navigationBar.tintColor {
|
|
299
|
+
button.tintColor = tintColor
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
print("[DEBUG] Created activity button with system action icon")
|
|
303
|
+
return button
|
|
216
304
|
}
|
|
217
305
|
}()
|
|
218
306
|
|
|
219
307
|
fileprivate lazy var doneBarButtonItem: UIBarButtonItem = {
|
|
220
|
-
|
|
308
|
+
if showArrowAsClose {
|
|
309
|
+
// Show chevron icon when showArrowAsClose is true (originally was arrow.left)
|
|
310
|
+
let chevronImage = UIImage(systemName: "chevron.left")?.withRenderingMode(.alwaysTemplate)
|
|
311
|
+
let barButtonItem = UIBarButtonItem(image: chevronImage, style: .plain, target: self, action: #selector(doneDidClick(sender:)))
|
|
312
|
+
if let tintColor = self.tintColor ?? self.navigationController?.navigationBar.tintColor {
|
|
313
|
+
barButtonItem.tintColor = tintColor
|
|
314
|
+
}
|
|
315
|
+
return barButtonItem
|
|
316
|
+
} else {
|
|
317
|
+
// Show X icon by default
|
|
318
|
+
let xImage = UIImage(systemName: "xmark")?.withRenderingMode(.alwaysTemplate)
|
|
319
|
+
let barButtonItem = UIBarButtonItem(image: xImage, style: .plain, target: self, action: #selector(doneDidClick(sender:)))
|
|
320
|
+
if let tintColor = self.tintColor ?? self.navigationController?.navigationBar.tintColor {
|
|
321
|
+
barButtonItem.tintColor = tintColor
|
|
322
|
+
}
|
|
323
|
+
return barButtonItem
|
|
324
|
+
}
|
|
221
325
|
}()
|
|
222
326
|
|
|
223
327
|
fileprivate lazy var flexibleSpaceBarButtonItem: UIBarButtonItem = {
|
|
@@ -226,6 +330,12 @@ open class WKWebViewController: UIViewController, WKScriptMessageHandler {
|
|
|
226
330
|
|
|
227
331
|
fileprivate var credentials: WKWebViewCredentials?
|
|
228
332
|
|
|
333
|
+
var textZoom: Int?
|
|
334
|
+
|
|
335
|
+
var capableWebView: WKWebView? {
|
|
336
|
+
return webView
|
|
337
|
+
}
|
|
338
|
+
|
|
229
339
|
deinit {
|
|
230
340
|
webView?.removeObserver(self, forKeyPath: estimatedProgressKeyPath)
|
|
231
341
|
if websiteTitleInNavigationBar {
|
|
@@ -239,6 +349,98 @@ open class WKWebViewController: UIViewController, WKScriptMessageHandler {
|
|
|
239
349
|
if self.webView == nil {
|
|
240
350
|
self.initWebview()
|
|
241
351
|
}
|
|
352
|
+
|
|
353
|
+
// Force all buttons to use tint color
|
|
354
|
+
updateButtonTintColors()
|
|
355
|
+
|
|
356
|
+
// Extra call to ensure buttonNearDone is visible
|
|
357
|
+
if buttonNearDoneIcon != nil {
|
|
358
|
+
// Delay slightly to ensure navigation items are set up
|
|
359
|
+
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { [weak self] in
|
|
360
|
+
self?.updateButtonTintColors()
|
|
361
|
+
|
|
362
|
+
// Force update UI if needed
|
|
363
|
+
self?.navigationController?.navigationBar.setNeedsLayout()
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
func updateButtonTintColors() {
|
|
369
|
+
// Ensure all button items use the navigation bar's tint color
|
|
370
|
+
if let tintColor = navigationController?.navigationBar.tintColor {
|
|
371
|
+
backBarButtonItem.tintColor = tintColor
|
|
372
|
+
forwardBarButtonItem.tintColor = tintColor
|
|
373
|
+
reloadBarButtonItem.tintColor = tintColor
|
|
374
|
+
stopBarButtonItem.tintColor = tintColor
|
|
375
|
+
activityBarButtonItem.tintColor = tintColor
|
|
376
|
+
doneBarButtonItem.tintColor = tintColor
|
|
377
|
+
flexibleSpaceBarButtonItem.tintColor = tintColor
|
|
378
|
+
|
|
379
|
+
// Update toolbar items
|
|
380
|
+
if let items = toolbarItems {
|
|
381
|
+
for item in items {
|
|
382
|
+
item.tintColor = tintColor
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
// Update navigation items
|
|
387
|
+
if let leftItems = navigationItem.leftBarButtonItems {
|
|
388
|
+
for item in leftItems {
|
|
389
|
+
item.tintColor = tintColor
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
if let rightItems = navigationItem.rightBarButtonItems {
|
|
394
|
+
for item in rightItems {
|
|
395
|
+
item.tintColor = tintColor
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
// Create buttonNearDone button with the correct tint color if it doesn't already exist
|
|
400
|
+
if buttonNearDoneIcon != nil &&
|
|
401
|
+
navigationItem.rightBarButtonItems?.count == 1 &&
|
|
402
|
+
navigationItem.rightBarButtonItems?.first == doneBarButtonItem {
|
|
403
|
+
|
|
404
|
+
// Create a properly tinted button
|
|
405
|
+
let buttonItem = UIBarButtonItem(image: buttonNearDoneIcon?.withRenderingMode(.alwaysTemplate),
|
|
406
|
+
style: .plain,
|
|
407
|
+
target: self,
|
|
408
|
+
action: #selector(buttonNearDoneDidClick))
|
|
409
|
+
buttonItem.tintColor = tintColor
|
|
410
|
+
|
|
411
|
+
// Add it to right items
|
|
412
|
+
navigationItem.rightBarButtonItems?.append(buttonItem)
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
override open func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
|
|
418
|
+
super.traitCollectionDidChange(previousTraitCollection)
|
|
419
|
+
|
|
420
|
+
// Update colors when appearance changes
|
|
421
|
+
if traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
|
|
422
|
+
// Update tint colors
|
|
423
|
+
let isDarkMode = traitCollection.userInterfaceStyle == .dark
|
|
424
|
+
let textColor = isDarkMode ? UIColor.white : UIColor.black
|
|
425
|
+
|
|
426
|
+
if let navBar = navigationController?.navigationBar {
|
|
427
|
+
if navBar.backgroundColor == UIColor.black || navBar.backgroundColor == UIColor.white {
|
|
428
|
+
navBar.backgroundColor = isDarkMode ? UIColor.black : UIColor.white
|
|
429
|
+
navBar.tintColor = textColor
|
|
430
|
+
navBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: textColor]
|
|
431
|
+
|
|
432
|
+
// Update all buttons
|
|
433
|
+
updateButtonTintColors()
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
if let toolbar = navigationController?.toolbar {
|
|
438
|
+
if toolbar.backgroundColor == UIColor.black || toolbar.backgroundColor == UIColor.white {
|
|
439
|
+
toolbar.backgroundColor = isDarkMode ? UIColor.black : UIColor.white
|
|
440
|
+
toolbar.tintColor = textColor
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
}
|
|
242
444
|
}
|
|
243
445
|
|
|
244
446
|
open func setCredentials(credentials: WKWebViewCredentials?) {
|
|
@@ -376,7 +578,9 @@ open class WKWebViewController: UIViewController, WKScriptMessageHandler {
|
|
|
376
578
|
open func setupViewElements() {
|
|
377
579
|
self.setUpProgressView()
|
|
378
580
|
self.setUpConstraints()
|
|
581
|
+
self.setUpNavigationBarAppearance()
|
|
379
582
|
self.addBarButtonItems()
|
|
583
|
+
self.updateBarButtonItems()
|
|
380
584
|
}
|
|
381
585
|
|
|
382
586
|
@objc func restateViewHeight() {
|
|
@@ -388,7 +592,7 @@ open class WKWebViewController: UIViewController, WKScriptMessageHandler {
|
|
|
388
592
|
topPadding = window?.safeAreaInsets.top ?? 0.0
|
|
389
593
|
}
|
|
390
594
|
if UIDevice.current.orientation.isPortrait {
|
|
391
|
-
|
|
595
|
+
// Don't force toolbar visibility
|
|
392
596
|
if self.viewHeightPortrait == nil {
|
|
393
597
|
self.viewHeightPortrait = self.view.safeAreaLayoutGuide.layoutFrame.size.height
|
|
394
598
|
if toolbarItemTypes.count == 0 {
|
|
@@ -400,7 +604,7 @@ open class WKWebViewController: UIViewController, WKScriptMessageHandler {
|
|
|
400
604
|
}
|
|
401
605
|
self.currentViewHeight = self.viewHeightPortrait
|
|
402
606
|
} else if UIDevice.current.orientation.isLandscape {
|
|
403
|
-
|
|
607
|
+
// Don't force toolbar visibility
|
|
404
608
|
if self.viewHeightLandscape == nil {
|
|
405
609
|
self.viewHeightLandscape = self.view.safeAreaLayoutGuide.layoutFrame.size.height
|
|
406
610
|
if toolbarItemTypes.count == 0 {
|
|
@@ -432,6 +636,69 @@ open class WKWebViewController: UIViewController, WKScriptMessageHandler {
|
|
|
432
636
|
setUpState()
|
|
433
637
|
self.viewWasPresented = true
|
|
434
638
|
}
|
|
639
|
+
|
|
640
|
+
// Force update button appearances
|
|
641
|
+
updateButtonTintColors()
|
|
642
|
+
|
|
643
|
+
// Ensure status bar appearance is correct when view appears
|
|
644
|
+
// Make sure we have the latest tint color
|
|
645
|
+
if let tintColor = self.tintColor {
|
|
646
|
+
// Update the status bar background if needed
|
|
647
|
+
if let navController = navigationController, let backgroundColor = navController.navigationBar.backgroundColor ?? statusBarBackgroundView?.backgroundColor {
|
|
648
|
+
setupStatusBarBackground(color: backgroundColor)
|
|
649
|
+
} else {
|
|
650
|
+
setupStatusBarBackground(color: UIColor.white)
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
// Update status bar style
|
|
655
|
+
updateStatusBarStyle()
|
|
656
|
+
|
|
657
|
+
// Special handling for blank toolbar mode
|
|
658
|
+
if blankNavigationTab && statusBarBackgroundView != nil {
|
|
659
|
+
if let color = statusBarBackgroundView?.backgroundColor {
|
|
660
|
+
// Set view color to match status bar
|
|
661
|
+
view.backgroundColor = color
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
override open func viewDidAppear(_ animated: Bool) {
|
|
667
|
+
super.viewDidAppear(animated)
|
|
668
|
+
|
|
669
|
+
// Force add buttonNearDone if it's not visible yet
|
|
670
|
+
if buttonNearDoneIcon != nil {
|
|
671
|
+
// Check if button already exists in the navigation bar
|
|
672
|
+
let buttonExists = navigationItem.rightBarButtonItems?.contains { item in
|
|
673
|
+
return item.action == #selector(buttonNearDoneDidClick)
|
|
674
|
+
} ?? false
|
|
675
|
+
|
|
676
|
+
if !buttonExists {
|
|
677
|
+
// Create and add the button directly
|
|
678
|
+
let buttonItem = UIBarButtonItem(
|
|
679
|
+
image: buttonNearDoneIcon?.withRenderingMode(.alwaysTemplate),
|
|
680
|
+
style: .plain,
|
|
681
|
+
target: self,
|
|
682
|
+
action: #selector(buttonNearDoneDidClick)
|
|
683
|
+
)
|
|
684
|
+
|
|
685
|
+
// Apply tint color
|
|
686
|
+
if let tintColor = self.tintColor ?? self.navigationController?.navigationBar.tintColor {
|
|
687
|
+
buttonItem.tintColor = tintColor
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
// Add to right items
|
|
691
|
+
if navigationItem.rightBarButtonItems == nil {
|
|
692
|
+
navigationItem.rightBarButtonItems = [buttonItem]
|
|
693
|
+
} else {
|
|
694
|
+
var items = navigationItem.rightBarButtonItems ?? []
|
|
695
|
+
items.append(buttonItem)
|
|
696
|
+
navigationItem.rightBarButtonItems = items
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
print("[DEBUG] Force added buttonNearDone in viewDidAppear")
|
|
700
|
+
}
|
|
701
|
+
}
|
|
435
702
|
}
|
|
436
703
|
|
|
437
704
|
override open func viewWillDisappear(_ animated: Bool) {
|
|
@@ -514,6 +781,15 @@ public extension WKWebViewController {
|
|
|
514
781
|
self?.webView?.evaluateJavaScript(script, completionHandler: completion)
|
|
515
782
|
}
|
|
516
783
|
}
|
|
784
|
+
|
|
785
|
+
func applyTextZoom(_ zoomPercent: Int) {
|
|
786
|
+
let script = """
|
|
787
|
+
document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust = '\(zoomPercent)%';
|
|
788
|
+
document.getElementsByTagName('body')[0].style.textSizeAdjust = '\(zoomPercent)%';
|
|
789
|
+
"""
|
|
790
|
+
|
|
791
|
+
executeScript(script: script)
|
|
792
|
+
}
|
|
517
793
|
}
|
|
518
794
|
|
|
519
795
|
// MARK: - Fileprivate Methods
|
|
@@ -595,7 +871,6 @@ fileprivate extension WKWebViewController {
|
|
|
595
871
|
}
|
|
596
872
|
}
|
|
597
873
|
|
|
598
|
-
// if presentingViewController != nil {
|
|
599
874
|
switch doneBarButtonItemPosition {
|
|
600
875
|
case .left:
|
|
601
876
|
if !leftNavigationBarItemTypes.contains(where: { type in
|
|
@@ -622,7 +897,6 @@ fileprivate extension WKWebViewController {
|
|
|
622
897
|
case .none:
|
|
623
898
|
break
|
|
624
899
|
}
|
|
625
|
-
// }
|
|
626
900
|
|
|
627
901
|
navigationItem.leftBarButtonItems = leftNavigationBarItemTypes.map {
|
|
628
902
|
barButtonItemType in
|
|
@@ -639,28 +913,128 @@ fileprivate extension WKWebViewController {
|
|
|
639
913
|
}
|
|
640
914
|
return UIBarButtonItem()
|
|
641
915
|
}
|
|
642
|
-
if rightBarButtons.count == 1 && buttonNearDoneIcon != nil && rightBarButtons[0] == doneBarButtonItem {
|
|
643
|
-
rightBarButtons.append(UIBarButtonItem(image: buttonNearDoneIcon, style: .plain, target: self, action: #selector(buttonNearDoneDidClick)))
|
|
644
|
-
}
|
|
645
|
-
navigationItem.rightBarButtonItems = rightBarButtons
|
|
646
916
|
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
917
|
+
// If we have buttonNearDoneIcon and the first (or only) right button is the done button
|
|
918
|
+
if buttonNearDoneIcon != nil &&
|
|
919
|
+
((rightBarButtons.count == 1 && rightBarButtons[0] == doneBarButtonItem) ||
|
|
920
|
+
(rightBarButtons.isEmpty && doneBarButtonItemPosition == .right) ||
|
|
921
|
+
rightBarButtons.contains(doneBarButtonItem)) {
|
|
922
|
+
|
|
923
|
+
// Check if button already exists to avoid duplicates
|
|
924
|
+
let buttonExists = rightBarButtons.contains { item in
|
|
925
|
+
let selector = #selector(buttonNearDoneDidClick)
|
|
926
|
+
return item.action == selector
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
if !buttonExists {
|
|
930
|
+
// Create button with proper tint and template rendering mode
|
|
931
|
+
let buttonItem = UIBarButtonItem(
|
|
932
|
+
image: buttonNearDoneIcon?.withRenderingMode(.alwaysTemplate),
|
|
933
|
+
style: .plain,
|
|
934
|
+
target: self,
|
|
935
|
+
action: #selector(buttonNearDoneDidClick)
|
|
936
|
+
)
|
|
937
|
+
|
|
938
|
+
// Apply tint from navigation bar or from tintColor property
|
|
939
|
+
if let tintColor = self.tintColor ?? self.navigationController?.navigationBar.tintColor {
|
|
940
|
+
buttonItem.tintColor = tintColor
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
// Make sure the done button is there before adding this one
|
|
944
|
+
if rightBarButtons.isEmpty && doneBarButtonItemPosition == .right {
|
|
945
|
+
rightBarButtons.append(doneBarButtonItem)
|
|
946
|
+
}
|
|
947
|
+
|
|
948
|
+
// Add the button
|
|
949
|
+
rightBarButtons.append(buttonItem)
|
|
950
|
+
|
|
951
|
+
print("[DEBUG] Added buttonNearDone to right bar buttons, icon: \(String(describing: buttonNearDoneIcon))")
|
|
952
|
+
} else {
|
|
953
|
+
print("[DEBUG] buttonNearDone already exists in right bar buttons")
|
|
650
954
|
}
|
|
651
955
|
}
|
|
652
956
|
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
957
|
+
navigationItem.rightBarButtonItems = rightBarButtons
|
|
958
|
+
|
|
959
|
+
// Create toolbar items
|
|
960
|
+
if !toolbarItemTypes.isEmpty {
|
|
961
|
+
// Check if toolbar has back and forward buttons
|
|
962
|
+
let hasBackButton = toolbarItemTypes.contains(where: {
|
|
963
|
+
if case .back = $0 { return true }
|
|
964
|
+
return false
|
|
965
|
+
})
|
|
966
|
+
|
|
967
|
+
let hasForwardButton = toolbarItemTypes.contains(where: {
|
|
968
|
+
if case .forward = $0 { return true }
|
|
969
|
+
return false
|
|
970
|
+
})
|
|
971
|
+
|
|
972
|
+
let hasReloadButton = toolbarItemTypes.contains(where: {
|
|
973
|
+
if case .reload = $0 { return true }
|
|
974
|
+
return false
|
|
975
|
+
})
|
|
976
|
+
|
|
977
|
+
if hasBackButton && hasForwardButton {
|
|
978
|
+
// Create Android-like toolbar with evenly spaced buttons
|
|
979
|
+
var items: [UIBarButtonItem] = []
|
|
980
|
+
let flexSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
|
|
981
|
+
|
|
982
|
+
// Add spacing before back button
|
|
983
|
+
items.append(flexSpace)
|
|
984
|
+
|
|
985
|
+
// Add back button
|
|
986
|
+
items.append(backBarButtonItem)
|
|
987
|
+
|
|
988
|
+
// Add spacing between buttons
|
|
989
|
+
items.append(flexSpace)
|
|
990
|
+
|
|
991
|
+
// Add forward button
|
|
992
|
+
items.append(forwardBarButtonItem)
|
|
993
|
+
|
|
994
|
+
// Add spacing between buttons
|
|
995
|
+
items.append(flexSpace)
|
|
996
|
+
|
|
997
|
+
// Add reload button if present
|
|
998
|
+
if hasReloadButton {
|
|
999
|
+
items.append(reloadBarButtonItem)
|
|
1000
|
+
items.append(flexSpace)
|
|
1001
|
+
}
|
|
1002
|
+
|
|
1003
|
+
setToolbarItems(items, animated: true)
|
|
1004
|
+
} else {
|
|
1005
|
+
// For other toolbar types, map the items directly
|
|
1006
|
+
let items = toolbarItemTypes.map { type -> UIBarButtonItem in
|
|
1007
|
+
switch type {
|
|
1008
|
+
case .back:
|
|
1009
|
+
return backBarButtonItem
|
|
1010
|
+
case .forward:
|
|
1011
|
+
return forwardBarButtonItem
|
|
1012
|
+
case .reload:
|
|
1013
|
+
return reloadBarButtonItem
|
|
1014
|
+
case .stop:
|
|
1015
|
+
return stopBarButtonItem
|
|
1016
|
+
case .activity:
|
|
1017
|
+
return activityBarButtonItem
|
|
1018
|
+
case .done:
|
|
1019
|
+
return doneBarButtonItem
|
|
1020
|
+
case .flexibleSpace:
|
|
1021
|
+
return flexibleSpaceBarButtonItem
|
|
1022
|
+
case .custom:
|
|
1023
|
+
return UIBarButtonItem()
|
|
1024
|
+
}
|
|
1025
|
+
}
|
|
1026
|
+
setToolbarItems(items, animated: true)
|
|
657
1027
|
}
|
|
658
|
-
|
|
1028
|
+
} else {
|
|
1029
|
+
setToolbarItems([], animated: false)
|
|
659
1030
|
}
|
|
660
|
-
|
|
1031
|
+
|
|
1032
|
+
// After all buttons are set up, apply tint color
|
|
1033
|
+
updateButtonTintColors()
|
|
661
1034
|
}
|
|
662
1035
|
|
|
663
1036
|
func updateBarButtonItems() {
|
|
1037
|
+
// Update navigation buttons (completely separate from close button)
|
|
664
1038
|
backBarButtonItem.isEnabled = webView?.canGoBack ?? false
|
|
665
1039
|
forwardBarButtonItem.isEnabled = webView?.canGoForward ?? false
|
|
666
1040
|
|
|
@@ -696,9 +1070,21 @@ fileprivate extension WKWebViewController {
|
|
|
696
1070
|
|
|
697
1071
|
func setUpState() {
|
|
698
1072
|
navigationController?.setNavigationBarHidden(false, animated: true)
|
|
699
|
-
navigationController?.setToolbarHidden(toolbarItemTypes.count == 0, animated: true)
|
|
700
1073
|
|
|
701
|
-
if
|
|
1074
|
+
// Only show toolbar if there are toolbar items
|
|
1075
|
+
let hideToolbar = toolbarItemTypes.isEmpty
|
|
1076
|
+
navigationController?.setToolbarHidden(hideToolbar, animated: true)
|
|
1077
|
+
|
|
1078
|
+
// Set tint colors but don't override specific colors
|
|
1079
|
+
if tintColor == nil {
|
|
1080
|
+
// Use system appearance if no specific tint color is set
|
|
1081
|
+
let isDarkMode = traitCollection.userInterfaceStyle == .dark
|
|
1082
|
+
let textColor = isDarkMode ? UIColor.white : UIColor.black
|
|
1083
|
+
|
|
1084
|
+
navigationController?.navigationBar.tintColor = textColor
|
|
1085
|
+
navigationController?.toolbar.tintColor = textColor
|
|
1086
|
+
progressView?.progressTintColor = textColor
|
|
1087
|
+
} else {
|
|
702
1088
|
progressView?.progressTintColor = tintColor
|
|
703
1089
|
navigationController?.navigationBar.tintColor = tintColor
|
|
704
1090
|
navigationController?.toolbar.tintColor = tintColor
|
|
@@ -769,7 +1155,10 @@ fileprivate extension WKWebViewController {
|
|
|
769
1155
|
}
|
|
770
1156
|
|
|
771
1157
|
@objc func backDidClick(sender: AnyObject) {
|
|
772
|
-
|
|
1158
|
+
// Only handle back navigation, not closing
|
|
1159
|
+
if webView?.canGoBack ?? false {
|
|
1160
|
+
webView?.goBack()
|
|
1161
|
+
}
|
|
773
1162
|
}
|
|
774
1163
|
|
|
775
1164
|
@objc func forwardDidClick(sender: AnyObject) {
|
|
@@ -794,7 +1183,10 @@ fileprivate extension WKWebViewController {
|
|
|
794
1183
|
}
|
|
795
1184
|
|
|
796
1185
|
@objc func activityDidClick(sender: AnyObject) {
|
|
1186
|
+
print("[DEBUG] Activity button clicked, shareSubject: \(self.shareSubject ?? "nil")")
|
|
1187
|
+
|
|
797
1188
|
guard let s = self.source else {
|
|
1189
|
+
print("[DEBUG] Activity button: No source available")
|
|
798
1190
|
return
|
|
799
1191
|
}
|
|
800
1192
|
|
|
@@ -811,30 +1203,50 @@ fileprivate extension WKWebViewController {
|
|
|
811
1203
|
}
|
|
812
1204
|
|
|
813
1205
|
func showDisclaimer(items: [Any], sender: AnyObject) {
|
|
814
|
-
|
|
815
|
-
if
|
|
1206
|
+
// Show disclaimer dialog before sharing if shareDisclaimer is set
|
|
1207
|
+
if let disclaimer = self.shareDisclaimer, !disclaimer.isEmpty {
|
|
1208
|
+
// Create and show the alert
|
|
816
1209
|
let alert = UIAlertController(
|
|
817
|
-
title:
|
|
818
|
-
message:
|
|
1210
|
+
title: disclaimer["title"] as? String ?? "Title",
|
|
1211
|
+
message: disclaimer["message"] as? String ?? "Message",
|
|
819
1212
|
preferredStyle: UIAlertController.Style.alert)
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
1213
|
+
|
|
1214
|
+
// Add confirm button that continues with sharing
|
|
1215
|
+
alert.addAction(UIAlertAction(
|
|
1216
|
+
title: disclaimer["confirmBtn"] as? String ?? "Confirm",
|
|
1217
|
+
style: UIAlertAction.Style.default,
|
|
1218
|
+
handler: { _ in
|
|
1219
|
+
// Notify that confirm was clicked
|
|
1220
|
+
self.capBrowserPlugin?.notifyListeners("confirmBtnClicked", data: nil)
|
|
1221
|
+
|
|
1222
|
+
// Show the share dialog
|
|
1223
|
+
self.showShareSheet(items: items, sender: sender)
|
|
1224
|
+
}
|
|
1225
|
+
))
|
|
1226
|
+
|
|
1227
|
+
// Add cancel button
|
|
1228
|
+
alert.addAction(UIAlertAction(
|
|
1229
|
+
title: disclaimer["cancelBtn"] as? String ?? "Cancel",
|
|
1230
|
+
style: UIAlertAction.Style.cancel,
|
|
1231
|
+
handler: nil
|
|
1232
|
+
))
|
|
1233
|
+
|
|
1234
|
+
// Present the alert
|
|
829
1235
|
self.present(alert, animated: true, completion: nil)
|
|
830
1236
|
} else {
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
activityViewController.popoverPresentationController?.barButtonItem = (sender as! UIBarButtonItem)
|
|
834
|
-
self.present(activityViewController, animated: true, completion: nil)
|
|
1237
|
+
// No disclaimer, directly show share sheet
|
|
1238
|
+
showShareSheet(items: items, sender: sender)
|
|
835
1239
|
}
|
|
836
1240
|
}
|
|
837
1241
|
|
|
1242
|
+
// Separated the actual sharing functionality
|
|
1243
|
+
private func showShareSheet(items: [Any], sender: AnyObject) {
|
|
1244
|
+
let activityViewController = UIActivityViewController(activityItems: items, applicationActivities: nil)
|
|
1245
|
+
activityViewController.setValue(self.shareSubject ?? self.title, forKey: "subject")
|
|
1246
|
+
activityViewController.popoverPresentationController?.barButtonItem = (sender as! UIBarButtonItem)
|
|
1247
|
+
self.present(activityViewController, animated: true, completion: nil)
|
|
1248
|
+
}
|
|
1249
|
+
|
|
838
1250
|
func closeView () {
|
|
839
1251
|
var canDismiss = true
|
|
840
1252
|
if let url = self.source?.url {
|
|
@@ -880,6 +1292,42 @@ fileprivate extension WKWebViewController {
|
|
|
880
1292
|
}
|
|
881
1293
|
|
|
882
1294
|
func canRotate() {}
|
|
1295
|
+
|
|
1296
|
+
func close() {
|
|
1297
|
+
let currentUrl = webView?.url?.absoluteString ?? ""
|
|
1298
|
+
dismiss(animated: true, completion: nil)
|
|
1299
|
+
capBrowserPlugin?.notifyListeners("closeEvent", data: ["url": currentUrl])
|
|
1300
|
+
}
|
|
1301
|
+
|
|
1302
|
+
open func setUpNavigationBarAppearance() {
|
|
1303
|
+
// Set up basic bar appearance
|
|
1304
|
+
if let navBar = navigationController?.navigationBar {
|
|
1305
|
+
// Make navigation bar transparent
|
|
1306
|
+
navBar.setBackgroundImage(UIImage(), for: .default)
|
|
1307
|
+
navBar.shadowImage = UIImage()
|
|
1308
|
+
navBar.isTranslucent = true
|
|
1309
|
+
|
|
1310
|
+
// Ensure tint colors are applied properly
|
|
1311
|
+
if navBar.tintColor == nil {
|
|
1312
|
+
navBar.tintColor = tintColor ?? .black
|
|
1313
|
+
}
|
|
1314
|
+
|
|
1315
|
+
// Ensure text colors are set
|
|
1316
|
+
if navBar.titleTextAttributes == nil {
|
|
1317
|
+
navBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: tintColor ?? .black]
|
|
1318
|
+
}
|
|
1319
|
+
|
|
1320
|
+
// Ensure the navigation bar buttons are properly visible
|
|
1321
|
+
for item in navBar.items ?? [] {
|
|
1322
|
+
for barButton in (item.leftBarButtonItems ?? []) + (item.rightBarButtonItems ?? []) {
|
|
1323
|
+
barButton.tintColor = tintColor ?? navBar.tintColor ?? .black
|
|
1324
|
+
}
|
|
1325
|
+
}
|
|
1326
|
+
}
|
|
1327
|
+
|
|
1328
|
+
// Force button colors to update
|
|
1329
|
+
updateButtonTintColors()
|
|
1330
|
+
}
|
|
883
1331
|
}
|
|
884
1332
|
|
|
885
1333
|
// MARK: - WKUIDelegate
|
|
@@ -965,6 +1413,12 @@ extension WKWebViewController: WKNavigationDelegate {
|
|
|
965
1413
|
self.injectPreShowScript()
|
|
966
1414
|
}
|
|
967
1415
|
}
|
|
1416
|
+
|
|
1417
|
+
// Apply text zoom if set
|
|
1418
|
+
if let zoom = self.textZoom {
|
|
1419
|
+
applyTextZoom(zoom)
|
|
1420
|
+
}
|
|
1421
|
+
|
|
968
1422
|
didpageInit = true
|
|
969
1423
|
updateBarButtonItems()
|
|
970
1424
|
self.progressView?.progress = 0
|