From 13a0bbb502f96efe8babf3eb337c38b1deb4ade9 Mon Sep 17 00:00:00 2001 From: yxping Date: Sun, 11 Nov 2018 19:12:56 +0800 Subject: [PATCH 1/2] [core][eagle] fix event params --- .../com/taobao/weex/common/IWXBridge.java | 2 -- .../jniprebuild/jniheader/WXBridge_jni.h | 4 ++- weex_core/Source/android/wrap/wx_bridge.cpp | 13 +++++--- .../vnode/android/vnode_on_event_listener.cc | 32 ++++++++++++++----- .../Source/core/data_render/vnode/vnode.cc | 5 +-- .../Source/core/data_render/vnode/vnode.h | 4 ++- .../vnode/vnode_on_event_listener.h | 21 ++---------- .../data_render/vnode/vnode_render_manager.cc | 4 +-- .../data_render/vnode/vnode_render_manager.h | 2 +- 9 files changed, 46 insertions(+), 41 deletions(-) diff --git a/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java b/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java index c998fe5da1..99150268b8 100644 --- a/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java +++ b/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java @@ -198,6 +198,4 @@ int callUpdateAttrs(String instanceId, String ref, void resetWXBridge(boolean remoteDebug); - void fireEventOnDataRenderNode(String instanceId, String ref, String type, String data); - } diff --git a/weex_core/Source/android/jniprebuild/jniheader/WXBridge_jni.h b/weex_core/Source/android/jniprebuild/jniheader/WXBridge_jni.h index 46da177daa..bf3aa5c451 100644 --- a/weex_core/Source/android/jniprebuild/jniheader/WXBridge_jni.h +++ b/weex_core/Source/android/jniprebuild/jniheader/WXBridge_jni.h @@ -77,7 +77,8 @@ static void FireEventOnDataRenderNode(JNIEnv* env, jobject jcaller, jstring instanceId, jstring ref, jstring type, - jstring data); + jstring data, + jstring domChanges); static void RegisterModuleOnDataRenderNode(JNIEnv* env, jobject jcaller, jstring data); @@ -991,6 +992,7 @@ static const JNINativeMethod kMethodsWXBridge[] = { "Ljava/lang/String;" "Ljava/lang/String;" "Ljava/lang/String;" +"Ljava/lang/String;" ")" "V", reinterpret_cast(FireEventOnDataRenderNode) }, { "nativeRegisterModuleOnDataRenderNode", diff --git a/weex_core/Source/android/wrap/wx_bridge.cpp b/weex_core/Source/android/wrap/wx_bridge.cpp index e783eeeb13..9ba5ff4d61 100644 --- a/weex_core/Source/android/wrap/wx_bridge.cpp +++ b/weex_core/Source/android/wrap/wx_bridge.cpp @@ -582,7 +582,9 @@ static jstring ExecJSOnInstance(JNIEnv* env, jobject jcaller, } static void FireEventOnDataRenderNode(JNIEnv* env, jobject jcaller, - jstring instanceId, jstring ref, jstring type, jstring data) { + jstring instanceId, jstring ref, + jstring type, jstring data, + jstring domChanges) { if (instanceId == NULL || ref == NULL || type == NULL || data == NULL) { return; } @@ -591,13 +593,14 @@ static void FireEventOnDataRenderNode(JNIEnv* env, jobject jcaller, ScopedJStringUTF8 refChar(env, ref); ScopedJStringUTF8 typeChar(env, type); ScopedJStringUTF8 dataChar(env, data); + ScopedJStringUTF8 domChangesChar(env, domChanges); try { weex::core::data_render::VNodeRenderManager::GetInstance()->FireEvent( - idChar.getChars(), refChar.getChars(), typeChar.getChars(), dataChar.getChars() - ); - } catch (std::exception &e) { - auto error = static_cast(&e); + idChar.getChars(), refChar.getChars(), typeChar.getChars(), + dataChar.getChars(), domChangesChar.getChars()); + } catch (std::exception& e) { + auto error = static_cast(&e); if (error) { LOGE("Error on FireEventOnDataRenderNode %s", error->what()); } diff --git a/weex_core/Source/core/data_render/vnode/android/vnode_on_event_listener.cc b/weex_core/Source/core/data_render/vnode/android/vnode_on_event_listener.cc index 9afa37aa7d..19c0d5bbc5 100644 --- a/weex_core/Source/core/data_render/vnode/android/vnode_on_event_listener.cc +++ b/weex_core/Source/core/data_render/vnode/android/vnode_on_event_listener.cc @@ -38,13 +38,14 @@ static const char* kKeyParams = "params"; void VNodeOnEventListener::OnEvent(VNode* node, const std::string& event, const std::string& json_args, + const std::string dom_changes, const VNode::Params& param_list) { auto page_id = node->component()->exec_state()->context()->page_id(); std::vector params; // page_id params.push_back(Conversion::GenValueWithType(page_id.c_str())); - // args -> { method: 'fireEvent', args: [ref, event, args ,{params: [...]}] } + // args -> { method: 'fireEvent', args: [ref, "nodeEvent", args , domChanges, {params: [ {"templateId": templateId, "componentId": id, "type": type, "params" : [...]} ]}] } VALUE_WITH_TYPE* args = getValueWithTypePtr(); args->type = ParamsType::JSONSTRING; std::vector args_object_list; @@ -53,18 +54,33 @@ void VNodeOnEventListener::OnEvent(VNode* node, const std::string& event, args_object.insert({kKeyMethod, kMethodFireEvent}); std::vector args_in_args_object; - // nodeId - args_in_args_object.push_back(node->render_object_ref()); - // event - args_in_args_object.push_back(event); + // ref TODO make sure the difference between node id and ref + args_in_args_object.push_back(node->node_id()); + // type -> "nodeEvent" + args_in_args_object.push_back("nodeEvent"); // args std::string error; args_in_args_object.push_back(json11::Json::parse(json_args, error)); - // params + // domChanges + args_in_args_object.push_back(json11::Json::parse(dom_changes, error)); + // params -> [ {"templateId": templateId, "componentId": id, "type": type, "params" : [...]} ] std::map params_object; std::vector array_in_params_object; - for (auto it = param_list.begin(); it != param_list.end(); it++) { - array_in_params_object.push_back(Conversion::GenJSON(&*it)); + { + std::map inner_object; + // templateId + inner_object.insert({"templateId", node->component()->template_id()}); + // componentId + inner_object.insert({"componentId", node->component()->id()}); + // type + inner_object.insert({"type", event}); + // params + std::vector array_in_inner_object; + for (auto it = param_list.begin(); it != param_list.end(); it++) { + array_in_inner_object.push_back(Conversion::GenJSON(&*it)); + } + inner_object.insert({kKeyParams, array_in_inner_object}); + array_in_params_object.push_back(inner_object); } params_object.insert({kKeyParams, array_in_params_object}); args_in_args_object.push_back(params_object); diff --git a/weex_core/Source/core/data_render/vnode/vnode.cc b/weex_core/Source/core/data_render/vnode/vnode.cc index 33895261cb..d554f72420 100644 --- a/weex_core/Source/core/data_render/vnode/vnode.cc +++ b/weex_core/Source/core/data_render/vnode/vnode.cc @@ -62,14 +62,15 @@ VNode::~VNode() { } } -void VNode::OnEvent(const std::string &event, const std::string args) { +void VNode::OnEvent(const std::string &event, const std::string args, + const std::string dom_changes) { if (!on_event_listener_) return; auto it = event_params_map_->find(event); if (it == event_params_map_->end()) return; auto params_list = it->second; for (auto it = params_list.begin(); it != params_list.end(); it++) { - on_event_listener_->OnEvent(this, event, args, *it); + on_event_listener_->OnEvent(this, event, args, dom_changes, *it); } } diff --git a/weex_core/Source/core/data_render/vnode/vnode.h b/weex_core/Source/core/data_render/vnode/vnode.h index d7ad64a2f2..44931911a1 100644 --- a/weex_core/Source/core/data_render/vnode/vnode.h +++ b/weex_core/Source/core/data_render/vnode/vnode.h @@ -44,6 +44,7 @@ class VNode { ~OnEventListener() {} virtual void OnEvent(VNode *node, const std::string &event, const std::string &json_args, + const std::string dom_changes, const Params ¶ms) = 0; }; @@ -102,7 +103,8 @@ class VNode { return event_params_map_.get(); } - void OnEvent(const std::string& event, const std::string args); + void OnEvent(const std::string &event, const std::string args, + const std::string dom_changes); inline void set_on_event_listener(std::unique_ptr listener) { on_event_listener_ = std::move(listener); diff --git a/weex_core/Source/core/data_render/vnode/vnode_on_event_listener.h b/weex_core/Source/core/data_render/vnode/vnode_on_event_listener.h index f11801d921..3c974ab0fd 100644 --- a/weex_core/Source/core/data_render/vnode/vnode_on_event_listener.h +++ b/weex_core/Source/core/data_render/vnode/vnode_on_event_listener.h @@ -16,24 +16,6 @@ * specific language governing permissions and limitations * under the License. */ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ #ifndef CORE_DATA_RENDER_VNODE_VNODE_ON_EVENT_LISTENER_H_ #define CORE_DATA_RENDER_VNODE_VNODE_ON_EVENT_LISTENER_H_ @@ -46,7 +28,8 @@ namespace data_render { class VNodeOnEventListener : public VNode::OnEventListener { void OnEvent(VNode *node, const std::string &event, - const std::string &json_args, const VNode::Params ¶ms); + const std::string &json_args, const std::string dom_changes, + const VNode::Params ¶ms); }; } // namespace data_render diff --git a/weex_core/Source/core/data_render/vnode/vnode_render_manager.cc b/weex_core/Source/core/data_render/vnode/vnode_render_manager.cc index 2f92ae9982..9f541194f1 100644 --- a/weex_core/Source/core/data_render/vnode/vnode_render_manager.cc +++ b/weex_core/Source/core/data_render/vnode/vnode_render_manager.cc @@ -364,7 +364,7 @@ bool VNodeRenderManager::ClosePage(const std::string& page_id) { return true; } -void VNodeRenderManager::FireEvent(const std::string &page_id, const std::string &ref, const std::string &event,const std::string &args) { +void VNodeRenderManager::FireEvent(const std::string &page_id, const std::string &ref, const std::string &event,const std::string &args,const std::string &dom_changes) { do { auto iter = exec_states_.find(page_id); if (iter == exec_states_.end()) { @@ -382,7 +382,7 @@ void VNodeRenderManager::FireEvent(const std::string &page_id, const std::string auto hit_test = vnode->event_params_map()->find(event); if (hit_test != vnode->event_params_map()->end()) { // If vnode has eat event, return. - vnode->OnEvent(event, args); + vnode->OnEvent(event, args, dom_changes); return; } } diff --git a/weex_core/Source/core/data_render/vnode/vnode_render_manager.h b/weex_core/Source/core/data_render/vnode/vnode_render_manager.h index 65422d7238..1ce80945be 100644 --- a/weex_core/Source/core/data_render/vnode/vnode_render_manager.h +++ b/weex_core/Source/core/data_render/vnode/vnode_render_manager.h @@ -49,7 +49,7 @@ class VNodeRenderManager { bool RefreshPage(const std::string &page_id, const std::string &init_data); bool ClosePage(const std::string &page_id); - void FireEvent(const std::string &page_id, const std::string &ref, const std::string &event,const std::string &args); + void FireEvent(const std::string &page_id, const std::string &ref, const std::string &event,const std::string &args,const std::string &dom_changes); void ExecuteRegisterModules(ExecState *exec_state, std::vector& registers); void RegisterModules(const std::string &modules) { modules_.push_back(modules); } void PatchVNode(ExecState *exec_state, VNode *v_node, VNode *new_node); From 7cda3b1e9e6e3d9f90bcae1ed6d35169cc1d0755 Mon Sep 17 00:00:00 2001 From: yxping Date: Sun, 11 Nov 2018 23:10:57 +0800 Subject: [PATCH 2/2] [eagle] fix repeat bug --- weex_core/Source/core/data_render/parser.cc | 2 +- weex_core/Source/core/data_render/vnode/vcomponent.cc | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/weex_core/Source/core/data_render/parser.cc b/weex_core/Source/core/data_render/parser.cc index 38ec7d215d..37cc303ae3 100644 --- a/weex_core/Source/core/data_render/parser.cc +++ b/weex_core/Source/core/data_render/parser.cc @@ -640,7 +640,7 @@ struct ASTParser final { std::vector> control_exprs; if (control.is_object()) { control_exprs = ParseControl(control); - if (control["repeat"].is_string()) { + if (!control["repeat"].is_null()) { SetAttributeStatement( {child_identifier, factory_->NewStringConstant(kAttrRepeatControl), diff --git a/weex_core/Source/core/data_render/vnode/vcomponent.cc b/weex_core/Source/core/data_render/vnode/vcomponent.cc index 7e66aada34..a04f90d852 100644 --- a/weex_core/Source/core/data_render/vnode/vcomponent.cc +++ b/weex_core/Source/core/data_render/vnode/vcomponent.cc @@ -89,6 +89,9 @@ static bool Equals(Value a, Value b) { static void BuildRefsInner( std::unordered_map &ref_map, VNode *node, bool in_for_loop) { + if (node->attributes()->find("[[repeat]]") != node->attributes()->end()) { + in_for_loop = true; + } if (!node->ref().empty()) { VComponent::VNodeRef ref; ref.insert({"ref", node->render_object_ref()}); @@ -107,9 +110,6 @@ static void BuildRefsInner( // Record { ref : node } in context node->component()->exec_state()->context()->AddVNode(node->render_object_ref(), node); if (node->child_list()->size() > 0 && !node->IsVirtualComponent()) { - if (node->attributes()->find("[[repeat]]") != node->attributes()->end()) { - in_for_loop = true; - } for (auto it = node->child_list()->begin(); it != node->child_list()->end(); it++) { BuildRefsInner(ref_map, *it, in_for_loop);