diff --git a/android/sdk/libs/armeabi-v7a/libweexjss.so b/android/sdk/libs/armeabi-v7a/libweexjss.so index a5664ef28a..5ebd032829 100755 Binary files a/android/sdk/libs/armeabi-v7a/libweexjss.so and b/android/sdk/libs/armeabi-v7a/libweexjss.so differ diff --git a/android/sdk/libs/armeabi/libweexjss.so b/android/sdk/libs/armeabi/libweexjss.so index a5664ef28a..5ebd032829 100755 Binary files a/android/sdk/libs/armeabi/libweexjss.so and b/android/sdk/libs/armeabi/libweexjss.so differ diff --git a/android/sdk/src/main/java/com/taobao/weex/bridge/RequestHandler.java b/android/sdk/src/main/java/com/taobao/weex/bridge/RequestHandler.java new file mode 100644 index 0000000000..a5bf160b80 --- /dev/null +++ b/android/sdk/src/main/java/com/taobao/weex/bridge/RequestHandler.java @@ -0,0 +1,101 @@ +/** + * 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. + */ +package com.taobao.weex.bridge; + +import android.net.Uri; +import android.text.TextUtils; + +import com.taobao.weex.WXEnvironment; +import com.taobao.weex.WXHttpListener; +import com.taobao.weex.WXSDKInstance; +import com.taobao.weex.WXSDKManager; +import com.taobao.weex.adapter.IWXHttpAdapter; +import com.taobao.weex.adapter.URIAdapter; +import com.taobao.weex.base.CalledByNative; +import com.taobao.weex.common.WXRequest; +import com.taobao.weex.common.WXResponse; +import com.taobao.weex.http.WXHttpUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static com.taobao.weex.http.WXHttpUtil.KEY_USER_AGENT; + +public class RequestHandler { + + native void nativeInvokeOnSuccess(long callback, String result); + native void nativeInvokeOnFailed(long callback); + + @CalledByNative + public static RequestHandler create() { + return new RequestHandler(); + } + + @CalledByNative + public void send(String instanceId, String url, long nativeCallback) { + if (TextUtils.isEmpty(instanceId) || TextUtils.isEmpty(url) || + nativeCallback == 0 || + !WXSDKManager.getInstance().getAllInstanceMap().containsKey( + instanceId)) { + return; + } + + WXSDKManager manager = WXSDKManager.getInstance(); + WXSDKInstance instance = + WXSDKManager.getInstance().getSDKInstance(instanceId); + if (instance == null) + return; + IWXHttpAdapter adapter = WXSDKManager.getInstance().getIWXHttpAdapter(); + + WXRequest wxRequest = new WXRequest(); + wxRequest.url = manager.getURIAdapter() + .rewrite(instance, URIAdapter.BUNDLE, Uri.parse(url)) + .toString(); + + if (wxRequest.paramMap == null) { + wxRequest.paramMap = new HashMap<>(); + } + wxRequest.paramMap.put( + KEY_USER_AGENT, WXHttpUtil.assembleUserAgent( + instance.getContext(), WXEnvironment.getConfig())); + wxRequest.paramMap.put("isBundleRequest", "true"); + adapter.sendRequest(wxRequest, new OnHttpListenerInner(instance, nativeCallback, url)); + } + + class OnHttpListenerInner extends WXHttpListener { + private long sNativeCallback; + + OnHttpListenerInner(WXSDKInstance instance, long nativeCallback, String bundlUrl) { + super(instance, bundlUrl); + sNativeCallback = nativeCallback; + } + + @Override + public void onSuccess(WXResponse response) { + String script = new String(response.originalData); + nativeInvokeOnSuccess(sNativeCallback, script); + } + + @Override + public void onFail(WXResponse response) { + nativeInvokeOnFailed(sNativeCallback); + } + } +} diff --git a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java index 28ffa3b4ed..adfaf5a1e0 100644 --- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java +++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java @@ -69,7 +69,7 @@ public class WXBridge implements IWXBridge { public native String nativeExecJSOnInstance(String instanceId, String script, int type); - public native void nativeFireEventOnDataRenderNode(String instanceId, String ref, String type, String data); + public native void nativeFireEventOnDataRenderNode(String instanceId, String ref, String type, String data, String domChanges); public native void nativeRegisterModuleOnDataRenderNode( String data); @@ -256,7 +256,12 @@ public Object callNativeModule(String instanceId, String module, String method, // TODO use a better way if (instance!=null && (instance.getRenderStrategy()== WXRenderStrategy.DATA_RENDER || instance.getRenderStrategy()== WXRenderStrategy.DATA_RENDER_BINARY)){ - argArray = (JSONArray) JSON.parse(new String(arguments, "UTF-8")); + try { + argArray = (JSONArray) JSON.parse(new String(arguments, "UTF-8")); + } catch (Exception e) { + // For wson use in data render mode + argArray = (JSONArray) WXWsonJSONSwitch.parseWsonOrJSON(arguments); + } } else { argArray = (JSONArray) WXWsonJSONSwitch.parseWsonOrJSON(arguments); } @@ -705,9 +710,8 @@ public void reportNativeInitStatus(String statusCode, String errorMsg) { } } - @Override - public void fireEventOnDataRenderNode(String instanceId, String ref, String type, String data) { - nativeFireEventOnDataRenderNode(instanceId,ref,type,data); + public void fireEventOnDataRenderNode(String instanceId, String ref, String type, String data, String domChanges) { + nativeFireEventOnDataRenderNode(instanceId,ref,type,data, domChanges); } public void registerModuleOnDataRenderNode(String data) { diff --git a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java index 5785fd3c0a..5bc1998813 100644 --- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java +++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java @@ -1131,7 +1131,7 @@ public void fireEventOnNode(final String instanceId, final String ref, WXSDKInstance instance = WXSDKManager.getInstance().getAllInstanceMap().get(instanceId); if (instance != null && (instance.getRenderStrategy() == WXRenderStrategy.DATA_RENDER || instance.getRenderStrategy() == WXRenderStrategy.DATA_RENDER_BINARY)) { - fireEventOnDataRenderNode(instanceId, ref, type, data); + fireEventOnDataRenderNode(instanceId, ref, type, data, domChanges); } else { if(callback == null) { addJSEventTask(METHOD_FIRE_EVENT, instanceId, params, ref, type, data, domChanges); @@ -1143,7 +1143,7 @@ public void fireEventOnNode(final String instanceId, final String ref, } private void fireEventOnDataRenderNode(final String instanceId, final String ref, - final String type, final Map data) { + final String type, final Map data, final Map domChanges) { mJSHandler.postDelayed(WXThread.secure(new Runnable() { @Override public void run() { @@ -1154,7 +1154,9 @@ public void run() { WXLogUtils.d("fireEventOnDataRenderNode >>>> instanceId:" + instanceId + ", data:" + data); } - mWXBridge.fireEventOnDataRenderNode(instanceId, ref,type,JSON.toJSONString(data)); + if (mWXBridge instanceof WXBridge) { + ((WXBridge) mWXBridge).fireEventOnDataRenderNode(instanceId, ref,type,JSON.toJSONString(data), JSON.toJSONString(domChanges)); + } WXLogUtils.renderPerformanceLog("fireEventOnDataRenderNode", System.currentTimeMillis() - start); } catch (Throwable e) { String err = "[WXBridgeManager] fireEventOnDataRenderNode " + WXLogUtils.getStackTrace(e); diff --git a/ios/sdk/WeexSDK.xcodeproj/project.pbxproj b/ios/sdk/WeexSDK.xcodeproj/project.pbxproj index b321958aab..6b6de38e70 100644 --- a/ios/sdk/WeexSDK.xcodeproj/project.pbxproj +++ b/ios/sdk/WeexSDK.xcodeproj/project.pbxproj @@ -4205,7 +4205,10 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; VALID_ARCHS = "arm64 armv7 x86_64 i386"; - WARNING_CFLAGS = "-Wno-documentation"; + WARNING_CFLAGS = ( + "-Wno-documentation", + "-Wno-c++14-extensions", + ); }; name = Debug; }; @@ -4259,7 +4262,10 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; VALID_ARCHS = "arm64 armv7 x86_64 i386"; - WARNING_CFLAGS = "-Wno-documentation"; + WARNING_CFLAGS = ( + "-Wno-documentation", + "-Wno-c++14-extensions", + ); }; name = Release; }; diff --git a/weex_core/Source/CMakeLists.txt b/weex_core/Source/CMakeLists.txt index 9358e441b2..713a58bca0 100644 --- a/weex_core/Source/CMakeLists.txt +++ b/weex_core/Source/CMakeLists.txt @@ -96,12 +96,11 @@ set(COMMON_SRCS ./core/data_render/binary_file.cc ./core/data_render/vnode/vnode.cc ./core/data_render/vnode/vcomponent.cc - ./core/data_render/vnode/android/vcomponent_lifecycle_listener.cc - ./core/data_render/vnode/android/vnode_on_event_listener.cc - ./core/data_render/vnode/android/conversion.cc ./core/data_render/vnode/vnode_exec_env.cc ./core/data_render/vnode/vnode_render_manager.cc ./core/data_render/vnode/vnode_render_context.cc + + ./core/network/http_module.cc ) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/wson) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/wson) @@ -153,6 +152,11 @@ if (ANDROID) ./android/wrap/wx_params.cpp ./android/base/jni_type.cpp + ./core/data_render/vnode/android/vcomponent_lifecycle_listener.cc + ./core/data_render/vnode/android/vnode_on_event_listener.cc + ./core/data_render/vnode/android/conversion.cc + ./core/network/android/default_request_handler.cc + ./android/jsengine/multiprocess/WeexJSConnection.cpp ./android/jsengine/multiprocess/ExtendJSApi.cpp diff --git a/weex_core/Source/android/jniprebuild/jni_files b/weex_core/Source/android/jniprebuild/jni_files index fb9b291473..1d02d0103d 100644 --- a/weex_core/Source/android/jniprebuild/jni_files +++ b/weex_core/Source/android/jniprebuild/jni_files @@ -4,3 +4,4 @@ com/taobao/weex/ui/component/list/template/jni/NativeRenderObjectUtils.java com/taobao/weex/base/SystemMessageHandler.java com/taobao/weex/bridge/WXBridge.java com/taobao/weex/layout/ContentBoxMeasurement.java +com/taobao/weex/bridge/RequestHandler.java diff --git a/weex_core/Source/android/jniprebuild/jni_load.cc b/weex_core/Source/android/jniprebuild/jni_load.cc index d668ae62e4..fba2c63ac7 100644 --- a/weex_core/Source/android/jniprebuild/jni_load.cc +++ b/weex_core/Source/android/jniprebuild/jni_load.cc @@ -31,6 +31,7 @@ #include "android/wrap/wx_js_object.h" #include "android/wrap/wx_map.h" #include "base/message_loop/message_pump_android.h" +#include "core/network/android/default_request_handler.h" jint JNI_OnLoad(JavaVM *vm, void *reserved) { base::android::InitVM(vm); @@ -44,7 +45,8 @@ jint JNI_OnLoad(JavaVM *vm, void *reserved) { WeexCore::WXJSObject::RegisterJNIUtils(env) && WeexCore::LogUtils::RegisterJNIUtils(env) && WeexCore::WXMap::RegisterJNIUtils(env) && - WeexCore::HashSet::RegisterJNIUtils(env); + WeexCore::HashSet::RegisterJNIUtils(env) && + weex::core::network::DefaultRequestHandler::RegisterJNIUtils(env); if (result) { WeexCore::SoUtils::Init(env); WeexCore::WMLBridge::RegisterJNIUtils(env); diff --git a/weex_core/Source/android/jniprebuild/jniheader/RequestHandler_jni.h b/weex_core/Source/android/jniprebuild/jniheader/RequestHandler_jni.h new file mode 100644 index 0000000000..f83ad376d3 --- /dev/null +++ b/weex_core/Source/android/jniprebuild/jniheader/RequestHandler_jni.h @@ -0,0 +1,122 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This file is autogenerated by +// weex/weex_core/Source/android/jniprebuild/jni_generator.py +// For +// com/taobao/weex/bridge/RequestHandler + +#ifndef com_taobao_weex_bridge_RequestHandler_JNI +#define com_taobao_weex_bridge_RequestHandler_JNI + +#include + +//#include "base/android/jni_int_wrapper.h" + +// Step 1: forward declarations. +namespace { +const char kRequestHandlerClassPath[] = "com/taobao/weex/bridge/RequestHandler"; +// Leaking this jclass as we cannot use LazyInstance from some threads. +jclass g_RequestHandler_clazz = NULL; +#define RequestHandler_clazz(env) g_RequestHandler_clazz + +} // namespace + +static void InvokeOnSuccess(JNIEnv* env, jobject jcaller, + jlong callback, + jstring result); + +static void InvokeOnFailed(JNIEnv* env, jobject jcaller, + jlong callback); + +// Step 2: method stubs. + +static intptr_t g_RequestHandler_create = 0; +static base::android::ScopedLocalJavaRef + Java_RequestHandler_create(JNIEnv* env) { + /* Must call RegisterNativesImpl() */ + //CHECK_CLAZZ(env, RequestHandler_clazz(env), + // RequestHandler_clazz(env), NULL); + jmethodID method_id = + base::android::GetMethod( + env, RequestHandler_clazz(env), + base::android::STATIC_METHOD, + "create", + +"(" +")" +"Lcom/taobao/weex/bridge/RequestHandler;", + &g_RequestHandler_create); + + jobject ret = + env->CallStaticObjectMethod(RequestHandler_clazz(env), + method_id); + base::android::CheckException(env); + return base::android::ScopedLocalJavaRef(env, ret); +} + +static intptr_t g_RequestHandler_send = 0; +static void Java_RequestHandler_send(JNIEnv* env, jobject obj, jstring + instanceId, + jstring url, + jlong nativeCallback) { + /* Must call RegisterNativesImpl() */ + //CHECK_CLAZZ(env, obj, + // RequestHandler_clazz(env)); + jmethodID method_id = + base::android::GetMethod( + env, RequestHandler_clazz(env), + base::android::INSTANCE_METHOD, + "send", + +"(" +"Ljava/lang/String;" +"Ljava/lang/String;" +"J" +")" +"V", + &g_RequestHandler_send); + + env->CallVoidMethod(obj, + method_id, instanceId, url, nativeCallback); + base::android::CheckException(env); + +} + +// Step 3: RegisterNatives. + +static const JNINativeMethod kMethodsRequestHandler[] = { + { "nativeInvokeOnSuccess", +"(" +"J" +"Ljava/lang/String;" +")" +"V", reinterpret_cast(InvokeOnSuccess) }, + { "nativeInvokeOnFailed", +"(" +"J" +")" +"V", reinterpret_cast(InvokeOnFailed) }, +}; + +static bool RegisterNativesImpl(JNIEnv* env) { + + g_RequestHandler_clazz = reinterpret_cast(env->NewGlobalRef( + base::android::GetClass(env, kRequestHandlerClassPath).Get())); + + const int kMethodsRequestHandlerSize = + sizeof(kMethodsRequestHandler)/sizeof(kMethodsRequestHandler[0]); + + if (env->RegisterNatives(RequestHandler_clazz(env), + kMethodsRequestHandler, + kMethodsRequestHandlerSize) < 0) { + //jni_generator::HandleRegistrationError( + // env, RequestHandler_clazz(env), __FILE__); + return false; + } + + return true; +} + +#endif // com_taobao_weex_bridge_RequestHandler_JNI diff --git a/weex_core/Source/core/bridge/platform/core_side_in_platform.cpp b/weex_core/Source/core/bridge/platform/core_side_in_platform.cpp index 0d8bd8afec..315e66576c 100644 --- a/weex_core/Source/core/bridge/platform/core_side_in_platform.cpp +++ b/weex_core/Source/core/bridge/platform/core_side_in_platform.cpp @@ -429,16 +429,29 @@ int CoreSideInPlatform::CreateInstance(const char *instanceId, const char *func, const char *render_strategy) { // First check about DATA_RENDER mode if (render_strategy != nullptr) { + std::function exec_js = + [instanceId = std::string(instanceId), func = std::string(func), + opts = std::string(opts), initData = std::string(initData), + extendsApi = std::string(extendsApi)](const char *result) { + WeexCoreManager::Instance() + ->script_bridge() + ->script_side() + ->CreateInstance(instanceId.c_str(), func.c_str(), result, + opts.c_str(), initData.c_str(), + extendsApi.c_str()); + }; if (strcmp(render_strategy, "DATA_RENDER") == 0) { auto node_manager = - weex::core::data_render::VNodeRenderManager::GetInstance(); - node_manager->CreatePage(script, instanceId, render_strategy, initData, nullptr); + weex::core::data_render::VNodeRenderManager::GetInstance(); + node_manager->CreatePage(script, instanceId, render_strategy, initData, + exec_js); return true; } else if (strcmp(render_strategy, "DATA_RENDER_BINARY") == 0) { auto node_manager = - weex::core::data_render::VNodeRenderManager::GetInstance(); - node_manager->CreatePage(script, script_length, instanceId, render_strategy, initData); + weex::core::data_render::VNodeRenderManager::GetInstance(); + node_manager->CreatePage(script, script_length, instanceId, + render_strategy, initData); return true; } diff --git a/weex_core/Source/core/data_render/vnode/vnode_exec_env.cc b/weex_core/Source/core/data_render/vnode/vnode_exec_env.cc index 7dbf44f699..25cfddd6a7 100644 --- a/weex_core/Source/core/data_render/vnode/vnode_exec_env.cc +++ b/weex_core/Source/core/data_render/vnode/vnode_exec_env.cc @@ -312,8 +312,6 @@ static Value UpdateElement(ExecState *exec_state) { return Value(); } - -static size_t g_node_id = 0; // createElement("tag_name", "id", ref); static Value CreateElement(ExecState *exec_state) { @@ -332,10 +330,7 @@ static Value CreateElement(ExecState *exec_state) { throw VMExecError("CreateElement only support int for string"); } std::string node_id,ref; - std::ostringstream os; - os << g_node_id++; - node_id = "vn_" + os.str(); - ref = arg_id_str; + node_id = arg_id_str; if (exec_state->GetArgumentCount() > 2 && exec_state->GetArgument(2)->type == Value::Type::STRING) { ref = exec_state->GetArgument(2)->str->c_str(); } 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 f405a11758..0b0779203a 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 @@ -20,18 +20,19 @@ #include "core/data_render/vnode/vnode_render_manager.h" #include #include +#include "base/make_copyable.h" #include "base/string_util.h" +#include "core/bridge/platform_bridge.h" +#include "core/data_render/binary_file.h" +#include "core/data_render/common_error.h" #include "core/data_render/exec_state.h" #include "core/data_render/string_table.h" #include "core/data_render/vnode/vnode.h" #include "core/data_render/vnode/vnode_exec_env.h" #include "core/manager/weex_core_manager.h" +#include "core/network/http_module.h" #include "core/render/manager/render_manager.h" #include "core/render/node/factory/render_creator.h" -#include "core/bridge/platform_bridge.h" -#include "core/data_render/binary_file.h" -#include "core/data_render/common_error.h" -#include "core/network/http_module.h" #define VRENDER_LOG true @@ -73,8 +74,6 @@ WeexCore::RenderObject* ParseVNode2RenderObject(VNode* vnode, std::string ref_str; if (isRoot) { ref_str = "_root"; - } else if (!vnode->node_id().empty()) { - ref_str = vnode->node_id(); } else { ref_str = base::to_string(ref_id++); } @@ -180,8 +179,8 @@ void VNodeRenderManager::InitVM() { } } -void VNodeRenderManager::CreatePage(const std::string &input, const std::string &page_id, const std::string &options, const std::string &init_data, std::function js_exec) { - std::string err = CreatePageImpl(input, page_id, options, init_data, js_exec); +void VNodeRenderManager::CreatePage(const std::string &input, const std::string &page_id, const std::string &options, const std::string &init_data, std::function exec_js) { + std::string err = CreatePageImpl(input, page_id, options, init_data, exec_js); if (!err.empty()) { WeexCore::WeexCoreManager::Instance()->getPlatformBridge()->platform_side()->ReportException(page_id.c_str(), nullptr, err.c_str()); } @@ -236,16 +235,54 @@ std::string VNodeRenderManager::CreatePageImpl(const std::string &input, const s auto duration_post = std::chrono::duration_cast(std::chrono::steady_clock::now() - start); LOGD("DATA_RENDER, All time %lld\n", duration_post.count()); #endif + DownloadAndExecScript(exec_state, page_id, exec_js); + return err; +} - const json11::Json& javascript_obj = exec_state->context()->raw_json()["javascript"]; - std::string javacript_url = javascript_obj.string_value(); - if (!javacript_url.empty()) { - HttpModule http_module; - http_module.Send(javacript_url.c_str(), exec_js); +void VNodeRenderManager::DownloadAndExecScript( + ExecState* exec_state, const std::string& page_id, + std::function exec_js) { + // If script exists in json, run script into js vm + const json11::Json& script_array = + exec_state->context()->raw_json()["script"]; + if (script_array.is_array()) { + for (auto it = script_array.array_items().begin(); + it != script_array.array_items().end(); it++) { + const json11::Json& script_obj = *it; + auto src = script_obj["src"]; + auto content = script_obj["content"]; + auto callback1 = weex::base::MakeCopyable( + [page_id = page_id, exec_js = exec_js](const char* result) { + exec_js(result); + auto root = + VNodeRenderManager::GetInstance()->GetRootVNode(page_id); + if (root && root->IsVirtualComponent()) { + static_cast(root) + ->DispatchCreated(); + } + }); + // callback2, a wrap for callback1, will be post to script thread to + // execute callback1 + auto callback2 = weex::base::MakeCopyable([callback = callback1]( + const std::string& result) { + WeexCoreManager::Instance()->script_thread()->message_loop()->PostTask( + weex::base::MakeCopyable([result = std::move(result), callback]() { + callback(result.c_str()); + })); + }); + // If script is a url, first download the script, else run script + // directly. + if (content.is_string()) { + callback1(const_cast(content.string_value().c_str())); + } else if (src.is_string()) { + network::HttpModule http_module; + http_module.Send(page_id.c_str(), src.string_value().c_str(), + callback2); + } } - return err; + } } - + void VNodeRenderManager::ExecuteRegisterModules(ExecState *exec_state, std::vector& registers) { do { if (!modules_.size()) { 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 d76c49758e..2d26790a47 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 @@ -79,6 +79,8 @@ class VNodeRenderManager { bool ClosePageInternal(const std::string &page_id); std::string CreatePageWithOpcode(const std::string& page_id, const std::string& options, const std::string& init_data); std::string CreatePageImpl(const std::string &input, const std::string &page_id, const std::string &options, const std::string &init_data, std::function exec_js); + void DownloadAndExecScript(ExecState *exec_state, const std::string &page_id, + std::function exec_js); static VM *g_vm; static VNodeRenderManager *g_instance; diff --git a/weex_core/Source/core/network/android/default_request_handler.cc b/weex_core/Source/core/network/android/default_request_handler.cc new file mode 100644 index 0000000000..f44dc59679 --- /dev/null +++ b/weex_core/Source/core/network/android/default_request_handler.cc @@ -0,0 +1,77 @@ +/** + * 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. + */ +#if OS_ANDROID + +#include "core/network/android/default_request_handler.h" +#include "android/base/jni/android_jni.h" +#include "android/base/string/scoped_jstring_utf8.h" +#include "android/jniprebuild/jniheader/RequestHandler_jni.h" + +using namespace weex::core::network; + +static void InvokeOnSuccess(JNIEnv* env, jobject jcaller, jlong callback, + jstring result) { + CallbackWrapper* callback_wrapper = + reinterpret_cast(callback); + WeexCore::ScopedJStringUTF8 jni_result(env, result); + callback_wrapper->Invoke(jni_result.getChars() ? jni_result.getChars() : ""); + delete callback_wrapper; +} + +static void InvokeOnFailed(JNIEnv* env, jobject jcaller, jlong callback) { + CallbackWrapper* callback_wrapper = + reinterpret_cast(callback); + delete callback_wrapper; +} + +namespace weex { +namespace core { +namespace network { + +bool DefaultRequestHandler::RegisterJNIUtils(JNIEnv* env) { + return RegisterNativesImpl(env); +} + +DefaultRequestHandler::DefaultRequestHandler() { + JNIEnv* env = base::android::AttachCurrentThread(); + Reset(env, Java_RequestHandler_create(env).Release()); +} + +DefaultRequestHandler::~DefaultRequestHandler() {} + +void DefaultRequestHandler::Send(const char* instance_id, const char* url, + Callback callback) { + JNIEnv* env = base::android::AttachCurrentThread(); + if (!env) return; + CallbackWrapper* callback_wrapper = new CallbackWrapper(callback); + base::android::ScopedLocalJavaRef jni_url(env, + env->NewStringUTF(url)); + base::android::ScopedLocalJavaRef jni_id( + env, env->NewStringUTF(instance_id)); + Java_RequestHandler_send(env, jni_object(), jni_id.Get(), jni_url.Get(), + reinterpret_cast(callback_wrapper)); +} + +RequestHandler* RequestHandler::CreateDefaultHandler() { + return new DefaultRequestHandler(); +} +} // namespace network +} // namespace core +} // namespace weex +#endif \ No newline at end of file diff --git a/weex_core/Source/core/network/android/default_request_handler.h b/weex_core/Source/core/network/android/default_request_handler.h new file mode 100644 index 0000000000..cf1f556479 --- /dev/null +++ b/weex_core/Source/core/network/android/default_request_handler.h @@ -0,0 +1,56 @@ +/** + * 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. + */ +#if OS_ANDROID + +#ifndef CORE_NETWORK_DEFAULT_REQUEST_HANDLER_H +#define CORE_NETWORK_DEFAULT_REQUEST_HANDLER_H + +#include +#include "android/wrap/jni_object_wrap.h" +#include "core/network/request_handler.h" + +namespace weex { +namespace core { +namespace network { + +class DefaultRequestHandler : public RequestHandler, + public WeexCore::JNIObjectWrap { + public: + static bool RegisterJNIUtils(JNIEnv* env); + DefaultRequestHandler(); + ~DefaultRequestHandler() override; + void Send(const char* instance_id, const char* url, + Callback callback) override; +}; + +class CallbackWrapper { + public: + CallbackWrapper(Callback callback) : callback_(callback) {} + ~CallbackWrapper() {} + void Invoke(const std::string& result) { callback_(result); } + + private: + Callback callback_; +}; + +} // namespace network +} // namespace core +} // namespace weex +#endif // CORE_NETWORK_DEFAULT_REQUEST_HANDLER_H +#endif diff --git a/weex_core/Source/core/network/http_module.cc b/weex_core/Source/core/network/http_module.cc index dbb56aa93d..200952fb5e 100644 --- a/weex_core/Source/core/network/http_module.cc +++ b/weex_core/Source/core/network/http_module.cc @@ -18,27 +18,22 @@ */ #include "core/network/http_module.h" #include "core/network/request_handler.h" -#include "core/network/default_request_handler.h" namespace weex { namespace core { -namespace data_render { +namespace network { -HttpModule::HttpModule() : request_handler_(new DefaultRequestHandler) { -} +HttpModule::HttpModule() + : request_handler_(RequestHandler::CreateDefaultHandler()) {} -HttpModule::HttpModule(RequestHandler* request_handler) { - if (!request_handler) { - request_handler_.reset(new DefaultRequestHandler); - } else { - request_handler_.reset(request_handler); - } -} +HttpModule::HttpModule(RequestHandler* request_handler) + : request_handler_(request_handler) {} -void HttpModule::Send(const char* url, FUNC callback) { - request_handler_->Send(url, callback); +void HttpModule::Send(const char* instance_id, const char* url, + Callback callback) { + request_handler_->Send(instance_id, url, callback); } -} -} -} +} // namespace network +} // namespace core +} // namespace weex diff --git a/weex_core/Source/core/network/http_module.h b/weex_core/Source/core/network/http_module.h index 8314379f4a..4c4b57993c 100644 --- a/weex_core/Source/core/network/http_module.h +++ b/weex_core/Source/core/network/http_module.h @@ -17,27 +17,25 @@ * under the License. */ -#ifndef HTTP_MODULE_ -#define HTTP_MODULE_ -#include -#include +#ifndef CORE_NETWORK_HTTP_MODULE_ +#define CORE_NETWORK_HTTP_MODULE_ +#include "core/network/request_handler.h" namespace weex { namespace core { -namespace data_render { -typedef std::function FUNC; -class RequestHandler; +namespace network { class HttpModule { -public: - HttpModule(); - HttpModule(RequestHandler* request_handler); - void Send(const char* url, FUNC callback); -private: - std::auto_ptr request_handler_; + public: + HttpModule(); + HttpModule(RequestHandler* request_handler); + void Send(const char* instance_id, const char* url, Callback callback); + + private: + std::unique_ptr request_handler_; }; -} -} -} -#endif +} // namespace network +} // namespace core +} // namespace weex +#endif // CORE_NETWORK_HTTP_MODULE_ diff --git a/weex_core/Source/core/network/default_request_handler.h b/weex_core/Source/core/network/ios/default_request_handler.h similarity index 66% rename from weex_core/Source/core/network/default_request_handler.h rename to weex_core/Source/core/network/ios/default_request_handler.h index 1fd9b06494..2099d5303a 100644 --- a/weex_core/Source/core/network/default_request_handler.h +++ b/weex_core/Source/core/network/ios/default_request_handler.h @@ -17,21 +17,24 @@ * under the License. */ -#ifndef DEFAULT_REQUEST_HANDLER_H -#define DEFAULT_REQUEST_HANDLER_H +#ifndef CORE_NETWORK_DEFAULT_REQUEST_HANDLER_H +#define CORE_NETWORK_DEFAULT_REQUEST_HANDLER_H #include "core/network/request_handler.h" namespace weex { namespace core { -namespace data_render { +namespace network { -class DefaultRequestHandler : public RequestHandler{ -public: - void Send(const char* url, std::function callback) override; +class DefaultRequestHandler : public RequestHandler { + public: + DefaultRequestHandler(); + ~DefaultRequestHandler() override; + void Send(const char* instance_id, const char* url, + Callback callback) override; }; -} -} -} -#endif +} // namespace network +} // namespace core +} // namespace weex +#endif // CORE_NETWORK_DEFAULT_REQUEST_HANDLER_H diff --git a/weex_core/Source/core/network/ios/default_request_handler.mm b/weex_core/Source/core/network/ios/default_request_handler.mm index 54eb7f5abc..e68eb7a444 100644 --- a/weex_core/Source/core/network/ios/default_request_handler.mm +++ b/weex_core/Source/core/network/ios/default_request_handler.mm @@ -16,19 +16,27 @@ * specific language governing permissions and limitations * under the License. */ -#include "core/network/default_request_handler.h" +#include "core/network/ios/default_request_handler.h" #import "WXConvertUtility.h" #import "WXSDKManager.h" namespace weex { namespace core { -namespace data_render { - void DefaultRequestHandler::Send(const char* url, std::function callback) { +namespace network { + DefaultRequestHandler::DefaultRequestHandler() {} + + DefaultRequestHandler::~DefaultRequestHandler() {} + + void DefaultRequestHandler::Send(const char* instance_id, const char* url, Callback callback) { NSURL* ns_url = [NSURL URLWithString:NSSTRING(url)]; [[WXSDKManager bridgeMgr] DownloadJS:ns_url completion:^(NSString *script) { callback([script UTF8String] ? : nullptr); }]; } + + RequestHandler* RequestHandler::CreateDefaultHandler() { + return new DefaultRequestHandler(); + } } } } diff --git a/weex_core/Source/core/network/request_handler.h b/weex_core/Source/core/network/request_handler.h index efdfa1c8da..66a4a87a3f 100644 --- a/weex_core/Source/core/network/request_handler.h +++ b/weex_core/Source/core/network/request_handler.h @@ -17,21 +17,26 @@ * under the License. */ -#ifndef REQUEST_HANDLER_H -#define REQUEST_HANDLER_H +#ifndef CORE_NETWORK_REQUEST_HANDLER_H +#define CORE_NETWORK_REQUEST_HANDLER_H #include +#include namespace weex { namespace core { -namespace data_render { +namespace network { +typedef std::function Callback; class RequestHandler { -public: - virtual ~RequestHandler() {} - virtual void Send(const char* url, std::function callback) = 0; + public: + RequestHandler() {} + virtual ~RequestHandler() {} + virtual void Send(const char* instance_id, const char* url, + Callback callback) = 0; + static RequestHandler* CreateDefaultHandler(); }; -} -} -} -#endif +} // namespace network +} // namespace core +} // namespace weex +#endif // CORE_NETWORK_REQUEST_HANDLER_H