Skip to content

Commit

Permalink
fix: fix svg element disposed error when reattach.
Browse files Browse the repository at this point in the history
  • Loading branch information
andycall committed Apr 1, 2024
1 parent bb800a4 commit 63a7a20
Show file tree
Hide file tree
Showing 22 changed files with 56 additions and 138 deletions.
15 changes: 14 additions & 1 deletion webf/lib/src/dom/element.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import 'package:webf/foundation.dart';
import 'package:webf/rendering.dart';
import 'package:webf/src/bridge/native_types.dart';
import 'package:webf/src/svg/rendering/container.dart';
import 'package:webf/svg.dart';
import 'package:webf/widget.dart';
import 'package:webf/src/css/query_selector.dart' as QuerySelector;

Expand Down Expand Up @@ -54,21 +55,25 @@ enum BoxSizeType {
mixin ElementBase on Node {
RenderLayoutBox? _renderLayoutBox;
RenderReplaced? _renderReplaced;
RenderBoxModel? _renderSVG;
RenderWidget? _renderWidget;

RenderBoxModel? get renderBoxModel => _renderLayoutBox ?? _renderReplaced ?? _renderWidget;
RenderBoxModel? get renderBoxModel => _renderLayoutBox ?? _renderReplaced ?? _renderWidget ?? _renderSVG;

set renderBoxModel(RenderBoxModel? value) {
if (value == null) {
_renderReplaced = null;
_renderLayoutBox = null;
_renderWidget = null;
_renderSVG = null;
} else if (value is RenderReplaced) {
_renderReplaced = value;
} else if (value is RenderLayoutBox) {
_renderLayoutBox = value;
} else if (value is RenderWidget) {
_renderWidget = value;
} else if (value is RenderSVGShape || value is RenderSVGContainer) {
_renderSVG = value;
} else {
if (!kReleaseMode) throw FlutterError('Unknown RenderBoxModel value.');
}
Expand Down Expand Up @@ -121,6 +126,8 @@ abstract class Element extends ContainerNode with ElementBase, ElementEventMixin

bool get isWidgetElement => false;

bool get isSVGElement => false;

// Holding reference if this element are managed by Flutter framework.
WebFHTMLElementStatefulWidget? flutterWidget_;
WebFHTMLElementToFlutterElementAdaptor? flutterWidgetElement;
Expand Down Expand Up @@ -362,6 +369,8 @@ abstract class Element extends ContainerNode with ElementBase, ElementEventMixin
} else if (isReplacedElement) {
nextRenderBoxModel =
_createRenderReplaced(isRepaintBoundary: isRepaintBoundary, previousReplaced: _renderReplaced);
} else if (isSVGElement) {
nextRenderBoxModel = createRenderSVG(isRepaintBoundary: isRepaintBoundary, previous: _renderSVG);
} else {
nextRenderBoxModel =
_createRenderLayout(isRepaintBoundary: isRepaintBoundary, previousRenderLayoutBox: _renderLayoutBox);
Expand Down Expand Up @@ -429,6 +438,10 @@ abstract class Element extends ContainerNode with ElementBase, ElementEventMixin
return nextReplaced;
}

RenderBoxModel createRenderSVG({RenderBoxModel? previous, bool isRepaintBoundary = false}) {
throw UnimplementedError();
}

RenderWidget _createRenderWidget({RenderWidget? previousRenderWidget, bool forceUpdate = false }) {
RenderWidget nextReplaced;

Expand Down
16 changes: 3 additions & 13 deletions webf/lib/src/svg/circle.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,12 @@
* Copyright (C) 2022-present The WebF authors. All rights reserved.
*/

import 'package:webf/rendering.dart';
import 'package:webf/svg.dart';

import 'rendering/circle.dart';

class SVGCircleElement extends SVGGeometryElement {
RenderSVGCircle? _renderer;

@override
get renderBoxModel => _renderer;

@override
get presentationAttributeConfigs => super.presentationAttributeConfigs
..addAll([
Expand All @@ -23,13 +19,7 @@ class SVGCircleElement extends SVGGeometryElement {
SVGCircleElement(super.context) {}

@override
createRenderer() {
return _renderer = RenderSVGCircle(renderStyle: renderStyle, element: this);
}

@override
void didDetachRenderer() {
super.didDetachRenderer();
_renderer = null;
RenderBoxModel createRenderSVG({RenderBoxModel? previous, bool isRepaintBoundary = false}) {
return RenderSVGCircle(renderStyle: renderStyle);
}
}
8 changes: 3 additions & 5 deletions webf/lib/src/svg/element.dart
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ class SVGPresentationAttributeConfig {
class SVGElement extends Element {
Map<String, dynamic> attributeStyle = {};

@override
bool get isSVGElement => true;

// Presentation attribute config cache
List<SVGPresentationAttributeConfig>? _presentationAttributesConfigsCache;

Expand Down Expand Up @@ -52,11 +55,6 @@ class SVGElement extends Element {
attributeStyle[property] = value;
}

@override
void updateRenderBoxModel({ bool forceUpdate = false }) {
// do not needs to update
}

@override
void applyAttributeStyle(CSSStyleDeclaration style) {
attributeStyle.forEach((key, value) {
Expand Down
15 changes: 3 additions & 12 deletions webf/lib/src/svg/ellipse.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,12 @@
*/

import 'package:webf/css.dart';
import 'package:webf/rendering.dart';
import 'package:webf/svg.dart';

import 'rendering/ellipse.dart';

class SVGEllipseElement extends SVGGeometryElement {
RenderSVGEllipse? _renderer;

@override
// TODO: implement defaultStyle
Map<String, dynamic> get defaultStyle => super.defaultStyle
Expand All @@ -18,9 +17,6 @@ class SVGEllipseElement extends SVGGeometryElement {
RY: 'auto',
});

@override
get renderBoxModel => _renderer;

@override
get presentationAttributeConfigs => super.presentationAttributeConfigs
..addAll([
Expand All @@ -34,13 +30,8 @@ class SVGEllipseElement extends SVGGeometryElement {
SVGEllipseElement(super.context) {}

@override
createRenderer() {
return _renderer = RenderSVGEllipse(renderStyle: renderStyle, element: this);
RenderBoxModel createRenderSVG({RenderBoxModel? previous, bool isRepaintBoundary = false}) {
return RenderSVGEllipse(renderStyle: renderStyle);
}

@override
void didDetachRenderer() {
super.didDetachRenderer();
_renderer = null;
}
}
16 changes: 3 additions & 13 deletions webf/lib/src/svg/g.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,16 @@
* Copyright (C) 2022-present The WebF authors. All rights reserved.
*/

import 'package:webf/rendering.dart';
import 'package:webf/svg.dart';

import 'rendering/container.dart';

class SVGGElement extends SVGGraphicsElement {
RenderSVGContainer? _renderer;

@override
get renderBoxModel => _renderer;

SVGGElement(super.context) {}

@override
createRenderer() {
return _renderer = RenderSVGContainer(renderStyle: renderStyle, element: this);
}

@override
void didDetachRenderer() {
super.didDetachRenderer();
_renderer = null;
RenderBoxModel createRenderSVG({RenderBoxModel? previous, bool isRepaintBoundary = false}) {
return RenderSVGContainer(renderStyle: renderStyle);
}
}
15 changes: 3 additions & 12 deletions webf/lib/src/svg/line.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,11 @@
* Copyright (C) 2022-present The WebF authors. All rights reserved.
*/

import 'package:webf/rendering.dart';
import 'package:webf/src/svg/rendering/line.dart';
import 'package:webf/svg.dart';

class SVGLineElement extends SVGGeometryElement {
RenderSVGLine? _renderer;

@override
get renderBoxModel => _renderer;

@override
get presentationAttributeConfigs => super.presentationAttributeConfigs
..addAll([
Expand All @@ -23,13 +19,8 @@ class SVGLineElement extends SVGGeometryElement {
SVGLineElement(super.context) {}

@override
createRenderer() {
return _renderer = RenderSVGLine(renderStyle: renderStyle, element: this);
RenderBoxModel createRenderSVG({RenderBoxModel? previous, bool isRepaintBoundary = false}) {
return RenderSVGLine(renderStyle: renderStyle);
}

@override
void didDetachRenderer() {
super.didDetachRenderer();
_renderer = null;
}
}
15 changes: 3 additions & 12 deletions webf/lib/src/svg/path.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,30 +3,21 @@
*/

import 'package:flutter/rendering.dart';
import 'package:webf/rendering.dart';
import 'package:webf/svg.dart';

import 'rendering/path.dart';

class SVGPathElement extends SVGGeometryElement {
RenderSVGPath? _renderer;

@override
get renderBoxModel => _renderer;

@override
get presentationAttributeConfigs => super.presentationAttributeConfigs
..addAll([SVGPresentationAttributeConfig('d')]);

SVGPathElement(super.context) {}

@override
RenderBox createRenderer() {
return _renderer = RenderSVGPath(renderStyle: renderStyle, element: this);
RenderBoxModel createRenderSVG({RenderBoxModel? previous, bool isRepaintBoundary = false}) {
return RenderSVGPath(renderStyle: renderStyle);
}

@override
void didDetachRenderer() {
super.didDetachRenderer();
_renderer = null;
}
}
16 changes: 3 additions & 13 deletions webf/lib/src/svg/rect.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,11 @@
* Copyright (C) 2022-present The WebF authors. All rights reserved.
*/

import 'package:webf/rendering.dart';
import 'package:webf/svg.dart';
import 'rendering/rect.dart';

class SVGRectElement extends SVGGeometryElement {
RenderSVGRect? _renderer;

@override
get renderBoxModel => _renderer;

@override
get presentationAttributeConfigs => super.presentationAttributeConfigs
..addAll([
Expand All @@ -25,13 +21,7 @@ class SVGRectElement extends SVGGeometryElement {
SVGRectElement(super.context) {}

@override
createRenderer() {
return _renderer = RenderSVGRect(renderStyle: renderStyle, element: this);
}

@override
void didDetachRenderer() {
super.didDetachRenderer();
_renderer = null;
RenderBoxModel createRenderSVG({RenderBoxModel? previous, bool isRepaintBoundary = false}) {
return RenderSVGRect(renderStyle: renderStyle);
}
}
2 changes: 1 addition & 1 deletion webf/lib/src/svg/rendering/circle.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import 'dart:ui';
import 'shape.dart';

class RenderSVGCircle extends RenderSVGShape {
RenderSVGCircle({required super.renderStyle, super.element});
RenderSVGCircle({required super.renderStyle});

@override
Path asPath() {
Expand Down
4 changes: 1 addition & 3 deletions webf/lib/src/svg/rendering/container.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,7 @@ class RenderSVGContainer extends RenderBoxModel
with
ContainerRenderObjectMixin<RenderBox,
ContainerBoxParentData<RenderBox>> {
final SVGElement? element;

RenderSVGContainer({required super.renderStyle, this.element});
RenderSVGContainer({required super.renderStyle});

@override
double? computeDistanceToActualBaseline(TextBaseline baseline) {
Expand Down
2 changes: 1 addition & 1 deletion webf/lib/src/svg/rendering/ellipse.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import 'dart:ui';
import 'shape.dart';

class RenderSVGEllipse extends RenderSVGShape {
RenderSVGEllipse({required super.renderStyle, super.element});
RenderSVGEllipse({required super.renderStyle});

@override
Path asPath() {
Expand Down
2 changes: 1 addition & 1 deletion webf/lib/src/svg/rendering/empty.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import 'container.dart';

// don't render anything
class RenderSVGEmpty extends RenderSVGContainer {
RenderSVGEmpty({required super.renderStyle, super.element});
RenderSVGEmpty({required super.renderStyle});

@override
void performLayout() {
Expand Down
2 changes: 1 addition & 1 deletion webf/lib/src/svg/rendering/line.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import 'package:webf/src/svg/rendering/shape.dart';

// https://developer.mozilla.org/en-US/docs/Web/SVG/Element/line
class RenderSVGLine extends RenderSVGShape{
RenderSVGLine({required super.renderStyle,super.element});
RenderSVGLine({required super.renderStyle});

@override
Path asPath() {
Expand Down
2 changes: 1 addition & 1 deletion webf/lib/src/svg/rendering/path.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import 'dart:ui';
import 'shape.dart';

class RenderSVGPath extends RenderSVGShape {
RenderSVGPath({required super.renderStyle, super.element});
RenderSVGPath({required super.renderStyle});

@override
Path asPath() {
Expand Down
2 changes: 1 addition & 1 deletion webf/lib/src/svg/rendering/rect.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import 'dart:ui';
import 'shape.dart';

class RenderSVGRect extends RenderSVGShape {
RenderSVGRect({required super.renderStyle, super.element});
RenderSVGRect({required super.renderStyle});

@override
Path asPath() {
Expand Down
1 change: 0 additions & 1 deletion webf/lib/src/svg/rendering/root.dart
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ class RenderSVGRoot extends RenderSVGContainer {

RenderSVGRoot({
required super.renderStyle,
super.element,
Rect? viewBox,
SVGPreserveAspectRatio ratio = const SVGPreserveAspectRatio(),
}) : _viewBox = viewBox,
Expand Down
3 changes: 0 additions & 3 deletions webf/lib/src/svg/rendering/shape.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,8 @@ import 'package:webf/svg.dart';
abstract class RenderSVGShape extends RenderBoxModel {
bool _needUpdateShape = true;

SVGGeometryElement? element;

RenderSVGShape({
required super.renderStyle,
this.element,
});

Path? _path;
Expand Down
4 changes: 1 addition & 3 deletions webf/lib/src/svg/rendering/text.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,9 @@ import 'package:webf/rendering.dart';
import 'package:webf/svg.dart';

class RenderSVGText extends RenderBoxModel with RenderObjectWithChildMixin<RenderTextBox> {
SVGTextElement? element;

var _baseline = 0.0;

RenderSVGText({required super.renderStyle, this.element});
RenderSVGText({required super.renderStyle});

@override
double? computeDistanceToActualBaseline(TextBaseline baseline) {
Expand Down
Loading

0 comments on commit 63a7a20

Please sign in to comment.