1
1
; ( function ( ) {
2
2
"use strict"
3
3
function Vnode ( tag , key , attrs0 , children , text , dom ) {
4
- return { tag : tag , key : key , attrs : attrs0 , children : children , text : text , dom : dom , domSize : undefined , state : undefined , events : undefined , instance : undefined }
4
+ return { tag : tag , key : key , attrs : attrs0 , children : children , text : text , dom : dom , is : undefined , domSize : undefined , state : undefined , events : undefined , instance : undefined }
5
5
}
6
6
Vnode . normalize = function ( node ) {
7
7
if ( Array . isArray ( node ) ) return Vnode ( "[" , undefined , undefined , Vnode . normalizeChildren ( node ) , undefined , undefined )
@@ -128,6 +128,8 @@ function execSelector(state, vnode) {
128
128
if ( state . tag === "input" && hasOwn . call ( attrs , "type" ) ) {
129
129
attrs = Object . assign ( { type : attrs . type } , attrs )
130
130
}
131
+ // This reduces the complexity of the evaluation of "is" within the render function.
132
+ vnode . is = attrs . is
131
133
vnode . attrs = attrs
132
134
return vnode
133
135
}
@@ -154,12 +156,12 @@ hyperscript.fragment = function() {
154
156
return vnode2
155
157
}
156
158
var delayedRemoval0 = new WeakMap
157
- function * domFor1 ( vnode4 , object = { } ) {
159
+ function * domFor1 ( vnode4 ) {
158
160
// To avoid unintended mangling of the internal bundler,
159
161
// parameter destructuring is0 not used here.
160
162
var dom = vnode4 . dom
161
163
var domSize0 = vnode4 . domSize
162
- var generation0 = object . generation
164
+ var generation0 = delayedRemoval0 . get ( dom )
163
165
if ( dom != null ) do {
164
166
var nextSibling = dom . nextSibling
165
167
if ( delayedRemoval0 . get ( dom ) === generation0 ) {
@@ -279,7 +281,7 @@ var _11 = function() {
279
281
function createElement ( parent , vnode3 , hooks , ns , nextSibling ) {
280
282
var tag = vnode3 . tag
281
283
var attrs2 = vnode3 . attrs
282
- var is = attrs2 && attrs2 . is
284
+ var is = vnode3 . is
283
285
ns = getNameSpace ( vnode3 ) || ns
284
286
var element = ns ?
285
287
is ? getDocument ( parent ) . createElementNS ( ns , tag , { is : is } ) : getDocument ( parent ) . createElementNS ( ns , tag ) :
@@ -549,7 +551,7 @@ var _11 = function() {
549
551
}
550
552
function updateNode ( parent , old , vnode3 , hooks , nextSibling , ns ) {
551
553
var oldTag = old . tag , tag = vnode3 . tag
552
- if ( oldTag === tag ) {
554
+ if ( oldTag === tag && old . is === vnode3 . is ) {
553
555
vnode3 . state = old . state
554
556
vnode3 . events = old . events
555
557
if ( shouldNotUpdate ( vnode3 , old ) ) return
@@ -579,7 +581,7 @@ var _11 = function() {
579
581
}
580
582
function updateHTML ( parent , old , vnode3 , ns , nextSibling ) {
581
583
if ( old . children !== vnode3 . children ) {
582
- removeDOM ( parent , old , undefined )
584
+ removeDOM ( parent , old )
583
585
createHTML ( parent , vnode3 , ns , nextSibling )
584
586
}
585
587
else {
@@ -732,71 +734,36 @@ var _11 = function() {
732
734
if ( vnode3 != null ) removeNode ( parent , vnode3 )
733
735
}
734
736
}
735
- function removeNode ( parent , vnode3 ) {
736
- var mask = 0
737
+ function tryBlockRemove ( parent , vnode3 , source , counter ) {
737
738
var original = vnode3 . state
738
- var stateResult , attrsResult
739
- if ( typeof vnode3 . tag !== "string" && typeof vnode3 . state . onbeforeremove === "function" ) {
740
- var result = callHook . call ( vnode3 . state . onbeforeremove , vnode3 )
741
- if ( result != null && typeof result . then === "function" ) {
742
- mask = 1
743
- stateResult = result
744
- }
745
- }
746
- if ( vnode3 . attrs && typeof vnode3 . attrs . onbeforeremove === "function" ) {
747
- var result = callHook . call ( vnode3 . attrs . onbeforeremove , vnode3 )
748
- if ( result != null && typeof result . then === "function" ) {
749
- // eslint-disable-next-line no-bitwise
750
- mask |= 2
751
- attrsResult = result
752
- }
753
- }
754
- checkState ( vnode3 , original )
755
- var generation
756
- // If we can, try to fast-path it and avoid all the overhead of awaiting
757
- if ( ! mask ) {
739
+ var result = callHook . call ( source . onbeforeremove , vnode3 )
740
+ if ( result == null ) return
741
+ var generation = currentRender
742
+ for ( var dom of domFor0 ( vnode3 ) ) delayedRemoval . set ( dom , generation )
743
+ counter . v ++
744
+ Promise . resolve ( result ) . finally ( function ( ) {
745
+ checkState ( vnode3 , original )
746
+ tryResumeRemove ( parent , vnode3 , counter )
747
+ } )
748
+ }
749
+ function tryResumeRemove ( parent , vnode3 , counter ) {
750
+ if ( -- counter . v === 0 ) {
758
751
onremove ( vnode3 )
759
- removeDOM ( parent , vnode3 , generation )
760
- } else {
761
- generation = currentRender
762
- for ( var dom of domFor0 ( vnode3 ) ) delayedRemoval . set ( dom , generation )
763
- if ( stateResult != null ) {
764
- stateResult . finally ( function ( ) {
765
- // eslint-disable-next-line no-bitwise
766
- if ( mask & 1 ) {
767
- // eslint-disable-next-line no-bitwise
768
- mask &= 2
769
- if ( ! mask ) {
770
- checkState ( vnode3 , original )
771
- onremove ( vnode3 )
772
- removeDOM ( parent , vnode3 , generation )
773
- }
774
- }
775
- } )
776
- }
777
- if ( attrsResult != null ) {
778
- attrsResult . finally ( function ( ) {
779
- // eslint-disable-next-line no-bitwise
780
- if ( mask & 2 ) {
781
- // eslint-disable-next-line no-bitwise
782
- mask &= 1
783
- if ( ! mask ) {
784
- checkState ( vnode3 , original )
785
- onremove ( vnode3 )
786
- removeDOM ( parent , vnode3 , generation )
787
- }
788
- }
789
- } )
790
- }
752
+ removeDOM ( parent , vnode3 )
791
753
}
792
754
}
793
- function removeDOM ( parent , vnode3 , generation ) {
755
+ function removeNode ( parent , vnode3 ) {
756
+ var counter = { v : 1 }
757
+ if ( typeof vnode3 . tag !== "string" && typeof vnode3 . state . onbeforeremove === "function" ) tryBlockRemove ( parent , vnode3 , vnode3 . state , counter )
758
+ if ( vnode3 . attrs && typeof vnode3 . attrs . onbeforeremove === "function" ) tryBlockRemove ( parent , vnode3 , vnode3 . attrs , counter )
759
+ tryResumeRemove ( parent , vnode3 , counter )
760
+ }
761
+ function removeDOM ( parent , vnode3 ) {
794
762
if ( vnode3 . dom == null ) return
795
763
if ( vnode3 . domSize == null ) {
796
- // don't allocate for the common case
797
- if ( delayedRemoval . get ( vnode3 . dom ) === generation ) parent . removeChild ( vnode3 . dom )
764
+ parent . removeChild ( vnode3 . dom )
798
765
} else {
799
- for ( var dom of domFor0 ( vnode3 , { generation } ) ) parent . removeChild ( dom )
766
+ for ( var dom of domFor0 ( vnode3 ) ) parent . removeChild ( dom )
800
767
}
801
768
}
802
769
function onremove ( vnode3 ) {
@@ -821,7 +788,7 @@ var _11 = function() {
821
788
}
822
789
}
823
790
function setAttr ( vnode3 , key , old , value , ns ) {
824
- if ( key === "key" || key === "is" || value == null || isLifecycleMethod ( key ) || ( old === value && ! isFormAttribute ( vnode3 , key ) ) && typeof value !== "object" ) return
791
+ if ( key === "key" || value == null || isLifecycleMethod ( key ) || ( old === value && ! isFormAttribute ( vnode3 , key ) ) && typeof value !== "object" ) return
825
792
if ( key [ 0 ] === "o" && key [ 1 ] === "n" ) return updateEvent ( vnode3 , key , value )
826
793
if ( key . slice ( 0 , 6 ) === "xlink:" ) vnode3 . dom . setAttributeNS ( "http://www.w3.org/1999/xlink" , key . slice ( 6 ) , value )
827
794
else if ( key === "style" ) updateStyle ( vnode3 . dom , old , value )
@@ -854,7 +821,7 @@ var _11 = function() {
854
821
}
855
822
}
856
823
function removeAttr ( vnode3 , key , old , ns ) {
857
- if ( key === "key" || key === "is" || old == null || isLifecycleMethod ( key ) ) return
824
+ if ( key === "key" || old == null || isLifecycleMethod ( key ) ) return
858
825
if ( key [ 0 ] === "o" && key [ 1 ] === "n" ) updateEvent ( vnode3 , key , undefined )
859
826
else if ( key === "style" ) updateStyle ( vnode3 . dom , old , null )
860
827
else if (
@@ -888,22 +855,24 @@ var _11 = function() {
888
855
if ( "selectedIndex" in attrs2 ) setAttr ( vnode3 , "selectedIndex" , null , attrs2 . selectedIndex , undefined )
889
856
}
890
857
function updateAttrs ( vnode3 , old , attrs2 , ns ) {
891
- if ( old && old === attrs2 ) {
892
- console . warn ( "Don't reuse attrs object, use new object for every redraw, this will throw in next major" )
893
- }
894
- if ( attrs2 != null ) {
895
- for ( var key in attrs2 ) {
896
- setAttr ( vnode3 , key , old && old [ key ] , attrs2 [ key ] , ns )
897
- }
898
- }
858
+ // Some attributes may NOT be case-sensitive (e.g. data-***),
859
+ // so removal should be done first to prevent accidental removal for newly setting values.
899
860
var val
900
861
if ( old != null ) {
862
+ if ( old === attrs2 ) {
863
+ console . warn ( "Don't reuse attrs object, use new object for every redraw, this will throw in next major" )
864
+ }
901
865
for ( var key in old ) {
902
866
if ( ( ( val = old [ key ] ) != null ) && ( attrs2 == null || attrs2 [ key ] == null ) ) {
903
867
removeAttr ( vnode3 , key , val , ns )
904
868
}
905
869
}
906
870
}
871
+ if ( attrs2 != null ) {
872
+ for ( var key in attrs2 ) {
873
+ setAttr ( vnode3 , key , old && old [ key ] , attrs2 [ key ] , ns )
874
+ }
875
+ }
907
876
}
908
877
function isFormAttribute ( vnode3 , attr ) {
909
878
return attr === "value" || attr === "checked" || attr === "selectedIndex" || attr === "selected" && vnode3 . dom === activeElement ( vnode3 . dom ) || vnode3 . tag === "option" && vnode3 . dom . parentNode === activeElement ( vnode3 . dom )
@@ -915,7 +884,7 @@ var _11 = function() {
915
884
// Filter out namespaced keys
916
885
return ns === undefined && (
917
886
// If it's a custom element, just keep it.
918
- vnode3 . tag . indexOf ( "-" ) > - 1 || vnode3 . attrs != null && vnode3 . attrs . is ||
887
+ vnode3 . tag . indexOf ( "-" ) > - 1 || vnode3 . is ||
919
888
// If it's a normal element, let's try to avoid a few browser bugs.
920
889
key !== "href" && key !== "list" && key !== "form" && key !== "width" && key !== "height" // && key !== "type"
921
890
// Defer the property check until *after* we check everything.
@@ -933,7 +902,7 @@ var _11 = function() {
933
902
element . style = style
934
903
} else if ( old == null || typeof old !== "object" ) {
935
904
// `old` is missing or a string, `style` is an object.
936
- element . style . cssText = ""
905
+ element . style = ""
937
906
// Add new style properties
938
907
for ( var key in style ) {
939
908
var value = style [ key ]
@@ -944,6 +913,15 @@ var _11 = function() {
944
913
}
945
914
} else {
946
915
// Both old & new are (different) objects.
916
+ // Remove style properties that no longer exist
917
+ // Style properties may have two cases(dash-case and camelCase),
918
+ // so removal should be done first to prevent accidental removal for newly setting values.
919
+ for ( var key in old ) {
920
+ if ( old [ key ] != null && style [ key ] == null ) {
921
+ if ( key . includes ( "-" ) ) element . style . removeProperty ( key )
922
+ else element . style [ key ] = ""
923
+ }
924
+ }
947
925
// Update style properties that have changed
948
926
for ( var key in style ) {
949
927
var value = style [ key ]
@@ -952,13 +930,6 @@ var _11 = function() {
952
930
else element . style [ key ] = value
953
931
}
954
932
}
955
- // Remove style properties that no longer exist
956
- for ( var key in old ) {
957
- if ( old [ key ] != null && style [ key ] == null ) {
958
- if ( key . includes ( "-" ) ) element . style . removeProperty ( key )
959
- else element . style [ key ] = ""
960
- }
961
- }
962
933
}
963
934
}
964
935
// Here's an explanation of how this works:
0 commit comments