Merge branch 'master' into master

This commit is contained in:
Lorenzo Pichilli 2022-10-13 17:32:00 +02:00 committed by GitHub
commit 3c66f19d3f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
44 changed files with 1153 additions and 365 deletions

538
.all-contributorsrc Normal file
View File

@ -0,0 +1,538 @@
{
"projectName": "flutter_inappwebview",
"projectOwner": "pichillilorenzo",
"repoType": "github",
"repoHost": "https://github.com",
"files": [
"README.md"
],
"imageSize": 100,
"commit": true,
"commitConvention": "none",
"contributors": [
{
"login": "AlexV525",
"name": "Alex Li",
"avatar_url": "https://avatars.githubusercontent.com/u/15884415?v=4",
"profile": "https://blog.alexv525.com/",
"contributions": [
"code"
]
},
{
"login": "crazecoder",
"name": "1/2",
"avatar_url": "https://avatars.githubusercontent.com/u/18387906?v=4",
"profile": "https://github.com/crazecoder",
"contributions": [
"code"
]
},
{
"login": "cbodin",
"name": "Christofer Bodin",
"avatar_url": "https://avatars.githubusercontent.com/u/220255?v=4",
"profile": "https://github.com/cbodin",
"contributions": [
"code"
]
},
{
"login": "matthewlloyd",
"name": "Matthew Lloyd",
"avatar_url": "https://avatars.githubusercontent.com/u/2041996?v=4",
"profile": "https://github.com/matthewlloyd",
"contributions": [
"code"
]
},
{
"login": "carloserazo47",
"name": "C E",
"avatar_url": "https://avatars.githubusercontent.com/u/83635384?v=4",
"profile": "https://github.com/carloserazo47",
"contributions": [
"code"
]
},
{
"login": "robsonmeemo",
"name": "Robson Araujo",
"avatar_url": "https://avatars.githubusercontent.com/u/47990393?v=4",
"profile": "https://github.com/robsonmeemo",
"contributions": [
"code"
]
},
{
"login": "ryanhz",
"name": "Ryan",
"avatar_url": "https://avatars.githubusercontent.com/u/1142612?v=4",
"profile": "https://github.com/ryanhz",
"contributions": [
"code"
]
},
{
"login": "CodeEagle",
"name": "CodeEagle",
"avatar_url": "https://avatars.githubusercontent.com/u/2311352?v=4",
"profile": "https://codeeagle.github.io/",
"contributions": [
"code"
]
},
{
"login": "tneotia",
"name": "Tanay Neotia",
"avatar_url": "https://avatars.githubusercontent.com/u/50850142?v=4",
"profile": "https://github.com/tneotia",
"contributions": [
"code"
]
},
{
"login": "panndoraBoo",
"name": "Jamie Joost",
"avatar_url": "https://avatars.githubusercontent.com/u/8928207?v=4",
"profile": "https://github.com/panndoraBoo",
"contributions": [
"code"
]
},
{
"login": "deandreamatias",
"name": "Matias de Andrea",
"avatar_url": "https://avatars.githubusercontent.com/u/21011641?v=4",
"profile": "https://deandreamatias.com/",
"contributions": [
"code"
]
},
{
"login": "YouCii",
"name": "YouCii",
"avatar_url": "https://avatars.githubusercontent.com/u/17899073?v=4",
"profile": "https://blog.csdn.net/j550341130",
"contributions": [
"code"
]
},
{
"login": "cutzmf",
"name": "Salnikov Sergey",
"avatar_url": "https://avatars.githubusercontent.com/u/1662033?v=4",
"profile": "https://github.com/cutzmf",
"contributions": [
"code"
]
},
{
"login": "a00012025",
"name": "Po-Jui Chen",
"avatar_url": "https://avatars.githubusercontent.com/u/12824216?v=4",
"profile": "https://github.com/a00012025",
"contributions": [
"code"
]
},
{
"login": "Manuito83",
"name": "Manuito",
"avatar_url": "https://avatars.githubusercontent.com/u/4816367?v=4",
"profile": "https://github.com/Manuito83",
"contributions": [
"code"
]
},
{
"login": "setcy",
"name": "setcy",
"avatar_url": "https://avatars.githubusercontent.com/u/86180691?v=4",
"profile": "https://github.com/setcy",
"contributions": [
"code"
]
},
{
"login": "EArminjon2",
"name": "EArminjon",
"avatar_url": "https://avatars.githubusercontent.com/u/92172436?v=4",
"profile": "https://github.com/EArminjon2",
"contributions": [
"code"
]
},
{
"login": "ashank96",
"name": "Ashank Bharati",
"avatar_url": "https://avatars.githubusercontent.com/u/22197948?v=4",
"profile": "https://www.linkedin.com/in/ashank-bharati-497989127/",
"contributions": [
"code"
]
},
{
"login": "chownation",
"name": "Michael Chow",
"avatar_url": "https://avatars.githubusercontent.com/u/1755207?v=4",
"profile": "https://dart.art/",
"contributions": [
"code"
]
},
{
"login": "RodXander",
"name": "Osvaldo Saez",
"avatar_url": "https://avatars.githubusercontent.com/u/23609784?v=4",
"profile": "https://github.com/RodXander",
"contributions": [
"code"
]
},
{
"login": "rsydor",
"name": "rsydor",
"avatar_url": "https://avatars.githubusercontent.com/u/79581663?v=4",
"profile": "https://github.com/rsydor",
"contributions": [
"code"
]
},
{
"login": "hoanglm4",
"name": "Le Minh Hoang",
"avatar_url": "https://avatars.githubusercontent.com/u/7067757?v=4",
"profile": "https://github.com/hoanglm4",
"contributions": [
"code"
]
},
{
"login": "Miiha",
"name": "Michael Kao",
"avatar_url": "https://avatars.githubusercontent.com/u/3897167?v=4",
"profile": "https://github.com/Miiha",
"contributions": [
"code"
]
},
{
"login": "cloudygeek",
"name": "cloudygeek",
"avatar_url": "https://avatars.githubusercontent.com/u/6059542?v=4",
"profile": "https://github.com/cloudygeek",
"contributions": [
"code"
]
},
{
"login": "chreck",
"name": "Christoph Eck",
"avatar_url": "https://avatars.githubusercontent.com/u/8030398?v=4",
"profile": "https://github.com/chreck",
"contributions": [
"code"
]
},
{
"login": "Ser1ous",
"name": "Ser1ous",
"avatar_url": "https://avatars.githubusercontent.com/u/4497968?v=4",
"profile": "https://github.com/Ser1ous",
"contributions": [
"code"
]
},
{
"login": "ItsCalebJones",
"name": "Caleb Jones",
"avatar_url": "https://avatars.githubusercontent.com/u/4519230?v=4",
"profile": "https://spacelaunchnow.me/",
"contributions": [
"code"
]
},
{
"login": "savy-91",
"name": "Saverio Murgia",
"avatar_url": "https://avatars.githubusercontent.com/u/6215122?v=4",
"profile": "https://sungazer.io/",
"contributions": [
"code"
]
},
{
"login": "tranductam2802",
"name": "Trần Đức Tâm",
"avatar_url": "https://avatars.githubusercontent.com/u/4957579?v=4",
"profile": "https://github.com/tranductam2802",
"contributions": [
"code"
]
},
{
"login": "pcqpcq",
"name": "Joker",
"avatar_url": "https://avatars.githubusercontent.com/u/1411571?v=4",
"profile": "https://pcqpcq.me/",
"contributions": [
"code"
]
},
{
"login": "ycv005",
"name": "Yash Chandra Verma",
"avatar_url": "https://avatars.githubusercontent.com/u/26734819?v=4",
"profile": "https://www.linkedin.com/in/ycv005/",
"contributions": [
"code"
]
},
{
"login": "arneke",
"name": "Arne Kepp",
"avatar_url": "https://avatars.githubusercontent.com/u/425235?v=4",
"profile": "https://github.com/arneke",
"contributions": [
"code"
]
},
{
"login": "omralcrt",
"name": "Ömral Cörüt",
"avatar_url": "https://avatars.githubusercontent.com/u/12418327?v=4",
"profile": "https://omralcrt.github.io/",
"contributions": [
"code"
]
},
{
"login": "albatrosify",
"name": "LrdHelmchen",
"avatar_url": "https://avatars.githubusercontent.com/u/64252708?v=4",
"profile": "https://github.com/albatrosify",
"contributions": [
"code"
]
},
{
"login": "gunantosteven",
"name": "Steven Gunanto",
"avatar_url": "https://avatars.githubusercontent.com/u/8141036?v=4",
"profile": "https://ungapps.com/",
"contributions": [
"code"
]
},
{
"login": "DRSchlaubi",
"name": "Michael Rittmeister",
"avatar_url": "https://avatars.githubusercontent.com/u/16060205?v=4",
"profile": "https://schlau.bi/",
"contributions": [
"code"
]
},
{
"login": "AAkira",
"name": "Akira Aratani",
"avatar_url": "https://avatars.githubusercontent.com/u/3386962?v=4",
"profile": "https://aakira.app/",
"contributions": [
"code"
]
},
{
"login": "Doflatango",
"name": "Doflatango",
"avatar_url": "https://avatars.githubusercontent.com/u/3091033?v=4",
"profile": "https://github.com/Doflatango",
"contributions": [
"code"
]
},
{
"login": "Eddayy",
"name": "Edmund Tay",
"avatar_url": "https://avatars.githubusercontent.com/u/17043852?v=4",
"profile": "https://github.com/Eddayy",
"contributions": [
"code"
]
},
{
"login": "andreidiaconu",
"name": "Andrei Diaconu",
"avatar_url": "https://avatars.githubusercontent.com/u/1402046?v=4",
"profile": "https://andreidiaconu.com/",
"contributions": [
"code"
]
},
{
"login": "plateaukao",
"name": "Daniel Kao",
"avatar_url": "https://avatars.githubusercontent.com/u/4084738?v=4",
"profile": "https://github.com/plateaukao",
"contributions": [
"code"
]
},
{
"login": "xtyxtyx",
"name": "xuty",
"avatar_url": "https://avatars.githubusercontent.com/u/15033141?v=4",
"profile": "https://github.com/xtyxtyx",
"contributions": [
"code"
]
},
{
"login": "wwwdata",
"name": "Ben Bieker",
"avatar_url": "https://avatars.githubusercontent.com/u/818880?v=4",
"profile": "https://bieker.ninja/",
"contributions": [
"code"
]
},
{
"login": "phamnhuvu-dev",
"name": "Phạm Như Vũ",
"avatar_url": "https://avatars.githubusercontent.com/u/22906656?v=4",
"profile": "https://github.com/phamnhuvu-dev",
"contributions": [
"code"
]
},
{
"login": "SebastienBtr",
"name": "SebastienBtr",
"avatar_url": "https://avatars.githubusercontent.com/u/18089010?v=4",
"profile": "https://github.com/SebastienBtr",
"contributions": [
"code"
]
},
{
"login": "fattiger00",
"name": "NeZha",
"avatar_url": "https://avatars.githubusercontent.com/u/38494401?v=4",
"profile": "https://github.com/fattiger00",
"contributions": [
"code"
]
},
{
"login": "klydra",
"name": "Jan Klinge",
"avatar_url": "https://avatars.githubusercontent.com/u/40038209?v=4",
"profile": "https://github.com/klydra",
"contributions": [
"code"
]
},
{
"login": "PauloDurrerMelo",
"name": "PauloDurrerMelo",
"avatar_url": "https://avatars.githubusercontent.com/u/29310557?v=4",
"profile": "https://github.com/PauloDurrerMelo",
"contributions": [
"code"
]
},
{
"login": "benmeemo",
"name": "benmeemo",
"avatar_url": "https://avatars.githubusercontent.com/u/47991706?v=4",
"profile": "https://github.com/benmeemo",
"contributions": [
"code"
]
},
{
"login": "cinos1",
"name": "cinos",
"avatar_url": "https://avatars.githubusercontent.com/u/19343437?v=4",
"profile": "https://github.com/cinos1",
"contributions": [
"code"
]
},
{
"login": "juicycleff",
"name": "Rex Raphael",
"avatar_url": "https://avatars.githubusercontent.com/u/11243590?v=4",
"profile": "https://xraph.com/",
"contributions": [
"code"
]
},
{
"login": "Sense545",
"name": "Jan Henrik Høiland",
"avatar_url": "https://avatars.githubusercontent.com/u/769406?v=4",
"profile": "https://github.com/Sense545",
"contributions": [
"code"
]
},
{
"login": "igtm",
"name": "Iguchi Tomokatsu",
"avatar_url": "https://avatars.githubusercontent.com/u/6331737?v=4",
"profile": "https://github.com/igtm",
"contributions": [
"code"
]
},
{
"login": "ueman",
"name": "Jonas Uekötter",
"avatar_url": "https://avatars.githubusercontent.com/u/1270149?v=4",
"profile": "https://uekoetter.dev/",
"contributions": [
"doc"
]
},
{
"login": "emakar",
"name": "emakar",
"avatar_url": "https://avatars.githubusercontent.com/u/7767193?v=4",
"profile": "https://github.com/emakar",
"contributions": [
"code"
]
},
{
"login": "liasica",
"name": "liasica",
"avatar_url": "https://avatars.githubusercontent.com/u/671431?v=4",
"profile": "https://weibo.com/magicrolan",
"contributions": [
"code"
]
},
{
"login": "addie9000",
"name": "Eiichiro Adachi",
"avatar_url": "https://avatars.githubusercontent.com/u/2036910?v=4",
"profile": "https://github.com/addie9000",
"contributions": [
"code"
]
},
{
"login": "kamilpowalowski",
"name": "Kamil Powałowski",
"avatar_url": "https://avatars.githubusercontent.com/u/83073?v=4",
"profile": "https://github.com/kamilpowalowski",
"contributions": [
"code"
]
}
],
"contributorsPerLine": 7,
"linkToUsage": false
}

