@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.
Files changed (30) hide show
  1. package/README.md +50 -42
  2. package/android/src/main/java/ee/forgr/capacitor_inappbrowser/InAppBrowserPlugin.java +161 -41
  3. package/android/src/main/java/ee/forgr/capacitor_inappbrowser/Options.java +83 -22
  4. package/android/src/main/java/ee/forgr/capacitor_inappbrowser/WebViewCallbacks.java +2 -0
  5. package/android/src/main/java/ee/forgr/capacitor_inappbrowser/WebViewDialog.java +749 -96
  6. package/android/src/main/res/drawable/ic_share.xml +10 -0
  7. package/android/src/main/res/layout/activity_browser.xml +8 -0
  8. package/android/src/main/res/layout/content_browser.xml +10 -1
  9. package/android/src/main/res/layout/tool_bar.xml +19 -7
  10. package/android/src/main/res/values/strings.xml +2 -0
  11. package/android/src/main/res/values/themes.xml +27 -0
  12. package/dist/docs.json +211 -37
  13. package/dist/esm/definitions.d.ts +244 -31
  14. package/dist/esm/definitions.js +12 -1
  15. package/dist/esm/definitions.js.map +1 -1
  16. package/dist/plugin.cjs.js +12 -1
  17. package/dist/plugin.cjs.js.map +1 -1
  18. package/dist/plugin.js +12 -1
  19. package/dist/plugin.js.map +1 -1
  20. package/ios/Plugin/InAppBrowserPlugin.swift +344 -44
  21. package/ios/Plugin/WKWebViewController.swift +499 -45
  22. package/package.json +7 -8
  23. package/ios/Plugin/Assets.xcassets/Back.imageset/Back.png +0 -0
  24. package/ios/Plugin/Assets.xcassets/Back.imageset/Back@2x.png +0 -0
  25. package/ios/Plugin/Assets.xcassets/Back.imageset/Back@3x.png +0 -0
  26. package/ios/Plugin/Assets.xcassets/Back.imageset/Contents.json +0 -26
  27. package/ios/Plugin/Assets.xcassets/Forward.imageset/Contents.json +0 -26
  28. package/ios/Plugin/Assets.xcassets/Forward.imageset/Forward.png +0 -0
  29. package/ios/Plugin/Assets.xcassets/Forward.imageset/Forward@2x.png +0 -0
  30. 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, .reload, .activity]
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 bundle = Bundle(for: WKWebViewController.self)
187
- return UIBarButtonItem(image: backBarButtonItemImage ?? UIImage(named: "Back", in: bundle, compatibleWith: nil), style: .plain, target: self, action: #selector(backDidClick(sender:)))
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 bundle = Bundle(for: WKWebViewController.self)
192
- return UIBarButtonItem(image: forwardBarButtonItemImage ?? UIImage(named: "Forward", in: bundle, compatibleWith: nil), style: .plain, target: self, action: #selector(forwardDidClick(sender:)))
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
- return UIBarButtonItem(image: image, style: .plain, target: self, action: #selector(activityDidClick(sender:)))
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
- return UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(activityDidClick(sender:)))
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
- return UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneDidClick(sender:)))
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
- self.navigationController?.toolbar.isHidden = false
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
- self.navigationController?.toolbar.isHidden = false
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
- if toolbarItemTypes.count > 0 {
648
- for index in 0..<toolbarItemTypes.count - 1 {
649
- toolbarItemTypes.insert(.flexibleSpace, at: 2 * index + 1)
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
- let gen = toolbarItemTypes.map {
654
- barButtonItemType -> UIBarButtonItem in
655
- if let barButtonItem = barButtonItem(barButtonItemType) {
656
- return barButtonItem
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
- return UIBarButtonItem()
1028
+ } else {
1029
+ setToolbarItems([], animated: false)
659
1030
  }
660
- setToolbarItems(gen, animated: true)
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 let tintColor = tintColor {
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
- webView?.goBack()
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
- let showDisclaimer: Bool = self.shareDisclaimer != nil
815
- if showDisclaimer {
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: self.shareDisclaimer?["title"] as? String ?? "Title",
818
- message: self.shareDisclaimer?["message"] as? String ?? "Message",
1210
+ title: disclaimer["title"] as? String ?? "Title",
1211
+ message: disclaimer["message"] as? String ?? "Message",
819
1212
  preferredStyle: UIAlertController.Style.alert)
820
- alert.addAction(UIAlertAction(title: self.shareDisclaimer?["confirmBtn"] as? String ?? "Confirm", style: UIAlertAction.Style.default, handler: { _ in
821
- self.shareDisclaimer = nil
822
- self.capBrowserPlugin?.notifyListeners("confirmBtnClicked", data: nil)
823
- let activityViewController = UIActivityViewController(activityItems: items, applicationActivities: nil)
824
- activityViewController.setValue(self.shareSubject ?? self.title, forKey: "subject")
825
- activityViewController.popoverPresentationController?.barButtonItem = (sender as! UIBarButtonItem)
826
- self.present(activityViewController, animated: true, completion: nil)
827
- }))
828
- alert.addAction(UIAlertAction(title: self.shareDisclaimer?["cancelBtn"] as? String ?? "Cancel", style: UIAlertAction.Style.default, handler: nil))
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
- let activityViewController = UIActivityViewController(activityItems: items, applicationActivities: nil)
832
- activityViewController.setValue(self.shareSubject ?? self.title, forKey: "subject")
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