瀏覽代碼

Merge remote-tracking branch 'upstream/master' into fix_hot_reloading_svg_attributes

Evan Almloff 3 年之前
父節點
當前提交
ab533864db
共有 4 個文件被更改,包括 95 次插入14 次删除
  1. 1 1
      packages/core/src/diff.rs
  2. 6 7
      packages/rsx_interpreter/src/lib.rs
  3. 12 6
      packages/rsx_interpreter/tests/render.rs
  4. 76 0
      tests/diffing.rs

+ 1 - 1
packages/core/src/diff.rs

@@ -402,12 +402,12 @@ impl<'b> DiffState<'b> {
 
         if old.listeners.len() == new.listeners.len() {
             for (old_l, new_l) in old.listeners.iter().zip(new.listeners.iter()) {
+                new_l.mounted_node.set(old_l.mounted_node.get());
                 if old_l.event != new_l.event {
                     self.mutations
                         .remove_event_listener(old_l.event, root.as_u64());
                     self.mutations.new_event_listener(new_l, cur_scope_id);
                 }
-                new_l.mounted_node.set(old_l.mounted_node.get());
             }
         } else {
             for listener in old.listeners {

+ 6 - 7
packages/rsx_interpreter/src/lib.rs

@@ -24,7 +24,8 @@ lazy_static! {
 // the location of the code relative to the current crate based on [std::panic::Location]
 #[derive(Debug, Clone, Hash, PartialEq, Eq, Serialize, Deserialize)]
 pub struct CodeLocation {
-    pub file: String,
+    pub crate_path: String,
+    pub file_path: String,
     pub line: u32,
     pub column: u32,
 }
@@ -83,14 +84,12 @@ macro_rules! get_line_num {
     () => {{
         let line = line!();
         let column = column!();
-        let file = file!();
+        let file_path = file!().to_string();
+        let crate_path = env!("CARGO_MANIFEST_DIR").to_string();
 
-        #[cfg(windows)]
-        let file = env!("CARGO_MANIFEST_DIR").to_string() + "\\" + file!();
-        #[cfg(unix)]
-        let file = env!("CARGO_MANIFEST_DIR").to_string() + "/" + file!();
         CodeLocation {
-            file: file.to_string(),
+            crate_path,
+            file_path,
             line: line,
             column: column,
         }

+ 12 - 6
packages/rsx_interpreter/tests/render.rs

@@ -10,7 +10,8 @@ fn render_basic() {
     let dom = VirtualDom::new(Base);
     let static_vnodes = rsx!(div{"hello world"});
     let location = CodeLocation {
-        file: String::new(),
+        file_path: String::new(),
+        crate_path: String::new(),
         line: 0,
         column: 0,
     };
@@ -55,7 +56,8 @@ fn render_nested() {
         }
     };
     let location = CodeLocation {
-        file: String::new(),
+        file_path: String::new(),
+        crate_path: String::new(),
         line: 1,
         column: 0,
     };
@@ -106,7 +108,8 @@ fn render_component() {
         }
     };
     let location = CodeLocation {
-        file: String::new(),
+        file_path: String::new(),
+        crate_path: String::new(),
         line: 2,
         column: 0,
     };
@@ -157,7 +160,8 @@ fn render_iterator() {
         }
     };
     let location = CodeLocation {
-        file: String::new(),
+        file_path: String::new(),
+        crate_path: String::new(),
         line: 3,
         column: 0,
     };
@@ -210,7 +214,8 @@ fn render_captured_variable() {
         }
     };
     let location = CodeLocation {
-        file: String::new(),
+        file_path: String::new(),
+        crate_path: String::new(),
         line: 4,
         column: 0,
     };
@@ -261,7 +266,8 @@ fn render_listener() {
         }
     };
     let location = CodeLocation {
-        file: String::new(),
+        file_path: String::new(),
+        crate_path: String::new(),
         line: 5,
         column: 0,
     };

+ 76 - 0
tests/diffing.rs

@@ -756,3 +756,79 @@ fn add_nested_elements() {
         ]
     );
 }
+
+#[test]
+fn add_listeners() {
+    let vdom = new_dom();
+
+    let (_create, change) = vdom.diff_lazynodes(
+        rsx! {
+            div{}
+        },
+        rsx! {
+            div{
+                onkeyup: |_| {},
+                onkeydown: |_| {},
+            }
+        },
+    );
+
+    assert_eq!(
+        change.edits,
+        [
+            NewEventListener { event_name: "keyup", scope: ScopeId(0), root: 1 },
+            NewEventListener { event_name: "keydown", scope: ScopeId(0), root: 1 },
+        ]
+    );
+}
+
+#[test]
+fn remove_listeners() {
+    let vdom = new_dom();
+
+    let (_create, change) = vdom.diff_lazynodes(
+        rsx! {
+            div{
+                onkeyup: |_| {},
+                onkeydown: |_| {},
+            }
+        },
+        rsx! {
+            div{}
+        },
+    );
+
+    assert_eq!(
+        change.edits,
+        [
+            RemoveEventListener { event: "keyup", root: 1 },
+            RemoveEventListener { event: "keydown", root: 1 },
+        ]
+    );
+}
+
+#[test]
+fn diff_listeners() {
+    let vdom = new_dom();
+
+    let (_create, change) = vdom.diff_lazynodes(
+        rsx! {
+            div{
+                onkeydown: |_| {},
+            }
+        },
+        rsx! {
+            div{
+                onkeyup: |_| {},
+            }
+        },
+    );
+
+    assert_eq!(
+        change.edits,
+        [
+            RemoveEventListener { root: 1, event: "keydown" },
+            NewEventListener { event_name: "keyup", scope: ScopeId(0), root: 1 }
+        ]
+    );
+}