Skip to content

Commit f076647

Browse files
committed
Refactor flutter_html_iframe
1 parent b60e6d6 commit f076647

File tree

7 files changed

+132
-104
lines changed

7 files changed

+132
-104
lines changed

example/lib/generated_plugin_registrant.dart

Lines changed: 0 additions & 19 deletions
This file was deleted.

example/lib/main.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,10 @@ class MyHomePageState extends State<MyHomePage> {
329329
size: context.styledElement!.style.fontSize!.value,
330330
),
331331
),
332-
MathHtmlExtension(),
332+
const MathHtmlExtension(),
333+
const AudioHtmlExtension(),
334+
const VideoHtmlExtension(),
335+
const IframeHtmlExtension(),
333336
],
334337
// customRenders: {
335338
// tagMatcher("table"): CustomRender.widget(
@@ -340,8 +343,6 @@ class MyHomePageState extends State<MyHomePage> {
340343
// .widget!
341344
// .call(context, buildChildren),
342345
// )),
343-
// audioMatcher(): audioRender(),
344-
// iframeMatcher(): iframeRender(),
345346
// svgTagMatcher(): svgTagRender(),
346347
// svgDataUriMatcher(): svgDataImageRender(),
347348
// svgAssetUriMatcher(): svgAssetImageRender(),
@@ -364,7 +365,6 @@ class MyHomePageState extends State<MyHomePage> {
364365
// // Custom placeholder image for broken links
365366
// networkSourceMatcher():
366367
// networkImageRender(altWidget: (_) => const FlutterLogo()),
367-
// videoMatcher(): videoRender(),
368368
// },
369369
onLinkTap: (url, _, __) {
370370
debugPrint("Opening $url...");
Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,31 @@
11
library flutter_html_iframe;
22

3-
import 'package:flutter_html/custom_render.dart';
3+
import 'package:flutter/widgets.dart';
4+
import 'package:flutter_html/flutter_html.dart';
5+
import 'package:webview_flutter/webview_flutter.dart';
46

5-
export 'iframe_unsupported.dart'
7+
import 'iframe_unsupported.dart'
68
if (dart.library.io) 'iframe_mobile.dart'
79
if (dart.library.html) 'iframe_web.dart';
810

9-
CustomRenderMatcher iframeMatcher() => (context) {
10-
return context.tree.element?.localName == "iframe";
11-
};
11+
class IframeHtmlExtension extends Extension {
12+
13+
final NavigationDelegate? navigationDelegate;
14+
15+
const IframeHtmlExtension({
16+
this.navigationDelegate,
17+
});
18+
19+
@override
20+
Set<String> get supportedTags => {"iframe"};
21+
22+
@override
23+
InlineSpan parse(ExtensionContext context, parseChildren) {
24+
return WidgetSpan(
25+
child: IframeWidget(
26+
navigationDelegate: navigationDelegate,
27+
),
28+
);
29+
}
30+
31+
}

packages/flutter_html_iframe/lib/iframe_mobile.dart

Lines changed: 44 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -4,33 +4,48 @@ import 'package:flutter/material.dart';
44
import 'package:flutter_html/flutter_html.dart';
55
import 'package:webview_flutter/webview_flutter.dart';
66

7-
CustomRender iframeRender({NavigationDelegate? navigationDelegate}) =>
8-
CustomRender.widget(widget: (context, buildChildren) {
9-
final sandboxMode = context.tree.element?.attributes["sandbox"];
10-
final UniqueKey key = UniqueKey();
11-
final givenWidth =
12-
double.tryParse(context.tree.element?.attributes['width'] ?? "");
13-
final givenHeight =
14-
double.tryParse(context.tree.element?.attributes['height'] ?? "");
15-
return SizedBox(
16-
width: givenWidth ?? (givenHeight ?? 150) * 2,
17-
height: givenHeight ?? (givenWidth ?? 300) / 2,
18-
child: CssBoxWidget(
19-
style: context.style,
20-
childIsReplaced: true,
21-
child: WebView(
22-
initialUrl: context.tree.element?.attributes['src'],
23-
key: key,
24-
javascriptMode:
25-
sandboxMode == null || sandboxMode == "allow-scripts"
26-
? JavascriptMode.unrestricted
27-
: JavascriptMode.disabled,
28-
navigationDelegate: navigationDelegate,
29-
gestureRecognizers: {
30-
Factory<VerticalDragGestureRecognizer>(
31-
() => VerticalDragGestureRecognizer())
32-
},
33-
),
7+
class IframeWidget extends StatelessWidget {
8+
9+
final NavigationDelegate? navigationDelegate;
10+
final ExtensionContext extensionContext;
11+
12+
const IframeWidget({
13+
Key? key,
14+
required this.extensionContext,
15+
this.navigationDelegate,
16+
}) : super(key: key);
17+
18+
@override
19+
Widget build(BuildContext context) {
20+
21+
final WebViewController controller = WebViewController();
22+
23+
final sandboxMode = extensionContext.attributes["sandbox"];
24+
controller.setJavaScriptMode(sandboxMode == null || sandboxMode == "allow-scripts"
25+
? JavaScriptMode.unrestricted
26+
: JavaScriptMode.disabled);
27+
28+
if(navigationDelegate != null) {
29+
controller.setNavigationDelegate(navigationDelegate!);
30+
}
31+
32+
final UniqueKey key = UniqueKey();
33+
final givenWidth = double.tryParse(extensionContext.attributes['width'] ?? "");
34+
final givenHeight = double.tryParse(extensionContext.attributes['height'] ?? "");
35+
36+
return SizedBox(
37+
width: givenWidth ?? (givenHeight ?? 150) * 2,
38+
height: givenHeight ?? (givenWidth ?? 300) / 2,
39+
child: CssBoxWidget(
40+
style: extensionContext.styledElement!.style,
41+
childIsReplaced: true,
42+
child: WebViewWidget(
43+
controller: controller..loadRequest(Uri.tryParse(extensionContext.attributes['src'] ?? "") ?? Uri()),
44+
key: key,
45+
gestureRecognizers: {Factory(() => VerticalDragGestureRecognizer())},
3446
),
35-
);
36-
});
47+
),
48+
);
49+
}
50+
51+
}
Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
11
import 'package:flutter/material.dart';
2-
import 'package:flutter_html/flutter_html.dart';
32
import 'package:webview_flutter/webview_flutter.dart';
43

5-
CustomRender iframeRender({NavigationDelegate? navigationDelegate}) =>
6-
CustomRender.widget(widget: (context, buildChildren) {
7-
return const Text(
8-
"Iframes are currently not supported in this environment");
9-
});
4+
class IframeWidget extends StatelessWidget {
5+
6+
const IframeWidget({
7+
Key? key,
8+
NavigationDelegate? navigationDelegate,
9+
}) : super(key: key);
10+
11+
12+
@override
13+
Widget build(BuildContext context) {
14+
return const Text(
15+
"Iframes are currently not supported in this environment");
16+
}
17+
}

packages/flutter_html_iframe/lib/iframe_web.dart

Lines changed: 44 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -9,46 +9,53 @@ import 'dart:html' as html;
99

1010
import 'package:webview_flutter/webview_flutter.dart';
1111

12-
CustomRender iframeRender({NavigationDelegate? navigationDelegate}) =>
13-
CustomRender.widget(widget: (context, buildChildren) {
14-
final givenWidth =
15-
double.tryParse(context.tree.element?.attributes['width'] ?? "");
16-
final givenHeight =
17-
double.tryParse(context.tree.element?.attributes['height'] ?? "");
18-
final html.IFrameElement iframe = html.IFrameElement()
19-
..width = (givenWidth ?? (givenHeight ?? 150) * 2).toString()
20-
..height = (givenHeight ?? (givenWidth ?? 300) / 2).toString()
21-
..src = context.tree.element?.attributes['src']
22-
..style.border = 'none';
23-
final String createdViewId = getRandString(10);
24-
ui.platformViewRegistry
25-
.registerViewFactory(createdViewId, (int viewId) => iframe);
26-
return SizedBox(
27-
width:
28-
double.tryParse(context.tree.element?.attributes['width'] ?? "") ??
29-
(double.tryParse(
30-
context.tree.element?.attributes['height'] ?? "") ??
31-
150) *
32-
2,
33-
height: double.tryParse(
34-
context.tree.element?.attributes['height'] ?? "") ??
35-
(double.tryParse(context.tree.element?.attributes['width'] ?? "") ??
36-
300) /
37-
2,
38-
child: CssBoxWidget(
39-
style: context.style,
40-
childIsReplaced: true,
41-
child: Directionality(
42-
textDirection: TextDirection.ltr,
43-
child: HtmlElementView(
44-
viewType: createdViewId,
45-
),
12+
class IframeWidget extends StatelessWidget {
13+
14+
final NavigationDelegate? navigationDelegate;
15+
final ExtensionContext extensionContext;
16+
17+
const IframeWidget({
18+
Key? key,
19+
required this.extensionContext,
20+
this.navigationDelegate,
21+
}) : super(key: key);
22+
23+
@override
24+
Widget build(BuildContext context) {
25+
final givenWidth =
26+
double.tryParse(extensionContext.attributes['width'] ?? "");
27+
final givenHeight =
28+
double.tryParse(extensionContext.attributes['height'] ?? "");
29+
final html.IFrameElement iframe = html.IFrameElement()
30+
..width = (givenWidth ?? (givenHeight ?? 150) * 2).toString()
31+
..height = (givenHeight ?? (givenWidth ?? 300) / 2).toString()
32+
..src = extensionContext.attributes['src']
33+
..style.border = 'none';
34+
final String createdViewId = _getRandString(10);
35+
ui.platformViewRegistry.registerViewFactory(createdViewId, (int viewId) => iframe);
36+
return SizedBox(
37+
width:
38+
double.tryParse(extensionContext.attributes['width'] ?? "") ??
39+
(double.tryParse(extensionContext.attributes['height'] ?? "") ?? 150) * 2,
40+
height: double.tryParse(
41+
extensionContext.attributes['height'] ?? "") ??
42+
(double.tryParse(extensionContext.attributes['width'] ?? "") ?? 300) / 2,
43+
child: CssBoxWidget(
44+
style: extensionContext.styledElement!.style,
45+
childIsReplaced: true,
46+
child: Directionality(
47+
textDirection: extensionContext.styledElement!.style.direction!,
48+
child: HtmlElementView(
49+
viewType: createdViewId,
4650
),
4751
),
48-
);
49-
});
52+
),
53+
);
54+
}
55+
56+
}
5057

51-
String getRandString(int len) {
58+
String _getRandString(int len) {
5259
var random = Random.secure();
5360
var values = List<int>.generate(len, (i) => random.nextInt(255));
5461
return base64UrlEncode(values);

packages/flutter_html_iframe/pubspec.yaml

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,7 @@ dependencies:
1212
sdk: flutter
1313
html: '>=0.15.0 <1.0.0'
1414
flutter_html: ^3.0.0-alpha.6
15-
# flutter_html:
16-
# path: ../..
17-
18-
webview_flutter: '>=2.0.4 <4.0.0'
15+
webview_flutter: '>=4.0.0 <5.0.0'
1916

2017
dev_dependencies:
2118
flutter_test:

0 commit comments

Comments
 (0)