@@ -7,6 +7,7 @@ use lol_html::{
7
7
ElementContentHandlers as NativeElementContentHandlers , HtmlRewriter as NativeHTMLRewriter ,
8
8
OutputSink , Selector , Settings ,
9
9
} ;
10
+ use std:: borrow:: Cow ;
10
11
11
12
struct JsOutputSink ( JsFunction ) ;
12
13
@@ -27,6 +28,7 @@ impl OutputSink for JsOutputSink {
27
28
}
28
29
}
29
30
31
+ //noinspection RsTypeCheck
30
32
fn rewriting_error_to_js ( err : RewritingError ) -> JsValue {
31
33
match err {
32
34
RewritingError :: ContentHandlerError ( err) => err. downcast :: < HandlerJsErrorWrap > ( ) . unwrap ( ) . 0 ,
@@ -41,23 +43,22 @@ pub struct HTMLRewriter {
41
43
element_content_handlers : Vec < NativeElementContentHandlers < ' static > > ,
42
44
document_content_handlers : Vec < NativeDocumentContentHandlers < ' static > > ,
43
45
output_sink : Option < JsOutputSink > ,
44
- encoding : String ,
45
46
inner : Option < NativeHTMLRewriter < ' static , JsOutputSink > > ,
47
+ inner_constructed : bool ,
46
48
}
47
49
48
50
#[ wasm_bindgen]
49
51
impl HTMLRewriter {
50
52
#[ wasm_bindgen( constructor) ]
51
- pub fn new ( encoding : String , output_sink : & JsFunction ) -> Self {
53
+ pub fn new ( output_sink : & JsFunction ) -> Self {
52
54
HTMLRewriter {
53
55
output_sink : Some ( JsOutputSink :: new ( output_sink) ) ,
54
- encoding,
55
56
..Self :: default ( )
56
57
}
57
58
}
58
59
59
60
fn assert_not_fully_constructed ( & self ) -> JsResult < ( ) > {
60
- if self . inner . is_some ( ) {
61
+ if self . inner_constructed {
61
62
Err ( "Handlers can't be added after write." . into ( ) )
62
63
} else {
63
64
Ok ( ( ) )
@@ -69,28 +70,23 @@ impl HTMLRewriter {
69
70
Some ( ref mut inner) => inner,
70
71
None => {
71
72
let output_sink = self . output_sink . take ( ) . unwrap ( ) ;
72
- // NOTE: selector are passed by reference to the rewriter ctor, though they
73
- // are not stored in the rewriter, so we need their references to be valid
74
- // only during the rewriter invocation.
75
- let selectors: Vec < _ > = self . selectors . drain ( ..) . collect ( ) ;
76
73
77
74
let settings = Settings {
78
75
element_content_handlers : self
79
- . element_content_handlers
76
+ . selectors
80
77
. drain ( ..)
81
- . enumerate ( )
82
- . map ( |( i , h) | ( & selectors [ i ] , h) )
78
+ . zip ( self . element_content_handlers . drain ( .. ) )
79
+ . map ( |( selector , h) | ( Cow :: Owned ( selector ) , h) )
83
80
. collect ( ) ,
84
81
85
82
document_content_handlers : self . document_content_handlers . drain ( ..) . collect ( ) ,
86
- encoding : & self . encoding ,
87
83
..Settings :: default ( )
88
84
} ;
89
85
90
- let rewriter =
91
- NativeHTMLRewriter :: try_new ( settings, output_sink) . into_js_result ( ) ?;
86
+ let rewriter = NativeHTMLRewriter :: new ( settings, output_sink) ;
92
87
93
88
self . inner = Some ( rewriter) ;
89
+ self . inner_constructed = true ;
94
90
95
91
self . inner . as_mut ( ) . unwrap ( )
96
92
}
@@ -123,6 +119,12 @@ impl HTMLRewriter {
123
119
}
124
120
125
121
pub fn end ( & mut self ) -> JsResult < ( ) > {
126
- self . inner_mut ( ) ?. end ( ) . map_err ( rewriting_error_to_js)
122
+ self . inner_mut ( ) ?;
123
+ // Rewriter must be constructed by self.inner_mut()
124
+ self . inner
125
+ . take ( )
126
+ . unwrap ( )
127
+ . end ( )
128
+ . map_err ( rewriting_error_to_js)
127
129
}
128
130
}
0 commit comments