You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by ji...@apache.org on 2017/01/24 08:21:12 UTC

[01/50] [abbrv] incubator-weex git commit: Merge branch 'ios-feature-20170118' into ios-feature-navigator

Repository: incubator-weex
Updated Branches:
  refs/heads/master 9ca297a31 -> d1d396e92


Merge branch 'ios-feature-20170118' into ios-feature-navigator

Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/58a3ffc1
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/58a3ffc1
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/58a3ffc1

Branch: refs/heads/master
Commit: 58a3ffc12ba2ec196c68f1bdece8e48aeb4da94f
Parents: f65c42f 4f65b4d
Author: acton393 <ac...@users.noreply.github.com>
Authored: Tue Jan 10 19:55:41 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Tue Jan 10 19:55:41 2017 +0800

----------------------------------------------------------------------
 .eslintignore                                   |    3 +
 .gitignore                                      |    4 +-
 .travis.yml                                     |    2 +
 .wwprc                                          |   17 +-
 README.md                                       |   17 +-
 android/commons/build.gradle                    |    1 +
 .../weex/commons/AbstractWeexActivity.java      |   56 +-
 .../weex/commons/SimpleWeexActivity.java        |    4 +-
 .../weex/commons/WXAnalyzerDelegate.java        |  379 +
 .../alibaba/weex/commons/adapter/BlurTool.java  |  512 ++
 .../commons/adapter/BlurTransformation.java     |  238 +
 .../commons/adapter/FrescoImageComponent.java   |    4 +-
 .../weex/commons/adapter/ImageAdapter.java      |    2 +-
 android/playground/app/build.gradle             |   11 +-
 .../weex/uitest/TC_AG/AG_AHref_A_Href.java      |    8 +-
 .../TC_AG/AG_Border_A_Border_Bottom_Color.java  |    8 +-
 .../AG_Border_A_Border_Bottom_Left_Radius.java  |    8 +-
 .../AG_Border_A_Border_Bottom_Right_Radius.java |    8 +-
 .../TC_AG/AG_Border_A_Border_Bottom_Width.java  |   10 +-
 .../uitest/TC_AG/AG_Border_A_Border_Color.java  |    8 +-
 .../TC_AG/AG_Border_A_Border_Left_Color.java    |    8 +-
 .../TC_AG/AG_Border_A_Border_Left_Width.java    |   10 +-
 .../uitest/TC_AG/AG_Border_A_Border_Radius.java |    8 +-
 .../TC_AG/AG_Border_A_Border_Right_Color.java   |    8 +-
 .../TC_AG/AG_Border_A_Border_Right_Width.java   |   10 +-
 .../uitest/TC_AG/AG_Border_A_Border_Style.java  |   10 +-
 .../TC_AG/AG_Border_A_Border_Top_Color.java     |    8 +-
 .../AG_Border_A_Border_Top_Left_Radius.java     |    8 +-
 .../AG_Border_A_Border_Top_Right_Radius.java    |    8 +-
 .../TC_AG/AG_Border_A_Border_Top_Width.java     |   10 +-
 .../uitest/TC_AG/AG_Border_A_Border_Width.java  |   10 +-
 .../AG_Border_Div_Border_Bottom_Color.java      |    8 +-
 ...AG_Border_Div_Border_Bottom_Left_Radius.java |    8 +-
 ...G_Border_Div_Border_Bottom_Right_Radius.java |    8 +-
 .../AG_Border_Div_Border_Bottom_Width.java      |   10 +-
 .../TC_AG/AG_Border_Div_Border_Color.java       |    8 +-
 .../TC_AG/AG_Border_Div_Border_Left_Color.java  |    8 +-
 .../TC_AG/AG_Border_Div_Border_Left_Width.java  |   10 +-
 .../TC_AG/AG_Border_Div_Border_Radius.java      |    8 +-
 .../TC_AG/AG_Border_Div_Border_Right_Color.java |    8 +-
 .../TC_AG/AG_Border_Div_Border_Right_Width.java |   10 +-
 .../TC_AG/AG_Border_Div_Border_Style.java       |   10 +-
 .../TC_AG/AG_Border_Div_Border_Top_Color.java   |    8 +-
 .../AG_Border_Div_Border_Top_Left_Radius.java   |    8 +-
 .../AG_Border_Div_Border_Top_Right_Radius.java  |    8 +-
 .../TC_AG/AG_Border_Div_Border_Top_Width.java   |   10 +-
 .../TC_AG/AG_Border_Div_Border_Width.java       |   10 +-
 .../AG_Border_Image_Border_Bottom_Color.java    |    8 +-
 ..._Border_Image_Border_Bottom_Left_Radius.java |    8 +-
 ...Border_Image_Border_Bottom_Right_Radius.java |    8 +-
 .../AG_Border_Image_Border_Bottom_Width.java    |   10 +-
 .../TC_AG/AG_Border_Image_Border_Color.java     |    8 +-
 .../AG_Border_Image_Border_Left_Color.java      |    8 +-
 .../AG_Border_Image_Border_Left_Width.java      |   10 +-
 .../TC_AG/AG_Border_Image_Border_Radius.java    |    8 +-
 .../AG_Border_Image_Border_Right_Color.java     |    8 +-
 .../AG_Border_Image_Border_Right_Width.java     |   10 +-
 .../TC_AG/AG_Border_Image_Border_Style.java     |   10 +-
 .../TC_AG/AG_Border_Image_Border_Top_Color.java |    8 +-
 .../AG_Border_Image_Border_Top_Left_Radius.java |    8 +-
 ...AG_Border_Image_Border_Top_Right_Radius.java |    8 +-
 .../TC_AG/AG_Border_Image_Border_Top_Width.java |   10 +-
 .../TC_AG/AG_Border_Image_Border_Width.java     |   10 +-
 .../AG_Border_Input_Border_Bottom_Color.java    |    8 +-
 ..._Border_Input_Border_Bottom_Left_Radius.java |    8 +-
 ...Border_Input_Border_Bottom_Right_Radius.java |    8 +-
 .../AG_Border_Input_Border_Bottom_Width.java    |   10 +-
 .../TC_AG/AG_Border_Input_Border_Color.java     |    8 +-
 .../AG_Border_Input_Border_Left_Color.java      |    8 +-
 .../AG_Border_Input_Border_Left_Width.java      |   10 +-
 .../TC_AG/AG_Border_Input_Border_Radius.java    |    8 +-
 .../AG_Border_Input_Border_Right_Color.java     |    8 +-
 .../AG_Border_Input_Border_Right_Width.java     |   10 +-
 .../TC_AG/AG_Border_Input_Border_Style.java     |   10 +-
 .../TC_AG/AG_Border_Input_Border_Top_Color.java |    8 +-
 .../AG_Border_Input_Border_Top_Left_Radius.java |    8 +-
 ...AG_Border_Input_Border_Top_Right_Radius.java |    8 +-
 .../TC_AG/AG_Border_Input_Border_Top_Width.java |   10 +-
 .../TC_AG/AG_Border_Input_Border_Width.java     |   10 +-
 .../AG_Border_Switch_Border_Bottom_Color.java   |    8 +-
 ...Border_Switch_Border_Bottom_Left_Radius.java |    8 +-
 ...order_Switch_Border_Bottom_Right_Radius.java |    8 +-
 .../AG_Border_Switch_Border_Bottom_Width.java   |   10 +-
 .../TC_AG/AG_Border_Switch_Border_Color.java    |    8 +-
 .../AG_Border_Switch_Border_Left_Color.java     |    8 +-
 .../AG_Border_Switch_Border_Left_Width.java     |   10 +-
 .../TC_AG/AG_Border_Switch_Border_Radius.java   |    8 +-
 .../AG_Border_Switch_Border_Right_Color.java    |    8 +-
 .../AG_Border_Switch_Border_Right_Width.java    |   10 +-
 .../TC_AG/AG_Border_Switch_Border_Style.java    |   10 +-
 .../AG_Border_Switch_Border_Top_Color.java      |    8 +-
 ...AG_Border_Switch_Border_Top_Left_Radius.java |    8 +-
 ...G_Border_Switch_Border_Top_Right_Radius.java |    8 +-
 .../AG_Border_Switch_Border_Top_Width.java      |   10 +-
 .../TC_AG/AG_Border_Switch_Border_Width.java    |   10 +-
 .../AG_Border_Text_Border_Bottom_Color.java     |    8 +-
 ...G_Border_Text_Border_Bottom_Left_Radius.java |    8 +-
 ..._Border_Text_Border_Bottom_Right_Radius.java |    8 +-
 .../AG_Border_Text_Border_Bottom_Width.java     |   10 +-
 .../TC_AG/AG_Border_Text_Border_Color.java      |    8 +-
 .../TC_AG/AG_Border_Text_Border_Left_Color.java |    8 +-
 .../TC_AG/AG_Border_Text_Border_Left_Width.java |   10 +-
 .../TC_AG/AG_Border_Text_Border_Radius.java     |    8 +-
 .../AG_Border_Text_Border_Right_Color.java      |    8 +-
 .../AG_Border_Text_Border_Right_Width.java      |   10 +-
 .../TC_AG/AG_Border_Text_Border_Style.java      |   10 +-
 .../TC_AG/AG_Border_Text_Border_Top_Color.java  |    8 +-
 .../AG_Border_Text_Border_Top_Left_Radius.java  |    8 +-
 .../AG_Border_Text_Border_Top_Right_Radius.java |    8 +-
 .../TC_AG/AG_Border_Text_Border_Top_Width.java  |   10 +-
 .../TC_AG/AG_Border_Text_Border_Width.java      |   10 +-
 .../AG_Border_Video_Border_Bottom_Color.java    |    8 +-
 ..._Border_Video_Border_Bottom_Left_Radius.java |    8 +-
 ...Border_Video_Border_Bottom_Right_Radius.java |    8 +-
 .../AG_Border_Video_Border_Bottom_Width.java    |   10 +-
 .../TC_AG/AG_Border_Video_Border_Color.java     |    8 +-
 .../AG_Border_Video_Border_Left_Color.java      |    8 +-
 .../AG_Border_Video_Border_Left_Width.java      |   10 +-
 .../TC_AG/AG_Border_Video_Border_Radius.java    |    8 +-
 .../AG_Border_Video_Border_Right_Color.java     |    8 +-
 .../AG_Border_Video_Border_Right_Width.java     |   10 +-
 .../TC_AG/AG_Border_Video_Border_Style.java     |   10 +-
 .../TC_AG/AG_Border_Video_Border_Top_Color.java |    8 +-
 .../AG_Border_Video_Border_Top_Left_Radius.java |    8 +-
 ...AG_Border_Video_Border_Top_Right_Radius.java |    8 +-
 .../TC_AG/AG_Border_Video_Border_Top_Width.java |   10 +-
 .../TC_AG/AG_Border_Video_Border_Width.java     |   10 +-
 .../AG_Border_Web_Border_Bottom_Color.java      |    8 +-
 ...AG_Border_Web_Border_Bottom_Left_Radius.java |    8 +-
 ...G_Border_Web_Border_Bottom_Right_Radius.java |    8 +-
 .../AG_Border_Web_Border_Bottom_Width.java      |   10 +-
 .../TC_AG/AG_Border_Web_Border_Color.java       |    8 +-
 .../TC_AG/AG_Border_Web_Border_Left_Color.java  |    8 +-
 .../TC_AG/AG_Border_Web_Border_Left_Width.java  |   10 +-
 .../TC_AG/AG_Border_Web_Border_Radius.java      |    8 +-
 .../TC_AG/AG_Border_Web_Border_Right_Color.java |    8 +-
 .../TC_AG/AG_Border_Web_Border_Right_Width.java |   10 +-
 .../TC_AG/AG_Border_Web_Border_Style.java       |   10 +-
 .../TC_AG/AG_Border_Web_Border_Top_Color.java   |    8 +-
 .../AG_Border_Web_Border_Top_Left_Radius.java   |    8 +-
 .../AG_Border_Web_Border_Top_Right_Radius.java  |    8 +-
 .../TC_AG/AG_Border_Web_Border_Top_Width.java   |   11 +-
 .../TC_AG/AG_Border_Web_Border_Width.java       |   10 +-
 .../uitest/TC_AG/AG_CommonAttribute_A_If.java   |    8 +-
 .../uitest/TC_AG/AG_CommonAttribute_Div_If.java |    8 +-
 .../TC_AG/AG_CommonAttribute_Image_If.java      |    8 +-
 .../TC_AG/AG_CommonAttribute_Input_If.java      |    8 +-
 .../TC_AG/AG_CommonAttribute_Switch_If.java     |    8 +-
 .../TC_AG/AG_CommonAttribute_Text_If.java       |    8 +-
 .../TC_AG/AG_CommonAttribute_Video_If.java      |    8 +-
 .../uitest/TC_AG/AG_CommonAttribute_Web_If.java |    8 +-
 .../uitest/TC_AG/AG_CommonEvent_A_Onclick.java  |    4 +-
 .../TC_AG/AG_CommonEvent_Div_Onclick.java       |    4 +-
 .../TC_AG/AG_CommonEvent_Image_Onclick.java     |    4 +-
 .../TC_AG/AG_CommonEvent_Input_Onclick.java     |    4 +-
 .../TC_AG/AG_CommonEvent_Switch_Onclick.java    |    4 +-
 .../TC_AG/AG_CommonEvent_Text_Onclick.java      |    4 +-
 .../TC_AG/AG_CommonEvent_Video_Onclick.java     |    4 +-
 .../TC_AG/AG_CommonEvent_Web_Onclick.java       |    4 +-
 .../AG_CommonStyle_A_Background_Color.java      |    8 +-
 .../TC_AG/AG_CommonStyle_A_Widthandheight.java  |   12 +-
 .../AG_CommonStyle_Div_Background_Color.java    |    8 +-
 .../AG_CommonStyle_Div_Widthandheight.java      |   12 +-
 .../AG_CommonStyle_Image_Background_Color.java  |    8 +-
 .../AG_CommonStyle_Image_Widthandheight.java    |   12 +-
 .../AG_CommonStyle_Input_Background_Color.java  |    8 +-
 .../AG_CommonStyle_Input_Widthandheight.java    |   12 +-
 .../AG_CommonStyle_Switch_Background_Color.java |    8 +-
 .../AG_CommonStyle_Switch_Widthandheight.java   |   12 +-
 .../AG_CommonStyle_Text_Background_Color.java   |    8 +-
 .../AG_CommonStyle_Text_Widthandheight.java     |   12 +-
 .../AG_CommonStyle_Video_Background_Color.java  |    8 +-
 .../AG_CommonStyle_Video_Widthandheight.java    |   12 +-
 .../AG_CommonStyle_Web_Background_Color.java    |    8 +-
 .../AG_CommonStyle_Web_Widthandheight.java      |   12 +-
 .../weex/uitest/TC_AG/AG_Gesture_Div_Click.java |    4 +-
 .../uitest/TC_AG/AG_Gesture_Div_Conflict.java   |    4 +-
 .../uitest/TC_AG/AG_Gesture_Div_Longpress.java  |    4 +-
 .../weex/uitest/TC_AG/AG_Gesture_Div_Pan.java   |    4 +-
 .../weex/uitest/TC_AG/AG_Gesture_Div_Swipe.java |    4 +-
 .../weex/uitest/TC_AG/AG_Gesture_Div_Touch.java |    4 +-
 .../uitest/TC_AG/AG_Image_Image_Onload.java     |    4 +-
 .../uitest/TC_AG/AG_Image_Image_Resize.java     |   10 +-
 .../weex/uitest/TC_AG/AG_Image_Image_Src.java   |    8 +-
 .../uitest/TC_AG/AG_Input_Input_Autofocus.java  |    8 +-
 .../weex/uitest/TC_AG/AG_Input_Input_Color.java |    8 +-
 .../uitest/TC_AG/AG_Input_Input_Disabled.java   |    8 +-
 .../weex/uitest/TC_AG/AG_Input_Input_Event.java |    4 +-
 .../uitest/TC_AG/AG_Input_Input_Font_Size.java  |    8 +-
 .../uitest/TC_AG/AG_Input_Input_Font_Style.java |    8 +-
 .../TC_AG/AG_Input_Input_Font_Weight.java       |    8 +-
 .../TC_AG/AG_Input_Input_Placeholder.java       |    8 +-
 .../TC_AG/AG_Input_Input_Placeholder_Color.java |    8 +-
 .../uitest/TC_AG/AG_Input_Input_Text_Align.java |   10 +-
 .../weex/uitest/TC_AG/AG_Input_Input_Type.java  |   14 +-
 .../weex/uitest/TC_AG/AG_Input_Input_Value.java |   10 +-
 .../weex/uitest/TC_AG/AG_Margin_A_Margin.java   |    8 +-
 .../uitest/TC_AG/AG_Margin_A_Margin_Bottom.java |    8 +-
 .../uitest/TC_AG/AG_Margin_A_Margin_Left.java   |    8 +-
 .../uitest/TC_AG/AG_Margin_A_Margin_Right.java  |    8 +-
 .../uitest/TC_AG/AG_Margin_A_Margin_Top.java    |    8 +-
 .../weex/uitest/TC_AG/AG_Margin_Div_Margin.java |    8 +-
 .../TC_AG/AG_Margin_Div_Margin_Bottom.java      |    8 +-
 .../uitest/TC_AG/AG_Margin_Div_Margin_Left.java |    8 +-
 .../TC_AG/AG_Margin_Div_Margin_Right.java       |    8 +-
 .../uitest/TC_AG/AG_Margin_Div_Margin_Top.java  |    8 +-
 .../uitest/TC_AG/AG_Margin_Image_Margin.java    |    8 +-
 .../TC_AG/AG_Margin_Image_Margin_Bottom.java    |    8 +-
 .../TC_AG/AG_Margin_Image_Margin_Left.java      |    8 +-
 .../TC_AG/AG_Margin_Image_Margin_Right.java     |    8 +-
 .../TC_AG/AG_Margin_Image_Margin_Top.java       |    8 +-
 .../uitest/TC_AG/AG_Margin_Input_Margin.java    |    8 +-
 .../TC_AG/AG_Margin_Input_Margin_Bottom.java    |    8 +-
 .../TC_AG/AG_Margin_Input_Margin_Left.java      |    8 +-
 .../TC_AG/AG_Margin_Input_Margin_Right.java     |    8 +-
 .../TC_AG/AG_Margin_Input_Margin_Top.java       |    8 +-
 .../uitest/TC_AG/AG_Margin_Switch_Margin.java   |    8 +-
 .../TC_AG/AG_Margin_Switch_Margin_Bottom.java   |    8 +-
 .../TC_AG/AG_Margin_Switch_Margin_Left.java     |    8 +-
 .../TC_AG/AG_Margin_Switch_Margin_Right.java    |    8 +-
 .../TC_AG/AG_Margin_Switch_Margin_Top.java      |    8 +-
 .../uitest/TC_AG/AG_Margin_Text_Margin.java     |    8 +-
 .../TC_AG/AG_Margin_Text_Margin_Bottom.java     |    8 +-
 .../TC_AG/AG_Margin_Text_Margin_Left.java       |    8 +-
 .../TC_AG/AG_Margin_Text_Margin_Right.java      |    8 +-
 .../uitest/TC_AG/AG_Margin_Text_Margin_Top.java |    8 +-
 .../uitest/TC_AG/AG_Margin_Video_Margin.java    |    8 +-
 .../TC_AG/AG_Margin_Video_Margin_Bottom.java    |    8 +-
 .../TC_AG/AG_Margin_Video_Margin_Left.java      |    8 +-
 .../TC_AG/AG_Margin_Video_Margin_Right.java     |    8 +-
 .../TC_AG/AG_Margin_Video_Margin_Top.java       |    8 +-
 .../weex/uitest/TC_AG/AG_Margin_Web_Margin.java |    8 +-
 .../TC_AG/AG_Margin_Web_Margin_Bottom.java      |    8 +-
 .../uitest/TC_AG/AG_Margin_Web_Margin_Left.java |    8 +-
 .../TC_AG/AG_Margin_Web_Margin_Right.java       |    8 +-
 .../uitest/TC_AG/AG_Margin_Web_Margin_Top.java  |    8 +-
 .../uitest/TC_AG/AG_Switch_Switch_Checked.java  |    8 +-
 .../uitest/TC_AG/AG_Switch_Switch_Onchange.java |    4 +-
 .../weex/uitest/TC_AG/AG_Text_Text_Color.java   |    8 +-
 .../uitest/TC_AG/AG_Text_Text_Font_Size.java    |    8 +-
 .../uitest/TC_AG/AG_Text_Text_Font_Style.java   |    8 +-
 .../uitest/TC_AG/AG_Text_Text_Font_Weight.java  |    8 +-
 .../uitest/TC_AG/AG_Text_Text_Line_Height.java  |   12 +-
 .../uitest/TC_AG/AG_Text_Text_Text_Align.java   |   10 +-
 .../TC_AG/AG_Text_Text_Text_Decoration.java     |   10 +-
 .../TC_AG/AG_Text_Text_Text_Overflow.java       |   14 +-
 .../weex/uitest/TC_AG/AG_Text_Text_Value.java   |   10 +-
 .../uitest/TC_AG/AG_Video_Video_Auto_Play.java  |    8 +-
 .../weex/uitest/TC_AG/AG_Video_Video_Event.java |    4 +-
 .../TC_AG/AG_Video_Video_Play_Status.java       |    8 +-
 .../weex/uitest/TC_AG/AG_Video_Video_Src.java   |    8 +-
 .../weex/uitest/TC_AG/AG_Web_Web_Event.java     |    4 +-
 .../weex/uitest/TC_AG/AG_Web_Web_Src.java       |    8 +-
 .../TC_AHref/WeexUiTestCaseTCAHrefEvent.java    |    3 +-
 .../TC_AHref/WeexUiTestCaseTCAHrefStyle.java    |    4 +-
 .../TC_AHref/WeexUiTestCaseTCAHrefUpdate.java   |    2 +
 .../TC_Input/WeexUiTestCaseTcInputEvent.java    |    6 +-
 .../java/com/alibaba/weex/util/TestFlow.java    |  114 +-
 .../java/com/alibaba/weex/util/ViewUtil.java    |    3 +-
 .../playground/app/src/main/assets/animation.js | 1860 +++--
 .../app/src/main/assets/component/a-demo.js     | 1740 +++--
 .../src/main/assets/component/countdown-demo.js | 2187 ++++--
 .../app/src/main/assets/component/image-demo.js | 2211 ++++--
 .../app/src/main/assets/component/input-demo.js | 2075 ++++--
 .../main/assets/component/list/list-basic.js    | 1370 +---
 .../assets/component/list/list-demo-horizon.js  |  620 +-
 .../src/main/assets/component/list/list-demo.js | 2448 +++---
 .../src/main/assets/component/marquee-demo.js   | 1959 +++--
 .../src/main/assets/component/navigator-demo.js | 3007 ++++++--
 .../main/assets/component/process-bar-demo.js   | 2158 ++++++
 .../src/main/assets/component/scroller-demo.js  | 2234 ++++--
 .../slider-neighbor/silder-neighbor.js          |  287 +
 .../slider-neighbor/slider-neighbor-item.js     |  133 +
 .../slider-neighbor/slider-neighbor-page.js     |  213 +
 .../src/main/assets/component/slider/index.js   | 3167 +++++---
 .../main/assets/component/slider/slider-item.js |   88 +-
 .../main/assets/component/slider/slider-page.js |  186 +-
 .../main/assets/component/tabbar/tabbar-demo.js | 2731 +++++--
 .../main/assets/component/tabbar/tabbar-item.js |  108 +-
 .../app/src/main/assets/component/text-demo.js  | 3641 +++++----
 .../app/src/main/assets/component/video-demo.js | 1942 +++--
 .../app/src/main/assets/component/web-demo.js   | 2253 ++++--
 android/playground/app/src/main/assets/hello.js |   34 +-
 .../playground/app/src/main/assets/iconfont.js  |  108 +-
 .../app/src/main/assets/image-demo2.js          |   83 -
 android/playground/app/src/main/assets/index.js | 2935 ++++++--
 .../app/src/main/assets/module/clipboard.js     | 2072 ++++--
 .../app/src/main/assets/module/componentRect.js |  468 ++
 .../app/src/main/assets/module/instance-api.js  | 1874 +++--
 .../app/src/main/assets/module/modal.js         | 2125 ++++--
 .../app/src/main/assets/module/picker-demo.js   | 2347 ++++++
 .../app/src/main/assets/module/storage-demo.js  | 2294 ++++--
 .../app/src/main/assets/module/stream-demo.js   | 2494 +++++--
 .../app/src/main/assets/showcase/calculator.js  | 2588 +++++--
 .../assets/showcase/dropdown/dropdown-demo.js   |  695 +-
 .../assets/showcase/dropdown/we-dropdown.js     |  229 +-
 .../app/src/main/assets/showcase/minesweeper.js |  402 +-
 .../main/assets/showcase/new-fashion/banner.js  |   91 +-
 .../main/assets/showcase/new-fashion/banners.js |  187 +-
 .../main/assets/showcase/new-fashion/brand.js   |  367 +-
 .../assets/showcase/new-fashion/category.js     | 1034 +--
 .../main/assets/showcase/new-fashion/coupon.js  |   99 +-
 .../main/assets/showcase/new-fashion/fashion.js |  371 +-
 .../main/assets/showcase/new-fashion/goods.js   |  193 +-
 .../assets/showcase/new-fashion/headlines.js    |  505 +-
 .../main/assets/showcase/new-fashion/index.js   | 2839 +++++--
 .../main/assets/showcase/new-fashion/link.js    |   78 +-
 .../main/assets/showcase/new-fashion/main.js    | 6963 +++++++++++-------
 .../main/assets/showcase/new-fashion/match.js   |  211 +-
 .../assets/showcase/new-fashion/resource.js     |  315 +-
 .../main/assets/showcase/new-fashion/scene.js   |  560 +-
 .../app/src/main/assets/showcase/ui.js          | 2314 ++++--
 .../app/src/main/assets/style/index.js          | 2529 +++++--
 .../app/src/main/assets/style/style-box.js      | 2907 +++++---
 .../app/src/main/assets/style/style-flex.js     | 4387 ++++++-----
 .../app/src/main/assets/style/style-item.js     |   85 +-
 .../app/src/main/assets/syntax/hello-world-1.js |   34 +-
 .../app/src/main/assets/syntax/hello-world-2.js |   34 +-
 .../app/src/main/assets/syntax/hello-world-3.js |   48 +-
 .../app/src/main/assets/syntax/hello-world-4.js |   76 +-
 .../app/src/main/assets/syntax/hello-world-5.js |   86 +-
 .../app/src/main/assets/syntax/hello-world.js   |   86 +-
 .../app/src/main/assets/syntax/index.js         | 3033 ++++++--
 .../src/main/assets/syntax/script-component.js  |  120 +-
 .../app/src/main/assets/syntax/script-data.js   |  125 +-
 .../app/src/main/assets/syntax/script-events.js |  142 +-
 .../src/main/assets/syntax/script-instance.js   |  146 +-
 .../src/main/assets/syntax/script-lifecycle.js  |   96 +-
 .../app/src/main/assets/syntax/script-module.js |   86 +-
 .../src/main/assets/syntax/script-options.js    |  128 +-
 .../src/main/assets/syntax/template-class.js    |   82 +-
 .../src/main/assets/syntax/template-content.js  |   78 +-
 .../src/main/assets/syntax/template-event.js    |   92 +-
 .../app/src/main/assets/syntax/template-if.js   |   82 +-
 .../assets/syntax/template-repeat-update.js     |  109 +-
 .../src/main/assets/syntax/template-repeat.js   |   92 +-
 .../src/main/assets/syntax/template-style.js    |   72 +-
 .../playground/app/src/main/assets/template.js  | 2163 ++++--
 .../java/com/alibaba/weex/IndexActivity.java    |    7 +-
 .../java/com/alibaba/weex/WXPageActivity.java   |   59 +-
 .../com/alibaba/weex/constants/Constants.java   |    2 +-
 .../alibaba/weex/extend/component/RichText.java |    4 +-
 .../weex/extend/module/WXEventModule.java       |    6 +
 .../alibaba/weex/https/WXOkHttpDispatcher.java  |    2 -
 .../com.taobao.taobao_2016.11.21_17.35.li       |  Bin 0 -> 2415126 bytes
 android/sdk/assets/main.js                      |   14 +-
 android/sdk/build.gradle                        |    2 +-
 android/sdk/libs/armeabi/libweexv8.so           |  Bin 3579724 -> 3579724 bytes
 android/sdk/libs/x86/libweexv8.so               |  Bin 4328576 -> 4328576 bytes
 android/sdk/src/main/AndroidManifest.xml        |   39 +-
 .../main/java/com/taobao/weex/InitConfig.java   |   13 +-
 .../java/com/taobao/weex/WXEnvironment.java     |   24 +-
 .../com/taobao/weex/WXGlobalEventModule.java    |   13 +-
 .../com/taobao/weex/WXGlobalEventReceiver.java  |  237 +
 .../main/java/com/taobao/weex/WXSDKEngine.java  |   45 +-
 .../java/com/taobao/weex/WXSDKInstance.java     |  162 +-
 .../main/java/com/taobao/weex/WXSDKManager.java |   46 +-
 .../taobao/weex/adapter/DefaultUriAdapter.java  |  266 +
 .../com/taobao/weex/adapter/URIAdapter.java     |  265 +
 .../com/taobao/weex/annotation/JSMethod.java    |  225 +
 .../appfram/navigator/WXNavigatorModule.java    |   56 +-
 .../weex/appfram/pickers/DatePickerImpl.java    |  353 +
 .../weex/appfram/pickers/WXPickersModule.java   |  366 +
 .../weex/appfram/storage/DefaultWXStorage.java  |  127 +-
 .../appfram/storage/WXSQLiteOpenHelper.java     |   70 +-
 .../taobao/weex/bridge/BaseMethodInvoker.java   |  224 +
 .../taobao/weex/bridge/JSCallbackCreator.java   |  213 +
 .../taobao/weex/bridge/SimpleJSCallback.java    |  229 +
 .../com/taobao/weex/bridge/WXBridgeManager.java |  171 +-
 .../com/taobao/weex/bridge/WXModuleManager.java |   77 +-
 .../java/com/taobao/weex/common/Constants.java  |   20 +-
 .../com/taobao/weex/common/WXErrorCode.java     |   26 +-
 .../com/taobao/weex/common/WXImageStrategy.java |    5 +
 .../java/com/taobao/weex/common/WXModule.java   |  359 +-
 .../com/taobao/weex/common/WXPerformance.java   |   35 +-
 .../java/com/taobao/weex/dom/WXDomHandler.java  |   20 +-
 .../java/com/taobao/weex/dom/WXDomManager.java  |  105 +-
 .../java/com/taobao/weex/dom/WXDomModule.java   |   97 +-
 .../com/taobao/weex/dom/WXDomStatement.java     |   83 +-
 .../main/java/com/taobao/weex/dom/WXStyle.java  |   23 +
 .../java/com/taobao/weex/http/WXHttpUtil.java   |    2 +
 .../com/taobao/weex/http/WXStreamModule.java    |   31 +-
 .../com/taobao/weex/ui/ComponentCreator.java    |    2 +-
 .../weex/ui/ExternalLoaderComponentHolder.java  |   59 +-
 .../weex/ui/IExternalComponentGetter.java       |    3 +-
 .../com/taobao/weex/ui/IFComponentHolder.java   |    6 +-
 .../taobao/weex/ui/SimpleComponentHolder.java   |   85 +-
 .../com/taobao/weex/ui/WXComponentRegistry.java |   14 +-
 .../com/taobao/weex/ui/WXRenderManager.java     |   14 +
 .../com/taobao/weex/ui/WXRenderStatement.java   |   30 +-
 .../ui/animation/DimensionUpdateListener.java   |    6 +-
 .../weex/ui/animation/WXAnimationBean.java      |    2 +-
 .../weex/ui/animation/WXAnimationModule.java    |    1 -
 .../ui/component/AbstractEditComponent.java     |  197 +-
 .../weex/ui/component/AppearanceHelper.java     |    6 +-
 .../com/taobao/weex/ui/component/Textarea.java  |    7 +
 .../java/com/taobao/weex/ui/component/WXA.java  |   15 +-
 .../taobao/weex/ui/component/WXComponent.java   |  155 +-
 .../weex/ui/component/WXComponentFactory.java   |   25 +-
 .../com/taobao/weex/ui/component/WXDiv.java     |   10 +-
 .../com/taobao/weex/ui/component/WXEmbed.java   |   21 +-
 .../com/taobao/weex/ui/component/WXHeader.java  |    6 +-
 .../com/taobao/weex/ui/component/WXImage.java   |   73 +-
 .../com/taobao/weex/ui/component/WXLoading.java |    4 +-
 .../com/taobao/weex/ui/component/WXRefresh.java |    4 +-
 .../taobao/weex/ui/component/WXScroller.java    |   50 +-
 .../com/taobao/weex/ui/component/WXSlider.java  |   44 +-
 .../weex/ui/component/WXSliderNeighbor.java     |  120 +-
 .../com/taobao/weex/ui/component/WXSwitch.java  |   33 +-
 .../com/taobao/weex/ui/component/WXText.java    |   21 +-
 .../taobao/weex/ui/component/WXVContainer.java  |   41 +-
 .../com/taobao/weex/ui/component/WXVideo.java   |    4 +-
 .../com/taobao/weex/ui/component/WXWeb.java     |    6 +-
 .../ui/component/helper/WXTimeInputHelper.java  |  254 +
 .../taobao/weex/ui/component/list/WXCell.java   |   20 +-
 .../weex/ui/component/list/WXListComponent.java |  153 +-
 .../taobao/weex/ui/module/WXModalUIModule.java  |   26 +-
 .../weex/ui/view/WXBaseCircleIndicator.java     |    7 +-
 .../weex/ui/view/WXCirclePageAdapter.java       |   93 +-
 .../taobao/weex/ui/view/WXCircleViewPager.java  |  200 +-
 .../com/taobao/weex/ui/view/WXEditText.java     |   24 +
 .../taobao/weex/ui/view/WXLoadingLayout.java    |  217 +
 .../taobao/weex/ui/view/WXRefreshLayout.java    |  217 +
 .../com/taobao/weex/ui/view/WXSwitchView.java   |    4 +-
 .../com/taobao/weex/ui/view/WXTextView.java     |    3 +
 .../weex/ui/view/listview/WXRecyclerView.java   |   28 +-
 .../ui/view/refresh/wrapper/BaseBounceView.java |   21 +
 .../refresh/wrapper/BounceRecyclerView.java     |   35 +-
 .../main/java/com/taobao/weex/utils/FontDO.java |   27 +-
 .../com/taobao/weex/utils/FunctionParser.java   |    6 +-
 .../taobao/weex/utils/SingleFunctionParser.java |   23 +-
 .../com/taobao/weex/utils/TypefaceUtil.java     |   42 +-
 .../taobao/weex/utils/WXReflectionUtils.java    |   37 +
 .../com/taobao/weex/utils/WXResourceUtils.java  |  179 +-
 .../taobao/weex/utils/WXSoInstallMgrSdk.java    |   10 +-
 .../java/com/taobao/weex/utils/WXUtils.java     |   17 +
 .../java/com/taobao/weex/utils/WXViewUtils.java |   30 +-
 .../java/com/taobao/weex/WXSDKEngineTest.java   |    2 +-
 .../java/com/taobao/weex/WXSDKManagerTest.java  |    4 +
 .../weex/adapter/DefaultUriAdapterTest.java     |  299 +
 .../appfram/storage/DefaultWXStorageTest.java   |   14 +-
 .../java/com/taobao/weex/dom/WXStyleTest.java   |  261 +
 .../taobao/weex/http/WXStreamModuleTest.java    |   18 +-
 .../com/taobao/weex/ui/ComponentHolderTest.java |   14 +-
 .../ui/animation/WXAnimationModuleTest.java     |    2 +-
 .../taobao/weex/ui/component/ComponentTest.java |    4 +-
 .../weex/ui/component/EditComponentTest.java    |   19 +-
 .../taobao/weex/ui/component/TestComponent.java |    4 +-
 .../com/taobao/weex/ui/component/WXDivTest.java |   10 +-
 .../taobao/weex/ui/component/WXHeaderTest.java  |    2 +-
 .../taobao/weex/ui/component/WXImageTest.java   |    2 +-
 .../weex/ui/component/WXScrollerTest.java       |    2 +-
 .../taobao/weex/ui/component/WXSliderTest.java  |    4 +-
 .../taobao/weex/ui/component/WXTextTest.java    |    4 +-
 .../taobao/weex/ui/component/WXVideoTest.java   |    2 +-
 .../component/helper/WXTimeInputHelperTest.java |  254 +
 .../ui/component/list/WXListComponentTest.java  |    2 +-
 .../weex/ui/view/WXCirclePageAdapterTest.java   |   12 +-
 .../com/taobao/weex/utils/TypefaceUtilTest.java |    6 +-
 .../taobao/weex/utils/WXResourceUtilsTest.java  |    4 +-
 bin/commit-msg.sh                               |    4 +-
 bin/dist-js-framework.sh                        |    2 +-
 build/build.js                                  |  180 +
 build/config.frameworks.js                      |   51 -
 build/rollup.browser.common.config.js           |   35 +
 build/rollup.browser.config.js                  |   38 +
 build/rollup.config.js                          |   34 +
 build/webpack.browser.config.js                 |   43 -
 build/webpack.common.config.js                  |   50 -
 build/webpack.examples.config.js                |   21 +-
 build/webpack.native.config.js                  |   42 -
 circle.yml                                      |    7 +-
 dist/weex-js-framework/index.js                 |    2 +-
 dist/weex-js-framework/package.json             |    7 +-
 doc/SUMMARY.md                                  |    4 +
 doc/_layouts/header.html                        |   24 +-
 doc/advanced/extend-to-android.md               |    1 -
 doc/advanced/extend-to-html5.md                 |    1 -
 doc/advanced/extend-to-ios.md                   |    9 +-
 doc/advanced/how-data-binding-works.md          |    1 -
 doc/advanced/how-it-works.md                    |    5 +-
 doc/advanced/integrate-to-android.md            |    3 +-
 doc/advanced/integrate-to-html5.md              |    1 -
 doc/advanced/integrate-to-ios.md                |    5 +-
 doc/ali_addition/weex_doc.css                   |    8 +-
 doc/components/a.md                             |    8 +-
 doc/components/cell.md                          |    1 -
 doc/components/div.md                           |    1 -
 doc/components/image.md                         |    1 -
 doc/components/indicator.md                     |    1 -
 doc/components/input.md                         |    1 -
 doc/components/list.md                          |    1 -
 doc/components/scroller.md                      |    1 -
 doc/components/slider.md                        |    2 +-
 doc/components/special-element.md               |    3 +-
 doc/components/switch.md                        |    1 -
 doc/components/text.md                          |    3 +-
 doc/components/textarea.md                      |   74 +
 doc/components/video.md                         |    1 -
 doc/components/web.md                           |    3 +-
 doc/components/wxc-navpage.md                   |    1 -
 doc/components/wxc-tabbar.md                    |    3 +-
 doc/demo/animation.md                           |    2 +-
 doc/demo/hello-world.md                         |    2 +-
 doc/demo/list.md                                |    2 +-
 doc/demo/modal.md                               |    2 +-
 doc/demo/slider.md                              |    2 +-
 doc/faq.md                                      |   24 +-
 doc/how-to/customize-a-native-component.md      |    3 +-
 doc/how-to/cuszomize-native-apis.md             |    1 -
 doc/how-to/debug-with-html5.md                  |    5 +-
 doc/how-to/debug-with-native.md                 |    3 -
 doc/how-to/maintain-your-component-code.md      |    3 -
 doc/how-to/manage-data-with-a-high-level-cms.md |    3 -
 doc/how-to/manage-your-file-structure.md        |    3 -
 doc/how-to/preview-in-browser.md                |    3 +-
 doc/how-to/preview-in-playground-app.md         |    7 +-
 doc/how-to/require-3rd-party-libs.md            |    1 -
 doc/how-to/transform-code-into-js-bundle.md     |    3 +-
 doc/modules/animation.md                        |   14 +-
 doc/modules/clipboard.md                        |    3 +-
 doc/modules/dom.md                              |    1 -
 doc/modules/globalevent.md                      |   76 +
 doc/modules/main.md                             |    3 +-
 doc/modules/modal.md                            |    1 -
 doc/modules/navigator.md                        |    3 +-
 doc/modules/storage.md                          |    3 +-
 doc/modules/stream.md                           |    3 +-
 doc/modules/webview.md                          |    1 -
 doc/references/api.md                           |    5 +-
 doc/references/bootstrap.md                     |    1 -
 doc/references/color-names.md                   |    1 -
 doc/references/common-attrs.md                  |    1 -
 doc/references/common-event.md                  |    1 -
 doc/references/common-style.md                  |    4 +-
 doc/references/component-defs.md                |    1 -
 doc/references/styles/units/color.md            |    6 +-
 doc/references/text-style.md                    |    3 +-
 doc/specs/js-framework-apis.md                  |    1 -
 doc/specs/virtual-dom-apis.md                   |    5 +-
 doc/syntax/comm.md                              |    7 +-
 doc/syntax/composed-component.md                |    1 -
 doc/syntax/config-n-data.md                     |   27 +-
 doc/syntax/data-binding.md                      |   27 +-
 doc/syntax/display-logic.md                     |    3 +-
 doc/syntax/events.md                            |    1 -
 doc/syntax/id.md                                |    1 -
 doc/syntax/main.md                              |    1 -
 doc/syntax/render-logic.md                      |    3 +-
 doc/syntax/style-n-class.md                     |    1 -
 doc/tools/devtools-android.md                   |   15 +-
 doc/tools/devtools-ios.md                       |    3 +-
 doc/tools/devtools.md                           |   10 +-
 doc/tools/how-to-debug.md                       |    6 +-
 doc/tools/playground-app.md                     |    8 +-
 doc/tutorial.md                                 |    7 +-
 examples/component/input-demo.we                |  168 +-
 examples/component/list/list-demo.we            |    2 +-
 examples/component/navigator-demo.we            |  127 +-
 examples/component/slider-neighbor/index.we     |   74 +
 .../slider-neighbor/silder-neighbor.we          |   63 -
 examples/component/web-demo.we                  |   14 +-
 examples/index.we                               |    9 +-
 examples/module/clipboard.we                    |   17 +-
 examples/module/componentRect.we                |  130 +
 examples/module/picker-demo.we                  |  102 +
 examples/module/stream-demo.we                  |    3 +-
 examples/module/websocket-demo.we               |  112 +
 examples/showcase/minesweeper.we                |    6 +-
 examples/syntax/hello-world-2.we                |    2 +-
 examples/syntax/hello-world-3.we                |    2 +-
 examples/syntax/hello-world-4.we                |    2 +-
 examples/syntax/hello-world-5.we                |    2 +-
 examples/syntax/hello-world.we                  |    2 +-
 examples/test.we                                |   25 +
 examples/vanilla/index.js                       |    2 +-
 examples/vue/animation.vue                      |  147 +
 examples/vue/components/a.vue                   |   22 +
 examples/vue/components/countdown.vue           |   86 +
 examples/vue/components/image.vue               |   55 +
 examples/vue/components/input.vue               |   47 +
 examples/vue/components/list.vue                |  112 +
 examples/vue/components/marquee.vue             |   65 +
 examples/vue/components/navigator.vue           |   71 +
 examples/vue/components/scroller.vue            |  161 +
 examples/vue/components/slider.vue              |  262 +
 examples/vue/components/tabbar.vue              |   61 +
 examples/vue/components/text.vue                |   60 +
 examples/vue/components/video.vue               |   56 +
 examples/vue/components/web.vue                 |   74 +
 examples/vue/hello.vue                          |    5 +
 examples/vue/iconfont.vue                       |   59 +
 examples/vue/include/base-url.js                |   30 +
 examples/vue/include/example-list-item.vue      |   30 +
 examples/vue/include/example-list.vue           |   35 +
 examples/vue/include/foo.vue                    |   12 +
 examples/vue/include/h1.vue                     |   13 +
 examples/vue/include/h2.vue                     |   13 +
 examples/vue/include/h3.vue                     |   13 +
 examples/vue/include/slider-item.vue            |   19 +
 examples/vue/include/slider-page.vue            |   27 +
 examples/vue/include/wxc-list-item.vue          |   47 +
 examples/vue/index.vue                          |   49 +
 examples/vue/modules/clipboard.vue              |   59 +
 examples/vue/modules/instance-api.vue           |   23 +
 examples/vue/modules/modal.vue                  |   71 +
 examples/vue/modules/storage.vue                |   80 +
 examples/vue/modules/stream.vue                 |  168 +
 examples/vue/showcase/calculator.vue            |  100 +
 examples/vue/showcase/include/banner.vue        |   23 +
 examples/vue/showcase/include/banners.vue       |   22 +
 examples/vue/showcase/include/brand.vue         |   63 +
 examples/vue/showcase/include/category.vue      |  513 ++
 examples/vue/showcase/include/coupon.vue        |   85 +
 examples/vue/showcase/include/goods.vue         |   69 +
 examples/vue/showcase/include/headlines.vue     |   94 +
 examples/vue/showcase/include/link.vue          |   17 +
 examples/vue/showcase/include/match.vue         |   50 +
 examples/vue/showcase/include/resource.vue      |   43 +
 examples/vue/showcase/include/scene.vue         |  283 +
 examples/vue/showcase/include/util.js           |  149 +
 examples/vue/showcase/itemlist.vue              |  541 ++
 examples/vue/showcase/new-fashion.vue           |  605 ++
 examples/vue/showcase/progress.vue              |   42 +
 examples/vue/style/index.vue                    |   41 +
 examples/vue/style/style-box.vue                |   70 +
 examples/vue/style/style-flex.vue               |  125 +
 examples/vue/style/style-item.vue               |   37 +
 examples/vue/syntax/hello-world-1.vue           |    7 +
 examples/vue/syntax/hello-world-2.vue           |   14 +
 examples/vue/syntax/hello-world-3.vue           |   21 +
 examples/vue/syntax/hello-world-4.vue           |   32 +
 examples/vue/syntax/hello-world-5.vue           |   35 +
 examples/vue/syntax/hello-world.vue             |   44 +
 examples/vue/syntax/include/btn.vue             |    9 +
 examples/vue/syntax/include/sub.vue             |   16 +
 examples/vue/syntax/script-component.vue        |   29 +
 examples/vue/syntax/script-data.vue             |   81 +
 examples/vue/syntax/script-events.vue           |   36 +
 examples/vue/syntax/script-instance.vue         |   69 +
 examples/vue/syntax/script-lifecycle.vue        |   28 +
 examples/vue/syntax/script-module.vue           |   28 +
 examples/vue/syntax/script-options.vue          |   60 +
 examples/vue/syntax/template-class.vue          |   29 +
 examples/vue/syntax/template-content.vue        |   20 +
 examples/vue/syntax/template-event.vue          |   36 +
 examples/vue/syntax/template-if.vue             |   29 +
 examples/vue/syntax/template-repeat-update.vue  |   50 +
 examples/vue/syntax/template-repeat.vue         |   41 +
 examples/vue/syntax/template-style.vue          |   24 +
 examples/vue/template.vue                       |   40 +
 examples/vue/test.vue                           |   16 +
 examples/vue/test2.vue                          |    6 +
 html5/browser/base/atomic.js                    |   32 -
 html5/browser/base/component/flexbox.js         |   54 -
 html5/browser/base/component/index.js           |  212 -
 html5/browser/base/component/lazyload.js        |   68 -
 html5/browser/base/component/operate.js         |  198 -
 html5/browser/base/component/position.js        |   82 -
 html5/browser/base/component/sticky.js          |  230 -
 html5/browser/base/component/valueFilter.js     |   36 -
 html5/browser/base/div.js                       |   16 -
 html5/browser/base/droot.js                     |   60 -
 html5/browser/base/root.js                      |   77 -
 html5/browser/bridge/index.js                   |    7 -
 html5/browser/bridge/protocol.js                |  112 -
 html5/browser/bridge/receiver.js                |  124 -
 html5/browser/bridge/sender.js                  |   45 -
 html5/browser/dom/appearWatcher.js              |  150 -
 html5/browser/dom/componentManager.js           |  384 -
 html5/browser/dom/index.js                      |    7 -
 html5/browser/extend/api/animation/index.js     |   51 -
 html5/browser/extend/api/animation/lib.js       |   35 -
 html5/browser/extend/api/clipboard.js           |   73 -
 html5/browser/extend/api/dom.js                 |   69 -
 html5/browser/extend/api/event.js               |   25 -
 html5/browser/extend/api/geolocation.js         |   66 -
 html5/browser/extend/api/globalEvent.js         |   46 -
 html5/browser/extend/api/modal.js               |   71 -
 html5/browser/extend/api/navigator.js           |   38 -
 html5/browser/extend/api/pageInfo.js            |   26 -
 html5/browser/extend/api/storage.js             |  159 -
 html5/browser/extend/api/stream.js              |  304 -
 html5/browser/extend/api/timer.js               |   62 -
 html5/browser/extend/api/webview.js             |   57 -
 html5/browser/extend/components/a.js            |   61 -
 html5/browser/extend/components/countdown.js    |   72 -
 html5/browser/extend/components/datepicker.js   |   44 -
 html5/browser/extend/components/embed.js        |   82 -
 html5/browser/extend/components/image/image.css |    5 -
 html5/browser/extend/components/image/index.js  |   84 -
 .../extend/components/indicator/index.js        |  186 -
 .../extend/components/indicator/indicator.css   |    8 -
 html5/browser/extend/components/input.js        |  133 -
 html5/browser/extend/components/marquee.js      |  284 -
 .../extend/components/scrollable/index.js       |   15 -
 .../extend/components/scrollable/list/hlist.js  |   18 -
 .../extend/components/scrollable/list/index.js  |   11 -
 .../extend/components/scrollable/list/list.js   |   67 -
 .../extend/components/scrollable/list/vlist.js  |   18 -
 .../components/scrollable/loading/index.js      |  129 -
 .../components/scrollable/loading/loading.css   |   15 -
 .../extend/components/scrollable/motion.js      |   81 -
 .../components/scrollable/refresh/index.js      |  141 -
 .../components/scrollable/refresh/refresh.css   |   16 -
 .../extend/components/scrollable/scroll.js      | 1200 ---
 .../extend/components/scrollable/scrollable.css |   15 -
 .../extend/components/scrollable/scrollable.js  |  307 -
 .../components/scrollable/scroller/index.js     |   25 -
 html5/browser/extend/components/select.js       |   92 -
 .../extend/components/slider/carrousel.css      |    6 -
 .../extend/components/slider/carrousel.js       |  436 --
 html5/browser/extend/components/slider/index.js |  349 -
 .../browser/extend/components/slider/slider.css |   34 -
 html5/browser/extend/components/slider/timer.js |   66 -
 .../browser/extend/components/spinner/index.js  |  139 -
 .../extend/components/spinner/spinner.css       |   79 -
 html5/browser/extend/components/switch/index.js |  238 -
 .../browser/extend/components/switch/switch.css |   24 -
 .../extend/components/tabheader/index.js        |  399 -
 .../extend/components/tabheader/tabheader.css   |  140 -
 html5/browser/extend/components/text.js         |  107 -
 html5/browser/extend/components/textarea.js     |   94 -
 html5/browser/extend/components/timepicker.js   |   43 -
 html5/browser/extend/components/video/index.js  |  116 -
 html5/browser/extend/components/video/video.css |    3 -
 html5/browser/extend/components/web.js          |  102 -
 html5/browser/extend/index.js                   |   11 -
 html5/browser/index.js                          |   18 -
 html5/browser/render/config.js                  |   12 -
 html5/browser/render/gesture.js                 |  493 --
 html5/browser/render/index.js                   |  240 -
 html5/browser/render/loader.js                  |   65 -
 html5/browser/render/register.js                |   72 -
 html5/browser/render/style/base.css             |   38 -
 html5/browser/runtime/app/bundle/bootstrap.js   |   44 -
 html5/browser/runtime/app/bundle/index.js       |   16 -
 html5/browser/runtime/app/ctrl/index.js         |   22 -
 html5/browser/runtime/app/ctrl/init.js          |   94 -
 html5/browser/runtime/app/index.js              |   31 -
 html5/browser/runtime/config.js                 |    5 -
 html5/browser/runtime/default/.DS_Store         |  Bin 6148 -> 0 bytes
 html5/browser/runtime/default/index.js          |   19 -
 html5/browser/runtime/index.js                  |   38 -
 html5/browser/runtime/shared.js                 |   13 -
 html5/browser/runtime/static/create.js          |   26 -
 html5/browser/utils/array.js                    |   15 -
 html5/browser/utils/frameUpdater.js             |   47 -
 html5/browser/utils/index.js                    |  218 -
 html5/default/api/methods.js                    |  185 -
 html5/default/api/modules.js                    |   78 -
 html5/default/app/bundle/bootstrap.js           |   66 -
 html5/default/app/bundle/define.js              |   97 -
 html5/default/app/bundle/index.js               |   16 -
 html5/default/app/ctrl/index.js                 |   22 -
 html5/default/app/ctrl/init.js                  |  155 -
 html5/default/app/ctrl/misc.js                  |  235 -
 html5/default/app/differ.js                     |   73 -
 html5/default/app/downgrade.js                  |  154 -
 html5/default/app/index.js                      |   31 -
 html5/default/app/instance.js                   |   29 -
 html5/default/app/register.js                   |  100 -
 html5/default/config.js                         |   16 -
 html5/default/core/LICENSE                      |   21 -
 html5/default/core/array.js                     |   93 -
 html5/default/core/dep.js                       |   79 -
 html5/default/core/object.js                    |   84 -
 html5/default/core/observer.js                  |  317 -
 html5/default/core/state.js                     |   90 -
 html5/default/core/watcher.js                   |  265 -
 html5/default/index.js                          |    9 -
 html5/default/static/bridge.js                  |   37 -
 html5/default/static/create.js                  |   28 -
 html5/default/static/life.js                    |   52 -
 html5/default/static/map.js                     |    1 -
 html5/default/static/misc.js                    |   21 -
 html5/default/static/register.js                |   54 -
 html5/default/util/LICENSE                      |   21 -
 html5/default/util/index.js                     |  134 -
 html5/default/vm/compiler.js                    |  618 --
 html5/default/vm/directive.js                   |  356 -
 html5/default/vm/dom-helper.js                  |  240 -
 html5/default/vm/events.js                      |  160 -
 html5/default/vm/index.js                       |  113 -
 html5/frameworks/index.js                       |    9 +
 html5/frameworks/legacy/api/methods.js          |  204 +
 html5/frameworks/legacy/api/modules.js          |   78 +
 html5/frameworks/legacy/app/bundle/bootstrap.js |   66 +
 html5/frameworks/legacy/app/bundle/define.js    |   97 +
 html5/frameworks/legacy/app/bundle/index.js     |   16 +
 html5/frameworks/legacy/app/ctrl/index.js       |   22 +
 html5/frameworks/legacy/app/ctrl/init.js        |  164 +
 html5/frameworks/legacy/app/ctrl/misc.js        |  237 +
 html5/frameworks/legacy/app/differ.js           |   73 +
 html5/frameworks/legacy/app/downgrade.js        |  154 +
 html5/frameworks/legacy/app/index.js            |   37 +
 html5/frameworks/legacy/app/instance.js         |   29 +
 html5/frameworks/legacy/app/register.js         |  100 +
 html5/frameworks/legacy/config.js               |   16 +
 html5/frameworks/legacy/core/LICENSE            |   21 +
 html5/frameworks/legacy/core/array.js           |   95 +
 html5/frameworks/legacy/core/dep.js             |   79 +
 html5/frameworks/legacy/core/object.js          |   84 +
 html5/frameworks/legacy/core/observer.js        |  322 +
 html5/frameworks/legacy/core/state.js           |   91 +
 html5/frameworks/legacy/core/watcher.js         |  253 +
 html5/frameworks/legacy/index.js                |   22 +
 html5/frameworks/legacy/static/bridge.js        |   38 +
 html5/frameworks/legacy/static/create.js        |   30 +
 html5/frameworks/legacy/static/life.js          |   54 +
 html5/frameworks/legacy/static/map.js           |    1 +
 html5/frameworks/legacy/static/misc.js          |   22 +
 html5/frameworks/legacy/static/register.js      |   57 +
 html5/frameworks/legacy/util/LICENSE            |   21 +
 html5/frameworks/legacy/util/index.js           |  138 +
 html5/frameworks/legacy/util/shared.js          |  144 +
 html5/frameworks/legacy/vm/compiler.js          |  618 ++
 html5/frameworks/legacy/vm/directive.js         |  353 +
 html5/frameworks/legacy/vm/dom-helper.js        |  240 +
 html5/frameworks/legacy/vm/events.js            |  161 +
 html5/frameworks/legacy/vm/index.js             |  113 +
 html5/frameworks/vanilla/index.js               |  108 +
 html5/native/index.js                           |   24 -
 html5/render/browser/base/atomic.js             |   32 +
 html5/render/browser/base/component/flexbox.js  |   58 +
 html5/render/browser/base/component/index.js    |  212 +
 html5/render/browser/base/component/lazyload.js |   68 +
 html5/render/browser/base/component/operate.js  |  198 +
 html5/render/browser/base/component/position.js |   82 +
 html5/render/browser/base/component/sticky.js   |  230 +
 .../browser/base/component/valueFilter.js       |   36 +
 html5/render/browser/base/div.js                |   16 +
 html5/render/browser/base/droot.js              |   61 +
 html5/render/browser/base/root.js               |   52 +
 html5/render/browser/bridge/index.js            |    7 +
 html5/render/browser/bridge/protocol.js         |  112 +
 html5/render/browser/bridge/receiver.js         |  149 +
 html5/render/browser/bridge/sender.js           |   45 +
 html5/render/browser/dom/appearWatcher.js       |  150 +
 html5/render/browser/dom/componentManager.js    |  384 +
 html5/render/browser/dom/index.js               |    7 +
 .../browser/extend/api/animation/index.js       |   51 +
 .../render/browser/extend/api/animation/lib.js  |   31 +
 html5/render/browser/extend/api/clipboard.js    |   73 +
 html5/render/browser/extend/api/dom.js          |  107 +
 html5/render/browser/extend/api/event.js        |   25 +
 html5/render/browser/extend/api/geolocation.js  |   66 +
 html5/render/browser/extend/api/globalEvent.js  |   46 +
 html5/render/browser/extend/api/index.js        |   27 +
 html5/render/browser/extend/api/modal.js        |   71 +
 html5/render/browser/extend/api/navigator.js    |   38 +
 html5/render/browser/extend/api/pageInfo.js     |   26 +
 html5/render/browser/extend/api/storage.js      |  159 +
 html5/render/browser/extend/api/stream.js       |  310 +
 html5/render/browser/extend/api/timer.js        |   62 +
 html5/render/browser/extend/api/webview.js      |   57 +
 html5/render/browser/extend/components/a.js     |   61 +
 .../browser/extend/components/countdown.js      |   72 +
 .../browser/extend/components/datepicker.js     |   44 +
 html5/render/browser/extend/components/embed.js |   82 +
 .../browser/extend/components/image/image.css   |    5 +
 .../browser/extend/components/image/index.js    |   94 +
 html5/render/browser/extend/components/index.js |   52 +
 .../extend/components/indicator/index.js        |  186 +
 .../extend/components/indicator/indicator.css   |    8 +
 html5/render/browser/extend/components/input.js |  141 +
 .../render/browser/extend/components/marquee.js |  284 +
 .../extend/components/scrollable/index.js       |   19 +
 .../extend/components/scrollable/list/hlist.js  |   18 +
 .../extend/components/scrollable/list/index.js  |   11 +
 .../extend/components/scrollable/list/list.js   |   67 +
 .../extend/components/scrollable/list/vlist.js  |   18 +
 .../components/scrollable/loading/index.js      |  129 +
 .../components/scrollable/loading/loading.css   |   15 +
 .../extend/components/scrollable/motion.js      |   81 +
 .../components/scrollable/refresh/index.js      |  141 +
 .../components/scrollable/refresh/refresh.css   |   16 +
 .../extend/components/scrollable/scroll.js      | 1200 +++
 .../extend/components/scrollable/scrollable.css |   15 +
 .../extend/components/scrollable/scrollable.js  |  307 +
 .../components/scrollable/scroller/index.js     |   25 +
 .../render/browser/extend/components/select.js  |   92 +
 .../extend/components/slider/carrousel.css      |    6 +
 .../extend/components/slider/carrousel.js       |  436 ++
 .../browser/extend/components/slider/index.js   |  349 +
 .../browser/extend/components/slider/slider.css |   34 +
 .../browser/extend/components/slider/timer.js   |   60 +
 .../browser/extend/components/spinner/index.js  |  139 +
 .../extend/components/spinner/spinner.css       |   79 +
 .../browser/extend/components/switch/index.js   |  238 +
 .../browser/extend/components/switch/switch.css |   24 +
 .../extend/components/tabheader/index.js        |  399 +
 .../extend/components/tabheader/tabheader.css   |  140 +
 html5/render/browser/extend/components/text.js  |  107 +
 .../browser/extend/components/textarea.js       |   94 +
 .../browser/extend/components/timepicker.js     |   43 +
 .../browser/extend/components/video/index.js    |  116 +
 .../browser/extend/components/video/video.css   |    3 +
 html5/render/browser/extend/components/web.js   |  102 +
 html5/render/browser/extend/index.js            |   14 +
 html5/render/browser/index.js                   |   22 +
 html5/render/browser/render/config.js           |   12 +
 html5/render/browser/render/gesture.js          |  493 ++
 html5/render/browser/render/index.js            |  249 +
 html5/render/browser/render/loader.js           |   65 +
 html5/render/browser/render/register.js         |   72 +
 html5/render/browser/render/style/base.css      |   38 +
 html5/render/browser/utils/array.js             |   15 +
 html5/render/browser/utils/frameUpdater.js      |   47 +
 html5/render/browser/utils/index.js             |  218 +
 html5/render/browser/utils/logger.js            |   38 +
 html5/render/native/index.js                    |   29 +
 html5/runtime/.eslintrc                         |    5 -
 html5/runtime/framework-vanilla.js              |    1 -
 html5/runtime/framework-weex.js                 |    1 -
 html5/runtime/handler.js                        |   72 +
 html5/runtime/index.js                          |   37 +-
 html5/runtime/init.js                           |   12 +-
 html5/runtime/listener.js                       |  208 +
 html5/runtime/vdom/comment.js                   |   28 +
 html5/runtime/vdom/document.js                  |  169 +
 html5/runtime/vdom/element.js                   |  355 +
 html5/runtime/vdom/index.js                     |   11 +
 html5/runtime/vdom/node.js                      |   30 +
 html5/runtime/vdom/operation.js                 |  241 +
 html5/shared/arrayFrom.js                       |    3 +-
 html5/shared/console.js                         |   98 +-
 html5/shared/freeze.js                          |   18 +
 html5/shared/index.js                           |   25 +-
 html5/shared/objectSetPrototypeOf.js            |    2 +
 html5/shared/promise.js                         |    8 +-
 html5/shared/setTimeout.js                      |   41 +-
 html5/shared/utils.js                           |  132 -
 html5/test/case/.eslintrc                       |    9 +
 html5/test/case/basic/append-root.output.js     |   36 +
 html5/test/case/basic/append-root.source.js     |   58 +
 html5/test/case/basic/append.output.js          |   79 +
 html5/test/case/basic/append.source.js          |  105 +
 html5/test/case/basic/backward1.output.js       |   57 +
 html5/test/case/basic/backward1.source.js       |   95 +
 html5/test/case/basic/backward2.output.js       |   57 +
 html5/test/case/basic/backward2.source.js       |   95 +
 html5/test/case/basic/components.output.js      |   20 +
 html5/test/case/basic/components.source.js      |   83 +
 .../case/basic/computed-in-repeat.output.js     |   19 +
 .../case/basic/computed-in-repeat.source.js     |   64 +
 html5/test/case/basic/created.output.js         |   11 +
 html5/test/case/basic/created.source.js         |   38 +
 html5/test/case/basic/dynamic-id.output.js      |   44 +
 html5/test/case/basic/dynamic-id.source.js      |   76 +
 .../test/case/basic/dynamic-property.output.js  |   24 +
 .../test/case/basic/dynamic-property.source.js  |   61 +
 html5/test/case/basic/dynamic-type.output.js    |   10 +
 html5/test/case/basic/dynamic-type.source.js    |   27 +
 html5/test/case/basic/foo.output.js             |    3 +
 html5/test/case/basic/foo.source.js             |   26 +
 html5/test/case/basic/foo2.output.js            |   10 +
 html5/test/case/basic/foo2.source.js            |   34 +
 html5/test/case/basic/foo3.output.js            |    9 +
 html5/test/case/basic/foo3.source.js            |   23 +
 html5/test/case/basic/foo4.output.js            |   12 +
 html5/test/case/basic/foo4.source.js            |   26 +
 html5/test/case/basic/foo5.output.js            |   14 +
 html5/test/case/basic/foo5.source.js            |   32 +
 html5/test/case/basic/foo6.output.js            |   28 +
 html5/test/case/basic/foo6.source.js            |   53 +
 html5/test/case/basic/foo7.output.js            |   26 +
 html5/test/case/basic/foo7.source.js            |   58 +
 html5/test/case/basic/foo8.output.js            |   60 +
 html5/test/case/basic/foo8.source.js            |   73 +
 html5/test/case/basic/foo9.output.js            |   57 +
 html5/test/case/basic/foo9.source.js            |   95 +
 html5/test/case/basic/id.output.js              |   32 +
 html5/test/case/basic/id.source.js              |   62 +
 html5/test/case/basic/if-repeat.output.js       |   13 +
 html5/test/case/basic/if-repeat.source.js       |   42 +
 html5/test/case/basic/if-root.output.js         |    1 +
 html5/test/case/basic/if-root.source.js         |   26 +
 html5/test/case/basic/if.output.js              |   13 +
 html5/test/case/basic/if.source.js              |   39 +
 html5/test/case/basic/promise.output.js         |    3 +
 html5/test/case/basic/promise.source.js         |   29 +
 html5/test/case/basic/ready.output.js           |   11 +
 html5/test/case/basic/ready.source.js           |   38 +
 html5/test/case/basic/repeat-array-kv.output.js |   22 +
 html5/test/case/basic/repeat-array-kv.source.js |   45 +
 .../case/basic/repeat-array-no-kv.output.js     |   22 +
 .../case/basic/repeat-array-no-kv.source.js     |   43 +
 .../case/basic/repeat-array-non-obj.output.js   |   22 +
 .../case/basic/repeat-array-non-obj.source.js   |   44 +
 html5/test/case/basic/repeat-array-v.output.js  |   22 +
 html5/test/case/basic/repeat-array-v.source.js  |   44 +
 html5/test/case/basic/repeat-index.output.js    |   22 +
 html5/test/case/basic/repeat-index.source.js    |   41 +
 html5/test/case/basic/repeat-root.output.js     |    1 +
 html5/test/case/basic/repeat-root.source.js     |   29 +
 html5/test/case/basic/repeat-watch.output.js    |   46 +
 html5/test/case/basic/repeat-watch.source.js    |   57 +
 html5/test/case/basic/require.output.js         |    9 +
 html5/test/case/basic/require.source.js         |   34 +
 html5/test/case/basic/reset-style.output.js     |   15 +
 html5/test/case/basic/reset-style.source.js     |   40 +
 html5/test/case/basic/static1.output.js         |   12 +
 html5/test/case/basic/static1.source.js         |   33 +
 html5/test/case/basic/static2.output.js         |   30 +
 html5/test/case/basic/static2.source.js         |   44 +
 html5/test/case/basic/static3.output.js         |   33 +
 html5/test/case/basic/static3.source.js         |   44 +
 html5/test/case/basic/static4.output.js         |   35 +
 html5/test/case/basic/static4.source.js         |   75 +
 html5/test/case/basic/subvm.output.js           |   20 +
 html5/test/case/basic/subvm.source.js           |   80 +
 html5/test/case/basic/transformer1.output.js    |    3 +
 html5/test/case/basic/transformer1.source.js    |   28 +
 .../case/complex/append-root-event.output.js    |   13 +
 .../case/complex/append-root-event.source.js    |   46 +
 html5/test/case/complex/click.output.js         |   26 +
 html5/test/case/complex/click.source.js         |   58 +
 html5/test/case/complex/computed.output.js      |   15 +
 html5/test/case/complex/computed.source.js      |   54 +
 html5/test/case/complex/if-refresh.output.js    |    3 +
 html5/test/case/complex/if-refresh.source.js    |   39 +
 .../case/complex/if-repeat-refresh.output.js    |   22 +
 .../case/complex/if-repeat-refresh.source.js    |   42 +
 html5/test/case/complex/inline-click.output.js  |   14 +
 html5/test/case/complex/inline-click.source.js  |   36 +
 html5/test/case/complex/input-binding.output.js |   12 +
 html5/test/case/complex/input-binding.source.js |   60 +
 html5/test/case/complex/refresh2.output.js      |   20 +
 html5/test/case/complex/refresh2.source.js      |  116 +
 .../test/case/complex/repeat-track-by.output.js |   24 +
 .../test/case/complex/repeat-track-by.source.js |   46 +
 html5/test/case/complex/transformer2.output.js  |    3 +
 html5/test/case/complex/transformer2.source.js  |   28 +
 html5/test/case/complex/transformer3.output.js  |    3 +
 html5/test/case/complex/transformer3.source.js  |   28 +
 .../case/multi/clear-dep-target-error.source.js |   27 +
 .../case/multi/clear-dep-target-fine.output.js  |   11 +
 .../case/multi/clear-dep-target-fine.source.js  |   30 +
 html5/test/case/multi/clear-moduleA.output.js   |   12 +
 html5/test/case/multi/clear-moduleA.source.js   |   43 +
 html5/test/case/multi/clear-moduleB.output.js   |   11 +
 html5/test/case/multi/clear-moduleB.source.js   |   32 +
 html5/test/case/prepare.js                      |   61 +
 html5/test/case/signals/modal.output.js         |    9 +
 html5/test/case/signals/modal.source.js         |   42 +
 html5/test/case/signals/signals-long.source.js  | 1205 +++
 html5/test/case/signals/signals.source.js       |   66 +
 html5/test/case/signals/timer.output.js         |    9 +
 html5/test/case/signals/timer.source.js         |   36 +
 html5/test/case/tester.js                       |  489 ++
 .../test/case/throws/global-variable1.source.js |   17 +
 .../test/case/throws/global-variable2.source.js |   15 +
 .../test/case/throws/global-variable3.source.js |   22 +
 html5/test/unit/default/api/methods.js          |   37 +-
 html5/test/unit/default/api/modules.js          |    4 +-
 html5/test/unit/default/app/bundle.js           |   10 +-
 html5/test/unit/default/app/ctrl.js             |   79 +-
 html5/test/unit/default/app/downgrade.js        |    8 +-
 html5/test/unit/default/app/index.js            |   10 +-
 html5/test/unit/default/app/register.js         |   43 +-
 .../unit/default/assets/append-root-event.input |   46 -
 .../default/assets/append-root-event.output     |   13 -
 .../test/unit/default/assets/append-root.input  |   58 -
 .../test/unit/default/assets/append-root.output |   36 -
 html5/test/unit/default/assets/append.input     |  105 -
 html5/test/unit/default/assets/append.output    |   79 -
 html5/test/unit/default/assets/backward1.input  |   95 -
 html5/test/unit/default/assets/backward1.output |   57 -
 html5/test/unit/default/assets/backward2.input  |   95 -
 html5/test/unit/default/assets/backward2.output |   57 -
 .../default/assets/clear-dep-target-error.input |   27 -
 .../default/assets/clear-dep-target-fine.input  |   30 -
 .../default/assets/clear-dep-target-fine.output |   11 -
 .../unit/default/assets/clear-moduleA.input     |   43 -
 .../unit/default/assets/clear-moduleA.output    |   12 -
 .../unit/default/assets/clear-moduleB.input     |   32 -
 .../unit/default/assets/clear-moduleB.output    |   11 -
 html5/test/unit/default/assets/click.input      |   58 -
 html5/test/unit/default/assets/click.output     |   26 -
 html5/test/unit/default/assets/components.input |   83 -
 .../test/unit/default/assets/components.output  |   17 -
 .../default/assets/computed-in-repeat.input     |   64 -
 .../default/assets/computed-in-repeat.output    |   19 -
 html5/test/unit/default/assets/computed.input   |   54 -
 html5/test/unit/default/assets/computed.output  |   15 -
 html5/test/unit/default/assets/created.input    |   38 -
 html5/test/unit/default/assets/created.output   |   11 -
 .../test/unit/default/assets/dynamic-type.input |   27 -
 .../unit/default/assets/dynamic-type.output     |   10 -
 html5/test/unit/default/assets/foo.input        |   26 -
 html5/test/unit/default/assets/foo.output       |    3 -
 html5/test/unit/default/assets/foo2.input       |   34 -
 html5/test/unit/default/assets/foo2.output      |   10 -
 html5/test/unit/default/assets/foo3.input       |   23 -
 html5/test/unit/default/assets/foo3.output      |    9 -
 html5/test/unit/default/assets/foo4.input       |   26 -
 html5/test/unit/default/assets/foo4.output      |   12 -
 html5/test/unit/default/assets/foo5.input       |   32 -
 html5/test/unit/default/assets/foo5.output      |   14 -
 html5/test/unit/default/assets/foo6.input       |   53 -
 html5/test/unit/default/assets/foo6.output      |   28 -
 html5/test/unit/default/assets/foo7.input       |   58 -
 html5/test/unit/default/assets/foo7.output      |   26 -
 html5/test/unit/default/assets/foo8.input       |   73 -
 html5/test/unit/default/assets/foo8.output      |   60 -
 html5/test/unit/default/assets/foo9.input       |   95 -
 html5/test/unit/default/assets/foo9.output      |   57 -
 html5/test/unit/default/assets/if-refresh.input |   39 -
 .../test/unit/default/assets/if-refresh.output  |    3 -
 .../unit/default/assets/if-repeat-refresh.input |   42 -
 .../default/assets/if-repeat-refresh.output     |   22 -
 html5/test/unit/default/assets/if-repeat.input  |   42 -
 html5/test/unit/default/assets/if-repeat.output |   13 -
 html5/test/unit/default/assets/if-root.input    |   26 -
 html5/test/unit/default/assets/if-root.output   |    1 -
 html5/test/unit/default/assets/if.input         |   39 -
 html5/test/unit/default/assets/if.output        |   13 -
 .../test/unit/default/assets/inline-click.input |   36 -
 .../unit/default/assets/inline-click.output     |   14 -
 .../unit/default/assets/input-binding.input     |   60 -
 .../unit/default/assets/input-binding.output    |   12 -
 html5/test/unit/default/assets/promise.input    |   29 -
 html5/test/unit/default/assets/promise.output   |    3 -
 html5/test/unit/default/assets/ready.input      |   38 -
 html5/test/unit/default/assets/ready.output     |   11 -
 html5/test/unit/default/assets/refresh2.input   |  116 -
 html5/test/unit/default/assets/refresh2.output  |   20 -
 .../unit/default/assets/repeat-array-kv.input   |   45 -
 .../unit/default/assets/repeat-array-kv.output  |   22 -
 .../default/assets/repeat-array-no-kv.input     |   43 -
 .../default/assets/repeat-array-no-kv.output    |   22 -
 .../default/assets/repeat-array-non-obj.input   |   44 -
 .../default/assets/repeat-array-non-obj.output  |   22 -
 .../unit/default/assets/repeat-array-v.input    |   44 -
 .../unit/default/assets/repeat-array-v.output   |   22 -
 .../test/unit/default/assets/repeat-index.input |   41 -
 .../unit/default/assets/repeat-index.output     |   22 -
 .../test/unit/default/assets/repeat-root.input  |   29 -
 .../test/unit/default/assets/repeat-root.output |    1 -
 .../unit/default/assets/repeat-track-by.input   |   46 -
 .../unit/default/assets/repeat-track-by.output  |   24 -
 .../test/unit/default/assets/repeat-watch.input |   57 -
 .../unit/default/assets/repeat-watch.output     |   46 -
 html5/test/unit/default/assets/require.input    |   34 -
 html5/test/unit/default/assets/require.output   |    9 -
 .../test/unit/default/assets/reset-style.input  |   42 -
 .../test/unit/default/assets/reset-style.output |   15 -
 .../test/unit/default/assets/signals-long.input | 1205 ---
 html5/test/unit/default/assets/signals.input    |   66 -
 html5/test/unit/default/assets/static1.input    |   33 -
 html5/test/unit/default/assets/static1.output   |   12 -
 html5/test/unit/default/assets/static2.input    |   44 -
 html5/test/unit/default/assets/static2.output   |   30 -
 html5/test/unit/default/assets/static3.input    |   44 -
 html5/test/unit/default/assets/static3.output   |   33 -
 html5/test/unit/default/assets/static4.input    |   75 -
 html5/test/unit/default/assets/static4.output   |   35 -
 html5/test/unit/default/assets/subvm.input      |   80 -
 html5/test/unit/default/assets/subvm.output     |   17 -
 .../test/unit/default/assets/transformer1.input |   28 -
 .../unit/default/assets/transformer1.output     |    3 -
 .../test/unit/default/assets/transformer2.input |   28 -
 .../unit/default/assets/transformer2.output     |    3 -
 .../test/unit/default/assets/transformer3.input |   28 -
 .../unit/default/assets/transformer3.output     |    3 -
 html5/test/unit/default/runtime.js              |   79 +-
 html5/test/unit/default/test.js                 | 1122 ---
 html5/test/unit/default/util/index.js           |    9 +-
 html5/test/unit/default/util/shared.js          |  125 +
 html5/test/unit/default/vm/compiler.js          |    6 +-
 html5/test/unit/default/vm/directive.js         |    6 +-
 html5/test/unit/default/vm/dom-helper.js        |    6 +-
 html5/test/unit/default/vm/events.js            |   62 +-
 html5/test/unit/default/vm/vm.js                |  372 +-
 html5/test/unit/shared/console.js               |  211 +-
 html5/test/unit/shared/index.js                 |   25 +-
 html5/test/unit/vanilla/index.js                |  157 +
 html5/test/unit/vdom/index.js                   |   27 +-
 html5/test/unit/vdom/listener.js                |  177 +-
 html5/test/unit/vdom/node.js                    |   21 +
 html5/vanilla/index.js                          |   97 -
 html5/vdom/helper.js                            |    7 -
 html5/vdom/index.js                             |  569 --
 html5/vdom/listener.js                          |  103 -
 ios/playground/Podfile                          |    2 +-
 .../WeexDemo.xcodeproj/project.pbxproj          |   73 +-
 .../contents.xcworkspacedata                    |    7 +
 .../xcshareddata/xcschemes/WeexDemo.xcscheme    |    2 +-
 ios/playground/WeexDemo/AppDelegate.m           |    3 +-
 ios/playground/WeexDemo/Info.plist              |    2 +-
 ios/playground/WeexDemo/WXDemoViewController.m  |    6 +
 ios/playground/WeexDemo/WXSyncTestModule.h      |   14 +
 ios/playground/WeexDemo/WXSyncTestModule.m      |   38 +
 ios/playground/bundlejs/component/input-demo.js |  292 +-
 .../bundlejs/component/navigator-demo.js        |   26 +-
 .../slider-neighbor/silder-neighbor.js          | 2631 +------
 .../slider-neighbor/slider-neighbor-page.js     |   58 +-
 .../bundlejs/component/slider/index.js          |   46 +-
 .../bundlejs/component/slider/slider-item.js    |   12 +-
 .../bundlejs/component/slider/slider-page.js    |   28 +-
 .../bundlejs/component/tabbar/tabbar-demo.js    |   16 +-
 .../bundlejs/component/tabbar/tabbar-item.js    |   12 +-
 ios/playground/bundlejs/component/text-demo.js  |   14 +-
 ios/playground/bundlejs/component/video-demo.js |   14 +-
 ios/playground/bundlejs/component/web-demo.js   |   23 +-
 ios/playground/bundlejs/error.js                | 2217 ++++++
 ios/playground/bundlejs/geolocation.js          |  183 +
 ios/playground/bundlejs/hello.js                |    4 +-
 ios/playground/bundlejs/iconfont.js             |  176 +
 ios/playground/bundlejs/index.js                |   50 +-
 ios/playground/bundlejs/module/clipboard.js     | 2311 ++++++
 ios/playground/bundlejs/module/instance-api.js  |   22 +-
 ios/playground/bundlejs/module/modal.js         |   14 +-
 ios/playground/bundlejs/module/picker-demo.js   | 2344 ++++++
 ios/playground/bundlejs/module/storage-demo.js  |   21 +-
 ios/playground/bundlejs/module/stream-demo.js   |   21 +-
 ios/playground/bundlejs/showcase/calculator.js  |   13 +-
 .../bundlejs/showcase/dropdown/dropdown-demo.js |   38 +-
 .../bundlejs/showcase/dropdown/we-dropdown.js   |   12 +-
 ios/playground/bundlejs/showcase/minesweeper.js |   12 +-
 .../bundlejs/showcase/new-fashion/banner.js     |    8 +-
 .../bundlejs/showcase/new-fashion/banners.js    |   20 +-
 .../bundlejs/showcase/new-fashion/brand.js      |   36 +-
 .../bundlejs/showcase/new-fashion/category.js   |   24 +-
 .../bundlejs/showcase/new-fashion/coupon.js     |   12 +-
 .../bundlejs/showcase/new-fashion/fashion.js    |   38 +-
 .../bundlejs/showcase/new-fashion/goods.js      |   24 +-
 .../bundlejs/showcase/new-fashion/headlines.js  |   48 +-
 .../bundlejs/showcase/new-fashion/index.js      |   21 +-
 .../bundlejs/showcase/new-fashion/link.js       |    8 +-
 .../bundlejs/showcase/new-fashion/list-demo.js  | 1222 ---
 .../showcase/new-fashion/list/list-basic.js     |  311 +
 .../new-fashion/list/list-demo-horizon.js       | 1222 +++
 .../showcase/new-fashion/list/list-demo.js      | 1222 +++
 .../bundlejs/showcase/new-fashion/main.js       |  191 +-
 .../bundlejs/showcase/new-fashion/match.js      |   24 +-
 .../bundlejs/showcase/new-fashion/resource.js   |   38 +-
 .../bundlejs/showcase/new-fashion/scene.js      |   24 +-
 ios/playground/bundlejs/showcase/ui.js          |   13 +-
 ios/playground/bundlejs/style/index.js          |   63 +-
 ios/playground/bundlejs/style/style-box.js      |   29 +-
 ios/playground/bundlejs/style/style-flex.js     |   31 +-
 ios/playground/bundlejs/style/style-item.js     |   12 +-
 ios/playground/bundlejs/syntax/hello-world-1.js |   77 +
 ios/playground/bundlejs/syntax/hello-world-2.js |   94 +
 ios/playground/bundlejs/syntax/hello-world-3.js |  114 +
 ios/playground/bundlejs/syntax/hello-world-4.js |  136 +
 ios/playground/bundlejs/syntax/hello-world-5.js |  144 +
 ios/playground/bundlejs/syntax/hello-world.js   |  144 +
 ios/playground/bundlejs/syntax/index.js         | 3270 ++++++++
 .../bundlejs/syntax/script-component.js         |  180 +
 ios/playground/bundlejs/syntax/script-data.js   |  165 +
 ios/playground/bundlejs/syntax/script-events.js |  176 +
 .../bundlejs/syntax/script-instance.js          |  145 +
 .../bundlejs/syntax/script-lifecycle.js         |  130 +
 ios/playground/bundlejs/syntax/script-module.js |  129 +
 .../bundlejs/syntax/script-options.js           |  139 +
 .../bundlejs/syntax/template-class.js           |  142 +
 .../bundlejs/syntax/template-content.js         |  149 +
 .../bundlejs/syntax/template-event.js           |  195 +
 ios/playground/bundlejs/syntax/template-if.js   |  151 +
 .../bundlejs/syntax/template-repeat-update.js   |  177 +
 .../bundlejs/syntax/template-repeat.js          |  261 +
 .../bundlejs/syntax/template-style.js           |  121 +
 ios/playground/bundlejs/template.js             |   12 +-
 ios/sdk/WeexSDK.xcodeproj/project.pbxproj       |  129 +-
 .../xcschemes/WeexSDKTests.xcscheme             |   90 +
 ios/sdk/WeexSDK/Resources/main.js               |   11 +-
 ios/sdk/WeexSDK/Sources/Bridge/JSValue+Weex.h   |   15 +
 ios/sdk/WeexSDK/Sources/Bridge/JSValue+Weex.m   |   90 +
 .../WeexSDK/Sources/Bridge/WXBridgeContext.h    |   11 +-
 .../WeexSDK/Sources/Bridge/WXBridgeContext.m    |  127 +-
 ios/sdk/WeexSDK/Sources/Bridge/WXCallJSMethod.h |   20 +
 ios/sdk/WeexSDK/Sources/Bridge/WXCallJSMethod.m |   35 +
 .../WeexSDK/Sources/Bridge/WXComponentMethod.h  |   21 +
 .../WeexSDK/Sources/Bridge/WXComponentMethod.m  |   51 +
 .../Sources/Bridge/WXDebugLoggerBridge.m        |    5 +
 ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.m |   40 +-
 ios/sdk/WeexSDK/Sources/Bridge/WXModuleMethod.h |   28 +
 ios/sdk/WeexSDK/Sources/Bridge/WXModuleMethod.m |  101 +
 .../WeexSDK/Sources/Component/WXCellComponent.h |    4 +-
 .../WeexSDK/Sources/Component/WXCellComponent.m |   10 +
 .../Component/WXComponent+GradientColor.h       |   20 +
 .../Component/WXComponent+GradientColor.m       |  116 +
 .../Sources/Component/WXComponent_internal.h    |   20 +-
 .../Sources/Component/WXImageComponent.m        |   57 +-
 .../WeexSDK/Sources/Component/WXListComponent.m |   46 +-
 .../Sources/Component/WXScrollerComponent.h     |    2 +
 .../Sources/Component/WXScrollerComponent.m     |   13 +-
 .../Sources/Component/WXSliderComponent.m       |   52 +-
 .../Component/WXSliderNeighborComponent.m       |  132 +-
 .../Sources/Component/WXTextAreaComponent.m     |   99 +-
 .../WeexSDK/Sources/Component/WXTextComponent.m |   21 +-
 .../Sources/Component/WXTextInputComponent.m    |  254 +-
 ios/sdk/WeexSDK/Sources/Component/WXTransform.m |    5 +-
 .../Sources/Controller/WXBaseViewController.m   |   48 +-
 .../Sources/Display/WXComponent+Display.m       |   10 +-
 ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.h    |   49 +
 ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.m    |   42 +-
 .../WeexSDK/Sources/Events/WXComponent+Events.m |  123 +-
 .../WeexSDK/Sources/Loader/WXWebSocketLoader.h  |   24 +
 .../WeexSDK/Sources/Loader/WXWebSocketLoader.m  |  131 +
 .../WeexSDK/Sources/Manager/WXBridgeManager.h   |   29 +-
 .../WeexSDK/Sources/Manager/WXBridgeManager.m   |   87 +-
 .../Sources/Manager/WXComponentFactory.m        |    6 +-
 .../Sources/Manager/WXComponentManager.h        |   12 +-
 .../Sources/Manager/WXComponentManager.m        |   56 +-
 .../Sources/Manager/WXDatePickerManager.h       |    1 -
 .../Sources/Manager/WXDatePickerManager.m       |   58 +-
 .../Sources/Manager/WXInvocationConfig.h        |    6 +-
 .../Sources/Manager/WXInvocationConfig.m        |  100 +-
 .../WeexSDK/Sources/Manager/WXModuleFactory.h   |    4 +-
 .../WeexSDK/Sources/Manager/WXModuleFactory.m   |   32 +-
 .../WeexSDK/Sources/Manager/WXModuleManager.h   |   16 -
 .../WeexSDK/Sources/Manager/WXModuleManager.m   |  111 -
 ios/sdk/WeexSDK/Sources/Manager/WXRuleManager.m |    9 +-
 ios/sdk/WeexSDK/Sources/Manager/WXSDKManager.h  |   10 +-
 ios/sdk/WeexSDK/Sources/Manager/WXSDKManager.m  |   19 +-
 .../WeexSDK/Sources/Manager/WXServiceFactory.h  |   38 +
 .../WeexSDK/Sources/Manager/WXServiceFactory.m  |  102 +
 ios/sdk/WeexSDK/Sources/Model/WXBridgeMethod.h  |   18 +-
 ios/sdk/WeexSDK/Sources/Model/WXBridgeMethod.m  |   85 +-
 ios/sdk/WeexSDK/Sources/Model/WXComponent.h     |   10 +
 ios/sdk/WeexSDK/Sources/Model/WXComponent.m     |   38 +-
 ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.h   |   15 +
 ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m   |   95 +-
 .../Sources/Model/WXSDKInstance_private.h       |    3 +
 .../WeexSDK/Sources/Module/WXAnimationModule.m  |   20 +-
 ios/sdk/WeexSDK/Sources/Module/WXDomModule.m    |    5 +-
 .../Sources/Module/WXGlobalEventModule.m        |   20 +-
 .../WeexSDK/Sources/Module/WXLocationModule.h   |   14 -
 .../WeexSDK/Sources/Module/WXLocationModule.m   |   31 -
 ios/sdk/WeexSDK/Sources/Module/WXMetaModule.m   |    4 +-
 ios/sdk/WeexSDK/Sources/Module/WXStreamModule.m |   22 +-
 .../WeexSDK/Sources/Module/WXWebSocketModule.h  |   15 +
 .../WeexSDK/Sources/Module/WXWebSocketModule.m  |  137 +
 ios/sdk/WeexSDK/Sources/Monitor/WXMonitor.h     |    2 +
 .../WeexSDK/Sources/Network/WXResourceRequest.h |    1 +
 .../WeexSDK/Sources/Protocol/WXBridgeProtocol.h |   28 +-
 ios/sdk/WeexSDK/Sources/Utility/WXConvert.h     |    3 +
 ios/sdk/WeexSDK/Sources/Utility/WXConvert.m     |   47 +-
 ios/sdk/WeexSDK/Sources/Utility/WXDefine.h      |   23 +-
 ios/sdk/WeexSDK/Sources/Utility/WXType.h        |    8 +
 ios/sdk/WeexSDK/Sources/Utility/WXUtility.h     |    8 +-
 ios/sdk/WeexSDK/Sources/Utility/WXUtility.m     |   25 +
 .../View/WXComponent+PseudoClassManagement.h    |   66 +
 .../View/WXComponent+PseudoClassManagement.m    |  144 +
 .../Sources/View/WXComponent+ViewManagement.m   |   12 +
 ios/sdk/WeexSDK/Sources/View/WXErrorView.m      |    3 +-
 ios/sdk/WeexSDK/Sources/View/WXView.m           |    2 +-
 .../Sources/WebSocket/SRWebSocket+Weex.h        |   18 +
 .../Sources/WebSocket/SRWebSocket+Weex.m        |   36 +
 .../Sources/WebSocket/WXWebSocketDefaultImpl.h  |   14 +
 .../Sources/WebSocket/WXWebSocketDefaultImpl.m  |  110 +
 .../Sources/WebSocket/WXWebSocketHandler.h      |   26 +
 ios/sdk/WeexSDKTests/TestSupportUtils.h         |    5 +
 ios/sdk/WeexSDKTests/TestSupportUtils.m         |   38 +-
 ios/sdk/WeexSDKTests/WXAnimationModuleTests.m   |   12 +-
 ios/sdk/WeexSDKTests/WXBridgeMethodTests.m      |   31 +-
 ios/sdk/WeexSDKTests/WXConvertTests.m           |    7 -
 ios/sdk/WeexSDKTests/WXInstanceWrapTests.m      |    7 -
 ios/sdk/WeexSDKTests/WXRootViewTests.m          |   22 +-
 ios/sdk/WeexSDKTests/WXSDKEngineTests.m         |    9 +-
 ios/sdk/WeexSDKTests/WXSDKManagerTests.m        |   11 -
 ios/sdk/WeexSDKTests/WXStorageTests.m           |    7 -
 ios/sdk/WeexSDKTests/WXStreamModuleTests.m      |    2 +-
 ios/sdk/WeexSDKTests/WXTimerModuleTests.m       |    7 -
 ios/sdk/WeexSDKTests/WeexSDKTests.m             |    6 -
 package.json                                    |   59 +-
 start                                           |    1 +
 1371 files changed, 124569 insertions(+), 56349 deletions(-)
----------------------------------------------------------------------



[12/50] [abbrv] incubator-weex git commit: Merge remote-tracking branch 'alibaba/ios-feature-20170118' into ios-feature-20170118

Posted by ji...@apache.org.
Merge remote-tracking branch 'alibaba/ios-feature-20170118' into ios-feature-20170118


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/dcca37eb
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/dcca37eb
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/dcca37eb

Branch: refs/heads/master
Commit: dcca37eb472127d18b4e25fabb25033177f8cc01
Parents: 3f35b82 b25b16c
Author: \u9f50\u5c71 <su...@163.com>
Authored: Tue Jan 10 22:31:54 2017 +0800
Committer: \u9f50\u5c71 <su...@163.com>
Committed: Tue Jan 10 22:31:54 2017 +0800

----------------------------------------------------------------------
 ios/sdk/WeexSDK/Resources/main.js               | 14 +++----
 ios/sdk/WeexSDK/Sources/Bridge/WXModuleMethod.m | 25 +++++-------
 .../Sources/Component/WXImageComponent.m        | 28 ++++++++++++-
 .../WeexSDK/Sources/Component/WXListComponent.m |  6 +++
 .../Sources/Component/WXScrollerComponent.h     |  2 +
 .../Sources/Component/WXScrollerComponent.m     |  4 +-
 ios/sdk/WeexSDK/Sources/Component/WXTransform.m |  5 ++-
 .../Sources/Display/WXComponent+Display.m       |  6 ++-
 .../WeexSDK/Sources/Events/WXComponent+Events.m | 25 +++++++++---
 .../WeexSDK/Sources/Loader/WXResourceLoader.m   |  2 +-
 .../Sources/Manager/WXComponentManager.m        | 15 +++++++
 ios/sdk/WeexSDK/Sources/Model/WXComponent.h     |  5 +++
 ios/sdk/WeexSDK/Sources/Model/WXComponent.m     |  6 ++-
 ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.h   |  4 ++
 ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m   | 43 ++++++++++++++++++--
 .../Sources/Model/WXSDKInstance_private.h       |  3 ++
 .../WeexSDK/Sources/Module/WXAnimationModule.m  | 20 ++++++++-
 .../WeexSDK/Sources/Module/WXNavigatorModule.m  | 28 +++++++------
 .../Sources/Protocol/WXNavigationProtocol.h     | 31 +++++++++++---
 19 files changed, 216 insertions(+), 56 deletions(-)
----------------------------------------------------------------------



[48/50] [abbrv] incubator-weex git commit: Merge pull request #2223 from alibaba/dev-release095

Posted by ji...@apache.org.
Merge pull request #2223 from alibaba/dev-release095

Release 095

Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/1db33988
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/1db33988
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/1db33988

Branch: refs/heads/master
Commit: 1db33988b17601c78d3a53a6701fb7064c015a73
Parents: 966c17d 7b8cc46
Author: sospartan zheng <so...@apache.org>
Authored: Wed Jan 11 17:47:33 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Wed Jan 11 17:47:33 2017 +0800

----------------------------------------------------------------------
 .eslintrc                                       |     1 +
 .gitignore                                      |     1 +
 android/commons/build.gradle                    |     4 +-
 .../weex/commons/AbstractWeexActivity.java      |     2 +
 .../adapter/DefaultWebSocketAdapter.java        |   326 +
 .../adapter/DefaultWebSocketAdapterFactory.java |   219 +
 android/playground/app/build.gradle             |    19 +-
 .../app/src/androidTest/AndroidManifest.xml     |   212 +
 .../benchmark/BenchmarkActivityTestRule.java    |   239 +
 .../alibaba/weex/benchmark/BenchmarkTest.java   |   419 +
 .../com/alibaba/weex/benchmark/BoxPlot.java     |   270 +
 .../java/com/alibaba/weex/benchmark/Repeat.java |   219 +
 .../com/alibaba/weex/benchmark/RepeatRule.java  |   242 +
 .../weex/benchmark/WeexNativeCompareTest.java   |   336 +
 .../playground/app/src/main/AndroidManifest.xml |    41 +-
 .../app/src/main/assets/hello_weex.js           |    28 +
 .../com/alibaba/weex/BenchmarkActivity.java     |   413 +
 .../java/com/alibaba/weex/IndexActivity.java    |    77 +-
 .../java/com/alibaba/weex/WXApplication.java    |    62 +-
 .../java/com/alibaba/weex/WXDebugActivity.java  |    91 +
 .../java/com/alibaba/weex/WXPageActivity.java   |   215 +-
 .../extend/adapter/InterceptWXHttpAdapter.java  |    63 +
 .../extend/component/WXComponentSyncTest.java   |    29 +
 .../weex/extend/module/GeolocationModule.java   |     8 +-
 .../alibaba/weex/extend/module/MyModule.java    |     4 +-
 .../weex/extend/module/RenderModule.java        |     4 +-
 .../weex/extend/module/SyncTestModule.java      |    53 +
 .../weex/extend/module/WXEventModule.java       |    16 +-
 .../zxing/client/android/CaptureActivity.java   |    70 +-
 .../src/main/res/layout/activity_dynamic.xml    |    27 +
 .../app/src/main/res/layout/activity_index.xml  |     1 +
 .../app/src/main/res/layout/content_dynamic.xml |    24 +
 .../app/src/main/res/layout/hello_weex.xml      |   223 +
 .../app/src/main/res/values-zh-rCN/strings.xml  |     2 +-
 .../app/src/main/res/values/strings.xml         |    10 +-
 android/sdk/assets/main.js                      | 19932 ++++++++++++++++-
 android/sdk/build.gradle                        |     7 +-
 android/sdk/gradle.properties                   |     6 +-
 .../gradle/wrapper/gradle-wrapper.properties    |     2 +-
 android/sdk/libs/armeabi/libweexv8.so           |   Bin 3579724 -> 3583820 bytes
 android/sdk/libs/x86/libweexv8.so               |   Bin 4328576 -> 4340864 bytes
 android/sdk/src/main/AndroidManifest.xml        |     2 +-
 .../taobao/weex/IWXActivityStateListener.java   |     2 +
 .../main/java/com/taobao/weex/InitConfig.java   |    26 +
 .../java/com/taobao/weex/RenderContainer.java   |   253 +
 .../java/com/taobao/weex/WXEnvironment.java     |    14 +-
 .../com/taobao/weex/WXGlobalEventModule.java    |     6 +-
 .../com/taobao/weex/WXGlobalEventReceiver.java  |    12 +-
 .../main/java/com/taobao/weex/WXSDKEngine.java  |    64 +-
 .../java/com/taobao/weex/WXSDKInstance.java     |   623 +-
 .../main/java/com/taobao/weex/WXSDKManager.java |    48 +-
 .../weex/adapter/DefaultWXHttpAdapter.java      |    52 +-
 .../taobao/weex/adapter/DrawableStrategy.java   |   213 +
 .../taobao/weex/adapter/IDrawableLoader.java    |   219 +
 .../com/taobao/weex/annotation/Component.java   |   219 +
 .../appfram/clipboard/WXClipboardModule.java    |    16 +-
 .../appfram/navigator/WXNavigatorModule.java    |   182 +-
 .../appfram/storage/WXSQLiteOpenHelper.java     |     1 -
 .../weex/appfram/storage/WXStorageModule.java   |    17 +-
 .../appfram/websocket/IWebSocketAdapter.java    |   234 +
 .../websocket/IWebSocketAdapterFactory.java     |   213 +
 .../appfram/websocket/WebSocketCloseCodes.java  |   237 +
 .../weex/appfram/websocket/WebSocketModule.java |   341 +
 .../taobao/weex/bridge/BaseMethodInvoker.java   |   224 -
 .../java/com/taobao/weex/bridge/Invoker.java    |     4 +-
 .../taobao/weex/bridge/JSCallbackCreator.java   |   213 -
 .../taobao/weex/bridge/JavascriptInvokable.java |   214 +
 .../com/taobao/weex/bridge/MethodInvoker.java   |    18 +-
 .../com/taobao/weex/bridge/ModuleFactory.java   |     5 +-
 .../taobao/weex/bridge/NativeInvokeHelper.java  |   276 +
 .../java/com/taobao/weex/bridge/WXBridge.java   |    51 +-
 .../com/taobao/weex/bridge/WXBridgeManager.java |   245 +-
 .../java/com/taobao/weex/bridge/WXJSObject.java |    48 +-
 .../com/taobao/weex/bridge/WXModuleManager.java |   227 +-
 .../java/com/taobao/weex/bridge/WXParams.java   |    19 +
 .../taobao/weex/bridge/WXServiceManager.java    |   236 +
 .../java/com/taobao/weex/common/Component.java  |   219 -
 .../java/com/taobao/weex/common/Constants.java  |    26 +
 .../java/com/taobao/weex/common/IWXBridge.java  |     6 +
 .../com/taobao/weex/common/IWXDebugProxy.java   |     4 +-
 .../taobao/weex/common/TypeModuleFactory.java   |    32 +-
 .../com/taobao/weex/common/WXCompatModule.java  |   270 +
 .../java/com/taobao/weex/common/WXConfig.java   |     1 +
 .../com/taobao/weex/common/WXInstanceWrap.java  |     4 +-
 .../java/com/taobao/weex/common/WXModule.java   |   379 +-
 .../com/taobao/weex/common/WXModuleAnno.java    |     5 +-
 .../taobao/weex/dom/BasicEditTextDomObject.java |     6 +-
 .../java/com/taobao/weex/dom/DomContext.java    |   216 +
 .../com/taobao/weex/dom/ImmutableDomObject.java |   228 +
 .../main/java/com/taobao/weex/dom/WXAttr.java   |   114 +-
 .../com/taobao/weex/dom/WXCustomStyleSpan.java  |     2 +-
 .../java/com/taobao/weex/dom/WXDomHandler.java  |    15 +-
 .../java/com/taobao/weex/dom/WXDomManager.java  |     9 +-
 .../java/com/taobao/weex/dom/WXDomModule.java   |    82 +-
 .../java/com/taobao/weex/dom/WXDomObject.java   |   415 +-
 .../com/taobao/weex/dom/WXDomStatement.java     |   546 +-
 .../main/java/com/taobao/weex/dom/WXStyle.java  |   211 +-
 .../com/taobao/weex/dom/WXSwitchDomObject.java  |    64 +-
 .../com/taobao/weex/dom/WXTextDomObject.java    |   104 +-
 .../com/taobao/weex/http/WXStreamModule.java    |    21 +-
 .../com/taobao/weex/ui/IFComponentHolder.java   |     6 +-
 .../taobao/weex/ui/SimpleComponentHolder.java   |     7 +-
 .../com/taobao/weex/ui/WXRenderManager.java     |    10 +-
 .../com/taobao/weex/ui/WXRenderStatement.java   |    76 +-
 .../weex/ui/animation/WXAnimationBean.java      |    60 +-
 .../weex/ui/animation/WXAnimationModule.java    |    33 +-
 .../ui/component/AbstractEditComponent.java     |    46 +-
 .../taobao/weex/ui/component/Scrollable.java    |     3 -
 .../java/com/taobao/weex/ui/component/WXA.java  |    15 +-
 .../taobao/weex/ui/component/WXBaseRefresh.java |    12 +-
 .../taobao/weex/ui/component/WXComponent.java   |   635 +-
 .../com/taobao/weex/ui/component/WXDiv.java     |     5 +-
 .../com/taobao/weex/ui/component/WXEmbed.java   |    24 +-
 .../com/taobao/weex/ui/component/WXHeader.java  |     2 +-
 .../com/taobao/weex/ui/component/WXImage.java   |   302 +-
 .../taobao/weex/ui/component/WXIndicator.java   |    12 +-
 .../com/taobao/weex/ui/component/WXInput.java   |     2 +-
 .../com/taobao/weex/ui/component/WXLoading.java |    22 +-
 .../weex/ui/component/WXLoadingIndicator.java   |     2 +-
 .../com/taobao/weex/ui/component/WXRefresh.java |    27 +-
 .../taobao/weex/ui/component/WXScroller.java    |    66 +-
 .../com/taobao/weex/ui/component/WXSlider.java  |   136 +-
 .../weex/ui/component/WXSliderNeighbor.java     |   180 +-
 .../com/taobao/weex/ui/component/WXSwitch.java  |    22 +-
 .../com/taobao/weex/ui/component/WXText.java    |    10 +-
 .../taobao/weex/ui/component/WXVContainer.java  |   184 +-
 .../com/taobao/weex/ui/component/WXVideo.java   |     2 +-
 .../com/taobao/weex/ui/component/WXWeb.java     |    23 +-
 .../ui/component/list/BasicListComponent.java   |  1104 +
 .../component/list/HorizontalListComponent.java |     2 +-
 .../ui/component/list/ListComponentView.java    |   223 +
 .../ui/component/list/SimpleListComponent.java  |   231 +
 .../ui/component/list/SimpleRecyclerView.java   |   329 +
 .../taobao/weex/ui/component/list/WXCell.java   |     6 +-
 .../weex/ui/component/list/WXListComponent.java |   952 +-
 .../component/pesudo/OnActivePseudoListner.java |   212 +
 .../weex/ui/component/pesudo/PesudoStatus.java  |   317 +
 .../pesudo/TouchActivePseudoListener.java       |   234 +
 .../com/taobao/weex/ui/module/WXMetaModule.java |   246 +
 .../taobao/weex/ui/module/WXModalUIModule.java  |    95 +-
 .../taobao/weex/ui/module/WXTimerModule.java    |    10 +-
 .../taobao/weex/ui/module/WXWebViewModule.java  |     8 +-
 .../com/taobao/weex/ui/view/IRenderStatus.java  |   214 +
 .../weex/ui/view/WXCirclePageAdapter.java       |     4 +
 .../taobao/weex/ui/view/WXCircleViewPager.java  |    25 +
 .../com/taobao/weex/ui/view/WXFrameLayout.java  |     8 +
 .../weex/ui/view/WXHorizontalScrollView.java    |    12 +
 .../com/taobao/weex/ui/view/WXImageView.java    |   170 +-
 .../com/taobao/weex/ui/view/WXScrollView.java   |    12 +
 .../com/taobao/weex/ui/view/WXSwitchView.java   |     3 +
 .../com/taobao/weex/ui/view/WXTextView.java     |    18 +-
 .../weex/ui/view/border/BorderDrawable.java     |   338 +-
 .../taobao/weex/ui/view/border/BorderUtil.java  |   293 +
 .../taobao/weex/ui/view/gesture/WXGesture.java  |   219 +-
 .../weex/ui/view/gesture/WXGestureType.java     |     5 +-
 .../weex/ui/view/listview/WXRecyclerView.java   |    34 +-
 .../refresh/circlebar/CircleProgressBar.java    |     1 -
 .../ui/view/refresh/core/WXRefreshView.java     |     6 +
 .../ui/view/refresh/core/WXSwipeLayout.java     |    41 +-
 .../ui/view/refresh/wrapper/BaseBounceView.java |    22 +
 .../refresh/wrapper/BounceRecyclerView.java     |    28 +-
 .../java/com/taobao/weex/utils/ATagUtil.java    |   224 +
 .../com/taobao/weex/utils/FunctionParser.java   |    15 +
 .../com/taobao/weex/utils/ImageDrawable.java    |   326 +
 .../java/com/taobao/weex/utils/ImgURIUtil.java  |   228 +
 .../java/com/taobao/weex/utils/WXDomUtils.java  |   268 +
 .../java/com/taobao/weex/utils/WXFileUtils.java |    40 +-
 .../java/com/taobao/weex/utils/WXJsonUtils.java |    15 +-
 .../taobao/weex/utils/WXReflectionUtils.java    |    38 -
 .../com/taobao/weex/utils/WXResourceUtils.java  |   111 +
 .../taobao/weex/utils/WXSoInstallMgrSdk.java    |     7 +-
 .../java/com/taobao/weex/utils/WXViewUtils.java |   168 +-
 .../java/com/taobao/weex/WXSDKEngineTest.java   |     2 +
 .../java/com/taobao/weex/WXSDKInstanceTest.java |    65 +-
 .../clipboard/WXClipboardModuleTest.java        |   261 +
 .../navigator/WXNavigatorModuleTest.java        |    26 +-
 .../com/taobao/weex/bridge/WXBridgeTest.java    |   263 +
 .../com/taobao/weex/bridge/WXHashMapTest.java   |     2 +-
 .../taobao/weex/bridge/WXModuleManagerTest.java |     2 -
 .../java/com/taobao/weex/common/TestModule.java |     5 +-
 .../java/com/taobao/weex/dom/TestDomObject.java |    27 +-
 .../java/com/taobao/weex/dom/WXAttrTest.java    |    38 +-
 .../com/taobao/weex/dom/WXDomModuleTest.java    |     3 +-
 .../com/taobao/weex/dom/WXDomStatementTest.java |    17 +-
 .../java/com/taobao/weex/dom/WXStyleTest.java   |    80 +
 .../taobao/weex/dom/WXTextDomObjectTest.java    |   276 +
 .../taobao/weex/http/WXStreamModuleTest.java    |     4 +
 .../ui/animation/WXAnimationModuleTest.java     |     6 -
 .../taobao/weex/ui/component/ComponentTest.java |    23 +-
 .../weex/ui/component/WXComponentTest.java      |    65 +-
 .../com/taobao/weex/ui/component/WXDivTest.java |    11 +-
 .../taobao/weex/ui/component/WXEmbedTest.java   |   259 +
 .../taobao/weex/ui/component/WXImageTest.java   |    30 +-
 .../taobao/weex/ui/component/WXLoadingTest.java |   259 +
 .../taobao/weex/ui/component/WXRefreshTest.java |   261 +
 .../weex/ui/component/WXScrollerTest.java       |     3 +-
 .../weex/ui/component/WXSliderNeighborTest.java |   288 +
 .../taobao/weex/ui/component/WXSliderTest.java  |    27 +-
 .../taobao/weex/ui/component/WXSwitchTest.java  |   261 +
 .../taobao/weex/ui/component/WXTextTest.java    |    24 +-
 .../com/taobao/weex/ui/component/WXWebTest.java |   336 +
 .../ui/component/list/WXListComponentTest.java  |    21 +-
 .../taobao/weex/ui/module/WXMetaModuleTest.java |   263 +
 .../weex/ui/module/WXModalUIModuleTest.java     |     2 +-
 .../weex/ui/view/border/BorderDrawableTest.java |    38 +-
 .../weex/ui/view/gesture/WXGestureTest.java     |   268 +
 .../taobao/weex/utils/FunctionParserTest.java   |   225 +
 .../com/taobao/weex/utils/WXLogUtilsTest.java   |   284 +
 .../taobao/weex/utils/WXResourceUtilsTest.java  |    18 +-
 .../java/com/taobao/weex/utils/WXUtilsTest.java |    17 +
 android/sdk/unittest.sh                         |     4 +
 .../taobao/weex/bridge/WXWebsocketBridge.java   |    15 +
 build/build.js                                  |   225 +-
 build/config.js                                 |   121 +
 build/rollup.browser.config.js                  |    38 -
 build/rollup.config.js                          |    34 -
 build/webpack.examples.config.js                |     6 +-
 build/webpack.macacatest.config.js              |    57 +
 circle.yml                                      |    19 +-
 dist/weex-html5/LICENSE                         |   201 -
 dist/weex-html5/NOTICE                          |     7 -
 dist/weex-html5/README.md                       |   158 -
 dist/weex-html5/demo/build/index.js             |   111 -
 dist/weex-html5/demo/index.we                   |    29 -
 dist/weex-html5/index.html                      |    57 -
 dist/weex-html5/package.json                    |    23 -
 dist/weex-js-framework/LICENSE                  |   202 -
 dist/weex-js-framework/NOTICE                   |     7 -
 dist/weex-js-framework/README.md                |     8 -
 dist/weex-js-framework/index.js                 |     1 -
 dist/weex-js-framework/package.json             |    39 -
 doc/advanced/integrate-to-android.md            |    12 +-
 examples/component/slider-neighbor/index.we     |    74 +
 .../slider-neighbor/silder-neighbor.we          |    75 -
 examples/component/slider/index.we              |     7 +
 examples/index.we                               |     2 +
 examples/module/websocket-demo.we               |   112 +
 examples/vue/animation.vue                      |    24 +-
 examples/vue/components/a.vue                   |    12 +-
 examples/vue/components/countdown.vue           |    36 +-
 examples/vue/components/image.vue               |    10 +-
 examples/vue/components/input.vue               |    21 +-
 examples/vue/components/list.vue                |    73 +-
 examples/vue/components/marquee.vue             |    32 +-
 examples/vue/components/navigator.vue           |    20 +-
 examples/vue/components/scroller.vue            |   118 +-
 examples/vue/components/slider.vue              |   160 +-
 examples/vue/components/tabbar.vue              |    72 +-
 examples/vue/components/text.vue                |     2 +-
 examples/vue/components/video.vue               |    14 +-
 examples/vue/components/web.vue                 |     4 +-
 examples/vue/include/button.vue                 |   162 +
 examples/vue/include/countdown.vue              |    93 +
 examples/vue/include/example-list-item.vue      |     2 +-
 examples/vue/include/hn.vue                     |    47 +
 examples/vue/include/list-item.vue              |    46 +
 examples/vue/include/marquee.vue                |    78 +
 examples/vue/include/navbar.vue                 |   121 +
 examples/vue/include/navpage.vue                |    62 +
 examples/vue/include/panel.vue                  |   141 +
 examples/vue/include/tabbar.vue                 |    92 +
 examples/vue/include/tabitem.vue                |    63 +
 examples/vue/include/tip.vue                    |    65 +
 examples/vue/index.vue                          |    70 +-
 examples/vue/modules/clipboard.vue              |    29 +-
 examples/vue/modules/instance-api.vue           |     8 +-
 examples/vue/modules/modal.vue                  |    12 +-
 examples/vue/modules/storage.vue                |    16 +-
 examples/vue/modules/stream.vue                 |    24 +-
 examples/vue/showcase/calculator.vue            |    10 +-
 examples/vue/showcase/itemlist.vue              |   588 +-
 examples/vue/showcase/progress.vue              |    10 +-
 examples/vue/style/index.vue                    |     2 +-
 examples/vue/style/style-box.vue                |     4 +-
 examples/vue/style/style-flex.vue               |     2 +-
 examples/vue/syntax/hello-world.vue             |     1 +
 examples/vue/syntax/script-component.vue        |    14 +-
 examples/vue/syntax/script-data.vue             |    11 +-
 examples/vue/syntax/script-events.vue           |     7 +-
 examples/vue/syntax/script-instance.vue         |     8 +-
 examples/vue/syntax/script-lifecycle.vue        |     9 +-
 examples/vue/syntax/template-class.vue          |     1 +
 examples/vue/syntax/template-event.vue          |    10 +-
 examples/vue/syntax/template-if.vue             |     1 +
 examples/vue/syntax/template-repeat-update.vue  |    24 +-
 examples/vue/syntax/template-repeat.vue         |    36 +-
 examples/vue/syntax/template-style.vue          |     9 +-
 examples/vue/template.vue                       |    20 +-
 examples/vue/test.vue                           |    16 -
 examples/vue/test2.vue                          |     6 -
 html5/frameworks/index.js                       |     2 +
 html5/frameworks/legacy/api/methods.js          |    30 +-
 html5/frameworks/legacy/app/bundle/bootstrap.js |     6 +
 html5/frameworks/legacy/app/ctrl/init.js        |   118 +-
 html5/frameworks/legacy/app/ctrl/misc.js        |    40 +-
 html5/frameworks/legacy/app/index.js            |     4 +-
 html5/frameworks/legacy/app/instance.js         |    18 +-
 html5/frameworks/legacy/app/register.js         |    25 +-
 html5/frameworks/legacy/app/viewport.js         |    38 +
 html5/frameworks/legacy/static/create.js        |    13 +-
 html5/frameworks/vanilla/index.js               |    43 +-
 html5/render/native/index.js                    |     6 +-
 html5/runtime/callback-manager.js               |    37 +
 html5/runtime/config.js                         |    17 +
 html5/runtime/handler.js                        |     2 +-
 html5/runtime/index.js                          |    32 +-
 html5/runtime/init.js                           |    87 +-
 html5/runtime/service.js                        |    58 +
 html5/runtime/task-center.js                    |    72 +
 html5/runtime/vdom/document.js                  |     4 +-
 html5/runtime/vdom/element-types.js             |    65 +
 html5/runtime/vdom/element.js                   |   149 +-
 html5/runtime/vdom/index.js                     |     8 +-
 html5/runtime/vdom/operation.js                 |    29 +-
 html5/services/amd/index.js                     |    70 +
 html5/services/broadcast-channel/index.js       |   106 +
 .../services/broadcast-channel/message-event.js |    21 +
 html5/services/index.js                         |     5 +
 html5/shared/setTimeout.js                      |     2 +
 .../case/basic/global-weex-object.output.js     |     6 +
 .../case/basic/global-weex-object.source.js     |    19 +
 html5/test/case/prepare.js                      |    10 +-
 html5/test/case/tester.js                       |    50 +-
 html5/test/unit/default/api/methods.js          |     6 +-
 html5/test/unit/default/app/bundle.js           |    30 +-
 html5/test/unit/default/app/ctrl.js             |    31 +-
 html5/test/unit/default/app/index.js            |    54 +-
 html5/test/unit/default/app/viewport.js         |    61 +
 html5/test/unit/default/runtime.js              |    40 +-
 html5/test/unit/default/vm/dom-helper.js        |     9 +-
 html5/test/unit/default/vm/events.js            |    14 +-
 html5/test/unit/default/vm/vm.js                |    16 +-
 html5/test/unit/shared/BroadcastChannel.js      |   220 +
 html5/test/unit/vanilla/index.js                |     3 -
 html5/test/unit/vdom/index.js                   |    76 +-
 html5/test/unit/vdom/listener.js                |    34 +-
 .../WeexDemo.xcodeproj/project.pbxproj          |    73 +-
 .../contents.xcworkspacedata                    |     7 +
 .../xcshareddata/xcschemes/WeexDemo.xcscheme    |     2 +-
 ios/playground/WeexDemo/AppDelegate.m           |     4 +-
 ios/playground/WeexDemo/Scanner/WXScannerVC.m   |     2 +-
 ios/playground/WeexDemo/WXDemoViewController.m  |     6 +
 ios/playground/WeexDemo/WXSyncTestModule.h      |    14 +
 ios/playground/WeexDemo/WXSyncTestModule.m      |    38 +
 ios/sdk/WeexSDK.podspec                         |    12 +-
 ios/sdk/WeexSDK.xcodeproj/project.pbxproj       |   192 +-
 ios/sdk/WeexSDK/Resources/main.js               |    14 +-
 ios/sdk/WeexSDK/Sources/Bridge/JSValue+Weex.h   |    15 +
 ios/sdk/WeexSDK/Sources/Bridge/JSValue+Weex.m   |    90 +
 .../WeexSDK/Sources/Bridge/WXBridgeContext.h    |    11 +-
 .../WeexSDK/Sources/Bridge/WXBridgeContext.m    |   127 +-
 ios/sdk/WeexSDK/Sources/Bridge/WXCallJSMethod.h |    20 +
 ios/sdk/WeexSDK/Sources/Bridge/WXCallJSMethod.m |    35 +
 .../WeexSDK/Sources/Bridge/WXComponentMethod.h  |    21 +
 .../WeexSDK/Sources/Bridge/WXComponentMethod.m  |    51 +
 .../Sources/Bridge/WXDebugLoggerBridge.m        |     5 +
 ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.m |    40 +-
 ios/sdk/WeexSDK/Sources/Bridge/WXModuleMethod.h |    28 +
 ios/sdk/WeexSDK/Sources/Bridge/WXModuleMethod.m |    99 +
 .../Sources/Component/WXCanvasComponent.m       |    16 +-
 .../WeexSDK/Sources/Component/WXCellComponent.h |     4 +-
 .../WeexSDK/Sources/Component/WXCellComponent.m |    10 +
 .../Component/WXComponent+GradientColor.h       |    20 +
 .../Component/WXComponent+GradientColor.m       |   116 +
 .../Sources/Component/WXComponent_internal.h    |    20 +-
 .../Sources/Component/WXImageComponent.m        |    58 +-
 .../Sources/Component/WXIndicatorComponent.m    |     5 +-
 .../WeexSDK/Sources/Component/WXListComponent.m |    48 +-
 .../Sources/Component/WXScrollerComponent.h     |     2 +
 .../Sources/Component/WXScrollerComponent.m     |    18 +-
 .../Sources/Component/WXSliderComponent.m       |    48 +-
 .../Component/WXSliderNeighborComponent.m       |   103 +-
 .../Sources/Component/WXTextAreaComponent.m     |   199 +-
 .../WeexSDK/Sources/Component/WXTextComponent.m |    40 +-
 .../Sources/Component/WXTextInputComponent.m    |   262 +-
 ios/sdk/WeexSDK/Sources/Component/WXTransform.h |     3 +
 ios/sdk/WeexSDK/Sources/Component/WXTransform.m |    25 +-
 .../Sources/Component/WXVideoComponent.m        |     2 +-
 .../Sources/Controller/WXBaseViewController.m   |    48 +-
 ios/sdk/WeexSDK/Sources/Debug/WXDebugTool.m     |    46 +-
 .../Sources/Display/WXComponent+Display.m       |    40 +-
 ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.h    |    51 +-
 ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.m    |    62 +-
 ios/sdk/WeexSDK/Sources/Engine/WXSDKError.h     |     5 +-
 .../WeexSDK/Sources/Events/WXComponent+Events.m |   141 +-
 .../Sources/Handler/WXNetworkDefaultImpl.h      |    14 -
 .../Sources/Handler/WXNetworkDefaultImpl.m      |   111 -
 .../WeexSDK/Sources/Layout/WXComponent+Layout.m |    87 +-
 .../WeexSDK/Sources/Loader/WXResourceLoader.h   |    30 +
 .../WeexSDK/Sources/Loader/WXResourceLoader.m   |   174 +
 .../WeexSDK/Sources/Loader/WXWebSocketLoader.h  |    24 +
 .../WeexSDK/Sources/Loader/WXWebSocketLoader.m  |   131 +
 .../WeexSDK/Sources/Manager/WXBridgeManager.h   |    29 +-
 .../WeexSDK/Sources/Manager/WXBridgeManager.m   |    87 +-
 .../Sources/Manager/WXComponentFactory.m        |     6 +-
 .../Sources/Manager/WXComponentManager.h        |    12 +-
 .../Sources/Manager/WXComponentManager.m        |    58 +-
 .../Sources/Manager/WXDatePickerManager.h       |     1 -
 .../Sources/Manager/WXDatePickerManager.m       |    58 +-
 .../WeexSDK/Sources/Manager/WXHandlerFactory.m  |     1 -
 .../Sources/Manager/WXInvocationConfig.h        |     6 +-
 .../Sources/Manager/WXInvocationConfig.m        |   100 +-
 .../WeexSDK/Sources/Manager/WXModuleFactory.h   |     4 +-
 .../WeexSDK/Sources/Manager/WXModuleFactory.m   |    32 +-
 .../WeexSDK/Sources/Manager/WXModuleManager.h   |    16 -
 .../WeexSDK/Sources/Manager/WXModuleManager.m   |   111 -
 ios/sdk/WeexSDK/Sources/Manager/WXRuleManager.m |    11 +-
 ios/sdk/WeexSDK/Sources/Manager/WXSDKManager.h  |    10 +-
 ios/sdk/WeexSDK/Sources/Manager/WXSDKManager.m  |    19 +-
 .../WeexSDK/Sources/Manager/WXServiceFactory.h  |    38 +
 .../WeexSDK/Sources/Manager/WXServiceFactory.m  |   102 +
 ios/sdk/WeexSDK/Sources/Model/WXBridgeMethod.h  |    18 +-
 ios/sdk/WeexSDK/Sources/Model/WXBridgeMethod.m  |    85 +-
 ios/sdk/WeexSDK/Sources/Model/WXComponent.h     |    10 +
 ios/sdk/WeexSDK/Sources/Model/WXComponent.m     |    39 +-
 ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.h   |    56 +-
 ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m   |   421 +-
 .../Sources/Model/WXSDKInstance_private.h       |     8 +
 .../WeexSDK/Sources/Module/WXAnimationModule.m  |    26 +-
 ios/sdk/WeexSDK/Sources/Module/WXDomModule.m    |    31 +-
 .../Sources/Module/WXGlobalEventModule.m        |     1 +
 ios/sdk/WeexSDK/Sources/Module/WXMetaModule.h   |    14 +
 ios/sdk/WeexSDK/Sources/Module/WXMetaModule.m   |    40 +
 .../WeexSDK/Sources/Module/WXNavigatorModule.m  |    28 +-
 ios/sdk/WeexSDK/Sources/Module/WXStreamModule.h |     2 +-
 ios/sdk/WeexSDK/Sources/Module/WXStreamModule.m |   220 +-
 .../WeexSDK/Sources/Module/WXWebSocketModule.h  |    15 +
 .../WeexSDK/Sources/Module/WXWebSocketModule.m  |   137 +
 ios/sdk/WeexSDK/Sources/Monitor/WXMonitor.h     |     2 +
 .../WeexSDK/Sources/Network/WXResourceRequest.h |    35 +
 .../WeexSDK/Sources/Network/WXResourceRequest.m |    57 +
 .../Sources/Network/WXResourceRequestHandler.h  |    45 +
 .../WXResourceRequestHandlerDefaultImpl.h       |    15 +
 .../WXResourceRequestHandlerDefaultImpl.m       |    90 +
 .../Sources/Network/WXResourceResponse.h        |    14 +
 .../Sources/Network/WXResourceResponse.m        |    14 +
 .../WeexSDK/Sources/Protocol/WXBridgeProtocol.h |    28 +-
 .../Sources/Protocol/WXNavigationProtocol.h     |    31 +-
 .../Sources/Protocol/WXNetworkProtocol.h        |     1 +
 .../Sources/Protocol/WXURLRewriteProtocol.h     |    10 +-
 ios/sdk/WeexSDK/Sources/Utility/WXConvert.h     |    22 +-
 ios/sdk/WeexSDK/Sources/Utility/WXConvert.m     |    87 +-
 ios/sdk/WeexSDK/Sources/Utility/WXDefine.h      |    27 +-
 ios/sdk/WeexSDK/Sources/Utility/WXType.h        |    13 +-
 ios/sdk/WeexSDK/Sources/Utility/WXUtility.h     |    57 +-
 ios/sdk/WeexSDK/Sources/Utility/WXUtility.m     |   119 +-
 .../View/WXComponent+PseudoClassManagement.h    |    66 +
 .../View/WXComponent+PseudoClassManagement.m    |   144 +
 .../Sources/View/WXComponent+ViewManagement.m   |    14 +-
 ios/sdk/WeexSDK/Sources/View/WXView.m           |     2 +-
 .../Sources/WebSocket/SRWebSocket+Weex.h        |    18 +
 .../Sources/WebSocket/SRWebSocket+Weex.m        |    36 +
 .../Sources/WebSocket/WXWebSocketDefaultImpl.h  |    14 +
 .../Sources/WebSocket/WXWebSocketDefaultImpl.m  |   110 +
 .../Sources/WebSocket/WXWebSocketHandler.h      |    26 +
 ios/sdk/WeexSDK/Sources/WeexSDK.h               |     1 +
 ios/sdk/WeexSDKTests/TestSupportUtils.m         |     2 +-
 ios/sdk/WeexSDKTests/WXBridgeMethodTests.m      |    24 +-
 ios/sdk/WeexSDKTests/WXNetworkTests.m           |   109 -
 ios/sdk/WeexSDKTests/WXRootViewTests.m          |     4 +-
 ios/sdk/WeexSDKTests/WXSDKEngineTests.m         |    15 +-
 ios/sdk/WeexSDKTests/WXSDKManagerTests.m        |     4 -
 ios/sdk/WeexSDKTests/WXStreamModuleTests.m      |     4 +-
 ios/sdk/WeexSDKTests/WXURLRewriteTests.m        |     4 +-
 package.json                                    |    37 +-
 test/README.md                                  |    28 +
 test/benchmark.html                             |    42 -
 test/circleci-android/Constants.java            |    16 -
 test/event-bubble.we                            |    45 -
 test/index-item.we                              |    26 -
 test/index.we                                   |    53 -
 test/input-test.we                              |    27 -
 test/pages/components/input.we                  |     0
 test/pages/index.we                             |    27 +
 test/run.sh                                     |    28 +
 test/scripts/index.test.js                      |    57 +
 test/scripts/test.js                            |     1 +
 test/scripts/weex-node-map.js                   |    17 +
 test/scripts/weex.js                            |   129 +
 test/scroller-demo.we                           |   168 -
 test/serve.sh                                   |     4 +
 test/sticky-demo.we                             |    81 -
 test/stream.json                                |     3 -
 test/stream.we                                  |   140 -
 test/test.we                                    |    85 -
 test/text-word-wrap.we                          |    13 -
 test/ui-list-item.we                            |    28 -
 test/update-cli.sh                              |     5 +
 test/web-demo.we                                |    30 -
 test/web-inner.html                             |    42 -
 490 files changed, 48554 insertions(+), 9027 deletions(-)
----------------------------------------------------------------------



[31/50] [abbrv] incubator-weex git commit: * [android] update jsfm to v0.19.7 include RAX and Vue2.0 exclude strict mode (#136)

Posted by ji...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/405b6e67/android/sdk/assets/main.js
----------------------------------------------------------------------
diff --git a/android/sdk/assets/main.js b/android/sdk/assets/main.js
index 8cfe735..2fc8baf 100644
--- a/android/sdk/assets/main.js
+++ b/android/sdk/assets/main.js
@@ -1,5 +1,5 @@
-(this.nativeLog || function(s) {console.log(s)})('START JS FRAMEWORK 0.19.4, Build 2017-01-03 11:15.');
-(this.getJSFMVersion = function(){return "0.19.4"});var global = this, process = { env: {} };var setTimeout = global.setTimeout;
+(this.nativeLog || function(s) {console.log(s)})('START JS FRAMEWORK 0.19.7, Build 2017-01-10 10:50.');
+(this.getJSFMVersion = function(){return "0.19.7"});var global = this, process = { env: {} };var setTimeout = global.setTimeout;
 
 (function (global, factory) {
 	typeof exports === 'object' && typeof module !== 'undefined' ? factory() :
@@ -7,7 +7,7 @@
 	(factory());
 }(this, (function () { 'use strict';
 
-var subversion = {"browser":"0.5.0","framework":"0.19.4","transformer":">=0.1.5 <0.5"};
+var subversion = {"browser":"0.5.0","framework":"0.19.7","transformer":">=0.1.5 <0.5"};
 
 /* eslint-disable */
 
@@ -319,7 +319,7 @@ $export$1.P = 8;   // proto
 $export$1.B = 16;  // bind
 $export$1.W = 32;  // wrap
 $export$1.U = 64;  // safe
-$export$1.R = 128; // real proto method for `library`
+$export$1.R = 128; // real proto method for `library` 
 var _export = $export$1;
 
 var toString$1 = {}.toString;
@@ -4985,804 +4985,951 @@ var initProxy;
 
 /*  */
 
+var VNode = function VNode (
+  tag,
+  data,
+  children,
+  text,
+  elm,
+  context,
+  componentOptions
+) {
+  this.tag = tag;
+  this.data = data;
+  this.children = children;
+  this.text = text;
+  this.elm = elm;
+  this.ns = undefined;
+  this.context = context;
+  this.functionalContext = undefined;
+  this.key = data && data.key;
+  this.componentOptions = componentOptions;
+  this.child = undefined;
+  this.parent = undefined;
+  this.raw = false;
+  this.isStatic = false;
+  this.isRootInsert = true;
+  this.isComment = false;
+  this.isCloned = false;
+  this.isOnce = false;
+};
 
-var queue = [];
-var has$1 = {};
-var circular = {};
-var waiting = false;
-var flushing = false;
-var index = 0;
+var createEmptyVNode = function () {
+  var node = new VNode();
+  node.text = '';
+  node.isComment = true;
+  return node
+};
 
-/**
- * Reset the scheduler's state.
- */
-function resetSchedulerState () {
-  queue.length = 0;
-  has$1 = {};
-  {
-    circular = {};
+function createTextVNode (val) {
+  return new VNode(undefined, undefined, undefined, String(val))
+}
+
+// optimized shallow clone
+// used for static nodes and slot nodes because they may be reused across
+// multiple renders, cloning them avoids errors when DOM manipulations rely
+// on their elm reference.
+function cloneVNode (vnode) {
+  var cloned = new VNode(
+    vnode.tag,
+    vnode.data,
+    vnode.children,
+    vnode.text,
+    vnode.elm,
+    vnode.context,
+    vnode.componentOptions
+  );
+  cloned.ns = vnode.ns;
+  cloned.isStatic = vnode.isStatic;
+  cloned.key = vnode.key;
+  cloned.isCloned = true;
+  return cloned
+}
+
+function cloneVNodes (vnodes) {
+  var res = new Array(vnodes.length);
+  for (var i = 0; i < vnodes.length; i++) {
+    res[i] = cloneVNode(vnodes[i]);
   }
-  waiting = flushing = false;
+  return res
 }
 
-/**
- * Flush both queues and run the watchers.
- */
-function flushSchedulerQueue () {
-  flushing = true;
+/*  */
 
-  // Sort queue before flush.
-  // This ensures that:
-  // 1. Components are updated from parent to child. (because parent is always
-  //    created before the child)
-  // 2. A component's user watchers are run before its render watcher (because
-  //    user watchers are created before the render watcher)
-  // 3. If a component is destroyed during a parent component's watcher run,
-  //    its watchers can be skipped.
-  queue.sort(function (a, b) { return a.id - b.id; });
+var hooks = { init: init$1, prepatch: prepatch, insert: insert, destroy: destroy$1 };
+var hooksToMerge = Object.keys(hooks);
 
-  // do not cache length because more watchers might be pushed
-  // as we run existing watchers
-  for (index = 0; index < queue.length; index++) {
-    var watcher = queue[index];
-    var id = watcher.id;
-    has$1[id] = null;
-    watcher.run();
-    // in dev build, check and stop circular updates.
-    if ("development" !== 'production' && has$1[id] != null) {
-      circular[id] = (circular[id] || 0) + 1;
-      if (circular[id] > config._maxUpdateCount) {
-        warn(
-          'You may have an infinite update loop ' + (
-            watcher.user
-              ? ("in watcher with expression \"" + (watcher.expression) + "\"")
-              : "in a component render function."
-          ),
-          watcher.vm
-        );
-        break
-      }
-    }
+function createComponent (
+  Ctor,
+  data,
+  context,
+  children,
+  tag
+) {
+  if (!Ctor) {
+    return
   }
 
-  // devtool hook
-  /* istanbul ignore if */
-  if (devtools && config.devtools) {
-    devtools.emit('flush');
+  var baseCtor = context.$options._base;
+  if (isObject(Ctor)) {
+    Ctor = baseCtor.extend(Ctor);
   }
 
-  resetSchedulerState();
-}
+  if (typeof Ctor !== 'function') {
+    {
+      warn(("Invalid Component definition: " + (String(Ctor))), context);
+    }
+    return
+  }
 
-/**
- * Push a watcher into the watcher queue.
- * Jobs with duplicate IDs will be skipped unless it's
- * pushed when the queue is being flushed.
- */
-function queueWatcher (watcher) {
-  var id = watcher.id;
-  if (has$1[id] == null) {
-    has$1[id] = true;
-    if (!flushing) {
-      queue.push(watcher);
+  // async component
+  if (!Ctor.cid) {
+    if (Ctor.resolved) {
+      Ctor = Ctor.resolved;
     } else {
-      // if already flushing, splice the watcher based on its id
-      // if already past its id, it will be run next immediately.
-      var i = queue.length - 1;
-      while (i >= 0 && queue[i].id > watcher.id) {
-        i--;
+      Ctor = resolveAsyncComponent(Ctor, baseCtor, function () {
+        // it's ok to queue this on every render because
+        // $forceUpdate is buffered by the scheduler.
+        context.$forceUpdate();
+      });
+      if (!Ctor) {
+        // return nothing if this is indeed an async component
+        // wait for the callback to trigger parent update.
+        return
       }
-      queue.splice(Math.max(i, index) + 1, 0, watcher);
-    }
-    // queue the flush
-    if (!waiting) {
-      waiting = true;
-      nextTick(flushSchedulerQueue);
     }
   }
-}
 
-/*  */
+  // resolve constructor options in case global mixins are applied after
+  // component constructor creation
+  resolveConstructorOptions(Ctor);
 
-var uid$2 = 0;
+  data = data || {};
 
-/**
- * A watcher parses an expression, collects dependencies,
- * and fires callback when the expression value changes.
- * This is used for both the $watch() api and directives.
- */
-var Watcher = function Watcher (
-  vm,
-  expOrFn,
-  cb,
-  options
-) {
-  this.vm = vm;
-  vm._watchers.push(this);
-  // options
-  if (options) {
-    this.deep = !!options.deep;
-    this.user = !!options.user;
-    this.lazy = !!options.lazy;
-    this.sync = !!options.sync;
-  } else {
-    this.deep = this.user = this.lazy = this.sync = false;
-  }
-  this.cb = cb;
-  this.id = ++uid$2; // uid for batching
-  this.active = true;
-  this.dirty = this.lazy; // for lazy watchers
-  this.deps = [];
-  this.newDeps = [];
-  this.depIds = new _Set();
-  this.newDepIds = new _Set();
-  this.expression = expOrFn.toString();
-  // parse expression for getter
-  if (typeof expOrFn === 'function') {
-    this.getter = expOrFn;
-  } else {
-    this.getter = parsePath(expOrFn);
-    if (!this.getter) {
-      this.getter = function () {};
-      "development" !== 'production' && warn(
-        "Failed watching path: \"" + expOrFn + "\" " +
-        'Watcher only accepts simple dot-delimited paths. ' +
-        'For full control, use a function instead.',
-        vm
-      );
-    }
-  }
-  this.value = this.lazy
-    ? undefined
-    : this.get();
-};
+  // extract props
+  var propsData = extractProps(data, Ctor);
 
-/**
- * Evaluate the getter, and re-collect dependencies.
- */
-Watcher.prototype.get = function get () {
-  pushTarget(this);
-  var value = this.getter.call(this.vm, this.vm);
-  // "touch" every property so they are all tracked as
-  // dependencies for deep watching
-  if (this.deep) {
-    traverse(value);
+  // functional component
+  if (Ctor.options.functional) {
+    return createFunctionalComponent(Ctor, propsData, data, context, children)
   }
-  popTarget();
-  this.cleanupDeps();
-  return value
-};
 
-/**
- * Add a dependency to this directive.
- */
-Watcher.prototype.addDep = function addDep (dep) {
-  var id = dep.id;
-  if (!this.newDepIds.has(id)) {
-    this.newDepIds.add(id);
-    this.newDeps.push(dep);
-    if (!this.depIds.has(id)) {
-      dep.addSub(this);
-    }
+  // extract listeners, since these needs to be treated as
+  // child component listeners instead of DOM listeners
+  var listeners = data.on;
+  // replace with listeners with .native modifier
+  data.on = data.nativeOn;
+
+  if (Ctor.options.abstract) {
+    // abstract components do not keep anything
+    // other than props & listeners
+    data = {};
   }
-};
 
-/**
- * Clean up for dependency collection.
- */
-Watcher.prototype.cleanupDeps = function cleanupDeps () {
-    var this$1 = this;
+  // merge component management hooks onto the placeholder node
+  mergeHooks(data);
 
-  var i = this.deps.length;
-  while (i--) {
-    var dep = this$1.deps[i];
-    if (!this$1.newDepIds.has(dep.id)) {
-      dep.removeSub(this$1);
+  // return a placeholder vnode
+  var name = Ctor.options.name || tag;
+  var vnode = new VNode(
+    ("vue-component-" + (Ctor.cid) + (name ? ("-" + name) : '')),
+    data, undefined, undefined, undefined, context,
+    { Ctor: Ctor, propsData: propsData, listeners: listeners, tag: tag, children: children }
+  );
+  return vnode
+}
+
+function createFunctionalComponent (
+  Ctor,
+  propsData,
+  data,
+  context,
+  children
+) {
+  var props = {};
+  var propOptions = Ctor.options.props;
+  if (propOptions) {
+    for (var key in propOptions) {
+      props[key] = validateProp(key, propOptions, propsData);
     }
   }
-  var tmp = this.depIds;
-  this.depIds = this.newDepIds;
-  this.newDepIds = tmp;
-  this.newDepIds.clear();
-  tmp = this.deps;
-  this.deps = this.newDeps;
-  this.newDeps = tmp;
-  this.newDeps.length = 0;
-};
+  // ensure the createElement function in functional components
+  // gets a unique context - this is necessary for correct named slot check
+  var _context = Object.create(context);
+  var h = function (a, b, c, d) { return createElement(_context, a, b, c, d, true); };
+  var vnode = Ctor.options.render.call(null, h, {
+    props: props,
+    data: data,
+    parent: context,
+    children: children,
+    slots: function () { return resolveSlots(children, context); }
+  });
+  if (vnode instanceof VNode) {
+    vnode.functionalContext = context;
+    if (data.slot) {
+      (vnode.data || (vnode.data = {})).slot = data.slot;
+    }
+  }
+  return vnode
+}
 
-/**
- * Subscriber interface.
- * Will be called when a dependency changes.
- */
-Watcher.prototype.update = function update () {
-  /* istanbul ignore else */
-  if (this.lazy) {
-    this.dirty = true;
-  } else if (this.sync) {
-    this.run();
-  } else {
-    queueWatcher(this);
+function createComponentInstanceForVnode (
+  vnode, // we know it's MountedComponentVNode but flow doesn't
+  parent, // activeInstance in lifecycle state
+  parentElm,
+  refElm
+) {
+  var vnodeComponentOptions = vnode.componentOptions;
+  var options = {
+    _isComponent: true,
+    parent: parent,
+    propsData: vnodeComponentOptions.propsData,
+    _componentTag: vnodeComponentOptions.tag,
+    _parentVnode: vnode,
+    _parentListeners: vnodeComponentOptions.listeners,
+    _renderChildren: vnodeComponentOptions.children,
+    _parentElm: parentElm || null,
+    _refElm: refElm || null
+  };
+  // check inline-template render functions
+  var inlineTemplate = vnode.data.inlineTemplate;
+  if (inlineTemplate) {
+    options.render = inlineTemplate.render;
+    options.staticRenderFns = inlineTemplate.staticRenderFns;
   }
-};
+  return new vnodeComponentOptions.Ctor(options)
+}
 
-/**
- * Scheduler job interface.
- * Will be called by the scheduler.
- */
-Watcher.prototype.run = function run () {
-  if (this.active) {
-    var value = this.get();
-    if (
-      value !== this.value ||
-      // Deep watchers and watchers on Object/Arrays should fire even
-      // when the value is the same, because the value may
-      // have mutated.
-      isObject(value) ||
-      this.deep
-    ) {
-      // set new value
-      var oldValue = this.value;
-      this.value = value;
-      if (this.user) {
-        try {
-          this.cb.call(this.vm, value, oldValue);
-        } catch (e) {
-          /* istanbul ignore else */
-          if (config.errorHandler) {
-            config.errorHandler.call(null, e, this.vm);
-          } else {
-            "development" !== 'production' && warn(
-              ("Error in watcher \"" + (this.expression) + "\""),
-              this.vm
-            );
-            throw e
-          }
-        }
-      } else {
-        this.cb.call(this.vm, value, oldValue);
-      }
-    }
+function init$1 (
+  vnode,
+  hydrating,
+  parentElm,
+  refElm
+) {
+  if (!vnode.child || vnode.child._isDestroyed) {
+    var child = vnode.child = createComponentInstanceForVnode(
+      vnode,
+      activeInstance,
+      parentElm,
+      refElm
+    );
+    child.$mount(hydrating ? vnode.elm : undefined, hydrating);
+  } else if (vnode.data.keepAlive) {
+    // kept-alive components, treat as a patch
+    var mountedNode = vnode; // work around flow
+    prepatch(mountedNode, mountedNode);
   }
-};
+}
 
-/**
- * Evaluate the value of the watcher.
- * This only gets called for lazy watchers.
- */
-Watcher.prototype.evaluate = function evaluate () {
-  this.value = this.get();
-  this.dirty = false;
-};
+function prepatch (
+  oldVnode,
+  vnode
+) {
+  var options = vnode.componentOptions;
+  var child = vnode.child = oldVnode.child;
+  child._updateFromParent(
+    options.propsData, // updated props
+    options.listeners, // updated listeners
+    vnode, // new parent vnode
+    options.children // new children
+  );
+}
 
-/**
- * Depend on all deps collected by this watcher.
- */
-Watcher.prototype.depend = function depend () {
-    var this$1 = this;
+function insert (vnode) {
+  if (!vnode.child._isMounted) {
+    vnode.child._isMounted = true;
+    callHook(vnode.child, 'mounted');
+  }
+  if (vnode.data.keepAlive) {
+    vnode.child._inactive = false;
+    callHook(vnode.child, 'activated');
+  }
+}
 
-  var i = this.deps.length;
-  while (i--) {
-    this$1.deps[i].depend();
+function destroy$1 (vnode) {
+  if (!vnode.child._isDestroyed) {
+    if (!vnode.data.keepAlive) {
+      vnode.child.$destroy();
+    } else {
+      vnode.child._inactive = true;
+      callHook(vnode.child, 'deactivated');
+    }
   }
-};
+}
 
-/**
- * Remove self from all dependencies' subscriber list.
- */
-Watcher.prototype.teardown = function teardown () {
-    var this$1 = this;
+function resolveAsyncComponent (
+  factory,
+  baseCtor,
+  cb
+) {
+  if (factory.requested) {
+    // pool callbacks
+    factory.pendingCallbacks.push(cb);
+  } else {
+    factory.requested = true;
+    var cbs = factory.pendingCallbacks = [cb];
+    var sync = true;
 
-  if (this.active) {
-    // remove self from vm's watcher list
-    // this is a somewhat expensive operation so we skip it
-    // if the vm is being destroyed.
-    if (!this.vm._isBeingDestroyed) {
-      remove(this.vm._watchers, this);
-    }
-    var i = this.deps.length;
-    while (i--) {
-      this$1.deps[i].removeSub(this$1);
+    var resolve = function (res) {
+      if (isObject(res)) {
+        res = baseCtor.extend(res);
+      }
+      // cache resolved
+      factory.resolved = res;
+      // invoke callbacks only if this is not a synchronous resolve
+      // (async resolves are shimmed as synchronous during SSR)
+      if (!sync) {
+        for (var i = 0, l = cbs.length; i < l; i++) {
+          cbs[i](res);
+        }
+      }
+    };
+
+    var reject = function (reason) {
+      "development" !== 'production' && warn(
+        "Failed to resolve async component: " + (String(factory)) +
+        (reason ? ("\nReason: " + reason) : '')
+      );
+    };
+
+    var res = factory(resolve, reject);
+
+    // handle promise
+    if (res && typeof res.then === 'function' && !factory.resolved) {
+      res.then(resolve, reject);
     }
-    this.active = false;
-  }
-};
 
-/**
- * Recursively traverse an object to evoke all converted
- * getters, so that every nested property inside the object
- * is collected as a "deep" dependency.
- */
-var seenObjects = new _Set();
-function traverse (val) {
-  seenObjects.clear();
-  _traverse(val, seenObjects);
+    sync = false;
+    // return in case resolved synchronously
+    return factory.resolved
+  }
 }
 
-function _traverse (val, seen) {
-  var i, keys;
-  var isA = Array.isArray(val);
-  if ((!isA && !isObject(val)) || !Object.isExtensible(val)) {
+function extractProps (data, Ctor) {
+  // we are only extracting raw values here.
+  // validation and default values are handled in the child
+  // component itself.
+  var propOptions = Ctor.options.props;
+  if (!propOptions) {
     return
   }
-  if (val.__ob__) {
-    var depId = val.__ob__.dep.id;
-    if (seen.has(depId)) {
-      return
+  var res = {};
+  var attrs = data.attrs;
+  var props = data.props;
+  var domProps = data.domProps;
+  if (attrs || props || domProps) {
+    for (var key in propOptions) {
+      var altKey = hyphenate(key);
+      checkProp(res, props, key, altKey, true) ||
+      checkProp(res, attrs, key, altKey) ||
+      checkProp(res, domProps, key, altKey);
     }
-    seen.add(depId);
-  }
-  if (isA) {
-    i = val.length;
-    while (i--) { _traverse(val[i], seen); }
-  } else {
-    keys = Object.keys(val);
-    i = keys.length;
-    while (i--) { _traverse(val[keys[i]], seen); }
-  }
-}
-
-/*  */
-
-function initState (vm) {
-  vm._watchers = [];
-  var opts = vm.$options;
-  if (opts.props) { initProps(vm, opts.props); }
-  if (opts.methods) { initMethods(vm, opts.methods); }
-  if (opts.data) {
-    initData(vm);
-  } else {
-    observe(vm._data = {}, true /* asRootData */);
   }
-  if (opts.computed) { initComputed(vm, opts.computed); }
-  if (opts.watch) { initWatch(vm, opts.watch); }
+  return res
 }
 
-var isReservedProp = { key: 1, ref: 1, slot: 1 };
-
-function initProps (vm, props) {
-  var propsData = vm.$options.propsData || {};
-  var keys = vm.$options._propKeys = Object.keys(props);
-  var isRoot = !vm.$parent;
-  // root instance props should be converted
-  observerState.shouldConvert = isRoot;
-  var loop = function ( i ) {
-    var key = keys[i];
-    /* istanbul ignore else */
-    {
-      if (isReservedProp[key]) {
-        warn(
-          ("\"" + key + "\" is a reserved attribute and cannot be used as component prop."),
-          vm
-        );
+function checkProp (
+  res,
+  hash,
+  key,
+  altKey,
+  preserve
+) {
+  if (hash) {
+    if (hasOwn(hash, key)) {
+      res[key] = hash[key];
+      if (!preserve) {
+        delete hash[key];
+      }
+      return true
+    } else if (hasOwn(hash, altKey)) {
+      res[key] = hash[altKey];
+      if (!preserve) {
+        delete hash[altKey];
       }
-      defineReactive$$1(vm, key, validateProp(key, props, propsData, vm), function () {
-        if (vm.$parent && !observerState.isSettingProps) {
-          warn(
-            "Avoid mutating a prop directly since the value will be " +
-            "overwritten whenever the parent component re-renders. " +
-            "Instead, use a data or computed property based on the prop's " +
-            "value. Prop being mutated: \"" + key + "\"",
-            vm
-          );
-        }
-      });
+      return true
     }
-  };
-
-  for (var i = 0; i < keys.length; i++) { loop( i ); }
-  observerState.shouldConvert = true;
+  }
+  return false
 }
 
-function initData (vm) {
-  var data = vm.$options.data;
-  data = vm._data = typeof data === 'function'
-    ? data.call(vm)
-    : data || {};
-  if (!isPlainObject(data)) {
-    data = {};
-    "development" !== 'production' && warn(
-      'data functions should return an object:\n' +
-      'https://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function',
-      vm
-    );
+function mergeHooks (data) {
+  if (!data.hook) {
+    data.hook = {};
   }
-  // proxy data on instance
-  var keys = Object.keys(data);
-  var props = vm.$options.props;
-  var i = keys.length;
-  while (i--) {
-    if (props && hasOwn(props, keys[i])) {
-      "development" !== 'production' && warn(
-        "The data property \"" + (keys[i]) + "\" is already declared as a prop. " +
-        "Use prop default value instead.",
-        vm
-      );
-    } else {
-      proxy(vm, keys[i]);
-    }
+  for (var i = 0; i < hooksToMerge.length; i++) {
+    var key = hooksToMerge[i];
+    var fromParent = data.hook[key];
+    var ours = hooks[key];
+    data.hook[key] = fromParent ? mergeHook$1(ours, fromParent) : ours;
   }
-  // observe data
-  observe(data, true /* asRootData */);
 }
 
-var computedSharedDefinition = {
-  enumerable: true,
-  configurable: true,
-  get: noop,
-  set: noop
-};
-
-function initComputed (vm, computed) {
-  for (var key in computed) {
-    /* istanbul ignore if */
-    if ("development" !== 'production' && key in vm) {
-      warn(
-        "existing instance property \"" + key + "\" will be " +
-        "overwritten by a computed property with the same name.",
-        vm
-      );
-    }
-    var userDef = computed[key];
-    if (typeof userDef === 'function') {
-      computedSharedDefinition.get = makeComputedGetter(userDef, vm);
-      computedSharedDefinition.set = noop;
-    } else {
-      computedSharedDefinition.get = userDef.get
-        ? userDef.cache !== false
-          ? makeComputedGetter(userDef.get, vm)
-          : bind(userDef.get, vm)
-        : noop;
-      computedSharedDefinition.set = userDef.set
-        ? bind(userDef.set, vm)
-        : noop;
-    }
-    Object.defineProperty(vm, key, computedSharedDefinition);
+function mergeHook$1 (one, two) {
+  return function (a, b, c, d) {
+    one(a, b, c, d);
+    two(a, b, c, d);
   }
 }
 
-function makeComputedGetter (getter, owner) {
-  var watcher = new Watcher(owner, getter, noop, {
-    lazy: true
-  });
-  return function computedGetter () {
-    if (watcher.dirty) {
-      watcher.evaluate();
-    }
-    if (Dep.target) {
-      watcher.depend();
+/*  */
+
+function mergeVNodeHook (def, hookKey, hook, key) {
+  key = key + hookKey;
+  var injectedHash = def.__injected || (def.__injected = {});
+  if (!injectedHash[key]) {
+    injectedHash[key] = true;
+    var oldHook = def[hookKey];
+    if (oldHook) {
+      def[hookKey] = function () {
+        oldHook.apply(this, arguments);
+        hook.apply(this, arguments);
+      };
+    } else {
+      def[hookKey] = hook;
     }
-    return watcher.value
   }
 }
 
-function initMethods (vm, methods) {
-  for (var key in methods) {
-    vm[key] = methods[key] == null ? noop : bind(methods[key], vm);
-    if ("development" !== 'production' && methods[key] == null) {
-      warn(
-        "method \"" + key + "\" has an undefined value in the component definition. " +
-        "Did you reference the function correctly?",
+/*  */
+
+function updateListeners (
+  on,
+  oldOn,
+  add,
+  remove$$1,
+  vm
+) {
+  var name, cur, old, fn, event, capture, once;
+  for (name in on) {
+    cur = on[name];
+    old = oldOn[name];
+    if (!cur) {
+      "development" !== 'production' && warn(
+        "Invalid handler for event \"" + name + "\": got " + String(cur),
         vm
       );
+    } else if (!old) {
+      once = name.charAt(0) === '~'; // Prefixed last, checked first
+      event = once ? name.slice(1) : name;
+      capture = event.charAt(0) === '!';
+      event = capture ? event.slice(1) : event;
+      if (Array.isArray(cur)) {
+        add(event, (cur.invoker = arrInvoker(cur)), once, capture);
+      } else {
+        if (!cur.invoker) {
+          fn = cur;
+          cur = on[name] = {};
+          cur.fn = fn;
+          cur.invoker = fnInvoker(cur);
+        }
+        add(event, cur.invoker, once, capture);
+      }
+    } else if (cur !== old) {
+      if (Array.isArray(old)) {
+        old.length = cur.length;
+        for (var i = 0; i < old.length; i++) { old[i] = cur[i]; }
+        on[name] = old;
+      } else {
+        old.fn = cur;
+        on[name] = old;
+      }
+    }
+  }
+  for (name in oldOn) {
+    if (!on[name]) {
+      once = name.charAt(0) === '~'; // Prefixed last, checked first
+      event = once ? name.slice(1) : name;
+      capture = event.charAt(0) === '!';
+      event = capture ? event.slice(1) : event;
+      remove$$1(event, oldOn[name].invoker, capture);
     }
   }
 }
 
-function initWatch (vm, watch) {
-  for (var key in watch) {
-    var handler = watch[key];
-    if (Array.isArray(handler)) {
-      for (var i = 0; i < handler.length; i++) {
-        createWatcher(vm, key, handler[i]);
-      }
-    } else {
-      createWatcher(vm, key, handler);
+function arrInvoker (arr) {
+  return function (ev) {
+    var arguments$1 = arguments;
+
+    var single = arguments.length === 1;
+    for (var i = 0; i < arr.length; i++) {
+      single ? arr[i](ev) : arr[i].apply(null, arguments$1);
     }
   }
 }
 
-function createWatcher (vm, key, handler) {
-  var options;
-  if (isPlainObject(handler)) {
-    options = handler;
-    handler = handler.handler;
-  }
-  if (typeof handler === 'string') {
-    handler = vm[handler];
+function fnInvoker (o) {
+  return function (ev) {
+    var single = arguments.length === 1;
+    single ? o.fn(ev) : o.fn.apply(null, arguments);
   }
-  vm.$watch(key, handler, options);
 }
 
-function stateMixin (Vue) {
-  // flow somehow has problems with directly declared definition object
-  // when using Object.defineProperty, so we have to procedurally build up
-  // the object here.
-  var dataDef = {};
-  dataDef.get = function () {
-    return this._data
-  };
-  {
-    dataDef.set = function (newData) {
-      warn(
-        'Avoid replacing instance root $data. ' +
-        'Use nested data properties instead.',
-        this
-      );
-    };
-  }
-  Object.defineProperty(Vue.prototype, '$data', dataDef);
+/*  */
 
-  Vue.prototype.$set = set$1;
-  Vue.prototype.$delete = del;
+// The template compiler attempts to minimize the need for normalization by
+// statically analyzing the template at compile time.
+//
+// For plain HTML markup, normalization can be completely skipped because the
+// generated render function is guaranteed to return Array<VNode>. There are
+// two cases where extra normalization is needed:
 
-  Vue.prototype.$watch = function (
-    expOrFn,
-    cb,
-    options
-  ) {
-    var vm = this;
-    options = options || {};
-    options.user = true;
-    var watcher = new Watcher(vm, expOrFn, cb, options);
-    if (options.immediate) {
-      cb.call(vm, watcher.value);
-    }
-    return function unwatchFn () {
-      watcher.teardown();
+// 1. When the children contains components - because a functional component
+// may return an Array instead of a single root. In this case, just a simple
+// nomralization is needed - if any child is an Array, we flatten the whole
+// thing with Array.prototype.concat. It is guaranteed to be only 1-level deep
+// because functional components already normalize their own children.
+function simpleNormalizeChildren (children) {
+  for (var i = 0; i < children.length; i++) {
+    if (Array.isArray(children[i])) {
+      return Array.prototype.concat.apply([], children)
     }
-  };
+  }
+  return children
 }
 
-function proxy (vm, key) {
-  if (!isReserved(key)) {
-    Object.defineProperty(vm, key, {
-      configurable: true,
-      enumerable: true,
-      get: function proxyGetter () {
-        return vm._data[key]
-      },
-      set: function proxySetter (val) {
-        vm._data[key] = val;
+// 2. When the children contains constrcuts that always generated nested Arrays,
+// e.g. <template>, <slot>, v-for, or when the children is provided by user
+// with hand-written render functions / JSX. In such cases a full normalization
+// is needed to cater to all possible types of children values.
+function normalizeChildren (children) {
+  return isPrimitive(children)
+    ? [createTextVNode(children)]
+    : Array.isArray(children)
+      ? normalizeArrayChildren(children)
+      : undefined
+}
+
+function normalizeArrayChildren (children, nestedIndex) {
+  var res = [];
+  var i, c, last;
+  for (i = 0; i < children.length; i++) {
+    c = children[i];
+    if (c == null || typeof c === 'boolean') { continue }
+    last = res[res.length - 1];
+    //  nested
+    if (Array.isArray(c)) {
+      res.push.apply(res, normalizeArrayChildren(c, ((nestedIndex || '') + "_" + i)));
+    } else if (isPrimitive(c)) {
+      if (last && last.text) {
+        last.text += String(c);
+      } else if (c !== '') {
+        // convert primitive to vnode
+        res.push(createTextVNode(c));
       }
-    });
+    } else {
+      if (c.text && last && last.text) {
+        res[res.length - 1] = createTextVNode(last.text + c.text);
+      } else {
+        // default key for nested array children (likely generated by v-for)
+        if (c.tag && c.key == null && nestedIndex != null) {
+          c.key = "__vlist" + nestedIndex + "_" + i + "__";
+        }
+        res.push(c);
+      }
+    }
   }
+  return res
 }
 
 /*  */
 
-var VNode = function VNode (
+function getFirstComponentChild (children) {
+  return children && children.filter(function (c) { return c && c.componentOptions; })[0]
+}
+
+/*  */
+
+var SIMPLE_NORMALIZE = 1;
+var ALWAYS_NORMALIZE = 2;
+
+// wrapper function for providing a more flexible interface
+// without getting yelled at by flow
+function createElement (
+  context,
   tag,
   data,
   children,
-  text,
-  elm,
-  context,
-  componentOptions
+  normalizationType,
+  alwaysNormalize
 ) {
-  this.tag = tag;
-  this.data = data;
-  this.children = children;
-  this.text = text;
-  this.elm = elm;
-  this.ns = undefined;
-  this.context = context;
-  this.functionalContext = undefined;
-  this.key = data && data.key;
-  this.componentOptions = componentOptions;
-  this.child = undefined;
-  this.parent = undefined;
-  this.raw = false;
-  this.isStatic = false;
-  this.isRootInsert = true;
-  this.isComment = false;
-  this.isCloned = false;
-  this.isOnce = false;
-};
-
-var createEmptyVNode = function () {
-  var node = new VNode();
-  node.text = '';
-  node.isComment = true;
-  return node
-};
-
-function createTextVNode (val) {
-  return new VNode(undefined, undefined, undefined, String(val))
+  if (Array.isArray(data) || isPrimitive(data)) {
+    normalizationType = children;
+    children = data;
+    data = undefined;
+  }
+  if (alwaysNormalize) { normalizationType = ALWAYS_NORMALIZE; }
+  return _createElement(context, tag, data, children, normalizationType)
 }
 
-// optimized shallow clone
-// used for static nodes and slot nodes because they may be reused across
-// multiple renders, cloning them avoids errors when DOM manipulations rely
-// on their elm reference.
-function cloneVNode (vnode) {
-  var cloned = new VNode(
-    vnode.tag,
-    vnode.data,
-    vnode.children,
-    vnode.text,
-    vnode.elm,
-    vnode.context,
-    vnode.componentOptions
-  );
-  cloned.ns = vnode.ns;
-  cloned.isStatic = vnode.isStatic;
-  cloned.key = vnode.key;
-  cloned.isCloned = true;
-  return cloned
+function _createElement (
+  context,
+  tag,
+  data,
+  children,
+  normalizationType
+) {
+  if (data && data.__ob__) {
+    "development" !== 'production' && warn(
+      "Avoid using observed data object as vnode data: " + (JSON.stringify(data)) + "\n" +
+      'Always create fresh vnode data objects in each render!',
+      context
+    );
+    return createEmptyVNode()
+  }
+  if (!tag) {
+    // in case of component :is set to falsy value
+    return createEmptyVNode()
+  }
+  // support single function children as default scoped slot
+  if (Array.isArray(children) &&
+      typeof children[0] === 'function') {
+    data = data || {};
+    data.scopedSlots = { default: children[0] };
+    children.length = 0;
+  }
+  if (normalizationType === ALWAYS_NORMALIZE) {
+    children = normalizeChildren(children);
+  } else if (normalizationType === SIMPLE_NORMALIZE) {
+    children = simpleNormalizeChildren(children);
+  }
+  var vnode, ns;
+  if (typeof tag === 'string') {
+    var Ctor;
+    ns = config.getTagNamespace(tag);
+    if (config.isReservedTag(tag)) {
+      // platform built-in elements
+      vnode = new VNode(
+        config.parsePlatformTagName(tag), data, children,
+        undefined, undefined, context
+      );
+    } else if ((Ctor = resolveAsset(context.$options, 'components', tag))) {
+      // component
+      vnode = createComponent(Ctor, data, context, children, tag);
+    } else {
+      // unknown or unlisted namespaced elements
+      // check at runtime because it may get assigned a namespace when its
+      // parent normalizes children
+      vnode = new VNode(
+        tag, data, children,
+        undefined, undefined, context
+      );
+    }
+  } else {
+    // direct component options / constructor
+    vnode = createComponent(tag, data, context, children);
+  }
+  if (vnode) {
+    if (ns) { applyNS(vnode, ns); }
+    return vnode
+  } else {
+    return createEmptyVNode()
+  }
 }
 
-function cloneVNodes (vnodes) {
-  var res = new Array(vnodes.length);
-  for (var i = 0; i < vnodes.length; i++) {
-    res[i] = cloneVNode(vnodes[i]);
+function applyNS (vnode, ns) {
+  vnode.ns = ns;
+  if (vnode.tag === 'foreignObject') {
+    // use default namespace inside foreignObject
+    return
+  }
+  if (vnode.children) {
+    for (var i = 0, l = vnode.children.length; i < l; i++) {
+      var child = vnode.children[i];
+      if (child.tag && !child.ns) {
+        applyNS(child, ns);
+      }
+    }
   }
-  return res
 }
 
 /*  */
 
-function mergeVNodeHook (def, hookKey, hook, key) {
-  key = key + hookKey;
-  var injectedHash = def.__injected || (def.__injected = {});
-  if (!injectedHash[key]) {
-    injectedHash[key] = true;
-    var oldHook = def[hookKey];
-    if (oldHook) {
-      def[hookKey] = function () {
-        oldHook.apply(this, arguments);
-        hook.apply(this, arguments);
-      };
-    } else {
-      def[hookKey] = hook;
+function initRender (vm) {
+  vm.$vnode = null; // the placeholder node in parent tree
+  vm._vnode = null; // the root of the child tree
+  vm._staticTrees = null;
+  var parentVnode = vm.$options._parentVnode;
+  var renderContext = parentVnode && parentVnode.context;
+  vm.$slots = resolveSlots(vm.$options._renderChildren, renderContext);
+  vm.$scopedSlots = {};
+  // bind the createElement fn to this instance
+  // so that we get proper render context inside it.
+  // args order: tag, data, children, normalizationType, alwaysNormalize
+  // internal version is used by render functions compiled from templates
+  vm._c = function (a, b, c, d) { return createElement(vm, a, b, c, d, false); };
+  // normalization is always applied for the public version, used in
+  // user-written render functions.
+  vm.$createElement = function (a, b, c, d) { return createElement(vm, a, b, c, d, true); };
+  if (vm.$options.el) {
+    vm.$mount(vm.$options.el);
+  }
+}
+
+function renderMixin (Vue) {
+  Vue.prototype.$nextTick = function (fn) {
+    return nextTick(fn, this)
+  };
+
+  Vue.prototype._render = function () {
+    var vm = this;
+    var ref = vm.$options;
+    var render = ref.render;
+    var staticRenderFns = ref.staticRenderFns;
+    var _parentVnode = ref._parentVnode;
+
+    if (vm._isMounted) {
+      // clone slot nodes on re-renders
+      for (var key in vm.$slots) {
+        vm.$slots[key] = cloneVNodes(vm.$slots[key]);
+      }
     }
-  }
-}
 
-/*  */
+    if (_parentVnode && _parentVnode.data.scopedSlots) {
+      vm.$scopedSlots = _parentVnode.data.scopedSlots;
+    }
 
-function updateListeners (
-  on,
-  oldOn,
-  add,
-  remove$$1,
-  vm
-) {
-  var name, cur, old, fn, event, capture, once;
-  for (name in on) {
-    cur = on[name];
-    old = oldOn[name];
-    if (!cur) {
-      "development" !== 'production' && warn(
-        "Invalid handler for event \"" + name + "\": got " + String(cur),
-        vm
-      );
-    } else if (!old) {
-      once = name.charAt(0) === '~'; // Prefixed last, checked first
-      event = once ? name.slice(1) : name;
-      capture = event.charAt(0) === '!';
-      event = capture ? event.slice(1) : event;
-      if (Array.isArray(cur)) {
-        add(event, (cur.invoker = arrInvoker(cur)), once, capture);
+    if (staticRenderFns && !vm._staticTrees) {
+      vm._staticTrees = [];
+    }
+    // set parent vnode. this allows render functions to have access
+    // to the data on the placeholder node.
+    vm.$vnode = _parentVnode;
+    // render self
+    var vnode;
+    try {
+      vnode = render.call(vm._renderProxy, vm.$createElement);
+    } catch (e) {
+      /* istanbul ignore else */
+      if (config.errorHandler) {
+        config.errorHandler.call(null, e, vm);
       } else {
-        if (!cur.invoker) {
-          fn = cur;
-          cur = on[name] = {};
-          cur.fn = fn;
-          cur.invoker = fnInvoker(cur);
+        {
+          warn(("Error when rendering " + (formatComponentName(vm)) + ":"));
         }
-        add(event, cur.invoker, once, capture);
+        throw e
       }
-    } else if (cur !== old) {
-      if (Array.isArray(old)) {
-        old.length = cur.length;
-        for (var i = 0; i < old.length; i++) { old[i] = cur[i]; }
-        on[name] = old;
-      } else {
-        old.fn = cur;
-        on[name] = old;
+      // return previous vnode to prevent render error causing blank component
+      vnode = vm._vnode;
+    }
+    // return empty vnode in case the render function errored out
+    if (!(vnode instanceof VNode)) {
+      if ("development" !== 'production' && Array.isArray(vnode)) {
+        warn(
+          'Multiple root nodes returned from render function. Render function ' +
+          'should return a single root node.',
+          vm
+        );
       }
+      vnode = createEmptyVNode();
     }
-  }
-  for (name in oldOn) {
-    if (!on[name]) {
-      once = name.charAt(0) === '~'; // Prefixed last, checked first
-      event = once ? name.slice(1) : name;
-      capture = event.charAt(0) === '!';
-      event = capture ? event.slice(1) : event;
-      remove$$1(event, oldOn[name].invoker, capture);
+    // set parent
+    vnode.parent = _parentVnode;
+    return vnode
+  };
+
+  // toString for mustaches
+  Vue.prototype._s = _toString;
+  // convert text to vnode
+  Vue.prototype._v = createTextVNode;
+  // number conversion
+  Vue.prototype._n = toNumber;
+  // empty vnode
+  Vue.prototype._e = createEmptyVNode;
+  // loose equal
+  Vue.prototype._q = looseEqual;
+  // loose indexOf
+  Vue.prototype._i = looseIndexOf;
+
+  // render static tree by index
+  Vue.prototype._m = function renderStatic (
+    index,
+    isInFor
+  ) {
+    var tree = this._staticTrees[index];
+    // if has already-rendered static tree and not inside v-for,
+    // we can reuse the same tree by doing a shallow clone.
+    if (tree && !isInFor) {
+      return Array.isArray(tree)
+        ? cloneVNodes(tree)
+        : cloneVNode(tree)
     }
-  }
-}
+    // otherwise, render a fresh tree.
+    tree = this._staticTrees[index] = this.$options.staticRenderFns[index].call(this._renderProxy);
+    markStatic(tree, ("__static__" + index), false);
+    return tree
+  };
 
-function arrInvoker (arr) {
-  return function (ev) {
-    var arguments$1 = arguments;
+  // mark node as static (v-once)
+  Vue.prototype._o = function markOnce (
+    tree,
+    index,
+    key
+  ) {
+    markStatic(tree, ("__once__" + index + (key ? ("_" + key) : "")), true);
+    return tree
+  };
 
-    var single = arguments.length === 1;
-    for (var i = 0; i < arr.length; i++) {
-      single ? arr[i](ev) : arr[i].apply(null, arguments$1);
+  function markStatic (tree, key, isOnce) {
+    if (Array.isArray(tree)) {
+      for (var i = 0; i < tree.length; i++) {
+        if (tree[i] && typeof tree[i] !== 'string') {
+          markStaticNode(tree[i], (key + "_" + i), isOnce);
+        }
+      }
+    } else {
+      markStaticNode(tree, key, isOnce);
     }
   }
-}
 
-function fnInvoker (o) {
-  return function (ev) {
-    var single = arguments.length === 1;
-    single ? o.fn(ev) : o.fn.apply(null, arguments);
+  function markStaticNode (node, key, isOnce) {
+    node.isStatic = true;
+    node.key = key;
+    node.isOnce = isOnce;
   }
-}
 
-/*  */
+  // filter resolution helper
+  Vue.prototype._f = function resolveFilter (id) {
+    return resolveAsset(this.$options, 'filters', id, true) || identity
+  };
 
-// The template compiler attempts to minimize the need for normalization by
-// statically analyzing the template at compile time.
-//
-// For plain HTML markup, normalization can be completely skipped because the
-// generated render function is guaranteed to return Array<VNode>. There are
-// two cases where extra normalization is needed:
+  // render v-for
+  Vue.prototype._l = function renderList (
+    val,
+    render
+  ) {
+    var ret, i, l, keys, key;
+    if (Array.isArray(val) || typeof val === 'string') {
+      ret = new Array(val.length);
+      for (i = 0, l = val.length; i < l; i++) {
+        ret[i] = render(val[i], i);
+      }
+    } else if (typeof val === 'number') {
+      ret = new Array(val);
+      for (i = 0; i < val; i++) {
+        ret[i] = render(i + 1, i);
+      }
+    } else if (isObject(val)) {
+      keys = Object.keys(val);
+      ret = new Array(keys.length);
+      for (i = 0, l = keys.length; i < l; i++) {
+        key = keys[i];
+        ret[i] = render(val[key], key, i);
+      }
+    }
+    return ret
+  };
 
-// 1. When the children contains components - because a functional component
-// may return an Array instead of a single root. In this case, just a simple
-// nomralization is needed - if any child is an Array, we flatten the whole
-// thing with Array.prototype.concat. It is guaranteed to be only 1-level deep
-// because functional components already normalize their own children.
-function simpleNormalizeChildren (children) {
-  for (var i = 0; i < children.length; i++) {
-    if (Array.isArray(children[i])) {
-      return Array.prototype.concat.apply([], children)
+  // renderSlot
+  Vue.prototype._t = function (
+    name,
+    fallback,
+    props,
+    bindObject
+  ) {
+    var scopedSlotFn = this.$scopedSlots[name];
+    if (scopedSlotFn) { // scoped slot
+      props = props || {};
+      if (bindObject) {
+        extend(props, bindObject);
+      }
+      return scopedSlotFn(props) || fallback
+    } else {
+      var slotNodes = this.$slots[name];
+      // warn duplicate slot usage
+      if (slotNodes && "development" !== 'production') {
+        slotNodes._rendered && warn(
+          "Duplicate presence of slot \"" + name + "\" found in the same render tree " +
+          "- this will likely cause render errors.",
+          this
+        );
+        slotNodes._rendered = true;
+      }
+      return slotNodes || fallback
+    }
+  };
+
+  // apply v-bind object
+  Vue.prototype._b = function bindProps (
+    data,
+    tag,
+    value,
+    asProp
+  ) {
+    if (value) {
+      if (!isObject(value)) {
+        "development" !== 'production' && warn(
+          'v-bind without argument expects an Object or Array value',
+          this
+        );
+      } else {
+        if (Array.isArray(value)) {
+          value = toObject(value);
+        }
+        for (var key in value) {
+          if (key === 'class' || key === 'style') {
+            data[key] = value[key];
+          } else {
+            var hash = asProp || config.mustUseProp(tag, key)
+              ? data.domProps || (data.domProps = {})
+              : data.attrs || (data.attrs = {});
+            hash[key] = value[key];
+          }
+        }
+      }
     }
-  }
-  return children
-}
+    return data
+  };
 
-// 2. When the children contains constrcuts that always generated nested Arrays,
-// e.g. <template>, <slot>, v-for, or when the children is provided by user
-// with hand-written render functions / JSX. In such cases a full normalization
-// is needed to cater to all possible types of children values.
-function normalizeChildren (children) {
-  return isPrimitive(children)
-    ? [createTextVNode(children)]
-    : Array.isArray(children)
-      ? normalizeArrayChildren(children)
-      : undefined
+  // check v-on keyCodes
+  Vue.prototype._k = function checkKeyCodes (
+    eventKeyCode,
+    key,
+    builtInAlias
+  ) {
+    var keyCodes = config.keyCodes[key] || builtInAlias;
+    if (Array.isArray(keyCodes)) {
+      return keyCodes.indexOf(eventKeyCode) === -1
+    } else {
+      return keyCodes !== eventKeyCode
+    }
+  };
 }
 
-function normalizeArrayChildren (children, nestedIndex) {
-  var res = [];
-  var i, c, last;
-  for (i = 0; i < children.length; i++) {
-    c = children[i];
-    if (c == null || typeof c === 'boolean') { continue }
-    last = res[res.length - 1];
-    //  nested
-    if (Array.isArray(c)) {
-      res.push.apply(res, normalizeArrayChildren(c, ((nestedIndex || '') + "_" + i)));
-    } else if (isPrimitive(c)) {
-      if (last && last.text) {
-        last.text += String(c);
-      } else if (c !== '') {
-        // convert primitive to vnode
-        res.push(createTextVNode(c));
-      }
-    } else {
-      if (c.text && last && last.text) {
-        res[res.length - 1] = createTextVNode(last.text + c.text);
+function resolveSlots (
+  children,
+  context
+) {
+  var slots = {};
+  if (!children) {
+    return slots
+  }
+  var defaultSlot = [];
+  var name, child;
+  for (var i = 0, l = children.length; i < l; i++) {
+    child = children[i];
+    // named slots should only be respected if the vnode was rendered in the
+    // same context.
+    if ((child.context === context || child.functionalContext === context) &&
+        child.data && (name = child.data.slot)) {
+      var slot = (slots[name] || (slots[name] = []));
+      if (child.tag === 'template') {
+        slot.push.apply(slot, child.children);
       } else {
-        // default key for nested array children (likely generated by v-for)
-        if (c.tag && c.key == null && nestedIndex != null) {
-          c.key = "__vlist" + nestedIndex + "_" + i + "__";
-        }
-        res.push(c);
+        slot.push(child);
       }
+    } else {
+      defaultSlot.push(child);
     }
   }
-  return res
-}
-
-/*  */
-
-function getFirstComponentChild (children) {
-  return children && children.filter(function (c) { return c && c.componentOptions; })[0]
+  // ignore single whitespace
+  if (defaultSlot.length && !(
+    defaultSlot.length === 1 &&
+    (defaultSlot[0].text === ' ' || defaultSlot[0].isComment)
+  )) {
+    slots.default = defaultSlot;
+  }
+  return slots
 }
 
 /*  */
@@ -5990,9 +6137,8 @@ function lifecycleMixin (Vue) {
     if (vm.$vnode && vm.$parent && vm.$vnode === vm.$parent._vnode) {
       vm.$parent.$el = vm.$el;
     }
-    if (vm._isMounted) {
-      callHook(vm, 'updated');
-    }
+    // updated hook is called by the scheduler to ensure that children are
+    // updated in a parent's updated hook.
   };
 
   Vue.prototype._updateFromParent = function (
@@ -6071,742 +6217,606 @@ function lifecycleMixin (Vue) {
     if (vm._data.__ob__) {
       vm._data.__ob__.vmCount--;
     }
-    // call the last hook...
-    vm._isDestroyed = true;
-    callHook(vm, 'destroyed');
-    // turn off all instance listeners.
-    vm.$off();
-    // remove __vue__ reference
-    if (vm.$el) {
-      vm.$el.__vue__ = null;
-    }
-    // invoke destroy hooks on current rendered tree
-    vm.__patch__(vm._vnode, null);
-  };
-}
-
-function callHook (vm, hook) {
-  var handlers = vm.$options[hook];
-  if (handlers) {
-    for (var i = 0, j = handlers.length; i < j; i++) {
-      handlers[i].call(vm);
-    }
-  }
-  if (vm._hasHookEvent) {
-    vm.$emit('hook:' + hook);
-  }
-}
-
-/*  */
-
-var hooks = { init: init$1, prepatch: prepatch, insert: insert, destroy: destroy$1 };
-var hooksToMerge = Object.keys(hooks);
-
-function createComponent (
-  Ctor,
-  data,
-  context,
-  children,
-  tag
-) {
-  if (!Ctor) {
-    return
-  }
-
-  var baseCtor = context.$options._base;
-  if (isObject(Ctor)) {
-    Ctor = baseCtor.extend(Ctor);
-  }
-
-  if (typeof Ctor !== 'function') {
-    {
-      warn(("Invalid Component definition: " + (String(Ctor))), context);
-    }
-    return
-  }
-
-  // async component
-  if (!Ctor.cid) {
-    if (Ctor.resolved) {
-      Ctor = Ctor.resolved;
-    } else {
-      Ctor = resolveAsyncComponent(Ctor, baseCtor, function () {
-        // it's ok to queue this on every render because
-        // $forceUpdate is buffered by the scheduler.
-        context.$forceUpdate();
-      });
-      if (!Ctor) {
-        // return nothing if this is indeed an async component
-        // wait for the callback to trigger parent update.
-        return
-      }
-    }
-  }
-
-  // resolve constructor options in case global mixins are applied after
-  // component constructor creation
-  resolveConstructorOptions(Ctor);
-
-  data = data || {};
-
-  // extract props
-  var propsData = extractProps(data, Ctor);
-
-  // functional component
-  if (Ctor.options.functional) {
-    return createFunctionalComponent(Ctor, propsData, data, context, children)
-  }
-
-  // extract listeners, since these needs to be treated as
-  // child component listeners instead of DOM listeners
-  var listeners = data.on;
-  // replace with listeners with .native modifier
-  data.on = data.nativeOn;
-
-  if (Ctor.options.abstract) {
-    // abstract components do not keep anything
-    // other than props & listeners
-    data = {};
-  }
-
-  // merge component management hooks onto the placeholder node
-  mergeHooks(data);
-
-  // return a placeholder vnode
-  var name = Ctor.options.name || tag;
-  var vnode = new VNode(
-    ("vue-component-" + (Ctor.cid) + (name ? ("-" + name) : '')),
-    data, undefined, undefined, undefined, context,
-    { Ctor: Ctor, propsData: propsData, listeners: listeners, tag: tag, children: children }
-  );
-  return vnode
-}
-
-function createFunctionalComponent (
-  Ctor,
-  propsData,
-  data,
-  context,
-  children
-) {
-  var props = {};
-  var propOptions = Ctor.options.props;
-  if (propOptions) {
-    for (var key in propOptions) {
-      props[key] = validateProp(key, propOptions, propsData);
-    }
-  }
-  // ensure the createElement function in functional components
-  // gets a unique context - this is necessary for correct named slot check
-  var _context = Object.create(context);
-  var h = function (a, b, c, d) { return createElement(_context, a, b, c, d, true); };
-  var vnode = Ctor.options.render.call(null, h, {
-    props: props,
-    data: data,
-    parent: context,
-    children: children,
-    slots: function () { return resolveSlots(children, context); }
-  });
-  if (vnode instanceof VNode) {
-    vnode.functionalContext = context;
-    if (data.slot) {
-      (vnode.data || (vnode.data = {})).slot = data.slot;
-    }
-  }
-  return vnode
-}
-
-function createComponentInstanceForVnode (
-  vnode, // we know it's MountedComponentVNode but flow doesn't
-  parent, // activeInstance in lifecycle state
-  parentElm,
-  refElm
-) {
-  var vnodeComponentOptions = vnode.componentOptions;
-  var options = {
-    _isComponent: true,
-    parent: parent,
-    propsData: vnodeComponentOptions.propsData,
-    _componentTag: vnodeComponentOptions.tag,
-    _parentVnode: vnode,
-    _parentListeners: vnodeComponentOptions.listeners,
-    _renderChildren: vnodeComponentOptions.children,
-    _parentElm: parentElm || null,
-    _refElm: refElm || null
+    // call the last hook...
+    vm._isDestroyed = true;
+    callHook(vm, 'destroyed');
+    // turn off all instance listeners.
+    vm.$off();
+    // remove __vue__ reference
+    if (vm.$el) {
+      vm.$el.__vue__ = null;
+    }
+    // invoke destroy hooks on current rendered tree
+    vm.__patch__(vm._vnode, null);
   };
-  // check inline-template render functions
-  var inlineTemplate = vnode.data.inlineTemplate;
-  if (inlineTemplate) {
-    options.render = inlineTemplate.render;
-    options.staticRenderFns = inlineTemplate.staticRenderFns;
-  }
-  return new vnodeComponentOptions.Ctor(options)
 }
 
-function init$1 (
-  vnode,
-  hydrating,
-  parentElm,
-  refElm
-) {
-  if (!vnode.child || vnode.child._isDestroyed) {
-    var child = vnode.child = createComponentInstanceForVnode(
-      vnode,
-      activeInstance,
-      parentElm,
-      refElm
-    );
-    child.$mount(hydrating ? vnode.elm : undefined, hydrating);
-  } else if (vnode.data.keepAlive) {
-    // kept-alive components, treat as a patch
-    var mountedNode = vnode; // work around flow
-    prepatch(mountedNode, mountedNode);
+function callHook (vm, hook) {
+  var handlers = vm.$options[hook];
+  if (handlers) {
+    for (var i = 0, j = handlers.length; i < j; i++) {
+      handlers[i].call(vm);
+    }
+  }
+  if (vm._hasHookEvent) {
+    vm.$emit('hook:' + hook);
   }
 }
 
-function prepatch (
-  oldVnode,
-  vnode
-) {
-  var options = vnode.componentOptions;
-  var child = vnode.child = oldVnode.child;
-  child._updateFromParent(
-    options.propsData, // updated props
-    options.listeners, // updated listeners
-    vnode, // new parent vnode
-    options.children // new children
-  );
+/*  */
+
+
+var queue = [];
+var has$1 = {};
+var circular = {};
+var waiting = false;
+var flushing = false;
+var index = 0;
+
+/**
+ * Reset the scheduler's state.
+ */
+function resetSchedulerState () {
+  queue.length = 0;
+  has$1 = {};
+  {
+    circular = {};
+  }
+  waiting = flushing = false;
 }
 
-function insert (vnode) {
-  if (!vnode.child._isMounted) {
-    vnode.child._isMounted = true;
-    callHook(vnode.child, 'mounted');
+/**
+ * Flush both queues and run the watchers.
+ */
+function flushSchedulerQueue () {
+  flushing = true;
+  var watcher, id, vm;
+
+  // Sort queue before flush.
+  // This ensures that:
+  // 1. Components are updated from parent to child. (because parent is always
+  //    created before the child)
+  // 2. A component's user watchers are run before its render watcher (because
+  //    user watchers are created before the render watcher)
+  // 3. If a component is destroyed during a parent component's watcher run,
+  //    its watchers can be skipped.
+  queue.sort(function (a, b) { return a.id - b.id; });
+
+  // do not cache length because more watchers might be pushed
+  // as we run existing watchers
+  for (index = 0; index < queue.length; index++) {
+    watcher = queue[index];
+    id = watcher.id;
+    has$1[id] = null;
+    watcher.run();
+    // in dev build, check and stop circular updates.
+    if ("development" !== 'production' && has$1[id] != null) {
+      circular[id] = (circular[id] || 0) + 1;
+      if (circular[id] > config._maxUpdateCount) {
+        warn(
+          'You may have an infinite update loop ' + (
+            watcher.user
+              ? ("in watcher with expression \"" + (watcher.expression) + "\"")
+              : "in a component render function."
+          ),
+          watcher.vm
+        );
+        break
+      }
+    }
   }
-  if (vnode.data.keepAlive) {
-    vnode.child._inactive = false;
-    callHook(vnode.child, 'activated');
+
+  // call updated hooks
+  index = queue.length;
+  while (index--) {
+    watcher = queue[index];
+    vm = watcher.vm;
+    if (vm._watcher === watcher && vm._isMounted) {
+      callHook(vm, 'updated');
+    }
+  }
+
+  // devtool hook
+  /* istanbul ignore if */
+  if (devtools && config.devtools) {
+    devtools.emit('flush');
   }
+
+  resetSchedulerState();
 }
 
-function destroy$1 (vnode) {
-  if (!vnode.child._isDestroyed) {
-    if (!vnode.data.keepAlive) {
-      vnode.child.$destroy();
+/**
+ * Push a watcher into the watcher queue.
+ * Jobs with duplicate IDs will be skipped unless it's
+ * pushed when the queue is being flushed.
+ */
+function queueWatcher (watcher) {
+  var id = watcher.id;
+  if (has$1[id] == null) {
+    has$1[id] = true;
+    if (!flushing) {
+      queue.push(watcher);
     } else {
-      vnode.child._inactive = true;
-      callHook(vnode.child, 'deactivated');
+      // if already flushing, splice the watcher based on its id
+      // if already past its id, it will be run next immediately.
+      var i = queue.length - 1;
+      while (i >= 0 && queue[i].id > watcher.id) {
+        i--;
+      }
+      queue.splice(Math.max(i, index) + 1, 0, watcher);
+    }
+    // queue the flush
+    if (!waiting) {
+      waiting = true;
+      nextTick(flushSchedulerQueue);
     }
   }
 }
 
-function resolveAsyncComponent (
-  factory,
-  baseCtor,
-  cb
-) {
-  if (factory.requested) {
-    // pool callbacks
-    factory.pendingCallbacks.push(cb);
-  } else {
-    factory.requested = true;
-    var cbs = factory.pendingCallbacks = [cb];
-    var sync = true;
+/*  */
 
-    var resolve = function (res) {
-      if (isObject(res)) {
-        res = baseCtor.extend(res);
-      }
-      // cache resolved
-      factory.resolved = res;
-      // invoke callbacks only if this is not a synchronous resolve
-      // (async resolves are shimmed as synchronous during SSR)
-      if (!sync) {
-        for (var i = 0, l = cbs.length; i < l; i++) {
-          cbs[i](res);
-        }
-      }
-    };
+var uid$2 = 0;
 
-    var reject = function (reason) {
+/**
+ * A watcher parses an expression, collects dependencies,
+ * and fires callback when the expression value changes.
+ * This is used for both the $watch() api and directives.
+ */
+var Watcher = function Watcher (
+  vm,
+  expOrFn,
+  cb,
+  options
+) {
+  this.vm = vm;
+  vm._watchers.push(this);
+  // options
+  if (options) {
+    this.deep = !!options.deep;
+    this.user = !!options.user;
+    this.lazy = !!options.lazy;
+    this.sync = !!options.sync;
+  } else {
+    this.deep = this.user = this.lazy = this.sync = false;
+  }
+  this.cb = cb;
+  this.id = ++uid$2; // uid for batching
+  this.active = true;
+  this.dirty = this.lazy; // for lazy watchers
+  this.deps = [];
+  this.newDeps = [];
+  this.depIds = new _Set();
+  this.newDepIds = new _Set();
+  this.expression = expOrFn.toString();
+  // parse expression for getter
+  if (typeof expOrFn === 'function') {
+    this.getter = expOrFn;
+  } else {
+    this.getter = parsePath(expOrFn);
+    if (!this.getter) {
+      this.getter = function () {};
       "development" !== 'production' && warn(
-        "Failed to resolve async component: " + (String(factory)) +
-        (reason ? ("\nReason: " + reason) : '')
+        "Failed watching path: \"" + expOrFn + "\" " +
+        'Watcher only accepts simple dot-delimited paths. ' +
+        'For full control, use a function instead.',
+        vm
       );
-    };
-
-    var res = factory(resolve, reject);
-
-    // handle promise
-    if (res && typeof res.then === 'function' && !factory.resolved) {
-      res.then(resolve, reject);
     }
+  }
+  this.value = this.lazy
+    ? undefined
+    : this.get();
+};
 
-    sync = false;
-    // return in case resolved synchronously
-    return factory.resolved
+/**
+ * Evaluate the getter, and re-collect dependencies.
+ */
+Watcher.prototype.get = function get () {
+  pushTarget(this);
+  var value = this.getter.call(this.vm, this.vm);
+  // "touch" every property so they are all tracked as
+  // dependencies for deep watching
+  if (this.deep) {
+    traverse(value);
   }
-}
+  popTarget();
+  this.cleanupDeps();
+  return value
+};
 
-function extractProps (data, Ctor) {
-  // we are only extracting raw values here.
-  // validation and default values are handled in the child
-  // component itself.
-  var propOptions = Ctor.options.props;
-  if (!propOptions) {
-    return
-  }
-  var res = {};
-  var attrs = data.attrs;
-  var props = data.props;
-  var domProps = data.domProps;
-  if (attrs || props || domProps) {
-    for (var key in propOptions) {
-      var altKey = hyphenate(key);
-      checkProp(res, props, key, altKey, true) ||
-      checkProp(res, attrs, key, altKey) ||
-      checkProp(res, domProps, key, altKey);
+/**
+ * Add a dependency to this directive.
+ */
+Watcher.prototype.addDep = function addDep (dep) {
+  var id = dep.id;
+  if (!this.newDepIds.has(id)) {
+    this.newDepIds.add(id);
+    this.newDeps.push(dep);
+    if (!this.depIds.has(id)) {
+      dep.addSub(this);
     }
   }
-  return res
-}
+};
 
-function checkProp (
-  res,
-  hash,
-  key,
-  altKey,
-  preserve
-) {
-  if (hash) {
-    if (hasOwn(hash, key)) {
-      res[key] = hash[key];
-      if (!preserve) {
-        delete hash[key];
-      }
-      return true
-    } else if (hasOwn(hash, altKey)) {
-      res[key] = hash[altKey];
-      if (!preserve) {
-        delete hash[altKey];
-      }
-      return true
+/**
+ * Clean up for dependency collection.
+ */
+Watcher.prototype.cleanupDeps = function cleanupDeps () {
+    var this$1 = this;
+
+  var i = this.deps.length;
+  while (i--) {
+    var dep = this$1.deps[i];
+    if (!this$1.newDepIds.has(dep.id)) {
+      dep.removeSub(this$1);
     }
   }
-  return false
-}
+  var tmp = this.depIds;
+  this.depIds = this.newDepIds;
+  this.newDepIds = tmp;
+  this.newDepIds.clear();
+  tmp = this.deps;
+  this.deps = this.newDeps;
+  this.newDeps = tmp;
+  this.newDeps.length = 0;
+};
 
-function mergeHooks (data) {
-  if (!data.hook) {
-    data.hook = {};
-  }
-  for (var i = 0; i < hooksToMerge.length; i++) {
-    var key = hooksToMerge[i];
-    var fromParent = data.hook[key];
-    var ours = hooks[key];
-    data.hook[key] = fromParent ? mergeHook$1(ours, fromParent) : ours;
+/**
+ * Subscriber interface.
+ * Will be called when a dependency changes.
+ */
+Watcher.prototype.update = function update () {
+  /* istanbul ignore else */
+  if (this.lazy) {
+    this.dirty = true;
+  } else if (this.sync) {
+    this.run();
+  } else {
+    queueWatcher(this);
   }
-}
+};
 
-function mergeHook$1 (one, two) {
-  return function (a, b, c, d) {
-    one(a, b, c, d);
-    two(a, b, c, d);
+/**
+ * Scheduler job interface.
+ * Will be called by the scheduler.
+ */
+Watcher.prototype.run = function run () {
+  if (this.active) {
+    var value = this.get();
+    if (
+      value !== this.value ||
+      // Deep watchers and watchers on Object/Arrays should fire even
+      // when the value is the same, because the value may
+      // have mutated.
+      isObject(value) ||
+      this.deep
+    ) {
+      // set new value
+      var oldValue = this.value;
+      this.value = value;
+      if (this.user) {
+        try {
+          this.cb.call(this.vm, value, oldValue);
+        } catch (e) {
+          /* istanbul ignore else */
+          if (config.errorHandler) {
+            config.errorHandler.call(null, e, this.vm);
+          } else {
+            "development" !== 'production' && warn(
+              ("Error in watcher \"" + (this.expression) + "\""),
+              this.vm
+            );
+            throw e
+          }
+        }
+      } else {
+        this.cb.call(this.vm, value, oldValue);
+      }
+    }
   }
-}
+};
 
-/*  */
+/**
+ * Evaluate the value of the watcher.
+ * This only gets called for lazy watchers.
+ */
+Watcher.prototype.evaluate = function evaluate () {
+  this.value = this.get();
+  this.dirty = false;
+};
 
-var SIMPLE_NORMALIZE = 1;
-var ALWAYS_NORMALIZE = 2;
+/**
+ * Depend on all deps collected by this watcher.
+ */
+Watcher.prototype.depend = function depend () {
+    var this$1 = this;
 
-// wrapper function for providing a more flexible interface
-// without getting yelled at by flow
-function createElement (
-  context,
-  tag,
-  data,
-  children,
-  normalizationType,
-  alwaysNormalize
-) {
-  if (Array.isArray(data) || isPrimitive(data)) {
-    normalizationType = children;
-    children = data;
-    data = undefined;
+  var i = this.deps.length;
+  while (i--) {
+    this$1.deps[i].depend();
   }
-  if (alwaysNormalize) { normalizationType = ALWAYS_NORMALIZE; }
-  return _createElement(context, tag, data, children, normalizationType)
-}
+};
 
-function _createElement (
-  context,
-  tag,
-  data,
-  children,
-  normalizationType
-) {
-  if (data && data.__ob__) {
-    "development" !== 'production' && warn(
-      "Avoid using observed data object as vnode data: " + (JSON.stringify(data)) + "\n" +
-      'Always create fresh vnode data objects in each render!',
-      context
-    );
-    return createEmptyVNode()
-  }
-  if (!tag) {
-    // in case of component :is set to falsy value
-    return createEmptyVNode()
-  }
-  // support single function children as default scoped slot
-  if (Array.isArray(children) &&
-      typeof children[0] === 'function') {
-    data = data || {};
-    data.scopedSlots = { default: children[0] };
-    children.length = 0;
-  }
-  if (normalizationType === ALWAYS_NORMALIZE) {
-    children = normalizeChildren(children);
-  } else if (normalizationType === SIMPLE_NORMALIZE) {
-    children = simpleNormalizeChildren(children);
-  }
-  var vnode, ns;
-  if (typeof tag === 'string') {
-    var Ctor;
-    ns = config.getTagNamespace(tag);
-    if (config.isReservedTag(tag)) {
-      // platform built-in elements
-      vnode = new VNode(
-        config.parsePlatformTagName(tag), data, children,
-        undefined, undefined, context
-      );
-    } else if ((Ctor = resolveAsset(context.$options, 'components', tag))) {
-      // component
-      vnode = createComponent(Ctor, data, context, children, tag);
-    } else {
-      // unknown or unlisted namespaced elements
-      // check at runtime because it may get assigned a namespace when its
-      // parent normalizes children
-      vnode = new VNode(
-        tag, data, children,
-        undefined, undefined, context
-      );
+/**
+ * Remove self from all dependencies' subscriber list.
+ */
+Watcher.prototype.teardown = function teardown () {
+    var this$1 = this;
+
+  if (this.active) {
+    // remove self from vm's watcher list
+    // this is a somewhat expensive operation so we skip it
+    // if the vm is being destroyed.
+    if (!this.vm._isBeingDestroyed) {
+      remove(this.vm._watchers, this);
     }
-  } else {
-    // direct component options / constructor
-    vnode = createComponent(tag, data, context, children);
-  }
-  if (vnode) {
-    if (ns) { applyNS(vnode, ns); }
-    return vnode
-  } else {
-    return createEmptyVNode()
+    var i = this.deps.length;
+    while (i--) {
+      this$1.deps[i].removeSub(this$1);
+    }
+    this.active = false;
   }
+};
+
+/**
+ * Recursively traverse an object to evoke all converted
+ * getters, so that every nested property inside the object
+ * is collected as a "deep" dependency.
+ */
+var seenObjects = new _Set();
+function traverse (val) {
+  seenObjects.clear();
+  _traverse(val, seenObjects);
 }
 
-function applyNS (vnode, ns) {
-  vnode.ns = ns;
-  if (vnode.tag === 'foreignObject') {
-    // use default namespace inside foreignObject
+function _traverse (val, seen) {
+  var i, keys;
+  var isA = Array.isArray(val);
+  if ((!isA && !isObject(val)) || !Object.isExtensible(val)) {
     return
   }
-  if (vnode.children) {
-    for (var i = 0, l = vnode.children.length; i < l; i++) {
-      var child = vnode.children[i];
-      if (child.tag && !child.ns) {
-        applyNS(child, ns);
-      }
+  if (val.__ob__) {
+    var depId = val.__ob__.dep.id;
+    if (seen.has(depId)) {
+      return
     }
+    seen.add(depId);
+  }
+  if (isA) {
+    i = val.length;
+    while (i--) { _traverse(val[i], seen); }
+  } else {
+    keys = Object.keys(val);
+    i = keys.length;
+    while (i--) { _traverse(val[keys[i]], seen); }
   }
 }
 
 /*  */
 
-function initRender (vm) {
-  vm.$vnode = null; // the placeholder node in parent tree
-  vm._vnode = null; // the root of the child tree
-  vm._staticTrees = null;
-  var parentVnode = vm.$options._parentVnode;
-  var renderContext = parentVnode && parentVnode.context;
-  vm.$slots = resolveSlots(vm.$options._renderChildren, renderContext);
-  vm.$scopedSlots = {};
-  // bind the createElement fn to this instance
-  // so that we get proper render context inside it.
-  // args order: tag, data, children, normalizationType, alwaysNormalize
-  // internal version is used by render functions compiled from templates
-  vm._c = function (a, b, c, d) { return createElement(vm, a, b, c, d, false); };
-  // normalization is always applied for the public version, used in
-  // user-written render functions.
-  vm.$createElement = function (a, b, c, d) { return createElement(vm, a, b, c, d, true); };
-  if (vm.$options.el) {
-    vm.$mount(vm.$options.el);
+function initState (vm) {
+  vm._watchers = [];
+  var opts = vm.$options;
+  if (opts.props) { initProps(vm, opts.props); }
+  if (opts.methods) { initMethods(vm, opts.methods); }
+  if (opts.data) {
+    initData(vm);
+  } else {
+    observe(vm._data = {}, true /* asRootData */);
   }
+  if (opts.computed) { initComputed(vm, opts.computed); }
+  if (opts.watch) { initWatch(vm, opts.watch); }
 }
 
-function renderMixin (Vue) {
-  Vue.prototype.$nextTick = function (fn) {
-    return nextTick(fn, this)
-  };
-
-  Vue.prototype._render = function () {
-    var vm = this;
-    var ref = vm.$options;
-    var render = ref.render;
-    var staticRenderFns = ref.staticRenderFns;
-    var _parentVnode = ref._parentVnode;
-
-    if (vm._isMounted) {
-      // clone slot nodes on re-renders
-      for (var key in vm.$slots) {
-        vm.$slots[key] = cloneVNodes(vm.$slots[key]);
-      }
-    }
-
-    if (_parentVnode && _parentVnode.data.scopedSlots) {
-      vm.$scopedSlots = _parentVnode.data.scopedSlots;
-    }
+var isReservedProp = { key: 1, ref: 1, slot: 1 };
 
-    if (staticRenderFns && !vm._staticTrees) {
-      vm._staticTrees = [];
-    }
-    // set parent vnode. this allows render functions to have access
-    // to the data on the placeholder node.
-    vm.$vnode = _parentVnode;
-    // render self
-    var vnode;
-    try {
-      vnode = render.call(vm._renderProxy, vm.$createElement);
-    } catch (e) {
-      /* istanbul ignore else */
-      if (config.errorHandler) {
-        config.errorHandler.call(null, e, vm);
-      } else {
-        {
-          warn(("Error when rendering " + (formatComponentName(vm)) + ":"));
-        }
-        throw e
-      }
-      // return previous vnode to prevent render error causing blank component
-      vnode = vm._vnode;
-    }
-    // return empty vnode in case the render function errored out
-    if (!(vnode instanceof VNode)) {
-      if ("development" !== 'production' && Array.isArray(vnode)) {
+function initProps (vm, props) {
+  var propsData = vm.$options.propsData || {};
+  var keys = vm.$options._propKeys = Object.keys(props);
+  var isRoot = !vm.$parent;
+  // root instance props should be converted
+  observerState.shouldConvert = isRoot;
+  var loop = function ( i ) {
+    var key = keys[i];
+    /* istanbul ignore else */
+    {
+      if (isReservedProp[key]) {
         warn(
-          'Multiple root nodes returned from render function. Render function ' +
-          'should return a single root node.',
+          ("\"" + key + "\" is a reserved attribute and cannot be used as component prop."),
           vm
         );
       }
-      vnode = createEmptyVNode();
+      defineReactive$$1(vm, key, validateProp(key, props, propsData, vm), function () {
+        if (vm.$parent && !observerState.isSettingProps) {
+          warn(
+            "Avoid mutating a prop directly since the value will be " +
+            "overwritten whenever the parent component re-renders. " +
+            "Instead, use a data or computed property based on the prop's " +
+            "value. Prop being mutated: \"" + key + "\"",
+            vm
+          );
+        }
+      });
     }
-    // set parent
-    vnode.parent = _parentVnode;
-    return vnode
   };
 
-  // toString for mustaches
-  Vue.prototype._s = _toString;
-  // convert text to vnode
-  Vue.prototype._v = createTextVNode;
-  // number conversion
-  Vue.prototype._n = toNumber;
-  // empty vnode
-  Vue.prototype._e = createEmptyVNode;
-  // loose equal
-  Vue.prototype._q = looseEqual;
-  // loose indexOf
-  Vue.prototype._i = looseIndexOf;
+  for (var i = 0; i < keys.length; i++) { loop( i ); }
+  observerState.shouldConvert = true;
+}
 
-  // render static tree by index
-  Vue.prototype._m = function renderStatic (
-    index,
-    isInFor
-  ) {
-    var tree = this._staticTrees[index];
-    // if has already-rendered static tree and not inside v-for,
-    // we can reuse the same tree by doing a shallow clone.
-    if (tree && !isInFor) {
-      return Array.isArray(tree)
-        ? cloneVNodes(tree)
-        : cloneVNode(tree)
+function initData (vm) {
+  var data = vm.$options.data;
+  data = vm._data = typeof data === 'function'
+    ? data.call(vm)
+    : data || {};
+  if (!isPlainObject(data)) {
+    data = {};
+    "development" !== 'production' && warn(
+      'data functions should return an object:\n' +
+      'https://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function',
+      vm
+    );
+  }
+  // proxy data on instance
+  var keys = Object.keys(data);
+  var props = vm.$options.props;
+  var i = keys.length;
+  while (i--) {
+    if (props && hasOwn(props, keys[i])) {
+      "development" !== 'production' && warn(
+        "The data property \"" + (keys[i]) + "\" is already declared as a prop. " +
+        "Use prop default value instead.",
+        vm
+      );
+    } else {
+      proxy(vm, keys[i]);
     }
-    // otherwise, render a fresh tree.
-    tree = this._staticTrees[index] = this.$options.staticRenderFns[index].call(this._renderProxy);
-    markStatic(tree, ("__static__" + index), false);
-    return tree
-  };
+  }
+  // observe data
+  observe(data, true /* asRootData */);
+}
 
-  // mark node as static (v-once)
-  Vue.prototype._o = function markOnce (
-    tree,
-    index,
-    key
-  ) {
-    markStatic(tree, ("__once__" + index + (key ? ("_" + key) : "")), true);
-    return tree
-  };
+var computedSharedDefinition = {
+  enumerable: true,
+  configurable: true,
+  get: noop,
+  set: noop
+};
 
-  function markStatic (tree, key, isOnce) {
-    if (Array.isArray(tree)) {
-      for (var i = 0; i < tree.length; i++) {
-        if (tree[i] && typeof tree[i] !== 'string') {
-          markStaticNode(tree[i], (key + "_" + i), isOnce);
-        }
-      }
+function initComputed (vm, computed) {
+  for (var key in computed) {
+    /* istanbul ignore if */
+    if ("development" !== 'production' && key in vm) {
+      warn(
+        "existing instance property \"" + key + "\" will be " +
+        "overwritten by a computed property with the same name.",
+        vm
+      );
+    }
+    var userDef = computed[key];
+    if (typeof userDef === 'function') {
+      computedSharedDefinition.get = makeComputedGetter(userDef, vm);
+      computedSharedDefinition.set = noop;
     } else {
-      markStaticNode(tree, key, isOnce);
+      computedSharedDefinition.get = userDef.get
+        ? userDef.cache !== false
+          ? makeComputedGetter(userDef.get, vm)
+          : bind(userDef.get, vm)
+        : noop;
+      computedSharedDefinition.set = userDef.set
+        ? bind(userDef.set, vm)
+        : noop;
     }
+    Object.defineProperty(vm, key, computedSharedDefinition);
   }
+}
 
-  function markStaticNode (node, key, isOnce) {
-    node.isStatic = true;
-    node.key = key;
-    node.isOnce = isOnce;
+function makeComputedGetter (getter, owner) {
+  var watcher = new Watcher(owner, getter, noop, {
+    lazy: true
+  });
+  return function computedGetter () {
+    if (watcher.dirty) {
+      watcher.evaluate();
+    }
+    if (Dep.target) {
+      watcher.depend();
+    }
+    return watcher.value
   }
+}
 
-  // filter resolution helper
-  Vue.prototype._f = function resolveFilter (id) {
-    return resolveAsset(this.$options, 'filters', id, true) || identity
-  };
-
-  // render v-for
-  Vue.prototype._l = function renderList (
-    val,
-    render
-  ) {
-    var ret, i, l, keys, key;
-    if (Array.isArray(val) || typeof val === 'string') {
-      ret = new Array(val.length);
-      for (i = 0, l = val.length; i < l; i++) {
-        ret[i] = render(val[i], i);
-      }
-    } else if (typeof val === 'number') {
-      ret = new Array(val);
-      for (i = 0; i < val; i++) {
-        ret[i] = render(i + 1, i);
-      }
-    } else if (isObject(val)) {
-      keys = Object.keys(val);
-      ret = new Array(keys.length);
-      for (i = 0, l = keys.length; i < l; i++) {
-        key = keys[i];
-        ret[i] = render(val[key], key, i);
-      }
+function initMethods (vm, methods) {
+  for (var key in methods) {
+    vm[key] = methods[key] == null ? noop : bind(methods[key], vm);
+    if ("development" !== 'production' && methods[key] == null) {
+      warn(
+        "method \"" + key + "\" has an undefined value in the component definition. " +
+        "Did you reference the function correctly?",
+        vm
+      );
     }
-    return ret
-  };
+  }
+}
 
-  // renderSlot
-  Vue.prototype._t = function (
-    name,
-    fallback,
-    props,
-    bindObject
-  ) {
-    var scopedSlotFn = this.$scopedSlots[name];
-    if (scopedSlotFn) { // scoped slot
-      props = props || {};
-      if (bindObject) {
-        extend(props, bindObject);
+function initWatch (vm, watch) {
+  for (var key in watch) {
+    var handler = watch[key];
+    if (Array.isArray(handler)) {
+      for (var i = 0; i < handler.length; i++) {
+        createWatcher(vm, key, handler[i]);
       }
-      return scopedSlotFn(props) || fallback
     } else {
-      var slotNodes = this.$slots[name];
-      // warn duplicate slot usage
-      if (slotNodes && "development" !== 'production') {
-        slotNodes._rendered && warn(
-          "Duplicate presence of slot \"" + name + "\" found in the same render tree " +
-          "- this will likely cause render errors.",
-          this
-        );
-        slotNodes._rendered = true;
-      }
-      return slotNodes || fallback
+      createWatcher(vm, key, handler);
     }
-  };
+  }
+}
 
-  // apply v-bind object
-  Vue.prototype._b = function bindProps (
-    data,
-    tag,
-    value,
-    asProp
-  ) {
-    if (value) {
-      if (!isObject(value)) {
-        "development" !== 'production' && warn(
-          'v-bind without argument expects an Object or Array value',
-          this
-        );
-      } else {
-        if (Array.isArray(value)) {
-          value = toObject(value);
-        }
-        for (var key in value) {
-          if (key === 'class' || key === 'style') {
-            data[key] = value[key];
-          } else {
-            var hash = asProp || config.mustUseProp(tag, key)
-              ? data.domProps || (data.domProps = {})
-              : data.attrs || (data.attrs = {});
-            hash[key] = value[key];
-          }
-        }
-      }
-    }
-    return data
+function createWatcher (vm, key, handler) {
+  var options;
+  if (isPlainObject(handler)) {
+    options = handler;
+    handler = handler.handler;
+  }
+  if (typeof handler === 'string') {
+    handler = vm[handler];
+  }
+  vm.$watch(key, handler, options);
+}
+
+function stateMixin (Vue) {
+  // flow somehow has problems with directly declared definition object
+  // when using Object.defineProperty, so we have to procedurally build up
+  // the object here.
+  var dataDef = {};
+  dataDef.get = function () {
+    return this._data
   };
+  {
+    dataDef.set = function (newData) {
+      warn(
+        'Avoid replacing instance root $data. ' +
+        'Use nested data properties instead.',
+        this
+      );
+    };
+  }
+  Object.defineProperty(Vue.prototype, '$data', dataDef);
 
-  // check v-on keyCodes
-  Vue.prototype._k = function checkKeyCodes (
-    eventKeyCode,
-    key,
-    builtInAlias
+  Vue.prototype.$set = set$1;
+  Vue.prototype.$delete = del;
+
+  Vue.prototype.$watch = function (
+    expOrFn,
+    cb,
+    options
   ) {
-    var keyCodes = config.keyCodes[key] || builtInAlias;
-    if (Array.isArray(keyCodes)) {
-      return keyCodes.indexOf(eventKeyCode) === -1
-    } else {
-      return keyCodes !== eventKeyCode
+    var vm = this;
+    options = options || {};
+    options.user = true;
+    var watcher = new Watcher(vm, expOrFn, cb, options);
+    if (options.immediate) {
+      cb.call(vm, watcher.value);
+    }
+    return function unwatchFn () {
+      watcher.teardown();
     }
   };
 }
 
-function resolveSlots (
-  children,
-  context
-) {
-  var slots = {};
-  if (!children) {
-    return slots
-  }
-  var defaultSlot = [];
-  var name, child;
-  for (var i = 0, l = children.length; i < l; i++) {
-    child = children[i];
-    // named slots should only be respected if the vnode was rendered in the
-    // same context.
-    if ((child.context === context || child.functionalContext === context) &&
-        child.data && (name = child.data.slot)) {
-      var slot = (slots[name] || (slots[name] = []));
-      if (child.tag === 'template') {
-        slot.push.apply(slot, child.children);
-      } else {
-        slot.push(child);
+function proxy (vm, key) {
+  if (!isReserved(key)) {
+    Object.defineProperty(vm, key, {
+      configurable: true,
+      enumerable: true,
+      get: function proxyGetter () {
+        return vm._data[key]
+      },
+      set: function proxySetter (val) {
+        vm._data[key] = val;
       }
-    } else {
-      defaultSlot.push(child);
-    }
-  }
-  // ignore single whitespace
-  if (defaultSlot.length && !(
-    defaultSlot.length === 1 &&
-    (defaultSlot[0].text === ' ' || defaultSlot[0].isComment)
-  )) {
-    slots.default = defaultSlot;
+    });
   }
-  return slots
 }
 
 /*  */
@@ -7191,6 +7201,10 @@ function insertBefore (node, target, before) {
 }
 
 function removeChild (node, child) {
+  if (child.nodeType === 3) {
+    node.setAttr('value', '');
+    return
+  }
   node.removeChild(child);
 }
 
@@ -8355,7 +8369,7 @@ function createInstance (
   var weexInstanceVar = {
     config: config,
     document: document,
-    require: moduleGetter
+    requireModule: moduleGetter
   };
   Object.freeze(weexInstanceVar);
 
@@ -13423,8 +13437,8 @@ function init$5 (app, code, data, services) {
     config: app.options,
     define: bundleDefine,
     bootstrap: bundleBootstrap,
-    require: bundleDocument,
-    document: bundleRequireModule,
+    requireModule: bundleRequireModule,
+    document: bundleDocument,
     Vm: bundleVm
   };
 
@@ -13443,7 +13457,7 @@ function init$5 (app, code, data, services) {
     functionBody = code.toString();
   }
   // wrap IFFE and use strict mode
-  functionBody = "(function(global){\n\n\"use strict\";\n\n " + functionBody + " \n\n})(Object.create(this))";
+  functionBody = "(function(global){\n\n " + functionBody + " \n\n})(Object.create(this))";
 
   // run code and get result
   var WXEnvironment = global.WXEnvironment;
@@ -13485,6 +13499,7 @@ function init$5 (app, code, data, services) {
   var globalObjects = Object.assign({
     define: bundleDefine,
     require: bundleRequire,
+    document: bundleDocument,
     bootstrap: bundleBootstrap,
     register: bundleRegister,
     render: bundleRender,
@@ -13939,16 +13954,20 @@ module.exports = /******/ (function(modules) { // webpackBootstrap
   \**************************************************/
 /***/ function(module, exports, __webpack_require__) {
 
-	'use strict';
-
+	"use strict";
+	
 	Object.defineProperty(exports, "__esModule", {
 	  value: true
 	});
-
+	
 	var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) { break; } } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) { _i["return"](); } } finally { if (_d) { throw _e; } } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
-
+	
+	var _extends = Object.assign || function (target) {
+	var arguments$1 = arguments;
+ for (var i = 1; i < arguments.length; i++) { var source = arguments$1[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+	
 	var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
-
+	
 	exports.getInstance = getInstance;
 	exports.init = init;
 	exports.registerComponents = registerComponents;
@@ -13959,28 +13978,33 @@ module.exports = /******/ (function(modules) { // webpackBootstrap
 	exports.destroyInstance = destroyInstance;
 	exports.getRoot = getRoot;
 	exports.receiveTasks = receiveTasks;
-
+	
 	var _builtin = __webpack_require__(/*! ./builtin */ 1);
-
+	
 	var _emitter = __webpack_require__(/*! ./emitter */ 3);
-
+	
 	var _emitter2 = _interopRequireDefault(_emitter);
-
+	
 	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-	function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
-
+	
 	var NativeComponents = {};
 	var NativeModules = {};
-
+	
 	var Document = void 0;
 	var Element = void 0;
 	var Comment = void 0;
 	var Listener = void 0;
+	var TaskCenter = void 0;
+	var CallbackManager = void 0;
 	var sendTasks = void 0;
-
+	
+	var MODULE_NAME_PREFIX = '@weex-module/';
+	var MODAL_MODULE = MODULE_NAME_PREFIX + 'modal';
+	var DOM_MODULE = MODULE_NAME_PREFIX + 'dom';
+	var NAVIGATOR_MODULE = MODULE_NAME_PREFIX + 'navigator';
+	// Instance hub
 	var instances = {};
-
+	
 	function dispatchEventToInstance(event, targetOrigin) {
 	  var instance;
 	  for (var i in instances) {
@@ -13994,7 +14018,7 @@ module.exports = /******/ (function(modules) { // webpackBootstrap
 	    }
 	  }
 	}
-
+	
 	function getInstance(instanceId) {
 	  var instance = instances[instanceId];
 	  if (!instance) {
@@ -14002,15 +14026,17 @@ module.exports = /******/ (function(modules) { // webpackBootstrap
 	  }
 	  return instance;
 	}
-
-	function init(cfg) {
-	  Document = cfg.Document;
-	  Element = cfg.Element;
-	  Comment = cfg.Comment;
-	  Listener = cfg.Listener;
-	  sendTasks = cfg.sendTasks;
+	
+	function init(config) {
+	  Document = config.Document;
+	  Element = config.Element;
+	  Comment = config.Comment;
+	  Listener = config.Listener;
+	  TaskCenter = config.TaskCenter;
+	  CallbackManager = config.CallbackManager;
+	  sendTasks = config.sendTasks;
 	}
-
+	
 	/**
 	 * register the name of each native component
 	 * @param  {array} components array of name
@@ -14030,17 +14056,15 @@ module.exports = /******/ (function(modules) { // webpackBootstrap
 	    });
 	  }
 	}
-
+	
 	/**
 	 * register the name and methods of each api
 	 * @param  {object} apis a object of apis
 	 */
-	function registerMethods(apis) {
-	  if ((typeof apis === 'undefined' ? 'undefined' : _typeof(apis)) === 'object') {
-	    // Noop
-	  }
-	}
-
+	function registerMethods(apis) {}
+	// Noop
+	
+	
 	/**
 	 * register the name and methods of each module
 	 * @param  {object} modules a object of modules
@@ -14054,63 +14078,49 @@ module.exports = /******/ (function(modules) { // webpackBootstrap
 	    }
 	  }
 	}
-
-	function genBuiltinModules(modules,
-	// ES
-	Promise,
-	// W3C
-	window, screen, document, navigator, location, fetch, Headers, Response, Request, URL, URLSearchParams, setTimeout, clearTimeout, setInterval, clearInterval, requestAnimationFrame, cancelAnimationFrame, alert,
-	// Weex
-	__weex_define__, __weex_require__, __weex_options__, __weex_data__, __weex_downgrade__, __weex_document__) {
-	  for (var moduleName in _builtin.BuiltinModulesFactory) {
+	
+	function genBuiltinModules(modules, moduleFactories,

<TRUNCATED>


[49/50] [abbrv] incubator-weex git commit: * [android] modify android inspector version

Posted by ji...@apache.org.
* [android] modify android inspector version


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/5104026a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/5104026a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/5104026a

Branch: refs/heads/master
Commit: 5104026a89f836daee6779c6c6422d917e2e0031
Parents: 7b8cc46
Author: sospartan <so...@gmail.com>
Authored: Wed Jan 11 17:48:20 2017 +0800
Committer: sospartan <so...@gmail.com>
Committed: Wed Jan 11 17:48:20 2017 +0800

----------------------------------------------------------------------
 android/playground/app/build.gradle | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/5104026a/android/playground/app/build.gradle
----------------------------------------------------------------------
diff --git a/android/playground/app/build.gradle b/android/playground/app/build.gradle
index 535f7a9..54aa9b5 100755
--- a/android/playground/app/build.gradle
+++ b/android/playground/app/build.gradle
@@ -79,7 +79,6 @@ dependencies {
     androidTestCompile 'com.squareup.picasso:picasso:2.5.2'
     androidTestCompile 'org.hamcrest:hamcrest-library:1.3'
     androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
-    //compile 'com.taobao.android:weex_sdk:0.4.+'
     /*source dependency*/
     compile project(':weex_sdk')
     debugCompile project(':weex_debug')
@@ -106,7 +105,6 @@ dependencies {
     compile 'com.android.support:support-annotations:23.2.1'
     compile 'com.jakewharton.scalpel:scalpel:1.1.2'
     compile 'com.taobao.android.weex_inspection:urlconnection_interceptor:1.0.0'
-    //compile 'com.google.android.gms:play-services-appindexing:8.1.0'
     compile 'com.android.support.test.espresso:espresso-idling-resource:2.2.2'
-    //compile 'com.taobao.android:weex_inspector:0.8.0.0@aar'
+    compile 'com.taobao.android:weex_inspector:0.10.0.3@aar'
 }


[44/50] [abbrv] incubator-weex git commit: Merge branch 'ios-feature-20170118' into dev-release095

Posted by ji...@apache.org.
Merge branch 'ios-feature-20170118' into dev-release095


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/1e837f38
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/1e837f38
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/1e837f38

Branch: refs/heads/master
Commit: 1e837f38a967798a2f3f6d948b2eb727470be5c9
Parents: 4d9dcc1 50641f1
Author: sospartan <so...@gmail.com>
Authored: Wed Jan 11 17:01:16 2017 +0800
Committer: sospartan <so...@gmail.com>
Committed: Wed Jan 11 17:01:16 2017 +0800

----------------------------------------------------------------------
 examples/component/slider-neighbor/index.we     |  74 ++++
 .../slider-neighbor/silder-neighbor.we          |  75 ----
 examples/index.we                               |   2 +
 examples/module/websocket-demo.we               | 112 +++++
 .../WeexDemo.xcodeproj/project.pbxproj          |  73 ++--
 .../contents.xcworkspacedata                    |   7 +
 .../xcshareddata/xcschemes/WeexDemo.xcscheme    |   2 +-
 ios/playground/WeexDemo/AppDelegate.m           |   4 +-
 ios/playground/WeexDemo/Scanner/WXScannerVC.m   |   2 +-
 ios/playground/WeexDemo/WXDemoViewController.m  |   6 +
 ios/playground/WeexDemo/WXSyncTestModule.h      |  14 +
 ios/playground/WeexDemo/WXSyncTestModule.m      |  38 ++
 ios/sdk/WeexSDK.podspec                         |  12 +-
 ios/sdk/WeexSDK.xcodeproj/project.pbxproj       | 192 +++++++--
 ios/sdk/WeexSDK/Resources/main.js               |  14 +-
 ios/sdk/WeexSDK/Sources/Bridge/JSValue+Weex.h   |  15 +
 ios/sdk/WeexSDK/Sources/Bridge/JSValue+Weex.m   |  90 ++++
 .../WeexSDK/Sources/Bridge/WXBridgeContext.h    |  11 +-
 .../WeexSDK/Sources/Bridge/WXBridgeContext.m    | 127 ++++--
 ios/sdk/WeexSDK/Sources/Bridge/WXCallJSMethod.h |  20 +
 ios/sdk/WeexSDK/Sources/Bridge/WXCallJSMethod.m |  35 ++
 .../WeexSDK/Sources/Bridge/WXComponentMethod.h  |  21 +
 .../WeexSDK/Sources/Bridge/WXComponentMethod.m  |  51 +++
 .../Sources/Bridge/WXDebugLoggerBridge.m        |   5 +
 ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.m |  40 +-
 ios/sdk/WeexSDK/Sources/Bridge/WXModuleMethod.h |  28 ++
 ios/sdk/WeexSDK/Sources/Bridge/WXModuleMethod.m |  99 +++++
 .../Sources/Component/WXCanvasComponent.m       |  16 +-
 .../WeexSDK/Sources/Component/WXCellComponent.h |   4 +-
 .../WeexSDK/Sources/Component/WXCellComponent.m |  10 +
 .../Component/WXComponent+GradientColor.h       |  20 +
 .../Component/WXComponent+GradientColor.m       | 116 +++++
 .../Sources/Component/WXComponent_internal.h    |  20 +-
 .../Sources/Component/WXImageComponent.m        |  56 ++-
 .../Sources/Component/WXIndicatorComponent.m    |   5 +-
 .../WeexSDK/Sources/Component/WXListComponent.m |  48 ++-
 .../Sources/Component/WXScrollerComponent.h     |   2 +
 .../Sources/Component/WXScrollerComponent.m     |  18 +-
 .../Sources/Component/WXSliderComponent.m       |  48 ++-
 .../Component/WXSliderNeighborComponent.m       | 103 ++---
 .../Sources/Component/WXTextAreaComponent.m     | 199 +++++----
 .../WeexSDK/Sources/Component/WXTextComponent.m |  40 +-
 .../Sources/Component/WXTextInputComponent.m    | 262 ++++++------
 ios/sdk/WeexSDK/Sources/Component/WXTransform.h |   3 +
 ios/sdk/WeexSDK/Sources/Component/WXTransform.m |  25 +-
 .../Sources/Component/WXVideoComponent.m        |   2 +-
 .../Sources/Controller/WXBaseViewController.m   |  48 ++-
 ios/sdk/WeexSDK/Sources/Debug/WXDebugTool.m     |  46 +-
 .../Sources/Display/WXComponent+Display.m       |  40 +-
 ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.h    |  51 ++-
 ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.m    |  62 ++-
 ios/sdk/WeexSDK/Sources/Engine/WXSDKError.h     |   5 +-
 .../WeexSDK/Sources/Events/WXComponent+Events.m | 141 ++++++-
 .../Sources/Handler/WXNetworkDefaultImpl.h      |  14 -
 .../Sources/Handler/WXNetworkDefaultImpl.m      | 111 -----
 .../WeexSDK/Sources/Layout/WXComponent+Layout.m |  87 ++--
 .../WeexSDK/Sources/Loader/WXResourceLoader.h   |  30 ++
 .../WeexSDK/Sources/Loader/WXResourceLoader.m   | 174 ++++++++
 .../WeexSDK/Sources/Loader/WXWebSocketLoader.h  |  24 ++
 .../WeexSDK/Sources/Loader/WXWebSocketLoader.m  | 131 ++++++
 .../WeexSDK/Sources/Manager/WXBridgeManager.h   |  29 +-
 .../WeexSDK/Sources/Manager/WXBridgeManager.m   |  87 +++-
 .../Sources/Manager/WXComponentFactory.m        |   6 +-
 .../Sources/Manager/WXComponentManager.h        |  12 +-
 .../Sources/Manager/WXComponentManager.m        |  58 +--
 .../Sources/Manager/WXDatePickerManager.h       |   1 -
 .../Sources/Manager/WXDatePickerManager.m       |  58 +--
 .../WeexSDK/Sources/Manager/WXHandlerFactory.m  |   1 -
 .../Sources/Manager/WXInvocationConfig.h        |   6 +-
 .../Sources/Manager/WXInvocationConfig.m        | 100 +----
 .../WeexSDK/Sources/Manager/WXModuleFactory.h   |   4 +-
 .../WeexSDK/Sources/Manager/WXModuleFactory.m   |  32 +-
 .../WeexSDK/Sources/Manager/WXModuleManager.h   |  16 -
 .../WeexSDK/Sources/Manager/WXModuleManager.m   | 111 -----
 ios/sdk/WeexSDK/Sources/Manager/WXRuleManager.m |  11 +-
 ios/sdk/WeexSDK/Sources/Manager/WXSDKManager.h  |  10 +-
 ios/sdk/WeexSDK/Sources/Manager/WXSDKManager.m  |  19 +-
 .../WeexSDK/Sources/Manager/WXServiceFactory.h  |  38 ++
 .../WeexSDK/Sources/Manager/WXServiceFactory.m  | 102 +++++
 ios/sdk/WeexSDK/Sources/Model/WXBridgeMethod.h  |  18 +-
 ios/sdk/WeexSDK/Sources/Model/WXBridgeMethod.m  |  85 +++-
 ios/sdk/WeexSDK/Sources/Model/WXComponent.h     |  10 +
 ios/sdk/WeexSDK/Sources/Model/WXComponent.m     |  39 +-
 ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.h   |  56 ++-
 ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m   | 421 +++++++++++++------
 .../Sources/Model/WXSDKInstance_private.h       |   8 +
 .../WeexSDK/Sources/Module/WXAnimationModule.m  |  26 +-
 ios/sdk/WeexSDK/Sources/Module/WXDomModule.m    |  31 +-
 .../Sources/Module/WXGlobalEventModule.m        |   1 +
 ios/sdk/WeexSDK/Sources/Module/WXMetaModule.h   |  14 +
 ios/sdk/WeexSDK/Sources/Module/WXMetaModule.m   |  40 ++
 .../WeexSDK/Sources/Module/WXNavigatorModule.m  |  28 +-
 ios/sdk/WeexSDK/Sources/Module/WXStreamModule.h |   2 +-
 ios/sdk/WeexSDK/Sources/Module/WXStreamModule.m | 220 +++++-----
 .../WeexSDK/Sources/Module/WXWebSocketModule.h  |  15 +
 .../WeexSDK/Sources/Module/WXWebSocketModule.m  | 137 ++++++
 ios/sdk/WeexSDK/Sources/Monitor/WXMonitor.h     |   2 +
 .../WeexSDK/Sources/Network/WXResourceRequest.h |  35 ++
 .../WeexSDK/Sources/Network/WXResourceRequest.m |  57 +++
 .../Sources/Network/WXResourceRequestHandler.h  |  45 ++
 .../WXResourceRequestHandlerDefaultImpl.h       |  15 +
 .../WXResourceRequestHandlerDefaultImpl.m       |  90 ++++
 .../Sources/Network/WXResourceResponse.h        |  14 +
 .../Sources/Network/WXResourceResponse.m        |  14 +
 .../WeexSDK/Sources/Protocol/WXBridgeProtocol.h |  28 +-
 .../Sources/Protocol/WXNavigationProtocol.h     |  31 +-
 .../Sources/Protocol/WXNetworkProtocol.h        |   1 +
 .../Sources/Protocol/WXURLRewriteProtocol.h     |  10 +-
 ios/sdk/WeexSDK/Sources/Utility/WXConvert.h     |  22 +-
 ios/sdk/WeexSDK/Sources/Utility/WXConvert.m     |  87 +++-
 ios/sdk/WeexSDK/Sources/Utility/WXDefine.h      |  27 +-
 ios/sdk/WeexSDK/Sources/Utility/WXType.h        |  13 +-
 ios/sdk/WeexSDK/Sources/Utility/WXUtility.h     |  57 ++-
 ios/sdk/WeexSDK/Sources/Utility/WXUtility.m     | 119 ++++--
 .../View/WXComponent+PseudoClassManagement.h    |  66 +++
 .../View/WXComponent+PseudoClassManagement.m    | 144 +++++++
 .../Sources/View/WXComponent+ViewManagement.m   |  14 +-
 ios/sdk/WeexSDK/Sources/View/WXView.m           |   2 +-
 .../Sources/WebSocket/SRWebSocket+Weex.h        |  18 +
 .../Sources/WebSocket/SRWebSocket+Weex.m        |  36 ++
 .../Sources/WebSocket/WXWebSocketDefaultImpl.h  |  14 +
 .../Sources/WebSocket/WXWebSocketDefaultImpl.m  | 110 +++++
 .../Sources/WebSocket/WXWebSocketHandler.h      |  26 ++
 ios/sdk/WeexSDK/Sources/WeexSDK.h               |   1 +
 ios/sdk/WeexSDKTests/TestSupportUtils.m         |   2 +-
 ios/sdk/WeexSDKTests/WXBridgeMethodTests.m      |  24 +-
 ios/sdk/WeexSDKTests/WXNetworkTests.m           | 109 -----
 ios/sdk/WeexSDKTests/WXRootViewTests.m          |   4 +-
 ios/sdk/WeexSDKTests/WXSDKEngineTests.m         |  15 +-
 ios/sdk/WeexSDKTests/WXSDKManagerTests.m        |   4 -
 ios/sdk/WeexSDKTests/WXStreamModuleTests.m      |   4 +-
 ios/sdk/WeexSDKTests/WXURLRewriteTests.m        |   4 +-
 132 files changed, 4549 insertions(+), 1697 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1e837f38/ios/sdk/WeexSDK/Sources/Component/WXImageComponent.m
----------------------------------------------------------------------


[08/50] [abbrv] incubator-weex git commit: * [ios] bugfix call renderFinish

Posted by ji...@apache.org.
* [ios] bugfix call renderFinish


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/1fb2e0a5
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/1fb2e0a5
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/1fb2e0a5

Branch: refs/heads/master
Commit: 1fb2e0a5e923e4f77e7b0282f04d596934b7b478
Parents: 35e0084
Author: acton393 <zh...@gmail.com>
Authored: Tue Jan 10 21:34:47 2017 +0800
Committer: acton393 <zh...@gmail.com>
Committed: Tue Jan 10 21:34:47 2017 +0800

----------------------------------------------------------------------
 ios/sdk/WeexSDK/Sources/Component/WXImageComponent.m | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1fb2e0a5/ios/sdk/WeexSDK/Sources/Component/WXImageComponent.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXImageComponent.m b/ios/sdk/WeexSDK/Sources/Component/WXImageComponent.m
index b2a47c8..5c070ed 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXImageComponent.m
+++ b/ios/sdk/WeexSDK/Sources/Component/WXImageComponent.m
@@ -298,6 +298,7 @@ static dispatch_queue_t WXImageUpdateQueue;
                     }
                     
                     if ([strongSelf isViewLoaded]) {
+                        strongSelf.imageDownloadFinish = YES;
                         ((UIImageView *)strongSelf.view).image = image;
                         [strongSelf notifyRenderFinish];
                     }


[47/50] [abbrv] incubator-weex git commit: Android feature urlconnection interceptor (#92)

Posted by ji...@apache.org.
Android feature urlconnection interceptor (#92)

* * [android] support inspection for default http adapter

* * [android] support inspection for default http adapter

* * [android] ignore inspector temporary

* + [android] add delegate

* * [android] for codacy

* * [android] add delegate interface

* * [android] do nothing

* * [android] add static nop delegate


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/7b8cc461
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/7b8cc461
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/7b8cc461

Branch: refs/heads/master
Commit: 7b8cc46167cb695e6b707f95193194f9a1129290
Parents: dc1cbae
Author: moxun <fu...@foxmail.com>
Authored: Fri Dec 30 11:49:11 2016 +0800
Committer: sospartan <so...@gmail.com>
Committed: Wed Jan 11 17:43:15 2017 +0800

----------------------------------------------------------------------
 android/playground/app/build.gradle             |  3 +-
 .../extend/adapter/InterceptWXHttpAdapter.java  | 63 ++++++++++++++++++++
 .../weex/adapter/DefaultWXHttpAdapter.java      | 52 +++++++++++++++-
 3 files changed, 114 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7b8cc461/android/playground/app/build.gradle
----------------------------------------------------------------------
diff --git a/android/playground/app/build.gradle b/android/playground/app/build.gradle
index a29a04b..535f7a9 100755
--- a/android/playground/app/build.gradle
+++ b/android/playground/app/build.gradle
@@ -105,7 +105,8 @@ dependencies {
     compile 'com.android.support:design:23.2.1'
     compile 'com.android.support:support-annotations:23.2.1'
     compile 'com.jakewharton.scalpel:scalpel:1.1.2'
+    compile 'com.taobao.android.weex_inspection:urlconnection_interceptor:1.0.0'
     //compile 'com.google.android.gms:play-services-appindexing:8.1.0'
     compile 'com.android.support.test.espresso:espresso-idling-resource:2.2.2'
-    compile 'com.taobao.android:weex_inspector:0.8.0.0@aar'
+    //compile 'com.taobao.android:weex_inspector:0.8.0.0@aar'
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7b8cc461/android/playground/app/src/main/java/com/alibaba/weex/extend/adapter/InterceptWXHttpAdapter.java
----------------------------------------------------------------------
diff --git a/android/playground/app/src/main/java/com/alibaba/weex/extend/adapter/InterceptWXHttpAdapter.java b/android/playground/app/src/main/java/com/alibaba/weex/extend/adapter/InterceptWXHttpAdapter.java
new file mode 100644
index 0000000..8bf929d
--- /dev/null
+++ b/android/playground/app/src/main/java/com/alibaba/weex/extend/adapter/InterceptWXHttpAdapter.java
@@ -0,0 +1,63 @@
+package com.alibaba.weex.extend.adapter;
+
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+import com.taobao.weex.adapter.DefaultWXHttpAdapter;
+import com.taobao.weex.urlconnection.ByteArrayRequestEntity;
+import com.taobao.weex.urlconnection.SimpleRequestEntity;
+import com.taobao.weex.urlconnection.WeexURLConnectionManager;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+
+/**
+ * Created by moxun on 16/12/29.
+ */
+
+public class InterceptWXHttpAdapter extends DefaultWXHttpAdapter {
+
+    private IEventReporterDelegate eventReporterDelegate;
+
+    @NonNull
+    @Override
+    public IEventReporterDelegate getEventReporterDelegate() {
+        if (eventReporterDelegate == null) {
+            eventReporterDelegate = new IEventReporterDelegate() {
+
+                WeexURLConnectionManager manager = new WeexURLConnectionManager(null);
+
+                @Override
+                public void preConnect(HttpURLConnection connection, @Nullable String body) {
+                    SimpleRequestEntity requestEntity = null;
+                    if (body != null) {
+                        requestEntity = new ByteArrayRequestEntity(body.getBytes());
+                    }
+
+                    manager.preConnect(connection, requestEntity);
+                }
+
+                @Override
+                public void postConnect() {
+                    try {
+                        manager.postConnect();
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                    }
+                }
+
+                @Override
+                public InputStream interpretResponseStream(@Nullable InputStream inputStream) {
+                    return manager.interpretResponseStream(inputStream);
+                }
+
+                @Override
+                public void httpExchangeFailed(IOException e) {
+                    manager.httpExchangeFailed(e);
+                }
+            };
+        }
+        return eventReporterDelegate;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7b8cc461/android/sdk/src/main/java/com/taobao/weex/adapter/DefaultWXHttpAdapter.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/adapter/DefaultWXHttpAdapter.java b/android/sdk/src/main/java/com/taobao/weex/adapter/DefaultWXHttpAdapter.java
index fac3053..0a20a33 100755
--- a/android/sdk/src/main/java/com/taobao/weex/adapter/DefaultWXHttpAdapter.java
+++ b/android/sdk/src/main/java/com/taobao/weex/adapter/DefaultWXHttpAdapter.java
@@ -204,13 +204,19 @@
  */
 package com.taobao.weex.adapter;
 
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.text.TextUtils;
 
 import com.taobao.weex.common.WXRequest;
 import com.taobao.weex.common.WXResponse;
-import com.taobao.weex.utils.WXLogUtils;
 
-import java.io.*;
+import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.net.HttpURLConnection;
 import java.net.URL;
 import java.util.List;
@@ -222,6 +228,7 @@ import java.util.concurrent.Executors;
 
 public class DefaultWXHttpAdapter implements IWXHttpAdapter {
 
+  private static final IEventReporterDelegate DEFAULT_DELEGATE = new NOPEventReportDelegate();
   private ExecutorService mExecutorService;
 
   private void execute(Runnable runnable){
@@ -240,17 +247,22 @@ public class DefaultWXHttpAdapter implements IWXHttpAdapter {
       @Override
       public void run() {
         WXResponse response = new WXResponse();
+        IEventReporterDelegate reporter = getEventReporterDelegate();
         try {
           HttpURLConnection connection = openConnection(request, listener);
+          reporter.preConnect(connection, request.body);
           Map<String,List<String>> headers = connection.getHeaderFields();
           int responseCode = connection.getResponseCode();
           if(listener != null){
             listener.onHeadersReceived(responseCode,headers);
           }
+          reporter.postConnect();
 
           response.statusCode = String.valueOf(responseCode);
           if (responseCode >= 200 && responseCode<=299) {
-            response.originalData = readInputStreamAsBytes(connection.getInputStream(), listener);
+            InputStream rawStream = connection.getInputStream();
+            rawStream = reporter.interpretResponseStream(rawStream);
+            response.originalData = readInputStreamAsBytes(rawStream, listener);
           } else {
             response.errorMsg = readInputStream(connection.getErrorStream(), listener);
           }
@@ -265,6 +277,9 @@ public class DefaultWXHttpAdapter implements IWXHttpAdapter {
           if(listener!=null){
             listener.onHttpFinish(response);
           }
+          if (e instanceof IOException) {
+            reporter.httpExchangeFailed((IOException) e);
+          }
         }
       }
     });
@@ -366,5 +381,36 @@ public class DefaultWXHttpAdapter implements IWXHttpAdapter {
     return (HttpURLConnection) url.openConnection();
   }
 
+  public @NonNull IEventReporterDelegate getEventReporterDelegate() {
+    return DEFAULT_DELEGATE;
+  }
+
+  public interface IEventReporterDelegate {
+    void preConnect(HttpURLConnection connection, @Nullable String body);
+    void postConnect();
+    InputStream interpretResponseStream(@Nullable InputStream inputStream);
+    void httpExchangeFailed(IOException e);
+  }
+
+  private static class NOPEventReportDelegate implements IEventReporterDelegate {
+    @Override
+    public void preConnect(HttpURLConnection connection, @Nullable String body) {
+      //do nothing
+    }
+
+    @Override
+    public void postConnect() {
+      //do nothing
+    }
+
+    @Override
+    public InputStream interpretResponseStream(@Nullable InputStream inputStream) {
+      return inputStream;
+    }
 
+    @Override
+    public void httpExchangeFailed(IOException e) {
+      //do nothing
+    }
+  }
 }


[21/50] [abbrv] incubator-weex git commit: * [ios] notify component readyToShow

Posted by ji...@apache.org.
* [ios] notify component readyToShow


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/83bcadeb
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/83bcadeb
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/83bcadeb

Branch: refs/heads/master
Commit: 83bcadeb52c0fdc4a98f91193b1494ec99944a85
Parents: a1baf89
Author: acton393 <zh...@gmail.com>
Authored: Wed Jan 11 11:12:37 2017 +0800
Committer: acton393 <zh...@gmail.com>
Committed: Wed Jan 11 11:12:37 2017 +0800

----------------------------------------------------------------------
 .../Sources/Component/WXImageComponent.m        | 23 +++++++-------------
 .../WeexSDK/Sources/Component/WXTextComponent.m |  2 ++
 .../Sources/Display/WXComponent+Display.m       |  6 +----
 .../Sources/Manager/WXComponentManager.m        |  2 ++
 ios/sdk/WeexSDK/Sources/Model/WXComponent.h     |  2 +-
 ios/sdk/WeexSDK/Sources/Model/WXComponent.m     |  6 +++--
 6 files changed, 18 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/83bcadeb/ios/sdk/WeexSDK/Sources/Component/WXImageComponent.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXImageComponent.m b/ios/sdk/WeexSDK/Sources/Component/WXImageComponent.m
index 5c070ed..569c900 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXImageComponent.m
+++ b/ios/sdk/WeexSDK/Sources/Component/WXImageComponent.m
@@ -225,7 +225,7 @@ static dispatch_queue_t WXImageUpdateQueue;
             dispatch_async(dispatch_get_main_queue(), ^{
                 self.layer.contents = nil;
                 weakSelf.imageDownloadFinish = YES;
-                [weakSelf notifyRenderFinish];
+                [weakSelf readyToShow];
             });
         }
     });
@@ -249,7 +249,7 @@ static dispatch_queue_t WXImageUpdateQueue;
                     downloadFailedBlock(placeholderSrc,error);
                     if ([strongSelf isViewLoaded] && !viewImage) {
                         ((UIImageView *)(strongSelf.view)).image = nil;
-                        [self notifyRenderFinish];
+                        [self readyToShow];
                     }
                     return;
                 }
@@ -260,7 +260,7 @@ static dispatch_queue_t WXImageUpdateQueue;
                 if ([strongSelf isViewLoaded] && !viewImage) {
                     ((UIImageView *)strongSelf.view).image = image;
                     weakSelf.imageDownloadFinish = YES;
-                    [self notifyRenderFinish];
+                    [self readyToShow];
                 }
             });
         }];
@@ -289,7 +289,7 @@ static dispatch_queue_t WXImageUpdateQueue;
                     }
                     if (error) {
                         downloadFailedBlock(imageSrc, error);
-                        [strongSelf notifyRenderFinish];
+                        [strongSelf readyToShow];
                         return ;
                     }
                     
@@ -300,7 +300,7 @@ static dispatch_queue_t WXImageUpdateQueue;
                     if ([strongSelf isViewLoaded]) {
                         strongSelf.imageDownloadFinish = YES;
                         ((UIImageView *)strongSelf.view).image = image;
-                        [strongSelf notifyRenderFinish];
+                        [strongSelf readyToShow];
                     }
                 });
             }];
@@ -308,18 +308,11 @@ static dispatch_queue_t WXImageUpdateQueue;
     }
 }
 
-- (void)renderFinish
+- (void)readyToShow
 {
     // when image download completely (success or failed)
-    if (_imageDownloadFinish) {
-        [super renderFinish];
-    }
-}
-
-- (void)notifyRenderFinish
-{
-    if (self.weexInstance.trackComponent) {
-        [self renderFinish];
+    if (self.weexInstance.trackComponent && _imageDownloadFinish) {
+        [super readyToShow];
     }
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/83bcadeb/ios/sdk/WeexSDK/Sources/Component/WXTextComponent.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXTextComponent.m b/ios/sdk/WeexSDK/Sources/Component/WXTextComponent.m
index 64958ae..960e253 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXTextComponent.m
+++ b/ios/sdk/WeexSDK/Sources/Component/WXTextComponent.m
@@ -406,6 +406,8 @@ do {\
         pthread_mutex_unlock(&_textStorageMutex);
     }
     
+    [self readyToShow]; // notify super component
+    
     return textStorage;
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/83bcadeb/ios/sdk/WeexSDK/Sources/Display/WXComponent+Display.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Display/WXComponent+Display.m b/ios/sdk/WeexSDK/Sources/Display/WXComponent+Display.m
index cf8478d..b2fcb54 100644
--- a/ios/sdk/WeexSDK/Sources/Display/WXComponent+Display.m
+++ b/ios/sdk/WeexSDK/Sources/Display/WXComponent+Display.m
@@ -67,11 +67,7 @@
 
 - (WXDisplayCompeletionBlock)displayCompeletionBlock
 {
-    return ^(CALayer *layer, BOOL finished) {
-        if (self.weexInstance.trackComponent) {
-            [self renderFinish];
-        }
-    };
+    return nil;
 }
 
 #pragma mark Private

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/83bcadeb/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.m b/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.m
index 475a367..152d671 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.m
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.m
@@ -374,6 +374,7 @@ static css_node_t * rootNodeGetChild(void *context, int i)
     [self filterStyles:styles normalStyles:normalStyles resetStyles:resetStyles];
     [component _updateStylesOnComponentThread:normalStyles resetStyles:resetStyles isUpdateStyles:isUpdateStyles];
     [self _addUITask:^{
+        [component readyToShow];
         [component _updateStylesOnMainThread:normalStyles resetStyles:resetStyles];
     }];
 }
@@ -388,6 +389,7 @@ static css_node_t * rootNodeGetChild(void *context, int i)
     
     [component _updateAttributesOnComponentThread:attributes];
     [self _addUITask:^{
+        [component readyToShow];
         [component _updateAttributesOnMainThread:attributes];
     }];
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/83bcadeb/ios/sdk/WeexSDK/Sources/Model/WXComponent.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Model/WXComponent.h b/ios/sdk/WeexSDK/Sources/Model/WXComponent.h
index 63b3d85..c02eb9a 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXComponent.h
+++ b/ios/sdk/WeexSDK/Sources/Model/WXComponent.h
@@ -343,7 +343,7 @@ typedef void(^WXDisplayCompeletionBlock)(CALayer *layer, BOOL finished);
 /**
  * renderFinish
  */
-- (void)renderFinish;
+- (void)readyToShow;
 
 /**
  * @abstract Return a block to be called while drawing is finished.

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/83bcadeb/ios/sdk/WeexSDK/Sources/Model/WXComponent.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Model/WXComponent.m b/ios/sdk/WeexSDK/Sources/Model/WXComponent.m
index 874a910..6953ee7 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXComponent.m
+++ b/ios/sdk/WeexSDK/Sources/Model/WXComponent.m
@@ -430,9 +430,11 @@
     WXAssertMainThread();
 }
 
-- (void)renderFinish
+- (void)readyToShow
 {
-    [self.supercomponent renderFinish];
+    if (self.weexInstance.trackComponent) {
+        [self.supercomponent readyToShow];
+    }
 }
 
 - (void)updateAttributes:(NSDictionary *)attributes


[16/50] [abbrv] incubator-weex git commit: Merge pull request #2205 from acton393/ios-feature-20170118

Posted by ji...@apache.org.
Merge pull request #2205 from acton393/ios-feature-20170118

* [ios] iOS feature 20170118

Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/00ca8aa9
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/00ca8aa9
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/00ca8aa9

Branch: refs/heads/master
Commit: 00ca8aa9ce2ba961a0be1f462e5235c89c5a6247
Parents: b25b16c a1baf89
Author: \u9f50\u5c71 <su...@163.com>
Authored: Tue Jan 10 23:19:20 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Tue Jan 10 23:19:20 2017 +0800

----------------------------------------------------------------------
 ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)
----------------------------------------------------------------------



[36/50] [abbrv] incubator-weex git commit: * [android] simplify ci command

Posted by ji...@apache.org.
* [android] simplify ci command


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/0d992e47
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/0d992e47
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/0d992e47

Branch: refs/heads/master
Commit: 0d992e47cca5498fc8af0538d34dc802f91d77bc
Parents: 405b6e6
Author: sospartan <so...@gmail.com>
Authored: Wed Jan 11 16:10:21 2017 +0800
Committer: sospartan <so...@gmail.com>
Committed: Wed Jan 11 16:10:21 2017 +0800

----------------------------------------------------------------------
 circle.yml | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/0d992e47/circle.yml
----------------------------------------------------------------------
diff --git a/circle.yml b/circle.yml
index 70f5817..ee399e2 100644
--- a/circle.yml
+++ b/circle.yml
@@ -12,8 +12,7 @@ machine:
 test:
   override:
    # - npm run test
-    - cd android/playground && ./gradlew assembleDebug -Dorg.gradle.daemon=true -Dorg.gradle.parallel=true -Dorg.gradle.jvmargs="-Xmx512m -XX:+HeapDumpOnOutOfMemoryError" -Dfile.encoding=UTF-8
-    - cd android/sdk && ./gradlew clean testDebugUnitTest -PdisableCov=true -PtargetSDK=19 -Dorg.gradle.daemon=true -Dorg.gradle.parallel=true -Dorg.gradle.jvmargs="-Xmx512m -XX:+HeapDumpOnOutOfMemoryError" -Dfile.encoding=UTF-8
+    - cd android/playground && ./gradlew assembleDebug :weex_sdk:testDebugUnitTest -PdisableCov=true -PtargetSDK=19 -Dorg.gradle.daemon=true -Dorg.gradle.parallel=true -Dorg.gradle.jvmargs="-Xmx512m -XX:+HeapDumpOnOutOfMemoryError" -Dfile.encoding=UTF-8
   post:
     - cp -r android/playground/app/build/outputs $CIRCLE_ARTIFACTS/playground # playground artifacts
     - cp -r android/sdk/build/reports $CIRCLE_ARTIFACTS/sdk_reports


[41/50] [abbrv] incubator-weex git commit: Merge remote-tracking branch 'upstream/ios-feature-20170118' into ios-jsframework-0.19.7

Posted by ji...@apache.org.
Merge remote-tracking branch 'upstream/ios-feature-20170118' into ios-jsframework-0.19.7


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/ee0f2bbb
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/ee0f2bbb
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/ee0f2bbb

Branch: refs/heads/master
Commit: ee0f2bbb55d14cd7095eb3d28d6c0db71c27a417
Parents: d0748c2 46332dd
Author: boboning <ni...@163.com>
Authored: Wed Jan 11 16:52:03 2017 +0800
Committer: boboning <ni...@163.com>
Committed: Wed Jan 11 16:52:03 2017 +0800

----------------------------------------------------------------------
 examples/module/websocket-demo.we               |   2 +-
 ios/sdk/WeexSDK.podspec                         |  10 +-
 ios/sdk/WeexSDK/Sources/Bridge/WXModuleMethod.m |  25 ++--
 .../Sources/Component/WXImageComponent.m        |  24 ++--
 .../Sources/Component/WXScrollerComponent.m     |   2 +-
 .../Sources/Component/WXTextAreaComponent.m     | 113 ++++++++-----------
 .../WeexSDK/Sources/Component/WXTextComponent.m |   1 +
 .../Sources/Component/WXTextInputComponent.m    |  14 +--
 .../Sources/Display/WXComponent+Display.m       |   6 +-
 ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.h    |   7 +-
 ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.m    |  14 ++-
 .../WeexSDK/Sources/Events/WXComponent+Events.m |  25 +++-
 .../WeexSDK/Sources/Loader/WXResourceLoader.m   |   2 +-
 .../Sources/Manager/WXComponentManager.m        |  17 +++
 ios/sdk/WeexSDK/Sources/Model/WXComponent.h     |   4 +-
 ios/sdk/WeexSDK/Sources/Model/WXComponent.m     |   6 +-
 ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.h   |   2 +-
 ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m   |  50 +++++++-
 .../Sources/Model/WXSDKInstance_private.h       |   3 +
 .../WeexSDK/Sources/Module/WXNavigatorModule.m  |  28 +++--
 .../Sources/Protocol/WXNavigationProtocol.h     |  31 ++++-
 21 files changed, 235 insertions(+), 151 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ee0f2bbb/ios/sdk/WeexSDK.podspec
----------------------------------------------------------------------
diff --cc ios/sdk/WeexSDK.podspec
index f240ecd,057c435..17ec318
--- a/ios/sdk/WeexSDK.podspec
+++ b/ios/sdk/WeexSDK.podspec
@@@ -2,7 -2,7 +2,9 @@@
  Pod::Spec.new do |s|
  
    s.name         = "WeexSDK"
 -  s.version      = "0.10.0"
++
 +  s.version      = "0.9.5"
++
    s.summary      = "WeexSDK Source ."
  
    s.description  = <<-DESC


[46/50] [abbrv] incubator-weex git commit: * [test] revert android ci command

Posted by ji...@apache.org.
* [test] revert android ci command


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/dc1cbae3
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/dc1cbae3
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/dc1cbae3

Branch: refs/heads/master
Commit: dc1cbae338664c7a763910a3e3f9ba268b1e0a41
Parents: 9e54e4d
Author: sospartan <so...@gmail.com>
Authored: Wed Jan 11 17:26:53 2017 +0800
Committer: sospartan <so...@gmail.com>
Committed: Wed Jan 11 17:26:53 2017 +0800

----------------------------------------------------------------------
 circle.yml | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/dc1cbae3/circle.yml
----------------------------------------------------------------------
diff --git a/circle.yml b/circle.yml
index 37fd785..77a922c 100644
--- a/circle.yml
+++ b/circle.yml
@@ -13,7 +13,8 @@ test:
   override:
     - npm run build
     - npm run test
-    - cd android/playground && ./gradlew assembleDebug :weex_sdk:testDebugUnitTest -PdisableCov=true -PtargetSDK=19 -Dorg.gradle.daemon=true -Dorg.gradle.parallel=true -Dorg.gradle.jvmargs="-Xmx512m -XX:+HeapDumpOnOutOfMemoryError" -Dfile.encoding=UTF-8
+    - cd android/playground && ./gradlew assembleDebug -Dorg.gradle.daemon=true -Dorg.gradle.parallel=true -Dorg.gradle.jvmargs="-Xmx512m -XX:+HeapDumpOnOutOfMemoryError" -Dfile.encoding=UTF-8
+    - cd android/sdk && ./gradlew testDebugUnitTest -PdisableCov=true -PtargetSDK=19 -Dorg.gradle.daemon=true -Dorg.gradle.parallel=true -Dorg.gradle.jvmargs="-Xmx512m -XX:+HeapDumpOnOutOfMemoryError" -Dfile.encoding=UTF-8
   post:
     - cp -r android/playground/app/build/outputs $CIRCLE_ARTIFACTS/playground # playground artifacts
     - cp -r android/sdk/build/reports $CIRCLE_ARTIFACTS/sdk_reports


[18/50] [abbrv] incubator-weex git commit: Merge pull request #2185 from kfeagle/ios-feature-20170118

Posted by ji...@apache.org.
Merge pull request #2185 from kfeagle/ios-feature-20170118

* [ios] bug fix: websocket module name is changed ,websocket used in playground should change

Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/2371256b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/2371256b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/2371256b

Branch: refs/heads/master
Commit: 2371256b3db500e15cb8354a12d04899f18dc580
Parents: 00ca8aa 860b44f
Author: acton393 <ac...@users.noreply.github.com>
Authored: Tue Jan 10 23:19:46 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Tue Jan 10 23:19:46 2017 +0800

----------------------------------------------------------------------
 examples/module/websocket-demo.we               |  2 +-
 .../Sources/Component/WXTextAreaComponent.m     | 39 +++++++++++---------
 .../Sources/Component/WXTextInputComponent.m    | 14 +++----
 3 files changed, 29 insertions(+), 26 deletions(-)
----------------------------------------------------------------------



[42/50] [abbrv] incubator-weex git commit: Merge branch 'v0.10.0-stable' into dev-release095

Posted by ji...@apache.org.
Merge branch 'v0.10.0-stable' into dev-release095

# Conflicts:
#	README.md
#	android/commons/src/main/java/com/alibaba/weex/commons/AbstractWeexActivity.java
#	android/sdk/src/main/java/com/taobao/weex/appfram/storage/WXSQLiteOpenHelper.java
#	android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXListComponent.java
#	examples/vanilla/index.js
#	ios/sdk/WeexSDK/Sources/Component/WXImageComponent.m


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/4d9dcc1d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/4d9dcc1d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/4d9dcc1d

Branch: refs/heads/master
Commit: 4d9dcc1de20c56aed14467efc33328e56b083924
Parents: 966c17d 235b87f
Author: sospartan <so...@gmail.com>
Authored: Wed Jan 11 16:54:26 2017 +0800
Committer: sospartan <so...@gmail.com>
Committed: Wed Jan 11 16:54:26 2017 +0800

----------------------------------------------------------------------
 .gitignore                                      |     1 +
 android/commons/build.gradle                    |     4 +-
 .../weex/commons/AbstractWeexActivity.java      |     2 +
 .../adapter/DefaultWebSocketAdapter.java        |   326 +
 .../adapter/DefaultWebSocketAdapterFactory.java |   219 +
 android/playground/app/build.gradle             |    16 +-
 .../app/src/androidTest/AndroidManifest.xml     |   212 +
 .../benchmark/BenchmarkActivityTestRule.java    |   239 +
 .../alibaba/weex/benchmark/BenchmarkTest.java   |   419 +
 .../com/alibaba/weex/benchmark/BoxPlot.java     |   270 +
 .../java/com/alibaba/weex/benchmark/Repeat.java |   219 +
 .../com/alibaba/weex/benchmark/RepeatRule.java  |   242 +
 .../weex/benchmark/WeexNativeCompareTest.java   |   336 +
 .../playground/app/src/main/AndroidManifest.xml |    41 +-
 .../app/src/main/assets/hello_weex.js           |    28 +
 .../com/alibaba/weex/BenchmarkActivity.java     |   413 +
 .../java/com/alibaba/weex/IndexActivity.java    |    77 +-
 .../java/com/alibaba/weex/WXApplication.java    |    62 +-
 .../java/com/alibaba/weex/WXDebugActivity.java  |    91 +
 .../java/com/alibaba/weex/WXPageActivity.java   |   215 +-
 .../extend/component/WXComponentSyncTest.java   |    29 +
 .../weex/extend/module/GeolocationModule.java   |     8 +-
 .../alibaba/weex/extend/module/MyModule.java    |     4 +-
 .../weex/extend/module/RenderModule.java        |     4 +-
 .../weex/extend/module/SyncTestModule.java      |    53 +
 .../weex/extend/module/WXEventModule.java       |    16 +-
 .../zxing/client/android/CaptureActivity.java   |    70 +-
 .../src/main/res/layout/activity_dynamic.xml    |    27 +
 .../app/src/main/res/layout/activity_index.xml  |     1 +
 .../app/src/main/res/layout/content_dynamic.xml |    24 +
 .../app/src/main/res/layout/hello_weex.xml      |   223 +
 .../app/src/main/res/values-zh-rCN/strings.xml  |     2 +-
 .../app/src/main/res/values/strings.xml         |    10 +-
 android/sdk/assets/main.js                      | 19932 ++++++++++++++++-
 android/sdk/build.gradle                        |     7 +-
 android/sdk/gradle.properties                   |     6 +-
 .../gradle/wrapper/gradle-wrapper.properties    |     2 +-
 android/sdk/libs/armeabi/libweexv8.so           |   Bin 3579724 -> 3583820 bytes
 android/sdk/libs/x86/libweexv8.so               |   Bin 4328576 -> 4340864 bytes
 android/sdk/src/main/AndroidManifest.xml        |     2 +-
 .../taobao/weex/IWXActivityStateListener.java   |     2 +
 .../main/java/com/taobao/weex/InitConfig.java   |    26 +
 .../java/com/taobao/weex/RenderContainer.java   |   253 +
 .../java/com/taobao/weex/WXEnvironment.java     |    14 +-
 .../com/taobao/weex/WXGlobalEventModule.java    |     6 +-
 .../com/taobao/weex/WXGlobalEventReceiver.java  |    12 +-
 .../main/java/com/taobao/weex/WXSDKEngine.java  |    64 +-
 .../java/com/taobao/weex/WXSDKInstance.java     |   623 +-
 .../main/java/com/taobao/weex/WXSDKManager.java |    48 +-
 .../taobao/weex/adapter/DrawableStrategy.java   |   213 +
 .../taobao/weex/adapter/IDrawableLoader.java    |   219 +
 .../com/taobao/weex/annotation/Component.java   |   219 +
 .../appfram/clipboard/WXClipboardModule.java    |    16 +-
 .../appfram/navigator/WXNavigatorModule.java    |   182 +-
 .../appfram/storage/WXSQLiteOpenHelper.java     |     1 -
 .../weex/appfram/storage/WXStorageModule.java   |    17 +-
 .../appfram/websocket/IWebSocketAdapter.java    |   234 +
 .../websocket/IWebSocketAdapterFactory.java     |   213 +
 .../appfram/websocket/WebSocketCloseCodes.java  |   237 +
 .../weex/appfram/websocket/WebSocketModule.java |   341 +
 .../taobao/weex/bridge/BaseMethodInvoker.java   |   224 -
 .../java/com/taobao/weex/bridge/Invoker.java    |     4 +-
 .../taobao/weex/bridge/JSCallbackCreator.java   |   213 -
 .../taobao/weex/bridge/JavascriptInvokable.java |   214 +
 .../com/taobao/weex/bridge/MethodInvoker.java   |    18 +-
 .../com/taobao/weex/bridge/ModuleFactory.java   |     5 +-
 .../taobao/weex/bridge/NativeInvokeHelper.java  |   276 +
 .../java/com/taobao/weex/bridge/WXBridge.java   |    51 +-
 .../com/taobao/weex/bridge/WXBridgeManager.java |   245 +-
 .../java/com/taobao/weex/bridge/WXJSObject.java |    48 +-
 .../com/taobao/weex/bridge/WXModuleManager.java |   227 +-
 .../java/com/taobao/weex/bridge/WXParams.java   |    19 +
 .../taobao/weex/bridge/WXServiceManager.java    |   236 +
 .../java/com/taobao/weex/common/Component.java  |   219 -
 .../java/com/taobao/weex/common/Constants.java  |    26 +
 .../java/com/taobao/weex/common/IWXBridge.java  |     6 +
 .../com/taobao/weex/common/IWXDebugProxy.java   |     4 +-
 .../taobao/weex/common/TypeModuleFactory.java   |    32 +-
 .../com/taobao/weex/common/WXCompatModule.java  |   270 +
 .../java/com/taobao/weex/common/WXConfig.java   |     1 +
 .../com/taobao/weex/common/WXInstanceWrap.java  |     4 +-
 .../java/com/taobao/weex/common/WXModule.java   |   379 +-
 .../com/taobao/weex/common/WXModuleAnno.java    |     5 +-
 .../taobao/weex/dom/BasicEditTextDomObject.java |     6 +-
 .../java/com/taobao/weex/dom/DomContext.java    |   216 +
 .../com/taobao/weex/dom/ImmutableDomObject.java |   228 +
 .../main/java/com/taobao/weex/dom/WXAttr.java   |   114 +-
 .../com/taobao/weex/dom/WXCustomStyleSpan.java  |     2 +-
 .../java/com/taobao/weex/dom/WXDomHandler.java  |    15 +-
 .../java/com/taobao/weex/dom/WXDomManager.java  |     9 +-
 .../java/com/taobao/weex/dom/WXDomModule.java   |    82 +-
 .../java/com/taobao/weex/dom/WXDomObject.java   |   415 +-
 .../com/taobao/weex/dom/WXDomStatement.java     |   546 +-
 .../main/java/com/taobao/weex/dom/WXStyle.java  |   211 +-
 .../com/taobao/weex/dom/WXSwitchDomObject.java  |    64 +-
 .../com/taobao/weex/dom/WXTextDomObject.java    |   104 +-
 .../com/taobao/weex/http/WXStreamModule.java    |    21 +-
 .../com/taobao/weex/ui/IFComponentHolder.java   |     6 +-
 .../taobao/weex/ui/SimpleComponentHolder.java   |     7 +-
 .../com/taobao/weex/ui/WXRenderManager.java     |    10 +-
 .../com/taobao/weex/ui/WXRenderStatement.java   |    76 +-
 .../weex/ui/animation/WXAnimationBean.java      |    60 +-
 .../weex/ui/animation/WXAnimationModule.java    |    33 +-
 .../ui/component/AbstractEditComponent.java     |    46 +-
 .../taobao/weex/ui/component/Scrollable.java    |     3 -
 .../java/com/taobao/weex/ui/component/WXA.java  |    15 +-
 .../taobao/weex/ui/component/WXBaseRefresh.java |    12 +-
 .../taobao/weex/ui/component/WXComponent.java   |   635 +-
 .../com/taobao/weex/ui/component/WXDiv.java     |     5 +-
 .../com/taobao/weex/ui/component/WXEmbed.java   |    24 +-
 .../com/taobao/weex/ui/component/WXHeader.java  |     2 +-
 .../com/taobao/weex/ui/component/WXImage.java   |   302 +-
 .../taobao/weex/ui/component/WXIndicator.java   |    12 +-
 .../com/taobao/weex/ui/component/WXInput.java   |     2 +-
 .../com/taobao/weex/ui/component/WXLoading.java |    22 +-
 .../weex/ui/component/WXLoadingIndicator.java   |     2 +-
 .../com/taobao/weex/ui/component/WXRefresh.java |    27 +-
 .../taobao/weex/ui/component/WXScroller.java    |    66 +-
 .../com/taobao/weex/ui/component/WXSlider.java  |   136 +-
 .../weex/ui/component/WXSliderNeighbor.java     |   180 +-
 .../com/taobao/weex/ui/component/WXSwitch.java  |    22 +-
 .../com/taobao/weex/ui/component/WXText.java    |    10 +-
 .../taobao/weex/ui/component/WXVContainer.java  |   184 +-
 .../com/taobao/weex/ui/component/WXVideo.java   |     2 +-
 .../com/taobao/weex/ui/component/WXWeb.java     |    23 +-
 .../ui/component/list/BasicListComponent.java   |  1104 +
 .../component/list/HorizontalListComponent.java |     2 +-
 .../ui/component/list/ListComponentView.java    |   223 +
 .../ui/component/list/SimpleListComponent.java  |   231 +
 .../ui/component/list/SimpleRecyclerView.java   |   329 +
 .../taobao/weex/ui/component/list/WXCell.java   |     6 +-
 .../weex/ui/component/list/WXListComponent.java |   952 +-
 .../component/pesudo/OnActivePseudoListner.java |   212 +
 .../weex/ui/component/pesudo/PesudoStatus.java  |   317 +
 .../pesudo/TouchActivePseudoListener.java       |   234 +
 .../com/taobao/weex/ui/module/WXMetaModule.java |   246 +
 .../taobao/weex/ui/module/WXModalUIModule.java  |    95 +-
 .../taobao/weex/ui/module/WXTimerModule.java    |    10 +-
 .../taobao/weex/ui/module/WXWebViewModule.java  |     8 +-
 .../com/taobao/weex/ui/view/IRenderStatus.java  |   214 +
 .../weex/ui/view/WXCirclePageAdapter.java       |     4 +
 .../taobao/weex/ui/view/WXCircleViewPager.java  |    25 +
 .../com/taobao/weex/ui/view/WXFrameLayout.java  |     8 +
 .../weex/ui/view/WXHorizontalScrollView.java    |    12 +
 .../com/taobao/weex/ui/view/WXImageView.java    |   170 +-
 .../com/taobao/weex/ui/view/WXScrollView.java   |    12 +
 .../com/taobao/weex/ui/view/WXSwitchView.java   |     3 +
 .../com/taobao/weex/ui/view/WXTextView.java     |    18 +-
 .../weex/ui/view/border/BorderDrawable.java     |   338 +-
 .../taobao/weex/ui/view/border/BorderUtil.java  |   293 +
 .../taobao/weex/ui/view/gesture/WXGesture.java  |   219 +-
 .../weex/ui/view/gesture/WXGestureType.java     |     5 +-
 .../weex/ui/view/listview/WXRecyclerView.java   |    34 +-
 .../refresh/circlebar/CircleProgressBar.java    |     1 -
 .../ui/view/refresh/core/WXRefreshView.java     |     6 +
 .../ui/view/refresh/core/WXSwipeLayout.java     |    41 +-
 .../ui/view/refresh/wrapper/BaseBounceView.java |    22 +
 .../refresh/wrapper/BounceRecyclerView.java     |    28 +-
 .../java/com/taobao/weex/utils/ATagUtil.java    |   224 +
 .../com/taobao/weex/utils/FunctionParser.java   |    15 +
 .../com/taobao/weex/utils/ImageDrawable.java    |   326 +
 .../java/com/taobao/weex/utils/ImgURIUtil.java  |   228 +
 .../java/com/taobao/weex/utils/WXDomUtils.java  |   268 +
 .../java/com/taobao/weex/utils/WXFileUtils.java |    40 +-
 .../java/com/taobao/weex/utils/WXJsonUtils.java |    15 +-
 .../taobao/weex/utils/WXReflectionUtils.java    |    38 -
 .../com/taobao/weex/utils/WXResourceUtils.java  |   111 +
 .../taobao/weex/utils/WXSoInstallMgrSdk.java    |     7 +-
 .../java/com/taobao/weex/utils/WXViewUtils.java |   168 +-
 .../java/com/taobao/weex/WXSDKEngineTest.java   |     2 +
 .../java/com/taobao/weex/WXSDKInstanceTest.java |    65 +-
 .../clipboard/WXClipboardModuleTest.java        |   261 +
 .../navigator/WXNavigatorModuleTest.java        |    26 +-
 .../com/taobao/weex/bridge/WXBridgeTest.java    |   263 +
 .../com/taobao/weex/bridge/WXHashMapTest.java   |     2 +-
 .../taobao/weex/bridge/WXModuleManagerTest.java |     2 -
 .../java/com/taobao/weex/common/TestModule.java |     5 +-
 .../java/com/taobao/weex/dom/TestDomObject.java |    27 +-
 .../java/com/taobao/weex/dom/WXAttrTest.java    |    38 +-
 .../com/taobao/weex/dom/WXDomModuleTest.java    |     3 +-
 .../com/taobao/weex/dom/WXDomStatementTest.java |    17 +-
 .../java/com/taobao/weex/dom/WXStyleTest.java   |    80 +
 .../taobao/weex/dom/WXTextDomObjectTest.java    |   276 +
 .../taobao/weex/http/WXStreamModuleTest.java    |     4 +
 .../ui/animation/WXAnimationModuleTest.java     |     6 -
 .../taobao/weex/ui/component/ComponentTest.java |    23 +-
 .../weex/ui/component/WXComponentTest.java      |    65 +-
 .../com/taobao/weex/ui/component/WXDivTest.java |    11 +-
 .../taobao/weex/ui/component/WXEmbedTest.java   |   259 +
 .../taobao/weex/ui/component/WXImageTest.java   |    30 +-
 .../taobao/weex/ui/component/WXLoadingTest.java |   259 +
 .../taobao/weex/ui/component/WXRefreshTest.java |   261 +
 .../weex/ui/component/WXScrollerTest.java       |     3 +-
 .../weex/ui/component/WXSliderNeighborTest.java |   288 +
 .../taobao/weex/ui/component/WXSliderTest.java  |    27 +-
 .../taobao/weex/ui/component/WXSwitchTest.java  |   261 +
 .../taobao/weex/ui/component/WXTextTest.java    |    24 +-
 .../com/taobao/weex/ui/component/WXWebTest.java |   336 +
 .../ui/component/list/WXListComponentTest.java  |    21 +-
 .../taobao/weex/ui/module/WXMetaModuleTest.java |   263 +
 .../weex/ui/module/WXModalUIModuleTest.java     |     2 +-
 .../weex/ui/view/border/BorderDrawableTest.java |    38 +-
 .../weex/ui/view/gesture/WXGestureTest.java     |   268 +
 .../taobao/weex/utils/FunctionParserTest.java   |   225 +
 .../com/taobao/weex/utils/WXLogUtilsTest.java   |   284 +
 .../taobao/weex/utils/WXResourceUtilsTest.java  |    18 +-
 .../java/com/taobao/weex/utils/WXUtilsTest.java |    17 +
 android/sdk/unittest.sh                         |     4 +
 .../taobao/weex/bridge/WXWebsocketBridge.java   |    15 +
 build/webpack.macacatest.config.js              |    57 +
 circle.yml                                      |    19 +-
 doc/advanced/integrate-to-android.md            |    12 +-
 examples/component/slider/index.we              |     7 +
 .../Sources/Component/WXImageComponent.m        |     2 +-
 package.json                                    |     6 +
 test/README.md                                  |    28 +
 test/benchmark.html                             |    42 -
 test/circleci-android/Constants.java            |    16 -
 test/event-bubble.we                            |    45 -
 test/index-item.we                              |    26 -
 test/index.we                                   |    53 -
 test/input-test.we                              |    27 -
 test/pages/components/input.we                  |     0
 test/pages/index.we                             |    27 +
 test/run.sh                                     |    28 +
 test/scripts/index.test.js                      |    57 +
 test/scripts/test.js                            |     1 +
 test/scripts/weex-node-map.js                   |    17 +
 test/scripts/weex.js                            |   129 +
 test/scroller-demo.we                           |   168 -
 test/serve.sh                                   |     4 +
 test/sticky-demo.we                             |    81 -
 test/stream.json                                |     3 -
 test/stream.we                                  |   140 -
 test/test.we                                    |    85 -
 test/text-word-wrap.we                          |    13 -
 test/ui-list-item.we                            |    28 -
 test/update-cli.sh                              |     5 +
 test/web-demo.we                                |    30 -
 test/web-inner.html                             |    42 -
 240 files changed, 40522 insertions(+), 5092 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/4d9dcc1d/android/commons/src/main/java/com/alibaba/weex/commons/AbstractWeexActivity.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/4d9dcc1d/doc/advanced/integrate-to-android.md
----------------------------------------------------------------------


[15/50] [abbrv] incubator-weex git commit: * [ios] fix bug: text input padding is not right

Posted by ji...@apache.org.
* [ios] fix bug: text input padding is not right


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/f4accbac
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/f4accbac
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/f4accbac

Branch: refs/heads/master
Commit: f4accbac8ded9c1d2181ef0ca1a3472c732f04b6
Parents: dcca37e
Author: \u9f50\u5c71 <su...@163.com>
Authored: Tue Jan 10 23:03:22 2017 +0800
Committer: \u9f50\u5c71 <su...@163.com>
Committed: Tue Jan 10 23:03:22 2017 +0800

----------------------------------------------------------------------
 .../Sources/Component/WXTextAreaComponent.m     | 39 +++++++++++---------
 .../Sources/Component/WXTextInputComponent.m    | 14 +++----
 2 files changed, 28 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/f4accbac/ios/sdk/WeexSDK/Sources/Component/WXTextAreaComponent.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXTextAreaComponent.m b/ios/sdk/WeexSDK/Sources/Component/WXTextAreaComponent.m
index b6c41af..c4e7b9a 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXTextAreaComponent.m
+++ b/ios/sdk/WeexSDK/Sources/Component/WXTextAreaComponent.m
@@ -156,17 +156,6 @@ WX_EXPORT_METHOD(@selector(blur))
         if (styles[@"textAlign"]) {
             _textAlign = [WXConvert NSTextAlignment:styles[@"textAlign"]] ;
         }
-        
-        _padding = UIEdgeInsetsZero;
-        _border = UIEdgeInsetsZero;
-        UIEdgeInsets padding = UIEdgeInsetsMake(self.cssNode->style.padding[CSS_TOP], self.cssNode->style.padding[CSS_LEFT], self.cssNode->style.padding[CSS_BOTTOM], self.cssNode->style.padding[CSS_RIGHT]);
-        if (!UIEdgeInsetsEqualToEdgeInsets(padding, _padding)) {
-            _padding = padding;
-        }
-        UIEdgeInsets border = UIEdgeInsetsMake(self.cssNode->style.border[CSS_TOP], self.cssNode->style.border[CSS_LEFT], self.cssNode->style.border[CSS_BOTTOM], self.cssNode->style.border[CSS_RIGHT]);
-        if (!UIEdgeInsetsEqualToEdgeInsets(border, _border)) {
-            _border = border;
-        }
     }
     
     return self;
@@ -229,8 +218,9 @@ WX_EXPORT_METHOD(@selector(blur))
     }
     [_textView setTextAlignment:_textAlign];
     [self setTextFont];
-    [_textView setBorder:_border];
-    [_textView setPadding:_padding];
+    _padding = UIEdgeInsetsZero;
+    _border = UIEdgeInsetsZero;
+    [self updatePattern];
     
     [_textView setNeedsDisplay];
     [_textView setClipsToBounds:YES];
@@ -251,6 +241,18 @@ WX_EXPORT_METHOD(@selector(blur))
     }
 }
 
+- (void)setPadding:(UIEdgeInsets)padding
+{
+    _padding = padding;
+    [_textView setPadding:padding];
+}
+
+- (void)setBorder:(UIEdgeInsets)border
+{
+    _border = border;
+    [_textView setBorder:border];
+}
+
 #pragma mark - add-remove Event
 - (void)addEvent:(NSString *)eventName
 {
@@ -349,16 +351,19 @@ WX_EXPORT_METHOD(@selector(blur))
         _placeholderColor = [UIColor colorWithRed:0x99/255.0 green:0x99/255.0 blue:0x99/255.0 alpha:1.0];
     }
     [self setPlaceholderAttributedString];
-    
+    [self updatePattern];
+}
+
+-(void)updatePattern
+{
     UIEdgeInsets padding = UIEdgeInsetsMake(self.cssNode->style.padding[CSS_TOP], self.cssNode->style.padding[CSS_LEFT], self.cssNode->style.padding[CSS_BOTTOM], self.cssNode->style.padding[CSS_RIGHT]);
     if (!UIEdgeInsetsEqualToEdgeInsets(padding, _padding)) {
-        _padding = padding;
+        [self setPadding:padding];
     }
     
     UIEdgeInsets border = UIEdgeInsetsMake(self.cssNode->style.border[CSS_TOP], self.cssNode->style.border[CSS_LEFT], self.cssNode->style.border[CSS_BOTTOM], self.cssNode->style.border[CSS_RIGHT]);
     if (!UIEdgeInsetsEqualToEdgeInsets(border, _border)) {
-        _border = border;
-        [_textView setBorder:_border];
+        [self setBorder:border];
     }
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/f4accbac/ios/sdk/WeexSDK/Sources/Component/WXTextInputComponent.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXTextInputComponent.m b/ios/sdk/WeexSDK/Sources/Component/WXTextInputComponent.m
index 1fcea45..01d362a 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXTextInputComponent.m
+++ b/ios/sdk/WeexSDK/Sources/Component/WXTextInputComponent.m
@@ -145,14 +145,6 @@ WX_EXPORT_METHOD(@selector(blur))
         }else {
             _placeholderColor = [UIColor colorWithRed:0x99/255.0 green:0x99/255.0 blue:0x99/255.0 alpha:1.0];
         }
-        UIEdgeInsets padding = UIEdgeInsetsMake(self.cssNode->style.padding[CSS_TOP], self.cssNode->style.padding[CSS_LEFT], self.cssNode->style.padding[CSS_BOTTOM], self.cssNode->style.padding[CSS_RIGHT]);
-        if (!UIEdgeInsetsEqualToEdgeInsets(padding, _padding)) {
-            [self setPadding:padding];
-        }
-        UIEdgeInsets border = UIEdgeInsetsMake(self.cssNode->style.border[CSS_TOP], self.cssNode->style.border[CSS_LEFT], self.cssNode->style.border[CSS_BOTTOM], self.cssNode->style.border[CSS_RIGHT]);
-        if (!UIEdgeInsetsEqualToEdgeInsets(border, _border)) {
-            [self setBorder:border];
-        }
     }
     
     return self;
@@ -184,6 +176,7 @@ WX_EXPORT_METHOD(@selector(blur))
     [_inputView setTextColor:_colorForStyle];
     [_inputView setText:_value];
     [_inputView setEnabled:!_disabled];
+    [self updatePattern];
     
     UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(closeKeyboard)];
     UIBarButtonItem *space = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
@@ -319,7 +312,12 @@ WX_EXPORT_METHOD(@selector(blur))
         _placeholderColor = [UIColor colorWithRed:0x99/255.0 green:0x99/255.0 blue:0x99/255.0 alpha:1.0];
     }
     [self setPlaceholderAttributedString];
+    [self updatePattern];
     
+}
+
+-(void)updatePattern
+{
     UIEdgeInsets padding = UIEdgeInsetsMake(self.cssNode->style.padding[CSS_TOP], self.cssNode->style.padding[CSS_LEFT], self.cssNode->style.padding[CSS_BOTTOM], self.cssNode->style.padding[CSS_RIGHT]);
     if (!UIEdgeInsetsEqualToEdgeInsets(padding, _padding)) {
         [self setPadding:padding];


[45/50] [abbrv] incubator-weex git commit: Merge branch 'jsfm-feature-0.19' into dev-release095

Posted by ji...@apache.org.
Merge branch 'jsfm-feature-0.19' into dev-release095

# Conflicts:
#	circle.yml


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/9e54e4d8
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/9e54e4d8
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/9e54e4d8

Branch: refs/heads/master
Commit: 9e54e4d81a074d7c2eb144f201723301919bcc08
Parents: 1e837f3 d88375a
Author: sospartan <so...@gmail.com>
Authored: Wed Jan 11 17:06:43 2017 +0800
Committer: sospartan <so...@gmail.com>
Committed: Wed Jan 11 17:06:43 2017 +0800

----------------------------------------------------------------------
 .eslintrc                                       |   1 +
 build/build.js                                  | 225 +++----
 build/config.js                                 | 121 ++++
 build/rollup.browser.config.js                  |  38 --
 build/rollup.config.js                          |  34 --
 build/webpack.examples.config.js                |   6 +-
 circle.yml                                      |   3 +-
 dist/weex-html5/LICENSE                         | 201 -------
 dist/weex-html5/NOTICE                          |   7 -
 dist/weex-html5/README.md                       | 158 -----
 dist/weex-html5/demo/build/index.js             | 111 ----
 dist/weex-html5/demo/index.we                   |  29 -
 dist/weex-html5/index.html                      |  57 --
 dist/weex-html5/package.json                    |  23 -
 dist/weex-js-framework/LICENSE                  | 202 -------
 dist/weex-js-framework/NOTICE                   |   7 -
 dist/weex-js-framework/README.md                |   8 -
 dist/weex-js-framework/index.js                 |   1 -
 dist/weex-js-framework/package.json             |  39 --
 examples/vue/animation.vue                      |  24 +-
 examples/vue/components/a.vue                   |  12 +-
 examples/vue/components/countdown.vue           |  36 +-
 examples/vue/components/image.vue               |  10 +-
 examples/vue/components/input.vue               |  21 +-
 examples/vue/components/list.vue                |  73 +--
 examples/vue/components/marquee.vue             |  32 +-
 examples/vue/components/navigator.vue           |  20 +-
 examples/vue/components/scroller.vue            | 118 ++--
 examples/vue/components/slider.vue              | 160 ++---
 examples/vue/components/tabbar.vue              |  72 +--
 examples/vue/components/text.vue                |   2 +-
 examples/vue/components/video.vue               |  14 +-
 examples/vue/components/web.vue                 |   4 +-
 examples/vue/include/button.vue                 | 162 +++++
 examples/vue/include/countdown.vue              |  93 +++
 examples/vue/include/example-list-item.vue      |   2 +-
 examples/vue/include/hn.vue                     |  47 ++
 examples/vue/include/list-item.vue              |  46 ++
 examples/vue/include/marquee.vue                |  78 +++
 examples/vue/include/navbar.vue                 | 121 ++++
 examples/vue/include/navpage.vue                |  62 ++
 examples/vue/include/panel.vue                  | 141 +++++
 examples/vue/include/tabbar.vue                 |  92 +++
 examples/vue/include/tabitem.vue                |  63 ++
 examples/vue/include/tip.vue                    |  65 ++
 examples/vue/index.vue                          |  70 +--
 examples/vue/modules/clipboard.vue              |  29 +-
 examples/vue/modules/instance-api.vue           |   8 +-
 examples/vue/modules/modal.vue                  |  12 +-
 examples/vue/modules/storage.vue                |  16 +-
 examples/vue/modules/stream.vue                 |  24 +-
 examples/vue/showcase/calculator.vue            |  10 +-
 examples/vue/showcase/itemlist.vue              | 588 ++++++++++---------
 examples/vue/showcase/progress.vue              |  10 +-
 examples/vue/style/index.vue                    |   2 +-
 examples/vue/style/style-box.vue                |   4 +-
 examples/vue/style/style-flex.vue               |   2 +-
 examples/vue/syntax/hello-world.vue             |   1 +
 examples/vue/syntax/script-component.vue        |  14 +-
 examples/vue/syntax/script-data.vue             |  11 +-
 examples/vue/syntax/script-events.vue           |   7 +-
 examples/vue/syntax/script-instance.vue         |   8 +-
 examples/vue/syntax/script-lifecycle.vue        |   9 +-
 examples/vue/syntax/template-class.vue          |   1 +
 examples/vue/syntax/template-event.vue          |  10 +-
 examples/vue/syntax/template-if.vue             |   1 +
 examples/vue/syntax/template-repeat-update.vue  |  24 +-
 examples/vue/syntax/template-repeat.vue         |  36 +-
 examples/vue/syntax/template-style.vue          |   9 +-
 examples/vue/template.vue                       |  20 +-
 examples/vue/test.vue                           |  16 -
 examples/vue/test2.vue                          |   6 -
 html5/frameworks/index.js                       |   2 +
 html5/frameworks/legacy/api/methods.js          |  30 +-
 html5/frameworks/legacy/app/bundle/bootstrap.js |   6 +
 html5/frameworks/legacy/app/ctrl/init.js        | 118 ++--
 html5/frameworks/legacy/app/ctrl/misc.js        |  40 +-
 html5/frameworks/legacy/app/index.js            |   4 +-
 html5/frameworks/legacy/app/instance.js         |  18 +-
 html5/frameworks/legacy/app/register.js         |  25 +-
 html5/frameworks/legacy/app/viewport.js         |  38 ++
 html5/frameworks/legacy/static/create.js        |  13 +-
 html5/frameworks/vanilla/index.js               |  43 +-
 html5/render/native/index.js                    |   6 +-
 html5/runtime/callback-manager.js               |  37 ++
 html5/runtime/config.js                         |  17 +
 html5/runtime/handler.js                        |   2 +-
 html5/runtime/index.js                          |  32 +-
 html5/runtime/init.js                           |  87 ++-
 html5/runtime/service.js                        |  58 ++
 html5/runtime/task-center.js                    |  72 +++
 html5/runtime/vdom/document.js                  |   4 +-
 html5/runtime/vdom/element-types.js             |  65 ++
 html5/runtime/vdom/element.js                   | 149 +++--
 html5/runtime/vdom/index.js                     |   8 +-
 html5/runtime/vdom/operation.js                 |  29 +-
 html5/services/amd/index.js                     |  70 +++
 html5/services/broadcast-channel/index.js       | 106 ++++
 .../services/broadcast-channel/message-event.js |  21 +
 html5/services/index.js                         |   5 +
 html5/shared/setTimeout.js                      |   2 +
 .../case/basic/global-weex-object.output.js     |   6 +
 .../case/basic/global-weex-object.source.js     |  19 +
 html5/test/case/prepare.js                      |  10 +-
 html5/test/case/tester.js                       |  50 +-
 html5/test/unit/default/api/methods.js          |   6 +-
 html5/test/unit/default/app/bundle.js           |  30 +-
 html5/test/unit/default/app/ctrl.js             |  31 +-
 html5/test/unit/default/app/index.js            |  54 +-
 html5/test/unit/default/app/viewport.js         |  61 ++
 html5/test/unit/default/runtime.js              |  40 +-
 html5/test/unit/default/vm/dom-helper.js        |   9 +-
 html5/test/unit/default/vm/events.js            |  14 +-
 html5/test/unit/default/vm/vm.js                |  16 +-
 html5/test/unit/shared/BroadcastChannel.js      | 220 +++++++
 html5/test/unit/vanilla/index.js                |   3 -
 html5/test/unit/vdom/index.js                   |  76 ++-
 html5/test/unit/vdom/listener.js                |  34 +-
 package.json                                    |  31 +-
 119 files changed, 3370 insertions(+), 2236 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/9e54e4d8/circle.yml
----------------------------------------------------------------------
diff --cc circle.yml
index ee399e2,6ccabd5..37fd785
--- a/circle.yml
+++ b/circle.yml
@@@ -1,21 -1,12 +1,22 @@@
  machine:
 +  pre:
 +    - sudo service mongodb stop
 +    - sudo service mysql stop
 +    - sudo service postgresql stop
 +    - sudo service rabbitmq-server stop
 +    - sudo service couchdb stop
    node:
 -    version: 7
 +   version: 7
 +  java:
 +    version: 'oraclejdk8'
  test:
    override:
-    # - npm run test
+     - npm run build
+     - npm run test
 -    - npm run test:cover
 +    - cd android/playground && ./gradlew assembleDebug :weex_sdk:testDebugUnitTest -PdisableCov=true -PtargetSDK=19 -Dorg.gradle.daemon=true -Dorg.gradle.parallel=true -Dorg.gradle.jvmargs="-Xmx512m -XX:+HeapDumpOnOutOfMemoryError" -Dfile.encoding=UTF-8
    post:
 +    - cp -r android/playground/app/build/outputs $CIRCLE_ARTIFACTS/playground # playground artifacts
 +    - cp -r android/sdk/build/reports $CIRCLE_ARTIFACTS/sdk_reports
  
  dependencies:
    cache_directories:

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/9e54e4d8/package.json
----------------------------------------------------------------------
diff --cc package.json
index 21649af,bf85b7f..d4331be
--- a/package.json
+++ b/package.json
@@@ -76,14 -76,11 +78,15 @@@
      "modals": "^0.1.6",
      "scroll-to": "0.0.2",
      "semver": "^5.1.0",
-     "weex-vue-framework": "2.0.5-weex.1",
-     "weex-components": "^0.2.0"
+     "weex-components": "^0.2.0",
+     "weex-rax-framework": "0.1.0",
+     "weex-vue-framework": "2.1.8-weex.1"
    },
    "devDependencies": {
 +    "xml2map": "^1.0.2",
 +    "macaca-cli": "^1.1.0",
 +    "webdriver-client": "~1.0.0",
 +    "macaca-utils": "^0.1.9",
      "babel-core": "^6.17.0",
      "babel-istanbul": "^0.11.0",
      "babel-loader": "^6.2.5",


[34/50] [abbrv] incubator-weex git commit: * [android] new simplelist component (#137)

Posted by ji...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/5a700270/android/sdk/src/main/java/com/taobao/weex/ui/component/list/SimpleRecyclerView.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/SimpleRecyclerView.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/SimpleRecyclerView.java
new file mode 100644
index 0000000..1523717
--- /dev/null
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/SimpleRecyclerView.java
@@ -0,0 +1,329 @@
+/**
+ *
+ *                                  Apache License
+ *                            Version 2.0, January 2004
+ *                         http://www.apache.org/licenses/
+ *
+ *    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+ *
+ *    1. Definitions.
+ *
+ *       "License" shall mean the terms and conditions for use, reproduction,
+ *       and distribution as defined by Sections 1 through 9 of this document.
+ *
+ *       "Licensor" shall mean the copyright owner or entity authorized by
+ *       the copyright owner that is granting the License.
+ *
+ *       "Legal Entity" shall mean the union of the acting entity and all
+ *       other entities that control, are controlled by, or are under common
+ *       control with that entity. For the purposes of this definition,
+ *       "control" means (i) the power, direct or indirect, to cause the
+ *       direction or management of such entity, whether by contract or
+ *       otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ *       outstanding shares, or (iii) beneficial ownership of such entity.
+ *
+ *       "You" (or "Your") shall mean an individual or Legal Entity
+ *       exercising permissions granted by this License.
+ *
+ *       "Source" form shall mean the preferred form for making modifications,
+ *       including but not limited to software source code, documentation
+ *       source, and configuration files.
+ *
+ *       "Object" form shall mean any form resulting from mechanical
+ *       transformation or translation of a Source form, including but
+ *       not limited to compiled object code, generated documentation,
+ *       and conversions to other media types.
+ *
+ *       "Work" shall mean the work of authorship, whether in Source or
+ *       Object form, made available under the License, as indicated by a
+ *       copyright notice that is included in or attached to the work
+ *       (an example is provided in the Appendix below).
+ *
+ *       "Derivative Works" shall mean any work, whether in Source or Object
+ *       form, that is based on (or derived from) the Work and for which the
+ *       editorial revisions, annotations, elaborations, or other modifications
+ *       represent, as a whole, an original work of authorship. For the purposes
+ *       of this License, Derivative Works shall not include works that remain
+ *       separable from, or merely link (or bind by name) to the interfaces of,
+ *       the Work and Derivative Works thereof.
+ *
+ *       "Contribution" shall mean any work of authorship, including
+ *       the original version of the Work and any modifications or additions
+ *       to that Work or Derivative Works thereof, that is intentionally
+ *       submitted to Licensor for inclusion in the Work by the copyright owner
+ *       or by an individual or Legal Entity authorized to submit on behalf of
+ *       the copyright owner. For the purposes of this definition, "submitted"
+ *       means any form of electronic, verbal, or written communication sent
+ *       to the Licensor or its representatives, including but not limited to
+ *       communication on electronic mailing lists, source code control systems,
+ *       and issue tracking systems that are managed by, or on behalf of, the
+ *       Licensor for the purpose of discussing and improving the Work, but
+ *       excluding communication that is conspicuously marked or otherwise
+ *       designated in writing by the copyright owner as "Not a Contribution."
+ *
+ *       "Contributor" shall mean Licensor and any individual or Legal Entity
+ *       on behalf of whom a Contribution has been received by Licensor and
+ *       subsequently incorporated within the Work.
+ *
+ *    2. Grant of Copyright License. Subject to the terms and conditions of
+ *       this License, each Contributor hereby grants to You a perpetual,
+ *       worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ *       copyright license to reproduce, prepare Derivative Works of,
+ *       publicly display, publicly perform, sublicense, and distribute the
+ *       Work and such Derivative Works in Source or Object form.
+ *
+ *    3. Grant of Patent License. Subject to the terms and conditions of
+ *       this License, each Contributor hereby grants to You a perpetual,
+ *       worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ *       (except as stated in this section) patent license to make, have made,
+ *       use, offer to sell, sell, import, and otherwise transfer the Work,
+ *       where such license applies only to those patent claims licensable
+ *       by such Contributor that are necessarily infringed by their
+ *       Contribution(s) alone or by combination of their Contribution(s)
+ *       with the Work to which such Contribution(s) was submitted. If You
+ *       institute patent litigation against any entity (including a
+ *       cross-claim or counterclaim in a lawsuit) alleging that the Work
+ *       or a Contribution incorporated within the Work constitutes direct
+ *       or contributory patent infringement, then any patent licenses
+ *       granted to You under this License for that Work shall terminate
+ *       as of the date such litigation is filed.
+ *
+ *    4. Redistribution. You may reproduce and distribute copies of the
+ *       Work or Derivative Works thereof in any medium, with or without
+ *       modifications, and in Source or Object form, provided that You
+ *       meet the following conditions:
+ *
+ *       (a) You must give any other recipients of the Work or
+ *           Derivative Works a copy of this License; and
+ *
+ *       (b) You must cause any modified files to carry prominent notices
+ *           stating that You changed the files; and
+ *
+ *       (c) You must retain, in the Source form of any Derivative Works
+ *           that You distribute, all copyright, patent, trademark, and
+ *           attribution notices from the Source form of the Work,
+ *           excluding those notices that do not pertain to any part of
+ *           the Derivative Works; and
+ *
+ *       (d) If the Work includes a "NOTICE" text file as part of its
+ *           distribution, then any Derivative Works that You distribute must
+ *           include a readable copy of the attribution notices contained
+ *           within such NOTICE file, excluding those notices that do not
+ *           pertain to any part of the Derivative Works, in at least one
+ *           of the following places: within a NOTICE text file distributed
+ *           as part of the Derivative Works; within the Source form or
+ *           documentation, if provided along with the Derivative Works; or,
+ *           within a display generated by the Derivative Works, if and
+ *           wherever such third-party notices normally appear. The contents
+ *           of the NOTICE file are for informational purposes only and
+ *           do not modify the License. You may add Your own attribution
+ *           notices within Derivative Works that You distribute, alongside
+ *           or as an addendum to the NOTICE text from the Work, provided
+ *           that such additional attribution notices cannot be construed
+ *           as modifying the License.
+ *
+ *       You may add Your own copyright statement to Your modifications and
+ *       may provide additional or different license terms and conditions
+ *       for use, reproduction, or distribution of Your modifications, or
+ *       for any such Derivative Works as a whole, provided Your use,
+ *       reproduction, and distribution of the Work otherwise complies with
+ *       the conditions stated in this License.
+ *
+ *    5. Submission of Contributions. Unless You explicitly state otherwise,
+ *       any Contribution intentionally submitted for inclusion in the Work
+ *       by You to the Licensor shall be under the terms and conditions of
+ *       this License, without any additional terms or conditions.
+ *       Notwithstanding the above, nothing herein shall supersede or modify
+ *       the terms of any separate license agreement you may have executed
+ *       with Licensor regarding such Contributions.
+ *
+ *    6. Trademarks. This License does not grant permission to use the trade
+ *       names, trademarks, service marks, or product names of the Licensor,
+ *       except as required for reasonable and customary use in describing the
+ *       origin of the Work and reproducing the content of the NOTICE file.
+ *
+ *    7. Disclaimer of Warranty. Unless required by applicable law or
+ *       agreed to in writing, Licensor provides the Work (and each
+ *       Contributor provides its Contributions) on an "AS IS" BASIS,
+ *       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ *       implied, including, without limitation, any warranties or conditions
+ *       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ *       PARTICULAR PURPOSE. You are solely responsible for determining the
+ *       appropriateness of using or redistributing the Work and assume any
+ *       risks associated with Your exercise of permissions under this License.
+ *
+ *    8. Limitation of Liability. In no event and under no legal theory,
+ *       whether in tort (including negligence), contract, or otherwise,
+ *       unless required by applicable law (such as deliberate and grossly
+ *       negligent acts) or agreed to in writing, shall any Contributor be
+ *       liable to You for damages, including any direct, indirect, special,
+ *       incidental, or consequential damages of any character arising as a
+ *       result of this License or out of the use or inability to use the
+ *       Work (including but not limited to damages for loss of goodwill,
+ *       work stoppage, computer failure or malfunction, or any and all
+ *       other commercial damages or losses), even if such Contributor
+ *       has been advised of the possibility of such damages.
+ *
+ *    9. Accepting Warranty or Additional Liability. While redistributing
+ *       the Work or Derivative Works thereof, You may choose to offer,
+ *       and charge a fee for, acceptance of support, warranty, indemnity,
+ *       or other liability obligations and/or rights consistent with this
+ *       License. However, in accepting such obligations, You may act only
+ *       on Your own behalf and on Your sole responsibility, not on behalf
+ *       of any other Contributor, and only if You agree to indemnify,
+ *       defend, and hold each Contributor harmless for any liability
+ *       incurred by, or claims asserted against, such Contributor by reason
+ *       of your accepting any such warranty or additional liability.
+ *
+ *    END OF TERMS AND CONDITIONS
+ *
+ *    APPENDIX: How to apply the Apache License to your work.
+ *
+ *       To apply the Apache License to your work, attach the following
+ *       boilerplate notice, with the fields enclosed by brackets "[]"
+ *       replaced with your own identifying information. (Don't include
+ *       the brackets!)  The text should be enclosed in the appropriate
+ *       comment syntax for the file format. We also recommend that a
+ *       file or class name and description of purpose be included on the
+ *       same "printed page" as the copyright notice for easier
+ *       identification within third-party archives.
+ *
+ *    Copyright 2016 Alibaba Group
+ *
+ *    Licensed 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.ui.component.list;
+
+import android.content.Context;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.taobao.weex.common.WXThread;
+import com.taobao.weex.ui.component.WXComponent;
+import com.taobao.weex.ui.view.listview.WXRecyclerView;
+import com.taobao.weex.ui.view.listview.adapter.RecyclerViewBaseAdapter;
+
+import java.util.Stack;
+
+/**
+ * Created by sospartan on 13/12/2016.
+ */
+
+class SimpleRecyclerView extends WXRecyclerView implements ListComponentView{
+  private RecyclerViewBaseAdapter mAdapter = null;
+  private Stack<View> headerViewStack = new Stack<>();
+  private Stack<WXCell> headComponentStack = new Stack<>();
+
+  public SimpleRecyclerView(Context context) {
+    super(context);
+  }
+
+  @Override
+  public WXRecyclerView getInnerView() {
+    return this;
+  }
+
+  @Override
+  public void setRecyclerViewBaseAdapter(RecyclerViewBaseAdapter adapter) {
+    setAdapter(adapter);
+    this.mAdapter = adapter;
+  }
+
+  /**
+   * @param component
+   */
+  public void notifyStickyShow(WXCell component) {
+    if (component == null)
+      return;
+    if (!headComponentStack.isEmpty()) {
+      WXCell oldCom = headComponentStack.pop();
+      if (!oldCom.getRef().equals(component.getRef())) {
+        headComponentStack.push(oldCom);
+        headComponentStack.push(component);
+        showSticky();
+      } else {
+        headComponentStack.push(oldCom);
+        return;
+      }
+    } else {
+      headComponentStack.push(component);
+      showSticky();
+    }
+  }
+
+  /**
+   * @param component
+   */
+  public void notifyStickyRemove(WXCell component) {
+    if (component == null)
+      return;
+    if (!headComponentStack.isEmpty() && !headerViewStack.isEmpty()) {
+      removeSticky(component);
+    }
+  }
+
+  /**
+   * Pop stickyView to stack
+   */
+  private void showSticky() {
+    WXCell headComponent = headComponentStack.pop();
+    headComponentStack.push(headComponent);
+    final View headerView = headComponent.getRealView();
+    if (headerView == null)
+      return;
+    headerViewStack.push(headerView);
+    headComponent.removeSticky();
+    final ViewGroup parent = (ViewGroup) getParent();
+    if(parent != null){
+      parent.post(WXThread.secure(new Runnable() {
+        @Override
+        public void run() {
+          ViewGroup existedParent;
+          if((existedParent = (ViewGroup)headerView.getParent())!= null){
+            existedParent.removeView(headerView);
+          }
+          parent.addView(headerView);
+        }
+      }));
+    }
+  }
+
+  /**
+   * remove top stickyView
+   * @param component
+   */
+  private void removeSticky(WXComponent component) {
+    final WXCell headComponent = headComponentStack.pop();
+    if (!component.getRef().equals(headComponent.getRef())) {
+      headComponentStack.push(headComponent);
+      return;
+    }
+    final View headerView = headerViewStack.pop();
+    final ViewGroup parent = (ViewGroup) getParent();
+    if(parent != null){
+      parent.post(WXThread.secure(new Runnable() {
+        @Override
+        public void run() {
+          parent.removeView(headerView);
+          headComponent.recoverySticky();
+        }
+      }));
+    }
+
+  }
+
+  @Override
+  public RecyclerViewBaseAdapter getRecyclerViewBaseAdapter() {
+    return mAdapter;
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/5a700270/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXListComponent.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXListComponent.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXListComponent.java
index 93e7e83..3e68de1 100755
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXListComponent.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXListComponent.java
@@ -204,61 +204,19 @@
  */
 package com.taobao.weex.ui.component.list;
 
-import android.annotation.TargetApi;
 import android.content.Context;
-import android.graphics.Color;
-import android.graphics.PointF;
-import android.os.Build;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.util.ArrayMap;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
-import android.text.TextUtils;
-import android.util.SparseArray;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewTreeObserver;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
 
-import com.taobao.weex.WXEnvironment;
 import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.annotation.Component;
-import com.taobao.weex.annotation.JSMethod;
-import com.taobao.weex.common.Constants;
-import com.taobao.weex.common.OnWXScrollListener;
-import com.taobao.weex.common.WXRuntimeException;
 import com.taobao.weex.dom.WXDomObject;
-import com.taobao.weex.ui.component.AppearanceHelper;
-import com.taobao.weex.ui.component.Scrollable;
 import com.taobao.weex.ui.component.WXBaseRefresh;
 import com.taobao.weex.ui.component.WXComponent;
-import com.taobao.weex.ui.component.WXComponentProp;
 import com.taobao.weex.ui.component.WXLoading;
 import com.taobao.weex.ui.component.WXRefresh;
 import com.taobao.weex.ui.component.WXVContainer;
-import com.taobao.weex.ui.component.helper.WXStickyHelper;
-import com.taobao.weex.ui.view.listview.WXRecyclerView;
-import com.taobao.weex.ui.view.listview.adapter.IOnLoadMoreListener;
-import com.taobao.weex.ui.view.listview.adapter.IRecyclerAdapterListener;
 import com.taobao.weex.ui.view.listview.adapter.ListBaseViewHolder;
-import com.taobao.weex.ui.view.listview.adapter.RecyclerViewBaseAdapter;
-import com.taobao.weex.ui.view.listview.adapter.TransformItemDecoration;
-import com.taobao.weex.ui.view.listview.adapter.WXRecyclerViewOnScrollListener;
 import com.taobao.weex.ui.view.refresh.wrapper.BounceRecyclerView;
 import com.taobao.weex.utils.WXLogUtils;
-import com.taobao.weex.utils.WXUtils;
-import com.taobao.weex.utils.WXViewUtils;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 /**
  * Unlike other components, there is immutable bi-directional association between View and
@@ -269,909 +227,113 @@ import java.util.regex.Pattern;
  */
 @Component(lazyload = false)
 
-public class WXListComponent extends WXVContainer<BounceRecyclerView> implements
-        IRecyclerAdapterListener<ListBaseViewHolder>,IOnLoadMoreListener,Scrollable {
-
-  public static final String TRANSFORM = "transform";
-  public static final String LOADMOREOFFSET = "loadmoreoffset";
+public class WXListComponent extends BasicListComponent<BounceRecyclerView> {
   private String TAG = "WXListComponent";
-  private int mListCellCount = 0;
-  private String mLoadMoreRetry = "";
-  private ArrayList<ListBaseViewHolder> recycleViewList = new ArrayList<>();
-  private static final Pattern transformPattern = Pattern.compile("([a-z]+)\\(([0-9\\.]+),?([0-9\\.]+)?\\)");
-
-  private Map<String, AppearanceHelper> mAppearComponents = new HashMap<>();
-
-  private boolean scrollable = true;
-  private ArrayMap<String, Long> mRefToViewType;
-  private SparseArray<ArrayList<WXComponent>> mViewTypes;
-  protected BounceRecyclerView bounceRecyclerView;
-  private WXRecyclerViewOnScrollListener mViewOnScrollListener = new WXRecyclerViewOnScrollListener(this);
-
-  private static final int MAX_VIEWTYPE_ALLOW_CACHE = 9;
-  private static boolean mAllowCacheViewHolder = true;
-  private static boolean mDownForBidCacheViewHolder = false;
-
-  /**
-   * Map for storing component that is sticky.
-   **/
-  private Map<String, HashMap<String, WXComponent>> mStickyMap = new HashMap<>();
-  private WXStickyHelper stickyHelper;
 
   @Deprecated
   public WXListComponent(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, String instanceId, boolean isLazy) {
-    this(instance,dom,parent,isLazy);
+    this(instance, dom, parent, isLazy);
   }
 
-    public WXListComponent(WXSDKInstance instance, WXDomObject node, WXVContainer parent, boolean lazy) {
-        super(instance, node, parent, lazy);
-        stickyHelper = new WXStickyHelper(this);
-    }
-
-    /**
-     * Measure the size of the recyclerView.
-     *
-     * @param width  the expected width
-     * @param height the expected height
-     * @return the result of measurement
-     */
-    @Override
-    protected MeasureOutput measure(int width, int height) {
-        int screenH = WXViewUtils.getScreenHeight(WXEnvironment.sApplication);
-        int weexH = WXViewUtils.getWeexHeight(getInstanceId());
-        int outHeight = height > (weexH >= screenH ? screenH : weexH) ? weexH - getAbsoluteY() : height;
-        return super.measure(width, outHeight);
-    }
-
-    protected int getOrientation(){
-        return Constants.Orientation.VERTICAL;
-    }
-
-    @Override
-    public void destroy() {
-        super.destroy();
-        if (mStickyMap != null)
-            mStickyMap.clear();
-        if (mViewTypes != null)
-            mViewTypes.clear();
-        if (mRefToViewType != null)
-            mRefToViewType.clear();
-    }
-
-  @Override
-  public ViewGroup.LayoutParams getChildLayoutParams(WXComponent child,View hostView, int width, int height, int left, int right, int top, int bottom) {
-    ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) hostView.getLayoutParams();
-    if(child instanceof WXBaseRefresh && params == null) {
-      params = new LinearLayout.LayoutParams(width,height);
-    }else if(params == null) {
-      params = new RecyclerView.LayoutParams(width, height);
-    }else {
-      params.width = width;
-      params.height = height;
-      params.setMargins(left, 0, right, 0);
-    }
-    return params;
-  }
-
-  /**
-   * These transform functions are supported:
-   - `scale(x,y)`: scale item, x and y should be a positive float number.
-   - `translate(x,y)`: translate item, `x` and `y` shoule be integer numbers.
-   - `opacity(n)`: change the transparency of item, `n` must in `[0,1.0]`.
-   - `rotate(n)`: rotate item, n is integer number.
-   * @param raw
-   * @return
-   */
-    private RecyclerView.ItemDecoration parseTransforms(String raw){
-        if(raw == null){
-            return null;
-        }
-        float scaleX = 0f,scaleY = 0f;
-        int translateX = 0,translateY = 0;
-        float opacity = 0f;
-        int rotate = 0;
-            //public TransformItemDecoration(boolean isVertical,float alpha,int translateX,int translateY,int rotation,float scale)
-        Matcher matcher = transformPattern.matcher(raw);
-        while(matcher.find()){
-            String match = matcher.group();
-            String name = matcher.group(1);
-            try {
-                switch (name) {
-                    case "scale":
-                        scaleX = Float.parseFloat(matcher.group(2));
-                        scaleY = Float.parseFloat(matcher.group(3));
-                        break;
-                    case "translate":
-                        translateX = Integer.parseInt(matcher.group(2));
-                        translateY = Integer.parseInt(matcher.group(3));
-                        break;
-                    case "opacity":
-                        opacity = Float.parseFloat(matcher.group(2));
-                        break;
-                    case "rotate":
-                        rotate = Integer.parseInt(matcher.group(2));
-                        break;
-                    default:
-                        WXLogUtils.e(TAG, "Invaild transform expression:" + match);
-                        break;
-                }
-            }catch (NumberFormatException e){
-                WXLogUtils.e("", e);
-                WXLogUtils.e(TAG, "Invaild transform expression:" + match);
-            }
-        }
-        return new TransformItemDecoration(getOrientation() == Constants.Orientation.VERTICAL, opacity, translateX, translateY, rotate, scaleX, scaleY);
-    }
-
-    @Override
-    protected BounceRecyclerView initComponentHostView(@NonNull Context context) {
-        bounceRecyclerView = new BounceRecyclerView(context, getOrientation());
-
-        String transforms = (String) getDomObject().getAttrs().get(TRANSFORM);
-        if (transforms != null) {
-            bounceRecyclerView.getInnerView().addItemDecoration(parseTransforms(transforms));
-        }
-
-        RecyclerViewBaseAdapter recyclerViewBaseAdapter = new RecyclerViewBaseAdapter<>(this);
-        recyclerViewBaseAdapter.setHasStableIds(true);
-        bounceRecyclerView.setAdapter(recyclerViewBaseAdapter);
-        bounceRecyclerView.setOverScrollMode(View.OVER_SCROLL_NEVER);
-        bounceRecyclerView.getInnerView().clearOnScrollListeners();
-        bounceRecyclerView.getInnerView().addOnScrollListener(mViewOnScrollListener);
-        bounceRecyclerView.getInnerView().addOnScrollListener(new RecyclerView.OnScrollListener() {
-            @Override
-            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
-              super.onScrollStateChanged(recyclerView, newState);
-
-                    if(newState == RecyclerView.SCROLL_STATE_IDLE ){
-                    for(ListBaseViewHolder holder:recycleViewList){
-                        if(holder!=null
-                                && holder.getComponent()!=null
-                                && !holder.getComponent().isUsing()) {
-                            recycleImage(holder.getView());
-                        }
-                    }
-                    recycleViewList.clear();
-                }
-              List<OnWXScrollListener> listeners = getInstance().getWXScrollListeners();
-              if (listeners != null && listeners.size() > 0) {
-                for (OnWXScrollListener listener : listeners) {
-                  if (listener != null) {
-                    View topView = recyclerView.getChildAt(0);
-                    if (topView != null) {
-                      int y = topView.getTop();
-                      listener.onScrollStateChanged(recyclerView, 0, y, newState);
-                    }
-                  }
-                }
-              }
-            }
-
-            @Override
-            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
-                super.onScrolled(recyclerView, dx, dy);
-                List<OnWXScrollListener> listeners = getInstance().getWXScrollListeners();
-                if(listeners!=null && listeners.size()>0){
-                    for (OnWXScrollListener listener : listeners) {
-                        if (listener != null) {
-                            listener.onScrolled(recyclerView, dx, dy);
-                        }
-                    }
-                }
-            }
-        });
-      bounceRecyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
-        @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
-        @Override
-        public void onGlobalLayout() {
-          mViewOnScrollListener.onScrolled(bounceRecyclerView.getInnerView(),0,0);
-          View view;
-          if((view = getHostView()) == null)
-            return;
-          if(Build.VERSION.SDK_INT >=  Build.VERSION_CODES.JELLY_BEAN) {
-            view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
-          }else{
-            view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
-          }
-        }
-      });
-      return bounceRecyclerView;
-    }
-
-  @Override
-  public void bindStickStyle(WXComponent component) {
-      stickyHelper.bindStickStyle(component,mStickyMap);
+  public WXListComponent(WXSDKInstance instance, WXDomObject node, WXVContainer parent, boolean lazy) {
+    super(instance, node, parent);
   }
 
   @Override
-  public void unbindStickStyle(WXComponent component) {
-      stickyHelper.unbindStickStyle(component,mStickyMap);
-  }
-
-  private @Nullable WXComponent findDirectListChild(WXComponent comp){
-    WXComponent parent;
-    if(comp == null || (parent = comp.getParent()) == null){
-      return null;
-    }
-
-    if(parent instanceof WXListComponent){
-      return comp;
-    }
-
-    return findDirectListChild(parent);
+  protected BounceRecyclerView generateListView(Context context, int orientation) {
+    return new BounceRecyclerView(context, orientation);
   }
 
   @Override
-  protected boolean setProperty(String key, Object param) {
-    switch (key){
-      case LOADMOREOFFSET:
-        return true;
-      case Constants.Name.SCROLLABLE:
-        boolean scrollable = WXUtils.getBoolean(param, true);
-        setScrollable(scrollable);
-        return true;
-    }
-    return super.setProperty(key, param);
-  }
-
-  @WXComponentProp(name = Constants.Name.SCROLLABLE)
-  public void setScrollable(boolean scrollable) {
-      View inner = getHostView().getInnerView();
-      if(inner instanceof WXRecyclerView) {
-          ((WXRecyclerView) inner).setScrollable(scrollable);
-      };
-  }
-
-  private void setAppearanceWatch(WXComponent component, int event, boolean enable) {
-    AppearanceHelper item = mAppearComponents.get(component.getRef());
-    if (item != null) {
-      item.setWatchEvent(event, enable);
-    } else if (!enable) {
-      //Do nothing if disable target not exist.
-    } else {
-      WXComponent dChild = findDirectListChild(component);
-      int index = mChildren.indexOf(dChild);
-      if (index != -1) {
-        item = new AppearanceHelper(component, index);
-        item.setWatchEvent(event, true);
-        mAppearComponents.put(component.getRef(), item);
-      }
+  public void addChild(WXComponent child, int index) {
+    super.addChild(child, index);
+    if (child == null || index < -1) {
+      return;
     }
+    setRefreshOrLoading(child);
   }
 
-  @Override
-  public void bindAppearEvent(WXComponent component) {
-    setAppearanceWatch(component, AppearanceHelper.APPEAR,true);
-  }
-
-  @Override
-  public void bindDisappearEvent(WXComponent component) {
-    setAppearanceWatch(component, AppearanceHelper.DISAPPEAR,true);
-  }
-
-  @Override
-  public void unbindAppearEvent(WXComponent component) {
-    setAppearanceWatch(component, AppearanceHelper.APPEAR,false);
-  }
-
-  @Override
-  public void unbindDisappearEvent(WXComponent component) {
-    setAppearanceWatch(component, AppearanceHelper.DISAPPEAR,false);
-  }
 
-  @Override
-  public void scrollTo(WXComponent component,final int offset) {
-    if(bounceRecyclerView == null){
-      return;
-    }
+  /**
+   * Setting refresh view and loading view
+   *
+   * @param child the refresh_view or loading_view
+   */
+  private boolean setRefreshOrLoading(final WXComponent child) {
 
-    WXComponent parent = component;
-    WXCell cell = null;
-    while(parent != null){
-      if(parent instanceof WXCell){
-        cell = (WXCell) parent;
-        break;
-      }
-      parent = parent.getParent();
+    if (getHostView() == null) {
+      WXLogUtils.e(TAG, "setRefreshOrLoading: HostView == null !!!!!! check list attr has append =tree");
+      return true;
     }
-    if(cell !=null){
-      int pos = mChildren.indexOf(cell);
-      final WXRecyclerView view = bounceRecyclerView.getInnerView();
-      view.scrollToPosition(pos);
-      final WXComponent cellComp = cell;
-      //scroll cell to top
-      view.postDelayed(new Runnable() {
+    if (child instanceof WXRefresh) {
+      getHostView().setOnRefreshListener((WXRefresh) child);
+      getHostView().postDelayed(new Runnable() {
         @Override
         public void run() {
-          if(cellComp.getHostView() == null){
-            return;
-          }
-          View cellView = cellComp.getHostView();
-          if(getOrientation() == Constants.Orientation.VERTICAL){
-            int scrollY = cellView.getTop()+offset;
-            view.smoothScrollBy(0,scrollY );
-          }else{
-            int  scrollX = cellView.getLeft()+offset;
-            view.smoothScrollBy(scrollX,0);
-          }
+          getHostView().setHeaderView(child);
         }
-      },50);
-
+      }, 100);
+      return true;
     }
 
-  }
-
-    @Override
-    public void onBeforeScroll(int dx, int dy) {
-      if (mStickyMap == null) {
-        return;
-      }
-      HashMap<String, WXComponent> stickyMap = mStickyMap.get(getRef());
-      if (stickyMap == null) {
-        return;
-      }
-      Iterator<Map.Entry<String, WXComponent>> iterator = stickyMap.entrySet().iterator();
-      Map.Entry<String, WXComponent> entry;
-      WXComponent stickyComponent;
-      while (iterator.hasNext()) {
-        entry = iterator.next();
-        stickyComponent = entry.getValue();
-
-        if (stickyComponent != null && stickyComponent.getDomObject() != null
-            && stickyComponent instanceof WXCell) {
-
-          WXCell cell = (WXCell) stickyComponent;
-          if (cell.getHostView() == null) {
-            return;
-          }
-
-          if (stickyComponent != null && stickyComponent.getDomObject() != null
-              && stickyComponent instanceof WXCell) {
-            if (stickyComponent.getHostView() == null) {
-              return;
-            }
-
-            RecyclerView.LayoutManager layoutManager;
-            boolean beforeFirstVisibleItem = false;
-            if ((layoutManager = getHostView().getInnerView().getLayoutManager()) instanceof LinearLayoutManager) {
-              int fVisible = ((LinearLayoutManager) layoutManager).findFirstVisibleItemPosition();
-              int pos = mChildren.indexOf(cell);
-
-              if (pos <= fVisible) {
-                beforeFirstVisibleItem = true;
-              }
-            }
-
-            int[] location = new int[2];
-            stickyComponent.getHostView().getLocationOnScreen(location);
-            int[] parentLocation = new int[2];
-            stickyComponent.getParentScroller().getView().getLocationOnScreen(parentLocation);
-
-            int top = location[1] - parentLocation[1];
-
-            boolean showSticky = beforeFirstVisibleItem && cell.getLocationFromStart() >= 0 && top <= 0 && dy >= 0;
-            boolean removeSticky = cell.getLocationFromStart() <= 0 && top > 0 && dy <= 0;
-            if (showSticky) {
-              bounceRecyclerView.notifyStickyShow(cell);
-            } else if (removeSticky) {
-              bounceRecyclerView.notifyStickyRemove(cell);
-            }
-            cell.setLocationFromStart(top);
-          }
+    if (child instanceof WXLoading) {
+      getHostView().setOnLoadingListener((WXLoading) child);
+      getHostView().postDelayed(new Runnable() {
+        @Override
+        public void run() {
+          getHostView().setFooterView(child);
         }
-      }
+      }, 100);
+      return true;
     }
 
-  @Override
-  public int getScrollY() {
-    return bounceRecyclerView == null?0:bounceRecyclerView.getInnerView().getScrollY();
-  }
-
-  @Override
-  public int getScrollX() {
-    return bounceRecyclerView == null?0:bounceRecyclerView.getInnerView().getScrollX();
-  }
-
-  /**
-    * Append a child component to the end of WXListComponent. This will not refresh the underlying
-    * view immediately. The message of index of the inserted child is given to the adapter, and the
-    * adapter will determine when to refresh. The default implementation of adapter will push the
-    * message into a message and refresh the view in a period of time.
-    *
-    * @param child the inserted child
-    */
-  @Override
-  public void addChild(WXComponent child) {
-      addChild(child, -1);
-  }
-
-  @Override
-  protected int getChildrenLayoutTopOffset() {
-    return 0;
-  }
-
-  /**
-  * @param child the inserted child
-  * @param index the index of the child to be inserted.
-  * @see #addChild(WXComponent)
-  */
-  @Override
-  public void addChild(WXComponent child, int index) {
-    super.addChild(child,index);
-
-    if (child == null || index < -1) {
-        return;
-    }
-    setRefreshOrLoading(child);
-    int count = mChildren.size();
-    index = index >= count ? -1 : index;
-    bindViewType(child);
-
-    int adapterPosition = index == -1 ? mChildren.size() - 1 : index;
-    BounceRecyclerView view = getHostView();
-    if (view != null) {
-      view.getAdapter().notifyItemInserted(adapterPosition);
-    }
-    relocateAppearanceHelper();
+    return false;
   }
 
   @Override
   public void createChildViewAt(int index) {
     int indexToCreate = index;
-    if(indexToCreate < 0){
-      indexToCreate = childCount()-1;
-      if(indexToCreate < 0 ){
+    if (indexToCreate < 0) {
+      indexToCreate = childCount() - 1;
+      if (indexToCreate < 0) {
         return;
       }
     }
     final WXComponent child = getChild(indexToCreate);
-    if(child instanceof WXBaseRefresh){
+    if (child instanceof WXBaseRefresh) {
       child.createView();
       if (child instanceof WXRefresh) {
-        getHostView().setOnRefreshListener((WXRefresh)child);
+        getHostView().setOnRefreshListener((WXRefresh) child);
         getHostView().postDelayed(new Runnable() {
           @Override
           public void run() {
             getHostView().setHeaderView(child);
           }
-        },100);
-      }else if (child instanceof WXLoading) {
-        getHostView().setOnLoadingListener((WXLoading)child);
+        }, 100);
+      } else if (child instanceof WXLoading) {
+        getHostView().setOnLoadingListener((WXLoading) child);
         getHostView().postDelayed(new Runnable() {
           @Override
           public void run() {
             getHostView().setFooterView(child);
           }
-        },100);
+        }, 100);
       }
-    }else {
+    } else {
       super.createChildViewAt(indexToCreate);
     }
   }
 
-  private void relocateAppearanceHelper() {
-    Iterator<Map.Entry<String, AppearanceHelper>> iterator = mAppearComponents.entrySet().iterator();
-    while(iterator.hasNext()){
-      Map.Entry<String, AppearanceHelper> item = iterator.next();
-      AppearanceHelper value = item.getValue();
-      WXComponent dChild = findDirectListChild(value.getAwareChild());
-      int index = mChildren.indexOf(dChild);
-      value.setCellPosition(index);
-    }
+  public void remove(WXComponent child, boolean destroy) {
+    super.remove(child, destroy);
+    removeFooterOrHeader(child);
   }
 
-  /**
-     * Setting refresh view and loading view
-     * @param child the refresh_view or loading_view
-     */
-    private boolean setRefreshOrLoading(final WXComponent child) {
-
-        if(getHostView() == null){
-            WXLogUtils.e(TAG, "setRefreshOrLoading: HostView == null !!!!!! check list attr has append =tree");
-            return true;
-        }
-        if (child instanceof WXRefresh) {
-            getHostView().setOnRefreshListener((WXRefresh)child);
-            getHostView().postDelayed(new Runnable() {
-                @Override
-                public void run() {
-                    getHostView().setHeaderView(child);
-                }
-            },100);
-            return true;
-        }
-
-        if (child instanceof WXLoading) {
-            getHostView().setOnLoadingListener((WXLoading)child);
-            getHostView().postDelayed(new Runnable() {
-                @Override
-                public void run() {
-                    getHostView().setFooterView(child);
-                }
-            },100);
-            return true;
-        }
-
-        return false;
-    }
-
-    /**
-     * RecyclerView manage its children in a way that different from {@link WXVContainer}. Therefore,
-     * {@link WXVContainer#addSubView(View, int)} is an empty implementation in {@link
-     * com.taobao.weex.ui.view.listview.WXRecyclerView}
-     */
-    @Override
-    protected void addSubView(View child, int index) {
-
-    }
-
-    /**
-     * Remove the child from WXListComponent. This method will use {@link
-     * java.util.List#indexOf(Object)} to retrieve the component to be deleted. Like {@link
-     * #addChild(WXComponent)}, this method will not refresh the view immediately, the adapter will
-     * decide when to refresh.
-     *
-     * @param child the child to be removed
-     */
-    @Override
-    public void remove(WXComponent child, boolean destroy) {
-      int index = mChildren.indexOf(child);
-      if (destroy) {
-        child.detachViewAndClearPreInfo();
-      }
-      unBindViewType(child);
-
-      BounceRecyclerView view = getHostView();
-      if(view == null){
-        return;
-      }
-      view.getAdapter().notifyItemRemoved(index);
-      if (WXEnvironment.isApkDebugable()) {
-        WXLogUtils.d(TAG, "removeChild child at " + index);
-      }
-      super.remove(child, destroy);
-      if (child instanceof WXLoading) {
-        getHostView().removeFooterView(child);
-      } else if (child instanceof WXRefresh) {
-        getHostView().removeHeaderView(child);
-      }
-    }
-
-    @Override
-    public void computeVisiblePointInViewCoordinate(PointF pointF) {
-      RecyclerView view = getHostView().getInnerView();
-      pointF.set(view.computeHorizontalScrollOffset(), view.computeVerticalScrollOffset());
-    }
-
-    /**
-     * Recycle viewHolder and its underlying view. This may because the view is removed or reused.
-     * Either case, this method will be called.
-     *
-     * @param holder The view holder to be recycled.
-     */
-    @Override
-    public void onViewRecycled(ListBaseViewHolder holder) {
-        long begin=System.currentTimeMillis();
-        holder.setComponentUsing(false);
-        recycleViewList.add(holder);
-        if(WXEnvironment.isApkDebugable()) {
-            WXLogUtils.d(TAG, "Recycle holder " + (System.currentTimeMillis() - begin) + "  Thread:" + Thread.currentThread().getName());
-        }
-    }
-
-    /**
-     * Bind the component of the position to the holder. Then flush the view.
-     *
-     * @param holder   viewHolder, which holds reference to the view
-     * @param position position of component in WXListComponent
-     */
-    @Override
-    public void onBindViewHolder(ListBaseViewHolder holder, int position) {
-        if (holder == null) return;
-        holder.setComponentUsing(true);
-        WXComponent component = getChild(position);
-        if ( component == null
-                || (component instanceof WXRefresh)
-                || (component instanceof WXLoading)
-                || (component.getDomObject()!=null && component.getDomObject().isFixed())
-                ) {
-            if(WXEnvironment.isApkDebugable()) {
-                WXLogUtils.d(TAG, "Bind WXRefresh & WXLoading " + holder);
-            }
-            return;
-        }
-
-        if (holder.getComponent() != null && holder.getComponent() instanceof WXCell) {
-                holder.getComponent().bindData(component);
-//              holder.getComponent().refreshData(component);
-        }
-
-    }
-
-    /**
-     * Create an instance of {@link ListBaseViewHolder} for the given viewType (not for the given
-     * index). This method will look up for the first component that fits the viewType requirement and
-     * doesn't be used. Then create the certain type of view, detach the view f[rom the component.
-     *
-     * @param parent   the ViewGroup into which the new view will be inserted
-     * @param viewType the type of the new view
-     * @return the created view holder.
-     */
-    @Override
-    public ListBaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
-        if (mChildren != null) {
-            if (mViewTypes == null)
-                return createVHForFakeComponent(viewType);
-            ArrayList<WXComponent> mTypes = mViewTypes.get(viewType);
-            checkRecycledViewPool(viewType);
-            if (mTypes == null)
-                return createVHForFakeComponent(viewType);
-
-            for (int i = 0; i < mTypes.size(); i++) {
-                WXComponent component = mTypes.get(i);
-                if (component == null
-                        || component.isUsing()) {
-                    continue;
-                }
-                if (component.getDomObject()!=null && component.getDomObject().isFixed()) {
-                    return createVHForFakeComponent(viewType);
-                } else {
-                    if (component instanceof WXCell) {
-                        if (component.getRealView() != null) {
-                            return new ListBaseViewHolder(component, viewType);
-                        } else {
-                            ((WXCell)component).lazy(false);
-                            component.createView();
-                            component.applyLayoutAndEvent(component);
-                            return new ListBaseViewHolder(component, viewType);
-                        }
-                    } else if (component instanceof WXBaseRefresh){
-                      return createVHForRefreshComponent(viewType);
-                    }else {
-                        WXLogUtils.e(TAG, "List cannot include element except cell\u3001header\u3001fixed\u3001refresh and loading");
-                        return createVHForFakeComponent(viewType);
-                    }
-                }
-            }
-        }
-        if(WXEnvironment.isApkDebugable()) {
-            WXLogUtils.e(TAG, "Cannot find request viewType: " + viewType);
-        }
-        return createVHForFakeComponent(viewType);
-    }
-
-    /**
-     * Forbid ViewHolder cache if viewType > MAX_VIEWTYPE_ALLOW_CACHE
-     * @param viewType
-     */
-    private void checkRecycledViewPool(int viewType) {
-        try {
-            if (mViewTypes.size() > MAX_VIEWTYPE_ALLOW_CACHE)
-                mAllowCacheViewHolder = false;
-
-            if (mDownForBidCacheViewHolder)
-                if (getHostView() != null && getHostView().getInnerView() != null)
-                    getHostView().getInnerView().getRecycledViewPool().setMaxRecycledViews(viewType, 0);
-
-            if (!mDownForBidCacheViewHolder) {
-                if (!mAllowCacheViewHolder) {
-                    if (getHostView() != null && getHostView().getInnerView() != null) {
-                        for (int i = 0; i < mViewTypes.size(); i++) {
-                            getHostView().getInnerView().getRecycledViewPool().setMaxRecycledViews(mViewTypes.keyAt(i), 0);
-                        }
-                        mDownForBidCacheViewHolder = true;
-                    }
-                }
-            }
-        } catch (Exception e) {
-            WXLogUtils.e(TAG, "Clear recycledViewPool error!");
-        }
-    }
-
-    /**
-     * Return the child component type. The type is defined by scopeValue in .we file.
-     *
-     * @param position the position of the child component.
-     * @return the type of certain component.
-     */
-    @Override
-    public int getItemViewType(int position) {
-        return generateViewType(getChild(position));
-    }
-
-    /**
-     * ViewType will be classified into {HashMap<Integer,ArrayList<Integer>> mViewTypes}
-     * @param component
-     */
-    private void bindViewType(WXComponent component) {
-        int id = generateViewType(component);
-
-        if (mViewTypes == null) {
-            mViewTypes = new SparseArray<>();
-        }
-
-        ArrayList<WXComponent> mTypes = mViewTypes.get(id);
-
-        if (mTypes == null) {
-            mTypes = new ArrayList<>();
-            mViewTypes.put(id,mTypes);
-        }
-        mTypes.add(component);
-    }
-
-    private void unBindViewType(WXComponent component) {
-        int id = generateViewType(component);
-
-        if (mViewTypes == null)
-            return;
-        ArrayList<WXComponent> mTypes = mViewTypes.get(id);
-        if (mTypes == null)
-            return;
-
-        mTypes.remove(component);
-    }
-
-    /**
-     * generate viewtype by component
-     * @param component
-     * @return
-     */
-    private int generateViewType(WXComponent component) {
-        long id;
-        try {
-            id = Integer.parseInt(component.getDomObject().getRef());
-            String type = component.getDomObject().getAttrs().getScope();
-
-            if (!TextUtils.isEmpty(type)) {
-                if (mRefToViewType == null) {
-                    mRefToViewType = new ArrayMap<>();
-                }
-                if (!mRefToViewType.containsKey(type)) {
-                    mRefToViewType.put(type, id);
-                }
-                id = mRefToViewType.get(type);
-
-            }
-        } catch (RuntimeException e) {
-          WXLogUtils.eTag(TAG, e);
-          id = RecyclerView.NO_ID;
-          WXLogUtils.e(TAG, "getItemViewType: NO ID, this will crash the whole render system of WXListRecyclerView");
-        }
-        return (int) id;
-    }
-
-    /**
-     * Get child component num.
-     *
-     * @return return the size of {@link #mChildren} if mChildren is not empty, otherwise, return 0;
-     */
-    @Override
-    public int getItemCount() {
-        return getChildCount();
-    }
-
-    @Override
-    public boolean onFailedToRecycleView(ListBaseViewHolder holder) {
-        if(WXEnvironment.isApkDebugable()) {
-            WXLogUtils.d(TAG, "Failed to recycle " + holder);
-        }
-        return false;
-    }
-
-    @Override
-    public long getItemId(int position) {
-        long id;
-        try {
-            id = Long.parseLong(getChild(position).getDomObject().getRef());
-        } catch (RuntimeException e) {
-            WXLogUtils.e(TAG, WXLogUtils.getStackTrace(e));
-            id = RecyclerView.NO_ID;
-        }
-        return id;
-    }
-
-    @Override
-    public void onLoadMore(int offScreenY) {
-      try {
-        String offset = getDomObject().getAttrs().getLoadMoreOffset();
-
-            if (TextUtils.isEmpty(offset)) {
-                offset="0";
-            }
-
-        if (offScreenY < Integer.parseInt(offset)) {
-          String loadMoreRetry = getDomObject().getAttrs().getLoadMoreRetry();
-          if (loadMoreRetry == null) {
-             loadMoreRetry = mLoadMoreRetry;
-          }
-
-          if (mListCellCount != mChildren.size()
-              || mLoadMoreRetry == null || !mLoadMoreRetry.equals(loadMoreRetry)) {
-            fireEvent(Constants.Event.LOADMORE);
-            mListCellCount = mChildren.size();
-            mLoadMoreRetry = loadMoreRetry;
-          }
-        }
-      } catch (Exception e) {
-        WXLogUtils.d(TAG + "onLoadMore :", e);
-      }
-    }
-
-  @Override
-  public void notifyAppearStateChange(int firstVisible, int lastVisible, int directionX, int directionY) {
-    //notify appear state
-    Iterator<AppearanceHelper> it = mAppearComponents.values().iterator();
-    String direction = directionY > 0 ? Constants.Value.DIRECTION_UP :
-            directionY < 0 ? Constants.Value.DIRECTION_DOWN : null;
-    if (getOrientation() == Constants.Orientation.HORIZONTAL && directionX != 0) {
-      direction = directionX > 0 ? Constants.Value.DIRECTION_LEFT : Constants.Value.DIRECTION_RIGHT;
-    }
-
-    while (it.hasNext()) {
-      AppearanceHelper item = it.next();
-      WXComponent component = item.getAwareChild();
-
-      if (!item.isWatch()) {
-        continue;
-      }
-
-      boolean outOfVisibleRange = item.getCellPositionINScollable() < firstVisible || item.getCellPositionINScollable() > lastVisible;
-
-      View view = component.getHostView();
-      if (view == null) {
-        continue;
-      }
-
-      boolean visible = (!outOfVisibleRange) && item.isViewVisible();
-
-      int result = item.setAppearStatus(visible);
-      if (WXEnvironment.isApkDebugable()) {
-        WXLogUtils.d("appear", "item " + item.getCellPositionINScollable() + " result " + result);
-      }
-      if (result == AppearanceHelper.RESULT_NO_CHANGE) {
-        continue;
-      }
-      component.notifyAppearStateChange(result == AppearanceHelper.RESULT_APPEAR ? Constants.Event.APPEAR : Constants.Event.DISAPPEAR, direction);
+  private void removeFooterOrHeader(WXComponent child) {
+    if (child instanceof WXLoading) {
+      getHostView().removeFooterView(child);
+    } else if (child instanceof WXRefresh) {
+      getHostView().removeHeaderView(child);
     }
   }
-
-    private void recycleImage(View view) {
-        if (view instanceof ImageView) {
-            if (getInstance().getImgLoaderAdapter() != null) {
-                getInstance().getImgLoaderAdapter().setImage(null, (ImageView) view,
-                        null, null);
-            } else {
-                if (WXEnvironment.isApkDebugable()) {
-                    throw new WXRuntimeException("getImgLoaderAdapter() == null");
-                }
-                WXLogUtils.e("Error getImgLoaderAdapter() == null");
-            }
-
-        } else if (view instanceof ViewGroup) {
-            for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
-                recycleImage(((ViewGroup) view).getChildAt(i));
-            }
-        }
-    }
-
-    @NonNull
-    private ListBaseViewHolder createVHForFakeComponent(int viewType) {
-        FrameLayout view = new FrameLayout(getContext());
-        view.setBackgroundColor(Color.WHITE);
-        view.setLayoutParams(new FrameLayout.LayoutParams(0, 0));
-        return new ListBaseViewHolder(view, viewType);
-    }
-
-
-  private ListBaseViewHolder createVHForRefreshComponent(int viewType) {
-    FrameLayout view = new FrameLayout(getContext());
-    view.setBackgroundColor(Color.WHITE);
-    view.setLayoutParams(new FrameLayout.LayoutParams(1, 1));
-    view.setVisibility(View.GONE);
-    return new ListBaseViewHolder(view, viewType);
-  }
-    @JSMethod
-    public void resetLoadmore() {
-        mLoadMoreRetry = "";
-    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/5a700270/android/sdk/src/main/java/com/taobao/weex/ui/view/refresh/wrapper/BounceRecyclerView.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/view/refresh/wrapper/BounceRecyclerView.java b/android/sdk/src/main/java/com/taobao/weex/ui/view/refresh/wrapper/BounceRecyclerView.java
index 29a086a..7da09b5 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/view/refresh/wrapper/BounceRecyclerView.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/view/refresh/wrapper/BounceRecyclerView.java
@@ -215,6 +215,7 @@ import android.view.ViewParent;
 
 import com.taobao.weex.common.WXThread;
 import com.taobao.weex.ui.component.WXComponent;
+import com.taobao.weex.ui.component.list.ListComponentView;
 import com.taobao.weex.ui.component.list.WXCell;
 import com.taobao.weex.ui.view.gesture.WXGesture;
 import com.taobao.weex.ui.view.gesture.WXGestureObservable;
@@ -223,7 +224,7 @@ import com.taobao.weex.ui.view.listview.adapter.RecyclerViewBaseAdapter;
 
 import java.util.Stack;
 
-public class BounceRecyclerView extends BaseBounceView<WXRecyclerView> implements WXGestureObservable {
+public class BounceRecyclerView extends BaseBounceView<WXRecyclerView> implements ListComponentView,WXGestureObservable {
 
   private RecyclerViewBaseAdapter adapter = null;
   private Stack<View> headerViewStack = new Stack<>();
@@ -243,13 +244,17 @@ public class BounceRecyclerView extends BaseBounceView<WXRecyclerView> implement
     super(context, attrs, OrientationHelper.VERTICAL);
   }
 
-  public void setAdapter(RecyclerViewBaseAdapter adapter) {
+  public void setRecyclerViewBaseAdapter(RecyclerViewBaseAdapter adapter) {
     this.adapter = adapter;
     if (getInnerView() != null) {
       getInnerView().setAdapter(adapter);
     }
   }
 
+  public RecyclerViewBaseAdapter getRecyclerViewBaseAdapter() {
+    return adapter;
+  }
+
   @Override
   public boolean onTouchEvent(MotionEvent event) {
     boolean result = super.onTouchEvent(event);
@@ -258,11 +263,7 @@ public class BounceRecyclerView extends BaseBounceView<WXRecyclerView> implement
     }
     return result;
   }
-
-  public RecyclerViewBaseAdapter getAdapter() {
-    return adapter;
-  }
-
+    
   @Override
   public WXRecyclerView setInnerView(Context context) {
     WXRecyclerView wxRecyclerView = new WXRecyclerView(context);


[25/50] [abbrv] incubator-weex git commit: Merge pull request #2209 from acton393/ios-feature-20170118

Posted by ji...@apache.org.
Merge pull request #2209 from acton393/ios-feature-20170118

* [ios] iOS feature 20170118

Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/2cebd325
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/2cebd325
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/2cebd325

Branch: refs/heads/master
Commit: 2cebd325baf0cf8b128a86ca681f05edc625442f
Parents: 2371256 4d5bc33
Author: \u9690\u5c0f\u98ce <cx...@gmail.com>
Authored: Wed Jan 11 11:51:07 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Wed Jan 11 11:51:07 2017 +0800

----------------------------------------------------------------------
 .../Sources/Component/WXImageComponent.m        | 23 +++++++-------------
 .../WeexSDK/Sources/Component/WXTextComponent.m |  1 +
 .../Sources/Display/WXComponent+Display.m       |  6 +----
 .../Sources/Manager/WXComponentManager.m        |  2 ++
 ios/sdk/WeexSDK/Sources/Model/WXComponent.h     |  2 +-
 ios/sdk/WeexSDK/Sources/Model/WXComponent.m     |  6 +++--
 6 files changed, 17 insertions(+), 23 deletions(-)
----------------------------------------------------------------------



[37/50] [abbrv] incubator-weex git commit: Merge branch 'v0.10.0-stable' of github.com:sospartan/weex into v0.10.0-stable

Posted by ji...@apache.org.
Merge branch 'v0.10.0-stable' of github.com:sospartan/weex into v0.10.0-stable


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/235b87fd
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/235b87fd
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/235b87fd

Branch: refs/heads/master
Commit: 235b87fd76f4d642533c02e7b181da839596b5fa
Parents: 0d992e4 5a70027
Author: sospartan <so...@gmail.com>
Authored: Wed Jan 11 16:10:33 2017 +0800
Committer: sospartan <so...@gmail.com>
Committed: Wed Jan 11 16:10:33 2017 +0800

----------------------------------------------------------------------
 .../main/java/com/taobao/weex/WXSDKEngine.java  |    4 +-
 .../ui/component/list/BasicListComponent.java   | 1104 ++++++++++++++++++
 .../ui/component/list/ListComponentView.java    |  223 ++++
 .../ui/component/list/SimpleListComponent.java  |  231 ++++
 .../ui/component/list/SimpleRecyclerView.java   |  329 ++++++
 .../weex/ui/component/list/WXListComponent.java |  944 +--------------
 .../refresh/wrapper/BounceRecyclerView.java     |   15 +-
 7 files changed, 1951 insertions(+), 899 deletions(-)
----------------------------------------------------------------------



[40/50] [abbrv] incubator-weex git commit: * [ios] update weexSDK version number.

Posted by ji...@apache.org.
* [ios] update weexSDK version number.


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/d0748c2c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/d0748c2c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/d0748c2c

Branch: refs/heads/master
Commit: d0748c2c0b793deb1a732f3bdbb83c2d0e321cdb
Parents: 7668b27
Author: boboning <ni...@163.com>
Authored: Wed Jan 11 16:35:26 2017 +0800
Committer: boboning <ni...@163.com>
Committed: Wed Jan 11 16:35:26 2017 +0800

----------------------------------------------------------------------
 ios/sdk/WeexSDK.podspec                    | 2 +-
 ios/sdk/WeexSDK/Sources/Utility/WXDefine.h | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/d0748c2c/ios/sdk/WeexSDK.podspec
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK.podspec b/ios/sdk/WeexSDK.podspec
index ec2b810..f240ecd 100644
--- a/ios/sdk/WeexSDK.podspec
+++ b/ios/sdk/WeexSDK.podspec
@@ -2,7 +2,7 @@
 Pod::Spec.new do |s|
 
   s.name         = "WeexSDK"
-  s.version      = "0.9.4"
+  s.version      = "0.9.5"
   s.summary      = "WeexSDK Source ."
 
   s.description  = <<-DESC

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/d0748c2c/ios/sdk/WeexSDK/Sources/Utility/WXDefine.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Utility/WXDefine.h b/ios/sdk/WeexSDK/Sources/Utility/WXDefine.h
index 80e7212..d743d53 100644
--- a/ios/sdk/WeexSDK/Sources/Utility/WXDefine.h
+++ b/ios/sdk/WeexSDK/Sources/Utility/WXDefine.h
@@ -9,7 +9,7 @@
 #ifndef __WX_DEFINE_H__
 #define __WX_DEFINE_H__
 
-#define WX_SDK_VERSION @"0.9.4"
+#define WX_SDK_VERSION @"0.9.5"
 
 #if defined(__cplusplus)
 #define WX_EXTERN extern "C" __attribute__((visibility("default")))


[43/50] [abbrv] incubator-weex git commit: Merge pull request #2220 from boboning/ios-jsframework-0.19.7

Posted by ji...@apache.org.
Merge pull request #2220 from boboning/ios-jsframework-0.19.7

ios update weexSDK Version to 0.9.5

Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/50641f1c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/50641f1c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/50641f1c

Branch: refs/heads/master
Commit: 50641f1c98544a3dcfc2ead3c83992cfc1868725
Parents: 46332dd ee0f2bb
Author: \u9690\u5c0f\u98ce <cx...@gmail.com>
Authored: Wed Jan 11 16:54:43 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Wed Jan 11 16:54:43 2017 +0800

----------------------------------------------------------------------
 ios/sdk/WeexSDK.podspec                    | 4 +++-
 ios/sdk/WeexSDK/Sources/Utility/WXDefine.h | 2 +-
 2 files changed, 4 insertions(+), 2 deletions(-)
----------------------------------------------------------------------



[13/50] [abbrv] incubator-weex git commit: * [ios] fix compiler complains

Posted by ji...@apache.org.
* [ios] fix compiler complains


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/9f966590
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/9f966590
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/9f966590

Branch: refs/heads/master
Commit: 9f966590ecc6e72f47784f2e696b479a6fdc361a
Parents: b25b16c
Author: acton393 <zh...@gmail.com>
Authored: Tue Jan 10 22:52:11 2017 +0800
Committer: acton393 <zh...@gmail.com>
Committed: Tue Jan 10 22:52:11 2017 +0800

----------------------------------------------------------------------
 ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/9f966590/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
index 0220ace..9f18941 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
+++ b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
@@ -395,7 +395,7 @@ typedef enum : NSUInteger {
 
 #pragma mark Private Methods
 
-- (void)_addModuleEventObserversWith:(WXModuleMethod *)method
+- (void)_addModuleEventObserversWithModuleMethod:(WXModuleMethod *)method
 {
     if ([method.arguments count] < 2) {
         WXLogError(@"please check your method parameter!!");
@@ -417,7 +417,7 @@ typedef enum : NSUInteger {
     NSMutableDictionary * option = [methodArguments[3] mutableCopy];
     [option setObject:method.moduleName forKey:@"moduleName"];
     // the value for moduleName in option is for the need of callback
-    [self addModuleEventObservers:methodArguments[0] callback:methodArguments[1] option:option moduleClassName:NSClassFromString(moduleClass)];
+    [self addModuleEventObservers:methodArguments[0] callback:methodArguments[1] option:option moduleClassName:NSStringFromClass(moduleClass)];
 }
 
 - (void)addModuleEventObservers:(NSString*)event callback:(NSString*)callbackId option:(NSDictionary *)option moduleClassName:(NSString*)moduleClassName
@@ -437,11 +437,13 @@ typedef enum : NSUInteger {
     }
 }
 
-- (void)_removeModuleEventObserverWithArguments:(NSArray*)arguments moduleClassName:(NSString*)moduleClassName {
-    if (![arguments count] && [arguments[0] isKindOfClass:[NSString class]]) {
+- (void)_removeModuleEventObserverWithModuleMethod:(WXModuleMethod *)method
+{
+    if (![method.arguments count] && [method.arguments[0] isKindOfClass:[NSString class]]) {
         return;
     }
-    [self removeModuleEventObserver:arguments[0] moduleClassName:moduleClassName];
+    Class moduleClass =  [WXModuleFactory classWithModuleName:method.moduleName];
+    [self removeModuleEventObserver:method.arguments[0] moduleClassName:NSStringFromClass(moduleClass)];
 }
 
 - (void)removeModuleEventObserver:(NSString*)event moduleClassName:(NSString*)moduleClassName
@@ -465,7 +467,7 @@ typedef enum : NSUInteger {
         NSDictionary * callbackInfo = listeners[i];
         NSString *callbackId = callbackInfo[@"callbackId"];
         BOOL once = [callbackInfo[@"once"] boolValue];
-        NSMutableDictionary * retData = @{@"type":userInfo[@"eventName"],
+        NSDictionary * retData = @{@"type":userInfo[@"eventName"],
                                                @"module":callbackInfo[@"moduleName"],
                                                @"data":userInfo[@"param"]};
         [[WXSDKManager bridgeMgr] callBack:self.instanceId funcId:callbackId params:retData keepAlive:!once];


[09/50] [abbrv] incubator-weex git commit: Merge pull request #2201 from acton393/ios-feature-20170118

Posted by ji...@apache.org.
Merge pull request #2201 from acton393/ios-feature-20170118

* [ios] moduleEvent support variable value

Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/77d3fba2
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/77d3fba2
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/77d3fba2

Branch: refs/heads/master
Commit: 77d3fba2167497d7a5d46866135a6303438a074c
Parents: d26ef73 1fb2e0a
Author: \u9f50\u5c71 <su...@163.com>
Authored: Tue Jan 10 21:35:34 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Tue Jan 10 21:35:34 2017 +0800

----------------------------------------------------------------------
 ios/sdk/WeexSDK/Sources/Bridge/WXModuleMethod.m | 16 ++++++------
 .../Sources/Component/WXImageComponent.m        |  3 ++-
 .../Sources/Display/WXComponent+Display.m       |  2 +-
 .../WeexSDK/Sources/Loader/WXResourceLoader.m   |  2 +-
 ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.h   |  2 +-
 ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m   | 26 +++++++++++++++++++-
 .../Sources/Model/WXSDKInstance_private.h       |  2 ++
 7 files changed, 39 insertions(+), 14 deletions(-)
----------------------------------------------------------------------



[28/50] [abbrv] incubator-weex git commit: * [ios] rename method

Posted by ji...@apache.org.
* [ios] rename method


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/a8720c24
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/a8720c24
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/a8720c24

Branch: refs/heads/master
Commit: a8720c24e1a5e20387d76d0343bf3d5840bb60eb
Parents: 6bccb06
Author: acton393 <zh...@gmail.com>
Authored: Wed Jan 11 13:12:14 2017 +0800
Committer: acton393 <zh...@gmail.com>
Committed: Wed Jan 11 13:12:14 2017 +0800

----------------------------------------------------------------------
 ios/sdk/WeexSDK/Sources/Component/WXImageComponent.m | 14 +++++++-------
 ios/sdk/WeexSDK/Sources/Component/WXTextComponent.m  |  2 +-
 ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.m |  4 ++--
 ios/sdk/WeexSDK/Sources/Model/WXComponent.h          |  4 ++--
 ios/sdk/WeexSDK/Sources/Model/WXComponent.m          |  4 ++--
 5 files changed, 14 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/a8720c24/ios/sdk/WeexSDK/Sources/Component/WXImageComponent.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXImageComponent.m b/ios/sdk/WeexSDK/Sources/Component/WXImageComponent.m
index 569c900..47040c7 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXImageComponent.m
+++ b/ios/sdk/WeexSDK/Sources/Component/WXImageComponent.m
@@ -225,7 +225,7 @@ static dispatch_queue_t WXImageUpdateQueue;
             dispatch_async(dispatch_get_main_queue(), ^{
                 self.layer.contents = nil;
                 weakSelf.imageDownloadFinish = YES;
-                [weakSelf readyToShow];
+                [weakSelf readyToRender];
             });
         }
     });
@@ -249,7 +249,7 @@ static dispatch_queue_t WXImageUpdateQueue;
                     downloadFailedBlock(placeholderSrc,error);
                     if ([strongSelf isViewLoaded] && !viewImage) {
                         ((UIImageView *)(strongSelf.view)).image = nil;
-                        [self readyToShow];
+                        [self readyToRender];
                     }
                     return;
                 }
@@ -260,7 +260,7 @@ static dispatch_queue_t WXImageUpdateQueue;
                 if ([strongSelf isViewLoaded] && !viewImage) {
                     ((UIImageView *)strongSelf.view).image = image;
                     weakSelf.imageDownloadFinish = YES;
-                    [self readyToShow];
+                    [self readyToRender];
                 }
             });
         }];
@@ -289,7 +289,7 @@ static dispatch_queue_t WXImageUpdateQueue;
                     }
                     if (error) {
                         downloadFailedBlock(imageSrc, error);
-                        [strongSelf readyToShow];
+                        [strongSelf readyToRender];
                         return ;
                     }
                     
@@ -300,7 +300,7 @@ static dispatch_queue_t WXImageUpdateQueue;
                     if ([strongSelf isViewLoaded]) {
                         strongSelf.imageDownloadFinish = YES;
                         ((UIImageView *)strongSelf.view).image = image;
-                        [strongSelf readyToShow];
+                        [strongSelf readyToRender];
                     }
                 });
             }];
@@ -308,11 +308,11 @@ static dispatch_queue_t WXImageUpdateQueue;
     }
 }
 
-- (void)readyToShow
+- (void)readyToRender
 {
     // when image download completely (success or failed)
     if (self.weexInstance.trackComponent && _imageDownloadFinish) {
-        [super readyToShow];
+        [super readyToRender];
     }
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/a8720c24/ios/sdk/WeexSDK/Sources/Component/WXTextComponent.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXTextComponent.m b/ios/sdk/WeexSDK/Sources/Component/WXTextComponent.m
index 2f7f29c..256bda1 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXTextComponent.m
+++ b/ios/sdk/WeexSDK/Sources/Component/WXTextComponent.m
@@ -423,7 +423,7 @@ do {\
             if (_isUsingTextStorageLock) {
                 pthread_mutex_unlock(&_textStorageMutex);
             }
-            [self readyToShow]; // notify super component
+            [self readyToRender]; // notify super component
             [self setNeedsDisplay];
         }
     }];

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/a8720c24/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.m b/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.m
index 6c2c06d..65f6e69 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.m
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.m
@@ -375,7 +375,7 @@ static css_node_t * rootNodeGetChild(void *context, int i)
     [component _updateStylesOnComponentThread:normalStyles resetStyles:resetStyles isUpdateStyles:isUpdateStyles];
     [self _addUITask:^{
         [component _updateStylesOnMainThread:normalStyles resetStyles:resetStyles];
-        [component readyToShow];
+        [component readyToRender];
     }];
 }
 
@@ -390,7 +390,7 @@ static css_node_t * rootNodeGetChild(void *context, int i)
     [component _updateAttributesOnComponentThread:attributes];
     [self _addUITask:^{
         [component _updateAttributesOnMainThread:attributes];
-        [component readyToShow];
+        [component readyToRender];
     }];
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/a8720c24/ios/sdk/WeexSDK/Sources/Model/WXComponent.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Model/WXComponent.h b/ios/sdk/WeexSDK/Sources/Model/WXComponent.h
index c02eb9a..e8d7c0e 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXComponent.h
+++ b/ios/sdk/WeexSDK/Sources/Model/WXComponent.h
@@ -341,9 +341,9 @@ typedef void(^WXDisplayCompeletionBlock)(CALayer *layer, BOOL finished);
 - (WXDisplayBlock)displayBlock;
 
 /**
- * renderFinish
+ * readyToRender
  */
-- (void)readyToShow;
+- (void)readyToRender;
 
 /**
  * @abstract Return a block to be called while drawing is finished.

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/a8720c24/ios/sdk/WeexSDK/Sources/Model/WXComponent.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Model/WXComponent.m b/ios/sdk/WeexSDK/Sources/Model/WXComponent.m
index 6953ee7..f35da20 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXComponent.m
+++ b/ios/sdk/WeexSDK/Sources/Model/WXComponent.m
@@ -430,10 +430,10 @@
     WXAssertMainThread();
 }
 
-- (void)readyToShow
+- (void)readyToRender
 {
     if (self.weexInstance.trackComponent) {
-        [self.supercomponent readyToShow];
+        [self.supercomponent readyToRender];
     }
 }
 


[39/50] [abbrv] incubator-weex git commit: Merge pull request #2218 from acton393/ios-feature-20170118

Posted by ji...@apache.org.
Merge pull request #2218 from acton393/ios-feature-20170118

* [ios] update weexSDK version

Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/46332dda
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/46332dda
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/46332dda

Branch: refs/heads/master
Commit: 46332dda60912472b14c316a9a42143e844287ee
Parents: 970e3b8 6163d27
Author: \u9690\u5c0f\u98ce <cx...@gmail.com>
Authored: Wed Jan 11 16:30:43 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Wed Jan 11 16:30:43 2017 +0800

----------------------------------------------------------------------
 ios/sdk/WeexSDK.podspec                    | 10 ++++++----
 ios/sdk/WeexSDK/Sources/Utility/WXDefine.h |  2 +-
 2 files changed, 7 insertions(+), 5 deletions(-)
----------------------------------------------------------------------



[05/50] [abbrv] incubator-weex git commit: V0.10.0 stable sync bugfix (#133)

Posted by ji...@apache.org.
V0.10.0 stable sync bugfix (#133)

* * [android] bugfix Dom module sync callback

* * [android] remove space

* * [android] set dirty flag

* Update WXDomModule.java

* Update WXBridgeManager.java

* * [android] return when callback ==undefined or -1


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/0c017703
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/0c017703
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/0c017703

Branch: refs/heads/master
Commit: 0c01770351df8edb1a10589ba396d137931a30e5
Parents: 80bcc0d
Author: zhengshihan <zh...@gmail.com>
Authored: Tue Jan 10 20:52:35 2017 +0800
Committer: sospartan zheng <so...@apache.org>
Committed: Tue Jan 10 20:52:35 2017 +0800

----------------------------------------------------------------------
 .../main/java/com/taobao/weex/bridge/WXBridgeManager.java    | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/0c017703/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
----------------------------------------------------------------------
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 52f855f..be1bc51 100755
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
@@ -295,7 +295,9 @@ public class WXBridgeManager implements Callback,BactchExecutor {
   public static final String MODULE = "module";
   public static final String METHOD = "method";
   public static final String ARGS = "args";
-  private static final String UNDEFINED = "-1";
+  private static final String NON_CALLBACK = "-1";
+  private static final String UNDEFINED = "undefined";
+
   private static final int INIT_FRAMEWORK_OK = 1;
 
   private static long LOW_MEM_VALUE = 80;
@@ -579,7 +581,7 @@ public class WXBridgeManager implements Callback,BactchExecutor {
       }
     }
 
-    if (UNDEFINED.equals(callback)) {
+    if (UNDEFINED.equals(callback) || NON_CALLBACK.equals(callback)) {
       return IWXBridge.INSTANCE_RENDERING_ERROR;
     }
     // get next tick
@@ -612,7 +614,7 @@ public class WXBridgeManager implements Callback,BactchExecutor {
       domModule.addElement(ref, domObject, Integer.parseInt(index));
     }
 
-    if (UNDEFINED.equals(callback)) {
+    if (UNDEFINED.equals(callback) || NON_CALLBACK.equals(callback)) {
       return IWXBridge.INSTANCE_RENDERING_ERROR;
     }
     // get next tick


[24/50] [abbrv] incubator-weex git commit: * [ios] ensure default modules/components/handlers are ready before create instance.

Posted by ji...@apache.org.
* [ios] ensure default modules/components/handlers are ready before create instance.


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/fdf5ed75
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/fdf5ed75
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/fdf5ed75

Branch: refs/heads/master
Commit: fdf5ed7533a15ff7126322a052bbf288cf249b87
Parents: 9b6f726
Author: \u9690\u98ce <cx...@gmail.com>
Authored: Wed Jan 11 11:33:55 2017 +0800
Committer: \u9690\u98ce <cx...@gmail.com>
Committed: Wed Jan 11 11:33:55 2017 +0800

----------------------------------------------------------------------
 ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.h  |  7 ++++++-
 ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.m  | 14 +++++++++++---
 ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m |  4 ++++
 3 files changed, 21 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/fdf5ed75/ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.h b/ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.h
index 691573d..ad2f742 100644
--- a/ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.h
+++ b/ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.h
@@ -13,7 +13,12 @@
 @interface WXSDKEngine : NSObject
 
 /**
- *  @abstract Registers a module for a given name
+ *  @abstract Register default modules/components/handlers, they will be reigstered only once.
+ **/
++ (void)registerDefaults;
+
+/**
+ *  @abstract Register a module for a given name
  *
  *  @param name The module name to register
  *

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/fdf5ed75/ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.m b/ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.m
index 642cabc..a23e03e 100644
--- a/ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.m
+++ b/ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.m
@@ -208,13 +208,21 @@
         return;
     }
     
-    [self _registerDefaultComponents];
-    [self _registerDefaultModules];
-    [self _registerDefaultHandlers];
+    [self registerDefaults];
     
     [[WXSDKManager bridgeMgr] executeJsFramework:script];
 }
 
++ (void)registerDefaults
+{
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        [self _registerDefaultComponents];
+        [self _registerDefaultModules];
+        [self _registerDefaultHandlers];
+    });
+}
+
 + (NSString*)SDKEngineVersion
 {
     return WX_SDK_VERSION;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/fdf5ed75/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
index 50901bc..fd5a53b 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
+++ b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
@@ -25,6 +25,7 @@
 #import "WXResourceRequest.h"
 #import "WXResourceResponse.h"
 #import "WXResourceLoader.h"
+#import "WXSDKEngine.h"
 
 NSString *const bundleUrlOptionKey = @"bundleUrl";
 
@@ -173,6 +174,9 @@ typedef enum : NSUInteger {
         }
     });
     
+    // ensure default modules/components/handlers are ready before create instance
+    [WXSDKEngine registerDefaults];
+    
     [[WXSDKManager bridgeMgr] createInstance:self.instanceId template:mainBundleString options:dictionary data:_jsData];
     
     WX_MONITOR_PERF_SET(WXPTBundleSize, [mainBundleString lengthOfBytesUsingEncoding:NSUTF8StringEncoding], self);


[02/50] [abbrv] incubator-weex git commit: V0.10.0 stable fixnpe event (#132)

Posted by ji...@apache.org.
V0.10.0 stable fixnpe event (#132)

* * [android] fix switch case

* * [android] fix npe when add/remove event

* * [android] fix add/remove event

* * [android] fix npe when add/remove event

* * [android] fix add/remove event


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/80bcc0d7
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/80bcc0d7
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/80bcc0d7

Branch: refs/heads/master
Commit: 80bcc0d7f1e7dbbd8ee5f111e810cbc50578954e
Parents: 49b995a
Author: sospartan zheng <so...@apache.org>
Authored: Tue Jan 10 20:03:48 2017 +0800
Committer: YorkShen <sh...@gmail.com>
Committed: Tue Jan 10 20:03:48 2017 +0800

----------------------------------------------------------------------
 .../com/taobao/weex/dom/WXDomStatement.java     | 28 +++++++++++---------
 .../com/taobao/weex/ui/WXRenderManager.java     |  4 +--
 .../com/taobao/weex/ui/WXRenderStatement.java   |  4 +--
 3 files changed, 20 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/80bcc0d7/android/sdk/src/main/java/com/taobao/weex/dom/WXDomStatement.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomStatement.java b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomStatement.java
index 171c232..4fd29be 100755
--- a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomStatement.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomStatement.java
@@ -915,7 +915,7 @@ class WXDomStatement {
       return;
     }
     WXSDKInstance instance = WXSDKManager.getInstance().getSDKInstance(mInstanceId);
-    WXDomObject domObject = mRegistry.get(ref);
+    final WXDomObject domObject = mRegistry.get(ref);
     if (domObject == null) {
       if (instance != null) {
         instance.commitUTStab(IWXUserTrackAdapter.DOM_MODULE, WXErrorCode.WX_ERR_DOM_ADDEVENT);
@@ -923,15 +923,16 @@ class WXDomStatement {
       return;
     }
     domObject.addEvent(type);
-    //sync dom change to component
-    AddDomInfo info = mAddDom.get(ref);
-    WXComponent component = info.component;
-    component.updateDom(domObject);
     mNormalTasks.add(new IWXRenderTask() {
 
       @Override
       public void execute() {
-        mWXRenderManager.addEvent(mInstanceId, ref, type);
+        WXComponent comp = mWXRenderManager.getWXComponent(mInstanceId,ref);
+        if(comp != null){
+          //sync dom change to component
+          comp.updateDom(domObject);
+          mWXRenderManager.addEvent(mInstanceId, ref, type);
+        }
       }
 
       @Override
@@ -959,7 +960,7 @@ class WXDomStatement {
       return;
     }
     WXSDKInstance instance = WXSDKManager.getInstance().getSDKInstance(mInstanceId);
-    WXDomObject domObject = mRegistry.get(ref);
+    final WXDomObject domObject = mRegistry.get(ref);
     if (domObject == null) {
       if (instance != null) {
         instance.commitUTStab(IWXUserTrackAdapter.DOM_MODULE, WXErrorCode.WX_ERR_DOM_REMOVEEVENT);
@@ -967,15 +968,18 @@ class WXDomStatement {
       return;
     }
     domObject.removeEvent(type);
-    //sync dom change to component
-    AddDomInfo info = mAddDom.get(ref);
-    WXComponent component = info.component;
-    component.updateDom(domObject);
+
     mNormalTasks.add(new IWXRenderTask() {
 
       @Override
       public void execute() {
-        mWXRenderManager.removeEvent(mInstanceId, ref, type);
+        WXComponent comp = mWXRenderManager.getWXComponent(mInstanceId,ref);
+        if(comp != null){
+          //sync dom change to component
+          comp.updateDom(domObject);
+          mWXRenderManager.removeEvent(mInstanceId, ref, type);
+        }
+
       }
 
       @Override

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/80bcc0d7/android/sdk/src/main/java/com/taobao/weex/ui/WXRenderManager.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/WXRenderManager.java b/android/sdk/src/main/java/com/taobao/weex/ui/WXRenderManager.java
index 8a0440a..3fc130d 100755
--- a/android/sdk/src/main/java/com/taobao/weex/ui/WXRenderManager.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/WXRenderManager.java
@@ -396,7 +396,7 @@ public class WXRenderManager {
   public void addEvent(String instanceId, String ref, String type) {
     WXRenderStatement statement = mRegistries.get(instanceId);
     if (statement == null) {
-      return;
+      return ;
     }
     statement.addEvent(ref, type);
   }
@@ -404,7 +404,7 @@ public class WXRenderManager {
   public void removeEvent(String instanceId, String ref, String type) {
     WXRenderStatement statement = mRegistries.get(instanceId);
     if (statement == null) {
-      return;
+      return ;
     }
     statement.removeEvent(ref, type);
   }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/80bcc0d7/android/sdk/src/main/java/com/taobao/weex/ui/WXRenderStatement.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/WXRenderStatement.java b/android/sdk/src/main/java/com/taobao/weex/ui/WXRenderStatement.java
index 9acf911..e05a6d0 100755
--- a/android/sdk/src/main/java/com/taobao/weex/ui/WXRenderStatement.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/WXRenderStatement.java
@@ -424,7 +424,7 @@ class WXRenderStatement {
   void addEvent(String ref, String type) {
     WXComponent component = mRegistry.get(ref);
     if (component == null) {
-      return;
+      return ;
     }
     component.addEvent(type);
   }
@@ -435,7 +435,7 @@ class WXRenderStatement {
   void removeEvent(String ref, String type) {
     WXComponent component = mRegistry.get(ref);
     if (component == null) {
-      return;
+      return ;
     }
     component.removeEvent(type);
   }


[30/50] [abbrv] incubator-weex git commit: * [ios] support textarea padding

Posted by ji...@apache.org.
* [ios] support textarea padding


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/7935c85f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/7935c85f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/7935c85f

Branch: refs/heads/master
Commit: 7935c85f7b1ec44607847a5c10521bd6c0689144
Parents: 4462c12
Author: acton393 <zh...@gmail.com>
Authored: Wed Jan 11 15:29:28 2017 +0800
Committer: acton393 <zh...@gmail.com>
Committed: Wed Jan 11 15:29:28 2017 +0800

----------------------------------------------------------------------
 .../Sources/Component/WXTextAreaComponent.m     | 110 +++++++------------
 1 file changed, 42 insertions(+), 68 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7935c85f/ios/sdk/WeexSDK/Sources/Component/WXTextAreaComponent.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXTextAreaComponent.m b/ios/sdk/WeexSDK/Sources/Component/WXTextAreaComponent.m
index c4e7b9a..90a688c 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXTextAreaComponent.m
+++ b/ios/sdk/WeexSDK/Sources/Component/WXTextAreaComponent.m
@@ -15,44 +15,7 @@
 #import "WXSDKInstance.h"
 #import "WXComponent+PseudoClassManagement.h"
 
-@interface WXTextAreaView : UITextView
-@property (nonatomic, assign) UIEdgeInsets border;
-@property (nonatomic, assign) UIEdgeInsets padding;
-@end
-
-@implementation WXTextAreaView
-
-- (instancetype)init
-{
-    self = [super init];
-    if (self) {
-        _padding = UIEdgeInsetsZero;
-        _border = UIEdgeInsetsZero;
-    }
-    return self;
-}
-
-- (CGRect)textRectForBounds:(CGRect)bounds
-{
-    bounds.size.width -= self.padding.left + self.border.left;
-    bounds.origin.x += self.padding.left + self.border.left;
-    
-    bounds.size.height -= self.padding.top + self.border.top;
-    bounds.origin.y += self.padding.top + self.border.top;
-    
-    bounds.size.width -= self.padding.right + self.border.right;
-    
-    bounds.size.height -= self.padding.bottom + self.border.bottom;
-    
-    return bounds;
-}
-
-- (CGRect)editingRectForBounds:(CGRect)bounds
-{
-    return [self textRectForBounds:bounds];
-}
-
-@end
+typedef UITextView WXTextAreaView;
 
 @interface WXTextAreaComponent()
 @property (nonatomic, strong) WXTextAreaView *textView;
@@ -67,6 +30,7 @@
 @property (nonatomic, strong)NSString *textValue;
 @property (nonatomic) NSUInteger rows;
 //style
+
 @property (nonatomic) WXPixelType fontSize;
 @property (nonatomic) WXTextStyle fontStyle;
 @property (nonatomic) CGFloat fontWeight;
@@ -103,6 +67,8 @@ WX_EXPORT_METHOD(@selector(blur))
         _blurEvent = NO;
         _changeEvent = NO;
         _clickEvent = NO;
+        _padding = UIEdgeInsetsZero;
+        _border = UIEdgeInsetsZero;
         
         if (attributes[@"autofocus"]) {
             _autofocus = [attributes[@"autofocus"] boolValue];
@@ -185,7 +151,7 @@ WX_EXPORT_METHOD(@selector(blur))
 }
 - (UIView *)loadView
 {
-    return [[WXTextAreaView alloc] initWithFrame:[UIScreen mainScreen].bounds];
+    return [[WXTextAreaView alloc] init];
 }
 - (void)viewDidLoad
 {
@@ -227,32 +193,20 @@ WX_EXPORT_METHOD(@selector(blur))
     [self handlePseudoClass];
 }
 
--(void)focus
+- (void)focus
 {
     if (self.textView) {
         [self.textView becomeFirstResponder];
     }
 }
 
--(void)blur
+- (void)blur
 {
     if (self.textView) {
         [self.textView resignFirstResponder];
     }
 }
 
-- (void)setPadding:(UIEdgeInsets)padding
-{
-    _padding = padding;
-    [_textView setPadding:padding];
-}
-
-- (void)setBorder:(UIEdgeInsets)border
-{
-    _border = border;
-    [_textView setBorder:border];
-}
-
 #pragma mark - add-remove Event
 - (void)addEvent:(NSString *)eventName
 {
@@ -354,21 +308,8 @@ WX_EXPORT_METHOD(@selector(blur))
     [self updatePattern];
 }
 
--(void)updatePattern
-{
-    UIEdgeInsets padding = UIEdgeInsetsMake(self.cssNode->style.padding[CSS_TOP], self.cssNode->style.padding[CSS_LEFT], self.cssNode->style.padding[CSS_BOTTOM], self.cssNode->style.padding[CSS_RIGHT]);
-    if (!UIEdgeInsetsEqualToEdgeInsets(padding, _padding)) {
-        [self setPadding:padding];
-    }
-    
-    UIEdgeInsets border = UIEdgeInsetsMake(self.cssNode->style.border[CSS_TOP], self.cssNode->style.border[CSS_LEFT], self.cssNode->style.border[CSS_BOTTOM], self.cssNode->style.border[CSS_RIGHT]);
-    if (!UIEdgeInsetsEqualToEdgeInsets(border, _border)) {
-        [self setBorder:border];
-    }
-}
-
 #pragma mark update touch styles
--(void)handlePseudoClass
+- (void)handlePseudoClass
 {
     NSMutableDictionary *styles = [NSMutableDictionary new];
     NSMutableDictionary *recordStyles = [NSMutableDictionary new];
@@ -474,7 +415,7 @@ WX_EXPORT_METHOD(@selector(blur))
     }
 }
 
-#pragma mark - set properties
+#pragma mark - private method
 - (void)setPlaceholderAttributedString
 {
     NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:_placeholderString];
@@ -498,6 +439,39 @@ WX_EXPORT_METHOD(@selector(blur))
     _placeHolderLabel.attributedText = attributedString;
 }
 
+- (void)updatePattern
+{
+    UIEdgeInsets padding = UIEdgeInsetsMake(self.cssNode->style.padding[CSS_TOP], self.cssNode->style.padding[CSS_LEFT], self.cssNode->style.padding[CSS_BOTTOM], self.cssNode->style.padding[CSS_RIGHT]);
+    if (!UIEdgeInsetsEqualToEdgeInsets(padding, _padding)) {
+        [self setPadding:padding];
+    }
+    
+    UIEdgeInsets border = UIEdgeInsetsMake(self.cssNode->style.border[CSS_TOP], self.cssNode->style.border[CSS_LEFT], self.cssNode->style.border[CSS_BOTTOM], self.cssNode->style.border[CSS_RIGHT]);
+    if (!UIEdgeInsetsEqualToEdgeInsets(border, _border)) {
+        [self setBorder:border];
+    }
+}
+
+- (void)setPadding:(UIEdgeInsets)padding
+{
+    _padding = padding;
+    [self _updateTextContentInset];
+}
+
+- (void)setBorder:(UIEdgeInsets)border
+{
+    _border = border;
+    [self _updateTextContentInset];
+}
+
+- (void)_updateTextContentInset
+{
+    [_textView setTextContainerInset:UIEdgeInsetsMake(_padding.top + _border.top,
+                                                      _padding.left + _border.left,
+                                                      _padding.bottom + _border.bottom,
+                                                      _border.right + _border.right)];
+}
+
 - (void)setAutofocus
 {
     if (_autofocus) {


[11/50] [abbrv] incubator-weex git commit: Merge pull request #2204 from acton393/ios-feature-20170118

Posted by ji...@apache.org.
Merge pull request #2204 from acton393/ios-feature-20170118

* [ios] iOS feature 20170118

Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/b25b16c1
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/b25b16c1
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/b25b16c1

Branch: refs/heads/master
Commit: b25b16c1c75abbb6b23066ea9c9407c8f67ce4a8
Parents: 77d3fba 83c747f
Author: \u9f50\u5c71 <su...@163.com>
Authored: Tue Jan 10 22:31:13 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Tue Jan 10 22:31:13 2017 +0800

----------------------------------------------------------------------
 ios/sdk/WeexSDK/Sources/Bridge/WXModuleMethod.m |  4 +--
 ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m   | 30 ++++++++++++++------
 .../Sources/Model/WXSDKInstance_private.h       |  5 ++--
 3 files changed, 26 insertions(+), 13 deletions(-)
----------------------------------------------------------------------



[20/50] [abbrv] incubator-weex git commit: * [android] Add screenDensity to WXEnvironment. (#98)

Posted by ji...@apache.org.
* [android] Add screenDensity to WXEnvironment. (#98)

* * [android] Add screenDensity to WXEnvironment.

* * [android] Add doc for scale exception.

* * [android] Change exception in WXEnvironment.scale


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/b905c37f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/b905c37f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/b905c37f

Branch: refs/heads/master
Commit: b905c37f24e69e0718f8dc097044e921d8966cca
Parents: 0c01770
Author: YorkShen <sh...@gmail.com>
Authored: Wed Jan 11 11:00:56 2017 +0800
Committer: sospartan zheng <so...@apache.org>
Committed: Wed Jan 11 11:00:56 2017 +0800

----------------------------------------------------------------------
 android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java   | 6 ++++++
 android/sdk/src/main/java/com/taobao/weex/common/WXConfig.java | 1 +
 2 files changed, 7 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b905c37f/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java b/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java
index 4149575..376a4d4 100755
--- a/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java
@@ -287,6 +287,12 @@ public class WXEnvironment {
     configs.put(WXConfig.sysModel, SYS_MODEL);
     configs.put(WXConfig.weexVersion, String.valueOf(WXSDK_VERSION));
     configs.put(WXConfig.logLevel,sLogLevel.getName());
+    try {
+      options.put(WXConfig.scale, Float.toString(sApplication.getResources().getDisplayMetrics().density));
+    }catch (NullPointerException e){
+      //There is little chance of NullPointerException as sApplication may be null.
+      WXLogUtils.e("WXEnvironment scale Exception: ", e);
+    }
     configs.putAll(options);
     if(configs!=null&&configs.get(WXConfig.appName)==null && sApplication!=null){
        configs.put(WXConfig.appName, sApplication.getPackageName());

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b905c37f/android/sdk/src/main/java/com/taobao/weex/common/WXConfig.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/common/WXConfig.java b/android/sdk/src/main/java/com/taobao/weex/common/WXConfig.java
index f7cc987..42a49e7 100755
--- a/android/sdk/src/main/java/com/taobao/weex/common/WXConfig.java
+++ b/android/sdk/src/main/java/com/taobao/weex/common/WXConfig.java
@@ -216,4 +216,5 @@ public interface WXConfig {
   String appGroup="appGroup";
   String externalUserAgent="externalUserAgent";
   String logLevel="logLevel";
+  String scale = "scale";
 }


[33/50] [abbrv] incubator-weex git commit: Merge pull request #2215 from acton393/ios-feature-20170118

Posted by ji...@apache.org.
Merge pull request #2215 from acton393/ios-feature-20170118

* [ios] support textarea padding

Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/970e3b86
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/970e3b86
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/970e3b86

Branch: refs/heads/master
Commit: 970e3b86bc76fad79529f803219a9e62d0af43d5
Parents: 4462c12 7935c85
Author: \u9f50\u5c71 <su...@163.com>
Authored: Wed Jan 11 16:04:44 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Wed Jan 11 16:04:44 2017 +0800

----------------------------------------------------------------------
 .../Sources/Component/WXTextAreaComponent.m     | 110 +++++++------------
 1 file changed, 42 insertions(+), 68 deletions(-)
----------------------------------------------------------------------



[35/50] [abbrv] incubator-weex git commit: * [android] new simplelist component (#137)

Posted by ji...@apache.org.
* [android] new simplelist component (#137)



Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/5a700270
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/5a700270
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/5a700270

Branch: refs/heads/master
Commit: 5a700270c9daf3288c3aaa93105a99884731252d
Parents: 405b6e6
Author: sospartan zheng <so...@apache.org>
Authored: Wed Jan 11 16:07:02 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Wed Jan 11 16:07:02 2017 +0800

----------------------------------------------------------------------
 .../main/java/com/taobao/weex/WXSDKEngine.java  |    4 +-
 .../ui/component/list/BasicListComponent.java   | 1104 ++++++++++++++++++
 .../ui/component/list/ListComponentView.java    |  223 ++++
 .../ui/component/list/SimpleListComponent.java  |  231 ++++
 .../ui/component/list/SimpleRecyclerView.java   |  329 ++++++
 .../weex/ui/component/list/WXListComponent.java |  944 +--------------
 .../refresh/wrapper/BounceRecyclerView.java     |   15 +-
 7 files changed, 1951 insertions(+), 899 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/5a700270/android/sdk/src/main/java/com/taobao/weex/WXSDKEngine.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/WXSDKEngine.java b/android/sdk/src/main/java/com/taobao/weex/WXSDKEngine.java
index b30f289..a3266a9 100755
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKEngine.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKEngine.java
@@ -145,6 +145,8 @@ import com.taobao.weex.dom.WXListDomObject;
 import com.taobao.weex.dom.WXScrollerDomObject;
 import com.taobao.weex.dom.WXSwitchDomObject;
 import com.taobao.weex.dom.WXTextDomObject;
+import com.taobao.weex.ui.component.list.SimpleListComponent;
+import com.taobao.weex.ui.module.WXModalUIModule;
 import com.taobao.weex.http.WXStreamModule;
 import com.taobao.weex.ui.ExternalLoaderComponentHolder;
 import com.taobao.weex.ui.IExternalComponentGetter;
@@ -176,7 +178,6 @@ import com.taobao.weex.ui.component.list.HorizontalListComponent;
 import com.taobao.weex.ui.component.list.WXCell;
 import com.taobao.weex.ui.component.list.WXListComponent;
 import com.taobao.weex.ui.module.WXMetaModule;
-import com.taobao.weex.ui.module.WXModalUIModule;
 import com.taobao.weex.ui.module.WXTimerModule;
 import com.taobao.weex.ui.module.WXWebViewModule;
 import com.taobao.weex.utils.WXLogUtils;
@@ -345,6 +346,7 @@ public class WXSDKEngine {
         true,
         WXBasicComponentType.SLIDER_NEIGHBOR
       );
+      registerComponent(SimpleListComponent.class,false,"simplelist");
       registerComponent(WXListComponent.class, false,WXBasicComponentType.LIST,WXBasicComponentType.VLIST);
       registerComponent(HorizontalListComponent.class,false,WXBasicComponentType.HLIST);
       registerComponent(WXBasicComponentType.CELL, WXCell.class, true);

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/5a700270/android/sdk/src/main/java/com/taobao/weex/ui/component/list/BasicListComponent.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/BasicListComponent.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/BasicListComponent.java
new file mode 100644
index 0000000..226d0c5
--- /dev/null
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/BasicListComponent.java
@@ -0,0 +1,1104 @@
+/**
+ *
+ *                                  Apache License
+ *                            Version 2.0, January 2004
+ *                         http://www.apache.org/licenses/
+ *
+ *    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+ *
+ *    1. Definitions.
+ *
+ *       "License" shall mean the terms and conditions for use, reproduction,
+ *       and distribution as defined by Sections 1 through 9 of this document.
+ *
+ *       "Licensor" shall mean the copyright owner or entity authorized by
+ *       the copyright owner that is granting the License.
+ *
+ *       "Legal Entity" shall mean the union of the acting entity and all
+ *       other entities that control, are controlled by, or are under common
+ *       control with that entity. For the purposes of this definition,
+ *       "control" means (i) the power, direct or indirect, to cause the
+ *       direction or management of such entity, whether by contract or
+ *       otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ *       outstanding shares, or (iii) beneficial ownership of such entity.
+ *
+ *       "You" (or "Your") shall mean an individual or Legal Entity
+ *       exercising permissions granted by this License.
+ *
+ *       "Source" form shall mean the preferred form for making modifications,
+ *       including but not limited to software source code, documentation
+ *       source, and configuration files.
+ *
+ *       "Object" form shall mean any form resulting from mechanical
+ *       transformation or translation of a Source form, including but
+ *       not limited to compiled object code, generated documentation,
+ *       and conversions to other media types.
+ *
+ *       "Work" shall mean the work of authorship, whether in Source or
+ *       Object form, made available under the License, as indicated by a
+ *       copyright notice that is included in or attached to the work
+ *       (an example is provided in the Appendix below).
+ *
+ *       "Derivative Works" shall mean any work, whether in Source or Object
+ *       form, that is based on (or derived from) the Work and for which the
+ *       editorial revisions, annotations, elaborations, or other modifications
+ *       represent, as a whole, an original work of authorship. For the purposes
+ *       of this License, Derivative Works shall not include works that remain
+ *       separable from, or merely link (or bind by name) to the interfaces of,
+ *       the Work and Derivative Works thereof.
+ *
+ *       "Contribution" shall mean any work of authorship, including
+ *       the original version of the Work and any modifications or additions
+ *       to that Work or Derivative Works thereof, that is intentionally
+ *       submitted to Licensor for inclusion in the Work by the copyright owner
+ *       or by an individual or Legal Entity authorized to submit on behalf of
+ *       the copyright owner. For the purposes of this definition, "submitted"
+ *       means any form of electronic, verbal, or written communication sent
+ *       to the Licensor or its representatives, including but not limited to
+ *       communication on electronic mailing lists, source code control systems,
+ *       and issue tracking systems that are managed by, or on behalf of, the
+ *       Licensor for the purpose of discussing and improving the Work, but
+ *       excluding communication that is conspicuously marked or otherwise
+ *       designated in writing by the copyright owner as "Not a Contribution."
+ *
+ *       "Contributor" shall mean Licensor and any individual or Legal Entity
+ *       on behalf of whom a Contribution has been received by Licensor and
+ *       subsequently incorporated within the Work.
+ *
+ *    2. Grant of Copyright License. Subject to the terms and conditions of
+ *       this License, each Contributor hereby grants to You a perpetual,
+ *       worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ *       copyright license to reproduce, prepare Derivative Works of,
+ *       publicly display, publicly perform, sublicense, and distribute the
+ *       Work and such Derivative Works in Source or Object form.
+ *
+ *    3. Grant of Patent License. Subject to the terms and conditions of
+ *       this License, each Contributor hereby grants to You a perpetual,
+ *       worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ *       (except as stated in this section) patent license to make, have made,
+ *       use, offer to sell, sell, import, and otherwise transfer the Work,
+ *       where such license applies only to those patent claims licensable
+ *       by such Contributor that are necessarily infringed by their
+ *       Contribution(s) alone or by combination of their Contribution(s)
+ *       with the Work to which such Contribution(s) was submitted. If You
+ *       institute patent litigation against any entity (including a
+ *       cross-claim or counterclaim in a lawsuit) alleging that the Work
+ *       or a Contribution incorporated within the Work constitutes direct
+ *       or contributory patent infringement, then any patent licenses
+ *       granted to You under this License for that Work shall terminate
+ *       as of the date such litigation is filed.
+ *
+ *    4. Redistribution. You may reproduce and distribute copies of the
+ *       Work or Derivative Works thereof in any medium, with or without
+ *       modifications, and in Source or Object form, provided that You
+ *       meet the following conditions:
+ *
+ *       (a) You must give any other recipients of the Work or
+ *           Derivative Works a copy of this License; and
+ *
+ *       (b) You must cause any modified files to carry prominent notices
+ *           stating that You changed the files; and
+ *
+ *       (c) You must retain, in the Source form of any Derivative Works
+ *           that You distribute, all copyright, patent, trademark, and
+ *           attribution notices from the Source form of the Work,
+ *           excluding those notices that do not pertain to any part of
+ *           the Derivative Works; and
+ *
+ *       (d) If the Work includes a "NOTICE" text file as part of its
+ *           distribution, then any Derivative Works that You distribute must
+ *           include a readable copy of the attribution notices contained
+ *           within such NOTICE file, excluding those notices that do not
+ *           pertain to any part of the Derivative Works, in at least one
+ *           of the following places: within a NOTICE text file distributed
+ *           as part of the Derivative Works; within the Source form or
+ *           documentation, if provided along with the Derivative Works; or,
+ *           within a display generated by the Derivative Works, if and
+ *           wherever such third-party notices normally appear. The contents
+ *           of the NOTICE file are for informational purposes only and
+ *           do not modify the License. You may add Your own attribution
+ *           notices within Derivative Works that You distribute, alongside
+ *           or as an addendum to the NOTICE text from the Work, provided
+ *           that such additional attribution notices cannot be construed
+ *           as modifying the License.
+ *
+ *       You may add Your own copyright statement to Your modifications and
+ *       may provide additional or different license terms and conditions
+ *       for use, reproduction, or distribution of Your modifications, or
+ *       for any such Derivative Works as a whole, provided Your use,
+ *       reproduction, and distribution of the Work otherwise complies with
+ *       the conditions stated in this License.
+ *
+ *    5. Submission of Contributions. Unless You explicitly state otherwise,
+ *       any Contribution intentionally submitted for inclusion in the Work
+ *       by You to the Licensor shall be under the terms and conditions of
+ *       this License, without any additional terms or conditions.
+ *       Notwithstanding the above, nothing herein shall supersede or modify
+ *       the terms of any separate license agreement you may have executed
+ *       with Licensor regarding such Contributions.
+ *
+ *    6. Trademarks. This License does not grant permission to use the trade
+ *       names, trademarks, service marks, or product names of the Licensor,
+ *       except as required for reasonable and customary use in describing the
+ *       origin of the Work and reproducing the content of the NOTICE file.
+ *
+ *    7. Disclaimer of Warranty. Unless required by applicable law or
+ *       agreed to in writing, Licensor provides the Work (and each
+ *       Contributor provides its Contributions) on an "AS IS" BASIS,
+ *       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ *       implied, including, without limitation, any warranties or conditions
+ *       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ *       PARTICULAR PURPOSE. You are solely responsible for determining the
+ *       appropriateness of using or redistributing the Work and assume any
+ *       risks associated with Your exercise of permissions under this License.
+ *
+ *    8. Limitation of Liability. In no event and under no legal theory,
+ *       whether in tort (including negligence), contract, or otherwise,
+ *       unless required by applicable law (such as deliberate and grossly
+ *       negligent acts) or agreed to in writing, shall any Contributor be
+ *       liable to You for damages, including any direct, indirect, special,
+ *       incidental, or consequential damages of any character arising as a
+ *       result of this License or out of the use or inability to use the
+ *       Work (including but not limited to damages for loss of goodwill,
+ *       work stoppage, computer failure or malfunction, or any and all
+ *       other commercial damages or losses), even if such Contributor
+ *       has been advised of the possibility of such damages.
+ *
+ *    9. Accepting Warranty or Additional Liability. While redistributing
+ *       the Work or Derivative Works thereof, You may choose to offer,
+ *       and charge a fee for, acceptance of support, warranty, indemnity,
+ *       or other liability obligations and/or rights consistent with this
+ *       License. However, in accepting such obligations, You may act only
+ *       on Your own behalf and on Your sole responsibility, not on behalf
+ *       of any other Contributor, and only if You agree to indemnify,
+ *       defend, and hold each Contributor harmless for any liability
+ *       incurred by, or claims asserted against, such Contributor by reason
+ *       of your accepting any such warranty or additional liability.
+ *
+ *    END OF TERMS AND CONDITIONS
+ *
+ *    APPENDIX: How to apply the Apache License to your work.
+ *
+ *       To apply the Apache License to your work, attach the following
+ *       boilerplate notice, with the fields enclosed by brackets "[]"
+ *       replaced with your own identifying information. (Don't include
+ *       the brackets!)  The text should be enclosed in the appropriate
+ *       comment syntax for the file format. We also recommend that a
+ *       file or class name and description of purpose be included on the
+ *       same "printed page" as the copyright notice for easier
+ *       identification within third-party archives.
+ *
+ *    Copyright 2016 Alibaba Group
+ *
+ *    Licensed 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.ui.component.list;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.graphics.Color;
+import android.graphics.PointF;
+import android.os.Build;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.util.ArrayMap;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.text.TextUtils;
+import android.util.SparseArray;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+
+import com.taobao.weex.WXEnvironment;
+import com.taobao.weex.WXSDKInstance;
+import com.taobao.weex.annotation.JSMethod;
+import com.taobao.weex.common.Constants;
+import com.taobao.weex.common.OnWXScrollListener;
+import com.taobao.weex.common.WXRuntimeException;
+import com.taobao.weex.dom.WXDomObject;
+import com.taobao.weex.ui.component.AppearanceHelper;
+import com.taobao.weex.ui.component.Scrollable;
+import com.taobao.weex.ui.component.WXBaseRefresh;
+import com.taobao.weex.ui.component.WXComponent;
+import com.taobao.weex.ui.component.WXComponentProp;
+import com.taobao.weex.ui.component.WXLoading;
+import com.taobao.weex.ui.component.WXRefresh;
+import com.taobao.weex.ui.component.WXVContainer;
+import com.taobao.weex.ui.component.helper.WXStickyHelper;
+import com.taobao.weex.ui.view.listview.WXRecyclerView;
+import com.taobao.weex.ui.view.listview.adapter.IOnLoadMoreListener;
+import com.taobao.weex.ui.view.listview.adapter.IRecyclerAdapterListener;
+import com.taobao.weex.ui.view.listview.adapter.ListBaseViewHolder;
+import com.taobao.weex.ui.view.listview.adapter.RecyclerViewBaseAdapter;
+import com.taobao.weex.ui.view.listview.adapter.TransformItemDecoration;
+import com.taobao.weex.ui.view.listview.adapter.WXRecyclerViewOnScrollListener;
+import com.taobao.weex.ui.view.refresh.wrapper.BounceRecyclerView;
+import com.taobao.weex.utils.WXLogUtils;
+import com.taobao.weex.utils.WXUtils;
+import com.taobao.weex.utils.WXViewUtils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Created by sospartan on 13/12/2016.
+ */
+
+public abstract class BasicListComponent<T extends ViewGroup & ListComponentView> extends WXVContainer<T> implements
+    IRecyclerAdapterListener<ListBaseViewHolder>, IOnLoadMoreListener, Scrollable {
+  public static final String TRANSFORM = "transform";
+  public static final String LOADMOREOFFSET = "loadmoreoffset";
+  private String TAG = "BasicListComponent";
+  private int mListCellCount = 0;
+  private String mLoadMoreRetry = "";
+  private ArrayList<ListBaseViewHolder> recycleViewList = new ArrayList<>();
+  private static final Pattern transformPattern = Pattern.compile("([a-z]+)\\(([0-9\\.]+),?([0-9\\.]+)?\\)");
+
+  private Map<String, AppearanceHelper> mAppearComponents = new HashMap<>();
+
+  private boolean scrollable = true;
+  private ArrayMap<String, Long> mRefToViewType;
+  private SparseArray<ArrayList<WXComponent>> mViewTypes;
+  protected BounceRecyclerView bounceRecyclerView;
+  private WXRecyclerViewOnScrollListener mViewOnScrollListener = new WXRecyclerViewOnScrollListener(this);
+
+  private static final int MAX_VIEWTYPE_ALLOW_CACHE = 9;
+  private static boolean mAllowCacheViewHolder = true;
+  private static boolean mDownForBidCacheViewHolder = false;
+
+  /**
+   * Map for storing component that is sticky.
+   **/
+  private Map<String, HashMap<String, WXComponent>> mStickyMap = new HashMap<>();
+  private WXStickyHelper stickyHelper;
+
+
+  public BasicListComponent(WXSDKInstance instance, WXDomObject node, WXVContainer parent) {
+    super(instance, node, parent);
+    stickyHelper = new WXStickyHelper(this);
+  }
+
+  /**
+   * Measure the size of the recyclerView.
+   *
+   * @param width  the expected width
+   * @param height the expected height
+   * @return the result of measurement
+   */
+  @Override
+  protected MeasureOutput measure(int width, int height) {
+    int screenH = WXViewUtils.getScreenHeight(WXEnvironment.sApplication);
+    int weexH = WXViewUtils.getWeexHeight(getInstanceId());
+    int outHeight = height > (weexH >= screenH ? screenH : weexH) ? weexH - getAbsoluteY() : height;
+    return super.measure(width, outHeight);
+  }
+
+  protected int getOrientation() {
+    return Constants.Orientation.VERTICAL;
+  }
+
+  @Override
+  public void destroy() {
+    super.destroy();
+    if (mStickyMap != null)
+      mStickyMap.clear();
+    if (mViewTypes != null)
+      mViewTypes.clear();
+    if (mRefToViewType != null)
+      mRefToViewType.clear();
+  }
+
+  @Override
+  public ViewGroup.LayoutParams getChildLayoutParams(WXComponent child, View hostView, int width, int height, int left, int right, int top, int bottom) {
+    ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) hostView.getLayoutParams();
+    if (child instanceof WXBaseRefresh && params == null) {
+      params = new LinearLayout.LayoutParams(width, height);
+    } else if (params == null) {
+      params = new RecyclerView.LayoutParams(width, height);
+    } else {
+      params.width = width;
+      params.height = height;
+      params.setMargins(left, 0, right, 0);
+    }
+    return params;
+  }
+
+  /**
+   * These transform functions are supported:
+   * - `scale(x,y)`: scale item, x and y should be a positive float number.
+   * - `translate(x,y)`: translate item, `x` and `y` shoule be integer numbers.
+   * - `opacity(n)`: change the transparency of item, `n` must in `[0,1.0]`.
+   * - `rotate(n)`: rotate item, n is integer number.
+   *
+   * @param raw
+   * @return
+   */
+  private RecyclerView.ItemDecoration parseTransforms(String raw) {
+    if (raw == null) {
+      return null;
+    }
+    float scaleX = 0f, scaleY = 0f;
+    int translateX = 0, translateY = 0;
+    float opacity = 0f;
+    int rotate = 0;
+    //public TransformItemDecoration(boolean isVertical,float alpha,int translateX,int translateY,int rotation,float scale)
+    Matcher matcher = transformPattern.matcher(raw);
+    while (matcher.find()) {
+      String match = matcher.group();
+      String name = matcher.group(1);
+      try {
+        switch (name) {
+          case "scale":
+            scaleX = Float.parseFloat(matcher.group(2));
+            scaleY = Float.parseFloat(matcher.group(3));
+            break;
+          case "translate":
+            translateX = Integer.parseInt(matcher.group(2));
+            translateY = Integer.parseInt(matcher.group(3));
+            break;
+          case "opacity":
+            opacity = Float.parseFloat(matcher.group(2));
+            break;
+          case "rotate":
+            rotate = Integer.parseInt(matcher.group(2));
+            break;
+          default:
+            WXLogUtils.e(TAG, "Invaild transform expression:" + match);
+            break;
+        }
+      } catch (NumberFormatException e) {
+        WXLogUtils.e("", e);
+        WXLogUtils.e(TAG, "Invaild transform expression:" + match);
+      }
+    }
+    return new TransformItemDecoration(getOrientation() == Constants.Orientation.VERTICAL, opacity, translateX, translateY, rotate, scaleX, scaleY);
+  }
+
+  abstract T generateListView(Context context, int orientation);
+
+  @Override
+  protected T initComponentHostView(@NonNull Context context) {
+    T bounceRecyclerView = generateListView(context, getOrientation());
+
+    String transforms = (String) getDomObject().getAttrs().get(TRANSFORM);
+    if (transforms != null) {
+      bounceRecyclerView.getInnerView().addItemDecoration(parseTransforms(transforms));
+    }
+
+    RecyclerViewBaseAdapter recyclerViewBaseAdapter = new RecyclerViewBaseAdapter<>(this);
+    recyclerViewBaseAdapter.setHasStableIds(true);
+    bounceRecyclerView.setRecyclerViewBaseAdapter(recyclerViewBaseAdapter);
+    bounceRecyclerView.setOverScrollMode(View.OVER_SCROLL_NEVER);
+    bounceRecyclerView.getInnerView().clearOnScrollListeners();
+    bounceRecyclerView.getInnerView().addOnScrollListener(mViewOnScrollListener);
+    bounceRecyclerView.getInnerView().addOnScrollListener(new RecyclerView.OnScrollListener() {
+      @Override
+      public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
+        super.onScrollStateChanged(recyclerView, newState);
+
+        if (newState == RecyclerView.SCROLL_STATE_IDLE) {
+          for (ListBaseViewHolder holder : recycleViewList) {
+            if (holder != null
+                && holder.getComponent() != null
+                && !holder.getComponent().isUsing()) {
+              recycleImage(holder.getView());
+            }
+          }
+          recycleViewList.clear();
+        }
+        List<OnWXScrollListener> listeners = getInstance().getWXScrollListeners();
+        if (listeners != null && listeners.size() > 0) {
+          for (OnWXScrollListener listener : listeners) {
+            if (listener != null) {
+              View topView = recyclerView.getChildAt(0);
+              if (topView != null) {
+                int y = topView.getTop();
+                listener.onScrollStateChanged(recyclerView, 0, y, newState);
+              }
+            }
+          }
+        }
+      }
+
+      @Override
+      public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
+        super.onScrolled(recyclerView, dx, dy);
+        List<OnWXScrollListener> listeners = getInstance().getWXScrollListeners();
+        if (listeners != null && listeners.size() > 0) {
+          for (OnWXScrollListener listener : listeners) {
+            if (listener != null) {
+              listener.onScrolled(recyclerView, dx, dy);
+            }
+          }
+        }
+      }
+    });
+    bounceRecyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
+      @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
+      @Override
+      public void onGlobalLayout() {
+        T view;
+        if ((view = getHostView()) == null)
+          return;
+        mViewOnScrollListener.onScrolled(view.getInnerView(), 0, 0);
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
+          view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
+        } else {
+          view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
+        }
+      }
+    });
+    return bounceRecyclerView;
+  }
+
+  @Override
+  public void bindStickStyle(WXComponent component) {
+    stickyHelper.bindStickStyle(component, mStickyMap);
+  }
+
+  @Override
+  public void unbindStickStyle(WXComponent component) {
+    stickyHelper.unbindStickStyle(component, mStickyMap);
+  }
+
+  private
+  @Nullable
+  WXComponent findDirectListChild(WXComponent comp) {
+    WXComponent parent;
+    if (comp == null || (parent = comp.getParent()) == null) {
+      return null;
+    }
+
+    if (parent instanceof WXListComponent) {
+      return comp;
+    }
+
+    return findDirectListChild(parent);
+  }
+
+  @Override
+  protected boolean setProperty(String key, Object param) {
+    switch (key) {
+      case LOADMOREOFFSET:
+        return true;
+      case Constants.Name.SCROLLABLE:
+        boolean scrollable = WXUtils.getBoolean(param, true);
+        setScrollable(scrollable);
+        return true;
+    }
+    return super.setProperty(key, param);
+  }
+
+  @WXComponentProp(name = Constants.Name.SCROLLABLE)
+  public void setScrollable(boolean scrollable) {
+    View inner = getHostView().getInnerView();
+    if (inner instanceof WXRecyclerView) {
+      ((WXRecyclerView) inner).setScrollable(scrollable);
+    }
+    ;
+  }
+
+  private void setAppearanceWatch(WXComponent component, int event, boolean enable) {
+    AppearanceHelper item = mAppearComponents.get(component.getRef());
+    if (item != null) {
+      item.setWatchEvent(event, enable);
+    } else if (!enable) {
+      //Do nothing if disable target not exist.
+    } else {
+      WXComponent dChild = findDirectListChild(component);
+      int index = mChildren.indexOf(dChild);
+      if (index != -1) {
+        item = new AppearanceHelper(component, index);
+        item.setWatchEvent(event, true);
+        mAppearComponents.put(component.getRef(), item);
+      }
+    }
+  }
+
+  @Override
+  public void bindAppearEvent(WXComponent component) {
+    setAppearanceWatch(component, AppearanceHelper.APPEAR, true);
+  }
+
+  @Override
+  public void bindDisappearEvent(WXComponent component) {
+    setAppearanceWatch(component, AppearanceHelper.DISAPPEAR, true);
+  }
+
+  @Override
+  public void unbindAppearEvent(WXComponent component) {
+    setAppearanceWatch(component, AppearanceHelper.APPEAR, false);
+  }
+
+  @Override
+  public void unbindDisappearEvent(WXComponent component) {
+    setAppearanceWatch(component, AppearanceHelper.DISAPPEAR, false);
+  }
+
+  @Override
+  public void scrollTo(WXComponent component, final int offset) {
+    if (bounceRecyclerView == null) {
+      return;
+    }
+
+    WXComponent parent = component;
+    WXCell cell = null;
+    while (parent != null) {
+      if (parent instanceof WXCell) {
+        cell = (WXCell) parent;
+        break;
+      }
+      parent = parent.getParent();
+    }
+    if (cell != null) {
+      int pos = mChildren.indexOf(cell);
+      final WXRecyclerView view = bounceRecyclerView.getInnerView();
+      view.scrollToPosition(pos);
+      final WXComponent cellComp = cell;
+      //scroll cell to top
+      view.postDelayed(new Runnable() {
+        @Override
+        public void run() {
+          if (cellComp.getHostView() == null) {
+            return;
+          }
+          View cellView = cellComp.getHostView();
+          if (getOrientation() == Constants.Orientation.VERTICAL) {
+            int scrollY = cellView.getTop() + offset;
+            view.smoothScrollBy(0, scrollY);
+          } else {
+            int scrollX = cellView.getLeft() + offset;
+            view.smoothScrollBy(scrollX, 0);
+          }
+        }
+      }, 50);
+
+    }
+
+  }
+
+  @Override
+  public void onBeforeScroll(int dx, int dy) {
+    if (mStickyMap == null) {
+      return;
+    }
+    HashMap<String, WXComponent> stickyMap = mStickyMap.get(getRef());
+    if (stickyMap == null) {
+      return;
+    }
+    Iterator<Map.Entry<String, WXComponent>> iterator = stickyMap.entrySet().iterator();
+    Map.Entry<String, WXComponent> entry;
+    WXComponent stickyComponent;
+    while (iterator.hasNext()) {
+      entry = iterator.next();
+      stickyComponent = entry.getValue();
+
+      if (stickyComponent != null && stickyComponent.getDomObject() != null
+          && stickyComponent instanceof WXCell) {
+
+        WXCell cell = (WXCell) stickyComponent;
+        if (cell.getHostView() == null) {
+          return;
+        }
+
+        if (stickyComponent != null && stickyComponent.getDomObject() != null
+            && stickyComponent instanceof WXCell) {
+          if (stickyComponent.getHostView() == null) {
+            return;
+          }
+
+          RecyclerView.LayoutManager layoutManager;
+          boolean beforeFirstVisibleItem = false;
+          if ((layoutManager = getHostView().getInnerView().getLayoutManager()) instanceof LinearLayoutManager) {
+            int fVisible = ((LinearLayoutManager) layoutManager).findFirstVisibleItemPosition();
+            int pos = mChildren.indexOf(cell);
+
+            if (pos <= fVisible) {
+              beforeFirstVisibleItem = true;
+            }
+          }
+
+          int[] location = new int[2];
+          stickyComponent.getHostView().getLocationOnScreen(location);
+          int[] parentLocation = new int[2];
+          stickyComponent.getParentScroller().getView().getLocationOnScreen(parentLocation);
+
+          int top = location[1] - parentLocation[1];
+
+          boolean showSticky = beforeFirstVisibleItem && cell.getLocationFromStart() >= 0 && top <= 0 && dy >= 0;
+          boolean removeSticky = cell.getLocationFromStart() <= 0 && top > 0 && dy <= 0;
+          if (showSticky) {
+            bounceRecyclerView.notifyStickyShow(cell);
+          } else if (removeSticky) {
+            bounceRecyclerView.notifyStickyRemove(cell);
+          }
+          cell.setLocationFromStart(top);
+        }
+      }
+    }
+  }
+
+  @Override
+  public int getScrollY() {
+    return bounceRecyclerView == null ? 0 : bounceRecyclerView.getInnerView().getScrollY();
+  }
+
+  @Override
+  public int getScrollX() {
+    return bounceRecyclerView == null ? 0 : bounceRecyclerView.getInnerView().getScrollX();
+  }
+
+  /**
+   * Append a child component to the end of WXListComponent. This will not refresh the underlying
+   * view immediately. The message of index of the inserted child is given to the adapter, and the
+   * adapter will determine when to refresh. The default implementation of adapter will push the
+   * message into a message and refresh the view in a period of time.
+   *
+   * @param child the inserted child
+   */
+  @Override
+  public void addChild(WXComponent child) {
+    addChild(child, -1);
+  }
+
+  @Override
+  protected int getChildrenLayoutTopOffset() {
+    return 0;
+  }
+
+  /**
+   * @param child the inserted child
+   * @param index the index of the child to be inserted.
+   * @see #addChild(WXComponent)
+   */
+  @Override
+  public void addChild(WXComponent child, int index) {
+    super.addChild(child, index);
+
+    if (child == null || index < -1) {
+      return;
+    }
+    int count = mChildren.size();
+    index = index >= count ? -1 : index;
+    bindViewType(child);
+
+    int adapterPosition = index == -1 ? mChildren.size() - 1 : index;
+    T view = getHostView();
+    if (view != null) {
+      view.getRecyclerViewBaseAdapter().notifyItemInserted(adapterPosition);
+    }
+    relocateAppearanceHelper();
+  }
+
+
+  private void relocateAppearanceHelper() {
+    Iterator<Map.Entry<String, AppearanceHelper>> iterator = mAppearComponents.entrySet().iterator();
+    while (iterator.hasNext()) {
+      Map.Entry<String, AppearanceHelper> item = iterator.next();
+      AppearanceHelper value = item.getValue();
+      WXComponent dChild = findDirectListChild(value.getAwareChild());
+      int index = mChildren.indexOf(dChild);
+      value.setCellPosition(index);
+    }
+  }
+
+
+  /**
+   * RecyclerView manage its children in a way that different from {@link WXVContainer}. Therefore,
+   * {@link WXVContainer#addSubView(View, int)} is an empty implementation in {@link
+   * com.taobao.weex.ui.view.listview.WXRecyclerView}
+   */
+  @Override
+  protected void addSubView(View child, int index) {
+
+  }
+
+  /**
+   * Remove the child from WXListComponent. This method will use {@link
+   * java.util.List#indexOf(Object)} to retrieve the component to be deleted. Like {@link
+   * #addChild(WXComponent)}, this method will not refresh the view immediately, the adapter will
+   * decide when to refresh.
+   *
+   * @param child the child to be removed
+   */
+  @Override
+  public void remove(WXComponent child, boolean destroy) {
+    int index = mChildren.indexOf(child);
+    if (destroy) {
+      child.detachViewAndClearPreInfo();
+    }
+    unBindViewType(child);
+
+    T view = getHostView();
+    if (view == null) {
+      return;
+    }
+    view.getRecyclerViewBaseAdapter().notifyItemRemoved(index);
+    if (WXEnvironment.isApkDebugable()) {
+      WXLogUtils.d(TAG, "removeChild child at " + index);
+    }
+    super.remove(child, destroy);
+  }
+
+
+  @Override
+  public void computeVisiblePointInViewCoordinate(PointF pointF) {
+    RecyclerView view = getHostView().getInnerView();
+    pointF.set(view.computeHorizontalScrollOffset(), view.computeVerticalScrollOffset());
+  }
+
+  /**
+   * Recycle viewHolder and its underlying view. This may because the view is removed or reused.
+   * Either case, this method will be called.
+   *
+   * @param holder The view holder to be recycled.
+   */
+  @Override
+  public void onViewRecycled(ListBaseViewHolder holder) {
+    long begin = System.currentTimeMillis();
+    holder.setComponentUsing(false);
+    recycleViewList.add(holder);
+    if (WXEnvironment.isApkDebugable()) {
+      WXLogUtils.d(TAG, "Recycle holder " + (System.currentTimeMillis() - begin) + "  Thread:" + Thread.currentThread().getName());
+    }
+  }
+
+  /**
+   * Bind the component of the position to the holder. Then flush the view.
+   *
+   * @param holder   viewHolder, which holds reference to the view
+   * @param position position of component in WXListComponent
+   */
+  @Override
+  public void onBindViewHolder(ListBaseViewHolder holder, int position) {
+    if (holder == null) return;
+    holder.setComponentUsing(true);
+    WXComponent component = getChild(position);
+    if (component == null
+        || (component instanceof WXRefresh)
+        || (component instanceof WXLoading)
+        || (component.getDomObject() != null && component.getDomObject().isFixed())
+        ) {
+      if (WXEnvironment.isApkDebugable()) {
+        WXLogUtils.d(TAG, "Bind WXRefresh & WXLoading " + holder);
+      }
+      return;
+    }
+
+    if (holder.getComponent() != null && holder.getComponent() instanceof WXCell) {
+      holder.getComponent().bindData(component);
+//              holder.getComponent().refreshData(component);
+    }
+
+  }
+
+  /**
+   * Create an instance of {@link ListBaseViewHolder} for the given viewType (not for the given
+   * index). This method will look up for the first component that fits the viewType requirement and
+   * doesn't be used. Then create the certain type of view, detach the view f[rom the component.
+   *
+   * @param parent   the ViewGroup into which the new view will be inserted
+   * @param viewType the type of the new view
+   * @return the created view holder.
+   */
+  @Override
+  public ListBaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+    if (mChildren != null) {
+      if (mViewTypes == null)
+        return createVHForFakeComponent(viewType);
+      ArrayList<WXComponent> mTypes = mViewTypes.get(viewType);
+      checkRecycledViewPool(viewType);
+      if (mTypes == null)
+        return createVHForFakeComponent(viewType);
+
+      for (int i = 0; i < mTypes.size(); i++) {
+        WXComponent component = mTypes.get(i);
+        if (component == null
+            || component.isUsing()) {
+          continue;
+        }
+        if (component.getDomObject() != null && component.getDomObject().isFixed()) {
+          return createVHForFakeComponent(viewType);
+        } else {
+          if (component instanceof WXCell) {
+            if (component.getRealView() != null) {
+              return new ListBaseViewHolder(component, viewType);
+            } else {
+              ((WXCell) component).lazy(false);
+              component.createView();
+              component.applyLayoutAndEvent(component);
+              return new ListBaseViewHolder(component, viewType);
+            }
+          } else if (component instanceof WXBaseRefresh) {
+            return createVHForRefreshComponent(viewType);
+          } else {
+            WXLogUtils.e(TAG, "List cannot include element except cell\u3001header\u3001fixed\u3001refresh and loading");
+            return createVHForFakeComponent(viewType);
+          }
+        }
+      }
+    }
+    if (WXEnvironment.isApkDebugable()) {
+      WXLogUtils.e(TAG, "Cannot find request viewType: " + viewType);
+    }
+    return createVHForFakeComponent(viewType);
+  }
+
+  /**
+   * Forbid ViewHolder cache if viewType > MAX_VIEWTYPE_ALLOW_CACHE
+   *
+   * @param viewType
+   */
+  private void checkRecycledViewPool(int viewType) {
+    try {
+      if (mViewTypes.size() > MAX_VIEWTYPE_ALLOW_CACHE)
+        mAllowCacheViewHolder = false;
+
+      if (mDownForBidCacheViewHolder)
+        if (getHostView() != null && getHostView().getInnerView() != null)
+          getHostView().getInnerView().getRecycledViewPool().setMaxRecycledViews(viewType, 0);
+
+      if (!mDownForBidCacheViewHolder) {
+        if (!mAllowCacheViewHolder) {
+          if (getHostView() != null && getHostView().getInnerView() != null) {
+            for (int i = 0; i < mViewTypes.size(); i++) {
+              getHostView().getInnerView().getRecycledViewPool().setMaxRecycledViews(mViewTypes.keyAt(i), 0);
+            }
+            mDownForBidCacheViewHolder = true;
+          }
+        }
+      }
+    } catch (Exception e) {
+      WXLogUtils.e(TAG, "Clear recycledViewPool error!");
+    }
+  }
+
+  /**
+   * Return the child component type. The type is defined by scopeValue in .we file.
+   *
+   * @param position the position of the child component.
+   * @return the type of certain component.
+   */
+  @Override
+  public int getItemViewType(int position) {
+    return generateViewType(getChild(position));
+  }
+
+  /**
+   * ViewType will be classified into {HashMap<Integer,ArrayList<Integer>> mViewTypes}
+   *
+   * @param component
+   */
+  private void bindViewType(WXComponent component) {
+    int id = generateViewType(component);
+
+    if (mViewTypes == null) {
+      mViewTypes = new SparseArray<>();
+    }
+
+    ArrayList<WXComponent> mTypes = mViewTypes.get(id);
+
+    if (mTypes == null) {
+      mTypes = new ArrayList<>();
+      mViewTypes.put(id, mTypes);
+    }
+    mTypes.add(component);
+  }
+
+  private void unBindViewType(WXComponent component) {
+    int id = generateViewType(component);
+
+    if (mViewTypes == null)
+      return;
+    ArrayList<WXComponent> mTypes = mViewTypes.get(id);
+    if (mTypes == null)
+      return;
+
+    mTypes.remove(component);
+  }
+
+  /**
+   * generate viewtype by component
+   *
+   * @param component
+   * @return
+   */
+  private int generateViewType(WXComponent component) {
+    long id;
+    try {
+      id = Integer.parseInt(component.getDomObject().getRef());
+      String type = component.getDomObject().getAttrs().getScope();
+
+      if (!TextUtils.isEmpty(type)) {
+        if (mRefToViewType == null) {
+          mRefToViewType = new ArrayMap<>();
+        }
+        if (!mRefToViewType.containsKey(type)) {
+          mRefToViewType.put(type, id);
+        }
+        id = mRefToViewType.get(type);
+
+      }
+    } catch (RuntimeException e) {
+      WXLogUtils.eTag(TAG, e);
+      id = RecyclerView.NO_ID;
+      WXLogUtils.e(TAG, "getItemViewType: NO ID, this will crash the whole render system of WXListRecyclerView");
+    }
+    return (int) id;
+  }
+
+  /**
+   * Get child component num.
+   *
+   * @return return the size of {@link #mChildren} if mChildren is not empty, otherwise, return 0;
+   */
+  @Override
+  public int getItemCount() {
+    return getChildCount();
+  }
+
+  @Override
+  public boolean onFailedToRecycleView(ListBaseViewHolder holder) {
+    if (WXEnvironment.isApkDebugable()) {
+      WXLogUtils.d(TAG, "Failed to recycle " + holder);
+    }
+    return false;
+  }
+
+  @Override
+  public long getItemId(int position) {
+    long id;
+    try {
+      id = Long.parseLong(getChild(position).getDomObject().getRef());
+    } catch (RuntimeException e) {
+      WXLogUtils.e(TAG, WXLogUtils.getStackTrace(e));
+      id = RecyclerView.NO_ID;
+    }
+    return id;
+  }
+
+  @Override
+  public void onLoadMore(int offScreenY) {
+    try {
+      String offset = getDomObject().getAttrs().getLoadMoreOffset();
+
+      if (TextUtils.isEmpty(offset)) {
+        offset = "0";
+      }
+
+      if (offScreenY < Integer.parseInt(offset)) {
+        String loadMoreRetry = getDomObject().getAttrs().getLoadMoreRetry();
+        if (loadMoreRetry == null) {
+          loadMoreRetry = mLoadMoreRetry;
+        }
+
+        if (mListCellCount != mChildren.size()
+            || mLoadMoreRetry == null || !mLoadMoreRetry.equals(loadMoreRetry)) {
+          fireEvent(Constants.Event.LOADMORE);
+          mListCellCount = mChildren.size();
+          mLoadMoreRetry = loadMoreRetry;
+        }
+      }
+    } catch (Exception e) {
+      WXLogUtils.d(TAG + "onLoadMore :", e);
+    }
+  }
+
+  @Override
+  public void notifyAppearStateChange(int firstVisible, int lastVisible, int directionX, int directionY) {
+    //notify appear state
+    Iterator<AppearanceHelper> it = mAppearComponents.values().iterator();
+    String direction = directionY > 0 ? Constants.Value.DIRECTION_UP :
+        directionY < 0 ? Constants.Value.DIRECTION_DOWN : null;
+    if (getOrientation() == Constants.Orientation.HORIZONTAL && directionX != 0) {
+      direction = directionX > 0 ? Constants.Value.DIRECTION_LEFT : Constants.Value.DIRECTION_RIGHT;
+    }
+
+    while (it.hasNext()) {
+      AppearanceHelper item = it.next();
+      WXComponent component = item.getAwareChild();
+
+      if (!item.isWatch()) {
+        continue;
+      }
+
+      boolean outOfVisibleRange = item.getCellPositionINScollable() < firstVisible || item.getCellPositionINScollable() > lastVisible;
+
+      View view = component.getHostView();
+      if (view == null) {
+        continue;
+      }
+
+      boolean visible = (!outOfVisibleRange) && item.isViewVisible();
+
+      int result = item.setAppearStatus(visible);
+      if (WXEnvironment.isApkDebugable()) {
+        WXLogUtils.d("appear", "item " + item.getCellPositionINScollable() + " result " + result);
+      }
+      if (result == AppearanceHelper.RESULT_NO_CHANGE) {
+        continue;
+      }
+      component.notifyAppearStateChange(result == AppearanceHelper.RESULT_APPEAR ? Constants.Event.APPEAR : Constants.Event.DISAPPEAR, direction);
+    }
+  }
+
+  private void recycleImage(View view) {
+    if (view instanceof ImageView) {
+      if (getInstance().getImgLoaderAdapter() != null) {
+        getInstance().getImgLoaderAdapter().setImage(null, (ImageView) view,
+            null, null);
+      } else {
+        if (WXEnvironment.isApkDebugable()) {
+          throw new WXRuntimeException("getImgLoaderAdapter() == null");
+        }
+        WXLogUtils.e("Error getImgLoaderAdapter() == null");
+      }
+
+    } else if (view instanceof ViewGroup) {
+      for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
+        recycleImage(((ViewGroup) view).getChildAt(i));
+      }
+    }
+  }
+
+  @NonNull
+  private ListBaseViewHolder createVHForFakeComponent(int viewType) {
+    FrameLayout view = new FrameLayout(getContext());
+    view.setBackgroundColor(Color.WHITE);
+    view.setLayoutParams(new FrameLayout.LayoutParams(0, 0));
+    return new ListBaseViewHolder(view, viewType);
+  }
+
+
+  private ListBaseViewHolder createVHForRefreshComponent(int viewType) {
+    FrameLayout view = new FrameLayout(getContext());
+    view.setBackgroundColor(Color.WHITE);
+    view.setLayoutParams(new FrameLayout.LayoutParams(1, 1));
+    view.setVisibility(View.GONE);
+    return new ListBaseViewHolder(view, viewType);
+  }
+
+  @JSMethod
+  public void resetLoadmore() {
+    mLoadMoreRetry = "";
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/5a700270/android/sdk/src/main/java/com/taobao/weex/ui/component/list/ListComponentView.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/ListComponentView.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/ListComponentView.java
new file mode 100644
index 0000000..648c747
--- /dev/null
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/ListComponentView.java
@@ -0,0 +1,223 @@
+/**
+ *
+ *                                  Apache License
+ *                            Version 2.0, January 2004
+ *                         http://www.apache.org/licenses/
+ *
+ *    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+ *
+ *    1. Definitions.
+ *
+ *       "License" shall mean the terms and conditions for use, reproduction,
+ *       and distribution as defined by Sections 1 through 9 of this document.
+ *
+ *       "Licensor" shall mean the copyright owner or entity authorized by
+ *       the copyright owner that is granting the License.
+ *
+ *       "Legal Entity" shall mean the union of the acting entity and all
+ *       other entities that control, are controlled by, or are under common
+ *       control with that entity. For the purposes of this definition,
+ *       "control" means (i) the power, direct or indirect, to cause the
+ *       direction or management of such entity, whether by contract or
+ *       otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ *       outstanding shares, or (iii) beneficial ownership of such entity.
+ *
+ *       "You" (or "Your") shall mean an individual or Legal Entity
+ *       exercising permissions granted by this License.
+ *
+ *       "Source" form shall mean the preferred form for making modifications,
+ *       including but not limited to software source code, documentation
+ *       source, and configuration files.
+ *
+ *       "Object" form shall mean any form resulting from mechanical
+ *       transformation or translation of a Source form, including but
+ *       not limited to compiled object code, generated documentation,
+ *       and conversions to other media types.
+ *
+ *       "Work" shall mean the work of authorship, whether in Source or
+ *       Object form, made available under the License, as indicated by a
+ *       copyright notice that is included in or attached to the work
+ *       (an example is provided in the Appendix below).
+ *
+ *       "Derivative Works" shall mean any work, whether in Source or Object
+ *       form, that is based on (or derived from) the Work and for which the
+ *       editorial revisions, annotations, elaborations, or other modifications
+ *       represent, as a whole, an original work of authorship. For the purposes
+ *       of this License, Derivative Works shall not include works that remain
+ *       separable from, or merely link (or bind by name) to the interfaces of,
+ *       the Work and Derivative Works thereof.
+ *
+ *       "Contribution" shall mean any work of authorship, including
+ *       the original version of the Work and any modifications or additions
+ *       to that Work or Derivative Works thereof, that is intentionally
+ *       submitted to Licensor for inclusion in the Work by the copyright owner
+ *       or by an individual or Legal Entity authorized to submit on behalf of
+ *       the copyright owner. For the purposes of this definition, "submitted"
+ *       means any form of electronic, verbal, or written communication sent
+ *       to the Licensor or its representatives, including but not limited to
+ *       communication on electronic mailing lists, source code control systems,
+ *       and issue tracking systems that are managed by, or on behalf of, the
+ *       Licensor for the purpose of discussing and improving the Work, but
+ *       excluding communication that is conspicuously marked or otherwise
+ *       designated in writing by the copyright owner as "Not a Contribution."
+ *
+ *       "Contributor" shall mean Licensor and any individual or Legal Entity
+ *       on behalf of whom a Contribution has been received by Licensor and
+ *       subsequently incorporated within the Work.
+ *
+ *    2. Grant of Copyright License. Subject to the terms and conditions of
+ *       this License, each Contributor hereby grants to You a perpetual,
+ *       worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ *       copyright license to reproduce, prepare Derivative Works of,
+ *       publicly display, publicly perform, sublicense, and distribute the
+ *       Work and such Derivative Works in Source or Object form.
+ *
+ *    3. Grant of Patent License. Subject to the terms and conditions of
+ *       this License, each Contributor hereby grants to You a perpetual,
+ *       worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ *       (except as stated in this section) patent license to make, have made,
+ *       use, offer to sell, sell, import, and otherwise transfer the Work,
+ *       where such license applies only to those patent claims licensable
+ *       by such Contributor that are necessarily infringed by their
+ *       Contribution(s) alone or by combination of their Contribution(s)
+ *       with the Work to which such Contribution(s) was submitted. If You
+ *       institute patent litigation against any entity (including a
+ *       cross-claim or counterclaim in a lawsuit) alleging that the Work
+ *       or a Contribution incorporated within the Work constitutes direct
+ *       or contributory patent infringement, then any patent licenses
+ *       granted to You under this License for that Work shall terminate
+ *       as of the date such litigation is filed.
+ *
+ *    4. Redistribution. You may reproduce and distribute copies of the
+ *       Work or Derivative Works thereof in any medium, with or without
+ *       modifications, and in Source or Object form, provided that You
+ *       meet the following conditions:
+ *
+ *       (a) You must give any other recipients of the Work or
+ *           Derivative Works a copy of this License; and
+ *
+ *       (b) You must cause any modified files to carry prominent notices
+ *           stating that You changed the files; and
+ *
+ *       (c) You must retain, in the Source form of any Derivative Works
+ *           that You distribute, all copyright, patent, trademark, and
+ *           attribution notices from the Source form of the Work,
+ *           excluding those notices that do not pertain to any part of
+ *           the Derivative Works; and
+ *
+ *       (d) If the Work includes a "NOTICE" text file as part of its
+ *           distribution, then any Derivative Works that You distribute must
+ *           include a readable copy of the attribution notices contained
+ *           within such NOTICE file, excluding those notices that do not
+ *           pertain to any part of the Derivative Works, in at least one
+ *           of the following places: within a NOTICE text file distributed
+ *           as part of the Derivative Works; within the Source form or
+ *           documentation, if provided along with the Derivative Works; or,
+ *           within a display generated by the Derivative Works, if and
+ *           wherever such third-party notices normally appear. The contents
+ *           of the NOTICE file are for informational purposes only and
+ *           do not modify the License. You may add Your own attribution
+ *           notices within Derivative Works that You distribute, alongside
+ *           or as an addendum to the NOTICE text from the Work, provided
+ *           that such additional attribution notices cannot be construed
+ *           as modifying the License.
+ *
+ *       You may add Your own copyright statement to Your modifications and
+ *       may provide additional or different license terms and conditions
+ *       for use, reproduction, or distribution of Your modifications, or
+ *       for any such Derivative Works as a whole, provided Your use,
+ *       reproduction, and distribution of the Work otherwise complies with
+ *       the conditions stated in this License.
+ *
+ *    5. Submission of Contributions. Unless You explicitly state otherwise,
+ *       any Contribution intentionally submitted for inclusion in the Work
+ *       by You to the Licensor shall be under the terms and conditions of
+ *       this License, without any additional terms or conditions.
+ *       Notwithstanding the above, nothing herein shall supersede or modify
+ *       the terms of any separate license agreement you may have executed
+ *       with Licensor regarding such Contributions.
+ *
+ *    6. Trademarks. This License does not grant permission to use the trade
+ *       names, trademarks, service marks, or product names of the Licensor,
+ *       except as required for reasonable and customary use in describing the
+ *       origin of the Work and reproducing the content of the NOTICE file.
+ *
+ *    7. Disclaimer of Warranty. Unless required by applicable law or
+ *       agreed to in writing, Licensor provides the Work (and each
+ *       Contributor provides its Contributions) on an "AS IS" BASIS,
+ *       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ *       implied, including, without limitation, any warranties or conditions
+ *       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ *       PARTICULAR PURPOSE. You are solely responsible for determining the
+ *       appropriateness of using or redistributing the Work and assume any
+ *       risks associated with Your exercise of permissions under this License.
+ *
+ *    8. Limitation of Liability. In no event and under no legal theory,
+ *       whether in tort (including negligence), contract, or otherwise,
+ *       unless required by applicable law (such as deliberate and grossly
+ *       negligent acts) or agreed to in writing, shall any Contributor be
+ *       liable to You for damages, including any direct, indirect, special,
+ *       incidental, or consequential damages of any character arising as a
+ *       result of this License or out of the use or inability to use the
+ *       Work (including but not limited to damages for loss of goodwill,
+ *       work stoppage, computer failure or malfunction, or any and all
+ *       other commercial damages or losses), even if such Contributor
+ *       has been advised of the possibility of such damages.
+ *
+ *    9. Accepting Warranty or Additional Liability. While redistributing
+ *       the Work or Derivative Works thereof, You may choose to offer,
+ *       and charge a fee for, acceptance of support, warranty, indemnity,
+ *       or other liability obligations and/or rights consistent with this
+ *       License. However, in accepting such obligations, You may act only
+ *       on Your own behalf and on Your sole responsibility, not on behalf
+ *       of any other Contributor, and only if You agree to indemnify,
+ *       defend, and hold each Contributor harmless for any liability
+ *       incurred by, or claims asserted against, such Contributor by reason
+ *       of your accepting any such warranty or additional liability.
+ *
+ *    END OF TERMS AND CONDITIONS
+ *
+ *    APPENDIX: How to apply the Apache License to your work.
+ *
+ *       To apply the Apache License to your work, attach the following
+ *       boilerplate notice, with the fields enclosed by brackets "[]"
+ *       replaced with your own identifying information. (Don't include
+ *       the brackets!)  The text should be enclosed in the appropriate
+ *       comment syntax for the file format. We also recommend that a
+ *       file or class name and description of purpose be included on the
+ *       same "printed page" as the copyright notice for easier
+ *       identification within third-party archives.
+ *
+ *    Copyright 2016 Alibaba Group
+ *
+ *    Licensed 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.ui.component.list;
+
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+
+import com.taobao.weex.ui.view.listview.WXRecyclerView;
+import com.taobao.weex.ui.view.listview.adapter.RecyclerViewBaseAdapter;
+
+/**
+ * Created by sospartan on 13/12/2016.
+ */
+
+public interface ListComponentView {
+  WXRecyclerView getInnerView();
+  void setRecyclerViewBaseAdapter(RecyclerViewBaseAdapter adapter);
+  void notifyStickyShow(WXCell component);
+  void notifyStickyRemove(WXCell component);
+  RecyclerViewBaseAdapter getRecyclerViewBaseAdapter();
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/5a700270/android/sdk/src/main/java/com/taobao/weex/ui/component/list/SimpleListComponent.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/SimpleListComponent.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/SimpleListComponent.java
new file mode 100644
index 0000000..4fb0e80
--- /dev/null
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/SimpleListComponent.java
@@ -0,0 +1,231 @@
+/**
+ *
+ *                                  Apache License
+ *                            Version 2.0, January 2004
+ *                         http://www.apache.org/licenses/
+ *
+ *    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+ *
+ *    1. Definitions.
+ *
+ *       "License" shall mean the terms and conditions for use, reproduction,
+ *       and distribution as defined by Sections 1 through 9 of this document.
+ *
+ *       "Licensor" shall mean the copyright owner or entity authorized by
+ *       the copyright owner that is granting the License.
+ *
+ *       "Legal Entity" shall mean the union of the acting entity and all
+ *       other entities that control, are controlled by, or are under common
+ *       control with that entity. For the purposes of this definition,
+ *       "control" means (i) the power, direct or indirect, to cause the
+ *       direction or management of such entity, whether by contract or
+ *       otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ *       outstanding shares, or (iii) beneficial ownership of such entity.
+ *
+ *       "You" (or "Your") shall mean an individual or Legal Entity
+ *       exercising permissions granted by this License.
+ *
+ *       "Source" form shall mean the preferred form for making modifications,
+ *       including but not limited to software source code, documentation
+ *       source, and configuration files.
+ *
+ *       "Object" form shall mean any form resulting from mechanical
+ *       transformation or translation of a Source form, including but
+ *       not limited to compiled object code, generated documentation,
+ *       and conversions to other media types.
+ *
+ *       "Work" shall mean the work of authorship, whether in Source or
+ *       Object form, made available under the License, as indicated by a
+ *       copyright notice that is included in or attached to the work
+ *       (an example is provided in the Appendix below).
+ *
+ *       "Derivative Works" shall mean any work, whether in Source or Object
+ *       form, that is based on (or derived from) the Work and for which the
+ *       editorial revisions, annotations, elaborations, or other modifications
+ *       represent, as a whole, an original work of authorship. For the purposes
+ *       of this License, Derivative Works shall not include works that remain
+ *       separable from, or merely link (or bind by name) to the interfaces of,
+ *       the Work and Derivative Works thereof.
+ *
+ *       "Contribution" shall mean any work of authorship, including
+ *       the original version of the Work and any modifications or additions
+ *       to that Work or Derivative Works thereof, that is intentionally
+ *       submitted to Licensor for inclusion in the Work by the copyright owner
+ *       or by an individual or Legal Entity authorized to submit on behalf of
+ *       the copyright owner. For the purposes of this definition, "submitted"
+ *       means any form of electronic, verbal, or written communication sent
+ *       to the Licensor or its representatives, including but not limited to
+ *       communication on electronic mailing lists, source code control systems,
+ *       and issue tracking systems that are managed by, or on behalf of, the
+ *       Licensor for the purpose of discussing and improving the Work, but
+ *       excluding communication that is conspicuously marked or otherwise
+ *       designated in writing by the copyright owner as "Not a Contribution."
+ *
+ *       "Contributor" shall mean Licensor and any individual or Legal Entity
+ *       on behalf of whom a Contribution has been received by Licensor and
+ *       subsequently incorporated within the Work.
+ *
+ *    2. Grant of Copyright License. Subject to the terms and conditions of
+ *       this License, each Contributor hereby grants to You a perpetual,
+ *       worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ *       copyright license to reproduce, prepare Derivative Works of,
+ *       publicly display, publicly perform, sublicense, and distribute the
+ *       Work and such Derivative Works in Source or Object form.
+ *
+ *    3. Grant of Patent License. Subject to the terms and conditions of
+ *       this License, each Contributor hereby grants to You a perpetual,
+ *       worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ *       (except as stated in this section) patent license to make, have made,
+ *       use, offer to sell, sell, import, and otherwise transfer the Work,
+ *       where such license applies only to those patent claims licensable
+ *       by such Contributor that are necessarily infringed by their
+ *       Contribution(s) alone or by combination of their Contribution(s)
+ *       with the Work to which such Contribution(s) was submitted. If You
+ *       institute patent litigation against any entity (including a
+ *       cross-claim or counterclaim in a lawsuit) alleging that the Work
+ *       or a Contribution incorporated within the Work constitutes direct
+ *       or contributory patent infringement, then any patent licenses
+ *       granted to You under this License for that Work shall terminate
+ *       as of the date such litigation is filed.
+ *
+ *    4. Redistribution. You may reproduce and distribute copies of the
+ *       Work or Derivative Works thereof in any medium, with or without
+ *       modifications, and in Source or Object form, provided that You
+ *       meet the following conditions:
+ *
+ *       (a) You must give any other recipients of the Work or
+ *           Derivative Works a copy of this License; and
+ *
+ *       (b) You must cause any modified files to carry prominent notices
+ *           stating that You changed the files; and
+ *
+ *       (c) You must retain, in the Source form of any Derivative Works
+ *           that You distribute, all copyright, patent, trademark, and
+ *           attribution notices from the Source form of the Work,
+ *           excluding those notices that do not pertain to any part of
+ *           the Derivative Works; and
+ *
+ *       (d) If the Work includes a "NOTICE" text file as part of its
+ *           distribution, then any Derivative Works that You distribute must
+ *           include a readable copy of the attribution notices contained
+ *           within such NOTICE file, excluding those notices that do not
+ *           pertain to any part of the Derivative Works, in at least one
+ *           of the following places: within a NOTICE text file distributed
+ *           as part of the Derivative Works; within the Source form or
+ *           documentation, if provided along with the Derivative Works; or,
+ *           within a display generated by the Derivative Works, if and
+ *           wherever such third-party notices normally appear. The contents
+ *           of the NOTICE file are for informational purposes only and
+ *           do not modify the License. You may add Your own attribution
+ *           notices within Derivative Works that You distribute, alongside
+ *           or as an addendum to the NOTICE text from the Work, provided
+ *           that such additional attribution notices cannot be construed
+ *           as modifying the License.
+ *
+ *       You may add Your own copyright statement to Your modifications and
+ *       may provide additional or different license terms and conditions
+ *       for use, reproduction, or distribution of Your modifications, or
+ *       for any such Derivative Works as a whole, provided Your use,
+ *       reproduction, and distribution of the Work otherwise complies with
+ *       the conditions stated in this License.
+ *
+ *    5. Submission of Contributions. Unless You explicitly state otherwise,
+ *       any Contribution intentionally submitted for inclusion in the Work
+ *       by You to the Licensor shall be under the terms and conditions of
+ *       this License, without any additional terms or conditions.
+ *       Notwithstanding the above, nothing herein shall supersede or modify
+ *       the terms of any separate license agreement you may have executed
+ *       with Licensor regarding such Contributions.
+ *
+ *    6. Trademarks. This License does not grant permission to use the trade
+ *       names, trademarks, service marks, or product names of the Licensor,
+ *       except as required for reasonable and customary use in describing the
+ *       origin of the Work and reproducing the content of the NOTICE file.
+ *
+ *    7. Disclaimer of Warranty. Unless required by applicable law or
+ *       agreed to in writing, Licensor provides the Work (and each
+ *       Contributor provides its Contributions) on an "AS IS" BASIS,
+ *       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ *       implied, including, without limitation, any warranties or conditions
+ *       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ *       PARTICULAR PURPOSE. You are solely responsible for determining the
+ *       appropriateness of using or redistributing the Work and assume any
+ *       risks associated with Your exercise of permissions under this License.
+ *
+ *    8. Limitation of Liability. In no event and under no legal theory,
+ *       whether in tort (including negligence), contract, or otherwise,
+ *       unless required by applicable law (such as deliberate and grossly
+ *       negligent acts) or agreed to in writing, shall any Contributor be
+ *       liable to You for damages, including any direct, indirect, special,
+ *       incidental, or consequential damages of any character arising as a
+ *       result of this License or out of the use or inability to use the
+ *       Work (including but not limited to damages for loss of goodwill,
+ *       work stoppage, computer failure or malfunction, or any and all
+ *       other commercial damages or losses), even if such Contributor
+ *       has been advised of the possibility of such damages.
+ *
+ *    9. Accepting Warranty or Additional Liability. While redistributing
+ *       the Work or Derivative Works thereof, You may choose to offer,
+ *       and charge a fee for, acceptance of support, warranty, indemnity,
+ *       or other liability obligations and/or rights consistent with this
+ *       License. However, in accepting such obligations, You may act only
+ *       on Your own behalf and on Your sole responsibility, not on behalf
+ *       of any other Contributor, and only if You agree to indemnify,
+ *       defend, and hold each Contributor harmless for any liability
+ *       incurred by, or claims asserted against, such Contributor by reason
+ *       of your accepting any such warranty or additional liability.
+ *
+ *    END OF TERMS AND CONDITIONS
+ *
+ *    APPENDIX: How to apply the Apache License to your work.
+ *
+ *       To apply the Apache License to your work, attach the following
+ *       boilerplate notice, with the fields enclosed by brackets "[]"
+ *       replaced with your own identifying information. (Don't include
+ *       the brackets!)  The text should be enclosed in the appropriate
+ *       comment syntax for the file format. We also recommend that a
+ *       file or class name and description of purpose be included on the
+ *       same "printed page" as the copyright notice for easier
+ *       identification within third-party archives.
+ *
+ *    Copyright 2016 Alibaba Group
+ *
+ *    Licensed 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.ui.component.list;
+
+import android.content.Context;
+
+import com.taobao.weex.WXSDKInstance;
+import com.taobao.weex.dom.WXDomObject;
+import com.taobao.weex.ui.component.WXVContainer;
+import com.taobao.weex.ui.view.listview.WXRecyclerView;
+
+/**
+ * A simple list component based on regular recyclerview, do not support refreshing and loading.
+ * Created by sospartan on 13/12/2016.
+ *
+ */
+public class SimpleListComponent extends BasicListComponent<SimpleRecyclerView>{
+
+  public SimpleListComponent(WXSDKInstance instance, WXDomObject node, WXVContainer parent) {
+    super(instance, node, parent);
+  }
+
+  @Override
+  protected SimpleRecyclerView generateListView(Context context, int orientation) {
+    SimpleRecyclerView view = new SimpleRecyclerView(context);
+    view.initView(context, WXRecyclerView.TYPE_LINEAR_LAYOUT, orientation);
+    return view;
+  }
+}


[50/50] [abbrv] incubator-weex git commit: Merge branch 'dev-release095' into dev

Posted by ji...@apache.org.
Merge branch 'dev-release095' into dev


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/d1d396e9
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/d1d396e9
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/d1d396e9

Branch: refs/heads/master
Commit: d1d396e925ac010e331269cf51ad110b3383d7aa
Parents: 1db3398 5104026
Author: sospartan <so...@gmail.com>
Authored: Wed Jan 11 17:48:50 2017 +0800
Committer: sospartan <so...@gmail.com>
Committed: Wed Jan 11 17:48:50 2017 +0800

----------------------------------------------------------------------
 android/playground/app/build.gradle | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)
----------------------------------------------------------------------



[26/50] [abbrv] incubator-weex git commit: Merge branch 'ios-feature-20170118' into ios-feature-20170118

Posted by ji...@apache.org.
Merge branch 'ios-feature-20170118' into ios-feature-20170118

Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/21cc795a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/21cc795a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/21cc795a

Branch: refs/heads/master
Commit: 21cc795af2ca2703bb0cdfcdbf8799df291ee8bb
Parents: fdf5ed7 2cebd32
Author: \u9690\u5c0f\u98ce <cx...@gmail.com>
Authored: Wed Jan 11 11:53:12 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Wed Jan 11 11:53:12 2017 +0800

----------------------------------------------------------------------
 examples/module/websocket-demo.we               |  2 +-
 ios/sdk/WeexSDK/Sources/Bridge/WXModuleMethod.m | 16 +++----
 .../Sources/Component/WXImageComponent.m        | 24 ++++------
 .../Sources/Component/WXTextAreaComponent.m     | 39 +++++++++--------
 .../WeexSDK/Sources/Component/WXTextComponent.m |  1 +
 .../Sources/Component/WXTextInputComponent.m    | 14 +++---
 .../Sources/Display/WXComponent+Display.m       |  6 +--
 .../WeexSDK/Sources/Loader/WXResourceLoader.m   |  2 +-
 .../Sources/Manager/WXComponentManager.m        |  2 +
 ios/sdk/WeexSDK/Sources/Model/WXComponent.h     |  2 +-
 ios/sdk/WeexSDK/Sources/Model/WXComponent.m     |  6 ++-
 ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.h   |  2 +-
 ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m   | 46 ++++++++++++++++++--
 .../Sources/Model/WXSDKInstance_private.h       |  3 ++
 .../WeexSDK/Sources/Module/WXNavigatorModule.m  | 28 +++++++-----
 .../Sources/Protocol/WXNavigationProtocol.h     | 31 ++++++++++---
 16 files changed, 143 insertions(+), 81 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/21cc795a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
----------------------------------------------------------------------


[04/50] [abbrv] incubator-weex git commit: Merge branch 'ios-feature-20170118' into ios-feature-20170118

Posted by ji...@apache.org.
Merge branch 'ios-feature-20170118' into ios-feature-20170118

Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/ea798eb9
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/ea798eb9
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/ea798eb9

Branch: refs/heads/master
Commit: ea798eb9a4b641dc484cd6b9e84e86318726bb19
Parents: 2668ed7 d26ef73
Author: acton393 <ac...@users.noreply.github.com>
Authored: Tue Jan 10 20:30:53 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Tue Jan 10 20:30:53 2017 +0800

----------------------------------------------------------------------
 .../WeexSDK/Sources/Module/WXNavigatorModule.m  | 28 ++++++++++--------
 .../Sources/Protocol/WXNavigationProtocol.h     | 31 ++++++++++++++++----
 2 files changed, 42 insertions(+), 17 deletions(-)
----------------------------------------------------------------------



[07/50] [abbrv] incubator-weex git commit: Merge branch 'ios-feature-20170118' of github.com:acton393/weex into ios-feature-20170118

Posted by ji...@apache.org.
Merge branch 'ios-feature-20170118' of github.com:acton393/weex into ios-feature-20170118


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/35e0084b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/35e0084b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/35e0084b

Branch: refs/heads/master
Commit: 35e0084b650b2ccb1565bc2b2bd05d1e7dbf105e
Parents: d04af5e ea798eb
Author: acton393 <zh...@gmail.com>
Authored: Tue Jan 10 21:15:12 2017 +0800
Committer: acton393 <zh...@gmail.com>
Committed: Tue Jan 10 21:15:12 2017 +0800

----------------------------------------------------------------------

----------------------------------------------------------------------



[03/50] [abbrv] incubator-weex git commit: Merge pull request #2203 from boboning/ios-feature-navigator

Posted by ji...@apache.org.
Merge pull request #2203 from boboning/ios-feature-navigator

* [ios] update navigator module, add open and close interface.

Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/d26ef73e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/d26ef73e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/d26ef73e

Branch: refs/heads/master
Commit: d26ef73e0b121b5a6be5baddf41492697617c74e
Parents: 4f65b4d 58a3ffc
Author: acton393 <ac...@users.noreply.github.com>
Authored: Tue Jan 10 20:06:31 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Tue Jan 10 20:06:31 2017 +0800

----------------------------------------------------------------------
 .../WeexSDK/Sources/Module/WXNavigatorModule.m  | 28 ++++++++++--------
 .../Sources/Protocol/WXNavigationProtocol.h     | 31 ++++++++++++++++----
 2 files changed, 42 insertions(+), 17 deletions(-)
----------------------------------------------------------------------



[29/50] [abbrv] incubator-weex git commit: Merge pull request #2212 from acton393/ios-feature-20170118

Posted by ji...@apache.org.
Merge pull request #2212 from acton393/ios-feature-20170118

* [ios] iOS feature 20170118

Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/4462c12f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/4462c12f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/4462c12f

Branch: refs/heads/master
Commit: 4462c12f0672ab6d7e0136d6275971a1cb1204d5
Parents: 6bccb06 a8720c2
Author: boboning <ni...@163.com>
Authored: Wed Jan 11 13:16:33 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Wed Jan 11 13:16:33 2017 +0800

----------------------------------------------------------------------
 ios/sdk/WeexSDK/Sources/Component/WXImageComponent.m | 14 +++++++-------
 ios/sdk/WeexSDK/Sources/Component/WXTextComponent.m  |  2 +-
 ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.m |  4 ++--
 ios/sdk/WeexSDK/Sources/Model/WXComponent.h          |  4 ++--
 ios/sdk/WeexSDK/Sources/Model/WXComponent.m          |  4 ++--
 5 files changed, 14 insertions(+), 14 deletions(-)
----------------------------------------------------------------------



[38/50] [abbrv] incubator-weex git commit: * [ios] update weexSDK version

Posted by ji...@apache.org.
* [ios] update weexSDK version


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/6163d27c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/6163d27c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/6163d27c

Branch: refs/heads/master
Commit: 6163d27c9fa2e231e5861fe1a8ec99f199eef615
Parents: 970e3b8
Author: acton393 <zh...@gmail.com>
Authored: Wed Jan 11 16:22:59 2017 +0800
Committer: acton393 <zh...@gmail.com>
Committed: Wed Jan 11 16:22:59 2017 +0800

----------------------------------------------------------------------
 ios/sdk/WeexSDK.podspec                    | 10 ++++++----
 ios/sdk/WeexSDK/Sources/Utility/WXDefine.h |  2 +-
 2 files changed, 7 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/6163d27c/ios/sdk/WeexSDK.podspec
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK.podspec b/ios/sdk/WeexSDK.podspec
index ec2b810..057c435 100644
--- a/ios/sdk/WeexSDK.podspec
+++ b/ios/sdk/WeexSDK.podspec
@@ -2,7 +2,7 @@
 Pod::Spec.new do |s|
 
   s.name         = "WeexSDK"
-  s.version      = "0.9.4"
+  s.version      = "0.10.0"
   s.summary      = "WeexSDK Source ."
 
   s.description  = <<-DESC
@@ -16,9 +16,11 @@ Pod::Spec.new do |s|
            Alibaba-INC copyright
     LICENSE
   }
-  s.authors      = { "cxfeng1"  => "cxfeng1@gmail.com",
-                     "boboning" => "ningli928@163.com",
-                     "acton393" =>"zhangxing610321@gmail.com"
+  s.authors      = { "cxfeng1"      => "cxfeng1@gmail.com",
+                     "boboning"     => "ningli928@163.com",
+                     "yangshengtao" => "yangshengtao1314@163.com",
+                     "kfeagle"      => "sunjjbobo@163.com",
+                     "acton393"     => "zhangxing610321@gmail.com"
                    }
   s.platform     = :ios
   s.ios.deployment_target = '7.0'

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/6163d27c/ios/sdk/WeexSDK/Sources/Utility/WXDefine.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Utility/WXDefine.h b/ios/sdk/WeexSDK/Sources/Utility/WXDefine.h
index 80e7212..20d6a36 100644
--- a/ios/sdk/WeexSDK/Sources/Utility/WXDefine.h
+++ b/ios/sdk/WeexSDK/Sources/Utility/WXDefine.h
@@ -9,7 +9,7 @@
 #ifndef __WX_DEFINE_H__
 #define __WX_DEFINE_H__
 
-#define WX_SDK_VERSION @"0.9.4"
+#define WX_SDK_VERSION @"0.10.0"
 
 #if defined(__cplusplus)
 #define WX_EXTERN extern "C" __attribute__((visibility("default")))


[27/50] [abbrv] incubator-weex git commit: Merge pull request #2211 from cxfeng1/ios-feature-20170118

Posted by ji...@apache.org.
Merge pull request #2211 from cxfeng1/ios-feature-20170118

Ios feature 20170118

Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/6bccb062
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/6bccb062
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/6bccb062

Branch: refs/heads/master
Commit: 6bccb062bfadda3215191139f7f2f270081e6f4b
Parents: 2cebd32 21cc795
Author: \u9f50\u5c71 <su...@163.com>
Authored: Wed Jan 11 11:57:21 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Wed Jan 11 11:57:21 2017 +0800

----------------------------------------------------------------------
 .../WeexSDK/Sources/Component/WXScrollerComponent.m   |  2 +-
 ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.h          |  7 ++++++-
 ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.m          | 14 +++++++++++---
 ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m         |  4 ++++
 4 files changed, 22 insertions(+), 5 deletions(-)
----------------------------------------------------------------------



[23/50] [abbrv] incubator-weex git commit: Merge branch 'ios-feature-20170118' into ios-feature-20170118

Posted by ji...@apache.org.
Merge branch 'ios-feature-20170118' into ios-feature-20170118

Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/4d5bc334
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/4d5bc334
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/4d5bc334

Branch: refs/heads/master
Commit: 4d5bc3344e65a5d2d3bfd06dea2d1c848ba1d9cd
Parents: b35086f 2371256
Author: acton393 <ac...@users.noreply.github.com>
Authored: Wed Jan 11 11:22:33 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Wed Jan 11 11:22:33 2017 +0800

----------------------------------------------------------------------
 examples/module/websocket-demo.we               |  2 +-
 .../Sources/Component/WXTextAreaComponent.m     | 39 +++++++++++---------
 .../Sources/Component/WXTextInputComponent.m    | 14 +++----
 3 files changed, 29 insertions(+), 26 deletions(-)
----------------------------------------------------------------------



[22/50] [abbrv] incubator-weex git commit: * [ios] adjust notify time

Posted by ji...@apache.org.
* [ios] adjust notify time


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/b35086f5
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/b35086f5
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/b35086f5

Branch: refs/heads/master
Commit: b35086f5a7d1f3ee689621fbdb2eaadc7a273745
Parents: 83bcade
Author: acton393 <zh...@gmail.com>
Authored: Wed Jan 11 11:21:28 2017 +0800
Committer: acton393 <zh...@gmail.com>
Committed: Wed Jan 11 11:21:28 2017 +0800

----------------------------------------------------------------------
 ios/sdk/WeexSDK/Sources/Component/WXTextComponent.m  | 3 +--
 ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.m | 4 ++--
 2 files changed, 3 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b35086f5/ios/sdk/WeexSDK/Sources/Component/WXTextComponent.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXTextComponent.m b/ios/sdk/WeexSDK/Sources/Component/WXTextComponent.m
index 960e253..2f7f29c 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXTextComponent.m
+++ b/ios/sdk/WeexSDK/Sources/Component/WXTextComponent.m
@@ -406,8 +406,6 @@ do {\
         pthread_mutex_unlock(&_textStorageMutex);
     }
     
-    [self readyToShow]; // notify super component
-    
     return textStorage;
 }
 
@@ -425,6 +423,7 @@ do {\
             if (_isUsingTextStorageLock) {
                 pthread_mutex_unlock(&_textStorageMutex);
             }
+            [self readyToShow]; // notify super component
             [self setNeedsDisplay];
         }
     }];

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b35086f5/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.m b/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.m
index 152d671..6c2c06d 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.m
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.m
@@ -374,8 +374,8 @@ static css_node_t * rootNodeGetChild(void *context, int i)
     [self filterStyles:styles normalStyles:normalStyles resetStyles:resetStyles];
     [component _updateStylesOnComponentThread:normalStyles resetStyles:resetStyles isUpdateStyles:isUpdateStyles];
     [self _addUITask:^{
-        [component readyToShow];
         [component _updateStylesOnMainThread:normalStyles resetStyles:resetStyles];
+        [component readyToShow];
     }];
 }
 
@@ -389,8 +389,8 @@ static css_node_t * rootNodeGetChild(void *context, int i)
     
     [component _updateAttributesOnComponentThread:attributes];
     [self _addUITask:^{
-        [component readyToShow];
         [component _updateAttributesOnMainThread:attributes];
+        [component readyToShow];
     }];
 }
 


[14/50] [abbrv] incubator-weex git commit: * [ios] format code

Posted by ji...@apache.org.
* [ios] format code


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/a1baf893
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/a1baf893
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/a1baf893

Branch: refs/heads/master
Commit: a1baf8935e7bfd5a8cb8a8e57364309123e49002
Parents: 9f96659
Author: acton393 <zh...@gmail.com>
Authored: Tue Jan 10 22:54:01 2017 +0800
Committer: acton393 <zh...@gmail.com>
Committed: Tue Jan 10 22:54:01 2017 +0800

----------------------------------------------------------------------
 ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/a1baf893/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
index 9f18941..b37f097 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
+++ b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
@@ -468,8 +468,8 @@ typedef enum : NSUInteger {
         NSString *callbackId = callbackInfo[@"callbackId"];
         BOOL once = [callbackInfo[@"once"] boolValue];
         NSDictionary * retData = @{@"type":userInfo[@"eventName"],
-                                               @"module":callbackInfo[@"moduleName"],
-                                               @"data":userInfo[@"param"]};
+                                   @"module":callbackInfo[@"moduleName"],
+                                   @"data":userInfo[@"param"]};
         [[WXSDKManager bridgeMgr] callBack:self.instanceId funcId:callbackId params:retData keepAlive:!once];
         // if callback function is not once, then it is keepalive
         if (once) {


[19/50] [abbrv] incubator-weex git commit: * [ios] prevent loadmore event from being triggered while pulling down.

Posted by ji...@apache.org.
* [ios] prevent loadmore event from being triggered while pulling down.


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/9b6f726a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/9b6f726a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/9b6f726a

Branch: refs/heads/master
Commit: 9b6f726aa370a92dc10bb41673f40b6334846f9e
Parents: eb03cb0
Author: \u9690\u98ce <cx...@gmail.com>
Authored: Wed Jan 11 10:53:38 2017 +0800
Committer: \u9690\u98ce <cx...@gmail.com>
Committed: Wed Jan 11 10:53:38 2017 +0800

----------------------------------------------------------------------
 ios/sdk/WeexSDK/Sources/Component/WXScrollerComponent.m | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/9b6f726a/ios/sdk/WeexSDK/Sources/Component/WXScrollerComponent.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXScrollerComponent.m b/ios/sdk/WeexSDK/Sources/Component/WXScrollerComponent.m
index c10f947..fa91d3e 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXScrollerComponent.m
+++ b/ios/sdk/WeexSDK/Sources/Component/WXScrollerComponent.m
@@ -333,7 +333,7 @@ WX_EXPORT_METHOD(@selector(resetLoadmore))
 
 - (BOOL)isNeedLoadMore
 {
-    if (_loadMoreOffset >= 0.0) {
+    if (_loadMoreOffset >= 0.0 && ((UIScrollView *)self.view).contentOffset.y >= 0) {
         return _previousLoadMoreContentHeight != ((UIScrollView *)self.view).contentSize.height && ((UIScrollView *)self.view).contentSize.height - ((UIScrollView *)self.view).contentOffset.y -  self.view.frame.size.height <= _loadMoreOffset;
     }
     


[17/50] [abbrv] incubator-weex git commit: Merge branch 'ios-feature-20170118' into ios-feature-20170118

Posted by ji...@apache.org.
Merge branch 'ios-feature-20170118' into ios-feature-20170118

Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/860b44fe
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/860b44fe
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/860b44fe

Branch: refs/heads/master
Commit: 860b44fee4f75984b4aa5496260b8f8c66347ecc
Parents: f4accba 00ca8aa
Author: acton393 <ac...@users.noreply.github.com>
Authored: Tue Jan 10 23:19:31 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Tue Jan 10 23:19:31 2017 +0800

----------------------------------------------------------------------
 ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)
----------------------------------------------------------------------



[06/50] [abbrv] incubator-weex git commit: Merge remote-tracking branch 'upstream/ios-feature-20170118' into ios-feature-20170118

Posted by ji...@apache.org.
Merge remote-tracking branch 'upstream/ios-feature-20170118' into ios-feature-20170118


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/d04af5e8
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/d04af5e8
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/d04af5e8

Branch: refs/heads/master
Commit: d04af5e81256033c432ba440ffd5b6ae44125627
Parents: becd631 d26ef73
Author: acton393 <zh...@gmail.com>
Authored: Tue Jan 10 21:14:04 2017 +0800
Committer: acton393 <zh...@gmail.com>
Committed: Tue Jan 10 21:14:04 2017 +0800

----------------------------------------------------------------------
 .../WeexSDK/Sources/Events/WXComponent+Events.m | 25 ++++++++++++----
 .../WeexSDK/Sources/Module/WXNavigatorModule.m  | 28 ++++++++++--------
 .../Sources/Protocol/WXNavigationProtocol.h     | 31 ++++++++++++++++----
 3 files changed, 61 insertions(+), 23 deletions(-)
----------------------------------------------------------------------



[10/50] [abbrv] incubator-weex git commit: * [ios] format callback ret data

Posted by ji...@apache.org.
* [ios] format callback ret data


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/83c747f3
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/83c747f3
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/83c747f3

Branch: refs/heads/master
Commit: 83c747f318a3d3bf5df9b8493c8f2cc65bab39f7
Parents: 1fb2e0a
Author: acton393 <zh...@gmail.com>
Authored: Tue Jan 10 22:21:12 2017 +0800
Committer: acton393 <zh...@gmail.com>
Committed: Tue Jan 10 22:21:12 2017 +0800

----------------------------------------------------------------------
 ios/sdk/WeexSDK/Sources/Bridge/WXModuleMethod.m |  4 +--
 ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m   | 30 ++++++++++++++------
 .../Sources/Model/WXSDKInstance_private.h       |  5 ++--
 3 files changed, 26 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/83c747f3/ios/sdk/WeexSDK/Sources/Bridge/WXModuleMethod.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXModuleMethod.m b/ios/sdk/WeexSDK/Sources/Bridge/WXModuleMethod.m
index 37a75a3..de07eca 100644
--- a/ios/sdk/WeexSDK/Sources/Bridge/WXModuleMethod.m
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXModuleMethod.m
@@ -49,10 +49,10 @@
     if (![moduleInstance respondsToSelector:selector]) {
         // if not implement the selector, then dispatch default module method
         if ([self.methodName isEqualToString:@"addEventListener"]) {
-            [self.instance _addModuleEventObserversWithArguments:self.arguments moduleClassName:NSStringFromClass(moduleClass)];
+            [self.instance _addModuleEventObserversWithModuleMethod:self];
         }
         if ([self.methodName isEqualToString:@"removeAllEventListeners"]) {
-            [self.instance _removeModuleEventObserverWithArguments:self.arguments moduleClassName:NSStringFromClass(moduleClass)];
+            [self.instance _removeModuleEventObserverWithModuleMethod:self];
         }
         return nil;
     }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/83c747f3/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
index f77e9d5..0220ace 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
+++ b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
@@ -307,7 +307,7 @@ typedef enum : NSUInteger {
     [data setObject:[NSString stringWithFormat:@"%ld",(long)state] forKey:@"state"];
     //[[WXSDKManager bridgeMgr] updateState:self.instanceId data:data];
     
-    [[NSNotificationCenter defaultCenter]postNotificationName:WX_INSTANCE_NOTIFICATION_UPDATE_STATE object:self userInfo:data];
+    [[NSNotificationCenter defaultCenter] postNotificationName:WX_INSTANCE_NOTIFICATION_UPDATE_STATE object:self userInfo:data];
 }
 
 - (id)moduleForClass:(Class)moduleClass
@@ -395,28 +395,37 @@ typedef enum : NSUInteger {
 
 #pragma mark Private Methods
 
-- (void)_addModuleEventObserversWithArguments:(NSArray*)arguments moduleClassName:(NSString*)moduleClassName
+- (void)_addModuleEventObserversWith:(WXModuleMethod *)method
 {
-    if ([arguments count] < 2) {
+    if ([method.arguments count] < 2) {
         WXLogError(@"please check your method parameter!!");
         return;
     }
-    if(![arguments[0] isKindOfClass:[NSString class]]) {
+    if(![method.arguments[0] isKindOfClass:[NSString class]]) {
         // arguments[0] will be event name, so it must be a string type value here.
         return;
     }
-    NSMutableArray * methodArguments = [arguments mutableCopy];
-    if ([arguments count] == 2) {
+    NSMutableArray * methodArguments = [method.arguments mutableCopy];
+    if ([methodArguments count] == 2) {
         [methodArguments addObject:@{@"once": @false}];
     }
-    [self addModuleEventObservers:methodArguments[0] callback:methodArguments[1] option:methodArguments[2] moduleClassName:moduleClassName];
+    if (![methodArguments[2] isKindOfClass:[NSDictionary class]]) {
+        //arguments[2] is the option value, so it must be a dictionary.
+        return;
+    }
+    Class moduleClass =  [WXModuleFactory classWithModuleName:method.moduleName];
+    NSMutableDictionary * option = [methodArguments[3] mutableCopy];
+    [option setObject:method.moduleName forKey:@"moduleName"];
+    // the value for moduleName in option is for the need of callback
+    [self addModuleEventObservers:methodArguments[0] callback:methodArguments[1] option:option moduleClassName:NSClassFromString(moduleClass)];
 }
 
 - (void)addModuleEventObservers:(NSString*)event callback:(NSString*)callbackId option:(NSDictionary *)option moduleClassName:(NSString*)moduleClassName
 {
     BOOL once = [[option objectForKey:@"once"] boolValue];
+    NSString * moduleName = [option objectForKey:@"moduleName"];
     NSMutableDictionary * observer = nil;
-    NSDictionary * callbackInfo = @{@"callbackId":callbackId,@"once":@(once)};
+    NSDictionary * callbackInfo = @{@"callbackId":callbackId,@"once":@(once),@"moduleName":moduleName};
     if(![self checkModuleEventRegistered:event moduleClassName:moduleClassName]) {
         //had not registered yet
         observer = [NSMutableDictionary new];
@@ -456,7 +465,10 @@ typedef enum : NSUInteger {
         NSDictionary * callbackInfo = listeners[i];
         NSString *callbackId = callbackInfo[@"callbackId"];
         BOOL once = [callbackInfo[@"once"] boolValue];
-        [[WXSDKManager bridgeMgr] callBack:self.instanceId funcId:callbackId params:userInfo[@"param"] keepAlive:!once];
+        NSMutableDictionary * retData = @{@"type":userInfo[@"eventName"],
+                                               @"module":callbackInfo[@"moduleName"],
+                                               @"data":userInfo[@"param"]};
+        [[WXSDKManager bridgeMgr] callBack:self.instanceId funcId:callbackId params:retData keepAlive:!once];
         // if callback function is not once, then it is keepalive
         if (once) {
             NSMutableArray * moduleEventListener = [_moduleEventObservers[userInfo[@"moduleId"]] objectForKey:userInfo[@"eventName"]];

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/83c747f3/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance_private.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance_private.h b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance_private.h
index 3505a60..0bddbf9 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance_private.h
+++ b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance_private.h
@@ -9,6 +9,7 @@
 #import <Foundation/Foundation.h>
 #import "WXSDKInstance.h"
 #import "WXComponentManager.h"
+#import "WXModuleMethod.h"
 
 @interface WXSDKInstance ()
 
@@ -22,8 +23,8 @@
 @property (nonatomic, readonly, strong) WXComponentManager *componentManager;
 
 - (void)addModuleEventObservers:(NSString*)event callback:(NSString*)callbackId option:(NSDictionary*)option moduleClassName:(NSString*)moduleClassName;
-- (void)_addModuleEventObserversWithArguments:(NSArray*)arguments moduleClassName:(NSString*)moduleClassName;
+- (void)_addModuleEventObserversWithModuleMethod:(WXModuleMethod*)method;
 - (void)removeModuleEventObserver:(NSString*)event moduleClassName:(NSString*)moduleClassName;
-- (void)_removeModuleEventObserverWithArguments:(NSArray*)arguments moduleClassName:(NSString*)moduleClassName;
+- (void)_removeModuleEventObserverWithModuleMethod:(WXModuleMethod*)method;
 
 @end


[32/50] [abbrv] incubator-weex git commit: * [android] update jsfm to v0.19.7 include RAX and Vue2.0 exclude strict mode (#136)

Posted by ji...@apache.org.
* [android] update jsfm to v0.19.7 include RAX and Vue2.0 exclude strict mode (#136)



Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/405b6e67
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/405b6e67
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/405b6e67

Branch: refs/heads/master
Commit: 405b6e67703c58a97bad5fa9b3965fa7b7f97c9a
Parents: b905c37
Author: atomtong <to...@qq.com>
Authored: Wed Jan 11 15:45:08 2017 +0800
Committer: sospartan zheng <so...@apache.org>
Committed: Wed Jan 11 15:45:08 2017 +0800

----------------------------------------------------------------------
 android/sdk/assets/main.js | 5077 ++++++++++++++++++++-------------------
 1 file changed, 2622 insertions(+), 2455 deletions(-)
----------------------------------------------------------------------