View File

@ -1,3 +1,36 @@
## 5.4.5
- Added Android direct camera capture feature
- Fixed missing `PullToRefreshController.isRefreshing` iOS implementation
- Fixed Android `PullToRefreshController.setEnabled` at runtime
- Fixed iOS `findNext`
- Fixed Android `RendererPriorityPolicy.waivedWhenNotVisible` type 'Null' is not a subtype of type 'bool'
- Fixed iOS 14.0 crash when calling `callAsyncJavaScript` method
- Merged "Android fix leaking MethodChannel through anonymous class" [#1201](https://github.com/pichillilorenzo/flutter_inappwebview/pull/1201) (thanks to [emakar](https://github.com/emakar))
- Merged "Fix RangeError: Maximum call stack size exceeded" [#1208](https://github.com/pichillilorenzo/flutter_inappwebview/pull/1208) (thanks to [liasica](https://github.com/liasica))
## 5.4.4+3
- Removed Android unsafe trust manager
## 5.4.4+2
- Fixed LICENSE
## 5.4.4+1
- Fixed README
## 5.4.4
- Added support for Android 33
- Fixed possible null pointer exception in Android `ChromeCustomTabsActivity.java`
## 5.4.3+8
- Merged "Xcode 14 build error: Stored properties cannot be marked potentially unavailable with '@available'" [#1238](https://github.com/pichillilorenzo/flutter_inappwebview/pull/1238) (thanks to [CodeEagle](https://github.com/CodeEagle))
- Fixed example for iOS
## 5.4.3+7
- Fixed possible Android java.lang.NullPointerException in "InAppBrowserActivity.onCreateOptionsMenu" about "webView.getTitle()"

13
LICENSE
View File

@ -175,7 +175,18 @@
END OF TERMS AND CONDITIONS
Copyright 2018-2020 Lorenzo Pichilli
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2022 Lorenzo Pichilli
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.

119
README.md
View File

@ -1,22 +1,28 @@
<div align="center">
# Flutter InAppWebView Plugin [![Share on Twitter](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?text=Flutter%20InAppBrowser%20plugin!&url=https://github.com/pichillilorenzo/flutter_inappwebview&hashtags=flutter,flutterio,dart,dartlang,webview) [![Share on Facebook](https://img.shields.io/badge/share-facebook-blue.svg?longCache=true&style=flat&colorB=%234267b2)](https://www.facebook.com/sharer/sharer.php?u=https%3A//github.com/pichillilorenzo/flutter_inappwebview)
[![Pub](https://img.shields.io/pub/v/flutter_inappwebview.svg)](https://pub.dartlang.org/packages/flutter_inappwebview)
[![pub points](https://badges.bar/flutter_inappwebview/pub%20points)](https://pub.dev/packages/flutter_inappwebview/score)
[![popularity](https://badges.bar/flutter_inappwebview/popularity)](https://pub.dev/packages/flutter_inappwebview/score)
[![likes](https://badges.bar/flutter_inappwebview/likes)](https://pub.dev/packages/flutter_inappwebview/score)
![InAppWebView-logo](https://user-images.githubusercontent.com/5956938/195422744-bdcfed16-73f0-4bc9-94ab-ecf10771a1c4.png)
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
[![All Contributors](https://img.shields.io/badge/all_contributors-58-orange.svg?style=flat-square)](#contributors-)
<!-- ALL-CONTRIBUTORS-BADGE:END -->
[![Pub](https://img.shields.io/pub/v/flutter_inappwebview?include_prereleases)](https://pub.dartlang.org/packages/flutter_inappwebview)
[![Pub Points](https://img.shields.io/pub/points/flutter_inappwebview)](https://pub.dev/packages/flutter_inappwebview/score)
[![Pub Popularity](https://img.shields.io/pub/popularity/flutter_inappwebview)](https://pub.dev/packages/flutter_inappwebview/score)
[![Pub Likes](https://img.shields.io/pub/likes/flutter_inappwebview)](https://pub.dev/packages/flutter_inappwebview/score)
[![Awesome Flutter](https://img.shields.io/badge/Awesome-Flutter-blue.svg?longCache=true&style=flat-square)](https://stackoverflow.com/questions/tagged/flutter-inappwebview)
[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](/LICENSE)
[![Donate to this project](https://img.shields.io/badge/support-donate-yellow.svg)](https://inappwebview.dev/donate/)
[![GitHub contributors](https://img.shields.io/github/contributors/pichillilorenzo/flutter_inappwebview)](https://github.com/pichillilorenzo/flutter_inappwebview/graphs/contributors)
[![GitHub forks](https://img.shields.io/github/forks/pichillilorenzo/flutter_inappwebview?style=social)](https://github.com/pichillilorenzo/flutter_inappwebview)
[![GitHub stars](https://img.shields.io/github/stars/pichillilorenzo/flutter_inappwebview?style=social)](https://github.com/pichillilorenzo/flutter_inappwebview)
![InAppWebView-logo](https://user-images.githubusercontent.com/5956938/110180687-8751f480-7e0a-11eb-89cc-d62f85c148cb.png)
A Flutter plugin that allows you to add an inline webview, to use an headless webview, and to open an in-app browser window.
</div>
## Articles/Resources
- [Official documentation: inappwebview.dev/docs](https://inappwebview.dev/docs/)
@ -59,4 +65,99 @@ Add `flutter_inappwebview` as a [dependency in your pubspec.yaml file](https://f
## Support
Did you find this plugin useful? Please consider to [make a donation](https://inappwebview.dev/donate/) to help improve it!
Did you find this plugin useful? Please consider to [make a donation](https://inappwebview.dev/donate/) to help improve it!
## Contributors ✨
Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tbody>
<tr>
<td align="center"><a href="https://blog.alexv525.com/"><img src="https://avatars.githubusercontent.com/u/15884415?v=4?s=100" width="100px;" alt="Alex Li"/><br /><sub><b>Alex Li</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=AlexV525" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/crazecoder"><img src="https://avatars.githubusercontent.com/u/18387906?v=4?s=100" width="100px;" alt="1/2"/><br /><sub><b>1/2</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=crazecoder" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/cbodin"><img src="https://avatars.githubusercontent.com/u/220255?v=4?s=100" width="100px;" alt="Christofer Bodin"/><br /><sub><b>Christofer Bodin</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=cbodin" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/matthewlloyd"><img src="https://avatars.githubusercontent.com/u/2041996?v=4?s=100" width="100px;" alt="Matthew Lloyd"/><br /><sub><b>Matthew Lloyd</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=matthewlloyd" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/carloserazo47"><img src="https://avatars.githubusercontent.com/u/83635384?v=4?s=100" width="100px;" alt="C E"/><br /><sub><b>C E</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=carloserazo47" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/robsonmeemo"><img src="https://avatars.githubusercontent.com/u/47990393?v=4?s=100" width="100px;" alt="Robson Araujo"/><br /><sub><b>Robson Araujo</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=robsonmeemo" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/ryanhz"><img src="https://avatars.githubusercontent.com/u/1142612?v=4?s=100" width="100px;" alt="Ryan"/><br /><sub><b>Ryan</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=ryanhz" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="https://codeeagle.github.io/"><img src="https://avatars.githubusercontent.com/u/2311352?v=4?s=100" width="100px;" alt="CodeEagle"/><br /><sub><b>CodeEagle</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=CodeEagle" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/tneotia"><img src="https://avatars.githubusercontent.com/u/50850142?v=4?s=100" width="100px;" alt="Tanay Neotia"/><br /><sub><b>Tanay Neotia</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=tneotia" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/panndoraBoo"><img src="https://avatars.githubusercontent.com/u/8928207?v=4?s=100" width="100px;" alt="Jamie Joost"/><br /><sub><b>Jamie Joost</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=panndoraBoo" title="Code">💻</a></td>
<td align="center"><a href="https://deandreamatias.com/"><img src="https://avatars.githubusercontent.com/u/21011641?v=4?s=100" width="100px;" alt="Matias de Andrea"/><br /><sub><b>Matias de Andrea</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=deandreamatias" title="Code">💻</a></td>
<td align="center"><a href="https://blog.csdn.net/j550341130"><img src="https://avatars.githubusercontent.com/u/17899073?v=4?s=100" width="100px;" alt="YouCii"/><br /><sub><b>YouCii</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=YouCii" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/cutzmf"><img src="https://avatars.githubusercontent.com/u/1662033?v=4?s=100" width="100px;" alt="Salnikov Sergey"/><br /><sub><b>Salnikov Sergey</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=cutzmf" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/a00012025"><img src="https://avatars.githubusercontent.com/u/12824216?v=4?s=100" width="100px;" alt="Po-Jui Chen"/><br /><sub><b>Po-Jui Chen</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=a00012025" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/Manuito83"><img src="https://avatars.githubusercontent.com/u/4816367?v=4?s=100" width="100px;" alt="Manuito"/><br /><sub><b>Manuito</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=Manuito83" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/setcy"><img src="https://avatars.githubusercontent.com/u/86180691?v=4?s=100" width="100px;" alt="setcy"/><br /><sub><b>setcy</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=setcy" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/EArminjon2"><img src="https://avatars.githubusercontent.com/u/92172436?v=4?s=100" width="100px;" alt="EArminjon"/><br /><sub><b>EArminjon</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=EArminjon2" title="Code">💻</a></td>
<td align="center"><a href="https://www.linkedin.com/in/ashank-bharati-497989127/"><img src="https://avatars.githubusercontent.com/u/22197948?v=4?s=100" width="100px;" alt="Ashank Bharati"/><br /><sub><b>Ashank Bharati</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=ashank96" title="Code">💻</a></td>
<td align="center"><a href="https://dart.art/"><img src="https://avatars.githubusercontent.com/u/1755207?v=4?s=100" width="100px;" alt="Michael Chow"/><br /><sub><b>Michael Chow</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=chownation" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/RodXander"><img src="https://avatars.githubusercontent.com/u/23609784?v=4?s=100" width="100px;" alt="Osvaldo Saez"/><br /><sub><b>Osvaldo Saez</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=RodXander" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/rsydor"><img src="https://avatars.githubusercontent.com/u/79581663?v=4?s=100" width="100px;" alt="rsydor"/><br /><sub><b>rsydor</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=rsydor" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/hoanglm4"><img src="https://avatars.githubusercontent.com/u/7067757?v=4?s=100" width="100px;" alt="Le Minh Hoang"/><br /><sub><b>Le Minh Hoang</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=hoanglm4" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/Miiha"><img src="https://avatars.githubusercontent.com/u/3897167?v=4?s=100" width="100px;" alt="Michael Kao"/><br /><sub><b>Michael Kao</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=Miiha" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/cloudygeek"><img src="https://avatars.githubusercontent.com/u/6059542?v=4?s=100" width="100px;" alt="cloudygeek"/><br /><sub><b>cloudygeek</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=cloudygeek" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/chreck"><img src="https://avatars.githubusercontent.com/u/8030398?v=4?s=100" width="100px;" alt="Christoph Eck"/><br /><sub><b>Christoph Eck</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=chreck" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/Ser1ous"><img src="https://avatars.githubusercontent.com/u/4497968?v=4?s=100" width="100px;" alt="Ser1ous"/><br /><sub><b>Ser1ous</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=Ser1ous" title="Code">💻</a></td>
<td align="center"><a href="https://spacelaunchnow.me/"><img src="https://avatars.githubusercontent.com/u/4519230?v=4?s=100" width="100px;" alt="Caleb Jones"/><br /><sub><b>Caleb Jones</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=ItsCalebJones" title="Code">💻</a></td>
<td align="center"><a href="https://sungazer.io/"><img src="https://avatars.githubusercontent.com/u/6215122?v=4?s=100" width="100px;" alt="Saverio Murgia"/><br /><sub><b>Saverio Murgia</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=savy-91" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/tranductam2802"><img src="https://avatars.githubusercontent.com/u/4957579?v=4?s=100" width="100px;" alt="Trần Đức Tâm"/><br /><sub><b>Trần Đức Tâm</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=tranductam2802" title="Code">💻</a></td>
<td align="center"><a href="https://pcqpcq.me/"><img src="https://avatars.githubusercontent.com/u/1411571?v=4?s=100" width="100px;" alt="Joker"/><br /><sub><b>Joker</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=pcqpcq" title="Code">💻</a></td>
<td align="center"><a href="https://www.linkedin.com/in/ycv005/"><img src="https://avatars.githubusercontent.com/u/26734819?v=4?s=100" width="100px;" alt="Yash Chandra Verma"/><br /><sub><b>Yash Chandra Verma</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=ycv005" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/arneke"><img src="https://avatars.githubusercontent.com/u/425235?v=4?s=100" width="100px;" alt="Arne Kepp"/><br /><sub><b>Arne Kepp</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=arneke" title="Code">💻</a></td>
<td align="center"><a href="https://omralcrt.github.io/"><img src="https://avatars.githubusercontent.com/u/12418327?v=4?s=100" width="100px;" alt="Ömral Cörüt"/><br /><sub><b>Ömral Cörüt</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=omralcrt" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/albatrosify"><img src="https://avatars.githubusercontent.com/u/64252708?v=4?s=100" width="100px;" alt="LrdHelmchen"/><br /><sub><b>LrdHelmchen</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=albatrosify" title="Code">💻</a></td>
<td align="center"><a href="https://ungapps.com/"><img src="https://avatars.githubusercontent.com/u/8141036?v=4?s=100" width="100px;" alt="Steven Gunanto"/><br /><sub><b>Steven Gunanto</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=gunantosteven" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="https://schlau.bi/"><img src="https://avatars.githubusercontent.com/u/16060205?v=4?s=100" width="100px;" alt="Michael Rittmeister"/><br /><sub><b>Michael Rittmeister</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=DRSchlaubi" title="Code">💻</a></td>
<td align="center"><a href="https://aakira.app/"><img src="https://avatars.githubusercontent.com/u/3386962?v=4?s=100" width="100px;" alt="Akira Aratani"/><br /><sub><b>Akira Aratani</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=AAkira" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/Doflatango"><img src="https://avatars.githubusercontent.com/u/3091033?v=4?s=100" width="100px;" alt="Doflatango"/><br /><sub><b>Doflatango</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=Doflatango" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/Eddayy"><img src="https://avatars.githubusercontent.com/u/17043852?v=4?s=100" width="100px;" alt="Edmund Tay"/><br /><sub><b>Edmund Tay</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=Eddayy" title="Code">💻</a></td>
<td align="center"><a href="https://andreidiaconu.com/"><img src="https://avatars.githubusercontent.com/u/1402046?v=4?s=100" width="100px;" alt="Andrei Diaconu"/><br /><sub><b>Andrei Diaconu</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=andreidiaconu" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/plateaukao"><img src="https://avatars.githubusercontent.com/u/4084738?v=4?s=100" width="100px;" alt="Daniel Kao"/><br /><sub><b>Daniel Kao</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=plateaukao" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/xtyxtyx"><img src="https://avatars.githubusercontent.com/u/15033141?v=4?s=100" width="100px;" alt="xuty"/><br /><sub><b>xuty</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=xtyxtyx" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="https://bieker.ninja/"><img src="https://avatars.githubusercontent.com/u/818880?v=4?s=100" width="100px;" alt="Ben Bieker"/><br /><sub><b>Ben Bieker</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=wwwdata" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/phamnhuvu-dev"><img src="https://avatars.githubusercontent.com/u/22906656?v=4?s=100" width="100px;" alt="Phạm Như Vũ"/><br /><sub><b>Phạm Như Vũ</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=phamnhuvu-dev" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/SebastienBtr"><img src="https://avatars.githubusercontent.com/u/18089010?v=4?s=100" width="100px;" alt="SebastienBtr"/><br /><sub><b>SebastienBtr</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=SebastienBtr" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/fattiger00"><img src="https://avatars.githubusercontent.com/u/38494401?v=4?s=100" width="100px;" alt="NeZha"/><br /><sub><b>NeZha</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=fattiger00" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/klydra"><img src="https://avatars.githubusercontent.com/u/40038209?v=4?s=100" width="100px;" alt="Jan Klinge"/><br /><sub><b>Jan Klinge</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=klydra" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/PauloDurrerMelo"><img src="https://avatars.githubusercontent.com/u/29310557?v=4?s=100" width="100px;" alt="PauloDurrerMelo"/><br /><sub><b>PauloDurrerMelo</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=PauloDurrerMelo" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/benmeemo"><img src="https://avatars.githubusercontent.com/u/47991706?v=4?s=100" width="100px;" alt="benmeemo"/><br /><sub><b>benmeemo</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=benmeemo" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/cinos1"><img src="https://avatars.githubusercontent.com/u/19343437?v=4?s=100" width="100px;" alt="cinos"/><br /><sub><b>cinos</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=cinos1" title="Code">💻</a></td>
<td align="center"><a href="https://xraph.com/"><img src="https://avatars.githubusercontent.com/u/11243590?v=4?s=100" width="100px;" alt="Rex Raphael"/><br /><sub><b>Rex Raphael</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=juicycleff" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/Sense545"><img src="https://avatars.githubusercontent.com/u/769406?v=4?s=100" width="100px;" alt="Jan Henrik Høiland"/><br /><sub><b>Jan Henrik Høiland</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=Sense545" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/igtm"><img src="https://avatars.githubusercontent.com/u/6331737?v=4?s=100" width="100px;" alt="Iguchi Tomokatsu"/><br /><sub><b>Iguchi Tomokatsu</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=igtm" title="Code">💻</a></td>
<td align="center"><a href="https://uekoetter.dev/"><img src="https://avatars.githubusercontent.com/u/1270149?v=4?s=100" width="100px;" alt="Jonas Uekötter"/><br /><sub><b>Jonas Uekötter</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=ueman" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/emakar"><img src="https://avatars.githubusercontent.com/u/7767193?v=4?s=100" width="100px;" alt="emakar"/><br /><sub><b>emakar</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=emakar" title="Code">💻</a></td>
<td align="center"><a href="https://weibo.com/magicrolan"><img src="https://avatars.githubusercontent.com/u/671431?v=4?s=100" width="100px;" alt="liasica"/><br /><sub><b>liasica</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=liasica" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/addie9000"><img src="https://avatars.githubusercontent.com/u/2036910?v=4?s=100" width="100px;" alt="Eiichiro Adachi"/><br /><sub><b>Eiichiro Adachi</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=addie9000" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/kamilpowalowski"><img src="https://avatars.githubusercontent.com/u/83073?v=4?s=100" width="100px;" alt="Kamil Powałowski"/><br /><sub><b>Kamil Powałowski</b></sub></a><br /><a href="https://github.com/pichillilorenzo/flutter_inappwebview/commits?author=kamilpowalowski" title="Code">💻</a></td>
</tr>
</tbody>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!

View File

@ -22,7 +22,7 @@ rootProject.allprojects {
apply plugin: 'com.android.library'
android {
compileSdkVersion 31
compileSdkVersion 33
defaultConfig {
minSdkVersion 17
@ -45,9 +45,9 @@ android {
}
}
dependencies {
implementation 'androidx.webkit:webkit:1.4.0'
implementation 'androidx.webkit:webkit:1.5.0'
implementation 'androidx.browser:browser:1.4.0'
implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'androidx.appcompat:appcompat:1.5.1'
implementation 'com.squareup.okhttp3:okhttp:3.14.9'
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
}

View File

@ -168,13 +168,7 @@ public class ServiceWorkerManager implements MethodChannel.MethodCallHandler {
}
private ServiceWorkerClientCompat dummyServiceWorkerClientCompat() {
return new ServiceWorkerClientCompat() {
@Nullable
@Override
public WebResourceResponse shouldInterceptRequest(@NonNull WebResourceRequest request) {
return null;
}
};
return DummyServiceWorkerClientCompat.INSTANCE;
}
public void dispose() {
@ -185,4 +179,14 @@ public class ServiceWorkerManager implements MethodChannel.MethodCallHandler {
}
plugin = null;
}
private static final class DummyServiceWorkerClientCompat extends ServiceWorkerClientCompat {
static final ServiceWorkerClientCompat INSTANCE = new DummyServiceWorkerClientCompat();
@Nullable
@Override
public WebResourceResponse shouldInterceptRequest(@NonNull WebResourceRequest request) {
return null;
}
}
}

View File

@ -20,6 +20,8 @@ import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.FileInputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
@ -30,7 +32,6 @@ import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
@ -38,7 +39,6 @@ import java.util.Map;
import java.util.Objects;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.net.ssl.HostnameVerifier;
@ -184,50 +184,12 @@ public class Util {
}
}
public static OkHttpClient getUnsafeOkHttpClient() {
try {
// Create a trust manager that does not validate certificate chains
final TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
}
}
};
// Install the all-trusting trust manager
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
// Create an ssl socket factory with our all-trusting manager
final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.sslSocketFactory(sslSocketFactory, (X509TrustManager)trustAllCerts[0]);
builder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
OkHttpClient okHttpClient = builder
.connectTimeout(15, TimeUnit.SECONDS)
.writeTimeout(15, TimeUnit.SECONDS)
.readTimeout(15, TimeUnit.SECONDS)
.build();
return okHttpClient;
} catch (Exception e) {
throw new RuntimeException(e);
}
public static OkHttpClient getBasicOkHttpClient() {
return new OkHttpClient.Builder()
.connectTimeout(15, TimeUnit.SECONDS)
.writeTimeout(15, TimeUnit.SECONDS)
.readTimeout(15, TimeUnit.SECONDS)
.build();
}
/**
@ -328,4 +290,21 @@ public class Util {
public static Object getOrDefault(Map map, String key, Object defaultValue) {
return map.containsKey(key) ? map.get(key) : defaultValue;
}
@Nullable
public static <O> Object invokeMethodIfExists(final O o, final String methodName, Object... args) {
Method[] methods = o.getClass().getMethods();
for (Method method : methods) {
if (method.getName().equals(methodName)) {
try {
return method.invoke(o, args);
} catch (IllegalAccessException e) {
return null;
} catch (InvocationTargetException e) {
return null;
}
}
}
return null;
}
}

View File

@ -27,14 +27,16 @@ public class ActionBroadcastReceiver extends BroadcastReceiver {
String title = b.getString(KEY_URL_TITLE);
String managerId = b.getString(CHROME_MANAGER_ID);
ChromeSafariBrowserManager manager = (ChromeSafariBrowserManager) ChromeSafariBrowserManager.shared.get(managerId);
MethodChannel channel = new MethodChannel(manager.plugin.messenger, "com.pichillilorenzo/flutter_chromesafaribrowser_" + viewId);
Map<String, Object> obj = new HashMap<>();
obj.put("url", url);
obj.put("title", title);
obj.put("id", id);
channel.invokeMethod("onChromeSafariBrowserItemActionPerform", obj);
if (managerId != null) {
ChromeSafariBrowserManager manager = (ChromeSafariBrowserManager) ChromeSafariBrowserManager.shared.get(managerId);
if (manager == null || manager.plugin == null|| manager.plugin.messenger == null) return;
MethodChannel channel = new MethodChannel(manager.plugin.messenger, "com.pichillilorenzo/flutter_chromesafaribrowser_" + viewId);
Map<String, Object> obj = new HashMap<>();
obj.put("url", url);
obj.put("title", title);
obj.put("id", id);
channel.invokeMethod("onChromeSafariBrowserItemActionPerform", obj);
}
}
}
}

View File

@ -190,8 +190,10 @@ public class ChromeCustomTabsActivity extends Activity implements MethodChannel.
builder.setInstantAppsEnabled(options.instantAppsEnabled);
for (CustomTabsMenuItem menuItem : menuItems) {
builder.addMenuItem(menuItem.getLabel(),
createPendingIntent(menuItem.getId()));
PendingIntent pendingIntent = createPendingIntent(menuItem.getId());
if (pendingIntent != null) {
builder.addMenuItem(menuItem.getLabel(), pendingIntent);
}
}
if (actionButton != null) {
@ -201,9 +203,12 @@ public class ChromeCustomTabsActivity extends Activity implements MethodChannel.
Bitmap bmp = BitmapFactory.decodeByteArray(
data, 0, data.length, bitmapOptions
);
builder.setActionButton(bmp, actionButton.getDescription(),
createPendingIntent(actionButton.getId()),
actionButton.isShouldTint());
PendingIntent pendingIntent = createPendingIntent(actionButton.getId());
if (pendingIntent != null) {
builder.setActionButton(bmp, actionButton.getDescription(),
pendingIntent,
actionButton.isShouldTint());
}
}
}
@ -237,7 +242,9 @@ public class ChromeCustomTabsActivity extends Activity implements MethodChannel.
}
}
@Nullable
private PendingIntent createPendingIntent(int actionSourceId) {
if (manager == null) return null;
Intent actionIntent = new Intent(this, ActionBroadcastReceiver.class);
Bundle extras = new Bundle();
@ -256,11 +263,15 @@ public class ChromeCustomTabsActivity extends Activity implements MethodChannel.
}
public void dispose() {
onStop();
onDestroy();
channel.setMethodCallHandler(null);
manager = null;
}
public void close() {
onStop();
onDestroy();
customTabsSession = null;
finish();
Map<String, Object> obj = new HashMap<>();

View File

@ -6,6 +6,7 @@ import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Build;
import android.text.TextUtils;
import android.util.Log;
@ -52,6 +53,7 @@ public class CustomTabsHelper {
PackageManager pm = context.getPackageManager();
// Get default VIEW intent handler.
Intent activityIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.example.com"));
activityIntent.addCategory(Intent.CATEGORY_BROWSABLE);
ResolveInfo defaultViewHandlerInfo = pm.resolveActivity(activityIntent, 0);
String defaultViewHandlerPackageName = null;
if (defaultViewHandlerInfo != null) {
@ -59,7 +61,11 @@ public class CustomTabsHelper {
}
// Get all apps that can handle VIEW intents.
List<ResolveInfo> resolvedActivityList = pm.queryIntentActivities(activityIntent, 0);
int flags = 0;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
flags |= PackageManager.MATCH_ALL;
}
List<ResolveInfo> resolvedActivityList = pm.queryIntentActivities(activityIntent, flags);
List<String> packagesSupportingCustomTabs = new ArrayList<>();
for (ResolveInfo info : resolvedActivityList) {
Intent serviceIntent = new Intent();

View File

@ -2,7 +2,6 @@ package com.pichillilorenzo.flutter_inappwebview.content_blocker;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.webkit.WebResourceResponse;
@ -21,6 +20,8 @@ import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CountDownLatch;
import java.util.regex.Matcher;
import javax.net.ssl.SSLHandshakeException;
import okhttp3.Request;
import okhttp3.Response;
@ -181,7 +182,7 @@ public class ContentBlockerHandler {
Response response = null;
try {
response = Util.getUnsafeOkHttpClient().newCall(mRequest).execute();
response = Util.getBasicOkHttpClient().newCall(mRequest).execute();
byte[] dataBytes = response.body().bytes();
InputStream dataStream = new ByteArrayInputStream(dataBytes);
@ -198,12 +199,14 @@ public class ContentBlockerHandler {
return new WebResourceResponse(contentType, encoding, dataStream);
} catch (Exception e) {
e.printStackTrace();
if (response != null) {
response.body().close();
response.close();
}
Log.e(LOG_TAG, e.getMessage());
if (!(e instanceof SSLHandshakeException)) {
e.printStackTrace();
Log.e(LOG_TAG, e.getMessage());
}
}
}
break;
@ -231,7 +234,7 @@ public class ContentBlockerHandler {
Request mRequest = new Request.Builder().url(url).head().build();
Response response = null;
try {
response = Util.getUnsafeOkHttpClient().newCall(mRequest).execute();
response = Util.getBasicOkHttpClient().newCall(mRequest).execute();
if (response.header("content-type") != null) {
String[] contentTypeSplitted = response.header("content-type").split(";");
@ -251,8 +254,10 @@ public class ContentBlockerHandler {
response.body().close();
response.close();
}
e.printStackTrace();
Log.e(LOG_TAG, e.getMessage());
if (!(e instanceof SSLHandshakeException)) {
e.printStackTrace();
Log.e(LOG_TAG, e.getMessage());
}
}
}
return responseResourceType;

View File

@ -276,8 +276,11 @@ final public class InAppWebView extends InputAwareWebView implements InAppWebVie
settings.setAllowFileAccessFromFileURLs(options.allowFileAccessFromFileURLs);
settings.setAllowUniversalAccessFromFileURLs(options.allowUniversalAccessFromFileURLs);
setCacheEnabled(options.cacheEnabled);
if (options.appCachePath != null && !options.appCachePath.isEmpty() && options.cacheEnabled)
settings.setAppCachePath(options.appCachePath);
if (options.appCachePath != null && !options.appCachePath.isEmpty() && options.cacheEnabled) {
// removed from Android API 33+ (https://developer.android.com/sdk/api_diff/33/changes)
// settings.setAppCachePath(options.appCachePath);
Util.invokeMethodIfExists(settings, "setAppCachePath", options.appCachePath);
}
settings.setBlockNetworkImage(options.blockNetworkImage);
settings.setBlockNetworkLoads(options.blockNetworkLoads);
if (options.cacheMode != null)
@ -357,10 +360,6 @@ final public class InAppWebView extends InputAwareWebView implements InAppWebVie
setRendererPriorityPolicy(
(int) options.rendererPriorityPolicy.get("rendererRequestedPriority"),
(boolean) options.rendererPriorityPolicy.get("waivedWhenNotVisible"));
} else if ((options.rendererPriorityPolicy == null || (options.rendererPriorityPolicy != null && options.rendererPriorityPolicy.isEmpty())) &&
Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
options.rendererPriorityPolicy.put("rendererRequestedPriority", getRendererRequestedPriority());
options.rendererPriorityPolicy.put("waivedWhenNotVisible", getRendererPriorityWaivedWhenNotVisible());
}
contentBlockerHandler.getRuleList().clear();
@ -491,7 +490,11 @@ final public class InAppWebView extends InputAwareWebView implements InAppWebVie
// Disable caching
settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
settings.setAppCacheEnabled(false);
// removed from Android API 33+ (https://developer.android.com/sdk/api_diff/33/changes)
// settings.setAppCacheEnabled(false);
Util.invokeMethodIfExists(settings, "setAppCacheEnabled", false);
clearHistory();
clearCache(true);
@ -501,7 +504,11 @@ final public class InAppWebView extends InputAwareWebView implements InAppWebVie
settings.setSaveFormData(false);
} else {
settings.setCacheMode(WebSettings.LOAD_DEFAULT);
settings.setAppCacheEnabled(true);
// removed from Android API 33+ (https://developer.android.com/sdk/api_diff/33/changes)
// settings.setAppCacheEnabled(true);
Util.invokeMethodIfExists(settings, "setAppCacheEnabled", true);
settings.setSavePassword(true);
settings.setSaveFormData(true);
}
@ -512,13 +519,22 @@ final public class InAppWebView extends InputAwareWebView implements InAppWebVie
if (enabled) {
Context ctx = getContext();
if (ctx != null) {
settings.setAppCachePath(ctx.getCacheDir().getAbsolutePath());
// removed from Android API 33+ (https://developer.android.com/sdk/api_diff/33/changes)
// settings.setAppCachePath(ctx.getCacheDir().getAbsolutePath());
Util.invokeMethodIfExists(settings, "setAppCachePath", ctx.getCacheDir().getAbsolutePath());
settings.setCacheMode(WebSettings.LOAD_DEFAULT);
settings.setAppCacheEnabled(true);
// removed from Android API 33+ (https://developer.android.com/sdk/api_diff/33/changes)
// settings.setAppCacheEnabled(true);
Util.invokeMethodIfExists(settings, "setAppCacheEnabled", true);
}
} else {
settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
settings.setAppCacheEnabled(false);
// removed from Android API 33+ (https://developer.android.com/sdk/api_diff/33/changes)
// settings.setAppCacheEnabled(false);
Util.invokeMethodIfExists(settings, "setAppCacheEnabled", false);
}
}
@ -763,8 +779,11 @@ final public class InAppWebView extends InputAwareWebView implements InAppWebVie
if (newOptionsMap.get("cacheEnabled") != null && options.cacheEnabled != newOptions.cacheEnabled)
setCacheEnabled(newOptions.cacheEnabled);
if (newOptionsMap.get("appCachePath") != null && (options.appCachePath == null || !options.appCachePath.equals(newOptions.appCachePath)))
settings.setAppCachePath(newOptions.appCachePath);
if (newOptionsMap.get("appCachePath") != null && (options.appCachePath == null || !options.appCachePath.equals(newOptions.appCachePath))) {
// removed from Android API 33+ (https://developer.android.com/sdk/api_diff/33/changes)
// settings.setAppCachePath(newOptions.appCachePath);
Util.invokeMethodIfExists(settings, "setAppCachePath", newOptions.appCachePath);
}
if (newOptionsMap.get("blockNetworkImage") != null && options.blockNetworkImage != newOptions.blockNetworkImage)
settings.setBlockNetworkImage(newOptions.blockNetworkImage);
@ -916,9 +935,9 @@ final public class InAppWebView extends InputAwareWebView implements InAppWebVie
if (newOptionsMap.get("networkAvailable") != null && options.networkAvailable != newOptions.networkAvailable)
setNetworkAvailable(newOptions.networkAvailable);
if (newOptionsMap.get("rendererPriorityPolicy") != null &&
if (newOptionsMap.get("rendererPriorityPolicy") != null && (options.rendererPriorityPolicy == null ||
(options.rendererPriorityPolicy.get("rendererRequestedPriority") != newOptions.rendererPriorityPolicy.get("rendererRequestedPriority") ||
options.rendererPriorityPolicy.get("waivedWhenNotVisible") != newOptions.rendererPriorityPolicy.get("waivedWhenNotVisible")) &&
options.rendererPriorityPolicy.get("waivedWhenNotVisible") != newOptions.rendererPriorityPolicy.get("waivedWhenNotVisible"))) &&
Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
setRendererPriorityPolicy(
(int) newOptions.rendererPriorityPolicy.get("rendererRequestedPriority"),

View File

@ -780,15 +780,15 @@ public class InAppWebViewChromeClient extends WebChromeClient implements PluginR
}
protected void openFileChooser(ValueCallback<Uri> filePathCallback, String acceptType) {
startPhotoPickerIntent(filePathCallback, acceptType);
startPickerIntent(filePathCallback, acceptType, null);
}
protected void openFileChooser(ValueCallback<Uri> filePathCallback) {
startPhotoPickerIntent(filePathCallback, "");
startPickerIntent(filePathCallback, "", null);
}
protected void openFileChooser(ValueCallback<Uri> filePathCallback, String acceptType, String capture) {
startPhotoPickerIntent(filePathCallback, acceptType);
startPickerIntent(filePathCallback, acceptType, capture);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@ -796,8 +796,8 @@ public class InAppWebViewChromeClient extends WebChromeClient implements PluginR
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
String[] acceptTypes = fileChooserParams.getAcceptTypes();
boolean allowMultiple = fileChooserParams.getMode() == WebChromeClient.FileChooserParams.MODE_OPEN_MULTIPLE;
Intent intent = fileChooserParams.createIntent();
return startPhotoPickerIntent(filePathCallback, intent, acceptTypes, allowMultiple);
boolean captureEnabled = fileChooserParams.isCaptureEnabled();
return startPickerIntent(filePathCallback, acceptTypes, allowMultiple, captureEnabled);
}
@Override
@ -898,58 +898,89 @@ public class InAppWebViewChromeClient extends WebChromeClient implements PluginR
return null;
}
public void startPhotoPickerIntent(ValueCallback<Uri> filePathCallback, String acceptType) {
public void startPickerIntent(ValueCallback<Uri> filePathCallback, String acceptType, @Nullable String capture) {
InAppWebViewFlutterPlugin.filePathCallbackLegacy = filePathCallback;
Intent fileChooserIntent = getFileChooserIntent(acceptType);
Intent chooserIntent = Intent.createChooser(fileChooserIntent, "");
boolean images = acceptsImages(acceptType);
boolean video = acceptsVideo(acceptType);
ArrayList<Parcelable> extraIntents = new ArrayList<>();
if (acceptsImages(acceptType)) {
extraIntents.add(getPhotoIntent());
Intent pickerIntent = null;
if (capture != null) {
if (!needsCameraPermission()) {
if (images) {
pickerIntent = getPhotoIntent();
}
else if (video) {
pickerIntent = getVideoIntent();
}
}
}
if (acceptsVideo(acceptType)) {
extraIntents.add(getVideoIntent());
if (pickerIntent == null) {
Intent fileChooserIntent = getFileChooserIntent(acceptType);
pickerIntent = Intent.createChooser(fileChooserIntent, "");
ArrayList<Parcelable> extraIntents = new ArrayList<>();
if (!needsCameraPermission()) {
if (images) {
extraIntents.add(getPhotoIntent());
}
if (video) {
extraIntents.add(getVideoIntent());
}
}
pickerIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, extraIntents.toArray(new Parcelable[]{}));
}
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, extraIntents.toArray(new Parcelable[]{}));
Activity activity = getActivity();
if (activity == null) {
return;
}
if (chooserIntent.resolveActivity(activity.getPackageManager()) != null) {
activity.startActivityForResult(chooserIntent, PICKER_LEGACY);
if (activity != null && pickerIntent.resolveActivity(activity.getPackageManager()) != null) {
activity.startActivityForResult(pickerIntent, PICKER_LEGACY);
} else {
Log.d(LOG_TAG, "there is no Activity to handle this Intent");
}
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public boolean startPhotoPickerIntent(final ValueCallback<Uri[]> callback, final Intent intent, final String[] acceptTypes, final boolean allowMultiple) {
public boolean startPickerIntent(final ValueCallback<Uri[]> callback, final String[] acceptTypes,
final boolean allowMultiple, final boolean captureEnabled) {
InAppWebViewFlutterPlugin.filePathCallback = callback;
ArrayList<Parcelable> extraIntents = new ArrayList<>();
if (!needsCameraPermission()) {
if (acceptsImages(acceptTypes)) {
extraIntents.add(getPhotoIntent());
}
if (acceptsVideo(acceptTypes)) {
extraIntents.add(getVideoIntent());
boolean images = acceptsImages(acceptTypes);
boolean video = acceptsVideo(acceptTypes);
Intent pickerIntent = null;
if (captureEnabled) {
if (!needsCameraPermission()) {
if (images) {
pickerIntent = getPhotoIntent();
}
else if (video) {
pickerIntent = getVideoIntent();
}
}
}
if (pickerIntent == null) {
ArrayList<Parcelable> extraIntents = new ArrayList<>();
if (!needsCameraPermission()) {
if (images) {
extraIntents.add(getPhotoIntent());
}
if (video) {
extraIntents.add(getVideoIntent());
}
}
Intent fileSelectionIntent = getFileChooserIntent(acceptTypes, allowMultiple);
Intent fileSelectionIntent = getFileChooserIntent(acceptTypes, allowMultiple);
Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER);
chooserIntent.putExtra(Intent.EXTRA_INTENT, fileSelectionIntent);
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, extraIntents.toArray(new Parcelable[]{}));
pickerIntent = new Intent(Intent.ACTION_CHOOSER);
pickerIntent.putExtra(Intent.EXTRA_INTENT, fileSelectionIntent);
pickerIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, extraIntents.toArray(new Parcelable[]{}));
}
Activity activity = getActivity();
if (activity == null) {
return true;
}
if (chooserIntent.resolveActivity(activity.getPackageManager()) != null) {
activity.startActivityForResult(chooserIntent, PICKER);
if (activity != null && pickerIntent.resolveActivity(activity.getPackageManager()) != null) {
activity.startActivityForResult(pickerIntent, PICKER);
} else {
Log.d(LOG_TAG, "there is no Activity to handle this Intent");
}

View File

@ -328,32 +328,22 @@ public class InAppWebViewClient extends WebViewClient {
@Override
public void onReceivedHttpAuthRequest(final WebView view, final HttpAuthHandler handler, final String host, final String realm) {
URI uri;
try {
uri = new URI(view.getUrl());
} catch (URISyntaxException e) {
e.printStackTrace();
credentialsProposed = null;
previousAuthRequestFailureCount = 0;
handler.cancel();
return;
final String url = view.getUrl();
String protocol = "https";
int port = 0;
if (url != null) {
try {
URI uri = new URI(url);
protocol = uri.getScheme();
port = uri.getPort();
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
final String protocol = uri.getScheme();
final int port = uri.getPort();
previousAuthRequestFailureCount++;
Map<String, Object> obj = new HashMap<>();
obj.put("host", host);
obj.put("protocol", protocol);
obj.put("realm", realm);
obj.put("port", port);
obj.put("previousFailureCount", previousAuthRequestFailureCount);
if (credentialsProposed == null)
credentialsProposed = CredentialDatabase.getInstance(view.getContext()).getHttpAuthCredentials(host, protocol, realm, port);
@ -365,6 +355,8 @@ public class InAppWebViewClient extends WebViewClient {
URLProtectionSpace protectionSpace = new URLProtectionSpace(host, protocol, realm, port, view.getCertificate(), null);
HttpAuthenticationChallenge challenge = new HttpAuthenticationChallenge(protectionSpace, previousAuthRequestFailureCount, credentialProposed);
final String finalProtocol = protocol;
final int finalPort = port;
channel.invokeMethod("onReceivedHttpAuthRequest", challenge.toMap(), new MethodChannel.Result() {
@Override
public void success(Object response) {
@ -378,7 +370,7 @@ public class InAppWebViewClient extends WebViewClient {
String password = (String) responseMap.get("password");
Boolean permanentPersistence = (Boolean) responseMap.get("permanentPersistence");
if (permanentPersistence != null && permanentPersistence) {
CredentialDatabase.getInstance(view.getContext()).setHttpAuthCredential(host, protocol, realm, port, username, password);
CredentialDatabase.getInstance(view.getContext()).setHttpAuthCredential(host, finalProtocol, realm, finalPort, username, password);
}
handler.proceed(username, password);
return;
@ -419,20 +411,21 @@ public class InAppWebViewClient extends WebViewClient {
@Override
public void onReceivedSslError(final WebView view, final SslErrorHandler handler, final SslError sslError) {
URI uri;
final String url = sslError.getUrl();
String host = "";
String protocol = "https";
final String realm = null;
int port = 0;
try {
uri = new URI(sslError.getUrl());
URI uri = new URI(url);
host = uri.getHost();
protocol = uri.getScheme();
port = uri.getPort();
} catch (URISyntaxException e) {
e.printStackTrace();
handler.cancel();
return;
}
final String host = uri.getHost();
final String protocol = uri.getScheme();
final String realm = null;
final int port = uri.getPort();
URLProtectionSpace protectionSpace = new URLProtectionSpace(host, protocol, realm, port, sslError.getCertificate(), sslError);
ServerTrustChallenge challenge = new ServerTrustChallenge(protectionSpace);
@ -473,23 +466,21 @@ public class InAppWebViewClient extends WebViewClient {
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void onReceivedClientCertRequest(final WebView view, final ClientCertRequest request) {
InAppWebView webView = (InAppWebView) view;
URI uri;
try {
uri = new URI(view.getUrl());
} catch (URISyntaxException e) {
e.printStackTrace();
request.cancel();
return;
}
final String url = view.getUrl();
final String host = request.getHost();
final String protocol = uri.getScheme();
String protocol = "https";
final String realm = null;
final int port = request.getPort();
if (url != null) {
try {
URI uri = new URI(url);
protocol = uri.getScheme();
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
URLProtectionSpace protectionSpace = new URLProtectionSpace(host, protocol, realm, port, view.getCertificate(), null);
ClientCertChallenge challenge = new ClientCertChallenge(protectionSpace, request.getPrincipals(), request.getKeyTypes());

View File

@ -95,7 +95,8 @@ public class InAppWebViewOptions implements Options<InAppWebViewInterface> {
public Integer scrollBarDefaultDelayBeforeFade = null;
public Boolean scrollbarFadingEnabled = true;
public Integer scrollBarFadeDuration = null;
public Map<String, Object> rendererPriorityPolicy = new HashMap<>();
@Nullable
public Map<String, Object> rendererPriorityPolicy = null;
public Boolean useShouldInterceptRequest = false;
public Boolean useOnRenderProcessGone = false;
public Boolean disableDefaultErrorPage = false;

View File

@ -147,7 +147,8 @@ public class JavaScriptBridgeJS {
" });" +
" }," +
" arrayBufferToString: function(arrayBuffer) {" +
" return String.fromCharCode.apply(String, arrayBuffer);" +
" var uint8Array = new Uint8Array(arrayBuffer);" +
" return uint8Array.reduce(function(acc, i) { return acc += String.fromCharCode.apply(null, [i]); }, '');" +
" }," +
" isBodyFormData: function(bodyString) {" +
" return bodyString.indexOf('------WebKitFormBoundary') >= 0;" +

View File

@ -94,6 +94,7 @@ public class PullToRefreshLayout extends SwipeRefreshLayout implements MethodCha
case "setEnabled":
{
Boolean enabled = (Boolean) call.argument("enabled");
options.enabled = enabled; // used by InAppWebView.onOverScrolled
setEnabled(enabled);
}
result.success(true);

View File

@ -30,7 +30,7 @@ android {
targetCompatibility 1.8
}
compileSdkVersion 31
compileSdkVersion 33
lintOptions {
disable 'InvalidPackage'
@ -40,7 +40,7 @@ android {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.pichillilorenzo.flutter_inappwebviewexample"
minSdkVersion 17
targetSdkVersion 31
targetSdkVersion 33
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
@ -64,6 +64,6 @@ dependencies {
testImplementation 'junit:junit:4.13'
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation 'com.google.android.material:material:1.3.0'
implementation 'com.google.android.material:material:1.6.1'
implementation 'com.android.support:multidex:1.0.3'
}

View File

@ -5495,7 +5495,7 @@ setTimeout(function() {
child: InAppWebView(
key: GlobalKey(),
initialUrlRequest:
URLRequest(url: Uri.parse('https://mdn.github.io/sw-test/')),
URLRequest(url: Uri.parse('https://mdn.github.io/dom-examples/service-worker/simple-service-worker/')),
),
),
);
@ -5524,7 +5524,7 @@ setTimeout(function() {
child: InAppWebView(
key: GlobalKey(),
initialUrlRequest:
URLRequest(url: Uri.parse('https://mdn.github.io/sw-test/')),
URLRequest(url: Uri.parse('https://mdn.github.io/dom-examples/service-worker/simple-service-worker/')),
onLoadStop: (controller, url) {
pageLoaded.complete(url!.toString());
},
@ -5533,7 +5533,7 @@ setTimeout(function() {
);
final String url = await pageLoaded.future;
expect(url, "https://mdn.github.io/sw-test/");
expect(url, "https://mdn.github.io/dom-examples/service-worker/simple-service-worker/");
}, skip: !Platform.isAndroid);
});

View File

@ -21,6 +21,6 @@
<key>CFBundleVersion</key>
<string>1.0</string>
<key>MinimumOSVersion</key>
<string>9.0</string>
<string>11.0</string>
</dict>
</plist>

View File

@ -6,12 +6,12 @@
Pod::Spec.new do |s|
s.name = 'Flutter'
s.version = '1.0.0'
s.summary = 'High-performance, high-fidelity mobile apps.'
s.homepage = 'https://flutter.io'
s.license = { :type => 'MIT' }
s.summary = 'A UI toolkit for beautiful and fast apps.'
s.homepage = 'https://flutter.dev'
s.license = { :type => 'BSD' }
s.author = { 'Flutter Dev Team' => 'flutter-dev@googlegroups.com' }
s.source = { :git => 'https://github.com/flutter/engine', :tag => s.version.to_s }
s.ios.deployment_target = '9.0'
s.ios.deployment_target = '11.0'
# Framework linking is handled by Flutter tooling, not CocoaPods.
# Add a placeholder to satisfy `s.dependency 'Flutter'` plugin podspecs.
s.vendored_frameworks = 'path/to/nothing'

View File

@ -3,11 +3,11 @@
export "FLUTTER_ROOT=/Users/lorenzopichilli/fvm/versions/2.10.4"
export "FLUTTER_APPLICATION_PATH=/Users/lorenzopichilli/flutter_inappwebview_v5/example"
export "COCOAPODS_PARALLEL_CODE_SIGN=true"
export "FLUTTER_TARGET=integration_test/webview_flutter_test.dart"
export "FLUTTER_TARGET=/Users/lorenzopichilli/flutter_inappwebview_v5/example/lib/main.dart"
export "FLUTTER_BUILD_DIR=build"
export "FLUTTER_BUILD_NAME=1.0.0"
export "FLUTTER_BUILD_NUMBER=1"
export "DART_DEFINES=RkxVVFRFUl9XRUJfQVVUT19ERVRFQ1Q9dHJ1ZQ=="
export "DART_DEFINES=Zmx1dHRlci5pbnNwZWN0b3Iuc3RydWN0dXJlZEVycm9ycz10cnVl,RkxVVFRFUl9XRUJfQVVUT19ERVRFQ1Q9dHJ1ZQ=="
export "DART_OBFUSCATION=false"
export "TRACK_WIDGET_CREATION=true"
export "TREE_SHAKE_ICONS=false"

View File

@ -1,5 +1,5 @@
# Uncomment this line to define a global platform for your project
# platform :ios, '9.0'
# platform :ios, '11.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'

View File

@ -375,7 +375,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
@ -427,7 +427,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";

View File

@ -2,6 +2,8 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>

View File

@ -151,10 +151,10 @@ class _InAppWebViewExampleScreenState extends State<InAppWebViewExampleScreen> {
"javascript",
"about"
].contains(uri.scheme)) {
if (await canLaunch(url)) {
if (await canLaunchUrl(uri)) {
// Launch the App
await launch(
url,
await launchUrl(
uri,
);
// and cancel the request
return NavigationActionPolicy.CANCEL;

View File

@ -24,7 +24,7 @@ dependencies:
cupertino_icons: ^1.0.4
flutter_downloader: ^1.7.3
path_provider: ^2.0.9
permission_handler: ^9.2.0
permission_handler: ^10.0.2
url_launcher: ^6.0.20
# connectivity: ^0.4.5+6
flutter_inappwebview:

Binary file not shown.

View File

@ -417,7 +417,7 @@ public class InAppWebViewMethodHandler: FlutterMethodCallDelegate {
break
case "callAsyncJavaScript":
if let webView = webView, #available(iOS 10.3, *) {
if #available(iOS 14.0, *) {
if #available(iOS 14.3, *) { // on iOS 14.0, for some reason, it crashes
let functionBody = arguments!["functionBody"] as! String
let functionArguments = arguments!["arguments"] as! [String:Any]
var contentWorld = WKContentWorld.page

View File

@ -42,7 +42,7 @@ window.\(JAVASCRIPT_BRIDGE_NAME)._findAllAsyncForElement = function(element, key
span.setAttribute(
"id",
"WKWEBVIEW_SEARCH_WORD_" + \(FIND_TEXT_HIGHLIGHT_SEARCH_RESULT_COUNT_JS_SOURCE)
"\(JAVASCRIPT_BRIDGE_NAME)_SEARCH_WORD_" + \(FIND_TEXT_HIGHLIGHT_SEARCH_RESULT_COUNT_JS_SOURCE)
);
span.setAttribute("class", "\(JAVASCRIPT_BRIDGE_NAME)_Highlight");
var backgroundColor = \(FIND_TEXT_HIGHLIGHT_SEARCH_RESULT_COUNT_JS_SOURCE) == 0 ? "#FF9732" : "#FFFF00";

View File

@ -175,7 +175,8 @@ let UTIL_JS_SOURCE = """
});
},
arrayBufferToString: function(arrayBuffer) {
return String.fromCharCode.apply(String, arrayBuffer);
var uint8Array = new Uint8Array(arrayBuffer);
return uint8Array.reduce(function(acc, i) { return acc += String.fromCharCode.apply(null, [i]); }, '');
},
isBodyFormData: function(bodyString) {
return bodyString.indexOf('------WebKitFormBoundary') >= 0;

View File

@ -70,6 +70,9 @@ public class PullToRefreshControl : UIRefreshControl, FlutterPlugin {
}
result(true)
break
case "isRefreshing":
result(isRefreshing)
break
case "setColor":
let color = arguments!["color"] as! String
tintColor = UIColor(hexString: color)

View File

@ -10,8 +10,19 @@ import WebKit
public class UserScript : WKUserScript {
var groupName: String?
private var contentWorldWrapper: Any?
@available(iOS 14.0, *)
lazy var contentWorld: WKContentWorld = WKContentWorld.page
var contentWorld: WKContentWorld {
get {
if let value = contentWorldWrapper as? WKContentWorld {
return value
}
return .page
}
set { contentWorldWrapper = newValue }
}
public override init(source: String, injectionTime: WKUserScriptInjectionTime, forMainFrameOnly: Bool) {
super.init(source: source, injectionTime: injectionTime, forMainFrameOnly: forMainFrameOnly)

View File

@ -2218,7 +2218,7 @@ class InAppWebViewController {
///This parameter doesnt apply to changes you make to the underlying web content, such as the documents DOM structure.
///Those changes remain visible to all scripts, regardless of which content world you specify.
///For more information about content worlds, see [ContentWorld].
///Available on iOS 14.0+.
///Available on iOS 14.3+.
///
///**NOTE**: This method shouldn't be called in the [WebView.onWebViewCreated] or [WebView.onLoadStart] events,
///because, in these events, the [WebView] is not ready to handle it yet.

View File

@ -1 +1 @@
B83E5BFA72399E6B
B83E5BFA72399E73

View File

@ -0,0 +1,20 @@
var fs = require('fs');
var https = require('https');
var options = {
hostname: 'localhost',
port: 4433,
path: '/',
method: 'GET',
key: fs.readFileSync('client1-key.pem'),
cert: fs.readFileSync('client1-crt.pem'),
// pfx: fs.readFileSync('certificate.pfx'),
ca: fs.readFileSync('ca-crt.pem') };
var req = https.request(options, function(res) {
res.on('data', function(data) {
process.stdout.write(data);
});
});
req.end();
req.on('error', function(e) {
console.error(e);
});

56
nodejs_server_test_auth_basic_and_ssl/client1-crt.pem Executable file → Normal file
View File

@ -1,32 +1,32 @@
-----BEGIN CERTIFICATE-----
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
-----END CERTIFICATE-----

56
nodejs_server_test_auth_basic_and_ssl/client2-crt.pem Executable file → Normal file
View File

@ -1,32 +1,32 @@
-----BEGIN CERTIFICATE-----
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
-----END CERTIFICATE-----

View File

@ -1,5 +1,15 @@
// Example of the server https is taken from here: https://engineering.circle.com/https-authorized-certs-with-node-js-315e548354a2
// Renew certificates:
// - openssl x509 -req -extfile server.cnf -days 9999 -passin "pass:password" -in server-csr.pem -CA ca-crt.pem -CAkey ca-key.pem -CAcreateserial -out server-crt.pem
// - openssl x509 -req -extfile client1.cnf -days 9999 -passin "pass:password" -in client1-csr.pem -CA ca-crt.pem -CAkey ca-key.pem -CAcreateserial -out client1-crt.pem
// - openssl x509 -req -extfile client2.cnf -days 9999 -passin "pass:password" -in client2-csr.pem -CA ca-crt.pem -CAkey ca-key.pem -CAcreateserial -out client2-crt.pem
// Verify certificates:
// - openssl verify -CAfile ca-crt.pem server-crt.pem
// - openssl verify -CAfile ca-crt.pem client1-crt.pem
// - openssl verify -CAfile ca-crt.pem client2-crt.pem
// Conversion of client1-crt.pem to certificate.pfx: https://stackoverflow.com/a/38408666/4637638
// - openssl pkcs12 -export -out certificate.pfx -inkey client1-key.pem -in client1-crt.pem -certfile ca-crt.pem
// - Overwrite certificate.pfx to example/test_assets/certificate.pfx
const express = require('express')
const https = require('https')
const cors = require('cors')

View File

@ -42,26 +42,28 @@
}
},
"body-parser": {
"version": "1.19.0",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
"integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
"version": "1.20.0",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz",
"integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==",
"requires": {
"bytes": "3.1.0",
"bytes": "3.1.2",
"content-type": "~1.0.4",
"debug": "2.6.9",
"depd": "~1.1.2",
"http-errors": "1.7.2",
"depd": "2.0.0",
"destroy": "1.2.0",
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"on-finished": "~2.3.0",
"qs": "6.7.0",
"raw-body": "2.4.0",
"type-is": "~1.6.17"
"on-finished": "2.4.1",
"qs": "6.10.3",
"raw-body": "2.5.1",
"type-is": "~1.6.18",
"unpipe": "1.0.0"
}
},
"bytes": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
"integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
"integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
},
"call-bind": {
"version": "1.0.2",
@ -120,9 +122,9 @@
}
},
"depd": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
"integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
},
"destroy": {
"version": "1.2.0",
@ -350,15 +352,15 @@
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
},
"http-errors": {
"version": "1.7.2",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
"integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
"integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
"requires": {
"depd": "~1.1.2",
"inherits": "2.0.3",
"setprototypeof": "1.1.1",
"statuses": ">= 1.5.0 < 2",
"toidentifier": "1.0.0"
"depd": "2.0.0",
"inherits": "2.0.4",
"setprototypeof": "1.2.0",
"statuses": "2.0.1",
"toidentifier": "1.0.1"
}
},
"https": {
@ -375,9 +377,9 @@
}
},
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"ipaddr.js": {
"version": "1.9.1",
@ -423,41 +425,41 @@
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
"multiparty": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/multiparty/-/multiparty-4.2.2.tgz",
"integrity": "sha512-NtZLjlvsjcoGrzojtwQwn/Tm90aWJ6XXtPppYF4WmOk/6ncdwMMKggFY2NlRRN9yiCEIVxpOfPWahVEG2HAG8Q==",
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/multiparty/-/multiparty-4.2.3.tgz",
"integrity": "sha512-Ak6EUJZuhGS8hJ3c2fY6UW5MbkGUPMBEGd13djUzoY/BHqV/gTuFWtC6IuVA7A2+v3yjBS6c4or50xhzTQZImQ==",
"requires": {
"http-errors": "~1.8.0",
"http-errors": "~1.8.1",
"safe-buffer": "5.2.1",
"uid-safe": "2.1.5"
},
"dependencies": {
"depd": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
"integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ=="
},
"http-errors": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz",
"integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==",
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
"integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
"requires": {
"depd": "~1.1.2",
"inherits": "2.0.4",
"setprototypeof": "1.2.0",
"statuses": ">= 1.5.0 < 2",
"toidentifier": "1.0.0"
"toidentifier": "1.0.1"
}
},
"inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
},
"setprototypeof": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
"statuses": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
"integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA=="
}
}
},
@ -477,9 +479,9 @@
"integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g=="
},
"on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
"integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
"integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
"requires": {
"ee-first": "1.1.1"
}
@ -504,14 +506,17 @@
}
},
"qs": {
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
"integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
"version": "6.10.3",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz",
"integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==",
"requires": {
"side-channel": "^1.0.4"
}
},
"random-bytes": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz",
"integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs="
"integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ=="
},
"range-parser": {
"version": "1.2.1",
@ -519,12 +524,12 @@
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
},
"raw-body": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
"integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
"integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
"requires": {
"bytes": "3.1.0",
"http-errors": "1.7.2",
"bytes": "3.1.2",
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"unpipe": "1.0.0"
}
@ -623,9 +628,9 @@
}
},
"setprototypeof": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
"integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
},
"side-channel": {
"version": "1.0.4",
@ -638,14 +643,14 @@
}
},
"statuses": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
"integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
},
"toidentifier": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
"integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
"integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
},
"type-is": {
"version": "1.6.18",

View File

@ -10,10 +10,10 @@
"license": "ISC",
"dependencies": {
"basic-auth": "latest",
"body-parser": "^1.19.0",
"body-parser": "^1.20.0",
"cors": "^2.8.5",
"express": "latest",
"https": "latest",
"multiparty": "^4.2.2"
"multiparty": "^4.2.3"
}
}

View File

@ -1,32 +1,32 @@
-----BEGIN CERTIFICATE-----
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
-----END CERTIFICATE-----

8
pubspec.yaml Executable file → Normal file
View File

@ -1,7 +1,9 @@
name: flutter_inappwebview
description: A Flutter plugin that allows you to add an inline webview, to use an headless webview, and to open an in-app browser window.
version: 5.4.3+7
homepage: https://github.com/pichillilorenzo/flutter_inappwebview
version: 5.4.5
homepage: https://inappwebview.dev/
repository: https://github.com/pichillilorenzo/flutter_inappwebview
issue_tracker: https://github.com/pichillilorenzo/flutter_inappwebview/issues
environment:
sdk: ">=2.14.0 <3.0.0"
@ -65,4 +67,4 @@ flutter:
false_secrets:
- /nodejs_server_test_auth_basic_and_ssl/*.pem
- /nodejs_server_test_auth_basic_and_ssl/*.pfx
- /nodejs_server_test_auth_basic_and_ssl/*.pfx