@capgo/inappbrowser 7.3.0 → 7.4.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 (29) hide show
  1. package/README.md +47 -41
  2. package/android/src/main/java/ee/forgr/capacitor_inappbrowser/InAppBrowserPlugin.java +149 -41
  3. package/android/src/main/java/ee/forgr/capacitor_inappbrowser/Options.java +65 -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 +660 -102
  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/tool_bar.xml +19 -7
  9. package/android/src/main/res/values/strings.xml +2 -0
  10. package/dist/docs.json +169 -35
  11. package/dist/esm/definitions.d.ts +222 -29
  12. package/dist/esm/definitions.js +12 -1
  13. package/dist/esm/definitions.js.map +1 -1
  14. package/dist/plugin.cjs.js +12 -1
  15. package/dist/plugin.cjs.js.map +1 -1
  16. package/dist/plugin.js +12 -1
  17. package/dist/plugin.js.map +1 -1
  18. package/ios/Plugin/InAppBrowserPlugin.swift +339 -44
  19. package/ios/Plugin/WKWebViewController.swift +478 -45
  20. package/package.json +1 -1
  21. package/ios/Plugin/Assets.xcassets/Back.imageset/Back.png +0 -0
  22. package/ios/Plugin/Assets.xcassets/Back.imageset/Back@2x.png +0 -0
  23. package/ios/Plugin/Assets.xcassets/Back.imageset/Back@3x.png +0 -0
  24. package/ios/Plugin/Assets.xcassets/Back.imageset/Contents.json +0 -26
  25. package/ios/Plugin/Assets.xcassets/Contents.json +0 -6
  26. package/ios/Plugin/Assets.xcassets/Forward.imageset/Contents.json +0 -26
  27. package/ios/Plugin/Assets.xcassets/Forward.imageset/Forward.png +0 -0
  28. package/ios/Plugin/Assets.xcassets/Forward.imageset/Forward@2x.png +0 -0
  29. 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 = {
@@ -239,6 +343,98 @@ open class WKWebViewController: UIViewController, WKScriptMessageHandler {
239
343
  if self.webView == nil {
240
344
  self.initWebview()
241
345
  }
346
+
347
+ // Force all buttons to use tint color
348
+ updateButtonTintColors()
349
+
350
+ // Extra call to ensure buttonNearDone is visible
351
+ if buttonNearDoneIcon != nil {
352
+ // Delay slightly to ensure navigation items are set up
353
+ DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { [weak self] in
354
+ self?.updateButtonTintColors()
355
+
356
+ // Force update UI if needed
357
+ self?.navigationController?.navigationBar.setNeedsLayout()
358
+ }
359
+ }
360
+ }
361
+
362
+ func updateButtonTintColors() {
363
+ // Ensure all button items use the navigation bar's tint color
364
+ if let tintColor = navigationController?.navigationBar.tintColor {
365
+ backBarButtonItem.tintColor = tintColor
366
+ forwardBarButtonItem.tintColor = tintColor
367
+ reloadBarButtonItem.tintColor = tintColor
368
+ stopBarButtonItem.tintColor = tintColor
369
+ activityBarButtonItem.tintColor = tintColor
370
+ doneBarButtonItem.tintColor = tintColor
371
+ flexibleSpaceBarButtonItem.tintColor = tintColor
372
+
373
+ // Update toolbar items
374
+ if let items = toolbarItems {
375
+ for item in items {
376
+ item.tintColor = tintColor
377
+ }
378
+ }
379
+
380
+ // Update navigation items
381
+ if let leftItems = navigationItem.leftBarButtonItems {
382
+ for item in leftItems {
383
+ item.tintColor = tintColor
384
+ }
385
+ }
386
+
387
+ if let rightItems = navigationItem.rightBarButtonItems {
388
+ for item in rightItems {
389
+ item.tintColor = tintColor
390
+ }
391
+ }
392
+
393
+ // Create buttonNearDone button with the correct tint color if it doesn't already exist
394
+ if buttonNearDoneIcon != nil &&
395
+ navigationItem.rightBarButtonItems?.count == 1 &&
396
+ navigationItem.rightBarButtonItems?.first == doneBarButtonItem {
397
+
398
+ // Create a properly tinted button
399
+ let buttonItem = UIBarButtonItem(image: buttonNearDoneIcon?.withRenderingMode(.alwaysTemplate),
400
+ style: .plain,
401
+ target: self,
402
+ action: #selector(buttonNearDoneDidClick))
403
+ buttonItem.tintColor = tintColor
404
+
405
+ // Add it to right items
406
+ navigationItem.rightBarButtonItems?.append(buttonItem)
407
+ }
408
+ }
409
+ }
410
+
411
+ override open func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
412
+ super.traitCollectionDidChange(previousTraitCollection)
413
+
414
+ // Update colors when appearance changes
415
+ if traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
416
+ // Update tint colors
417
+ let isDarkMode = traitCollection.userInterfaceStyle == .dark
418
+ let textColor = isDarkMode ? UIColor.white : UIColor.black
419
+
420
+ if let navBar = navigationController?.navigationBar {
421
+ if navBar.backgroundColor == UIColor.black || navBar.backgroundColor == UIColor.white {
422
+ navBar.backgroundColor = isDarkMode ? UIColor.black : UIColor.white
423
+ navBar.tintColor = textColor
424
+ navBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: textColor]
425
+
426
+ // Update all buttons
427
+ updateButtonTintColors()
428
+ }
429
+ }
430
+
431
+ if let toolbar = navigationController?.toolbar {
432
+ if toolbar.backgroundColor == UIColor.black || toolbar.backgroundColor == UIColor.white {
433
+ toolbar.backgroundColor = isDarkMode ? UIColor.black : UIColor.white
434
+ toolbar.tintColor = textColor
435
+ }
436
+ }
437
+ }
242
438
  }
243
439
 
244
440
  open func setCredentials(credentials: WKWebViewCredentials?) {
@@ -376,7 +572,9 @@ open class WKWebViewController: UIViewController, WKScriptMessageHandler {
376
572
  open func setupViewElements() {
377
573
  self.setUpProgressView()
378
574
  self.setUpConstraints()
575
+ self.setUpNavigationBarAppearance()
379
576
  self.addBarButtonItems()
577
+ self.updateBarButtonItems()
380
578
  }
381
579
 
382
580
  @objc func restateViewHeight() {
@@ -388,7 +586,7 @@ open class WKWebViewController: UIViewController, WKScriptMessageHandler {
388
586
  topPadding = window?.safeAreaInsets.top ?? 0.0
389
587
  }
390
588
  if UIDevice.current.orientation.isPortrait {
391
- self.navigationController?.toolbar.isHidden = false
589
+ // Don't force toolbar visibility
392
590
  if self.viewHeightPortrait == nil {
393
591
  self.viewHeightPortrait = self.view.safeAreaLayoutGuide.layoutFrame.size.height
394
592
  if toolbarItemTypes.count == 0 {
@@ -400,7 +598,7 @@ open class WKWebViewController: UIViewController, WKScriptMessageHandler {
400
598
  }
401
599
  self.currentViewHeight = self.viewHeightPortrait
402
600
  } else if UIDevice.current.orientation.isLandscape {
403
- self.navigationController?.toolbar.isHidden = false
601
+ // Don't force toolbar visibility
404
602
  if self.viewHeightLandscape == nil {
405
603
  self.viewHeightLandscape = self.view.safeAreaLayoutGuide.layoutFrame.size.height
406
604
  if toolbarItemTypes.count == 0 {
@@ -432,6 +630,69 @@ open class WKWebViewController: UIViewController, WKScriptMessageHandler {
432
630
  setUpState()
433
631
  self.viewWasPresented = true
434
632
  }
633
+
634
+ // Force update button appearances
635
+ updateButtonTintColors()
636
+
637
+ // Ensure status bar appearance is correct when view appears
638
+ // Make sure we have the latest tint color
639
+ if let tintColor = self.tintColor {
640
+ // Update the status bar background if needed
641
+ if let navController = navigationController, let backgroundColor = navController.navigationBar.backgroundColor ?? statusBarBackgroundView?.backgroundColor {
642
+ setupStatusBarBackground(color: backgroundColor)
643
+ } else {
644
+ setupStatusBarBackground(color: UIColor.white)
645
+ }
646
+ }
647
+
648
+ // Update status bar style
649
+ updateStatusBarStyle()
650
+
651
+ // Special handling for blank toolbar mode
652
+ if blankNavigationTab && statusBarBackgroundView != nil {
653
+ if let color = statusBarBackgroundView?.backgroundColor {
654
+ // Set view color to match status bar
655
+ view.backgroundColor = color
656
+ }
657
+ }
658
+ }
659
+
660
+ override open func viewDidAppear(_ animated: Bool) {
661
+ super.viewDidAppear(animated)
662
+
663
+ // Force add buttonNearDone if it's not visible yet
664
+ if buttonNearDoneIcon != nil {
665
+ // Check if button already exists in the navigation bar
666
+ let buttonExists = navigationItem.rightBarButtonItems?.contains { item in
667
+ return item.action == #selector(buttonNearDoneDidClick)
668
+ } ?? false
669
+
670
+ if !buttonExists {
671
+ // Create and add the button directly
672
+ let buttonItem = UIBarButtonItem(
673
+ image: buttonNearDoneIcon?.withRenderingMode(.alwaysTemplate),
674
+ style: .plain,
675
+ target: self,
676
+ action: #selector(buttonNearDoneDidClick)
677
+ )
678
+
679
+ // Apply tint color
680
+ if let tintColor = self.tintColor ?? self.navigationController?.navigationBar.tintColor {
681
+ buttonItem.tintColor = tintColor
682
+ }
683
+
684
+ // Add to right items
685
+ if navigationItem.rightBarButtonItems == nil {
686
+ navigationItem.rightBarButtonItems = [buttonItem]
687
+ } else {
688
+ var items = navigationItem.rightBarButtonItems ?? []
689
+ items.append(buttonItem)
690
+ navigationItem.rightBarButtonItems = items
691
+ }
692
+
693
+ print("[DEBUG] Force added buttonNearDone in viewDidAppear")
694
+ }
695
+ }
435
696
  }
436
697
 
437
698
  override open func viewWillDisappear(_ animated: Bool) {
@@ -595,7 +856,6 @@ fileprivate extension WKWebViewController {
595
856
  }
596
857
  }
597
858
 
598
- // if presentingViewController != nil {
599
859
  switch doneBarButtonItemPosition {
600
860
  case .left:
601
861
  if !leftNavigationBarItemTypes.contains(where: { type in
@@ -622,7 +882,6 @@ fileprivate extension WKWebViewController {
622
882
  case .none:
623
883
  break
624
884
  }
625
- // }
626
885
 
627
886
  navigationItem.leftBarButtonItems = leftNavigationBarItemTypes.map {
628
887
  barButtonItemType in
@@ -639,28 +898,128 @@ fileprivate extension WKWebViewController {
639
898
  }
640
899
  return UIBarButtonItem()
641
900
  }
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
901
 
647
- if toolbarItemTypes.count > 0 {
648
- for index in 0..<toolbarItemTypes.count - 1 {
649
- toolbarItemTypes.insert(.flexibleSpace, at: 2 * index + 1)
902
+ // If we have buttonNearDoneIcon and the first (or only) right button is the done button
903
+ if buttonNearDoneIcon != nil &&
904
+ ((rightBarButtons.count == 1 && rightBarButtons[0] == doneBarButtonItem) ||
905
+ (rightBarButtons.isEmpty && doneBarButtonItemPosition == .right) ||
906
+ rightBarButtons.contains(doneBarButtonItem)) {
907
+
908
+ // Check if button already exists to avoid duplicates
909
+ let buttonExists = rightBarButtons.contains { item in
910
+ let selector = #selector(buttonNearDoneDidClick)
911
+ return item.action == selector
912
+ }
913
+
914
+ if !buttonExists {
915
+ // Create button with proper tint and template rendering mode
916
+ let buttonItem = UIBarButtonItem(
917
+ image: buttonNearDoneIcon?.withRenderingMode(.alwaysTemplate),
918
+ style: .plain,
919
+ target: self,
920
+ action: #selector(buttonNearDoneDidClick)
921
+ )
922
+
923
+ // Apply tint from navigation bar or from tintColor property
924
+ if let tintColor = self.tintColor ?? self.navigationController?.navigationBar.tintColor {
925
+ buttonItem.tintColor = tintColor
926
+ }
927
+
928
+ // Make sure the done button is there before adding this one
929
+ if rightBarButtons.isEmpty && doneBarButtonItemPosition == .right {
930
+ rightBarButtons.append(doneBarButtonItem)
931
+ }
932
+
933
+ // Add the button
934
+ rightBarButtons.append(buttonItem)
935
+
936
+ print("[DEBUG] Added buttonNearDone to right bar buttons, icon: \(String(describing: buttonNearDoneIcon))")
937
+ } else {
938
+ print("[DEBUG] buttonNearDone already exists in right bar buttons")
650
939
  }
651
940
  }
652
941
 
653
- let gen = toolbarItemTypes.map {
654
- barButtonItemType -> UIBarButtonItem in
655
- if let barButtonItem = barButtonItem(barButtonItemType) {
656
- return barButtonItem
942
+ navigationItem.rightBarButtonItems = rightBarButtons
943
+
944
+ // Create toolbar items
945
+ if !toolbarItemTypes.isEmpty {
946
+ // Check if toolbar has back and forward buttons
947
+ let hasBackButton = toolbarItemTypes.contains(where: {
948
+ if case .back = $0 { return true }
949
+ return false
950
+ })
951
+
952
+ let hasForwardButton = toolbarItemTypes.contains(where: {
953
+ if case .forward = $0 { return true }
954
+ return false
955
+ })
956
+
957
+ let hasReloadButton = toolbarItemTypes.contains(where: {
958
+ if case .reload = $0 { return true }
959
+ return false
960
+ })
961
+
962
+ if hasBackButton && hasForwardButton {
963
+ // Create Android-like toolbar with evenly spaced buttons
964
+ var items: [UIBarButtonItem] = []
965
+ let flexSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
966
+
967
+ // Add spacing before back button
968
+ items.append(flexSpace)
969
+
970
+ // Add back button
971
+ items.append(backBarButtonItem)
972
+
973
+ // Add spacing between buttons
974
+ items.append(flexSpace)
975
+
976
+ // Add forward button
977
+ items.append(forwardBarButtonItem)
978
+
979
+ // Add spacing between buttons
980
+ items.append(flexSpace)
981
+
982
+ // Add reload button if present
983
+ if hasReloadButton {
984
+ items.append(reloadBarButtonItem)
985
+ items.append(flexSpace)
986
+ }
987
+
988
+ setToolbarItems(items, animated: true)
989
+ } else {
990
+ // For other toolbar types, map the items directly
991
+ let items = toolbarItemTypes.map { type -> UIBarButtonItem in
992
+ switch type {
993
+ case .back:
994
+ return backBarButtonItem
995
+ case .forward:
996
+ return forwardBarButtonItem
997
+ case .reload:
998
+ return reloadBarButtonItem
999
+ case .stop:
1000
+ return stopBarButtonItem
1001
+ case .activity:
1002
+ return activityBarButtonItem
1003
+ case .done:
1004
+ return doneBarButtonItem
1005
+ case .flexibleSpace:
1006
+ return flexibleSpaceBarButtonItem
1007
+ case .custom:
1008
+ return UIBarButtonItem()
1009
+ }
1010
+ }
1011
+ setToolbarItems(items, animated: true)
657
1012
  }
658
- return UIBarButtonItem()
1013
+ } else {
1014
+ setToolbarItems([], animated: false)
659
1015
  }
660
- setToolbarItems(gen, animated: true)
1016
+
1017
+ // After all buttons are set up, apply tint color
1018
+ updateButtonTintColors()
661
1019
  }
662
1020
 
663
1021
  func updateBarButtonItems() {
1022
+ // Update navigation buttons (completely separate from close button)
664
1023
  backBarButtonItem.isEnabled = webView?.canGoBack ?? false
665
1024
  forwardBarButtonItem.isEnabled = webView?.canGoForward ?? false
666
1025
 
@@ -696,9 +1055,21 @@ fileprivate extension WKWebViewController {
696
1055
 
697
1056
  func setUpState() {
698
1057
  navigationController?.setNavigationBarHidden(false, animated: true)
699
- navigationController?.setToolbarHidden(toolbarItemTypes.count == 0, animated: true)
700
1058
 
701
- if let tintColor = tintColor {
1059
+ // Only show toolbar if there are toolbar items
1060
+ let hideToolbar = toolbarItemTypes.isEmpty
1061
+ navigationController?.setToolbarHidden(hideToolbar, animated: true)
1062
+
1063
+ // Set tint colors but don't override specific colors
1064
+ if tintColor == nil {
1065
+ // Use system appearance if no specific tint color is set
1066
+ let isDarkMode = traitCollection.userInterfaceStyle == .dark
1067
+ let textColor = isDarkMode ? UIColor.white : UIColor.black
1068
+
1069
+ navigationController?.navigationBar.tintColor = textColor
1070
+ navigationController?.toolbar.tintColor = textColor
1071
+ progressView?.progressTintColor = textColor
1072
+ } else {
702
1073
  progressView?.progressTintColor = tintColor
703
1074
  navigationController?.navigationBar.tintColor = tintColor
704
1075
  navigationController?.toolbar.tintColor = tintColor
@@ -769,7 +1140,10 @@ fileprivate extension WKWebViewController {
769
1140
  }
770
1141
 
771
1142
  @objc func backDidClick(sender: AnyObject) {
772
- webView?.goBack()
1143
+ // Only handle back navigation, not closing
1144
+ if webView?.canGoBack ?? false {
1145
+ webView?.goBack()
1146
+ }
773
1147
  }
774
1148
 
775
1149
  @objc func forwardDidClick(sender: AnyObject) {
@@ -794,7 +1168,10 @@ fileprivate extension WKWebViewController {
794
1168
  }
795
1169
 
796
1170
  @objc func activityDidClick(sender: AnyObject) {
1171
+ print("[DEBUG] Activity button clicked, shareSubject: \(self.shareSubject ?? "nil")")
1172
+
797
1173
  guard let s = self.source else {
1174
+ print("[DEBUG] Activity button: No source available")
798
1175
  return
799
1176
  }
800
1177
 
@@ -811,30 +1188,50 @@ fileprivate extension WKWebViewController {
811
1188
  }
812
1189
 
813
1190
  func showDisclaimer(items: [Any], sender: AnyObject) {
814
- let showDisclaimer: Bool = self.shareDisclaimer != nil
815
- if showDisclaimer {
1191
+ // Show disclaimer dialog before sharing if shareDisclaimer is set
1192
+ if let disclaimer = self.shareDisclaimer, !disclaimer.isEmpty {
1193
+ // Create and show the alert
816
1194
  let alert = UIAlertController(
817
- title: self.shareDisclaimer?["title"] as? String ?? "Title",
818
- message: self.shareDisclaimer?["message"] as? String ?? "Message",
1195
+ title: disclaimer["title"] as? String ?? "Title",
1196
+ message: disclaimer["message"] as? String ?? "Message",
819
1197
  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))
1198
+
1199
+ // Add confirm button that continues with sharing
1200
+ alert.addAction(UIAlertAction(
1201
+ title: disclaimer["confirmBtn"] as? String ?? "Confirm",
1202
+ style: UIAlertAction.Style.default,
1203
+ handler: { _ in
1204
+ // Notify that confirm was clicked
1205
+ self.capBrowserPlugin?.notifyListeners("confirmBtnClicked", data: nil)
1206
+
1207
+ // Show the share dialog
1208
+ self.showShareSheet(items: items, sender: sender)
1209
+ }
1210
+ ))
1211
+
1212
+ // Add cancel button
1213
+ alert.addAction(UIAlertAction(
1214
+ title: disclaimer["cancelBtn"] as? String ?? "Cancel",
1215
+ style: UIAlertAction.Style.cancel,
1216
+ handler: nil
1217
+ ))
1218
+
1219
+ // Present the alert
829
1220
  self.present(alert, animated: true, completion: nil)
830
1221
  } 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)
1222
+ // No disclaimer, directly show share sheet
1223
+ showShareSheet(items: items, sender: sender)
835
1224
  }
836
1225
  }
837
1226
 
1227
+ // Separated the actual sharing functionality
1228
+ private func showShareSheet(items: [Any], sender: AnyObject) {
1229
+ let activityViewController = UIActivityViewController(activityItems: items, applicationActivities: nil)
1230
+ activityViewController.setValue(self.shareSubject ?? self.title, forKey: "subject")
1231
+ activityViewController.popoverPresentationController?.barButtonItem = (sender as! UIBarButtonItem)
1232
+ self.present(activityViewController, animated: true, completion: nil)
1233
+ }
1234
+
838
1235
  func closeView () {
839
1236
  var canDismiss = true
840
1237
  if let url = self.source?.url {
@@ -880,6 +1277,42 @@ fileprivate extension WKWebViewController {
880
1277
  }
881
1278
 
882
1279
  func canRotate() {}
1280
+
1281
+ func close() {
1282
+ let currentUrl = webView?.url?.absoluteString ?? ""
1283
+ dismiss(animated: true, completion: nil)
1284
+ capBrowserPlugin?.notifyListeners("closeEvent", data: ["url": currentUrl])
1285
+ }
1286
+
1287
+ open func setUpNavigationBarAppearance() {
1288
+ // Set up basic bar appearance
1289
+ if let navBar = navigationController?.navigationBar {
1290
+ // Make navigation bar transparent
1291
+ navBar.setBackgroundImage(UIImage(), for: .default)
1292
+ navBar.shadowImage = UIImage()
1293
+ navBar.isTranslucent = true
1294
+
1295
+ // Ensure tint colors are applied properly
1296
+ if navBar.tintColor == nil {
1297
+ navBar.tintColor = tintColor ?? .black
1298
+ }
1299
+
1300
+ // Ensure text colors are set
1301
+ if navBar.titleTextAttributes == nil {
1302
+ navBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: tintColor ?? .black]
1303
+ }
1304
+
1305
+ // Ensure the navigation bar buttons are properly visible
1306
+ for item in navBar.items ?? [] {
1307
+ for barButton in (item.leftBarButtonItems ?? []) + (item.rightBarButtonItems ?? []) {
1308
+ barButton.tintColor = tintColor ?? navBar.tintColor ?? .black
1309
+ }
1310
+ }
1311
+ }
1312
+
1313
+ // Force button colors to update
1314
+ updateButtonTintColors()
1315
+ }
883
1316
  }
884
1317
 
885
1318
  // MARK: - WKUIDelegate
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@capgo/inappbrowser",
3
- "version": "7.3.0",
3
+ "version": "7.4.0",
4
4
  "description": "Capacitor plugin in app browser",
5
5
  "main": "dist/plugin.cjs.js",
6
6
  "module": "dist/esm/index.js",