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/02/20 06:40:50 UTC

[01/50] [abbrv] incubator-weex git commit: Merge pull request #2538 from MrRaindrop/html5-feature-pseudo-class

Repository: incubator-weex
Updated Branches:
  refs/heads/master d1d396e92 -> 6e7143776


Merge pull request #2538 from MrRaindrop/html5-feature-pseudo-class

Html5 feature pseudo class

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

Branch: refs/heads/master
Commit: 9e619aa63d84e96fafbedb584de129d4eac51b3d
Parents: 71b3cbe 7c38ae4
Author: Hanks <zh...@gmail.com>
Authored: Wed Feb 15 23:16:05 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Wed Feb 15 23:16:05 2017 +0800

----------------------------------------------------------------------
 html5/render/browser/base/component/operate.js | 105 +++++++++++++++++++-
 1 file changed, 101 insertions(+), 4 deletions(-)
----------------------------------------------------------------------



[19/50] [abbrv] incubator-weex git commit: V0.10.0 stable gitlab (#178)

Posted by ji...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/dist/weex-html5/README.md
----------------------------------------------------------------------
diff --git a/dist/weex-html5/README.md b/dist/weex-html5/README.md
deleted file mode 100644
index f82f237..0000000
--- a/dist/weex-html5/README.md
+++ /dev/null
@@ -1,158 +0,0 @@
-## weex-html5
-
-### Intro
-
-Weex is a solution for developers to build a world-class projects on multiple platforms (include both native and web platforms) based on html-css-javascript liked domain specific language. Weex is focused on lightweight, extendable and high performance, and the finally destination -- write once, run anywhere.
-
-The dot we code transformed to weex bundle can currently run on android, ios and web platform. Weex HTML5 is a renderer for weex bundle to run in a webview or a browser environment.
-
-### Get Weex HTML5
-
-Use npm to install the latest version of Weex HTML5, require it from your code in the commonJS way and use it as a npm package. You can import Weex HTML5 from the javascript file as in the node modules' path `node_modules/weex-html5/dist/weex.js`, as in this way you don't need to require weex-jsframework manually since it is already embeded.
-
-#### Install from npm
-
-Make sure you get the latest version by `npm install` or `npm update`. Want more info about npm cmd? Please checkout the [npm official site](https://docs.npmjs.com/).
-
-```
-npm install weex-html5
-```
-
-#### use weex-html5
-
-require weex-html5.
-
-```
-require('weex-html5');
-```
-
-or you can import script from `dist/weex.js`
-
-This `weex.js` includes both `weex-jsframework` and `weex-html5`.
-
-```
- <script src="./node_modules/weex-html5/dist/weex"></script>
-```
-
-Then you can use `window.weex` in the page.
-
-### DEMO
-
-In the root path of `node_modules/weex-html5`, the index page can show a simple demo whos source code is in the path `node_modules/weex-html5/demo/index.we`.
-
-### Initialize
-
-Once you have imported the weex-html5 into your page, you can use `window.weex` to initialize weex through the API ``init``. This method takes a config object as argument to confirm the runtime infomation and environment. Following parameters can be set by this config object:
-
-* ``appId``: app instance id, can be either a string or a number
-* ``source``: the requested url of weex bundle, or the transformed code it self.
-* ``loader``: loader to load the request weex bundle, whose value is from 'xhr' or 'jsonp' or 'source'.
-  * ``xhr``: load the source (weex bundle url) by XHR
-  * ``source``: the source parameter above should be a weex bundle content (transformed bundle).
-* ``rootId``: id of the root element. Default value is 'weex'.
-
-Here is a example to do the initialzation:
-
-```
-(function () {
-  function getUrlParam (key) {
-    var reg = new RegExp('[?|&]' + key + '=([^&]+)')
-    var match = location.search.match(reg)
-    return match && match[1]
-  }
-
-  var loader = getUrlParam('loader') || 'xhr'
-  var page = getUrlParam('page') || 'demo/build/index.js'
-
-  window.weex.init({
-    appId: location.href,
-    loader: loader,
-    source: page,
-    rootId: 'weex'
-  })
-})();
-```
-
-### Initialize with multiple instances
-
-```
-var weexConfig = [{
-  appId: 'weexCt1',
-  source: '//your-source-provider/bundle1.js',
-  loader: 'xhr',
-  width: document.querySelector('#weexCt1').getBoundingClientRect().width,
-  rootId: 'weexCt1'
-}, {
-  appId: 'weexCt2',
-  source: '//your-source-provider/bundle2.js',
-  loader: 'xhr',
-  width: document.querySelector('#weexCt2').getBoundingClientRect().width,
-  rootId: 'weexCt2'
-}]
-
-function weexInit() { 
-  // Init with multiple config objects for multiple instances.
-  window.weex.init(weexConfig)
-}
-
-weexInit()
-```
-
-### Extend
-
-Weex is a extendable framework. You can extend the components and APIs by using the methods like `Weex.install`. Here are the ways to extend your components and APIs.
-
-#### Extend the component
-
-Let's say, you want to extend a component `MyComponent` from the base class `Weex.Componnet`. You can firstly create a installer with a `init` method to register your component, then require this module and install it by using `Weex.install`.
-
-```
-// MyComponent.js
-module.exports = {
-  init: function (Weex) {
-    function MyComponent(data) {
-      // ...
-      Weex.Component.call(this, data)
-    }
-    Weex.Component.prototype = Object.create(MyComponent)
-    Weex.Component.prototype.myMethod = function () {
-      // ...
-    }
-    Weex.registerComponent('MyComponent', MyComponent)
-  }
-}
-
-var weex = require('weex-html5')
-weex.install(require('./MyComponent.js'))
-```
-
-#### Extend the API
-
-```
-// myAPIModule.js
-var myAPIModule = {
-  hello: function() {
-    nativeLog('hello world!')
-  }
-}
-myAPIModule._meta = {
-  myAPIModule: [{
-    name: 'hello',
-    args: []
-  }]
-}
-module.exports = {
-  init: function (Weex) {
-    Weex.registerApiModule('myAPIModule', myAPIModule, myAPIModule._meta)
-  }
-}
-
-var weex = require('weex-html5')
-weex.install(require('./myAPIModule.js'))
-```
-
-### MORE
-
-* More info: [Weex official site](http://alibaba.github.io/weex/)
-* Document : [Weex DOC](http://alibaba.github.io/weex/doc/)
-

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/dist/weex-html5/demo/build/index.js
----------------------------------------------------------------------
diff --git a/dist/weex-html5/demo/build/index.js b/dist/weex-html5/demo/build/index.js
deleted file mode 100644
index 84a8053..0000000
--- a/dist/weex-html5/demo/build/index.js
+++ /dev/null
@@ -1,111 +0,0 @@
-/******/ (function(modules) { // webpackBootstrap
-/******/  // The module cache
-/******/  var installedModules = {};
-
-/******/  // The require function
-/******/  function __webpack_require__(moduleId) {
-
-/******/    // Check if module is in cache
-/******/    if(installedModules[moduleId])
-/******/      return installedModules[moduleId].exports;
-
-/******/    // Create a new module (and put it into the cache)
-/******/    var module = installedModules[moduleId] = {
-/******/      exports: {},
-/******/      id: moduleId,
-/******/      loaded: false
-/******/    };
-
-/******/    // Execute the module function
-/******/    modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-
-/******/    // Flag the module as loaded
-/******/    module.loaded = true;
-
-/******/    // Return the exports of the module
-/******/    return module.exports;
-/******/  }
-
-
-/******/  // expose the modules object (__webpack_modules__)
-/******/  __webpack_require__.m = modules;
-
-/******/  // expose the module cache
-/******/  __webpack_require__.c = installedModules;
-
-/******/  // __webpack_public_path__
-/******/  __webpack_require__.p = "";
-
-/******/  // Load entry module and return exports
-/******/  return __webpack_require__(0);
-/******/ })
-/************************************************************************/
-/******/ ([
-/* 0 */
-/***/ function(module, exports) {
-
-  ;__weex_define__("@weex-component/9f052b677df388810d2a0255e3195397", [], function(__weex_require__, __weex_exports__, __weex_module__){
-
-  ;
-    __weex_module__.exports = {
-      data: function () {return {
-        ctHeight: 800,
-        img: '//gw.alicdn.com/tps/i2/TB1DpsmMpXXXXabaXXX20ySQVXX-512-512.png_400x400.jpg'
-      }},
-      ready: function () {
-        this.ctHeight = this.$getConfig().env.deviceHeight
-      }
-    }
-
-  ;__weex_module__.exports.template = __weex_module__.exports.template || {}
-  ;Object.assign(__weex_module__.exports.template, {
-    "type": "div",
-    "classList": [
-      "ct"
-    ],
-    "style": {
-      "height": function () {return this.ctHeight}
-    },
-    "children": [
-      {
-        "type": "image",
-        "classList": [
-          "img"
-        ],
-        "style": {
-          "width": 400,
-          "height": 400
-        },
-        "attr": {
-          "src": function () {return this.img}
-        }
-      },
-      {
-        "type": "text",
-        "style": {
-          "fontSize": 42
-        },
-        "attr": {
-          "value": "Hello Weex !"
-        }
-      }
-    ]
-  })
-  ;__weex_module__.exports.style = __weex_module__.exports.style || {}
-  ;Object.assign(__weex_module__.exports.style, {
-    "ct": {
-      "width": 750,
-      "alignItems": "center",
-      "justifyContent": "center"
-    },
-    "img": {
-      "marginBottom": 20
-    }
-  })
-  })
-  ;__weex_bootstrap__("@weex-component/9f052b677df388810d2a0255e3195397", {
-    "transformerVersion": "0.3.1"
-  },undefined)
-
-/***/ }
-/******/ ]);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/dist/weex-html5/demo/index.we
----------------------------------------------------------------------
diff --git a/dist/weex-html5/demo/index.we b/dist/weex-html5/demo/index.we
deleted file mode 100644
index f11e17f..0000000
--- a/dist/weex-html5/demo/index.we
+++ /dev/null
@@ -1,29 +0,0 @@
-<template>
-  <div class="ct" style="height: {{ctHeight}}">
-    <image class="img" style="width: 400px; height: 400px;" src="{{img}}"></image>
-    <text style="font-size: 42;">Hello Weex !</text>
-  </div>
-</template>
-
-<style>
-  .ct {
-    width: 750;
-    align-items: center;
-    justify-content: center;
-  }
-  .img {
-    margin-bottom: 20px;
-  }
-</style>
-
-<script>
-  module.exports = {
-    data: {
-      ctHeight: 800,
-      img: '//gw.alicdn.com/tps/i2/TB1DpsmMpXXXXabaXXX20ySQVXX-512-512.png_400x400.jpg'
-    },
-    ready: function () {
-      this.ctHeight = this.$getConfig().env.deviceHeight
-    }
-  }
-</script>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/dist/weex-html5/index.html
----------------------------------------------------------------------
diff --git a/dist/weex-html5/index.html b/dist/weex-html5/index.html
deleted file mode 100644
index 2a4c868..0000000
--- a/dist/weex-html5/index.html
+++ /dev/null
@@ -1,57 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-  <meta charset="utf-8">
-  <title>Weex HTML5</title>
-  <meta name="apple-mobile-web-app-capable" content="yes" />
-  <meta name="apple-mobile-web-app-status-bar-style" content="black" />
-  <meta name="apple-touch-fullscreen" content="yes" />
-  <meta name="format-detection" content="telephone=no, email=no" />
-  <style>
-    html, body, #weex {
-      width: 100%;
-      height: 100%;
-    }
-  </style>
-  <!--flexible-->
-  <script>
-  !function(a,b){function c(){var b=f.getBoundingClientRect().width;b/i>540&&(b=540*i);var c=b/10;f.style.fontSize=c+"px",k.rem=a.rem=c}var d,e=a.document,f=e.documentElement,g=e.querySelector('meta[name="viewport"]'),h=e.querySelector('meta[name="flexible"]'),i=0,j=0,k=b.flexible||(b.flexible={});if(g){console.warn("The page size will be adapted by the <meta> info.");var l=g.getAttribute("content").match(/initial\-scale=([\d\.]+)/);l&&(j=parseFloat(l[1]),i=parseInt(1/j))}else if(h){var m=h.getAttribute("content");if(m){var n=m.match(/initial\-dpr=([\d\.]+)/),o=m.match(/maximum\-dpr=([\d\.]+)/);n&&(i=parseFloat(n[1]),j=parseFloat((1/i).toFixed(2))),o&&(i=parseFloat(o[1]),j=parseFloat((1/i).toFixed(2)))}}if(!i&&!j){var p=(a.navigator.appVersion.match(/android/gi),a.navigator.appVersion.match(/iphone/gi)),q=a.devicePixelRatio;i=p?q>=3&&(!i||i>=3)?3:q>=2&&(!i||i>=2)?2:1:1,j=1/i}if(f.setAttribute("data-dpr",i),!g)if(g=e.createElement("meta"),g.setAttribute("name","viewport"),g.setAttrib
 ute("content","initial-scale="+j+", maximum-scale="+j+", minimum-scale="+j+", user-scalable=no"),f.firstElementChild)f.firstElementChild.appendChild(g);else{var r=e.createElement("div");r.appendChild(g),e.write(r.innerHTML)}a.addEventListener("resize",function(){clearTimeout(d),d=setTimeout(c,300)},!1),a.addEventListener("pageshow",function(a){a.persisted&&(clearTimeout(d),d=setTimeout(c,300))},!1),"complete"===e.readyState?e.body.style.fontSize=12*i+"px":e.addEventListener("DOMContentLoaded",function(){e.body.style.fontSize=12*i+"px"},!1),c(),k.dpr=a.dpr=i,k.refreshRem=c,k.rem2px=function(a){var b=parseFloat(a)*this.rem;return"string"==typeof a&&a.match(/rem$/)&&(b+="px"),b},k.px2rem=function(a){var b=parseFloat(a)/this.rem;return"string"==typeof a&&a.match(/px$/)&&(b+="rem"),b}}(window,window.lib||(window.lib={}));
-  </script>
-  <script src="./dist/weex.js"></script>
-</head>
-<body>
-  <div id="weex"></div>
-  <script>
-  /**
-   * Init weex instance depending on the url params.
-   * There are three ways to load weex bundles, depends on the
-   * parameter 'loader' in the url:
-   *
-   *   + xhr: use XMLHttpRequest. Parameter 'page' should be
-   *   the bundle's url.
-   *   + source: use the transformed code itself. 'page' should
-   *   be the transformed weex bundle.
-   *
-   * @param {String} bundle - It has different meaning depends on
-   *   the type of loader.
-   */
-  (function () {
-    function getUrlParam (key) {
-      var reg = new RegExp('[?|&]' + key + '=([^&]+)')
-      var match = location.search.match(reg)
-      return match && match[1]
-    }
-
-    var loader = getUrlParam('loader') || 'xhr'
-    var page = getUrlParam('page') || 'demo/build/index.js'
-
-    window.weex.init({
-      appId: location.href,
-      loader: loader,
-      source: page,
-      rootId: 'weex'
-    })
-  })();
-  </script>
-</body>
-</html>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/dist/weex-html5/package.json
----------------------------------------------------------------------
diff --git a/dist/weex-html5/package.json b/dist/weex-html5/package.json
deleted file mode 100644
index 509e586..0000000
--- a/dist/weex-html5/package.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-  "name": "weex-html5",
-  "version": "0.3.2",
-  "description": "Weex HTML5 Renderer",
-  "main": "dist/weex.common.js",
-  "repository": {
-    "type": "git",
-    "url": "git+ssh://git@github.com/alibaba/weex.git"
-  },
-  "keywords": [
-    "weex",
-    "html5"
-  ],
-  "author": {
-    "name": "mr.raindrop"
-  },
-  "license": "Apache-2.0",
-  "homepage": "https://alibaba.github.io/weex",
-  "readmeFilename": "README.md",
-  "bugs": {
-    "url": "https://github.com/alibaba/weex/issues"
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/dist/weex-js-framework/LICENSE
----------------------------------------------------------------------
diff --git a/dist/weex-js-framework/LICENSE b/dist/weex-js-framework/LICENSE
deleted file mode 100644
index a9b2d6e..0000000
--- a/dist/weex-js-framework/LICENSE
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 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.

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/dist/weex-js-framework/NOTICE
----------------------------------------------------------------------
diff --git a/dist/weex-js-framework/NOTICE b/dist/weex-js-framework/NOTICE
deleted file mode 100644
index 2bf775b..0000000
--- a/dist/weex-js-framework/NOTICE
+++ /dev/null
@@ -1,7 +0,0 @@
-Weex JS Framework
-Copyright 2016 Alibaba Group
-
-This product includes software developed at Alibaba Group. (http://www.alibabagroup.com)
-
-This product contains software vuejs(https://github.com/vuejs/vue) developed
-by Yuxi Evan You , licensed under the MIT License.

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/dist/weex-js-framework/README.md
----------------------------------------------------------------------
diff --git a/dist/weex-js-framework/README.md b/dist/weex-js-framework/README.md
deleted file mode 100644
index edd2bea..0000000
--- a/dist/weex-js-framework/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-## Weex JS Framework
-
-See more: https://github.com/alibaba/weex/
-
-build tips:
-
-* use `babel-preset-es2015`
-* use `json-loader`

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/dist/weex-js-framework/index.js
----------------------------------------------------------------------
diff --git a/dist/weex-js-framework/index.js b/dist/weex-js-framework/index.js
deleted file mode 100644
index 37c9145..0000000
--- a/dist/weex-js-framework/index.js
+++ /dev/null
@@ -1 +0,0 @@
-import './src/render/native'

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/dist/weex-js-framework/package.json
----------------------------------------------------------------------
diff --git a/dist/weex-js-framework/package.json b/dist/weex-js-framework/package.json
deleted file mode 100644
index 289ca94..0000000
--- a/dist/weex-js-framework/package.json
+++ /dev/null
@@ -1,39 +0,0 @@
-{
-  "name": "weex-js-framework",
-  "version": "0.16.18",
-  "subversion": {
-    "framework": "0.16.18",
-    "transformer": ">=0.1.5 <0.4"
-  },
-  "description": "Weex JS Framework",
-  "keywords": [
-    "weex",
-    "mvvm",
-    "javascript",
-    "html5"
-  ],
-  "homepage": "https://alibaba.github.io/weex",
-  "bugs": {
-    "url": "https://github.com/alibaba/weex/issues"
-  },
-  "license": "Apache-2.0",
-  "author": "Jinjiang <zh...@me.com>",
-  "maintainers": [
-    "terrykingcha <te...@gmail.com>",
-    "IskenHuang <is...@gmail.com>",
-    "yuanyan <yu...@gmail.com>"
-  ],
-  "main": "index.js",
-  "repository": {
-    "type": "git",
-    "url": "git@github.com:alibaba/weex.git"
-  },
-  "scripts": {
-    "test": "echo \"Error: no test specified\" && exit 1"
-  },
-  "dependencies": {
-    "core-js": "^2.4.0",
-    "semver": "^5.1.0",
-    "weex-vue-framework": "0.1.8"
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/SUMMARY.md
----------------------------------------------------------------------
diff --git a/doc/SUMMARY.md b/doc/SUMMARY.md
index 5733b21..75d3ff8 100644
--- a/doc/SUMMARY.md
+++ b/doc/SUMMARY.md
@@ -35,6 +35,7 @@
     * [Bootstrap](/references/bootstrap.md)
     * [Component Definition](/references/component-defs.md)
     * [Instance APIs](/references/api.md)
+    * [Gesture](/references/gesture.md)
     * [Built-in Components](/components/main.md)
         * [Common Attributes](/references/common-attrs.md)
         * [Common Style](/references/common-style.md)
@@ -46,9 +47,11 @@
         * [scroller](/components/scroller.md)
         * [list](/components/list.md)
             * [cell](/components/cell.md)
+            * [refresh & loading](/components/refresh-loading.md)
         * [text](/components/text.md)
         * [image](/components/image.md)
         * [input](/components/input.md)
+        * [textarea](/components/textarea.md)
         * [switch](/components/switch.md)
         * [slider](/components/slider.md)
             * [indicator](/components/indicator.md)
@@ -67,6 +70,7 @@
         * [storage](/modules/storage.md)
         * [timer](/modules/timer.md)
         * [clipboard](/modules/clipboard.md)
+        * [globalEvent](/modules/globalevent.md)
     * Low-level Specs
         * [JS Bundle Format](/specs/js-bundle-format.md)
         * [JS Framework APIs](/specs/js-framework-apis.md)

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/_layouts/header.html
----------------------------------------------------------------------
diff --git a/doc/_layouts/header.html b/doc/_layouts/header.html
index cff2c95..3c97517 100644
--- a/doc/_layouts/header.html
+++ b/doc/_layouts/header.html
@@ -50,7 +50,7 @@ dl, ol, ul {
     margin-right: 5px;
     margin-left: 10px;    
     margin-top: 29px;    
-    background: url("http://alibaba.github.io/weex/img/weex_logo_blue@3x.png") no-repeat;
+    background: url("//alibaba.github.io/weex/img/weex_logo_blue@3x.png") no-repeat;
     height: 33px;
     width: 145px;
     background-position: 0px 0px;
@@ -149,9 +149,9 @@ a.weex-translate.incomplete{
 </style>
 
     <!-- 
-    <link rel="stylesheet"  href="//g.alicdn.com/mtb/lab-zikuan/0.1.3/weex/weex_doc.css" >
+    <link rel="stylesheet"  href="//alibaba.github.io/weex/css/weex_doc.css" >
 
-    <link rel="stylesheet"  href="http://127.0.0.1/taobao/weex-os/weex/doc/ali_addition/weex_doc.css" >
+    <link rel="stylesheet"  href="//alibaba.github.io/weex/doc/ali_addition/weex_doc.css" >
     -->
 
 <script>
@@ -235,30 +235,32 @@ contentLoaded(window,function(){
 </script>
 
     <!-- 
-    <script src="//g.alicdn.com/mtb/lab-zikuan/0.1.3/weex/weex_doc.js"></script>
-    <script src="http://127.0.0.1/taobao/weex-os/weex/doc/ali_addition/weex_doc.js"></script>
+    <script src="//alibaba.github.io/weex/css/weex_doc.js"></script>
+    <script src="//alibaba.github.io/weex/doc/ali_addition/weex_doc.js"></script>
     -->    
     
 <div class="weex-doc-header">
     <div class="top-bar">
-        <div class="top-bar-title" onclick="location='http://alibaba.github.io/weex/index.html'" ></div>                        
+        <div class="top-bar-title" onclick="location='//alibaba.github.io/weex/index.html'" ></div>
         <div class="top-bar-left">
             <ul  class="menu" role="menubar" >
                 <li role="menuitem">
-                    <a href='http://alibaba.github.io/weex/demo.html'>Showcase</a>                            
+                    <a href='//alibaba.github.io/weex/demo.html'>Showcase</a>
                 </li>
                 <li role="menuitem" >
-                    <a href="http://alibaba.github.io/weex/download.html">Download</a>
+                    <a href="//alibaba.github.io/weex/download.html">Download</a>
                 </li>
             </ul>
         </div>
         <div class="top-bar-right">
             <ul class="menu">
                 <li>
-                    <a href="https://github.com/alibaba/weex">
-                        <img class='github' src='//g.alicdn.com/mtb/lab-zikuan/0.1.1/weex/github.png' alt='github' >
+                    <a href="//github.com/alibaba/weex">
+                        <img class='github' src='//alibaba.github.io/weex/img/github.png' alt='github' >
                     </a>
-                 </li>
+                </li>
+                <li>
+                    <a href="//alibaba.github.io/weex/cn/doc/">\U0001f1e8\U0001f1f3</a>
                 </li>
             </ul>                    
         </div>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/advanced/extend-to-android.md
----------------------------------------------------------------------
diff --git a/doc/advanced/extend-to-android.md b/doc/advanced/extend-to-android.md
index c680434..b4bae71 100644
--- a/doc/advanced/extend-to-android.md
+++ b/doc/advanced/extend-to-android.md
@@ -1,6 +1,5 @@
 ##Extend to Android
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/issues/27"  class="weex-translate">cn</a>
  
 ### Module extend
 weex sdk support Module extend,

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/advanced/extend-to-html5.md
----------------------------------------------------------------------
diff --git a/doc/advanced/extend-to-html5.md b/doc/advanced/extend-to-html5.md
index 8211ceb..05ae0fe 100644
--- a/doc/advanced/extend-to-html5.md
+++ b/doc/advanced/extend-to-html5.md
@@ -1,6 +1,5 @@
 ## Extend Weex HTML5
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/issues/11"  class="weex-translate">cn</a>
 
 ### Intro
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/advanced/extend-to-ios.md
----------------------------------------------------------------------
diff --git a/doc/advanced/extend-to-ios.md b/doc/advanced/extend-to-ios.md
index 03d2e8a..a64adc3 100644
--- a/doc/advanced/extend-to-ios.md
+++ b/doc/advanced/extend-to-ios.md
@@ -1,5 +1,4 @@
 ##Extend to iOS
-<a href="https://github.com/weexteam/article/issues/17"  class="weex-translate">cn</a>
  
 ### Module extend
 
@@ -189,10 +188,10 @@ method| description
 initWithRef:type:...| Initializes a new component using the specified  properties. 
 layoutDidFinish | Called when the component has just laid out.
 loadView   | Creates the view that the component manages.  
-viewWillLoad | Called before the load of component'��s view .  
-viewDidLoad | Called after the component'��s view is loaded and set.
-viewWillUnload | Called just before releasing the component'��s view.
-viewDidUnload | Called when the component'��s view is released.
+viewWillLoad | Called before the load of component's view .  
+viewDidLoad | Called after the component's view is loaded and set.
+viewWillUnload | Called just before releasing the component's view.
+viewDidUnload | Called when the component's view is released.
 updateStyles:| Called when component's style are updated.
 updateAttributes:| Called when component's attributes are updated.
 addEvent:| Called when adding an event to the component.

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/advanced/how-data-binding-works.md
----------------------------------------------------------------------
diff --git a/doc/advanced/how-data-binding-works.md b/doc/advanced/how-data-binding-works.md
index d78af56..d4ef613 100644
--- a/doc/advanced/how-data-binding-works.md
+++ b/doc/advanced/how-data-binding-works.md
@@ -1,6 +1,5 @@
 # How data-binding works
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/issues/26"  class="weex-translate">cn</a>
 
 Weex JS Framework is a MVVM framework. It observe data and use `{{bindedKey}}` syntax to bind in views. When data is changed in anyway, the view will automatically be updated due to data-binding.
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/advanced/how-it-works.md
----------------------------------------------------------------------
diff --git a/doc/advanced/how-it-works.md b/doc/advanced/how-it-works.md
index 0424ea7..887e34a 100644
--- a/doc/advanced/how-it-works.md
+++ b/doc/advanced/how-it-works.md
@@ -1,6 +1,5 @@
 # How it works
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/issues/32"  class="weex-translate">cn</a>
 
 ## Overview
 
@@ -100,7 +99,7 @@ Native RenderEngine will supplies many native components and modules for call.
 
 During a Weex instance works, Native RenderEngine receives all kinds of module API calls from JS Framework. These calls will create or update components for view and use client-side features like `toast`. When a user interaction or module API callback happens, It will call `callJS()` from JS Framework. These jobs could walk through the Weex instance lifecycle till the instance is destroyed. As is shown in the architecture figure, H5 RenderEngine is a special RenderEngine with almost the same functions as native RenderEngines. 
 
-![arch](http://gtms02.alicdn.com/tps/i2/TB1ootBMpXXXXXrXXXXwi60UVXX-596-397.png)  
+![arch](//gtms02.alicdn.com/tps/i2/TB1ootBMpXXXXXrXXXXwi60UVXX-596-397.png)  
 Weex Architecture 
 
 ### call native from javascript
@@ -126,7 +125,7 @@ user interactions
 
 ### Render Flow
 
-![render flow](http://gtms03.alicdn.com/tps/i3/TB1_SA4MXXXXXXGaXXXpZ8UVXXX-519-337.png)  
+![render flow](//gtms03.alicdn.com/tps/i3/TB1_SA4MXXXXXXGaXXXpZ8UVXXX-519-337.png)  
 Weex Render Flow 
 
 0. Input is virtual dom.

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/advanced/integrate-to-android.md
----------------------------------------------------------------------
diff --git a/doc/advanced/integrate-to-android.md b/doc/advanced/integrate-to-android.md
index ab03b0e..8aa9ce5 100644
--- a/doc/advanced/integrate-to-android.md
+++ b/doc/advanced/integrate-to-android.md
@@ -1,5 +1,4 @@
 # Integrate to Android
-<a href="https://github.com/weexteam/article/issues/25"  class="weex-translate">cn</a>
 
 
 When you need to use the new features or to customize specific features, you can rely on the Source SDK for development\u3002
@@ -11,7 +10,7 @@ Assuming you have the Android SDK installed, run `android` to open the Android S
 Make sure you have the following installed:
 
 1. Android SDK version 23 (compileSdkVersion in [`build.gradle`](https://github.com/alibaba/weex/blob/master/android/sdk/build.gradle))
-2. SDK build tools version 23.0.1 (buildToolsVersion in [`build.gradle`](https://github.com/alibaba/weex/blob/master/android/sdk/build.gradle))
+2. SDK build tools version 23.0.2 (buildToolsVersion in [`build.gradle`](https://github.com/alibaba/weex/blob/master/android/sdk/build.gradle))
 3. Android Support Repository >= 17 (for Android Support Library)
 4. Android NDK (download & extraction instructions [here](http://developer.android.com/ndk/downloads/index.html))
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/advanced/integrate-to-html5.md
----------------------------------------------------------------------
diff --git a/doc/advanced/integrate-to-html5.md b/doc/advanced/integrate-to-html5.md
index 795d1e4..0a7f236 100644
--- a/doc/advanced/integrate-to-html5.md
+++ b/doc/advanced/integrate-to-html5.md
@@ -1,6 +1,5 @@
 ## Integrate Weex HTML5 to your project
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/issues/10"  class="weex-translate">cn</a>
 
 ### Intro
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/advanced/integrate-to-ios.md
----------------------------------------------------------------------
diff --git a/doc/advanced/integrate-to-ios.md b/doc/advanced/integrate-to-ios.md
index 358981c..e9e4067 100644
--- a/doc/advanced/integrate-to-ios.md
+++ b/doc/advanced/integrate-to-ios.md
@@ -1,5 +1,4 @@
 # import Weex iOS to your project
-<a href="https://github.com/weexteam/article/issues/18"  class="weex-translate">cn</a>
 
 You will need to build Weex from source if you want to work on a new feature/bug fix, try out the latest features not released yet, or maintain your own fork with patches that cannot be merged to the core.
 
@@ -26,7 +25,7 @@ end
 ```
 You can get your `YourTarget` below
 
-![img](http://img4.tbcdn.cn/L1/461/1/4d9f4d6a8441b44e4816c7778627824fb72c58de)
+![img](//img4.tbcdn.cn/L1/461/1/4d9f4d6a8441b44e4816c7778627824fb72c58de)
 
 Run pod install in current directory, for a while, .xcworkspace will be created.  At this point, the dependencies have been established.
 
@@ -107,4 +106,4 @@ We can also pack all the JS files into the app's resources. This way you can run
 * Move `index.js` to your app's Xcode project and add the file to your target.
 * Replace `[_instance renderWithURL:'httpURL']` with: `[_instance renderWithURL: [[NSBundle mainBundle] URLForResource:@"index" withExtension:@"js"]]`
 
-* Go for Product -> Archive in Xcode and follow the steps to build your .IPA file and submit it to the AppStore.
\ No newline at end of file
+* Go for Product -> Archive in Xcode and follow the steps to build your .IPA file and submit it to the AppStore.

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/ali_addition/weex_doc.css
----------------------------------------------------------------------
diff --git a/doc/ali_addition/weex_doc.css b/doc/ali_addition/weex_doc.css
index f90ed07..6acac5f 100644
--- a/doc/ali_addition/weex_doc.css
+++ b/doc/ali_addition/weex_doc.css
@@ -48,8 +48,8 @@ dl, ol, ul {
     float: left;
     margin-right: 5px;
     margin-left: 10px;    
-    margin-top: 29px;    
-    background: url("http://alibaba.github.io/weex/img/weex_logo_blue@3x.png") no-repeat;
+    margin-top: 29px;
+    background: url("//alibaba.github.io/weex/img/weex_logo_blue@3x.png") no-repeat;
     height: 33px;
     width: 145px;
     background-position: 0px 0px;
@@ -129,7 +129,7 @@ a.weex-translate{
 }
 
 a.weex-translate.incomplete{
-  background-color: #777;                    
+  background-color: #777;
 }
 
 .wx-v{
@@ -143,4 +143,4 @@ a.weex-translate.incomplete{
     vertical-align: middle;
     background-color: #777;
     border-radius: 10px;
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/components/a.md
----------------------------------------------------------------------
diff --git a/doc/components/a.md b/doc/components/a.md
index 0d2d30d..490cb7a 100644
--- a/doc/components/a.md
+++ b/doc/components/a.md
@@ -1,9 +1,8 @@
 # &lt;a&gt;
 <span class="weex-version">0.5</span>
-<a href="https://github.com/weexteam/article/wiki/%E6%AC%A2%E8%BF%8E%E5%8F%82%E4%B8%8EWeex%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3%E7%BF%BB%E8%AF%91"  class="weex-translate incomplete">cn</a>
 
 ###Summary
-&lt;a&gt; defines a hyperlink to a page in the web. Its purpose and syntax is very simliar to [&lt;a&gt;](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a) in HTML5.
+&lt;a&gt; defines a hyperlink to a page in the web. Its purpose and syntax is very similar to [&lt;a&gt;](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a) in HTML5.
 
 ### Child Components
 
@@ -17,9 +16,10 @@ href attributes defines the URL of the hyperlink.
 **common styles**: check out the [common styles](../references/common-attrs.md)
 
 ### Events
-**common events**: check out the [common events](../references/common-event.md)
+**common events**: check out the [common events](../references/common-event.md)  
+tip: we can't guarantee the order of execution between onclick function and href
 
 ### Examples
     <a href="http://g.tbcdn.cn/ali-wireless-h5/res/0.0.16/hello.js">
        <text>Click me to see how 'A' element opens a new world.</text>
-    </a>
\ No newline at end of file
+    </a>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/components/cell.md
----------------------------------------------------------------------
diff --git a/doc/components/cell.md b/doc/components/cell.md
index 9690fe5..eb06430 100644
--- a/doc/components/cell.md
+++ b/doc/components/cell.md
@@ -1,6 +1,5 @@
 # &lt;cell&gt;
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/wiki/%E6%AC%A2%E8%BF%8E%E5%8F%82%E4%B8%8EWeex%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3%E7%BF%BB%E8%AF%91"  class="weex-translate incomplete">cn</a>
 
 ### Summary
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/components/div.md
----------------------------------------------------------------------
diff --git a/doc/components/div.md b/doc/components/div.md
index ea64e63..5293c8e 100644
--- a/doc/components/div.md
+++ b/doc/components/div.md
@@ -1,6 +1,5 @@
 # &lt;div&gt;
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/issues/39"  class="weex-translate ">cn</a>
 
 ### Summary
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/components/image.md
----------------------------------------------------------------------
diff --git a/doc/components/image.md b/doc/components/image.md
index f5b8ad6..70ff4eb 100644
--- a/doc/components/image.md
+++ b/doc/components/image.md
@@ -1,6 +1,5 @@
 # &lt;image&gt;
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/issues/44"  class="weex-translate">cn</a>
 
 ### Summary
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/components/indicator.md
----------------------------------------------------------------------
diff --git a/doc/components/indicator.md b/doc/components/indicator.md
index 1835f9a..468b292 100644
--- a/doc/components/indicator.md
+++ b/doc/components/indicator.md
@@ -1,6 +1,5 @@
 # &lt;indicator&gt;
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/wiki/%E6%AC%A2%E8%BF%8E%E5%8F%82%E4%B8%8EWeex%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3%E7%BF%BB%E8%AF%91"  class="weex-translate incomplete">cn</a>
 
 ### Summary
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/components/input.md
----------------------------------------------------------------------
diff --git a/doc/components/input.md b/doc/components/input.md
index 0508f59..3027456 100644
--- a/doc/components/input.md
+++ b/doc/components/input.md
@@ -1,6 +1,5 @@
 # &lt;input&gt;
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/issues/45"  class="weex-translate">cn</a>
 
 
 ### Summary

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/components/list.md
----------------------------------------------------------------------
diff --git a/doc/components/list.md b/doc/components/list.md
index abdd56d..603cdcd 100644
--- a/doc/components/list.md
+++ b/doc/components/list.md
@@ -1,6 +1,5 @@
 # &lt;list&gt;
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/wiki/%E6%AC%A2%E8%BF%8E%E5%8F%82%E4%B8%8EWeex%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3%E7%BF%BB%E8%AF%91"  class="weex-translate incomplete">cn</a>
 
 
 ### Summary

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/components/scroller.md
----------------------------------------------------------------------
diff --git a/doc/components/scroller.md b/doc/components/scroller.md
index b6715e9..8331003 100644
--- a/doc/components/scroller.md
+++ b/doc/components/scroller.md
@@ -1,6 +1,5 @@
 # &lt;scroller&gt;
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/issues/40"  class="weex-translate ">cn</a>
 
 ### Summary
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/components/slider.md
----------------------------------------------------------------------
diff --git a/doc/components/slider.md b/doc/components/slider.md
index 419fbd7..eaa04ee 100644
--- a/doc/components/slider.md
+++ b/doc/components/slider.md
@@ -1,6 +1,5 @@
 # &lt;slider&gt;
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/issues/47"  class="weex-translate">cn</a>
 
 
 ### Summary
@@ -14,6 +13,7 @@ It supports all kinds of weex components as its slides, especially the `indicato
 ### Attributes
 
 - `auto-play`: &lt;boolean&gt; `true` | `false`. This value determines whether the slides plays automatically after the page rendering finished. The default value is `false`.
+- `interval`: &lt;number&gt; millisecond. This value determines time interval for each page displayed in slider.
 - `index`: &lt;number&gt; . This value determines the  index of current shown slide. The default value is `0`.
 
 Other attributes please check out the [common attributes](../references/common-attrs.md).

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/components/special-element.md
----------------------------------------------------------------------
diff --git a/doc/components/special-element.md b/doc/components/special-element.md
index 32c1313..90d93f3 100644
--- a/doc/components/special-element.md
+++ b/doc/components/special-element.md
@@ -1,10 +1,9 @@
 # Special Element
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/issues/36"  class="weex-translate">cn</a>
 
 ## &lt;content&gt;
 
-The element serves as content distribution outlest in a composed component template. The element itself will be replaced.
+The element serves as content distribution outlet in a composed component template. The element itself will be replaced.
 
 alias: `<slot>`
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/components/switch.md
----------------------------------------------------------------------
diff --git a/doc/components/switch.md b/doc/components/switch.md
index 5a6067e..22c0da7 100644
--- a/doc/components/switch.md
+++ b/doc/components/switch.md
@@ -1,6 +1,5 @@
 # &lt;switch&gt;
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/issues/46"  class="weex-translate">cn</a>
 
 
 ### Summary

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/components/text.md
----------------------------------------------------------------------
diff --git a/doc/components/text.md b/doc/components/text.md
index 5f038b8..660c9e4 100644
--- a/doc/components/text.md
+++ b/doc/components/text.md
@@ -1,6 +1,5 @@
 # &lt;text&gt;
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/wiki/%E6%AC%A2%E8%BF%8E%E5%8F%82%E4%B8%8EWeex%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3%E7%BF%BB%E8%AF%91"  class="weex-translate incomplete">cn</a>
 
 ### Summary
 
@@ -32,7 +31,7 @@ Other attributes please check out the [common attributes](../references/common-a
 - support `text-decoration` style.
 - support `text-align` style.
 - support `text-overflow` style.
-- support `line-height`<sup class="wx-v">0.6.1</sup> style.
+- support `line-height`<sup class="wx-v">0.6.1</sup> style. line-height in iOS is different from h5 and Android, text value will be placed at bottom of line box.
 - not support `flex-direction`, `justify-content`, `align-items` which is active for child nodes, and text has no child nodes.
 
 **common styles**: check out [common styles for components](../references/common-style.md)

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/components/textarea.md
----------------------------------------------------------------------
diff --git a/doc/components/textarea.md b/doc/components/textarea.md
new file mode 100644
index 0000000..661e146
--- /dev/null
+++ b/doc/components/textarea.md
@@ -0,0 +1,74 @@
+# &lt;textarea&gt;
+<span class="weex-version">0.8</span>
+
+
+### Summary
+
+The weex builtin component ``textarea`` is used to create interactive controls to accept data from users. It can be a multi-line [input](./input.md).
+
+**Notes:** `<textarea>` support all event which `<input>` had.
+
+### Child Components
+
+This component supports no child components.
+
+### attributes
+
+- `value`: &lt;string&gt; the value of the control.
+- `placeholder`: &lt;string&gt; a hint to the user of which can be entered to the control. The placeholder text must have no carriage returns or line-feeds.
+- `disabled`: &lt;boolean&gt; a boolean attribute indicates that the form control is not available for interaction. In particular, the click event will not be dispatched on disabled controls.
+- `autofocus`: &lt;boolean&gt; a boolean attribute lets you specify that a form control should have input focus when the page loads.
+- `rows:`&lt;number&gt; a number which can specify the height of textarea, default is `2`.
+
+Other attributes please check out the [common attributes](../references/common-attrs.md).
+
+### Styles
+
+**text styles**: checkout [text styles](../references/text-style.md)
+
+- support `color` style.
+- support `font-size` style.
+- support `font-style` style.
+- support `font-weight` style.
+- support `text-align` style.
+
+
+**common styles**: check out [common styles for components](../references/common-style.md)
+
+- support flexbox related styles.
+- support box model related styles.
+- support ``position`` related styles.
+- support ``opacity``, ``background-color`` etc.
+
+### Events
+
+- `input`: the value of an element changes.
+- `change`: the change event is fired when a change to the component's value is commited by the user. It always come after a ``blur`` event.
+- `focus`: a component has received focus.
+- `blur`: a component has lost focus.
+
+**common events**: check out the [common events](../references/common-event.md)
+
+- support `appear` / `disappear` event. Check out [common events](../references/common-event.md).
+
+**Notes:** `<textarea>` does not support the common-event `click`. Please listen to the `input` or `change` event instead.
+
+### Parameters of events' object
+
+- for ``input`` and ``change`` events:
+  - `value`: the value of the component who dispatched this event.
+  - `timestamp`: the time stamp of the event.
+- for ``focus`` and ``blur`` events:
+  - `timestamp`: the time stamp of the event.
+
+### Example
+
+```
+<div>
+  <textarea
+    autofocus="true"
+    placeholder="..."
+    value="I am a multiple input">
+  </textarea>
+</div>
+```

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/components/video.md
----------------------------------------------------------------------
diff --git a/doc/components/video.md b/doc/components/video.md
index a8a9d9d..0d06468 100644
--- a/doc/components/video.md
+++ b/doc/components/video.md
@@ -1,6 +1,5 @@
 # &lt;video&gt;
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/wiki/%E6%AC%A2%E8%BF%8E%E5%8F%82%E4%B8%8EWeex%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3%E7%BF%BB%E8%AF%91"  class="weex-translate incomplete">cn</a>
 
 ### Summary
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/components/web.md
----------------------------------------------------------------------
diff --git a/doc/components/web.md b/doc/components/web.md
index a790955..eeabf70 100644
--- a/doc/components/web.md
+++ b/doc/components/web.md
@@ -1,6 +1,5 @@
 # &lt;web&gt;
 <span class="weex-version">0.5</span>
-<a href="https://github.com/weexteam/article/wiki/%E6%AC%A2%E8%BF%8E%E5%8F%82%E4%B8%8EWeex%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3%E7%BF%BB%E8%AF%91"  class="weex-translate incomplete">cn</a>
 
 ### Summary
 
@@ -47,4 +46,4 @@ Other attributes please check out the [common attributes](../references/common-a
   <web style="width=...; height=...;" src="..." 	onpagestart="pagestart" onpagefinish="pagefinish" 	onerror="error">
   </web>
 </div>
-```
\ No newline at end of file
+```

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/components/wxc-navpage.md
----------------------------------------------------------------------
diff --git a/doc/components/wxc-navpage.md b/doc/components/wxc-navpage.md
index 29df3a1..7cdde9c 100644
--- a/doc/components/wxc-navpage.md
+++ b/doc/components/wxc-navpage.md
@@ -1,6 +1,5 @@
 # &lt;wxc-navpage&gt;
 <span class="weex-version">0.5</span>
-<a href="https://github.com/weexteam/article/wiki/%E6%AC%A2%E8%BF%8E%E5%8F%82%E4%B8%8EWeex%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3%E7%BF%BB%E8%AF%91"  class="weex-translate incomplete">cn</a>
 
 ### Summary
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/components/wxc-tabbar.md
----------------------------------------------------------------------
diff --git a/doc/components/wxc-tabbar.md b/doc/components/wxc-tabbar.md
index 6385237..f6e656b 100644
--- a/doc/components/wxc-tabbar.md
+++ b/doc/components/wxc-tabbar.md
@@ -1,6 +1,5 @@
 # &lt;wxc-tabbar&gt;
 <span class="weex-version">0.5</span>
-<a href="https://github.com/weexteam/article/wiki/%E6%AC%A2%E8%BF%8E%E5%8F%82%E4%B8%8EWeex%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3%E7%BF%BB%E8%AF%91"  class="weex-translate incomplete">cn</a>
 
 ### Summary
 
@@ -89,4 +88,4 @@ Other attributes please check out the [common attributes](../references/common-a
     }
   }
 </script>
-```
\ No newline at end of file
+```

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/demo/animation.md
----------------------------------------------------------------------
diff --git a/doc/demo/animation.md b/doc/demo/animation.md
index 962cc16..367c1b4 100644
--- a/doc/demo/animation.md
+++ b/doc/demo/animation.md
@@ -2,7 +2,7 @@ Animation Demo
 ==============
 
 ## snapshot
-![weex demo](http://gtms02.alicdn.com/tps/i2/TB1B5L2MpXXXXXhXXXXp.9cVpXX-278-424.gif)
+![weex demo](https://gtms02.alicdn.com/tps/i2/TB1B5L2MpXXXXXhXXXXp.9cVpXX-278-424.gif)
 
 ## weex code
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/demo/hello-world.md
----------------------------------------------------------------------
diff --git a/doc/demo/hello-world.md b/doc/demo/hello-world.md
index dab5329..7e571a6 100644
--- a/doc/demo/hello-world.md
+++ b/doc/demo/hello-world.md
@@ -2,7 +2,7 @@ Weex Hello World
 ================
 
 ## snapshot
-![weex hello world](http://gtms01.alicdn.com/tps/i1/TB1rXlGMpXXXXXqXVXX1PdU0VXX-640-920.png)
+![weex hello world](https://gtms01.alicdn.com/tps/i1/TB1rXlGMpXXXXXqXVXX1PdU0VXX-640-920.png)
 
 ## weex code
 hello_world.we

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/demo/list.md
----------------------------------------------------------------------
diff --git a/doc/demo/list.md b/doc/demo/list.md
index a295a33..66b5c15 100644
--- a/doc/demo/list.md
+++ b/doc/demo/list.md
@@ -2,7 +2,7 @@ Weex List Demo
 ===============
 
 ## snapshot
-![weex demo](http://gtms01.alicdn.com/tps/i1/TB1U.vZMpXXXXakXXXXfoKlVpXX-278-474.gif)
+![weex demo](https://gtms01.alicdn.com/tps/i1/TB1U.vZMpXXXXakXXXXfoKlVpXX-278-474.gif)
 
 ## weex code
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/demo/modal.md
----------------------------------------------------------------------
diff --git a/doc/demo/modal.md b/doc/demo/modal.md
index c341f67..a1e7863 100644
--- a/doc/demo/modal.md
+++ b/doc/demo/modal.md
@@ -2,7 +2,7 @@ Weex Modal Demo
 ===============
 
 ## snapshot
-![weex demo](http://gtms03.alicdn.com/tps/i3/TB1JcHRMpXXXXXhXpXXp.9cVpXX-278-424.gif)
+![weex demo](https://gtms03.alicdn.com/tps/i3/TB1JcHRMpXXXXXhXpXXp.9cVpXX-278-424.gif)
 
 ## weex code
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/demo/slider.md
----------------------------------------------------------------------
diff --git a/doc/demo/slider.md b/doc/demo/slider.md
index de7b5df..425ff86 100644
--- a/doc/demo/slider.md
+++ b/doc/demo/slider.md
@@ -2,7 +2,7 @@ Weex Slider Demo
 ===============
 
 ## snapshot
-![weex demo](http://gtms02.alicdn.com/tps/i2/TB1c9rFMpXXXXabXFXXfoKlVpXX-278-474.gif)
+![weex demo](https://gtms02.alicdn.com/tps/i2/TB1c9rFMpXXXXabXFXXfoKlVpXX-278-474.gif)
 
 ## weex code
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/faq.md
----------------------------------------------------------------------
diff --git a/doc/faq.md b/doc/faq.md
index 74305ea..c31bc10 100644
--- a/doc/faq.md
+++ b/doc/faq.md
@@ -55,6 +55,29 @@ modal.toast({message: 'hello'})
 
 We will bring a better syntax design in the future.
 
+## iOS text line-height style is abnormal
+
+`line-height` style in text component is different from h5 and Android,  text value will be placed at bottom of line box because of iOS native api. We are trying to optimize it.
+
+## Android only support `overflow:hidden`
+The `overflow` style in android is `hidden` and cannot be changed. This is the result of Android View framework. This only happens on Android, iOS will work as expected.
+
+## Android do not support emoji
+As Android NDK only supports Modified UTF-8, emoji is not support yet. Any attemp to use emoji may cause crash in case of lower than Android 6.0, and unexpected behavior when it is higher than 6.0. Only use Modified UTF-8, **do not** use emoji.
+
+## How to get rid of 750 adaption and calculate width/height in real pixels\uff1f
+
+The deviceHeight and deviceWidth got in `this.$getConfig()` is the real device width/height in pixels, not the ones with 750-adapted.
+
+So you can use them to calculate width/height in real pixels.
+
+Suppose you need to display a navigation bar of fixed 88 pixels, the bar's height will be:
+
+```
+var height = 88 * 750 / env.deviceWidth 
+```
+
+
 ## How to detect an native module/component supported in JavaScript?
 
 ### Detect native module
@@ -102,4 +125,3 @@ If you have 2 pages, A and B.
 
 
 
-

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/how-to/customize-a-native-component.md
----------------------------------------------------------------------
diff --git a/doc/how-to/customize-a-native-component.md b/doc/how-to/customize-a-native-component.md
index abacb3c..b6c0ef1 100644
--- a/doc/how-to/customize-a-native-component.md
+++ b/doc/how-to/customize-a-native-component.md
@@ -1,7 +1,6 @@
 # How to customize a native Component ?
-<a href="https://github.com/weexteam/article/wiki/%E6%AC%A2%E8%BF%8E%E5%8F%82%E4%B8%8EWeex%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3%E7%BF%BB%E8%AF%91"  class="weex-translate incomplete">cn</a>
 
-Weex has wrapped up the most critical platform components, such as `ScrollView`, `ListView`, `Text`, `Imageview` and so on. Certainly these components can not completely meet your need. And  thousands of native UI components that alwaysly be using in our project may be required to integrate into Weex easily. Fortunately, it's quite convenient to wrap up your own components that should be from any existing components.
+Weex has wrapped up the most critical platform components, such as `ScrollView`, `ListView`, `Text`, `Imageview` and so on. Certainly these components can not completely meet your need. And  thousands of native UI components that always be using in our project may be required to integrate into Weex easily. Fortunately, it's quite convenient to wrap up your own components that should be from any existing components.
 
 ##### Step By Step
  

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/how-to/cuszomize-native-apis.md
----------------------------------------------------------------------
diff --git a/doc/how-to/cuszomize-native-apis.md b/doc/how-to/cuszomize-native-apis.md
index 0824e44..23da775 100644
--- a/doc/how-to/cuszomize-native-apis.md
+++ b/doc/how-to/cuszomize-native-apis.md
@@ -1,5 +1,4 @@
 # How to customize native APIs ?
-<a href="https://github.com/weexteam/article/wiki/%E6%AC%A2%E8%BF%8E%E5%8F%82%E4%B8%8EWeex%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3%E7%BF%BB%E8%AF%91"  class="weex-translate incomplete">cn</a>
 
 Weex SDK provides only rendering capability, rather than having other capabilities, such as network, picture, and URL redirection. If you want the these features, you need to implement them yourselves.   
 The example below will describe how to extend weex with native logic or 'bridge' your existed native code.

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/how-to/debug-with-html5.md
----------------------------------------------------------------------
diff --git a/doc/how-to/debug-with-html5.md b/doc/how-to/debug-with-html5.md
index 61df749..9742141 100644
--- a/doc/how-to/debug-with-html5.md
+++ b/doc/how-to/debug-with-html5.md
@@ -1,9 +1,8 @@
 # How to debug in html5 renderer ?
-<a href="https://github.com/weexteam/article/wiki/%E6%AC%A2%E8%BF%8E%E5%8F%82%E4%B8%8EWeex%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3%E7%BF%BB%E8%AF%91"  class="weex-translate incomplete">cn</a>
 
 Since weex-html5 can run on a modern mobile browser, it's naturally supported to debug weex-html5 code in browsers' dev tools. Use browser's devTools to iterate, debug and profile your weex-html5 app. Take chrome's debug tool as a example:
 
-![chrome's debug tool](http://gw.alicdn.com/mt/TB1V1hIMpXXXXaHXVXXXXXXXXXX-983-730.png)
+![chrome's debug tool](//gw.alicdn.com/mt/TB1V1hIMpXXXXaHXVXXXXXXXXXX-983-730.png)
 
 ## Elements
 
@@ -11,7 +10,7 @@ Use elements' panel to inspect the layout and design of the weex-html5 page, and
 
 ## Console
 
-You can use `console.log` to log infomation on console, but it's hightly recommended to use `nativeLog` instead, since nativeLog can run on a native platform besides on a browser. The defect of `nativeLog` is that it's not supported to trace it from the console to the source file which the `nativeLog` is called in, therefore in this situation you'd better use `console.log`, and you should make sure this code will not run on native platform (otherwise a exception or a crash will be caused).
+You can use `console.log` to log information on console, but it's highly recommended to use `nativeLog` instead, since nativeLog can run on a native platform based on a browser. The defect of `nativeLog` is that it's not supported to trace it from the console to the source file which the `nativeLog` is called in, therefore in this situation you'd better use `console.log`, and you should make sure this code will not run on native platform (otherwise a exception or a crash will be caused).
 
 ## Breakpoints
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/how-to/debug-with-native.md
----------------------------------------------------------------------
diff --git a/doc/how-to/debug-with-native.md b/doc/how-to/debug-with-native.md
deleted file mode 100644
index 9d6795e..0000000
--- a/doc/how-to/debug-with-native.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# How to debug with native platform ?
-
-TODO
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/how-to/maintain-your-component-code.md
----------------------------------------------------------------------
diff --git a/doc/how-to/maintain-your-component-code.md b/doc/how-to/maintain-your-component-code.md
deleted file mode 100644
index b8f3d16..0000000
--- a/doc/how-to/maintain-your-component-code.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# How to maintain your components' code ?
-
-TODO
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/how-to/manage-data-with-a-high-level-cms.md
----------------------------------------------------------------------
diff --git a/doc/how-to/manage-data-with-a-high-level-cms.md b/doc/how-to/manage-data-with-a-high-level-cms.md
deleted file mode 100644
index f599420..0000000
--- a/doc/how-to/manage-data-with-a-high-level-cms.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# How to manage data with a high level cms ?
-
-TODO

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/how-to/manage-your-file-structure.md
----------------------------------------------------------------------
diff --git a/doc/how-to/manage-your-file-structure.md b/doc/how-to/manage-your-file-structure.md
deleted file mode 100644
index fda39d1..0000000
--- a/doc/how-to/manage-your-file-structure.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# How to manage your file structure ?
-
-TODO

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/how-to/preview-in-browser.md
----------------------------------------------------------------------
diff --git a/doc/how-to/preview-in-browser.md b/doc/how-to/preview-in-browser.md
index a0a0da6..c5be651 100644
--- a/doc/how-to/preview-in-browser.md
+++ b/doc/how-to/preview-in-browser.md
@@ -1,5 +1,4 @@
 # How to preview weex code in browser ?
-<a href="https://github.com/weexteam/article/issues/43"  class="weex-translate">cn</a>
 
 
 ## weex-toolkit
@@ -28,5 +27,5 @@ weex xxx.we
 
 A browser window will be opened automatically to display the page you want to preview:
 
-![preview page](http://gtms02.alicdn.com/tps/i2/TB1y151LVXXXXXXaXXXoRYgWVXX-495-584.jpg)
+![preview page](//gtms02.alicdn.com/tps/i2/TB1y151LVXXXXXXaXXXoRYgWVXX-495-584.jpg)
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/how-to/preview-in-playground-app.md
----------------------------------------------------------------------
diff --git a/doc/how-to/preview-in-playground-app.md b/doc/how-to/preview-in-playground-app.md
index 066f1a3..b5e6420 100644
--- a/doc/how-to/preview-in-playground-app.md
+++ b/doc/how-to/preview-in-playground-app.md
@@ -1,14 +1,13 @@
 # How to preview weex code in sample-app ?
-<a href="https://github.com/weexteam/article/wiki/%E6%AC%A2%E8%BF%8E%E5%8F%82%E4%B8%8EWeex%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3%E7%BF%BB%E8%AF%91"  class="weex-translate incomplete">cn</a>
    
 ### Weex Sample Step By Step
 1. Clone Weex from github [`https://github.com/alibaba/weex/`](https://github.com/alibaba/weex/)
 2. Use Android Studio open Android Sample \u3002
 3. run Sample project.
 4. into Sample homePage\uff0cyou will see this picture  
-![preview page](http://gtms01.alicdn.com/tps/i1/TB10Ox2MpXXXXXKXpXXA0gJJXXX-720-1280.png)
+![preview page](//gtms01.alicdn.com/tps/i1/TB10Ox2MpXXXXXKXpXXA0gJJXXX-720-1280.png)
 5. Click the icon to the top right of the page to enter the two-dimensional code scanning  
-![](http://gtms04.alicdn.com/tps/i4/TB1Ph05MpXXXXcHXXXX2YSA3pXX-540-960.jpg)
+![](//gtms04.alicdn.com/tps/i4/TB1Ph05MpXXXXcHXXXX2YSA3pXX-540-960.jpg)
 6. use[`Weex-Toolkit`](https://github.com/alibaba/weex_toolchain/tree/master/toolkit/ )make .we to a     QR code 
 7. you will see the page rended by Weex  
-![](http://gtms03.alicdn.com/tps/i3/TB1ehVLMpXXXXa.XVXX2YSA3pXX-540-960.jpg)
+![](//gtms03.alicdn.com/tps/i3/TB1ehVLMpXXXXa.XVXX2YSA3pXX-540-960.jpg)

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/how-to/require-3rd-party-libs.md
----------------------------------------------------------------------
diff --git a/doc/how-to/require-3rd-party-libs.md b/doc/how-to/require-3rd-party-libs.md
index 1e2d522..0f5ac21 100644
--- a/doc/how-to/require-3rd-party-libs.md
+++ b/doc/how-to/require-3rd-party-libs.md
@@ -1,6 +1,5 @@
 # How to require 3rd Party Libs ?
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/wiki/%E6%AC%A2%E8%BF%8E%E5%8F%82%E4%B8%8EWeex%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3%E7%BF%BB%E8%AF%91"  class="weex-translate incomplete">cn</a>
 
 In the paragraph [Maintain Your Component Code](./maintain-your-component-code.md), we learn that JavaScript code can be written in `<script>` tag in one component. But there must be some common functions or modules in your project, such as parsing url params, extending properties from some objects to another object and so on. It's a bad practice to copy and paste them in each component, therefore there's a urgent need of `require`. Weex provides CommonJS `require` syntax for developers.
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/how-to/transform-code-into-js-bundle.md
----------------------------------------------------------------------
diff --git a/doc/how-to/transform-code-into-js-bundle.md b/doc/how-to/transform-code-into-js-bundle.md
index a32534c..4d398c5 100644
--- a/doc/how-to/transform-code-into-js-bundle.md
+++ b/doc/how-to/transform-code-into-js-bundle.md
@@ -1,6 +1,5 @@
 # Transform Code into Js Bundle
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/wiki/%E6%AC%A2%E8%BF%8E%E5%8F%82%E4%B8%8EWeex%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3%E7%BF%BB%E8%AF%91"  class="weex-translate incomplete">cn</a>
 
 Paragraphs [Maintain Your Component Code](./maintain-your-component-code.md) and [Require 3rd Party Libs](./require-3rd-party-libs.md) show us how to write and organize weex code. However, Weex DSL code must be transformed to `js bundle` so that `js framework` can parse and execute it for iOS, Android and HTML5 portal. For more information, please refer to [How It Works
 ](/advanced/how-it-works.md) and [JS Bundle Format](../specs/js-bundle-format.md).
@@ -27,7 +26,7 @@ $weex your_best_weex.we  -o . --watch
 ```
 $weex we/file/storage/path  -o outputpath
 ```
-every `we file` in `we/file/storage/path` we be transform to JS Bundle  , saved in `outputpath` path
+every `we file` in `we/file/storage/path` will be transformed to JS Bundle  , saved in `outputpath` path
 
 please access [npmjs.com](https://www.npmjs.com/package/weex-toolkit) for more information about weex-toolkit.
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/modules/animation.md
----------------------------------------------------------------------
diff --git a/doc/modules/animation.md b/doc/modules/animation.md
index bd414ff..130d962 100644
--- a/doc/modules/animation.md
+++ b/doc/modules/animation.md
@@ -1,6 +1,5 @@
 # animation
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/issues/64"  class="weex-translate">cn</a>
 
 ## Summary
 
@@ -15,16 +14,23 @@ A series of animation api.
 * `node`*(Node)*: An element that will be animated.
 * `options`*(object)*: Transition options. 
   * `styles`*(object)*: Specify the names and values of styles to which a transition effect should be applied.
-    * `color`*(string)*: the color of the element when the animaiton finished.
-    * `transform`*(object)*: transform fuction to be applied to the element. Following value is supported.
+    * `width`*(length)*: the the width of the view when the animation finished.
+    * `height`*(length)*: the the height  of the view when the animation finished.
+    * `color`*(string)*: the color of the element when the animation finished.
+    * `transform`*(object)*: transform function to be applied to the element. Following value is supported.
       * `translate/translateX/translateY`*(string)*: translate the element to the new location. The value can be a pixel or percent
       * `rotate`*(string)*: the unit is degree.
       * `scale`*(string)*: scale up or scale down the element.
   * `duration`*(number)*: Specify the number of milliseconds a transition animation should take to complete. By default, the value is 0ms, meaning that no animation will occur.
   * `timingFuncion`*(string)*: Used to describe how the intermediate values of the styles being affected by a transition effect are calculated. By default, the value is `linear`, and can also be one of `ease-in`, `ease-out`, `ease-in-out`, `linear` or `cubic-bezier(x1, y1, x2, y2)`.
+      * if`cubic-bezier(x1, y1, x2, y2)` is set, equation of  0<=x1<=x2<=1 must be met. 
   * `delay`*(number)*: Specify the amount of milliseconds to wait between a change being requested to a property that is to be transitioned and the start of the transition effect. By default, the value is 0ms.
 * **callback** Callback which is called after the completion of transition.
 
+#### Note
+
+Animations listed in transform is much faster than other animaions, as they are GPU accelerated. Developers should make their own choice according to their situation.
+
 #### Example
 
 ```html
@@ -43,7 +49,7 @@ A series of animation api.
         styles: {
           color: '#FF0000',
           transform: 'translate(1, 1)',
-          transform-origin: 'center center'
+          transformOrigin: 'center center'
         },
         duration: 0, //ms
         timingFunction: 'ease',

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/modules/clipboard.md
----------------------------------------------------------------------
diff --git a/doc/modules/clipboard.md b/doc/modules/clipboard.md
index 179b3e6..9d68489 100644
--- a/doc/modules/clipboard.md
+++ b/doc/modules/clipboard.md
@@ -1,6 +1,5 @@
 # clipboard
 <span class="weex-version">0.8 (developing)</span>
-<a href="https://github.com/weexteam/article/wiki/%E6%AC%A2%E8%BF%8E%E5%8F%82%E4%B8%8EWeex%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3%E7%BF%BB%E8%AF%91"  class="weex-translate incomplete">cn</a>
 
 ## Summary
 
@@ -34,7 +33,7 @@ clipboard.getString(function(ret) {
 
 ### setString(text)
 
-set the text into clipboard, as the same as copy manully. 
+set the text into clipboard, as the same as copy manually. 
 
 #### Arguments
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/modules/dom.md
----------------------------------------------------------------------
diff --git a/doc/modules/dom.md b/doc/modules/dom.md
index a9e8501..2e3ecf7 100644
--- a/doc/modules/dom.md
+++ b/doc/modules/dom.md
@@ -1,6 +1,5 @@
 # dom
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/issues/52"  class="weex-translate">cn</a>
 
 
 ## Summary

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/modules/globalevent.md
----------------------------------------------------------------------
diff --git a/doc/modules/globalevent.md b/doc/modules/globalevent.md
new file mode 100644
index 0000000..f1a8b33
--- /dev/null
+++ b/doc/modules/globalevent.md
@@ -0,0 +1,76 @@
+# globalEvent
+<span class="weex-version">0.8 (developing)</span>
+
+## Summary
+
+`globalEvent` are used to listen for persistent events, such as changes in positioning information, gyroscopes, and so on. A global event is a secondary API that requires additional APIs to work with.</br>
+You can register events via `addEventListener`, which can be removed by `removingEventListener` when you do not need to listen for `globalEvent`.
+
+*AUCTION* 
+- Only instance level is not application level . 
+
+## How to make your Module support global events
+API development is complete, when the event needs to be sent, the need through the following methods:
+```
+/**
+  * 
+  * @param eventName eventName
+  * @param params event params
+  */
+instance.fireGlobalEventCallback(eventName,params);
+```
+How to dispatch a global event in a weex-html5 component or module ? Just dispatch the event on the document element:
+```javascript
+var evt = new Event('some-type')
+evt.data = { foo: 'bar' }
+document.dispatchEvent(evt)
+```
+
+### Example
+
+#### Android
+```java
+Map<String,Object> params=new HashMap<>();
+params.put("key","value");
+mWXSDKInstance.fireGlobalEventCallback("geolocation",params);
+```
+#### iOS
+```Objective-C
+[weexInstance fireGlobalEvent:@"geolocation" params:@{@"key":@"value"}];
+```
+
+## API
+
+### addEventListener(String eventName, String callback)
+
+register global event.
+
+#### Arguments
+
+* `eventName`*(string)*: The name of the event you want to listen to.  
+* `callback`*(function)*: the callback function after executing this action.  
+
+#### Example
+
+```javascript
+var globalEvent = require('@weex-module/globalEvent');
+globalEvent.addEventListener("geolocation", function (e) {
+	console.log("get geolocation")
+	});
+```
+
+### removeEventListener(String eventName)
+
+remove global event 
+
+#### Arguments
+
+* `eventName`*(string)*: You no longer need to listen for event names.
+
+#### Example
+
+```javascript
+var globalEvent = require('@weex-module/globalEvent');
+globalEvent.removeEventListener("geolocation");
+```
+

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/modules/main.md
----------------------------------------------------------------------
diff --git a/doc/modules/main.md b/doc/modules/main.md
index 7f6899a..56c374c 100644
--- a/doc/modules/main.md
+++ b/doc/modules/main.md
@@ -1,6 +1,5 @@
 # Built-in Modules
 <span class="weex-version">0.5</span>
-<a href="https://github.com/weexteam/article/wiki/%E6%AC%A2%E8%BF%8E%E5%8F%82%E4%B8%8EWeex%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3%E7%BF%BB%E8%AF%91"  class="weex-translate incomplete">cn</a>
 
 ## How to use
 
@@ -11,4 +10,4 @@ var dom = require('@weex-module/dom');
 dom.scrollToElement(this.$el('someIdForElement'), {
     offset: 0
 });
-```
\ No newline at end of file
+```

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/modules/modal.md
----------------------------------------------------------------------
diff --git a/doc/modules/modal.md b/doc/modules/modal.md
index 53761b1..c1ff294 100644
--- a/doc/modules/modal.md
+++ b/doc/modules/modal.md
@@ -1,6 +1,5 @@
 # modal
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/wiki/%E6%AC%A2%E8%BF%8E%E5%8F%82%E4%B8%8EWeex%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3%E7%BF%BB%E8%AF%91"  class="weex-translate incomplete">cn</a>
 
 ## Summary
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/modules/navigator.md
----------------------------------------------------------------------
diff --git a/doc/modules/navigator.md b/doc/modules/navigator.md
index be73a29..8d919a2 100644
--- a/doc/modules/navigator.md
+++ b/doc/modules/navigator.md
@@ -1,6 +1,5 @@
 # navigator
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/wiki/%E6%AC%A2%E8%BF%8E%E5%8F%82%E4%B8%8EWeex%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3%E7%BF%BB%E8%AF%91"  class="weex-translate incomplete">cn</a>
 
 ## Summary
 
@@ -14,7 +13,7 @@ A series of navigator operation apis like `push`, `pop`.
 #### Arguments
 
 * `options`*(object)*: some options.
-  * `url`*(stirng)*: The URL of the weex page to push.
+  * `url`*(string)*: The URL of the weex page to push.
   * `animated`*(string)*:  `true`if the weex page is push through animation, otherwise, `false`.
 * `callback`*(object)*: the callback function after executing this action.  
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/modules/storage.md
----------------------------------------------------------------------
diff --git a/doc/modules/storage.md b/doc/modules/storage.md
index 8dfd57e..c82a981 100644
--- a/doc/modules/storage.md
+++ b/doc/modules/storage.md
@@ -1,6 +1,5 @@
 # storage
 <span class="weex-version">0.7</span>
-<a href="https://github.com/weexteam/article/wiki/%E6%AC%A2%E8%BF%8E%E5%8F%82%E4%B8%8EWeex%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3%E7%BF%BB%E8%AF%91"  class="weex-translate incomplete">cn</a>
 
 ## Summary
 
@@ -24,7 +23,7 @@ or update that key's value if it already exists.
 ```js
 var storage = require('@weex-module/storage');
 storage.setItem('bar', 'bar-value', function(e) {
-  // callback.'e' is an object that contains 'result' and 'data'. e.result indicate wether `setItem` is succeed.
+  // callback.'e' is an object that contains 'result' and 'data'. e.result indicate whether `setItem` is succeed.
   // e.data will return 'undefined' if success or 'invalid_param' if your key/value is ""/null.
 });
 ```

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/modules/stream.md
----------------------------------------------------------------------
diff --git a/doc/modules/stream.md b/doc/modules/stream.md
index 947bfa5..2dd1133 100644
--- a/doc/modules/stream.md
+++ b/doc/modules/stream.md
@@ -1,6 +1,5 @@
 # stream
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/issues/53"  class="weex-translate">cn</a>
 
 
 ## Summary
@@ -50,4 +49,4 @@ stream.fetch({
 });
 ```
   
-    
\ No newline at end of file
+    

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/modules/webview.md
----------------------------------------------------------------------
diff --git a/doc/modules/webview.md b/doc/modules/webview.md
index ecf6991..254ede0 100644
--- a/doc/modules/webview.md
+++ b/doc/modules/webview.md
@@ -1,6 +1,5 @@
 # webview
 <span class="weex-version">0.5</span>
-<a href="https://github.com/weexteam/article/wiki/%E6%AC%A2%E8%BF%8E%E5%8F%82%E4%B8%8EWeex%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3%E7%BF%BB%E8%AF%91"  class="weex-translate incomplete">cn</a>
 
 ## Summary
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/references/api.md
----------------------------------------------------------------------
diff --git a/doc/references/api.md b/doc/references/api.md
index f7f7341..f22aa5c 100644
--- a/doc/references/api.md
+++ b/doc/references/api.md
@@ -1,6 +1,5 @@
 # APIs
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/issues/30"  class="weex-translate">cn</a>
 
 You can access these apis through `this`(Vm) context in script methods.
 
@@ -70,8 +69,8 @@ Get the current global environment variables and configuration information.
     * `platform`*(string)*: the platform, one of `iOS`, `Android` and `Web`.
     * `osVersion`*(string)*: the version of os.
     * `deviceModel`*(string)*: the model of device. **native only**
-    * `deviceWidth`*(number)*: the width of device, default is `750`.
-    * `deviceHeight`*(number)*: the height of device.
+    * `deviceWidth`*(number)*: the width of device, in pixels.
+    * `deviceHeight`*(number)*: the height of device, in pixels.
 
 ## $call(module, method, ...args)
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/references/bootstrap.md
----------------------------------------------------------------------
diff --git a/doc/references/bootstrap.md b/doc/references/bootstrap.md
index ef03e0e..4958d03 100644
--- a/doc/references/bootstrap.md
+++ b/doc/references/bootstrap.md
@@ -1,6 +1,5 @@
 # Bootstrap
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/issues/29"  class="weex-translate">cn</a>
 
 Besides its default meaning, `<script>` tag supports two more configuration with its `type` property *in the top level component of a page*.
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/references/color-names.md
----------------------------------------------------------------------
diff --git a/doc/references/color-names.md b/doc/references/color-names.md
index 68a7514..324744c 100644
--- a/doc/references/color-names.md
+++ b/doc/references/color-names.md
@@ -1,5 +1,4 @@
 # List of the names of colors
-<a href="https://github.com/weexteam/article/issues/38"  class="weex-translate">cn</a>
 
 ### Basic color keywords:
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/references/common-attrs.md
----------------------------------------------------------------------
diff --git a/doc/references/common-attrs.md b/doc/references/common-attrs.md
index af1d2c2..c2f2163 100644
--- a/doc/references/common-attrs.md
+++ b/doc/references/common-attrs.md
@@ -1,6 +1,5 @@
 # Common Attribute
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/issues/13"  class="weex-translate">cn</a>
 
 All of weex tags share some common attributes
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/references/common-event.md
----------------------------------------------------------------------
diff --git a/doc/references/common-event.md b/doc/references/common-event.md
index 51dc80e..1414f7b 100644
--- a/doc/references/common-event.md
+++ b/doc/references/common-event.md
@@ -1,6 +1,5 @@
 # Common Events
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/issues/33"  class="weex-translate">cn</a>
 
 ## Click event
 



[08/50] [abbrv] incubator-weex git commit: Merge remote-tracking branch 'upstream/dev' into dev

Posted by ji...@apache.org.
Merge remote-tracking branch 'upstream/dev' 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/0e37541f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/0e37541f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/0e37541f

Branch: refs/heads/master
Commit: 0e37541f6227d01bb0bc09921f441f38a56432c1
Parents: 3b34f1d a9f433f
Author: acton393 <zh...@gmail.com>
Authored: Thu Feb 16 11:53:13 2017 +0800
Committer: acton393 <zh...@gmail.com>
Committed: Thu Feb 16 11:53:13 2017 +0800

----------------------------------------------------------------------
 .eslintignore                                   |   2 +
 .github/ISSUE_TEMPLATE.md                       |  30 +-
 .github/PULL_REQUEST_TEMPLATE.md                |  26 +-
 .gitignore                                      |   9 +-
 README.md                                       |  37 +-
 doc/.gitignore                                  |   5 -
 doc/INSTALL.md                                  |  38 -
 doc/LICENSE                                     | 202 ----
 doc/NOTICE                                      |   5 -
 doc/README.md                                   |   9 -
 doc/SUMMARY.md                                  |  95 --
 doc/_config.yml                                 | 323 +++++++
 doc/_layouts/header.html                        | 269 ------
 doc/_legacy/core-concepts/animation.md          |  34 -
 doc/_legacy/integrating.md                      |   3 -
 doc/_legacy/syntax/javascript.md                |  53 --
 doc/advanced/extend-to-android.md               | 160 ----
 doc/advanced/extend-to-html5.md                 | 252 -----
 doc/advanced/extend-to-ios.md                   | 262 ------
 doc/advanced/how-data-binding-works.md          |  32 -
 doc/advanced/how-it-works.md                    | 140 ---
 doc/advanced/integrate-to-android.md            | 197 ----
 doc/advanced/integrate-to-html5.md              |  70 --
 doc/advanced/integrate-to-ios.md                | 109 ---
 doc/advanced/main.md                            |   3 -
 doc/ali_addition/weex_doc.css                   | 146 ---
 doc/ali_addition/weex_doc.js                    |  78 --
 doc/book.json                                   |  19 -
 doc/components/a.md                             |  25 -
 doc/components/cell.md                          |  36 -
 doc/components/div.md                           |  42 -
 doc/components/image.md                         |  49 -
 doc/components/indicator.md                     |  92 --
 doc/components/input.md                         |  79 --
 doc/components/list.md                          |  57 --
 doc/components/main.md                          |   3 -
 doc/components/refresh-loading.md               |  27 -
 doc/components/scroller.md                      |  70 --
 doc/components/slider.md                        |  65 --
 doc/components/special-element.md               |  29 -
 doc/components/switch.md                        |  55 --
 doc/components/text.md                          |  60 --
 doc/components/textarea.md                      |  74 --
 doc/components/video.md                         |  49 -
 doc/components/web.md                           |  49 -
 doc/components/wxc-navpage.md                   |  68 --
 doc/components/wxc-tabbar.md                    |  91 --
 doc/demo/animation.md                           |  10 -
 doc/demo/clipboard.md                           |   9 -
 doc/demo/hello-world.md                         |  16 -
 doc/demo/list.md                                |   9 -
 doc/demo/main.md                                |   3 -
 doc/demo/modal.md                               |   9 -
 doc/demo/slider.md                              |   9 -
 doc/faq.md                                      | 127 ---
 doc/guide.md                                    |   3 -
 doc/how-to/customize-a-native-component.md      |  49 -
 doc/how-to/cuszomize-native-apis.md             |  73 --
 doc/how-to/debug-with-html5.md                  |  40 -
 doc/how-to/debug-with-remote-tools.md           |  34 -
 doc/how-to/main.md                              |   3 -
 doc/how-to/preview-in-browser.md                |  31 -
 doc/how-to/preview-in-playground-app.md         |  13 -
 doc/how-to/require-3rd-party-libs.md            |  50 -
 doc/how-to/transform-code-into-js-bundle.md     |  98 --
 doc/images/css-boxmodel.png                     | Bin 12581 -> 0 bytes
 doc/images/css-flexbox-align.jpg                | Bin 35005 -> 0 bytes
 doc/images/css-flexbox-justify.svg              |  59 --
 doc/images/css-flexbox-sample.png               | Bin 3210 -> 0 bytes
 doc/images/how-arch.png                         | Bin 62303 -> 0 bytes
 doc/images/how-render.png                       | Bin 42957 -> 0 bytes
 doc/images/snapshot-animation.gif               | Bin 521431 -> 0 bytes
 doc/images/snapshot-calculator.jpg              | Bin 28504 -> 0 bytes
 doc/images/snapshot-helloworld.png              | Bin 6092 -> 0 bytes
 doc/images/snapshot-minesweeper.jpg             | Bin 53257 -> 0 bytes
 doc/images/snapshot-modals.jpg                  | Bin 27458 -> 0 bytes
 doc/images/snapshot-skeletons.gif               | Bin 518271 -> 0 bytes
 doc/images/tut-cli-qrcode.png                   | Bin 45480 -> 0 bytes
 doc/images/tut-first.png                        | Bin 51434 -> 0 bytes
 doc/images/tut-second.png                       | Bin 78519 -> 0 bytes
 doc/images/tut1.jpg                             | Bin 47442 -> 0 bytes
 doc/images/tut2.jpg                             | Bin 52428 -> 0 bytes
 doc/images/tut3.png                             | Bin 52198 -> 0 bytes
 doc/images/tut4.gif                             | Bin 218245 -> 0 bytes
 doc/modules/animation.md                        |  64 --
 doc/modules/clipboard.md                        |  48 -
 doc/modules/dom.md                              | 109 ---
 doc/modules/globalevent.md                      |  76 --
 doc/modules/main.md                             |  13 -
 doc/modules/modal.md                            | 114 ---
 doc/modules/navigator.md                        |  52 --
 doc/modules/storage.md                          | 104 ---
 doc/modules/stream.md                           |  52 --
 doc/modules/timer.md                            |  66 --
 doc/modules/webview.md                          |  62 --
 doc/package.json                                |  24 +
 doc/references/api.md                           |  78 --
 doc/references/bootstrap.md                     |  41 -
 doc/references/cheatsheet.md                    | 102 --
 doc/references/color-names.md                   | 175 ----
 doc/references/common-attrs.md                  |  80 --
 doc/references/common-event.md                  | 121 ---
 doc/references/common-style.md                  | 202 ----
 doc/references/component-defs.md                | 125 ---
 doc/references/events/appear.md                 |  28 -
 doc/references/events/blur.md                   |  42 -
 doc/references/events/change.md                 |  47 -
 doc/references/events/click.md                  |  43 -
 doc/references/events/disappear.md              |  28 -
 doc/references/events/focus.md                  |  42 -
 doc/references/events/input.md                  |  45 -
 doc/references/gesture.md                       |  66 --
 doc/references/main.md                          |   3 -
 doc/references/replace.md                       |  57 --
 doc/references/styles/background-color.md       |  25 -
 doc/references/styles/color.md                  |  26 -
 doc/references/styles/font-family.md            |  27 -
 doc/references/styles/font-size.md              |  31 -
 doc/references/styles/font-style.md             |  25 -
 doc/references/styles/font-weight.md            |  26 -
 doc/references/styles/line-height.md            |  27 -
 doc/references/styles/lines.md                  |  27 -
 doc/references/styles/main.md                   |  42 -
 doc/references/styles/opacity.md                |  22 -
 doc/references/styles/position.md               |  26 -
 doc/references/styles/text-align.md             |  26 -
 doc/references/styles/text-decoration.md        |  26 -
 doc/references/styles/text-overflow.md          |  32 -
 doc/references/styles/units/color.md            |  30 -
 doc/references/styles/units/length.md           |  12 -
 doc/references/styles/units/number.md           |   7 -
 doc/references/styles/units/percentage.md       |   5 -
 doc/references/text-style.md                    |  36 -
 doc/scaffolds/draft.md                          |   4 +
 doc/scaffolds/page.md                           |   4 +
 doc/scaffolds/post.md                           |   5 +
 doc/source/_posts/cn/hello.md                   |   6 +
 doc/source/_posts/hello_world.md                |   6 +
 doc/source/blog/index.md                        |   4 +
 doc/source/cn/blog/index.md                     |   4 +
 doc/source/cn/download.ejs                      |   3 +
 doc/source/cn/faq.md                            | 227 +++++
 doc/source/cn/guide/.gitkeep                    |   0
 doc/source/cn/guide/dev-with-weexpack.md        |  11 +
 doc/source/cn/guide/images/flow.png             | Bin 0 -> 57741 bytes
 doc/source/cn/guide/images/tut-cli-qrcode.png   | Bin 0 -> 45480 bytes
 doc/source/cn/guide/images/tut-first.png        | Bin 0 -> 51434 bytes
 doc/source/cn/guide/images/tut-second.png       | Bin 0 -> 78519 bytes
 doc/source/cn/guide/images/tut1.jpg             | Bin 0 -> 47442 bytes
 doc/source/cn/guide/images/tut2.jpg             | Bin 0 -> 52428 bytes
 doc/source/cn/guide/images/tut3.png             | Bin 0 -> 52198 bytes
 doc/source/cn/guide/images/tut4.gif             | Bin 0 -> 218245 bytes
 doc/source/cn/guide/index.md                    | 125 +++
 doc/source/cn/guide/integrate-to-your-app.md    | 321 +++++++
 doc/source/cn/guide/intro/app-architecture.md   |  77 ++
 doc/source/cn/guide/intro/how-it-works.md       |  66 ++
 doc/source/cn/guide/intro/index.md              |  15 +
 doc/source/cn/guide/intro/page-architecture.md  |  48 +
 doc/source/cn/guide/intro/using-vue.md          | 101 ++
 doc/source/cn/guide/intro/web-dev-experience.md |  42 +
 doc/source/cn/guide/intro/write-once.md         |  25 +
 doc/source/cn/index.md                          |   4 +
 doc/source/cn/playground.ejs                    |   3 +
 .../cn/references/advanced/extend-jsfm.md       | 172 ++++
 .../cn/references/advanced/extend-to-android.md | 144 +++
 .../cn/references/advanced/extend-to-html5.md   | 103 +++
 .../cn/references/advanced/extend-to-ios.md     | 235 +++++
 doc/source/cn/references/advanced/index.md      |  15 +
 .../advanced/integrate-devtool-to-android.md    | 271 ++++++
 .../advanced/integrate-devtool-to-ios.md        | 229 +++++
 doc/source/cn/references/android-apis.md        | 214 +++++
 doc/source/cn/references/color-names.md         | 180 ++++
 doc/source/cn/references/common-event.md        | 138 +++
 doc/source/cn/references/common-style.md        | 312 +++++++
 doc/source/cn/references/components/a.md        | 104 +++
 doc/source/cn/references/components/cell.md     | 105 +++
 doc/source/cn/references/components/div.md      | 116 +++
 doc/source/cn/references/components/image.md    | 159 ++++
 doc/source/cn/references/components/index.md    |  24 +
 .../cn/references/components/indicator.md       | 135 +++
 doc/source/cn/references/components/input.md    | 172 ++++
 doc/source/cn/references/components/list.md     | 158 ++++
 doc/source/cn/references/components/loading.md  | 125 +++
 doc/source/cn/references/components/refresh.md  | 125 +++
 doc/source/cn/references/components/scroller.md | 174 ++++
 doc/source/cn/references/components/slider.md   | 105 +++
 doc/source/cn/references/components/switch.md   | 133 +++
 doc/source/cn/references/components/text.md     | 101 ++
 doc/source/cn/references/components/textarea.md | 155 ++++
 doc/source/cn/references/components/video.md    |  94 ++
 doc/source/cn/references/components/web.md      | 154 ++++
 doc/source/cn/references/gesture.md             |  59 ++
 doc/source/cn/references/html5-apis.md          |  10 +
 doc/source/cn/references/images/Artboard.jpg    | Bin 0 -> 36223 bytes
 .../cn/references/images/coding_weex_1.jpg      | Bin 0 -> 56225 bytes
 .../cn/references/images/css-boxmodel.png       | Bin 0 -> 12581 bytes
 .../cn/references/images/css-flexbox-align.jpg  | Bin 0 -> 35005 bytes
 .../references/images/css-flexbox-justify.svg   |  59 ++
 .../cn/references/images/css-flexbox-sample.png | Bin 0 -> 3210 bytes
 doc/source/cn/references/images/div_1.jpg       | Bin 0 -> 59561 bytes
 doc/source/cn/references/images/div_2.jpg       | Bin 0 -> 62574 bytes
 doc/source/cn/references/images/div_3.jpg       | Bin 0 -> 82345 bytes
 doc/source/cn/references/images/div_4.jpg       | Bin 0 -> 200642 bytes
 doc/source/cn/references/images/image_1.jpg     | Bin 0 -> 163705 bytes
 doc/source/cn/references/images/image_2.jpg     | Bin 0 -> 255560 bytes
 doc/source/cn/references/images/list_2.jpg      | Bin 0 -> 56635 bytes
 doc/source/cn/references/images/list_3.jpg      | Bin 0 -> 128082 bytes
 doc/source/cn/references/images/list_4.jpg      | Bin 0 -> 339799 bytes
 doc/source/cn/references/images/nav.jpg         | Bin 0 -> 124441 bytes
 doc/source/cn/references/images/nav.png         | Bin 0 -> 83497 bytes
 doc/source/cn/references/images/scroller_1.jpg  | Bin 0 -> 344783 bytes
 doc/source/cn/references/images/style_1.jpg     | Bin 0 -> 59366 bytes
 doc/source/cn/references/images/style_2.jpg     | Bin 0 -> 59696 bytes
 doc/source/cn/references/index.md               |  17 +
 doc/source/cn/references/ios-apis.md            |  91 ++
 doc/source/cn/references/jsfm-apis.md           |  66 ++
 .../cn/references/migration/difference.md       | 249 +++++
 doc/source/cn/references/migration/index.md     |  11 +
 .../references/migration/migration-from-weex.md | 116 +++
 doc/source/cn/references/modules/animation.md   |  96 ++
 doc/source/cn/references/modules/clipboard.md   | 101 ++
 doc/source/cn/references/modules/dom.md         | 210 +++++
 doc/source/cn/references/modules/globalevent.md |  88 ++
 doc/source/cn/references/modules/index.md       |  30 +
 doc/source/cn/references/modules/modal.md       | 139 +++
 doc/source/cn/references/modules/navigator.md   |  90 ++
 doc/source/cn/references/modules/picker.md      | 129 +++
 doc/source/cn/references/modules/storage.md     | 184 ++++
 doc/source/cn/references/modules/stream.md      | 124 +++
 doc/source/cn/references/modules/webview.md     | 137 +++
 doc/source/cn/references/native-dom-api.md      | 223 +++++
 doc/source/cn/references/path.md                |  37 +
 doc/source/cn/references/platform-difference.md |  70 ++
 doc/source/cn/references/text-style.md          |  46 +
 doc/source/cn/references/unit.md                |  64 ++
 .../cn/references/vue/difference-of-vuex.md     |  87 ++
 .../cn/references/vue/difference-with-web.md    | 138 +++
 doc/source/cn/references/vue/index.md           |  12 +
 doc/source/cn/references/web-standards.md       | 584 ++++++++++++
 doc/source/cn/references/weex-variable.md       |  47 +
 .../cn/v-0.10/advanced/create-a-weex-project.md | 271 ++++++
 .../advanced/customize-a-native-component.md    | 168 ++++
 .../cn/v-0.10/advanced/cuszomize-native-apis.md |  85 ++
 .../cn/v-0.10/advanced/extend-to-android.md     | 145 +++
 .../cn/v-0.10/advanced/extend-to-html5.md       | 253 +++++
 doc/source/cn/v-0.10/advanced/extend-to-ios.md  | 129 +++
 .../v-0.10/advanced/how-data-binding-works.md   |  39 +
 .../cn/v-0.10/advanced/images/how-arch.png      | Bin 0 -> 62303 bytes
 .../cn/v-0.10/advanced/images/how-render.png    | Bin 0 -> 42957 bytes
 doc/source/cn/v-0.10/advanced/index.md          | 146 +++
 .../advanced/integrate-devtools-to-android.md   | 272 ++++++
 .../advanced/integrate-devtools-to-ios.md       | 230 +++++
 .../cn/v-0.10/advanced/integrate-to-android.md  | 201 ++++
 .../cn/v-0.10/advanced/integrate-to-html5.md    |  69 ++
 .../cn/v-0.10/advanced/integrate-to-ios.md      | 110 +++
 doc/source/cn/v-0.10/blog/index.md              |   4 +
 .../guide/develop-on-your-local-machine.md      | 175 ++++
 .../cn/v-0.10/guide/how-to/debug-with-html5.md  |  47 +
 doc/source/cn/v-0.10/guide/how-to/index.md      | 185 ++++
 .../guide/how-to/require-3rd-party-libs.md      |  57 ++
 .../how-to/transform-code-into-js-bundle.md     | 112 +++
 doc/source/cn/v-0.10/guide/index.md             |  60 ++
 doc/source/cn/v-0.10/guide/syntax/comm.md       | 134 +++
 .../v-0.10/guide/syntax/composed-component.md   | 158 ++++
 .../cn/v-0.10/guide/syntax/config-n-data.md     |  72 ++
 .../cn/v-0.10/guide/syntax/data-binding.md      | 332 +++++++
 .../cn/v-0.10/guide/syntax/display-logic.md     | 252 +++++
 doc/source/cn/v-0.10/guide/syntax/events.md     | 103 +++
 doc/source/cn/v-0.10/guide/syntax/id.md         | 124 +++
 doc/source/cn/v-0.10/guide/syntax/index.md      | 134 +++
 .../cn/v-0.10/guide/syntax/render-logic.md      |  44 +
 .../cn/v-0.10/guide/syntax/style-n-class.md     | 117 +++
 doc/source/cn/v-0.10/index.md                   |   5 +
 doc/source/cn/v-0.10/references/api.md          |  67 ++
 doc/source/cn/v-0.10/references/cheatsheet.md   | 114 +++
 doc/source/cn/v-0.10/references/color-names.md  | 180 ++++
 doc/source/cn/v-0.10/references/common-attrs.md | 166 ++++
 doc/source/cn/v-0.10/references/common-event.md | 492 ++++++++++
 doc/source/cn/v-0.10/references/common-style.md | 322 +++++++
 .../cn/v-0.10/references/component-defs.md      | 126 +++
 doc/source/cn/v-0.10/references/components/a.md | 273 ++++++
 .../cn/v-0.10/references/components/cell.md     | 191 ++++
 .../cn/v-0.10/references/components/div.md      | 245 +++++
 .../cn/v-0.10/references/components/image.md    | 161 ++++
 .../cn/v-0.10/references/components/index.md    |  24 +
 .../v-0.10/references/components/indicator.md   | 124 +++
 .../cn/v-0.10/references/components/input.md    | 143 +++
 .../cn/v-0.10/references/components/list.md     | 375 ++++++++
 .../cn/v-0.10/references/components/loading.md  | 118 +++
 .../cn/v-0.10/references/components/refresh.md  | 204 ++++
 .../cn/v-0.10/references/components/scroller.md | 324 +++++++
 .../cn/v-0.10/references/components/slider.md   | 121 +++
 .../cn/v-0.10/references/components/switch.md   |  98 ++
 .../cn/v-0.10/references/components/text.md     | 116 +++
 .../cn/v-0.10/references/components/textarea.md | 115 +++
 .../cn/v-0.10/references/components/video.md    |  82 ++
 .../cn/v-0.10/references/components/web.md      | 143 +++
 doc/source/cn/v-0.10/references/gesture.md      |  79 ++
 .../cn/v-0.10/references/images/Artboard.jpg    | Bin 0 -> 36223 bytes
 .../v-0.10/references/images/coding_weex_1.jpg  | Bin 0 -> 56225 bytes
 .../v-0.10/references/images/css-boxmodel.png   | Bin 0 -> 12581 bytes
 .../references/images/css-flexbox-align.jpg     | Bin 0 -> 35005 bytes
 .../references/images/css-flexbox-justify.svg   |  59 ++
 .../cn/v-0.10/references/images/div_1.jpg       | Bin 0 -> 59561 bytes
 .../cn/v-0.10/references/images/div_2.jpg       | Bin 0 -> 62574 bytes
 .../cn/v-0.10/references/images/div_3.jpg       | Bin 0 -> 82345 bytes
 .../cn/v-0.10/references/images/div_4.jpg       | Bin 0 -> 200642 bytes
 .../cn/v-0.10/references/images/image_1.jpg     | Bin 0 -> 163705 bytes
 .../cn/v-0.10/references/images/image_2.jpg     | Bin 0 -> 255560 bytes
 .../cn/v-0.10/references/images/list_2.jpg      | Bin 0 -> 56635 bytes
 .../cn/v-0.10/references/images/list_3.jpg      | Bin 0 -> 128082 bytes
 .../cn/v-0.10/references/images/list_4.jpg      | Bin 0 -> 339799 bytes
 doc/source/cn/v-0.10/references/images/nav.jpg  | Bin 0 -> 124441 bytes
 .../cn/v-0.10/references/images/scroller_1.jpg  | Bin 0 -> 344783 bytes
 .../cn/v-0.10/references/images/style_1.jpg     | Bin 0 -> 59366 bytes
 .../cn/v-0.10/references/images/style_2.jpg     | Bin 0 -> 59696 bytes
 doc/source/cn/v-0.10/references/index.md        |  46 +
 .../cn/v-0.10/references/modules/animation.md   |  90 ++
 .../cn/v-0.10/references/modules/clipboard.md   | 112 +++
 doc/source/cn/v-0.10/references/modules/dom.md  |  79 ++
 .../cn/v-0.10/references/modules/globalevent.md |  87 ++
 .../cn/v-0.10/references/modules/index.md       |  20 +
 .../cn/v-0.10/references/modules/modal.md       | 196 ++++
 .../cn/v-0.10/references/modules/navigator.md   | 110 +++
 .../cn/v-0.10/references/modules/storage.md     | 224 +++++
 .../cn/v-0.10/references/modules/stream.md      | 220 +++++
 .../cn/v-0.10/references/modules/webview.md     |  66 ++
 doc/source/cn/v-0.10/references/replace.md      |  57 ++
 .../cn/v-0.10/references/special-element.md     |  38 +
 doc/source/cn/v-0.10/references/specs/index.md  | 309 +++++++
 .../references/specs/js-framework-apis.md       | 190 ++++
 .../v-0.10/references/specs/virtual-dom-apis.md | 148 +++
 doc/source/cn/v-0.10/references/text-style.md   |  40 +
 doc/source/cn/v-0.10/references/units.md        |  66 ++
 doc/source/cn/v-0.10/references/wxc/index.md    |  44 +
 .../cn/v-0.10/references/wxc/wxc-navpage.md     | 192 ++++
 .../cn/v-0.10/references/wxc/wxc-tabbar.md      | 176 ++++
 doc/source/cn/v-0.10/tools/devtools-android.md  | 123 +++
 doc/source/cn/v-0.10/tools/devtools-ios.md      |  65 ++
 doc/source/cn/v-0.10/tools/devtools.md          |  99 ++
 doc/source/cn/v-0.10/tools/index.md             |  96 ++
 doc/source/cn/v-0.10/tools/playground.md        |  22 +
 doc/source/cn/v-0.10/tools/transformer.md       |  38 +
 doc/source/download.ejs                         |   3 +
 doc/source/examples/a.md                        |  39 +
 doc/source/examples/animation.md                |  47 +
 doc/source/examples/clipboard.md                |  64 ++
 doc/source/examples/div.md                      |  27 +
 doc/source/examples/dom-rect.md                 |  67 ++
 doc/source/examples/dom-scroll.md               |  93 ++
 doc/source/examples/image.md                    |  58 ++
 doc/source/examples/indicator.md                |  80 ++
 doc/source/examples/input.md                    |  68 ++
 doc/source/examples/list.md                     |  64 ++
 doc/source/examples/modal.md                    |  81 ++
 doc/source/examples/navigator.md                |  54 ++
 doc/source/examples/refresh.md                  |  74 ++
 doc/source/examples/scroller.md                 |  92 ++
 doc/source/examples/slider.md                   |  53 ++
 doc/source/examples/storage.md                  | 103 +++
 doc/source/examples/stream.md                   |  74 ++
 doc/source/examples/switch.md                   |  69 ++
 doc/source/examples/text.md                     |  44 +
 doc/source/examples/textarea.md                 |  68 ++
 doc/source/examples/video.md                    |  55 ++
 doc/source/examples/web.md                      |  97 ++
 doc/source/faq.md                               | 210 +++++
 doc/source/guide/.gitkeep                       |   0
 doc/source/guide/dev-with-weexpack.md           |  12 +
 doc/source/guide/images/flow.png                | Bin 0 -> 57741 bytes
 doc/source/guide/images/tut-cli-qrcode.png      | Bin 0 -> 45480 bytes
 doc/source/guide/images/tut-first.png           | Bin 0 -> 51434 bytes
 doc/source/guide/images/tut-second.png          | Bin 0 -> 78519 bytes
 doc/source/guide/images/tut1.jpg                | Bin 0 -> 47442 bytes
 doc/source/guide/images/tut2.jpg                | Bin 0 -> 52428 bytes
 doc/source/guide/images/tut3.png                | Bin 0 -> 52198 bytes
 doc/source/guide/images/tut4.gif                | Bin 0 -> 218245 bytes
 doc/source/guide/index.md                       |  11 +
 doc/source/guide/integrate-to-your-app.md       |  11 +
 doc/source/guide/intro/app-architecture.md      |  10 +
 doc/source/guide/intro/how-it-works.md          |  12 +
 doc/source/guide/intro/index.md                 |  17 +
 doc/source/guide/intro/page-architecture.md     |  10 +
 doc/source/guide/intro/using-vue.md             |  10 +
 doc/source/guide/intro/web-dev-experience.md    |  11 +
 doc/source/guide/intro/write-once.md            |  10 +
 doc/source/index.md                             |   4 +
 doc/source/playground.ejs                       |   3 +
 doc/source/references/advanced/extend-jsfm.md   |  10 +
 .../references/advanced/extend-to-android.md    | 160 ++++
 .../references/advanced/extend-to-html5.md      |  10 +
 doc/source/references/advanced/extend-to-ios.md | 262 ++++++
 doc/source/references/advanced/index.md         |  15 +
 .../advanced/integrate-devtool-to-android.md    |  11 +
 .../advanced/integrate-devtool-to-ios.md        |  10 +
 doc/source/references/android-apis.md           |  10 +
 doc/source/references/color-names.md            | 182 ++++
 doc/source/references/common-event.md           | 129 +++
 doc/source/references/common-style.md           | 208 +++++
 doc/source/references/components/a.md           |  71 ++
 doc/source/references/components/cell.md        |  42 +
 doc/source/references/components/div.md         |  64 ++
 doc/source/references/components/image.md       | 106 +++
 doc/source/references/components/index.md       |  24 +
 doc/source/references/components/indicator.md   | 121 +++
 doc/source/references/components/input.md       | 149 +++
 doc/source/references/components/list.md        | 175 ++++
 doc/source/references/components/refresh.md     | 216 +++++
 doc/source/references/components/scroller.md    | 152 +++
 doc/source/references/components/slider.md      |  93 ++
 doc/source/references/components/switch.md      | 117 +++
 doc/source/references/components/text.md        |  98 ++
 doc/source/references/components/textarea.md    | 135 +++
 doc/source/references/components/video.md       |  89 ++
 doc/source/references/components/web.md         | 149 +++
 doc/source/references/gesture.md                |  53 ++
 doc/source/references/html5-apis.md             |  10 +
 doc/source/references/images/css-boxmodel.png   | Bin 0 -> 12581 bytes
 .../references/images/css-flexbox-align.jpg     | Bin 0 -> 35005 bytes
 .../references/images/css-flexbox-justify.svg   |  59 ++
 .../references/images/css-flexbox-sample.png    | Bin 0 -> 3210 bytes
 doc/source/references/images/nav.png            | Bin 0 -> 83497 bytes
 doc/source/references/index.md                  |  17 +
 doc/source/references/ios-apis.md               |  12 +
 doc/source/references/jsfm-apis.md              |  66 ++
 doc/source/references/migration/difference.md   |  10 +
 doc/source/references/migration/index.md        |  11 +
 .../references/migration/migration-from-weex.md |  10 +
 doc/source/references/modules/animation.md      | 106 +++
 doc/source/references/modules/clipboard.md      |  98 ++
 doc/source/references/modules/dom.md            | 204 ++++
 doc/source/references/modules/globalevent.md    |  89 ++
 doc/source/references/modules/index.md          |  29 +
 doc/source/references/modules/modal.md          | 144 +++
 doc/source/references/modules/navigator.md      |  89 ++
 doc/source/references/modules/picker.md         | 129 +++
 doc/source/references/modules/storage.md        | 172 ++++
 doc/source/references/modules/stream.md         | 131 +++
 doc/source/references/modules/webview.md        | 155 ++++
 doc/source/references/native-dom-api.md         |  11 +
 doc/source/references/path.md                   |  37 +
 doc/source/references/text-style.md             |  50 +
 doc/source/references/unit.md                   |  11 +
 doc/source/references/vue/difference-of-vuex.md |  10 +
 .../references/vue/difference-with-web.md       |  10 +
 doc/source/references/vue/index.md              |  11 +
 doc/source/references/web-standards.md          | 584 ++++++++++++
 doc/source/references/weex-variable.md          |  10 +
 doc/source/v-0.10/advanced/extend-to-android.md | 162 ++++
 doc/source/v-0.10/advanced/extend-to-html5.md   | 258 ++++++
 doc/source/v-0.10/advanced/extend-to-ios.md     | 272 ++++++
 .../v-0.10/advanced/how-data-binding-works.md   |  39 +
 doc/source/v-0.10/advanced/images/how-arch.png  | Bin 0 -> 62303 bytes
 .../v-0.10/advanced/images/how-render.png       | Bin 0 -> 42957 bytes
 doc/source/v-0.10/advanced/index.md             | 148 +++
 .../v-0.10/advanced/integrate-to-android.md     | 204 ++++
 .../v-0.10/advanced/integrate-to-html5.md       |  77 ++
 doc/source/v-0.10/advanced/integrate-to-ios.md  | 118 +++
 doc/source/v-0.10/guide/.gitkeep                |   0
 .../how-to/customize-a-native-component.md      |  58 ++
 .../guide/how-to/cuszomize-native-apis.md       |  80 ++
 .../v-0.10/guide/how-to/debug-with-html5.md     |  47 +
 doc/source/v-0.10/guide/how-to/index.md         |  40 +
 .../guide/how-to/preview-in-playground-app.md   |  20 +
 .../guide/how-to/require-3rd-party-libs.md      |  56 ++
 .../how-to/transform-code-into-js-bundle.md     | 110 +++
 .../v-0.10/guide/images/tut-cli-qrcode.png      | Bin 0 -> 45480 bytes
 doc/source/v-0.10/guide/images/tut-first.png    | Bin 0 -> 51434 bytes
 doc/source/v-0.10/guide/images/tut-second.png   | Bin 0 -> 78519 bytes
 doc/source/v-0.10/guide/images/tut1.jpg         | Bin 0 -> 47442 bytes
 doc/source/v-0.10/guide/images/tut2.jpg         | Bin 0 -> 52428 bytes
 doc/source/v-0.10/guide/images/tut3.png         | Bin 0 -> 52198 bytes
 doc/source/v-0.10/guide/images/tut4.gif         | Bin 0 -> 218245 bytes
 doc/source/v-0.10/guide/index.md                | 211 +++++
 doc/source/v-0.10/guide/syntax/comm.md          | 228 +++++
 .../v-0.10/guide/syntax/composed-component.md   | 114 +++
 doc/source/v-0.10/guide/syntax/config-n-data.md |  61 ++
 doc/source/v-0.10/guide/syntax/data-binding.md  | 248 +++++
 doc/source/v-0.10/guide/syntax/display-logic.md | 173 ++++
 doc/source/v-0.10/guide/syntax/events.md        |  59 ++
 doc/source/v-0.10/guide/syntax/id.md            |  65 ++
 doc/source/v-0.10/guide/syntax/index.md         | 122 +++
 doc/source/v-0.10/guide/syntax/render-logic.md  |  35 +
 doc/source/v-0.10/guide/syntax/style-n-class.md | 118 +++
 doc/source/v-0.10/references/api.md             |  84 ++
 doc/source/v-0.10/references/cheatsheet.md      | 102 ++
 doc/source/v-0.10/references/color-names.md     | 182 ++++
 doc/source/v-0.10/references/common-attrs.md    |  78 ++
 doc/source/v-0.10/references/common-event.md    | 120 +++
 doc/source/v-0.10/references/common-style.md    | 208 +++++
 doc/source/v-0.10/references/component-defs.md  | 131 +++
 doc/source/v-0.10/references/components/a.md    |  50 +
 doc/source/v-0.10/references/components/cell.md |  42 +
 doc/source/v-0.10/references/components/div.md  |  48 +
 .../v-0.10/references/components/image.md       |  55 ++
 .../v-0.10/references/components/index.md       |  24 +
 .../v-0.10/references/components/indicator.md   |  98 ++
 .../v-0.10/references/components/input.md       | 124 +++
 doc/source/v-0.10/references/components/list.md | 293 ++++++
 .../references/components/refresh-loading.md    | 298 ++++++
 .../v-0.10/references/components/scroller.md    | 136 +++
 .../v-0.10/references/components/slider.md      | 107 +++
 .../v-0.10/references/components/switch.md      |  81 ++
 doc/source/v-0.10/references/components/text.md |  94 ++
 .../v-0.10/references/components/textarea.md    |  81 ++
 .../v-0.10/references/components/video.md       |  75 ++
 doc/source/v-0.10/references/components/web.md  | 152 +++
 .../v-0.10/references/components/wxc-navpage.md |  74 ++
 .../v-0.10/references/components/wxc-tabbar.md  |  94 ++
 doc/source/v-0.10/references/gesture.md         |  74 ++
 .../v-0.10/references/images/css-boxmodel.png   | Bin 0 -> 12581 bytes
 .../references/images/css-flexbox-align.jpg     | Bin 0 -> 35005 bytes
 .../references/images/css-flexbox-justify.svg   |  59 ++
 .../references/images/css-flexbox-sample.png    | Bin 0 -> 3210 bytes
 doc/source/v-0.10/references/images/nav.png     | Bin 0 -> 83497 bytes
 doc/source/v-0.10/references/index.md           |  49 +
 .../v-0.10/references/modules/animation.md      |  63 ++
 .../v-0.10/references/modules/clipboard.md      |  53 ++
 doc/source/v-0.10/references/modules/dom.md     | 114 +++
 .../v-0.10/references/modules/globalevent.md    |  89 ++
 doc/source/v-0.10/references/modules/index.md   |  28 +
 doc/source/v-0.10/references/modules/modal.md   | 192 ++++
 .../v-0.10/references/modules/navigator.md      | 198 ++++
 doc/source/v-0.10/references/modules/storage.md | 111 +++
 doc/source/v-0.10/references/modules/stream.md  |  86 ++
 doc/source/v-0.10/references/modules/timer.md   |  60 ++
 doc/source/v-0.10/references/modules/webview.md | 160 ++++
 doc/source/v-0.10/references/special-element.md |  36 +
 doc/source/v-0.10/references/specs/index.md     | 309 +++++++
 .../v-0.10/references/specs/js-bundle-format.md | 307 ++++++
 .../references/specs/js-framework-apis.md       | 191 ++++
 .../v-0.10/references/specs/virtual-dom-apis.md | 147 +++
 doc/source/v-0.10/references/text-style.md      |  43 +
 doc/source/v-0.10/tools/devtools-android.md     | 123 +++
 doc/source/v-0.10/tools/devtools-ios.md         |  76 ++
 doc/source/v-0.10/tools/devtools.md             | 102 ++
 doc/source/v-0.10/tools/index.md                |  97 ++
 doc/source/v-0.10/tools/playground.md           |  24 +
 doc/source/v-0.10/tools/transformer.md          |  38 +
 doc/specs/js-bundle-format.md                   | 300 ------
 doc/specs/js-framework-apis.md                  | 184 ----
 doc/specs/virtual-dom-apis.md                   | 140 ---
 doc/syntax/comm.md                              | 222 -----
 doc/syntax/composed-component.md                | 108 ---
 doc/syntax/config-n-data.md                     |  55 --
 doc/syntax/data-binding.md                      | 241 -----
 doc/syntax/display-logic.md                     | 169 ----
 doc/syntax/events.md                            |  54 --
 doc/syntax/id.md                                |  59 --
 doc/syntax/main.md                              | 116 ---
 doc/syntax/render-logic.md                      |  29 -
 doc/syntax/style-n-class.md                     | 106 ---
 doc/themes/weex/_config.yml                     |  42 +
 doc/themes/weex/languages/cn.yml                | 103 +++
 doc/themes/weex/languages/en.yml                | 104 +++
 .../weex/layout/_partial/after-footer.ejs       |   3 +
 .../weex/layout/_partial/archive-post.ejs       |  11 +
 doc/themes/weex/layout/_partial/archive.ejs     |  19 +
 doc/themes/weex/layout/_partial/article.ejs     |  11 +
 doc/themes/weex/layout/_partial/footer.ejs      |  28 +
 doc/themes/weex/layout/_partial/head.ejs        |  36 +
 doc/themes/weex/layout/_partial/header.ejs      |  49 +
 .../weex/layout/_partial/post/category.ejs      |  10 +
 doc/themes/weex/layout/_partial/post/nav.ejs    |   8 +
 .../weex/layout/_partial/post/summary.ejs       |  43 +
 doc/themes/weex/layout/_partial/post/title.ejs  |  18 +
 doc/themes/weex/layout/_partial/search-form.ejs |   8 +
 doc/themes/weex/layout/_partial/sidebar.ejs     |  56 ++
 doc/themes/weex/layout/_partial/slider.ejs      |  17 +
 doc/themes/weex/layout/archive.ejs              |   3 +
 doc/themes/weex/layout/blog.ejs                 |   3 +
 doc/themes/weex/layout/category.ejs             |   1 +
 doc/themes/weex/layout/download.ejs             |  20 +
 doc/themes/weex/layout/example.ejs              |  40 +
 doc/themes/weex/layout/index.ejs                | 211 +++++
 doc/themes/weex/layout/layout.ejs               |  17 +
 doc/themes/weex/layout/page.ejs                 |   6 +
 doc/themes/weex/layout/playground.ejs           |  30 +
 doc/themes/weex/layout/post.ejs                 |   3 +
 doc/themes/weex/layout/tag.ejs                  |   1 +
 doc/themes/weex/scripts/helper.js               |  38 +
 doc/themes/weex/source/css/animation.scss       | 250 +++++
 doc/themes/weex/source/css/atom-one-dark.scss   |  96 ++
 doc/themes/weex/source/css/blog.scss            |  36 +
 doc/themes/weex/source/css/common.scss          | 250 +++++
 doc/themes/weex/source/css/example.scss         | 103 +++
 doc/themes/weex/source/css/index.scss           | 540 +++++++++++
 doc/themes/weex/source/css/media-queries.scss   | 190 ++++
 .../weex/source/css/partial/article-title.scss  |  28 +
 doc/themes/weex/source/css/partial/article.scss |  68 ++
 doc/themes/weex/source/css/partial/footer.scss  |  62 ++
 doc/themes/weex/source/css/partial/header.scss  | 104 +++
 .../weex/source/css/partial/highlight.scss      | 108 +++
 .../weex/source/css/partial/search-form.scss    |  74 ++
 doc/themes/weex/source/css/partial/sidebar.scss |  74 ++
 doc/themes/weex/source/css/partial/summary.scss |  48 +
 doc/themes/weex/source/css/playground.scss      |  50 +
 doc/themes/weex/source/css/post.scss            |  66 ++
 doc/themes/weex/source/css/style.scss           |  28 +
 doc/themes/weex/source/css/swiper.min.css       |  15 +
 doc/themes/weex/source/css/variable.scss        |  40 +
 doc/themes/weex/source/images/_slide1.png       | Bin 0 -> 381001 bytes
 .../weex/source/images/ali-open-source.png      | Bin 0 -> 2193 bytes
 doc/themes/weex/source/images/alibaba.png       | Bin 0 -> 2107 bytes
 doc/themes/weex/source/images/aliyun.png        | Bin 0 -> 1292 bytes
 doc/themes/weex/source/images/android.png       | Bin 0 -> 5973 bytes
 doc/themes/weex/source/images/avatar.png        | Bin 0 -> 32736 bytes
 doc/themes/weex/source/images/cainiao.png       | Bin 0 -> 3353 bytes
 doc/themes/weex/source/images/ding.png          | Bin 0 -> 5929 bytes
 doc/themes/weex/source/images/extendable.svg    |  51 +
 doc/themes/weex/source/images/feature.png       | Bin 0 -> 1090905 bytes
 doc/themes/weex/source/images/feizhu.jpg        | Bin 0 -> 5988 bytes
 doc/themes/weex/source/images/flow.png          | Bin 0 -> 14440 bytes
 doc/themes/weex/source/images/galaxy_1.svg      |  53 ++
 doc/themes/weex/source/images/galaxy_2.svg      |  53 ++
 doc/themes/weex/source/images/ios.png           | Bin 0 -> 6272 bytes
 doc/themes/weex/source/images/level1.png        | Bin 0 -> 14951 bytes
 doc/themes/weex/source/images/level2.png        | Bin 0 -> 101449 bytes
 doc/themes/weex/source/images/level3.png        | Bin 0 -> 101212 bytes
 doc/themes/weex/source/images/level4.png        | Bin 0 -> 339831 bytes
 doc/themes/weex/source/images/lightweight.svg   |  31 +
 doc/themes/weex/source/images/logo.png          | Bin 0 -> 5398 bytes
 doc/themes/weex/source/images/logo.svg          |  29 +
 doc/themes/weex/source/images/performance.svg   |  29 +
 doc/themes/weex/source/images/playground.png    | Bin 0 -> 12659 bytes
 doc/themes/weex/source/images/qr.png            | Bin 0 -> 1801 bytes
 doc/themes/weex/source/images/slide1.png        | Bin 0 -> 226303 bytes
 doc/themes/weex/source/images/taobao.png        | Bin 0 -> 3074 bytes
 doc/themes/weex/source/images/tmall.png         | Bin 0 -> 8562 bytes
 doc/themes/weex/source/images/vue-logo.png      | Bin 0 -> 5346 bytes
 doc/themes/weex/source/images/vue.png           | Bin 0 -> 16582 bytes
 doc/themes/weex/source/images/web.png           | Bin 0 -> 9297 bytes
 doc/themes/weex/source/images/xiami.png         | Bin 0 -> 2615 bytes
 doc/themes/weex/source/images/youku.png         | Bin 0 -> 2178 bytes
 doc/themes/weex/source/js/common.js             | 522 +++++++++++
 doc/themes/weex/source/js/example.js            |  37 +
 doc/themes/weex/source/js/examples/a.web.js     | 528 +++++++++++
 doc/themes/weex/source/js/examples/a.weex.js    | 198 ++++
 .../weex/source/js/examples/animation.web.js    | 569 ++++++++++++
 .../weex/source/js/examples/animation.weex.js   | 224 +++++
 .../weex/source/js/examples/clipboard.web.js    | 583 ++++++++++++
 .../weex/source/js/examples/clipboard.weex.js   | 249 +++++
 doc/themes/weex/source/js/examples/div.web.js   | 523 +++++++++++
 doc/themes/weex/source/js/examples/div.weex.js  | 183 ++++
 .../weex/source/js/examples/dom-rect.web.js     | 589 ++++++++++++
 .../weex/source/js/examples/dom-rect.weex.js    | 254 +++++
 .../weex/source/js/examples/dom-scroll.web.js   | 598 ++++++++++++
 .../weex/source/js/examples/dom-scroll.weex.js  | 288 ++++++
 doc/themes/weex/source/js/examples/image.web.js | 542 +++++++++++
 .../weex/source/js/examples/image.weex.js       | 225 +++++
 .../weex/source/js/examples/indicator.web.js    | 618 +++++++++++++
 .../weex/source/js/examples/indicator.weex.js   | 307 ++++++
 doc/themes/weex/source/js/examples/input.web.js | 586 ++++++++++++
 .../weex/source/js/examples/input.weex.js       | 251 +++++
 doc/themes/weex/source/js/examples/list.web.js  | 584 ++++++++++++
 doc/themes/weex/source/js/examples/list.weex.js | 252 +++++
 doc/themes/weex/source/js/examples/modal.web.js | 604 ++++++++++++
 .../weex/source/js/examples/modal.weex.js       | 272 ++++++
 .../weex/source/js/examples/navigator.web.js    | 562 +++++++++++
 .../weex/source/js/examples/navigator.weex.js   | 230 +++++
 .../weex/source/js/examples/refresh.web.js      | 594 ++++++++++++
 .../weex/source/js/examples/refresh.weex.js     | 267 ++++++
 .../weex/source/js/examples/scroller.web.js     | 598 ++++++++++++
 .../weex/source/js/examples/scroller.weex.js    | 288 ++++++
 .../weex/source/js/examples/slider.web.js       | 587 ++++++++++++
 .../weex/source/js/examples/slider.weex.js      | 255 +++++
 .../weex/source/js/examples/storage.web.js      | 634 +++++++++++++
 .../weex/source/js/examples/storage.weex.js     | 317 +++++++
 .../weex/source/js/examples/stream.web.js       | 590 ++++++++++++
 .../weex/source/js/examples/stream.weex.js      | 259 ++++++
 .../weex/source/js/examples/switch.web.js       | 605 ++++++++++++
 .../weex/source/js/examples/switch.weex.js      | 280 ++++++
 doc/themes/weex/source/js/examples/text.web.js  | 535 +++++++++++
 doc/themes/weex/source/js/examples/text.weex.js | 208 +++++
 .../weex/source/js/examples/textarea.web.js     | 582 ++++++++++++
 .../weex/source/js/examples/textarea.weex.js    | 247 +++++
 doc/themes/weex/source/js/examples/video.web.js | 593 ++++++++++++
 .../weex/source/js/examples/video.weex.js       | 254 +++++
 doc/themes/weex/source/js/examples/web.web.js   | 923 +++++++++++++++++++
 doc/themes/weex/source/js/examples/web.weex.js  | 600 ++++++++++++
 doc/themes/weex/source/js/highlight.pack.js     |   2 +
 doc/themes/weex/source/js/mobile-detect.js      |   3 +
 doc/themes/weex/source/js/qrcode.min.js         |   1 +
 doc/themes/weex/source/js/reqwest.js            |   7 +
 doc/themes/weex/source/js/swiper.min.js         |  18 +
 doc/themes/weex/source/js/velocity.js           |   5 +
 doc/tools/README.md                             |   6 -
 doc/tools/cli.md                                |  90 --
 doc/tools/devtools-android.md                   | 116 ---
 doc/tools/devtools-ios.md                       |  69 --
 doc/tools/devtools.md                           |  94 --
 doc/tools/how-to-debug.md                       |  45 -
 doc/tools/main.md                               |  10 -
 doc/tools/playground-app.md                     |  17 -
 doc/tools/transformer.md                        |  30 -
 doc/tutorial.md                                 | 206 -----
 doc/tutorial_source/tech_list.we                |  22 -
 doc/tutorial_source/tech_list_0.we              |  15 -
 doc/tutorial_source/tech_list_1.we              |  24 -
 doc/tutorial_source/tech_list_2.we              |  62 --
 examples/component/scroller-demo.we             |   2 +-
 ios/sdk/WeexSDK.xcodeproj/project.pbxproj       |  16 +-
 ios/sdk/WeexSDK/Sources/Bridge/WXBridgeMethod.h |  25 +
 ios/sdk/WeexSDK/Sources/Bridge/WXBridgeMethod.m |  87 ++
 .../Sources/Bridge/WXDebugLoggerBridge.m        |   2 +-
 .../Sources/Component/WXEmbedComponent.m        |   2 +-
 .../Sources/Component/WXImageComponent.m        |   4 +-
 .../Sources/Component/WXLoadingComponent.m      |   6 +-
 .../Sources/Component/WXRefreshComponent.m      |   6 +-
 .../Sources/Component/WXScrollerComponent.m     |  14 +-
 .../Sources/Component/WXSliderComponent.m       |   6 +-
 .../Component/WXSliderNeighborComponent.m       |   2 +-
 .../Sources/Component/WXTextAreaComponent.m     |   4 +-
 .../WeexSDK/Sources/Component/WXTextComponent.m |   2 +-
 .../Sources/Component/WXTextInputComponent.m    |  15 +-
 .../Sources/Component/WXVideoComponent.m        |   8 +-
 .../Sources/Controller/WXBaseViewController.m   |  10 +-
 ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.m    |   4 +-
 .../WeexSDK/Sources/Manager/WXBridgeManager.m   |   4 +-
 .../Sources/Manager/WXComponentFactory.m        |   1 +
 .../Sources/Manager/WXComponentManager.m        |   4 +-
 .../WeexSDK/Sources/Manager/WXServiceFactory.h  |   2 +-
 ios/sdk/WeexSDK/Sources/Model/WXBridgeMethod.h  |  25 -
 ios/sdk/WeexSDK/Sources/Model/WXBridgeMethod.m  |  87 --
 ios/sdk/WeexSDK/Sources/Model/WXComponent.m     |   4 +-
 ios/sdk/WeexSDK/Sources/Monitor/WXMonitor.m     |   2 +-
 726 files changed, 59583 insertions(+), 9194 deletions(-)
----------------------------------------------------------------------




[06/50] [abbrv] incubator-weex git commit: * [html5] update

Posted by ji...@apache.org.
* [html5] update


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

Branch: refs/heads/master
Commit: 9172b4f1d65238cbab19cf3a02a82564521957a9
Parents: b0fb399
Author: MrRaindrop <te...@gmail.com>
Authored: Thu Feb 16 10:35:39 2017 +0800
Committer: MrRaindrop <te...@gmail.com>
Committed: Thu Feb 16 10:35:39 2017 +0800

----------------------------------------------------------------------
 vue.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/9172b4f1/vue.html
----------------------------------------------------------------------
diff --git a/vue.html b/vue.html
index 1748d1c..06a1c18 100644
--- a/vue.html
+++ b/vue.html
@@ -31,7 +31,7 @@
           var query = '?page=' + defaultPage
           return f ? query + '&' : query
         })
-        location.href = url
+        return location.href = url
       }
 
       var bundle = document.createElement('script')


[48/50] [abbrv] incubator-weex git commit: * [doc] updated guide/intro/app-arch

Posted by ji...@apache.org.
* [doc] updated guide/intro/app-arch


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

Branch: refs/heads/master
Commit: 7d94533a629939ea504afd81986fb7e69d9a8659
Parents: 7737d9f
Author: Jinjiang <zh...@me.com>
Authored: Fri Feb 17 14:46:53 2017 +0800
Committer: Jinjiang <zh...@me.com>
Committed: Fri Feb 17 14:46:53 2017 +0800

----------------------------------------------------------------------
 doc/source/cn/guide/intro/app-architecture.md | 34 ++++---------
 doc/source/guide/intro/app-architecture.md    | 57 ++++++++++++++++++++--
 doc/source/guide/intro/index.md               |  4 +-
 doc/source/guide/intro/page-architecture.md   |  4 +-
 doc/source/guide/intro/using-vue.md           |  2 +-
 doc/source/guide/intro/web-dev-experience.md  |  2 +-
 doc/source/guide/intro/write-once.md          |  2 +-
 7 files changed, 70 insertions(+), 35 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7d94533a/doc/source/cn/guide/intro/app-architecture.md
----------------------------------------------------------------------
diff --git a/doc/source/cn/guide/intro/app-architecture.md b/doc/source/cn/guide/intro/app-architecture.md
index 556f72a..a3f39ce 100644
--- a/doc/source/cn/guide/intro/app-architecture.md
+++ b/doc/source/cn/guide/intro/app-architecture.md
@@ -31,10 +31,9 @@ version: 2.1
 |------|------|------|------| |-----|
 | page | page | page | page | | api |
 |------|------|------|------| | api |
-|------|------|------|------| | api |
 | page | page | page | page | | api |
 |------|------|------|------| | api |
-                              | api |
+| page | page | page | page | | api |
 |---------------------------| | api |
 |           router          | | api |
 |---------------------------| |-----|
@@ -44,34 +43,19 @@ version: 2.1
 * \u8def\u7531\uff1a\u8fd9\u4e9b\u9875\u9762\u5c06\u4f1a\u901a\u8fc7\u8def\u7531\u673a\u5236\u6709\u673a\u7684\u4e32\u8054\u8d77\u6765\uff0c\u9875\u9762\u4e4b\u95f4\u7684\u5173\u7cfb\u662f\u901a\u8fc7\u8def\u7531\u6765\u8fdb\u884c\u8c03\u5ea6\u7684\u3002\u5e38\u89c1\u7684\u79fb\u52a8\u5e94\u7528\u8def\u7531\u5305\u62ec\u5bfc\u822a\u680f\u3001tab \u5207\u6362\u7b49\u3002
 * \u8bbe\u5907\u80fd\u529b\uff1a\u4ee5\u5404\u79cd API \u6216\u670d\u52a1\u7684\u65b9\u5f0f\u63d0\u4f9b\u51fa\u6765\uff0c\u4f9b\u9875\u9762\u81ea\u7531\u4f7f\u7528\u3002
 
-## \u5de5\u4f5c\u5206\u89e3
-
-### \u524d\u671f\u8bbe\u8ba1
-
-\u786e\u5b9a\u4e00\u4e2a\u79fb\u52a8\u5e94\u7528\u6709\u591a\u5c11\u9875\u9762\uff0c\u6bcf\u4e2a\u9875\u9762\u5206\u522b\u662f\u4ec0\u4e48 URL\uff0c\u9875\u9762\u4e4b\u95f4\u7684\u5173\u8054\u548c\u8df3\u8f6c\u903b\u8f91\u662f\u600e\u6837\u7684\uff0c\u7136\u540e\u68b3\u7406\u6574\u4e2a\u79fb\u52a8\u5e94\u7528\u9700\u8981\u7684\u6240\u6709 API \u548c\u670d\u52a1\u3002
-
-### \u811a\u624b\u67b6
+\u8fd9\u6837\u7684\u8bdd\uff0c\u5728\u6784\u5efa\u4e00\u4e2a\u5b8c\u6574\u7684\u79fb\u52a8\u5e94\u7528\u4e4b\u524d\uff0c\u5148\u786e\u5b9a\u4f60\u7684\u5e94\u7528\u6709\u591a\u5c11\u9875\u9762\uff0c\u6bcf\u4e2a\u9875\u9762\u5206\u522b\u662f\u4ec0\u4e48 URL\uff0c\u9875\u9762\u4e4b\u95f4\u7684\u5173\u8054\u548c\u8df3\u8f6c\u903b\u8f91\u662f\u600e\u6837\u7684\uff0c\u7136\u540e\u68b3\u7406\u6574\u4e2a\u79fb\u52a8\u5e94\u7528\u9700\u8981\u7684\u6240\u6709 API \u548c\u670d\u52a1\u3002
 
-\u9996\u5148\u6211\u4eec\u9700\u8981\u4e00\u4e2a Weex \u79fb\u52a8\u5e94\u7528\u7684\u811a\u624b\u67b6\uff0c\u901a\u8fc7\u8fd9\u4e2a\u811a\u624b\u67b6\u6211\u4eec\u80fd\u591f\u521d\u59cb\u5316\u4e00\u4e2a iOS \u5de5\u7a0b\u3001\u4e00\u4e2a Android \u5de5\u7a0b\u6216\u4e00\u4e2a web \u5de5\u7a0b\u3002\u5e76\u5728\u5176\u4e2d\u5b9a\u4e49\u4e00\u4e9b\u57fa\u672c\u7684\u914d\u7f6e\u4fe1\u606f\u548c\u8def\u7531\u89c4\u5219\u3002
+\u7136\u540e\u901a\u8fc7 Weex \u521b\u5efa\u4e0d\u540c\u7684\u9875\u9762\uff0c\u5e76\u5206\u522b\u8fdb\u884c\u5f00\u53d1\u3001\u8c03\u8bd5\u548c\u53d1\u5e03\u3002
 
-<!-- weex-pack -->
+**\u76f8\u5173\u94fe\u63a5**
 
-### \u9875\u9762
+* [\u9875\u9762\u7ed3\u6784](./page-architecture.html)
 
-\u7136\u540e\u6211\u4eec\u901a\u8fc7 Weex \u9875\u9762\u811a\u624b\u67b6\u6765\u521b\u5efa\u4e00\u4e2a\u4e2a\u72ec\u7acb\u7684 Weex \u9875\u9762\uff0c\u5e76\u5206\u522b\u8fdb\u884c\u5f00\u53d1\u3001\u8c03\u8bd5\u548c\u53d1\u5e03\u3002
-
-<!-- \u9875\u9762\u7ed3\u6784 -->
-
-### \u6269\u5c55
+\u5982\u679c\u4f60\u5df2\u7ecf\u6709\u4e00\u4e2a\u505a\u597d\u7684\u79fb\u52a8\u5e94\u7528\uff0c\u53ea\u60f3\u7528 Weex \u5f00\u53d1\u5176\u4e2d\u7684\u4e00\u90e8\u5206\u9875\u9762\u751a\u81f3\u4ec5\u4ec5\u5176\u4e2d\u7684\u4e00\u4e24\u4e2a\u9875\u9762\uff0c\u8fd9\u5bf9 Weex \u6765\u8bf4\u5b8c\u5168\u4e0d\u662f\u95ee\u9898\u3002Weex \u53ea\u662f\u4e00\u4e2a SDK\uff0c\u5bf9\u6574\u4f53\u7684\u79fb\u52a8\u5e94\u7528\u67b6\u6784\u4e0d\u4f1a\u4ea7\u751f\u4efb\u4f55\u4fb5\u5165\u6027\u3002\u5e76\u4e14\u5b8c\u5168\u53ef\u4ee5\u548c\u7eaf native \u754c\u9762\u6216 hybrid \u9875\u9762\u5171\u5b58\u3002
 
 \u5982\u679c\u9700\u8981 WeexSDK \u989d\u5916\u7684\u7ec4\u4ef6\u3001\u6a21\u5757\u6216\u5176\u5b83\u529f\u80fd\uff0c\u53ef\u4ee5\u901a\u8fc7 Weex \u7684\u6269\u5c55\u673a\u5236\u8fdb\u884c\u6269\u5c55\u3002\u8fd9\u90e8\u5206\u5de5\u4f5c\u9700\u8981 native \u7684\u7814\u53d1\u77e5\u8bc6\uff0c\u4f46\u662f\u968f\u7740 Weex \u7ec4\u4ef6\u548c\u6a21\u5757\u7684\u4e30\u5bcc\u4ee5\u53ca\u4e1a\u52a1\u8fed\u4ee3\u7684\u6df1\u5165\uff0c\u8fd9\u90e8\u5206\u6210\u672c\u4f1a\u627f\u4e0b\u964d\u548c\u6536\u655b\u7684\u8d8b\u52bf\u3002
 
-<!-- \u6269\u5c55 iOS -->
-
-<!-- \u6269\u5c55 Android -->
-
-### \u4e91\u7aef
-
-\u5728\u4e91\u7aef\u90e8\u7f72\u76f8\u5e94\u7684 JS bundle\uff0c\u540c\u65f6\u901a\u8fc7\u7f13\u5b58\u6216\u9884\u52a0\u8f7d\u7b49\u65b9\u5f0f\u52a0\u901f Weex \u9875\u9762\u7684\u52a0\u8f7d\u65f6\u95f4\u548c\u9996\u5c4f\u6e32\u67d3\u65f6\u95f4\u3002
+**\u76f8\u5173\u94fe\u63a5**
 
-\u8fd9\u6837\uff0c\u4ece\u79fb\u52a8\u5e94\u7528\u6574\u4f53\u67b6\u6784\u3001\u5230\u9875\u9762\u5f00\u53d1\u548c\u529f\u80fd\u6269\u5c55\uff0c\u518d\u5230\u4e91\u7aef\u7684\u90e8\u7f72\u548c\u5206\u53d1\uff0c\u4e00\u4e2a\u5b8c\u6574\u7684 Weex \u5e94\u7528\u5c31\u53ef\u4ee5\u6784\u5efa\u51fa\u6765\u3002
\ No newline at end of file
+* [\u5982\u4f55\u6269\u5c55 iOS](../../references/advanced/extend-to-ios.html)
+* [\u5982\u4f55\u6269\u5c55 Android](../../references/advanced/extend-to-android.html)

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7d94533a/doc/source/guide/intro/app-architecture.md
----------------------------------------------------------------------
diff --git a/doc/source/guide/intro/app-architecture.md b/doc/source/guide/intro/app-architecture.md
index 86e89ad..d7b3bc6 100644
--- a/doc/source/guide/intro/app-architecture.md
+++ b/doc/source/guide/intro/app-architecture.md
@@ -1,10 +1,61 @@
 ---
-title: App Architecture  
+title: Mobile App Architecture
 type: guide
 order: 4.5
 version: 2.1
 ---
 
-# App Architecture
+# Mobile App Architecture
 
-Work in progress.
\ No newline at end of file
+## Today's Mobile App
+
+Let's talk about what we think a mobile app should be.
+
+### Mobile App Needs Parallel Development
+
+Nowadays, all mobile app teams requires the ability to develop in parallel. When a mobile app keeps growing, supporting large-scale parallel development must become a very important key thing. Otherwise it's really easy to become a bottleneck.
+
+### Mobile App Needs to be Dynamic
+
+Today the development of mobile apps is very heavy. And it's really slow in iteration, release, distribution and online bugfix. The size of the package of an app is growing fast too. All of this is not suitable for this mobile internet age. Mobile app needs to be dynaimic which is out of the cumbersome process of version deployment and distribution.
+
+### Mobile App Needs Open Interconnection
+
+Today in your phone, things are hard to connect and share between different apps. They needs some container with common standard and specs to be shared with each other.
+
+## Our Thinking of Mobile App
+
+We think a dynamic, parallel development supported, standardized mobile app should be like this:
+
+```
+|------|------|------|------| |-----|
+| page | page | page | page | | api |
+|------|------|------|------| | api |
+| page | page | page | page | | api |
+|------|------|------|------| | api |
+| page | page | page | page | | api |
+|---------------------------| | api |
+|           router          | | api |
+|---------------------------| |-----|
+```
+
+* Pages: A whole mobile app should be divided into several mobile pages. Each mobile page has its own "URL".
+* Router: All the mobile pages above will be connected with router. And navigators or tab bars are just doing this job.
+* Features: All kinds of APIs or services provided from the device. Every mobile page could use these features as they like.
+
+So before you build your mobile app, make sure how many mobile pages your mobile app has and what are they. How do they connect each other. Give each mobile page a URL. And sort out all the APIs and services your mobile app needs.
+
+Then create the pages and develop, debug and deploy them using Weex.
+
+**Links**
+
+* [Mobile page architecture](./page-architecture.html)
+
+If you have built a complete mobile app already and just want to using Weex to rebuild part of these pages, that's absolutely no problem. Because Weex is just a SDK to build mobile pages which can coexist very well with other native views or hybrid pages.
+
+If the feature of WeexSDK is limited to your mobile app. You can extend your own components and modules. It requires some native development knowledge. But with our efforts on delivering more and more features, we believe this part of job will be getting smaller and smaller.
+
+**Links**
+
+* [Extend to iOS](../../references/advanced/extend-to-ios.html)
+* [Extend to Android](../../references/advanced/extend-to-android.html)

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7d94533a/doc/source/guide/intro/index.md
----------------------------------------------------------------------
diff --git a/doc/source/guide/intro/index.md b/doc/source/guide/intro/index.md
index 1b07ccd..24c8236 100644
--- a/doc/source/guide/intro/index.md
+++ b/doc/source/guide/intro/index.md
@@ -1,5 +1,5 @@
 ---
-title: Intro 
+title: Intro
 type: guide
 order: 4
 has_chapter_content: false
@@ -14,4 +14,4 @@ version: 2.1
 - [Using Vue](./using-vue.html)
 - [Write once, Run Everywhere](./write-once.html)
 - [App Architecture](./app-architecture.html)
-- [Weex Page Architecture](./page-architecture.html)
\ No newline at end of file
+- [Weex Page Architecture](./page-architecture.html)

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7d94533a/doc/source/guide/intro/page-architecture.md
----------------------------------------------------------------------
diff --git a/doc/source/guide/intro/page-architecture.md b/doc/source/guide/intro/page-architecture.md
index e353b98..73e5302 100644
--- a/doc/source/guide/intro/page-architecture.md
+++ b/doc/source/guide/intro/page-architecture.md
@@ -1,5 +1,5 @@
 ---
-title: Weex Page Architecture  
+title: Weex Page Architecture
 type: guide
 order: 4.6
 version: 2.1
@@ -7,4 +7,4 @@ version: 2.1
 
 # Weex Page Architecture
 
-Work in progress.
\ No newline at end of file
+Work in progress.

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7d94533a/doc/source/guide/intro/using-vue.md
----------------------------------------------------------------------
diff --git a/doc/source/guide/intro/using-vue.md b/doc/source/guide/intro/using-vue.md
index bc043ae..953d7fd 100644
--- a/doc/source/guide/intro/using-vue.md
+++ b/doc/source/guide/intro/using-vue.md
@@ -1,5 +1,5 @@
 ---
-title: Using Vue  
+title: Using Vue
 type: guide
 order: 4.3
 version: 2.1

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7d94533a/doc/source/guide/intro/web-dev-experience.md
----------------------------------------------------------------------
diff --git a/doc/source/guide/intro/web-dev-experience.md b/doc/source/guide/intro/web-dev-experience.md
index 026a02a..81d0ff2 100644
--- a/doc/source/guide/intro/web-dev-experience.md
+++ b/doc/source/guide/intro/web-dev-experience.md
@@ -1,5 +1,5 @@
 ---
-title: Web Dev Experience  
+title: Web Dev Experience
 type: guide
 order: 4.2
 version: 2.1

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7d94533a/doc/source/guide/intro/write-once.md
----------------------------------------------------------------------
diff --git a/doc/source/guide/intro/write-once.md b/doc/source/guide/intro/write-once.md
index 282c992..382b7b4 100644
--- a/doc/source/guide/intro/write-once.md
+++ b/doc/source/guide/intro/write-once.md
@@ -1,5 +1,5 @@
 ---
-title: Write once, Run Everywhere  
+title: Write once, Run Everywhere
 type: guide
 order: 4.4
 version: 2.1


[05/50] [abbrv] incubator-weex git commit: Merge branch 'html5-feature-0.10' of https://github.com/alibaba/weex into html5-feature-0.10

Posted by ji...@apache.org.
Merge branch 'html5-feature-0.10' of https://github.com/alibaba/weex into html5-feature-0.10


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

Branch: refs/heads/master
Commit: b0fb3998b3c7a8ad09d1538249e78a2c51101a99
Parents: 2fc724d 26f9644
Author: MrRaindrop <te...@gmail.com>
Authored: Thu Feb 16 10:32:26 2017 +0800
Committer: MrRaindrop <te...@gmail.com>
Committed: Thu Feb 16 10:32:26 2017 +0800

----------------------------------------------------------------------
 build/config.js                                |   1 +
 html5/render/browser/base/component/operate.js | 105 +++++++++++++++++++-
 html5/render/vue/env/viewport.js               |   9 +-
 vue.html                                       |   2 +-
 4 files changed, 110 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b0fb3998/vue.html
----------------------------------------------------------------------


[50/50] [abbrv] incubator-weex git commit: Merge pull request #2625 from Jinjiang/doc-feature-intro

Posted by ji...@apache.org.
Merge pull request #2625 from Jinjiang/doc-feature-intro

[doc] guide/intro

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

Branch: refs/heads/master
Commit: 6e7143776459cc402467de0884e8b9871d2ce015
Parents: 1b79066 6228f65
Author: \u52fe\u4e09\u80a1\u56db <zh...@me.com>
Authored: Fri Feb 17 18:30:33 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Fri Feb 17 18:30:33 2017 +0800

----------------------------------------------------------------------
 doc/source/cn/guide/intro/app-architecture.md   | 34 +++------
 doc/source/cn/guide/intro/how-it-works.md       | 38 +++++-----
 doc/source/cn/guide/intro/page-architecture.md  | 18 ++---
 doc/source/cn/guide/intro/using-vue.md          | 79 +++++---------------
 doc/source/cn/guide/intro/web-dev-experience.md | 20 ++---
 doc/source/guide/intro/app-architecture.md      | 57 +++++++++++++-
 doc/source/guide/intro/how-it-works.md          | 62 ++++++++++++++-
 doc/source/guide/intro/index.md                 |  4 +-
 doc/source/guide/intro/page-architecture.md     | 42 ++++++++++-
 doc/source/guide/intro/using-vue.md             | 52 ++++++++++++-
 doc/source/guide/intro/web-dev-experience.md    | 29 ++++++-
 doc/source/guide/intro/write-once.md            | 19 ++++-
 12 files changed, 313 insertions(+), 141 deletions(-)
----------------------------------------------------------------------



[33/50] [abbrv] incubator-weex git commit: Merge pull request #2605 from boboning/ios

Posted by ji...@apache.org.
Merge pull request #2605 from boboning/ios

Ios release 0.10.0

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

Branch: refs/heads/master
Commit: 5d7cacf0327173b16d8cc32ae649b9ab9b9a7378
Parents: f8e9e11 c0a6edf6
Author: \u9690\u5c0f\u98ce <cx...@gmail.com>
Authored: Thu Feb 16 17:59:21 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Thu Feb 16 17:59:21 2017 +0800

----------------------------------------------------------------------
 .eslintignore                                   |   2 +
 .github/ISSUE_TEMPLATE.md                       |  30 +-
 .github/PULL_REQUEST_TEMPLATE.md                |  26 +-
 .gitignore                                      |   9 +-
 README.md                                       |  37 +-
 doc/.gitignore                                  |   5 -
 doc/INSTALL.md                                  |  38 -
 doc/LICENSE                                     | 202 ----
 doc/NOTICE                                      |   5 -
 doc/README.md                                   |   9 -
 doc/SUMMARY.md                                  |  95 --
 doc/_config.yml                                 | 323 +++++++
 doc/_layouts/header.html                        | 269 ------
 doc/_legacy/core-concepts/animation.md          |  34 -
 doc/_legacy/integrating.md                      |   3 -
 doc/_legacy/syntax/javascript.md                |  53 --
 doc/advanced/extend-to-android.md               | 160 ----
 doc/advanced/extend-to-html5.md                 | 252 -----
 doc/advanced/extend-to-ios.md                   | 262 ------
 doc/advanced/how-data-binding-works.md          |  32 -
 doc/advanced/how-it-works.md                    | 140 ---
 doc/advanced/integrate-to-android.md            | 197 ----
 doc/advanced/integrate-to-html5.md              |  70 --
 doc/advanced/integrate-to-ios.md                | 109 ---
 doc/advanced/main.md                            |   3 -
 doc/ali_addition/weex_doc.css                   | 146 ---
 doc/ali_addition/weex_doc.js                    |  78 --
 doc/book.json                                   |  19 -
 doc/components/a.md                             |  25 -
 doc/components/cell.md                          |  36 -
 doc/components/div.md                           |  42 -
 doc/components/image.md                         |  49 -
 doc/components/indicator.md                     |  92 --
 doc/components/input.md                         |  79 --
 doc/components/list.md                          |  57 --
 doc/components/main.md                          |   3 -
 doc/components/refresh-loading.md               |  27 -
 doc/components/scroller.md                      |  70 --
 doc/components/slider.md                        |  65 --
 doc/components/special-element.md               |  29 -
 doc/components/switch.md                        |  55 --
 doc/components/text.md                          |  60 --
 doc/components/textarea.md                      |  74 --
 doc/components/video.md                         |  49 -
 doc/components/web.md                           |  49 -
 doc/components/wxc-navpage.md                   |  68 --
 doc/components/wxc-tabbar.md                    |  91 --
 doc/demo/animation.md                           |  10 -
 doc/demo/clipboard.md                           |   9 -
 doc/demo/hello-world.md                         |  16 -
 doc/demo/list.md                                |   9 -
 doc/demo/main.md                                |   3 -
 doc/demo/modal.md                               |   9 -
 doc/demo/slider.md                              |   9 -
 doc/faq.md                                      | 127 ---
 doc/guide.md                                    |   3 -
 doc/how-to/customize-a-native-component.md      |  49 -
 doc/how-to/cuszomize-native-apis.md             |  73 --
 doc/how-to/debug-with-html5.md                  |  40 -
 doc/how-to/debug-with-remote-tools.md           |  34 -
 doc/how-to/main.md                              |   3 -
 doc/how-to/preview-in-browser.md                |  31 -
 doc/how-to/preview-in-playground-app.md         |  13 -
 doc/how-to/require-3rd-party-libs.md            |  50 -
 doc/how-to/transform-code-into-js-bundle.md     |  98 --
 doc/images/css-boxmodel.png                     | Bin 12581 -> 0 bytes
 doc/images/css-flexbox-align.jpg                | Bin 35005 -> 0 bytes
 doc/images/css-flexbox-justify.svg              |  59 --
 doc/images/css-flexbox-sample.png               | Bin 3210 -> 0 bytes
 doc/images/how-arch.png                         | Bin 62303 -> 0 bytes
 doc/images/how-render.png                       | Bin 42957 -> 0 bytes
 doc/images/snapshot-animation.gif               | Bin 521431 -> 0 bytes
 doc/images/snapshot-calculator.jpg              | Bin 28504 -> 0 bytes
 doc/images/snapshot-helloworld.png              | Bin 6092 -> 0 bytes
 doc/images/snapshot-minesweeper.jpg             | Bin 53257 -> 0 bytes
 doc/images/snapshot-modals.jpg                  | Bin 27458 -> 0 bytes
 doc/images/snapshot-skeletons.gif               | Bin 518271 -> 0 bytes
 doc/images/tut-cli-qrcode.png                   | Bin 45480 -> 0 bytes
 doc/images/tut-first.png                        | Bin 51434 -> 0 bytes
 doc/images/tut-second.png                       | Bin 78519 -> 0 bytes
 doc/images/tut1.jpg                             | Bin 47442 -> 0 bytes
 doc/images/tut2.jpg                             | Bin 52428 -> 0 bytes
 doc/images/tut3.png                             | Bin 52198 -> 0 bytes
 doc/images/tut4.gif                             | Bin 218245 -> 0 bytes
 doc/modules/animation.md                        |  64 --
 doc/modules/clipboard.md                        |  48 -
 doc/modules/dom.md                              | 109 ---
 doc/modules/globalevent.md                      |  76 --
 doc/modules/main.md                             |  13 -
 doc/modules/modal.md                            | 114 ---
 doc/modules/navigator.md                        |  52 --
 doc/modules/storage.md                          | 104 ---
 doc/modules/stream.md                           |  52 --
 doc/modules/timer.md                            |  66 --
 doc/modules/webview.md                          |  62 --
 doc/package.json                                |  27 +
 doc/references/api.md                           |  78 --
 doc/references/bootstrap.md                     |  41 -
 doc/references/cheatsheet.md                    | 102 --
 doc/references/color-names.md                   | 175 ----
 doc/references/common-attrs.md                  |  80 --
 doc/references/common-event.md                  | 121 ---
 doc/references/common-style.md                  | 202 ----
 doc/references/component-defs.md                | 125 ---
 doc/references/events/appear.md                 |  28 -
 doc/references/events/blur.md                   |  42 -
 doc/references/events/change.md                 |  47 -
 doc/references/events/click.md                  |  43 -
 doc/references/events/disappear.md              |  28 -
 doc/references/events/focus.md                  |  42 -
 doc/references/events/input.md                  |  45 -
 doc/references/gesture.md                       |  66 --
 doc/references/main.md                          |   3 -
 doc/references/replace.md                       |  57 --
 doc/references/styles/background-color.md       |  25 -
 doc/references/styles/color.md                  |  26 -
 doc/references/styles/font-family.md            |  27 -
 doc/references/styles/font-size.md              |  31 -
 doc/references/styles/font-style.md             |  25 -
 doc/references/styles/font-weight.md            |  26 -
 doc/references/styles/line-height.md            |  27 -
 doc/references/styles/lines.md                  |  27 -
 doc/references/styles/main.md                   |  42 -
 doc/references/styles/opacity.md                |  22 -
 doc/references/styles/position.md               |  26 -
 doc/references/styles/text-align.md             |  26 -
 doc/references/styles/text-decoration.md        |  26 -
 doc/references/styles/text-overflow.md          |  32 -
 doc/references/styles/units/color.md            |  30 -
 doc/references/styles/units/length.md           |  12 -
 doc/references/styles/units/number.md           |   7 -
 doc/references/styles/units/percentage.md       |   5 -
 doc/references/text-style.md                    |  36 -
 doc/scaffolds/draft.md                          |   4 +
 doc/scaffolds/page.md                           |   4 +
 doc/scaffolds/post.md                           |   5 +
 doc/source/_posts/cn/hello.md                   |   6 +
 doc/source/_posts/hello_world.md                |   6 +
 doc/source/blog/index.md                        |   4 +
 doc/source/cn/blog/index.md                     |   4 +
 doc/source/cn/download.ejs                      |   3 +
 doc/source/cn/faq.md                            | 227 +++++
 doc/source/cn/guide/.gitkeep                    |   0
 doc/source/cn/guide/dev-with-weexpack.md        |  11 +
 doc/source/cn/guide/images/flow.png             | Bin 0 -> 57741 bytes
 doc/source/cn/guide/images/tut-cli-qrcode.png   | Bin 0 -> 45480 bytes
 doc/source/cn/guide/images/tut-first.png        | Bin 0 -> 51434 bytes
 doc/source/cn/guide/images/tut-second.png       | Bin 0 -> 78519 bytes
 doc/source/cn/guide/images/tut1.jpg             | Bin 0 -> 47442 bytes
 doc/source/cn/guide/images/tut2.jpg             | Bin 0 -> 52428 bytes
 doc/source/cn/guide/images/tut3.png             | Bin 0 -> 52198 bytes
 doc/source/cn/guide/images/tut4.gif             | Bin 0 -> 218245 bytes
 doc/source/cn/guide/index.md                    | 125 +++
 doc/source/cn/guide/integrate-to-your-app.md    | 321 +++++++
 doc/source/cn/guide/intro/app-architecture.md   |  77 ++
 doc/source/cn/guide/intro/devtools.md           |  99 ++
 doc/source/cn/guide/intro/how-it-works.md       |  66 ++
 doc/source/cn/guide/intro/index.md              |  15 +
 doc/source/cn/guide/intro/page-architecture.md  |  48 +
 doc/source/cn/guide/intro/using-vue.md          | 101 ++
 doc/source/cn/guide/intro/web-dev-experience.md |  42 +
 doc/source/cn/guide/intro/write-once.md         |  25 +
 doc/source/cn/index.md                          |   4 +
 doc/source/cn/playground.ejs                    |   3 +
 .../cn/references/advanced/extend-jsfm.md       | 172 ++++
 .../cn/references/advanced/extend-to-android.md | 144 +++
 .../cn/references/advanced/extend-to-html5.md   | 103 +++
 .../cn/references/advanced/extend-to-ios.md     | 235 +++++
 doc/source/cn/references/advanced/index.md      |  15 +
 .../advanced/integrate-devtool-to-android.md    | 271 ++++++
 .../advanced/integrate-devtool-to-ios.md        | 229 +++++
 doc/source/cn/references/android-apis.md        | 214 +++++
 doc/source/cn/references/color-names.md         | 180 ++++
 doc/source/cn/references/common-event.md        | 138 +++
 doc/source/cn/references/common-style.md        | 469 ++++++++++
 doc/source/cn/references/components/a.md        | 104 +++
 doc/source/cn/references/components/cell.md     | 105 +++
 doc/source/cn/references/components/div.md      | 116 +++
 doc/source/cn/references/components/image.md    | 161 ++++
 doc/source/cn/references/components/index.md    |  24 +
 .../cn/references/components/indicator.md       | 135 +++
 doc/source/cn/references/components/input.md    | 181 ++++
 doc/source/cn/references/components/list.md     | 158 ++++
 doc/source/cn/references/components/loading.md  | 125 +++
 doc/source/cn/references/components/refresh.md  | 125 +++
 doc/source/cn/references/components/scroller.md | 174 ++++
 doc/source/cn/references/components/slider.md   | 105 +++
 doc/source/cn/references/components/switch.md   | 133 +++
 doc/source/cn/references/components/text.md     | 101 ++
 doc/source/cn/references/components/textarea.md | 162 ++++
 doc/source/cn/references/components/video.md    |  94 ++
 doc/source/cn/references/components/web.md      | 154 ++++
 doc/source/cn/references/gesture.md             |  59 ++
 doc/source/cn/references/html5-apis.md          |  10 +
 doc/source/cn/references/images/Artboard.jpg    | Bin 0 -> 36223 bytes
 .../cn/references/images/coding_weex_1.jpg      | Bin 0 -> 56225 bytes
 .../cn/references/images/css-boxmodel.png       | Bin 0 -> 12581 bytes
 .../cn/references/images/css-flexbox-align.jpg  | Bin 0 -> 35005 bytes
 .../references/images/css-flexbox-justify.svg   |  59 ++
 .../cn/references/images/css-flexbox-sample.png | Bin 0 -> 3210 bytes
 doc/source/cn/references/images/div_1.jpg       | Bin 0 -> 59561 bytes
 doc/source/cn/references/images/div_2.jpg       | Bin 0 -> 62574 bytes
 doc/source/cn/references/images/div_3.jpg       | Bin 0 -> 82345 bytes
 doc/source/cn/references/images/div_4.jpg       | Bin 0 -> 200642 bytes
 doc/source/cn/references/images/image_1.jpg     | Bin 0 -> 163705 bytes
 doc/source/cn/references/images/image_2.jpg     | Bin 0 -> 255560 bytes
 doc/source/cn/references/images/list_2.jpg      | Bin 0 -> 56635 bytes
 doc/source/cn/references/images/list_3.jpg      | Bin 0 -> 128082 bytes
 doc/source/cn/references/images/list_4.jpg      | Bin 0 -> 339799 bytes
 doc/source/cn/references/images/nav.jpg         | Bin 0 -> 124441 bytes
 doc/source/cn/references/images/nav.png         | Bin 0 -> 83497 bytes
 doc/source/cn/references/images/scroller_1.jpg  | Bin 0 -> 344783 bytes
 doc/source/cn/references/images/style_1.jpg     | Bin 0 -> 59366 bytes
 doc/source/cn/references/images/style_2.jpg     | Bin 0 -> 59696 bytes
 doc/source/cn/references/index.md               |  17 +
 doc/source/cn/references/ios-apis.md            |  91 ++
 doc/source/cn/references/jsfm-apis.md           |  66 ++
 .../cn/references/migration/difference.md       | 249 +++++
 doc/source/cn/references/migration/index.md     |  11 +
 .../references/migration/migration-from-weex.md | 116 +++
 doc/source/cn/references/modules/animation.md   |  96 ++
 doc/source/cn/references/modules/clipboard.md   | 101 ++
 doc/source/cn/references/modules/dom.md         | 210 +++++
 doc/source/cn/references/modules/globalevent.md |  88 ++
 doc/source/cn/references/modules/index.md       |  30 +
 doc/source/cn/references/modules/modal.md       | 139 +++
 doc/source/cn/references/modules/navigator.md   |  90 ++
 doc/source/cn/references/modules/picker.md      | 129 +++
 doc/source/cn/references/modules/storage.md     | 184 ++++
 doc/source/cn/references/modules/stream.md      | 124 +++
 doc/source/cn/references/modules/webview.md     | 137 +++
 doc/source/cn/references/native-dom-api.md      | 223 +++++
 doc/source/cn/references/path.md                |  37 +
 doc/source/cn/references/platform-difference.md |  70 ++
 doc/source/cn/references/text-style.md          |  46 +
 doc/source/cn/references/unit.md                |  64 ++
 .../cn/references/vue/difference-of-vuex.md     |  87 ++
 .../cn/references/vue/difference-with-web.md    | 138 +++
 doc/source/cn/references/vue/index.md           |  12 +
 doc/source/cn/references/web-standards.md       | 584 ++++++++++++
 doc/source/cn/references/weex-variable.md       |  47 +
 .../cn/v-0.10/advanced/create-a-weex-project.md | 271 ++++++
 .../advanced/customize-a-native-component.md    | 168 ++++
 .../cn/v-0.10/advanced/cuszomize-native-apis.md |  85 ++
 .../cn/v-0.10/advanced/extend-to-android.md     | 145 +++
 .../cn/v-0.10/advanced/extend-to-html5.md       | 253 +++++
 doc/source/cn/v-0.10/advanced/extend-to-ios.md  | 129 +++
 .../v-0.10/advanced/how-data-binding-works.md   |  39 +
 .../cn/v-0.10/advanced/images/how-arch.png      | Bin 0 -> 62303 bytes
 .../cn/v-0.10/advanced/images/how-render.png    | Bin 0 -> 42957 bytes
 doc/source/cn/v-0.10/advanced/index.md          | 146 +++
 .../advanced/integrate-devtools-to-android.md   | 272 ++++++
 .../advanced/integrate-devtools-to-ios.md       | 230 +++++
 .../cn/v-0.10/advanced/integrate-to-android.md  | 201 ++++
 .../cn/v-0.10/advanced/integrate-to-html5.md    |  69 ++
 .../cn/v-0.10/advanced/integrate-to-ios.md      | 110 +++
 doc/source/cn/v-0.10/blog/index.md              |   4 +
 .../guide/develop-on-your-local-machine.md      | 175 ++++
 .../cn/v-0.10/guide/how-to/debug-with-html5.md  |  47 +
 doc/source/cn/v-0.10/guide/how-to/index.md      | 185 ++++
 .../guide/how-to/require-3rd-party-libs.md      |  57 ++
 .../how-to/transform-code-into-js-bundle.md     | 112 +++
 doc/source/cn/v-0.10/guide/index.md             |  60 ++
 doc/source/cn/v-0.10/guide/syntax/comm.md       | 134 +++
 .../v-0.10/guide/syntax/composed-component.md   | 158 ++++
 .../cn/v-0.10/guide/syntax/config-n-data.md     |  72 ++
 .../cn/v-0.10/guide/syntax/data-binding.md      | 332 +++++++
 .../cn/v-0.10/guide/syntax/display-logic.md     | 252 +++++
 doc/source/cn/v-0.10/guide/syntax/events.md     | 103 +++
 doc/source/cn/v-0.10/guide/syntax/id.md         | 124 +++
 doc/source/cn/v-0.10/guide/syntax/index.md      | 134 +++
 .../cn/v-0.10/guide/syntax/render-logic.md      |  44 +
 .../cn/v-0.10/guide/syntax/style-n-class.md     | 117 +++
 doc/source/cn/v-0.10/index.md                   |   5 +
 doc/source/cn/v-0.10/references/api.md          |  67 ++
 doc/source/cn/v-0.10/references/cheatsheet.md   | 114 +++
 doc/source/cn/v-0.10/references/color-names.md  | 180 ++++
 doc/source/cn/v-0.10/references/common-attrs.md | 166 ++++
 doc/source/cn/v-0.10/references/common-event.md | 492 ++++++++++
 doc/source/cn/v-0.10/references/common-style.md | 322 +++++++
 .../cn/v-0.10/references/component-defs.md      | 126 +++
 doc/source/cn/v-0.10/references/components/a.md | 273 ++++++
 .../cn/v-0.10/references/components/cell.md     | 191 ++++
 .../cn/v-0.10/references/components/div.md      | 245 +++++
 .../cn/v-0.10/references/components/image.md    | 161 ++++
 .../cn/v-0.10/references/components/index.md    |  24 +
 .../v-0.10/references/components/indicator.md   | 124 +++
 .../cn/v-0.10/references/components/input.md    | 143 +++
 .../cn/v-0.10/references/components/list.md     | 375 ++++++++
 .../cn/v-0.10/references/components/loading.md  | 118 +++
 .../cn/v-0.10/references/components/refresh.md  | 204 ++++
 .../cn/v-0.10/references/components/scroller.md | 324 +++++++
 .../cn/v-0.10/references/components/slider.md   | 121 +++
 .../cn/v-0.10/references/components/switch.md   |  98 ++
 .../cn/v-0.10/references/components/text.md     | 116 +++
 .../cn/v-0.10/references/components/textarea.md | 115 +++
 .../cn/v-0.10/references/components/video.md    |  82 ++
 .../cn/v-0.10/references/components/web.md      | 143 +++
 doc/source/cn/v-0.10/references/gesture.md      |  79 ++
 .../cn/v-0.10/references/images/Artboard.jpg    | Bin 0 -> 36223 bytes
 .../v-0.10/references/images/coding_weex_1.jpg  | Bin 0 -> 56225 bytes
 .../v-0.10/references/images/css-boxmodel.png   | Bin 0 -> 12581 bytes
 .../references/images/css-flexbox-align.jpg     | Bin 0 -> 35005 bytes
 .../references/images/css-flexbox-justify.svg   |  59 ++
 .../cn/v-0.10/references/images/div_1.jpg       | Bin 0 -> 59561 bytes
 .../cn/v-0.10/references/images/div_2.jpg       | Bin 0 -> 62574 bytes
 .../cn/v-0.10/references/images/div_3.jpg       | Bin 0 -> 82345 bytes
 .../cn/v-0.10/references/images/div_4.jpg       | Bin 0 -> 200642 bytes
 .../cn/v-0.10/references/images/image_1.jpg     | Bin 0 -> 163705 bytes
 .../cn/v-0.10/references/images/image_2.jpg     | Bin 0 -> 255560 bytes
 .../cn/v-0.10/references/images/list_2.jpg      | Bin 0 -> 56635 bytes
 .../cn/v-0.10/references/images/list_3.jpg      | Bin 0 -> 128082 bytes
 .../cn/v-0.10/references/images/list_4.jpg      | Bin 0 -> 339799 bytes
 doc/source/cn/v-0.10/references/images/nav.jpg  | Bin 0 -> 124441 bytes
 .../cn/v-0.10/references/images/scroller_1.jpg  | Bin 0 -> 344783 bytes
 .../cn/v-0.10/references/images/style_1.jpg     | Bin 0 -> 59366 bytes
 .../cn/v-0.10/references/images/style_2.jpg     | Bin 0 -> 59696 bytes
 doc/source/cn/v-0.10/references/index.md        |  46 +
 .../cn/v-0.10/references/modules/animation.md   |  90 ++
 .../cn/v-0.10/references/modules/clipboard.md   | 112 +++
 doc/source/cn/v-0.10/references/modules/dom.md  |  79 ++
 .../cn/v-0.10/references/modules/globalevent.md |  87 ++
 .../cn/v-0.10/references/modules/index.md       |  20 +
 .../cn/v-0.10/references/modules/modal.md       | 196 ++++
 .../cn/v-0.10/references/modules/navigator.md   | 110 +++
 .../cn/v-0.10/references/modules/storage.md     | 224 +++++
 .../cn/v-0.10/references/modules/stream.md      | 220 +++++
 .../cn/v-0.10/references/modules/webview.md     |  66 ++
 doc/source/cn/v-0.10/references/replace.md      |  57 ++
 .../cn/v-0.10/references/special-element.md     |  38 +
 doc/source/cn/v-0.10/references/specs/index.md  | 309 +++++++
 .../references/specs/js-framework-apis.md       | 190 ++++
 .../v-0.10/references/specs/virtual-dom-apis.md | 148 +++
 doc/source/cn/v-0.10/references/text-style.md   |  40 +
 doc/source/cn/v-0.10/references/units.md        |  66 ++
 doc/source/cn/v-0.10/references/wxc/index.md    |  44 +
 .../cn/v-0.10/references/wxc/wxc-navpage.md     | 192 ++++
 .../cn/v-0.10/references/wxc/wxc-tabbar.md      | 176 ++++
 doc/source/cn/v-0.10/tools/devtools-android.md  | 123 +++
 doc/source/cn/v-0.10/tools/devtools-ios.md      |  65 ++
 doc/source/cn/v-0.10/tools/devtools.md          |  99 ++
 doc/source/cn/v-0.10/tools/index.md             |  96 ++
 doc/source/cn/v-0.10/tools/playground.md        |  22 +
 doc/source/cn/v-0.10/tools/transformer.md       |  38 +
 doc/source/download.ejs                         |   3 +
 doc/source/examples/a.md                        |  39 +
 doc/source/examples/animation.md                |  47 +
 doc/source/examples/clipboard.md                |  64 ++
 doc/source/examples/div.md                      |  27 +
 doc/source/examples/dom-rect.md                 |  67 ++
 doc/source/examples/dom-scroll.md               |  93 ++
 doc/source/examples/image.md                    |  58 ++
 doc/source/examples/indicator.md                |  80 ++
 doc/source/examples/input.md                    |  68 ++
 doc/source/examples/list.md                     |  64 ++
 doc/source/examples/modal.md                    |  81 ++
 doc/source/examples/navigator.md                |  54 ++
 doc/source/examples/refresh.md                  |  74 ++
 doc/source/examples/scroller.md                 |  92 ++
 doc/source/examples/slider.md                   |  53 ++
 doc/source/examples/storage.md                  | 103 +++
 doc/source/examples/stream.md                   |  74 ++
 doc/source/examples/switch.md                   |  69 ++
 doc/source/examples/text.md                     |  44 +
 doc/source/examples/textarea.md                 |  68 ++
 doc/source/examples/video.md                    |  55 ++
 doc/source/examples/web.md                      |  97 ++
 doc/source/faq.md                               | 210 +++++
 doc/source/guide/.gitkeep                       |   0
 doc/source/guide/dev-with-weexpack.md           |  12 +
 doc/source/guide/images/flow.png                | Bin 0 -> 57741 bytes
 doc/source/guide/images/tut-cli-qrcode.png      | Bin 0 -> 45480 bytes
 doc/source/guide/images/tut-first.png           | Bin 0 -> 51434 bytes
 doc/source/guide/images/tut-second.png          | Bin 0 -> 78519 bytes
 doc/source/guide/images/tut1.jpg                | Bin 0 -> 47442 bytes
 doc/source/guide/images/tut2.jpg                | Bin 0 -> 52428 bytes
 doc/source/guide/images/tut3.png                | Bin 0 -> 52198 bytes
 doc/source/guide/images/tut4.gif                | Bin 0 -> 218245 bytes
 doc/source/guide/index.md                       |  11 +
 doc/source/guide/integrate-to-your-app.md       |  11 +
 doc/source/guide/intro/app-architecture.md      |  10 +
 doc/source/guide/intro/devtools.md              | 100 ++
 doc/source/guide/intro/how-it-works.md          |  12 +
 doc/source/guide/intro/index.md                 |  17 +
 doc/source/guide/intro/page-architecture.md     |  10 +
 doc/source/guide/intro/using-vue.md             |  10 +
 doc/source/guide/intro/web-dev-experience.md    |  11 +
 doc/source/guide/intro/write-once.md            |  10 +
 doc/source/index.md                             |   4 +
 doc/source/playground.ejs                       |   3 +
 doc/source/references/advanced/extend-jsfm.md   |  10 +
 .../references/advanced/extend-to-android.md    | 160 ++++
 .../references/advanced/extend-to-html5.md      |  10 +
 doc/source/references/advanced/extend-to-ios.md | 262 ++++++
 doc/source/references/advanced/index.md         |  15 +
 .../advanced/integrate-devtool-to-android.md    |  11 +
 .../advanced/integrate-devtool-to-ios.md        |  10 +
 doc/source/references/android-apis.md           |  10 +
 doc/source/references/color-names.md            | 182 ++++
 doc/source/references/common-event.md           | 129 +++
 doc/source/references/common-style.md           | 367 ++++++++
 doc/source/references/components/a.md           |  71 ++
 doc/source/references/components/cell.md        |  42 +
 doc/source/references/components/div.md         |  64 ++
 doc/source/references/components/image.md       | 107 +++
 doc/source/references/components/index.md       |  24 +
 doc/source/references/components/indicator.md   | 121 +++
 doc/source/references/components/input.md       | 156 ++++
 doc/source/references/components/list.md        | 175 ++++
 doc/source/references/components/refresh.md     | 216 +++++
 doc/source/references/components/scroller.md    | 152 +++
 doc/source/references/components/slider.md      |  93 ++
 doc/source/references/components/switch.md      | 117 +++
 doc/source/references/components/text.md        |  98 ++
 doc/source/references/components/textarea.md    | 142 +++
 doc/source/references/components/video.md       |  89 ++
 doc/source/references/components/web.md         | 149 +++
 doc/source/references/gesture.md                |  53 ++
 doc/source/references/html5-apis.md             |  10 +
 doc/source/references/images/css-boxmodel.png   | Bin 0 -> 12581 bytes
 .../references/images/css-flexbox-align.jpg     | Bin 0 -> 35005 bytes
 .../references/images/css-flexbox-justify.svg   |  59 ++
 .../references/images/css-flexbox-sample.png    | Bin 0 -> 3210 bytes
 doc/source/references/images/nav.png            | Bin 0 -> 83497 bytes
 doc/source/references/index.md                  |  17 +
 doc/source/references/ios-apis.md               |  12 +
 doc/source/references/js-service/index.md       | 114 +++
 doc/source/references/jsfm-apis.md              |  66 ++
 doc/source/references/migration/difference.md   |  10 +
 doc/source/references/migration/index.md        |  11 +
 .../references/migration/migration-from-weex.md |  10 +
 doc/source/references/modules/animation.md      | 106 +++
 doc/source/references/modules/clipboard.md      |  98 ++
 doc/source/references/modules/dom.md            | 204 ++++
 doc/source/references/modules/globalevent.md    |  89 ++
 doc/source/references/modules/index.md          |  29 +
 doc/source/references/modules/modal.md          | 144 +++
 doc/source/references/modules/navigator.md      |  89 ++
 doc/source/references/modules/picker.md         | 129 +++
 doc/source/references/modules/storage.md        | 172 ++++
 doc/source/references/modules/stream.md         | 131 +++
 doc/source/references/modules/webview.md        | 155 ++++
 doc/source/references/native-dom-api.md         |  11 +
 doc/source/references/path.md                   |  37 +
 doc/source/references/text-style.md             |  50 +
 doc/source/references/unit.md                   |  11 +
 doc/source/references/vue/difference-of-vuex.md |  10 +
 .../references/vue/difference-with-web.md       |  10 +
 doc/source/references/vue/index.md              |  11 +
 doc/source/references/web-standards.md          | 584 ++++++++++++
 doc/source/references/weex-variable.md          |  10 +
 doc/source/v-0.10/advanced/extend-to-android.md | 162 ++++
 doc/source/v-0.10/advanced/extend-to-html5.md   | 258 ++++++
 doc/source/v-0.10/advanced/extend-to-ios.md     | 272 ++++++
 .../v-0.10/advanced/how-data-binding-works.md   |  39 +
 doc/source/v-0.10/advanced/images/how-arch.png  | Bin 0 -> 62303 bytes
 .../v-0.10/advanced/images/how-render.png       | Bin 0 -> 42957 bytes
 doc/source/v-0.10/advanced/index.md             | 148 +++
 .../v-0.10/advanced/integrate-to-android.md     | 204 ++++
 .../v-0.10/advanced/integrate-to-html5.md       |  77 ++
 doc/source/v-0.10/advanced/integrate-to-ios.md  | 118 +++
 doc/source/v-0.10/guide/.gitkeep                |   0
 .../how-to/customize-a-native-component.md      |  58 ++
 .../guide/how-to/cuszomize-native-apis.md       |  80 ++
 .../v-0.10/guide/how-to/debug-with-html5.md     |  47 +
 doc/source/v-0.10/guide/how-to/index.md         |  40 +
 .../guide/how-to/preview-in-playground-app.md   |  20 +
 .../guide/how-to/require-3rd-party-libs.md      |  56 ++
 .../how-to/transform-code-into-js-bundle.md     | 110 +++
 .../v-0.10/guide/images/tut-cli-qrcode.png      | Bin 0 -> 45480 bytes
 doc/source/v-0.10/guide/images/tut-first.png    | Bin 0 -> 51434 bytes
 doc/source/v-0.10/guide/images/tut-second.png   | Bin 0 -> 78519 bytes
 doc/source/v-0.10/guide/images/tut1.jpg         | Bin 0 -> 47442 bytes
 doc/source/v-0.10/guide/images/tut2.jpg         | Bin 0 -> 52428 bytes
 doc/source/v-0.10/guide/images/tut3.png         | Bin 0 -> 52198 bytes
 doc/source/v-0.10/guide/images/tut4.gif         | Bin 0 -> 218245 bytes
 doc/source/v-0.10/guide/index.md                | 211 +++++
 doc/source/v-0.10/guide/syntax/comm.md          | 228 +++++
 .../v-0.10/guide/syntax/composed-component.md   | 114 +++
 doc/source/v-0.10/guide/syntax/config-n-data.md |  61 ++
 doc/source/v-0.10/guide/syntax/data-binding.md  | 248 +++++
 doc/source/v-0.10/guide/syntax/display-logic.md | 173 ++++
 doc/source/v-0.10/guide/syntax/events.md        |  59 ++
 doc/source/v-0.10/guide/syntax/id.md            |  65 ++
 doc/source/v-0.10/guide/syntax/index.md         | 122 +++
 doc/source/v-0.10/guide/syntax/render-logic.md  |  35 +
 doc/source/v-0.10/guide/syntax/style-n-class.md | 118 +++
 doc/source/v-0.10/references/api.md             |  84 ++
 doc/source/v-0.10/references/cheatsheet.md      | 102 ++
 doc/source/v-0.10/references/color-names.md     | 182 ++++
 doc/source/v-0.10/references/common-attrs.md    |  78 ++
 doc/source/v-0.10/references/common-event.md    | 120 +++
 doc/source/v-0.10/references/common-style.md    | 208 +++++
 doc/source/v-0.10/references/component-defs.md  | 131 +++
 doc/source/v-0.10/references/components/a.md    |  50 +
 doc/source/v-0.10/references/components/cell.md |  42 +
 doc/source/v-0.10/references/components/div.md  |  48 +
 .../v-0.10/references/components/image.md       |  55 ++
 .../v-0.10/references/components/index.md       |  24 +
 .../v-0.10/references/components/indicator.md   |  98 ++
 .../v-0.10/references/components/input.md       | 124 +++
 doc/source/v-0.10/references/components/list.md | 293 ++++++
 .../references/components/refresh-loading.md    | 298 ++++++
 .../v-0.10/references/components/scroller.md    | 136 +++
 .../v-0.10/references/components/slider.md      | 107 +++
 .../v-0.10/references/components/switch.md      |  81 ++
 doc/source/v-0.10/references/components/text.md |  94 ++
 .../v-0.10/references/components/textarea.md    |  81 ++
 .../v-0.10/references/components/video.md       |  75 ++
 doc/source/v-0.10/references/components/web.md  | 152 +++
 .../v-0.10/references/components/wxc-navpage.md |  74 ++
 .../v-0.10/references/components/wxc-tabbar.md  |  94 ++
 doc/source/v-0.10/references/gesture.md         |  74 ++
 .../v-0.10/references/images/css-boxmodel.png   | Bin 0 -> 12581 bytes
 .../references/images/css-flexbox-align.jpg     | Bin 0 -> 35005 bytes
 .../references/images/css-flexbox-justify.svg   |  59 ++
 .../references/images/css-flexbox-sample.png    | Bin 0 -> 3210 bytes
 doc/source/v-0.10/references/images/nav.png     | Bin 0 -> 83497 bytes
 doc/source/v-0.10/references/index.md           |  49 +
 .../v-0.10/references/modules/animation.md      |  63 ++
 .../v-0.10/references/modules/clipboard.md      |  53 ++
 doc/source/v-0.10/references/modules/dom.md     | 114 +++
 .../v-0.10/references/modules/globalevent.md    |  89 ++
 doc/source/v-0.10/references/modules/index.md   |  28 +
 doc/source/v-0.10/references/modules/modal.md   | 192 ++++
 .../v-0.10/references/modules/navigator.md      | 198 ++++
 doc/source/v-0.10/references/modules/storage.md | 111 +++
 doc/source/v-0.10/references/modules/stream.md  |  86 ++
 doc/source/v-0.10/references/modules/timer.md   |  60 ++
 doc/source/v-0.10/references/modules/webview.md | 160 ++++
 doc/source/v-0.10/references/special-element.md |  36 +
 doc/source/v-0.10/references/specs/index.md     | 309 +++++++
 .../v-0.10/references/specs/js-bundle-format.md | 307 ++++++
 .../references/specs/js-framework-apis.md       | 191 ++++
 .../v-0.10/references/specs/virtual-dom-apis.md | 147 +++
 doc/source/v-0.10/references/text-style.md      |  43 +
 doc/source/v-0.10/tools/devtools-android.md     | 123 +++
 doc/source/v-0.10/tools/devtools-ios.md         |  76 ++
 doc/source/v-0.10/tools/devtools.md             | 102 ++
 doc/source/v-0.10/tools/index.md                |  97 ++
 doc/source/v-0.10/tools/playground.md           |  24 +
 doc/source/v-0.10/tools/transformer.md          |  38 +
 doc/specs/js-bundle-format.md                   | 300 ------
 doc/specs/js-framework-apis.md                  | 184 ----
 doc/specs/virtual-dom-apis.md                   | 140 ---
 doc/syntax/comm.md                              | 222 -----
 doc/syntax/composed-component.md                | 108 ---
 doc/syntax/config-n-data.md                     |  55 --
 doc/syntax/data-binding.md                      | 241 -----
 doc/syntax/display-logic.md                     | 169 ----
 doc/syntax/events.md                            |  54 --
 doc/syntax/id.md                                |  59 --
 doc/syntax/main.md                              | 116 ---
 doc/syntax/render-logic.md                      |  29 -
 doc/syntax/style-n-class.md                     | 106 ---
 doc/themes/weex/_config.yml                     |  42 +
 doc/themes/weex/languages/cn.yml                | 103 +++
 doc/themes/weex/languages/en.yml                | 104 +++
 .../weex/layout/_partial/after-footer.ejs       |   3 +
 .../weex/layout/_partial/archive-post.ejs       |  11 +
 doc/themes/weex/layout/_partial/archive.ejs     |  19 +
 doc/themes/weex/layout/_partial/article.ejs     |  11 +
 doc/themes/weex/layout/_partial/footer.ejs      |  28 +
 doc/themes/weex/layout/_partial/head.ejs        |  36 +
 doc/themes/weex/layout/_partial/header.ejs      |  49 +
 .../weex/layout/_partial/post/category.ejs      |  10 +
 doc/themes/weex/layout/_partial/post/nav.ejs    |   8 +
 .../weex/layout/_partial/post/summary.ejs       |  43 +
 doc/themes/weex/layout/_partial/post/title.ejs  |  18 +
 doc/themes/weex/layout/_partial/search-form.ejs |   8 +
 doc/themes/weex/layout/_partial/sidebar.ejs     |  56 ++
 doc/themes/weex/layout/_partial/slider.ejs      |  17 +
 doc/themes/weex/layout/archive.ejs              |   3 +
 doc/themes/weex/layout/blog.ejs                 |   3 +
 doc/themes/weex/layout/category.ejs             |   1 +
 doc/themes/weex/layout/download.ejs             |  20 +
 doc/themes/weex/layout/example.ejs              |  40 +
 doc/themes/weex/layout/index.ejs                | 211 +++++
 doc/themes/weex/layout/layout.ejs               |  17 +
 doc/themes/weex/layout/page.ejs                 |   6 +
 doc/themes/weex/layout/playground.ejs           |  30 +
 doc/themes/weex/layout/post.ejs                 |   3 +
 doc/themes/weex/layout/tag.ejs                  |   1 +
 doc/themes/weex/scripts/helper.js               |  38 +
 doc/themes/weex/source/css/animation.scss       | 250 +++++
 doc/themes/weex/source/css/atom-one-dark.scss   |  96 ++
 doc/themes/weex/source/css/blog.scss            |  36 +
 doc/themes/weex/source/css/common.scss          | 250 +++++
 doc/themes/weex/source/css/example.scss         | 103 +++
 doc/themes/weex/source/css/index.scss           | 540 +++++++++++
 doc/themes/weex/source/css/media-queries.scss   | 190 ++++
 .../weex/source/css/partial/article-title.scss  |  28 +
 doc/themes/weex/source/css/partial/article.scss |  68 ++
 doc/themes/weex/source/css/partial/footer.scss  |  62 ++
 doc/themes/weex/source/css/partial/header.scss  | 104 +++
 .../weex/source/css/partial/highlight.scss      | 108 +++
 .../weex/source/css/partial/search-form.scss    |  74 ++
 doc/themes/weex/source/css/partial/sidebar.scss |  74 ++
 doc/themes/weex/source/css/partial/summary.scss |  48 +
 doc/themes/weex/source/css/playground.scss      |  50 +
 doc/themes/weex/source/css/post.scss            |  66 ++
 doc/themes/weex/source/css/style.scss           |  28 +
 doc/themes/weex/source/css/swiper.min.css       |  15 +
 doc/themes/weex/source/css/variable.scss        |  40 +
 doc/themes/weex/source/images/_slide1.png       | Bin 0 -> 381001 bytes
 .../weex/source/images/ali-open-source.png      | Bin 0 -> 2193 bytes
 doc/themes/weex/source/images/alibaba.png       | Bin 0 -> 2107 bytes
 doc/themes/weex/source/images/aliyun.png        | Bin 0 -> 1292 bytes
 doc/themes/weex/source/images/android.png       | Bin 0 -> 5973 bytes
 doc/themes/weex/source/images/avatar.png        | Bin 0 -> 32736 bytes
 doc/themes/weex/source/images/cainiao.png       | Bin 0 -> 3353 bytes
 doc/themes/weex/source/images/ding.png          | Bin 0 -> 5929 bytes
 doc/themes/weex/source/images/extendable.svg    |  51 +
 doc/themes/weex/source/images/feature.png       | Bin 0 -> 1090905 bytes
 doc/themes/weex/source/images/feizhu.jpg        | Bin 0 -> 5988 bytes
 doc/themes/weex/source/images/flow.png          | Bin 0 -> 14440 bytes
 doc/themes/weex/source/images/galaxy_1.svg      |  53 ++
 doc/themes/weex/source/images/galaxy_2.svg      |  53 ++
 doc/themes/weex/source/images/ios.png           | Bin 0 -> 6272 bytes
 doc/themes/weex/source/images/level1.png        | Bin 0 -> 14951 bytes
 doc/themes/weex/source/images/level2.png        | Bin 0 -> 101449 bytes
 doc/themes/weex/source/images/level3.png        | Bin 0 -> 101212 bytes
 doc/themes/weex/source/images/level4.png        | Bin 0 -> 339831 bytes
 doc/themes/weex/source/images/lightweight.svg   |  31 +
 doc/themes/weex/source/images/logo.png          | Bin 0 -> 5398 bytes
 doc/themes/weex/source/images/logo.svg          |  29 +
 doc/themes/weex/source/images/performance.svg   |  29 +
 doc/themes/weex/source/images/playground.png    | Bin 0 -> 12659 bytes
 doc/themes/weex/source/images/qr.png            | Bin 0 -> 1801 bytes
 doc/themes/weex/source/images/slide1.png        | Bin 0 -> 226303 bytes
 doc/themes/weex/source/images/taobao.png        | Bin 0 -> 3074 bytes
 doc/themes/weex/source/images/tmall.png         | Bin 0 -> 8562 bytes
 doc/themes/weex/source/images/vue-logo.png      | Bin 0 -> 5346 bytes
 doc/themes/weex/source/images/vue.png           | Bin 0 -> 16582 bytes
 doc/themes/weex/source/images/web.png           | Bin 0 -> 9297 bytes
 doc/themes/weex/source/images/xiami.png         | Bin 0 -> 2615 bytes
 doc/themes/weex/source/images/youku.png         | Bin 0 -> 2178 bytes
 doc/themes/weex/source/js/common.js             | 522 +++++++++++
 doc/themes/weex/source/js/example.js            |  37 +
 doc/themes/weex/source/js/examples/a.web.js     | 528 +++++++++++
 doc/themes/weex/source/js/examples/a.weex.js    | 198 ++++
 .../weex/source/js/examples/animation.web.js    | 569 ++++++++++++
 .../weex/source/js/examples/animation.weex.js   | 224 +++++
 .../weex/source/js/examples/clipboard.web.js    | 583 ++++++++++++
 .../weex/source/js/examples/clipboard.weex.js   | 249 +++++
 doc/themes/weex/source/js/examples/div.web.js   | 523 +++++++++++
 doc/themes/weex/source/js/examples/div.weex.js  | 183 ++++
 .../weex/source/js/examples/dom-rect.web.js     | 589 ++++++++++++
 .../weex/source/js/examples/dom-rect.weex.js    | 254 +++++
 .../weex/source/js/examples/dom-scroll.web.js   | 598 ++++++++++++
 .../weex/source/js/examples/dom-scroll.weex.js  | 288 ++++++
 doc/themes/weex/source/js/examples/image.web.js | 542 +++++++++++
 .../weex/source/js/examples/image.weex.js       | 225 +++++
 .../weex/source/js/examples/indicator.web.js    | 618 +++++++++++++
 .../weex/source/js/examples/indicator.weex.js   | 307 ++++++
 doc/themes/weex/source/js/examples/input.web.js | 586 ++++++++++++
 .../weex/source/js/examples/input.weex.js       | 251 +++++
 doc/themes/weex/source/js/examples/list.web.js  | 584 ++++++++++++
 doc/themes/weex/source/js/examples/list.weex.js | 252 +++++
 doc/themes/weex/source/js/examples/modal.web.js | 604 ++++++++++++
 .../weex/source/js/examples/modal.weex.js       | 272 ++++++
 .../weex/source/js/examples/navigator.web.js    | 562 +++++++++++
 .../weex/source/js/examples/navigator.weex.js   | 230 +++++
 .../weex/source/js/examples/refresh.web.js      | 594 ++++++++++++
 .../weex/source/js/examples/refresh.weex.js     | 267 ++++++
 .../weex/source/js/examples/scroller.web.js     | 598 ++++++++++++
 .../weex/source/js/examples/scroller.weex.js    | 288 ++++++
 .../weex/source/js/examples/slider.web.js       | 587 ++++++++++++
 .../weex/source/js/examples/slider.weex.js      | 255 +++++
 .../weex/source/js/examples/storage.web.js      | 634 +++++++++++++
 .../weex/source/js/examples/storage.weex.js     | 317 +++++++
 .../weex/source/js/examples/stream.web.js       | 590 ++++++++++++
 .../weex/source/js/examples/stream.weex.js      | 259 ++++++
 .../weex/source/js/examples/switch.web.js       | 605 ++++++++++++
 .../weex/source/js/examples/switch.weex.js      | 280 ++++++
 doc/themes/weex/source/js/examples/text.web.js  | 535 +++++++++++
 doc/themes/weex/source/js/examples/text.weex.js | 208 +++++
 .../weex/source/js/examples/textarea.web.js     | 582 ++++++++++++
 .../weex/source/js/examples/textarea.weex.js    | 247 +++++
 doc/themes/weex/source/js/examples/video.web.js | 593 ++++++++++++
 .../weex/source/js/examples/video.weex.js       | 254 +++++
 doc/themes/weex/source/js/examples/web.web.js   | 923 +++++++++++++++++++
 doc/themes/weex/source/js/examples/web.weex.js  | 600 ++++++++++++
 doc/themes/weex/source/js/highlight.pack.js     |   2 +
 doc/themes/weex/source/js/mobile-detect.js      |   3 +
 doc/themes/weex/source/js/qrcode.min.js         |   1 +
 doc/themes/weex/source/js/reqwest.js            |   7 +
 doc/themes/weex/source/js/swiper.min.js         |  18 +
 doc/themes/weex/source/js/velocity.js           |   5 +
 doc/tools/README.md                             |   6 -
 doc/tools/cli.md                                |  90 --
 doc/tools/devtools-android.md                   | 116 ---
 doc/tools/devtools-ios.md                       |  69 --
 doc/tools/devtools.md                           |  94 --
 doc/tools/how-to-debug.md                       |  45 -
 doc/tools/main.md                               |  10 -
 doc/tools/playground-app.md                     |  17 -
 doc/tools/transformer.md                        |  30 -
 doc/tutorial.md                                 | 206 -----
 doc/tutorial_source/tech_list.we                |  22 -
 doc/tutorial_source/tech_list_0.we              |  15 -
 doc/tutorial_source/tech_list_1.we              |  24 -
 doc/tutorial_source/tech_list_2.we              |  62 --
 examples/component/scroller-demo.we             |   2 +-
 examples/index.we                               |   1 +
 examples/linear-gradient.we                     |  70 ++
 .../xcshareddata/xcschemes/WeexDemo.xcscheme    |   2 +-
 ios/sdk/WeexSDK.podspec                         |   2 +-
 .../Sources/Manager/WXComponentFactory.m        |   1 +
 709 files changed, 60151 insertions(+), 9025 deletions(-)
----------------------------------------------------------------------




[11/50] [abbrv] incubator-weex git commit: V0.10.0 stable gitlab (#178)

Posted by ji...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Loader/WXResourceLoader.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Loader/WXResourceLoader.m b/ios/sdk/WeexSDK/Sources/Loader/WXResourceLoader.m
new file mode 100644
index 0000000..24609ac
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Loader/WXResourceLoader.m
@@ -0,0 +1,174 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+#import "WXResourceLoader.h"
+#import "WXResourceRequestHandler.h"
+#import "WXSDKInstance.h"
+#import "WXLog.h"
+#import "WXHandlerFactory.h"
+#import "WXSDKError.h"
+
+//deprecated
+#import "WXNetworkProtocol.h"
+
+@interface WXResourceLoader () <WXResourceRequestDelegate>
+
+@end
+
+@implementation WXResourceLoader
+{
+    NSMutableData *_data;
+    WXResourceResponse *_response;
+}
+
+- (instancetype)initWithRequest:(WXResourceRequest *)request
+{
+    if (self = [super init]) {
+        self.request = request;
+    }
+    
+    return self;
+}
+
+- (void)setRequest:(WXResourceRequest *)request
+{
+    if (_request) {
+        [self cancel:nil];
+    }
+    
+    _request = request;
+}
+
+- (void)start
+{
+    if ([_request.URL isFileURL]) {
+        [self _handleFileURL:_request.URL];
+        return;
+    }
+    
+    id<WXResourceRequestHandler> requestHandler = [WXHandlerFactory handlerForProtocol:@protocol(WXResourceRequestHandler)];
+    if (requestHandler) {
+        [requestHandler sendRequest:_request withDelegate:self];
+    } else if ([WXHandlerFactory handlerForProtocol:NSProtocolFromString(@"WXNetworkProtocol")]){
+        // deprecated logic
+        [self _handleDEPRECATEDNetworkHandler];
+    } else {
+        WXLogError(@"No resource request handler found!");
+    }
+}
+
+- (void)cancel:(NSError *__autoreleasing *)error
+{
+    id<WXResourceRequestHandler> requestHandler = [WXHandlerFactory handlerForProtocol:@protocol(WXResourceRequestHandler)];
+    if ([requestHandler respondsToSelector:@selector(cancelRequest:)]) {
+        [requestHandler cancelRequest:_request];
+    } else if (error) {
+        *error = [NSError errorWithDomain:WX_ERROR_DOMAIN code:WX_ERR_CANCEL userInfo:@{NSLocalizedDescriptionKey: @"handle:%@ not respond to cancelRequest"}];
+    }
+}
+
+- (void)_handleFileURL:(NSURL *)url
+{
+    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+        NSData *fileData = [[NSFileManager defaultManager] contentsAtPath:[url path]];
+        if (self.onFinished) {
+            self.onFinished([WXResourceResponse new], fileData);
+        }
+    });
+}
+
+- (void)_handleDEPRECATEDNetworkHandler
+{
+    WXLogWarning(@"WXNetworkProtocol is deprecated, use WXResourceRequestHandler instead!");
+    id networkHandler = [WXHandlerFactory handlerForProtocol:NSProtocolFromString(@"WXNetworkProtocol")];
+    __weak typeof(self) weakSelf = self;
+    [networkHandler sendRequest:_request withSendingData:^(int64_t bytesSent, int64_t totalBytes) {
+        if (weakSelf.onDataSent) {
+            weakSelf.onDataSent(bytesSent, totalBytes);
+        }
+    } withResponse:^(NSURLResponse *response) {
+        _response = (WXResourceResponse *)response;
+        if (weakSelf.onResponseReceived) {
+            weakSelf.onResponseReceived((WXResourceResponse *)response);
+        }
+    } withReceiveData:^(NSData *data) {
+        if (weakSelf.onDataReceived) {
+            weakSelf.onDataReceived(data);
+        }
+    } withCompeletion:^(NSData *totalData, NSError *error) {
+        if (error) {
+            if (weakSelf.onFailed) {
+                weakSelf.onFailed(error);
+            }
+        } else {
+            weakSelf.onFinished(_response, totalData);
+            _response = nil;
+        }
+    }];
+}
+
+#pragma mark - WXResourceRequestDelegate
+
+- (void)request:(WXResourceRequest *)request didSendData:(unsigned long long)bytesSent totalBytesToBeSent:(unsigned long long)totalBytesToBeSent
+{
+    WXLogDebug(@"request:%@ didSendData:%llu totalBytesToBeSent:%llu", request, bytesSent, totalBytesToBeSent);
+    
+    if (self.onDataSent) {
+        self.onDataSent(bytesSent, totalBytesToBeSent);
+    }
+}
+
+- (void)request:(WXResourceRequest *)request didReceiveResponse:(WXResourceResponse *)response
+{
+    WXLogDebug(@"request:%@ didReceiveResponse:%@ ", request, response);
+    
+    _response = response;
+    
+    if (self.onResponseReceived) {
+        self.onResponseReceived(response);
+    }
+}
+
+- (void)request:(WXResourceRequest *)request didReceiveData:(NSData *)data
+{
+    WXLogDebug(@"request:%@ didReceiveDataLength:%ld", request, (unsigned long)data.length);
+    
+    if (!_data) {
+        _data = [NSMutableData new];
+    }
+    [_data appendData:data];
+    
+    if (self.onDataReceived) {
+        self.onDataReceived(data);
+    }
+}
+
+- (void)requestDidFinishLoading:(WXResourceRequest *)request
+{
+    WXLogDebug(@"request:%@ requestDidFinishLoading", request);
+    
+    if (self.onFinished) {
+        self.onFinished(_response, _data);
+    }
+    
+    _data = nil;
+    _response = nil;
+}
+
+- (void)request:(WXResourceRequest *)request didFailWithError:(NSError *)error
+{
+    WXLogDebug(@"request:%@ didFailWithError:%@", request, error.localizedDescription);
+    
+    if (self.onFailed) {
+        self.onFailed(error);
+    }
+    
+    _data = nil;
+    _response = nil;
+}
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Loader/WXWebSocketLoader.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Loader/WXWebSocketLoader.h b/ios/sdk/WeexSDK/Sources/Loader/WXWebSocketLoader.h
new file mode 100644
index 0000000..81e8514
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Loader/WXWebSocketLoader.h
@@ -0,0 +1,24 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+
+#import <Foundation/Foundation.h>
+
+@interface WXWebSocketLoader : NSObject<NSCopying>
+
+@property (nonatomic, copy) void (^onOpen)();
+@property (nonatomic, copy) void (^onReceiveMessage)(id);
+@property (nonatomic, copy) void (^onClose)(NSInteger,NSString *,BOOL);
+@property (nonatomic, copy) void (^onFail)(NSError *);
+
+- (instancetype)initWithUrl:(NSString *)url protocol:(NSString *)protocol;
+- (void)open;
+- (void)send:(NSString *)data;
+- (void)close;
+- (void)close:(NSInteger)code reason:(NSString *)reason;
+- (void)clear;
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Loader/WXWebSocketLoader.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Loader/WXWebSocketLoader.m b/ios/sdk/WeexSDK/Sources/Loader/WXWebSocketLoader.m
new file mode 100644
index 0000000..16b1e9a
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Loader/WXWebSocketLoader.m
@@ -0,0 +1,131 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+
+#import "WXWebSocketLoader.h"
+#import "WXWebSocketHandler.h"
+#import "WXHandlerFactory.h"
+#import "WXLog.h"
+
+@interface WXWebSocketLoader () <WXWebSocketDelegate>
+@property (nonatomic, copy) NSString *identifier;
+@property (nonatomic, copy) NSString *url;
+@property (nonatomic, copy) NSString *protocol;
+@end
+
+@implementation WXWebSocketLoader
+
+- (instancetype)initWithUrl:(NSString *)url protocol:(NSString *)protocol
+{
+    if (self = [super init]) {
+        self.url = url;
+        self.protocol = protocol;
+    }
+    return self;
+}
+
+-(id)copyWithZone:(NSZone *)zone {
+    
+    WXWebSocketLoader *newClass = [[WXWebSocketLoader alloc]init];
+    newClass.onOpen = self.onOpen;
+    newClass.onReceiveMessage = self.onReceiveMessage;
+    newClass.onFail = self.onFail;
+    newClass.onClose = self.onClose;
+    newClass.protocol = self.protocol;
+    newClass.url = self.url;
+    newClass.identifier = self.identifier;
+    return newClass;
+}
+
+-(NSString *)identifier
+{
+    if(!_identifier)
+    {
+        CFUUIDRef uuid = CFUUIDCreate(NULL);
+        _identifier = CFBridgingRelease(CFUUIDCreateString(NULL, uuid));
+        assert(_identifier);
+        CFRelease(uuid);
+    }
+    return _identifier;
+}
+
+- (void)open
+{
+    id<WXWebSocketHandler> requestHandler = [WXHandlerFactory handlerForProtocol:@protocol(WXWebSocketHandler)];
+    if (requestHandler) {
+        [requestHandler open:self.url protocol:self.protocol identifier:self.identifier withDelegate:self];
+    } else {
+        WXLogError(@"No resource request handler found!");
+    }
+}
+
+- (void)send:(NSString *)data
+{
+    id<WXWebSocketHandler> requestHandler = [WXHandlerFactory handlerForProtocol:@protocol(WXWebSocketHandler)];
+    if (requestHandler) {
+        [requestHandler send:self.identifier data:data];
+    } else {
+        WXLogError(@"No resource request handler found!");
+    }
+}
+
+- (void)close
+{
+    id<WXWebSocketHandler> requestHandler = [WXHandlerFactory handlerForProtocol:@protocol(WXWebSocketHandler)];
+    if (requestHandler) {
+        [requestHandler close:self.identifier];
+    } else {
+        WXLogError(@"No resource request handler found!");
+    }
+}
+
+- (void)clear
+{
+    id<WXWebSocketHandler> requestHandler = [WXHandlerFactory handlerForProtocol:@protocol(WXWebSocketHandler)];
+    if (requestHandler) {
+        [requestHandler clear:self.identifier];
+    } else {
+        WXLogError(@"No resource request handler found!");
+    }
+}
+
+- (void)close:(NSInteger)code reason:(NSString *)reason
+{
+    id<WXWebSocketHandler> requestHandler = [WXHandlerFactory handlerForProtocol:@protocol(WXWebSocketHandler)];
+    if (requestHandler) {
+        [requestHandler close:self.identifier code:code reason:reason];
+    } else {
+        WXLogError(@"No resource request handler found!");
+    }
+}
+
+#pragma mark - WXWebSocketDelegate
+- (void)didOpen
+{
+    if (self.onOpen) {
+        self.onOpen();
+    }
+}
+- (void)didFailWithError:(NSError *)error
+{
+    if(self.onFail) {
+        self.onFail(error);
+    }
+}
+- (void)didReceiveMessage:(id)message
+{
+    if (self.onReceiveMessage) {
+        self.onReceiveMessage(message);
+    }
+}
+- (void)didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean
+{
+    if (self.onClose) {
+        self.onClose(code,reason,wasClean);
+    }
+}
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.h b/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.h
index 8576d35..81a63fe 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.h
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.h
@@ -68,10 +68,28 @@
 - (void)executeJsFramework:(NSString *)script;
 
 /**
- *  Execute JS Method
- *  @param method    :   object of bridge method
+ *  Register JS service Script
+ *  @param name      :   service name
+ *  @param script    :   script code
+ *  @param options   :   service options
+ **/
+- (void)registerService:(NSString *)name withService:(NSString *)serviceScript withOptions:(NSDictionary *)options;
+
+
+/**
+ *  Register JS service Script
+ *  @param name         :   service name
+ *  @param scriptUrl    :   script url
+ *  @param options      :   service options
+ **/
+
+-(void)registerService:(NSString *)name withServiceUrl:(NSURL *)serviceScriptUrl withOptions:(NSDictionary *)options;
+
+/**
+ *  Unregister JS service Script
+ *  @param script    :   script code
  **/
-- (void)executeJsMethod:(WXBridgeMethod *)method;
+- (void)unregisterService:(NSString *)name;
 
 /**
  *  Register Modules Method
@@ -85,8 +103,6 @@
  **/
 - (void)registerComponents:(NSArray* )components;
 
-- (void)fireEvent:(NSString *)instanceId ref:(NSString *)ref type:(NSString *)type params:(NSDictionary *)params DEPRECATED_MSG_ATTRIBUTE("Use fireEvent:ref:type:params:domChanges: method instead.");
-
 /**
  *  FireEvent
  *  @param instanceId:   instance id
@@ -139,4 +155,7 @@
  **/
 - (void)resetEnvironment;
 
+- (void)fireEvent:(NSString *)instanceId ref:(NSString *)ref type:(NSString *)type params:(NSDictionary *)params DEPRECATED_MSG_ATTRIBUTE("Use fireEvent:ref:type:params:domChanges: method instead.");
+- (void)executeJsMethod:(WXBridgeMethod *)method DEPRECATED_MSG_ATTRIBUTE();
+
 @end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.m b/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.m
index 6fb2ac0..8d181b5 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.m
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.m
@@ -11,6 +11,11 @@
 #import "WXLog.h"
 #import "WXAssert.h"
 #import "WXBridgeMethod.h"
+#import "WXCallJSMethod.h"
+#import "WXSDKManager.h"
+#import "WXServiceFactory.h"
+#import "WXResourceRequest.h"
+#import "WXResourceLoader.h"
 
 @interface WXBridgeManager ()
 
@@ -74,6 +79,7 @@ static NSThread *WXBridgeThread;
 {
     static dispatch_once_t onceToken;
     dispatch_once(&onceToken, ^{
+        
         WXBridgeThread = [[NSThread alloc] initWithTarget:[[self class]sharedManager] selector:@selector(_runLoopThread) object:nil];
         [WXBridgeThread setName:WX_BRIDGE_THREAD_NAME];
         if(WX_SYS_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) {
@@ -188,7 +194,7 @@ void WXPerformBlockOnBridgeThread(void (^block)())
     });
 }
 
-- (void)executeJsMethod:(WXBridgeMethod *)method
+- (void)callJsMethod:(WXCallJSMethod *)method
 {
     if (!method) return;
     
@@ -198,6 +204,49 @@ void WXPerformBlockOnBridgeThread(void (^block)())
     });
 }
 
+-(void)registerService:(NSString *)name withServiceUrl:(NSURL *)serviceScriptUrl withOptions:(NSDictionary *)options
+{
+    if (!name || !serviceScriptUrl || !options) return;
+    __weak typeof(self) weakSelf = self;
+    WXResourceRequest *request = [WXResourceRequest requestWithURL:serviceScriptUrl resourceType:WXResourceTypeServiceBundle referrer:@"" cachePolicy:NSURLRequestUseProtocolCachePolicy];
+    WXResourceLoader *serviceBundleLoader = [[WXResourceLoader alloc] initWithRequest:request];;
+    serviceBundleLoader.onFinished = ^(WXResourceResponse *response, NSData *data) {
+        __strong typeof(weakSelf) strongSelf = weakSelf;
+        NSString *jsServiceString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+        [strongSelf registerService:name withService:jsServiceString withOptions:options];
+    };
+    
+    serviceBundleLoader.onFailed = ^(NSError *loadError) {
+        WXLogError(@"No script URL found");
+    };
+    
+    [serviceBundleLoader start];
+}
+
+- (void)registerService:(NSString *)name withService:(NSString *)serviceScript withOptions:(NSDictionary *)options
+{
+    if (!name || !serviceScript || !options) return;
+    
+    NSString *script = [WXServiceFactory registerServiceScript:name withRawScript:serviceScript withOptions:options];
+    
+    __weak typeof(self) weakSelf = self;
+    WXPerformBlockOnBridgeThread(^(){
+        [weakSelf.bridgeCtx executeJsService:script withName:name];
+    });
+}
+
+- (void)unregisterService:(NSString *)name
+{
+    if (!name) return;
+    
+    NSString *script = [WXServiceFactory unregisterServiceScript:name];
+    
+    __weak typeof(self) weakSelf = self;
+    WXPerformBlockOnBridgeThread(^(){
+        [weakSelf.bridgeCtx executeJsService:script withName:name];
+    });
+}
+
 - (void)registerModules:(NSDictionary *)modules
 {
     if (!modules) return;
@@ -231,28 +280,24 @@ void WXPerformBlockOnBridgeThread(void (^block)())
     }
     
     NSArray *args = @[ref, type, params?:@{}, domChanges?:@{}];
-    NSMutableDictionary *methodDict = [NSMutableDictionary dictionaryWithObjectsAndKeys:
-                                       @"fireEvent", @"method",
-                                       args, @"args", nil];
-    WXBridgeMethod *method = [[WXBridgeMethod alloc] initWithInstance:instanceId data:methodDict];
-    [self executeJsMethod:method];
+    WXSDKInstance *instance = [WXSDKManager instanceForID:instanceId];
+    
+    WXCallJSMethod *method = [[WXCallJSMethod alloc] initWithModuleName:nil methodName:@"fireEvent" arguments:args instance:instance];
+    [self callJsMethod:method];
 }
 
-- (void)callBack:(NSString *)instanceId funcId:(NSString *)funcId params:(id)params keepAlive:(BOOL)keepAlive {
+- (void)callBack:(NSString *)instanceId funcId:(NSString *)funcId params:(id)params keepAlive:(BOOL)keepAlive
+{
     NSArray *args = nil;
     if (keepAlive) {
         args = @[[funcId copy], params? [params copy]:@"\"{}\"", @true];
     }else {
         args = @[[funcId copy], params? [params copy]:@"\"{}\""];
     }
-    NSMutableDictionary *methodDict = [NSMutableDictionary dictionaryWithObjectsAndKeys:
-                                       @"callback", @"method",
-                                       @"jsBridge",@"module",
-                                       args, @"args", nil];
-    
-    WXBridgeMethod *method = [[WXBridgeMethod alloc] initWithInstance:instanceId data:methodDict];
-    
-    [self executeJsMethod:method];
+    WXSDKInstance *instance = [WXSDKManager instanceForID:instanceId];
+
+    WXCallJSMethod *method = [[WXCallJSMethod alloc] initWithModuleName:@"jsBridge" methodName:@"callback" arguments:args instance:instance];
+    [self callJsMethod:method];
 }
 
 - (void)callBack:(NSString *)instanceId funcId:(NSString *)funcId params:(id)params
@@ -290,4 +335,16 @@ void WXPerformBlockOnBridgeThread(void (^block)())
     });
 }
 
+#pragma mark - Deprecated
+
+- (void)executeJsMethod:(WXCallJSMethod *)method
+{
+    if (!method) return;
+    
+    __weak typeof(self) weakSelf = self;
+    WXPerformBlockOnBridgeThread(^(){
+        [weakSelf.bridgeCtx executeJsMethod:method];
+    });
+}
+
 @end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Manager/WXComponentFactory.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXComponentFactory.m b/ios/sdk/WeexSDK/Sources/Manager/WXComponentFactory.m
index 8c55cdf..d3c972a 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXComponentFactory.m
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXComponentFactory.m
@@ -117,7 +117,7 @@
     void (^mBlock)(id, id, BOOL *) = ^(id mKey, id mObj, BOOL * mStop) {
         [methods addObject:mKey];
     };
-    [config.methods enumerateKeysAndObjectsUsingBlock:mBlock];
+    [config.asyncMethods enumerateKeysAndObjectsUsingBlock:mBlock];
     [_configLock unlock];
     
     return dict;
@@ -132,8 +132,8 @@
     
     [_configLock lock];
     config = [_componentConfigs objectForKey:name];
-    if (config.methods) {
-        selStr = [config.methods objectForKey:method];
+    if (config.asyncMethods) {
+        selStr = [config.asyncMethods objectForKey:method];
     }
     if (selStr) {
         selector = NSSelectorFromString(selStr);

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.h b/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.h
index 1afb054..b02a18b 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.h
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.h
@@ -87,6 +87,16 @@ extern void WXPerformBlockOnComponentThread(void (^block)());
  **/
 - (void)updateStyles:(NSDictionary *)styles forComponent:(NSString *)ref;
 
+///--------------------------------------
+/// @name Updating pseudo class
+///--------------------------------------
+
+/**
+ * @abstract update  pseudo class styles
+ **/
+
+- (void)updatePseudoClassStyles:(NSDictionary *)styles forComponent:(NSString *)ref;
+
 /**
  * @abstract update attributes
  **/
@@ -107,8 +117,6 @@ extern void WXPerformBlockOnComponentThread(void (^block)());
  **/
 - (void)scrollToComponent:(NSString *)ref options:(NSDictionary *)options;
 
-- (void)dispatchComponentMethod:(WXBridgeMethod*)method;
-
 ///--------------------------------------
 /// @name Life Cycle
 ///--------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/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 e292c63..65f6e69 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.m
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.m
@@ -273,6 +273,21 @@ static css_node_t * rootNodeGetChild(void *context, int i)
         }
         [component removeFromSuperview];
     }];
+    
+    [self _checkFixedSubcomponentToRemove:component];
+}
+
+- (void)_checkFixedSubcomponentToRemove:(WXComponent *)component
+{
+    for (WXComponent *subcomponent in component.subcomponents) {
+        if (subcomponent->_positionType == WXPositionTypeFixed) {
+             [self _addUITask:^{
+                 [subcomponent removeFromSuperview];
+             }];
+        }
+        
+        [self _checkFixedSubcomponentToRemove:subcomponent];
+    }
 }
 
 - (WXComponent *)componentForRef:(NSString *)ref
@@ -301,7 +316,7 @@ static css_node_t * rootNodeGetChild(void *context, int i)
     NSDictionary *styles = data[@"style"];
     NSDictionary *attributes = data[@"attr"];
     NSArray *events = data[@"event"];
-    
+        
     Class clazz = [WXComponentFactory classWithComponentName:type];
     WXComponent *component = [[clazz alloc] initWithRef:ref type:type styles:styles attributes:attributes events:events weexInstance:self.weexInstance];
     WXAssert(component, @"Component build failed for data:%@", data);
@@ -338,6 +353,16 @@ static css_node_t * rootNodeGetChild(void *context, int i)
 
 - (void)updateStyles:(NSDictionary *)styles forComponent:(NSString *)ref
 {
+    [self handleStyles:styles forComponent:ref isUpdateStyles:YES];
+}
+
+- (void)updatePseudoClassStyles:(NSDictionary *)styles forComponent:(NSString *)ref
+{
+    [self handleStyles:styles forComponent:ref isUpdateStyles:NO];
+}
+
+- (void)handleStyles:(NSDictionary *)styles forComponent:(NSString *)ref isUpdateStyles:(BOOL)isUpdateStyles
+{
     WXAssertParam(styles);
     WXAssertParam(ref);
     
@@ -347,9 +372,10 @@ static css_node_t * rootNodeGetChild(void *context, int i)
     NSMutableDictionary *normalStyles = [NSMutableDictionary new];
     NSMutableArray *resetStyles = [NSMutableArray new];
     [self filterStyles:styles normalStyles:normalStyles resetStyles:resetStyles];
-    [component _updateStylesOnComponentThread:normalStyles resetStyles:resetStyles];
+    [component _updateStylesOnComponentThread:normalStyles resetStyles:resetStyles isUpdateStyles:isUpdateStyles];
     [self _addUITask:^{
         [component _updateStylesOnMainThread:normalStyles resetStyles:resetStyles];
+        [component readyToRender];
     }];
 }
 
@@ -364,6 +390,7 @@ static css_node_t * rootNodeGetChild(void *context, int i)
     [component _updateAttributesOnComponentThread:attributes];
     [self _addUITask:^{
         [component _updateAttributesOnMainThread:attributes];
+        [component readyToRender];
     }];
 }
 
@@ -419,33 +446,6 @@ static css_node_t * rootNodeGetChild(void *context, int i)
     }];
 }
 
-- (void)dispatchComponentMethod:(WXBridgeMethod *)method
-{
-    if (!method) {
-        return;
-    }
-    Class componentClazz = [WXComponentFactory classWithComponentName:method.targets[@"component"]];
-    if (!componentClazz) {
-        NSString *errorMessage = [NSString stringWithFormat:@"Module\uff1a%@ doesn't exist\uff01", method.module];
-        WX_MONITOR_FAIL(WXMTJSBridge, WX_ERR_INVOKE_NATIVE, errorMessage);
-        return;
-    }
-    WXPerformBlockOnComponentThread(^{
-        WXSDKInstance *weexInstance = [WXSDKManager instanceForID:method.instance];
-        WXComponent *componentInstance = [weexInstance componentForRef:method.targets[@"ref"]];
-        
-        [self _executeComponentMethod:componentInstance withMethod:method];
-    });
-}
-
-- (void)_executeComponentMethod:(id)target withMethod:(WXBridgeMethod*)method
-{
-    NSInvocation * invocation = [[WXInvocationConfig sharedInstance] invocationWithTargetMethod:target method:method];
-    WXPerformBlockOnMainThread(^{
-        [invocation invoke];
-    });
-}
-
 #pragma mark Life Cycle
 
 - (void)createFinish
@@ -462,7 +462,6 @@ static css_node_t * rootNodeGetChild(void *context, int i)
         WX_MONITOR_SUCCESS(WXMTNativeRender);
         
         if(instance.renderFinish){
-            [instance creatFinish];
             instance.renderFinish(rootView);
         }
     }];

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Manager/WXDatePickerManager.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXDatePickerManager.h b/ios/sdk/WeexSDK/Sources/Manager/WXDatePickerManager.h
index 086c411..5f7e4c9 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXDatePickerManager.h
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXDatePickerManager.h
@@ -19,7 +19,6 @@
 
 -(void)show;
 -(void)hide;
--(void)configDatePicker:(NSDictionary *)attributes;
 -(void)updateDatePicker:(NSDictionary *)attributes;
 
 @end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Manager/WXDatePickerManager.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXDatePickerManager.m b/ios/sdk/WeexSDK/Sources/Manager/WXDatePickerManager.m
index 4fa8d20..78c0697 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXDatePickerManager.m
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXDatePickerManager.m
@@ -63,72 +63,16 @@
         [self.datePickerView addSubview:datePicker];
         [self.datePickerView addSubview:toolBar];
         [self.backgroudView addSubview:self.datePickerView];
-        
     }
     return self;
 }
 
--(void)configDatePicker:(NSDictionary *)attributes
-{
-    NSString *type = [WXConvert NSString:attributes[@"type"]];
-    if(type)
-    {
-        _type = type;
-        if( [type isEqualToString:@"date"])
-        {
-            self.datePicker.datePickerMode = UIDatePickerModeDate;
-            NSString *value = [WXConvert NSString:attributes[@"value"]];
-            if(value)
-            {
-                NSDate *date = [WXUtility dateStringToDate:value];
-                if(date)
-                {
-                    self.datePicker.date =date;
-                }
-            }
-            NSString *max = [WXConvert NSString:attributes[@"max"]];
-            if(max)
-            {
-                NSDate *date = [WXUtility dateStringToDate:max];
-                if(date)
-                {
-                    self.datePicker.maximumDate =date;
-                }
-            }
-            NSString *min = [WXConvert NSString:attributes[@"min"]];
-            if(min)
-            {
-                NSDate *date = [WXUtility dateStringToDate:min];
-                if(date)
-                {
-                    self.datePicker.minimumDate =date;
-                }
-            }
-        }else if([type isEqualToString:@"time"])
-        {
-            self.datePicker.datePickerMode = UIDatePickerModeTime;
-            NSString *value = [WXConvert NSString:attributes[@"value"]];
-            if(value)
-            {
-                NSDate *date = [WXUtility timeStringToDate:value];
-                if(date)
-                {
-                    self.datePicker.date = date;
-                }
-            }
-        }
-    }
-}
-
--(void)updateDatePicker:(NSDictionary *)attributes
+- (void)updateDatePicker:(NSDictionary *)attributes
 {
     NSString *type = [WXConvert NSString:attributes[@"type"]];
     if(type)
     {
         _type = type;
-    }
-    if(_type)
-    {
         if( [_type isEqualToString:@"date"])
         {
             self.datePicker.datePickerMode = UIDatePickerModeDate;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Manager/WXHandlerFactory.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXHandlerFactory.m b/ios/sdk/WeexSDK/Sources/Manager/WXHandlerFactory.m
index 652af2b..2703883 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXHandlerFactory.m
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXHandlerFactory.m
@@ -8,7 +8,6 @@
 
 #import "WXHandlerFactory.h"
 #import "WXThreadSafeMutableDictionary.h"
-#import "WXNetworkDefaultImpl.h"
 #import "WXNavigationDefaultImpl.h"
 #import "WXAssert.h"
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Manager/WXInvocationConfig.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXInvocationConfig.h b/ios/sdk/WeexSDK/Sources/Manager/WXInvocationConfig.h
index 82d68a8..1bcef92 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXInvocationConfig.h
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXInvocationConfig.h
@@ -17,11 +17,11 @@
 /**
  *  The methods map
  **/
-@property (nonatomic, strong) NSMutableDictionary   *methods;
+@property (nonatomic, strong) NSMutableDictionary *asyncMethods;
+@property (nonatomic, strong) NSMutableDictionary *syncMethods;
 
 + (instancetype)sharedInstance;
 - (instancetype)initWithName:(NSString *)name class:(NSString *)clazz;
 - (void)registerMethods;
-- (void)dispatchMethod:(WXBridgeMethod*)method;
-- (NSInvocation*)invocationWithTargetMethod:(id)target method:(WXBridgeMethod*)method;
+
 @end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Manager/WXInvocationConfig.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXInvocationConfig.m b/ios/sdk/WeexSDK/Sources/Manager/WXInvocationConfig.m
index 1935d62..e725fc1 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXInvocationConfig.m
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXInvocationConfig.m
@@ -11,7 +11,6 @@
 #import "WXSDKInstance.h"
 #import "WXSDKManager.h"
 #import "WXSDKInstance_private.h"
-#import "WXModuleManager.h"
 #import "WXMonitor.h"
 #import "WXSDKError.h"
 #import "WXComponentFactory.h"
@@ -40,7 +39,8 @@
 {
     
     if (self = [super init]) {
-        _methods = [NSMutableDictionary new];
+        _asyncMethods = [NSMutableDictionary new];
+        _syncMethods = [NSMutableDictionary new];
     }
     
     return self;
@@ -48,94 +48,13 @@
 
 - (instancetype)initWithName:(NSString *)name class:(NSString *)clazz
 {
-    if (self = [super init]) {
-        _methods = [NSMutableDictionary new];
+    if (self = [self init]) {
         _name = name;
         _clazz = clazz;
     }
     return self;
 }
 
-- (void)dispatchMethod:(WXBridgeMethod *)method
-{
-    if(method.targets) {
-        WXSDKInstance *weexInstance = [WXSDKManager instanceForID:method.instance];
-        [[weexInstance componentManager] dispatchComponentMethod:method];
-    }
-    if (method.module) {
-        [[WXSDKManager moduleMgr] dispatchMethod:method];
-    }
-}
-
-- (NSInvocation*)invocationWithTargetMethod:(id)target method:(WXBridgeMethod*)method
-{
-    if (!target) {
-        NSString *errorMessage = [NSString stringWithFormat:@"%@ doesn't exist\uff01",method.targets[@"component"]?:method.module];
-        WX_MONITOR_FAIL(WXMTJSBridge, WX_ERR_INVOKE_NATIVE, errorMessage);
-        
-        return nil;
-    }
-    SEL selector = nil;
-    if ([target conformsToProtocol:NSProtocolFromString(@"WXModuleProtocol")]) {
-        selector = [WXModuleFactory methodWithModuleName:method.module withMethod:method.method];
-    }else if ([target isKindOfClass:NSClassFromString(@"WXComponent")]) {
-        selector = [WXComponentFactory methodWithComponentName:method.targets[@"component"] withMethod:method.method];
-    }
-    
-    // neither a component nor a module
-    if (!selector) {
-        NSString *errorMessage = [NSString stringWithFormat:@"%@ is not a component or module", method.targets[@"component"]?:method.module];
-        WX_MONITOR_FAIL(WXMTJSBridge, WX_ERR_INVOKE_NATIVE, errorMessage);
-        return nil;
-    }
-    
-    NSArray *arguments = method.arguments;
-    NSMethodSignature *signature = [target methodSignatureForSelector:selector];
-    if (!signature) {
-        NSString *errorMessage = [NSString stringWithFormat:@"%@, method\uff1a%@ doesn't exist", method.targets[@"component"]?:method.module, method.method];
-        WX_MONITOR_FAIL(WXMTJSBridge, WX_ERR_INVOKE_NATIVE, errorMessage);
-        return nil;
-    }
-    
-    if (signature.numberOfArguments - 2 != method.arguments.count) {
-        NSString *errorMessage = [NSString stringWithFormat:@"%@, the parameters in calling method [%@] and registered method [%@] are not consistent\uff01", method.targets[@"component"]?:method.module, method.method, NSStringFromSelector(selector)];
-        WX_MONITOR_FAIL(WXMTJSBridge, WX_ERR_INVOKE_NATIVE, errorMessage);
-        return nil;
-    }
-    
-    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
-    invocation.target = target;
-    invocation.selector = selector;
-    NSString *instanceId = method.instance;
-    void **freeList = NULL;
-    
-    NSMutableArray *blockArray = [NSMutableArray array];
-    WX_ALLOC_FLIST(freeList, arguments.count);
-    for (int i = 0; i < arguments.count; i ++ ) {
-        id obj = arguments[i];
-        const char *parameterType = [signature getArgumentTypeAtIndex:i + 2];
-        static const char *blockType = @encode(typeof(^{}));
-        id argument;
-        if (!strcmp(parameterType, blockType)) {
-            // callback
-            argument = [^void(NSString *result, BOOL keepAlive) {
-                [[WXSDKManager bridgeMgr]callBack:instanceId funcId:(NSString *)obj params:result keepAlive:keepAlive];
-            } copy];
-            
-            // retain block
-            [blockArray addObject:argument];
-            [invocation setArgument:&argument atIndex:i + 2];
-        } else {
-            argument = obj;
-            WX_ARGUMENTS_SET(invocation, signature, i, argument, freeList);
-        }
-    }
-    [invocation retainArguments];
-    WX_FREE_FLIST(freeList, arguments.count);
-    
-    return invocation;
-}
-
 - (void)registerMethods
 {
     Class currentClass = NSClassFromString(_clazz);
@@ -150,8 +69,14 @@
         Method *methodList = class_copyMethodList(object_getClass(currentClass), &methodCount);
         for (unsigned int i = 0; i < methodCount; i++) {
             NSString *selStr = [NSString stringWithCString:sel_getName(method_getName(methodList[i])) encoding:NSUTF8StringEncoding];
-            
-            if (![selStr hasPrefix:@"wx_export_method_"]) continue;
+            BOOL isSyncMethod = NO;
+            if ([selStr hasPrefix:@"wx_export_method_sync_"]) {
+                isSyncMethod = YES;
+            } else if ([selStr hasPrefix:@"wx_export_method_"]) {
+                isSyncMethod = NO;
+            } else {
+                continue;
+            }
             
             NSString *name = nil, *method = nil;
             SEL selector = NSSelectorFromString(selStr);
@@ -171,7 +96,8 @@
                 name = method;
             }
             
-            [_methods setObject:method forKey:name];
+            NSMutableDictionary *methods = isSyncMethod ? _syncMethods : _asyncMethods;
+            [methods setObject:method forKey:name];
         }
         
         free(methodList);

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Manager/WXModuleFactory.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXModuleFactory.h b/ios/sdk/WeexSDK/Sources/Manager/WXModuleFactory.h
index 94d0404..e96c89b 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXModuleFactory.h
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXModuleFactory.h
@@ -26,12 +26,12 @@
  * @param method The module method
  *
  **/
-+ (SEL)methodWithModuleName:(NSString *)name withMethod:(NSString *)method;
++ (SEL)selectorWithModuleName:(NSString *)name methodName:(NSString *)method isSync:(BOOL *)isSync;
 
 /**
  * @abstract Registers a module for a given name and the implemented class
  *
- * @param module The module name to register
+ * @param name The module name to register
  *
  * @param clazz The module class to register
  *

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Manager/WXModuleFactory.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXModuleFactory.m b/ios/sdk/WeexSDK/Sources/Manager/WXModuleFactory.m
index 3ab7f50..cafef5e 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXModuleFactory.m
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXModuleFactory.m
@@ -83,24 +83,27 @@ static WXModuleFactory *_sharedInstance = nil;
     return NSClassFromString(config.clazz);
 }
 
-- (SEL)_methodWithModuleName:(NSString *)name withMethod:(NSString *)method
+- (SEL)_selectorWithModuleName:(NSString *)name methodName:(NSString *)method isSync:(BOOL *)isSync
 {
     WXAssert(name && method, @"Fail to find selector with module name and method, please check if the parameters are correct \uff01");
     
-    NSString *selStr = nil; SEL selector = nil;
+    NSString *selectorString = nil;;
     WXModuleConfig *config = nil;
     
     [_moduleLock lock];
     config = [_moduleMap objectForKey:name];
-    if (config.methods) {
-        selStr = [config.methods objectForKey:method];
+    if (config.syncMethods) {
+        selectorString = [config.syncMethods objectForKey:method];
+        if (selectorString && isSync) {
+            *isSync = YES;
+        }
     }
-    if (selStr) {
-        selector = NSSelectorFromString(selStr);
+    if (!selectorString && config.asyncMethods) {
+        selectorString = [config.asyncMethods objectForKey:method];;
     }
     [_moduleLock unlock];
     
-    return selector;
+    return NSSelectorFromString(selectorString);
 }
 
 - (NSString *)_registerModule:(NSString *)name withClass:(Class)clazz
@@ -122,7 +125,7 @@ static WXModuleFactory *_sharedInstance = nil;
 - (NSMutableDictionary *)_moduleMethodMapsWithName:(NSString *)name
 {
     NSMutableDictionary *dict = [NSMutableDictionary dictionary];
-    NSMutableArray *methods = [NSMutableArray array];
+    NSMutableArray *methods = [self _defaultModuleMethod];
     
     [_moduleLock lock];
     [dict setValue:methods forKey:name];
@@ -131,12 +134,19 @@ static WXModuleFactory *_sharedInstance = nil;
     void (^mBlock)(id, id, BOOL *) = ^(id mKey, id mObj, BOOL * mStop) {
         [methods addObject:mKey];
     };
-    [config.methods enumerateKeysAndObjectsUsingBlock:mBlock];
+    [config.syncMethods enumerateKeysAndObjectsUsingBlock:mBlock];
+    [config.asyncMethods enumerateKeysAndObjectsUsingBlock:mBlock];
     [_moduleLock unlock];
     
     return dict;
 }
 
+// module common method
+- (NSMutableArray*)_defaultModuleMethod
+{
+    return [NSMutableArray arrayWithObjects:@"addEventListener",@"removeAllEventListeners", nil];
+}
+
 - (NSDictionary *)_getModuleConfigs {
     NSMutableDictionary *moduleDic = [[NSMutableDictionary alloc] init];
     void (^moduleBlock)(id, id, BOOL *) = ^(id mKey, id mObj, BOOL * mStop) {
@@ -160,9 +170,9 @@ static WXModuleFactory *_sharedInstance = nil;
     return [[self _sharedInstance] _classWithModuleName:name];
 }
 
-+ (SEL)methodWithModuleName:(NSString *)name withMethod:(NSString *)method
++ (SEL)selectorWithModuleName:(NSString *)name methodName:(NSString *)method isSync:(BOOL *)isSync
 {
-    return [[self _sharedInstance] _methodWithModuleName:name withMethod:method];
+    return [[self _sharedInstance] _selectorWithModuleName:name methodName:method isSync:isSync];
 }
 
 + (NSString *)registerModule:(NSString *)name withClass:(Class)clazz

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Manager/WXModuleManager.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXModuleManager.h b/ios/sdk/WeexSDK/Sources/Manager/WXModuleManager.h
deleted file mode 100644
index 4e66665..0000000
--- a/ios/sdk/WeexSDK/Sources/Manager/WXModuleManager.h
+++ /dev/null
@@ -1,16 +0,0 @@
-/**
- * Created by Weex.
- * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
- *
- * This source code is licensed under the Apache Licence 2.0.
- * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
- */
-
-#import <Foundation/Foundation.h>
-#import "WXBridgeMethod.h"
-
-@interface WXModuleManager : NSObject
-
-- (void)dispatchMethod:(WXBridgeMethod *)method;
-
-@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Manager/WXModuleManager.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXModuleManager.m b/ios/sdk/WeexSDK/Sources/Manager/WXModuleManager.m
deleted file mode 100644
index 579f441..0000000
--- a/ios/sdk/WeexSDK/Sources/Manager/WXModuleManager.m
+++ /dev/null
@@ -1,111 +0,0 @@
-/**
- * Created by Weex.
- * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
- *
- * This source code is licensed under the Apache Licence 2.0.
- * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
- */
-
-#import "WXModuleManager.h"
-#import "WXModuleProtocol.h"
-#import "WXUtility.h"
-#import "WXAssert.h"
-#import "WXModuleFactory.h"
-#import "WXSDKError.h"
-#import "WXMonitor.h"
-#import "WXSDKManager.h"
-#import "WXThreadSafeMutableDictionary.h"
-#import "WXInvocationConfig.h"
-
-#import <objc/message.h>
-
-@interface WXModuleManager ()
-
-@property (nonatomic, strong) WXThreadSafeMutableDictionary *indexDict;
-
-@end
-
-@implementation WXModuleManager
-
-- (instancetype)init
-{
-    self = [super init];
-    if(self){
-        _indexDict = [[WXThreadSafeMutableDictionary alloc]init];
-    }
-    return self;
-}
-
-#pragma mark Private Methods
-
-- (void)_executeModuleThead:(NSThread *)thread withBlock:(dispatch_block_t)block
-{
-    if (!thread || !block) return;
-    
-    if ([NSThread currentThread] == thread) {
-        block();
-    } else {
-        [self performSelector:@selector(_executeModuleBlock:)
-                     onThread:thread
-                   withObject:[block copy]
-                waitUntilDone:NO];
-    }
-}
-
-- (void)_executeModuleBlock:(dispatch_block_t)block
-{
-    if (block) block();
-}
-
-- (void)_executeModuleMethod:(id)module withMethod:(WXBridgeMethod *)method
-{
-    NSInvocation *invocation = [[WXInvocationConfig sharedInstance] invocationWithTargetMethod:module method:method];
-    [invocation invoke];
-}
-
-#pragma mark Public Methods
-
-- (void)dispatchMethod:(WXBridgeMethod *)method
-{
-    if (!method) return;
-    
-    Class module =  [WXModuleFactory classWithModuleName:method.module];
-    if (!module) {
-        NSString *errorMessage = [NSString stringWithFormat:@"Module\uff1a%@ doesn't exist\uff01", method.module];
-        WX_MONITOR_FAIL(WXMTJSBridge, WX_ERR_INVOKE_NATIVE, errorMessage);
-        return;
-    }
-    
-//    WXLogDebug(@"execute\uff1a[module %@], [method %@], [parameter %@]", method.module, method.method, method.arguments);
-    
-    WXSDKInstance *weexInstance = [WXSDKManager instanceForID:method.instance];
-    id<WXModuleProtocol> moduleInstance = [weexInstance moduleForClass:module];
-    
-    // dispatch to user specified queue or thread, default is main thread
-    __weak typeof(self) weakSelf = self;
-    dispatch_block_t dipatchMethodBlock = ^ (){
-        [weakSelf _executeModuleMethod:moduleInstance withMethod:method];
-    };
-    
-    NSThread *targetThread = nil;
-    dispatch_queue_t targetQueue = nil;
-    if([moduleInstance respondsToSelector:@selector(targetExecuteQueue)]){
-        targetQueue = [moduleInstance targetExecuteQueue] ?: dispatch_get_main_queue();
-    } else if([moduleInstance respondsToSelector:@selector(targetExecuteThread)]){
-        targetThread = [moduleInstance targetExecuteThread] ?: [NSThread mainThread];
-    } else {
-        targetThread = [NSThread mainThread];
-    }
-    
-    WXAssert(targetQueue || targetThread, @"No queue or thread found for module:%@", moduleInstance);
-    
-    if (targetQueue) {
-        dispatch_async(targetQueue, dipatchMethodBlock);
-    } else {
-        WXPerformBlockOnThread(^{
-            dipatchMethodBlock();
-        }, targetThread);
-    }
-}
-
-@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Manager/WXRuleManager.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXRuleManager.m b/ios/sdk/WeexSDK/Sources/Manager/WXRuleManager.m
index f45882d..e773485 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXRuleManager.m
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXRuleManager.m
@@ -63,7 +63,7 @@ static WXRuleManager *_sharedInstance = nil;
             
             NSString *fontSrc = [rule[@"src"] substringWithRange:NSMakeRange(start, end-start)];
             NSMutableString *newFontSrc = [fontSrc mutableCopy];
-            WX_REWRITE_URL(fontSrc, WXResourceTypeLink, self.instance, &newFontSrc)
+            WX_REWRITE_URL(fontSrc, WXResourceTypeFont, self.instance, &newFontSrc)
             
             if (!newFontSrc) {
                 return;
@@ -83,7 +83,12 @@ static WXRuleManager *_sharedInstance = nil;
                 // if the fontSrc string is illegal, the fontURL will be nil
                 return;
             }
-            [fontFamily setObject:fontSrc forKey:@"src"];
+            if([fontURL isFileURL]){
+                [fontFamily setObject:fontSrc forKey:@"src"];
+            }else {
+                [fontFamily setObject:fontSrc forKey:@"tempSrc"];
+            }
+            
             [_fontStorage setObject:fontFamily forKey:rule[@"fontFamily"]];
             // remote font file
             NSString *fontfile = [NSString stringWithFormat:@"%@/%@",WX_FONT_DOWNLOAD_DIR,[WXUtility md5:[fontURL absoluteString]]];
@@ -97,6 +102,8 @@ static WXRuleManager *_sharedInstance = nil;
                 if (!error && url) {
                     // load success
                     NSMutableDictionary * dictForFontFamily = [weakSelf.fontStorage objectForKey:rule[@"fontFamily"]];
+                    NSString *fontSrc = [dictForFontFamily objectForKey:@"tempSrc"];
+                    [dictForFontFamily setObject:fontSrc forKey:@"src"];
                     [dictForFontFamily setObject:url forKey:@"localSrc"];
                 } else {
                     //there was some errors during loading

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Manager/WXSDKManager.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXSDKManager.h b/ios/sdk/WeexSDK/Sources/Manager/WXSDKManager.h
index f1968ee..0f90420 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXSDKManager.h
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXSDKManager.h
@@ -20,11 +20,6 @@
 + (WXBridgeManager *)bridgeMgr;
 
 /**
- * @abstract Returns module manager
- **/
-+ (WXModuleManager *)moduleMgr;
-
-/**
  * @abstract Returns weex instance for specific identifier
  **/
 + (WXSDKInstance *)instanceForID:(NSString *)identifier;
@@ -44,4 +39,9 @@
  **/
 + (void)unload;
 
+/**
+ * @abstract Returns module manager
+ **/
++ (WXModuleManager *)moduleMgr DEPRECATED_MSG_ATTRIBUTE();
+
 @end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Manager/WXSDKManager.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXSDKManager.m b/ios/sdk/WeexSDK/Sources/Manager/WXSDKManager.m
index c3347af..071bc2b 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXSDKManager.m
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXSDKManager.m
@@ -8,14 +8,11 @@
 
 #import "WXSDKManager.h"
 #import "WXThreadSafeMutableDictionary.h"
-#import "WXModuleManager.h"
 
 @interface WXSDKManager ()
 
 @property (nonatomic, strong) WXBridgeManager *bridgeMgr;
 
-@property (nonatomic, strong) WXModuleManager *moduleMgr;
-
 @property (nonatomic, strong) WXThreadSafeMutableDictionary *instanceDict;
 
 @end
@@ -46,16 +43,6 @@ static WXSDKManager *_sharedInstance = nil;
     return bridgeMgr;
 }
 
-+ (WXModuleManager *)moduleMgr
-{
-    WXModuleManager *moduleMgr = [self sharedInstance].moduleMgr;
-    if (!moduleMgr) {
-        moduleMgr = [[WXModuleManager alloc] init];
-        [self sharedInstance].moduleMgr = moduleMgr;
-    }
-    return moduleMgr;
-}
-
 + (id)instanceForID:(NSString *)identifier
 {
     return [[self sharedInstance].instanceDict objectForKey:identifier];
@@ -81,7 +68,11 @@ static WXSDKManager *_sharedInstance = nil;
     }
     
     [self sharedInstance].bridgeMgr = nil;
-    [self sharedInstance].moduleMgr = nil;
+}
+
++ (WXModuleManager *)moduleMgr
+{
+    return nil;
 }
 
 @end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Manager/WXServiceFactory.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXServiceFactory.h b/ios/sdk/WeexSDK/Sources/Manager/WXServiceFactory.h
new file mode 100644
index 0000000..3ff2174
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXServiceFactory.h
@@ -0,0 +1,38 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+
+#import <Foundation/Foundation.h>
+
+@interface WXServiceFactory : NSObject
+
+/**
+ * @abstract Registers a service for a given name, js code and options
+ *
+ * @param name The service name to register
+ *
+ * @param options The service options to register
+ *
+ * @param code service js code to invoke
+ *
+ * @return script
+ *
+ */
++ (NSString *)registerServiceScript:(NSString *)name withRawScript:(NSString *)serviceScript withOptions:(NSDictionary *)options;
+
+
+/**
+ * @abstract Unregisters a component for a given name
+ *
+ * @param name The service name to register
+ *
+ * @return script
+ *
+ */
++ (NSString *)unregisterServiceScript:(NSString *)name;
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Manager/WXServiceFactory.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXServiceFactory.m b/ios/sdk/WeexSDK/Sources/Manager/WXServiceFactory.m
new file mode 100644
index 0000000..8953db0
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXServiceFactory.m
@@ -0,0 +1,102 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+
+#import "WXServiceFactory.h"
+#import "WXAssert.h"
+#import "WXLog.h"
+
+#import <objc/runtime.h>
+
+@implementation WXServiceFactory
+{
+
+}
+
+#pragma mark Life Cycle
+
++ (instancetype)sharedInstance {
+    static id _sharedInstance = nil;
+    static dispatch_once_t oncePredicate;
+    dispatch_once(&oncePredicate, ^{
+        _sharedInstance = [[self alloc] init];
+    });
+    return _sharedInstance;
+}
+
+- (instancetype)init
+{
+    if(self = [super init]){
+
+    }
+    return self;
+}
+
+#pragma mark Public
+/**
+ * @abstract Unregisters a component for a given name
+ *
+ * @param name The service name to register
+ *
+ * @return script
+ *
+ */
++ (NSString *)registerServiceScript:(NSString *)name withRawScript:(NSString *)serviceScript withOptions:(NSDictionary *)options
+{
+    NSDictionary *dic = [[self sharedInstance] registerServiceScript:name withRawScript:serviceScript withOptions:options];
+    return [dic objectForKey:@"script"];
+}
+
+
++ (NSString *)unregisterServiceScript:(NSString *)name
+{
+    return [[self sharedInstance] unregisterServiceScript:name];
+}
+
+
+#pragma mark Private
+
+- (NSDictionary *)registerServiceScript:(NSString *)name withRawScript:(NSString *)serviceScript withOptions:(NSDictionary *)options
+{
+    WXAssert(name && options && serviceScript, @"name or options or code must not be nil for registering service.");
+    
+    NSDictionary *serverConfig = @{
+                                   @"name": name,
+                                   @"options": options,
+                                   @"script": [self registerService:name withRawScript:serviceScript withOptions:options]
+                                   };
+    
+    return serverConfig;
+}
+
+- (NSString *) registerService:(NSString *)name withRawScript:(NSString *)serviceScript withOptions:(NSDictionary *)options {
+    NSError *error;
+    
+    // setup options for service
+    NSMutableDictionary *optionDic = [NSMutableDictionary dictionaryWithDictionary:options];
+    [optionDic setObject:name forKey:@"serviceName"];
+    NSData *optionsData = [NSJSONSerialization dataWithJSONObject:optionDic options:NSJSONWritingPrettyPrinted error:&error];
+    NSString *optionsString = [[NSString alloc] initWithData:optionsData encoding:NSUTF8StringEncoding];
+    
+    // setup global function to service
+    NSString *funcString = @"{"
+                            @"register: global.registerService,"
+                            @"unregister: global.unregisterService"
+                            @"}";
+    
+    NSString *script = [NSString stringWithFormat:@";(function(service, options){ %@ })(%@, %@);"
+                        , serviceScript, funcString, optionsString];
+    return script;
+}
+
+- (NSString *) unregisterServiceScript: (NSString *) name
+{
+    NSString *script = [NSString stringWithFormat:@";global.unregisterService(%@);", name];
+    return script;
+}
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Model/WXBridgeMethod.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Model/WXBridgeMethod.h b/ios/sdk/WeexSDK/Sources/Model/WXBridgeMethod.h
index f8dc62e..5cfc657 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXBridgeMethod.h
+++ b/ios/sdk/WeexSDK/Sources/Model/WXBridgeMethod.h
@@ -7,19 +7,19 @@
  */
 
 #import <Foundation/Foundation.h>
+@class WXSDKInstance;
 
 @interface WXBridgeMethod : NSObject
 
-@property (nonatomic, strong) NSString  *instance;
-@property (nonatomic, strong) NSString  *module;
-@property (nonatomic, strong) NSString  *method;
-@property (nonatomic, strong) NSArray   *arguments;
-@property (nonatomic, strong) NSDictionary *targets;
+@property (nonatomic, strong, readonly) NSString *methodName;
+@property (nonatomic, copy, readonly) NSArray *arguments;
+@property (nonatomic, weak, readonly) WXSDKInstance *instance;
 
-- (instancetype)initWihData:(NSDictionary *)data;
+- (instancetype)initWithMethodName:(NSString *)methodName
+                         arguments:(NSArray *)arguments
+                          instance:(WXSDKInstance *)instance;
 
-- (instancetype)initWithInstance:(NSString *)instance data:(NSMutableDictionary *)data;
-
-- (NSDictionary *)dataDesc;
+- (NSInvocation *)invocationWithTarget:(id)target selector:(SEL)selector;
 
 @end
+

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Model/WXBridgeMethod.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Model/WXBridgeMethod.m b/ios/sdk/WeexSDK/Sources/Model/WXBridgeMethod.m
index d01a066..55becd0 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXBridgeMethod.m
+++ b/ios/sdk/WeexSDK/Sources/Model/WXBridgeMethod.m
@@ -7,40 +7,81 @@
  */
 
 #import "WXBridgeMethod.h"
+#import "WXSDKInstance.h"
+#import "WXMonitor.h"
+#import "WXAssert.h"
+#import "WXUtility.h"
+#import "WXSDKManager.h"
+#import <objc/runtime.h>
 
 @implementation WXBridgeMethod
 
-- (instancetype)initWihData:(NSDictionary *)data
+- (instancetype)initWithMethodName:(NSString *)methodName arguments:(NSArray *)arguments instance:(WXSDKInstance *)instance
 {
-    self = [super init];
-    if(self){
-        _module = [data valueForKey:@"module"];
-        _method = [data valueForKey:@"method"];
-        _arguments = [data valueForKey:@"args"];
-        if (data[@"component"]) {
-            self.targets = [NSMutableDictionary new];
-            [self.targets setValue:data[@"component"] forKey:@"component"];
-            [self.targets setValue:data[@"ref"]?:@"" forKey:@"ref"];
-        }
+    if (self = [super init]) {
+        _methodName = methodName;
+        _arguments = arguments;
+        _instance = instance;
     }
+    
     return self;
 }
 
-- (instancetype)initWithInstance:(NSString *)instance data:(NSMutableDictionary *)data
+- (NSString *)description
 {
-    self = [self initWihData:data];
-    if (self) {
-        _instance = instance;
-    }
-    return self;
+    return [NSString stringWithFormat:@"<%@: %p; instance = %@; method = %@; arguments= %@>", NSStringFromClass([self class]), self, _instance.instanceId, _methodName, _arguments];
 }
 
-- (NSDictionary *)dataDesc
+- (NSInvocation *)invocationWithTarget:(id)target selector:(SEL)selector
 {
-    NSString *module = _module ? : @"";
-    NSString *method = _method ? : @"";
-    NSArray *arguments = _arguments ? : @[];
-    return @{@"module":module, @"method":method, @"args":arguments};
+    WXAssert(target, @"No target for method:%@", self);
+    WXAssert(selector, @"No selector for method:%@", self);
+    
+    NSMethodSignature *signature = [target methodSignatureForSelector:selector];
+    if (!signature) {
+        NSString *errorMessage = [NSString stringWithFormat:@"target:%@, selector:%@ doesn't have a method signature", target, NSStringFromSelector(selector)];
+        WX_MONITOR_FAIL(WXMTJSBridge, WX_ERR_INVOKE_NATIVE, errorMessage);
+        return nil;
+    }
+    
+    NSArray *arguments = _arguments;
+    if (signature.numberOfArguments - 2 < arguments.count) {
+        NSString *errorMessage = [NSString stringWithFormat:@"%@, the parameters in calling method [%@] and registered method [%@] are not consistent\uff01", target, _methodName, NSStringFromSelector(selector)];
+        WX_MONITOR_FAIL(WXMTJSBridge, WX_ERR_INVOKE_NATIVE, errorMessage);
+        return nil;
+    }
+    
+    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
+    invocation.target = target;
+    invocation.selector = selector;
+    NSString *instanceId = _instance.instanceId;
+    void **freeList = NULL;
+    
+    NSMutableArray *blockArray = [NSMutableArray array];
+    WX_ALLOC_FLIST(freeList, arguments.count);
+    for (int i = 0; i < arguments.count; i ++ ) {
+        id obj = arguments[i];
+        const char *parameterType = [signature getArgumentTypeAtIndex:i + 2];
+        static const char *blockType = @encode(typeof(^{}));
+        id argument;
+        if (!strcmp(parameterType, blockType)) {
+            // callback
+            argument = [^void(NSString *result, BOOL keepAlive) {
+                [[WXSDKManager bridgeMgr] callBack:instanceId funcId:(NSString *)obj params:result keepAlive:keepAlive];
+            } copy];
+            
+            // retain block
+            [blockArray addObject:argument];
+            [invocation setArgument:&argument atIndex:i + 2];
+        } else {
+            argument = obj;
+            WX_ARGUMENTS_SET(invocation, signature, i, argument, freeList);
+        }
+    }
+    [invocation retainArguments];
+    WX_FREE_FLIST(freeList, arguments.count);
+    
+    return invocation;
 }
 
 @end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/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 0b420b4..e8d7c0e 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXComponent.h
+++ b/ios/sdk/WeexSDK/Sources/Model/WXComponent.h
@@ -66,6 +66,11 @@ NS_ASSUME_NONNULL_BEGIN
 @property (nonatomic, readonly, strong) NSDictionary *styles;
 
 /**
+ *  @abstract The component's pseudoClassStyles.
+ */
+@property (nonatomic, readonly, strong) NSDictionary *pseudoClassStyles;
+
+/**
  *  @abstract The component's attributes.
  */
 @property (nonatomic, readonly, strong) NSDictionary *attributes;
@@ -336,6 +341,11 @@ typedef void(^WXDisplayCompeletionBlock)(CALayer *layer, BOOL finished);
 - (WXDisplayBlock)displayBlock;
 
 /**
+ * readyToRender
+ */
+- (void)readyToRender;
+
+/**
  * @abstract Return a block to be called while drawing is finished.
  *
  * @discussion The block returned will be called on main thread.

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/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 8c04d8c..f35da20 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXComponent.m
+++ b/ios/sdk/WeexSDK/Sources/Model/WXComponent.m
@@ -8,6 +8,7 @@
 
 #import "WXComponent.h"
 #import "WXComponent_internal.h"
+#import "WXComponent+GradientColor.h"
 #import "WXComponentManager.h"
 #import "WXSDKManager.h"
 #import "WXSDKInstance.h"
@@ -24,6 +25,7 @@
 #import "WXTransform.h"
 #import "WXRoundedRect.h"
 #import <pthread/pthread.h>
+#import "WXComponent+PseudoClassManagement.h"
 
 #pragma clang diagnostic ignored "-Wincomplete-implementation"
 #pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
@@ -66,12 +68,13 @@
         _ref = ref;
         _type = type;
         _weexInstance = weexInstance;
-        _styles = styles ? [NSMutableDictionary dictionaryWithDictionary:styles] : [NSMutableDictionary dictionary];
+        _styles = [self parseStyles:styles];
         _attributes = attributes ? [NSMutableDictionary dictionaryWithDictionary:attributes] : [NSMutableDictionary dictionary];
         _events = events ? [NSMutableArray arrayWithArray:events] : [NSMutableArray array];
-        
         _subcomponents = [NSMutableArray array];
         
+        _absolutePosition = CGPointMake(NAN, NAN);
+        
         _isNeedJoinLayoutSystem = YES;
         _isLayoutDirty = YES;
         _isViewFrameSyncWithCalculated = YES;
@@ -122,6 +125,16 @@
     return styles;
 }
 
+- (NSDictionary *)pseudoClassStyles
+{
+    NSDictionary *pseudoClassStyles;
+    pthread_mutex_lock(&_propertyMutex);
+    pseudoClassStyles = _pseudoClassStyles;
+    pthread_mutex_unlock(&_propertyMutex);
+    
+    return pseudoClassStyles;
+}
+
 - (NSString *)type
 {
     return _type;
@@ -189,8 +202,12 @@
             _view.backgroundColor = _backgroundColor;
         }
         
+        if (_backgroundImage) {
+            [self setGradientLayer];
+        }
+        
         if (_transform) {
-            _layer.transform = [[WXTransform new] getTransform:_transform withView:_view withOrigin:_transformOrigin];
+            _layer.transform = [[[WXTransform alloc] initWithInstance:self.weexInstance] getTransform:_transform withView:_view withOrigin:_transformOrigin];
         }
         
         _view.wx_component = self;
@@ -198,6 +215,7 @@
         _layer.wx_component = self;
         
         [self _initEvents:self.events];
+        [self _initPseudoEvents:_isListenPseudoTouch];
         
         if (_positionType == WXPositionTypeSticky) {
             [self.ancestorScroller addStickyComponent:self];
@@ -355,11 +373,13 @@
 
 #pragma mark Updating
 
-- (void)_updateStylesOnComponentThread:(NSDictionary *)styles resetStyles:(NSMutableArray *)resetStyles
+- (void)_updateStylesOnComponentThread:(NSDictionary *)styles resetStyles:(NSMutableArray *)resetStyles isUpdateStyles:(BOOL)isUpdateStyles
 {
-    pthread_mutex_lock(&_propertyMutex);
-    [_styles addEntriesFromDictionary:styles];
-    pthread_mutex_unlock(&_propertyMutex);
+    if (isUpdateStyles) {
+        pthread_mutex_lock(&_propertyMutex);
+        [_styles addEntriesFromDictionary:styles];
+        pthread_mutex_unlock(&_propertyMutex);
+    }
     [self _updateCSSNodeStyles:styles];
     [self _resetCSSNodeStyles:resetStyles];
 }
@@ -388,7 +408,6 @@
 - (void)_updateStylesOnMainThread:(NSDictionary *)styles resetStyles:(NSMutableArray *)resetStyles
 {
     WXAssertMainThread();
-    
     [self _updateViewStyles:styles];
     [self _resetStyles:resetStyles];
     [self _handleBorders:styles isUpdating:YES];
@@ -411,6 +430,13 @@
     WXAssertMainThread();
 }
 
+- (void)readyToRender
+{
+    if (self.weexInstance.trackComponent) {
+        [self.supercomponent readyToRender];
+    }
+}
+
 - (void)updateAttributes:(NSDictionary *)attributes
 {
     WXAssertMainThread();

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.h b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.h
index 38fd09b..9faebdd 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.h
+++ b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.h
@@ -8,6 +8,7 @@
 
 #import <UIKit/UIKit.h>
 #import "WXComponent.h"
+@class WXResourceRequest;
 
 extern NSString *const bundleUrlOptionKey;
 
@@ -140,6 +141,15 @@ typedef NS_ENUM(NSInteger, WXErrorCode) {//error.code
 @property (nonatomic, strong) NSMutableDictionary *userInfo;
 
 /**
+ *  scale factor from css unit to device pixel.
+ */
+@property (nonatomic, assign, readonly) CGFloat pixelScaleFactor;
+
+/**
+ * track component render
+ */
+@property (nonatomic, assign)BOOL trackComponent;
+/**
  * Renders weex view with bundle url.
  *
  * @param url The url of bundle rendered to a weex view.
@@ -151,22 +161,41 @@ typedef NS_ENUM(NSInteger, WXErrorCode) {//error.code
  *
  * @param url The url of bundle rendered to a weex view.
  *
- * @param options The params passed by user, sometimes you should pass the value of "bundleUrl".
+ * @param options The params passed by user
  *
- * @param data The data the bundle needs when rendered.
+ * @param data The data the bundle needs when rendered.  Defalut is nil.
  **/
 - (void)renderWithURL:(NSURL *)url options:(NSDictionary *)options data:(id)data;
 
+///**
+// * Renders weex view with resource request.
+// *
+// * @param request The resource request specifying the URL to render with.
+// *
+// * @param options The params passed by user.
+// *
+// * @param data The data the bundle needs when rendered.  Defalut is nil.
+// **/
+//- (void)renderWithRequest:(WXResourceRequest *)request options:(NSDictionary *)options data:(id)data;
+
 /**
  * Renders weex view with source string of bundle and some others.
  *
- * @param options The params passed by user, sometimes you should pass the value of "bundleUrl".
+ * @param options The params passed by user.
  *
- * @param data The data the bundle needs when rendered.
+ * @param data The data the bundle needs when rendered. Defalut is nil.
  **/
 - (void)renderView:(NSString *)source options:(NSDictionary *)options data:(id)data;
 
 /**
+ * Reload the js bundle from the current URL and rerender.
+ *
+ * @param forcedReload when this parameter is true, the js bundle will always be reloaded from the server. If it is false, the instance may reload the js bundle from its cache. Default is false.
+ *
+ **/
+- (void)reload:(BOOL)forcedReload;
+
+/**
  * Refreshes current instance with data.
  *
  * @param data The data the bundle needs when rendered.
@@ -193,6 +222,17 @@ typedef NS_ENUM(NSInteger, WXErrorCode) {//error.code
  */
 - (NSUInteger)numberOfComponents;
 
+
+/**
+ * check whether the module eventName is registered
+ */
+- (BOOL)checkModuleEventRegistered:(NSString*)event moduleClassName:(NSString*)moduleClassName;
+
+/**
+ * fire module event;
+ */
+- (void)fireModuleEvent:(Class)module eventName:(NSString *)eventName params:(NSDictionary*)params;
+
 /**
  * fire global event
  */
@@ -212,12 +252,18 @@ typedef NS_ENUM(NSInteger, WXErrorCode) {//error.code
 @property (nonatomic, strong) NSMutableDictionary *performanceDict;
 
 
+/** 
+ * Deprecated 
+ */
 @property (nonatomic, strong) NSDictionary *properties DEPRECATED_MSG_ATTRIBUTE();
 @property (nonatomic, assign) NSTimeInterval networkTime DEPRECATED_MSG_ATTRIBUTE();
 @property (nonatomic, copy) void (^updateFinish)(UIView *);
 
-- (void)finishPerformance DEPRECATED_MSG_ATTRIBUTE();
+@end
+
+@interface WXSDKInstance (Deprecated)
 
+- (void)finishPerformance DEPRECATED_MSG_ATTRIBUTE();
 - (void)reloadData:(id)data  DEPRECATED_MSG_ATTRIBUTE("Use refreshInstance: method instead.");
 - (void)creatFinish DEPRECATED_MSG_ATTRIBUTE();
 


[09/50] [abbrv] incubator-weex git commit: V0.10.0 stable gitlab (#178)

Posted by ji...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Utility/WXUtility.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Utility/WXUtility.h b/ios/sdk/WeexSDK/Sources/Utility/WXUtility.h
index 8237d39..4f55e8e 100644
--- a/ios/sdk/WeexSDK/Sources/Utility/WXUtility.h
+++ b/ios/sdk/WeexSDK/Sources/Utility/WXUtility.h
@@ -202,7 +202,7 @@ extern _Nonnull SEL WXSwizzledSelectorForSelector(_Nonnull SEL selector);
  *
  * @param textSize.
  *
- * @param textWeight. The type of WXTextWeight (Normal or Bold).
+ * @param textWeight.
  *
  * @param textStyle. The type of WXTextStyle (Normal or Italic).
  *
@@ -211,7 +211,7 @@ extern _Nonnull SEL WXSwizzledSelectorForSelector(_Nonnull SEL selector);
  * @return A font object according to the above params.
  *
  */
-+ (UIFont *_Nonnull)fontWithSize:(CGFloat)size textWeight:(WXTextWeight)textWeight textStyle:(WXTextStyle)textStyle fontFamily:(NSString *_Nullable)fontFamily;
++ (UIFont *_Nonnull)fontWithSize:(CGFloat)size textWeight:(CGFloat)textWeight textStyle:(WXTextStyle)textStyle fontFamily:(NSString *_Nullable)fontFamily scaleFactor:(CGFloat)scaleFactor;
 
 /**
  * @abstract download remote font from specified url
@@ -221,24 +221,21 @@ extern _Nonnull SEL WXSwizzledSelectorForSelector(_Nonnull SEL selector);
 + (void)getIconfont:(NSURL * _Nonnull)fontURL completion:( void(^ _Nullable )(NSURL * _Nonnull url, NSError * _Nullable error)) completionBlock;
 
 /**
- * @abstract Returns the scale of the main screen.
- *
+ * @abstract Returns the main screen's size when the device is in portrait mode,.
  */
-CGFloat WXScreenScale();
++ (CGSize)portraitScreenSize;
 
 /**
- * @abstract Returns the metrics of the main screen.
- *
+ * @abstract Returns the default pixel scale factor
+ * @discussion If orientation is equal to landscape, the value is caculated as follows: WXScreenSize().height / WXDefaultScreenWidth, otherwise, WXScreenSize().width / WXDefaultScreenWidth.
  */
-CGSize WXScreenSize();
++ (CGFloat)defaultPixelScaleFactor;
 
 /**
- * @abstract Returns the resize radio of the main screen. 
- *
- * @discussion If orientation is equal to landscape, the value is caculated as follows: WXScreenSize().height / WXDefaultScreenWidth, otherwise, WXScreenSize().width / WXDefaultScreenWidth.
+ * @abstract Returns the scale of the main screen.
  *
  */
-CGFloat WXScreenResizeRadio(void);
+CGFloat WXScreenScale();
 
 /**
  * @abstract Returns a Round float coordinates to the main screen pixel.
@@ -259,24 +256,6 @@ CGFloat WXFloorPixelValue(CGFloat value);
 CGFloat WXCeilPixelValue(CGFloat value);
 
 /**
- *  @abstract Returns a resized pixel which is caculated according to the WXScreenResizeRadio.
- *
- */
-CGFloat WXPixelResize(CGFloat value);
-
-/**
- *  @abstract Returns a resized frame which is caculated according to the WXScreenResizeRadio.
- *
- */
-CGRect WXPixelFrameResize(CGRect value);
-
-/**
- *  @abstract Returns a resized point which is caculated according to the WXScreenResizeRadio.
- *
- */
-CGPoint WXPixelPointResize(CGPoint value);
-
-/**
  *  @abstract check whether the file is exist
  *
  */
@@ -358,4 +337,22 @@ CGPoint WXPixelPointResize(CGPoint value);
  */
 + (NSString *_Nullable)timeToString:(NSDate *_Nullable)date;
 
+/**
+ *  @abstract get the repeat  subtring number of string.
+ *
+ */
++ (NSUInteger)getSubStringNumber:(NSString *_Nullable)string subString:(NSString *_Nullable)subString;
+
+/**
+ *  @abstract Returns a resized pixel which is caculated according to the WXScreenResizeRadio.
+ *
+ */
+CGFloat WXPixelScale(CGFloat value, CGFloat scaleFactor);
+
+CGFloat WXScreenResizeRadio(void) DEPRECATED_MSG_ATTRIBUTE("Use [WXUtility defaultPixelScaleFactor] instead");
+CGFloat WXPixelResize(CGFloat value) DEPRECATED_MSG_ATTRIBUTE("Use WXPixelScale Instead");
+CGRect WXPixelFrameResize(CGRect value) DEPRECATED_MSG_ATTRIBUTE("Use WXPixelScale Instead");
+CGPoint WXPixelPointResize(CGPoint value) DEPRECATED_MSG_ATTRIBUTE("Use WXPixelScale Instead");
++ (UIFont  * _Nullable )fontWithSize:(CGFloat)size textWeight:(CGFloat)textWeight textStyle:(WXTextStyle)textStyle fontFamily:(NSString * _Nullable)fontFamily DEPRECATED_MSG_ATTRIBUTE("Use +[WXUtility fontWithSize:textWeight:textStyle:fontFamily:scaleFactor:]");
+
 @end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Utility/WXUtility.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Utility/WXUtility.m b/ios/sdk/WeexSDK/Sources/Utility/WXUtility.m
index 94f6046..119d7a9 100644
--- a/ios/sdk/WeexSDK/Sources/Utility/WXUtility.m
+++ b/ios/sdk/WeexSDK/Sources/Utility/WXUtility.m
@@ -93,9 +93,9 @@ CGFloat WXScreenScale(void)
     return _scale;
 }
 
-CGSize WXScreenSize(void)
+CGFloat WXPixelScale(CGFloat value, CGFloat scaleFactor)
 {
-    return [UIScreen mainScreen].bounds.size;
+    return WXCeilPixelValue(value * scaleFactor);
 }
 
 CGFloat WXRoundPixelValue(CGFloat value)
@@ -116,26 +116,6 @@ CGFloat WXFloorPixelValue(CGFloat value)
     return floor(value * scale) / scale;
 }
 
-CGFloat WXPixelResize(CGFloat value)
-{
-    return WXCeilPixelValue(value * WXScreenResizeRadio());
-}
-
-CGRect WXPixelFrameResize(CGRect value)
-{
-    CGRect new = CGRectMake(value.origin.x * WXScreenResizeRadio(),
-                            value.origin.y * WXScreenResizeRadio(),
-                            value.size.width * WXScreenResizeRadio(),
-                            value.size.height * WXScreenResizeRadio());
-    return new;
-}
-
-CGPoint WXPixelPointResize(CGPoint value)
-{
-    CGPoint new = CGPointMake(value.x * WXScreenResizeRadio(),
-                              value.y * WXScreenResizeRadio());
-    return new;
-}
 static BOOL WXNotStat;
 @implementation WXUtility
 
@@ -168,8 +148,8 @@ static BOOL WXNotStat;
     NSString *appVersion = [WXAppConfiguration appVersion] ? : @"";
     NSString *appName = [WXAppConfiguration appName] ? : @"";
     
-    CGFloat deviceWidth = [[UIScreen mainScreen] bounds].size.width;
-    CGFloat deviceHeight = [[UIScreen mainScreen] bounds].size.height;
+    CGFloat deviceWidth = [self portraitScreenSize].width;
+    CGFloat deviceHeight = [self portraitScreenSize].height;
     CGFloat scale = [[UIScreen mainScreen] scale];
     
     NSMutableDictionary *data = [NSMutableDictionary dictionaryWithDictionary:@{
@@ -345,9 +325,14 @@ static BOOL WXNotStat;
     return [NSError errorWithDomain:@"WeexErrorDomain" code:code userInfo:@{@"errMsg":message}];
 }
 
-+ (UIFont *)fontWithSize:(CGFloat)size textWeight:(WXTextWeight)textWeight textStyle:(WXTextStyle)textStyle fontFamily:(NSString *)fontFamily
++ (UIFont *)fontWithSize:(CGFloat)size textWeight:(CGFloat)textWeight textStyle:(WXTextStyle)textStyle fontFamily:(NSString *)fontFamily
 {
-    CGFloat fontSize = (isnan(size) || size == 0) ?  WX_TEXT_FONT_SIZE : size;
+    return [self fontWithSize:size textWeight:textWeight textStyle:textStyle fontFamily:fontFamily scaleFactor:[self defaultPixelScaleFactor]];
+}
+
++ (UIFont *)fontWithSize:(CGFloat)size textWeight:(CGFloat)textWeight textStyle:(WXTextStyle)textStyle fontFamily:(NSString *)fontFamily scaleFactor:(CGFloat)scaleFactor
+{
+    CGFloat fontSize = (isnan(size) || size == 0) ?  32 * scaleFactor : size;
     UIFont *font = nil;
     
     WXThreadSafeMutableDictionary *fontFace = [[WXRuleManager sharedInstance] getRule:@"fontFace"];
@@ -373,17 +358,17 @@ static BOOL WXNotStat;
             font = [UIFont fontWithName:fontFamily size:fontSize];
             if (!font) {
                 WXLogWarning(@"Unknown fontFamily:%@", fontFamily);
-                font = [UIFont systemFontOfSize:fontSize];
+                font = [UIFont systemFontOfSize:fontSize weight:textWeight];
             }
         } else {
-            font = [UIFont systemFontOfSize:fontSize];
+            font = [UIFont systemFontOfSize:fontSize weight:textWeight];
         }
     }
-    
     UIFontDescriptor *fontD = font.fontDescriptor;
     UIFontDescriptorSymbolicTraits traits = 0;
+    
     traits = (textStyle == WXTextStyleItalic) ? (traits | UIFontDescriptorTraitItalic) : traits;
-    traits = (textWeight == WXTextWeightBold) ? (traits | UIFontDescriptorTraitBold) : traits;
+    traits = (fabs(textWeight-(WX_SYS_VERSION_LESS_THAN(@"8.2")?0.4:UIFontWeightBold)) <= 1e-6) ? (traits | UIFontDescriptorTraitBold) : traits;
     if (traits != 0) {
         fontD = [fontD fontDescriptorWithSymbolicTraits:traits];
         UIFont *tempFont = [UIFont fontWithDescriptor:fontD size:0];
@@ -500,31 +485,31 @@ static BOOL WXNotStat;
     return model;
 }
 
-CGFloat WXScreenResizeRadio(void)
++ (CGSize)portraitScreenSize
 {
-    return [WXUtility screenResizeScale];
+    static CGSize portraitScreenSize;
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        CGSize screenSize = [UIScreen mainScreen].bounds.size;
+        portraitScreenSize = CGSizeMake(MIN(screenSize.width, screenSize.height),
+                                        MAX(screenSize.width, screenSize.height));
+    });
+    
+    return portraitScreenSize;
 }
 
-+ (CGFloat)screenResizeScale
++ (CGFloat)defaultPixelScaleFactor
 {
-    static CGFloat resizeScale;
+    static CGFloat defaultScaleFactor;
     static dispatch_once_t onceToken;
     dispatch_once(&onceToken, ^{
-        CGSize size = WXScreenSize();
-        CGFloat deviceWidth;
-        if (size.width > size.height) {
-            // Landscape
-            deviceWidth = size.height;
-        } else {
-            deviceWidth = size.width;
-        }
-        
-        resizeScale = deviceWidth / WXDefaultScreenWidth;
+        defaultScaleFactor = [self portraitScreenSize].width / WXDefaultScreenWidth;
     });
     
-    return resizeScale;
+    return defaultScaleFactor;
 }
 
+
 #pragma mark - get deviceID
 + (NSString *)getDeviceID {
     NSMutableDictionary *usernamepasswordKVPairs = (NSMutableDictionary *)[self load:KEY_USERNAME_PASSWORD];
@@ -671,4 +656,48 @@ CGFloat WXScreenResizeRadio(void)
     return str;
 }
 
++ (NSUInteger)getSubStringNumber:(NSString *_Nullable)string subString:(NSString *_Nullable)subString
+{
+    if([string length] ==0) {
+        return 0;
+    }
+    if([subString length] ==0) {
+        return 0;
+    }
+    NSError *error = NULL;
+    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:subString options:NSRegularExpressionCaseInsensitive error:&error];
+    NSUInteger numberOfMatches = [regex numberOfMatchesInString:string options:0 range:NSMakeRange(0, [string length])];
+    return numberOfMatches;
+    
+}
+
 @end
+
+
+//Deprecated
+CGFloat WXScreenResizeRadio(void)
+{
+    return [WXUtility defaultPixelScaleFactor];
+}
+
+CGFloat WXPixelResize(CGFloat value)
+{
+    return WXCeilPixelValue(value * WXScreenResizeRadio());
+}
+
+CGRect WXPixelFrameResize(CGRect value)
+{
+    CGRect new = CGRectMake(value.origin.x * WXScreenResizeRadio(),
+                            value.origin.y * WXScreenResizeRadio(),
+                            value.size.width * WXScreenResizeRadio(),
+                            value.size.height * WXScreenResizeRadio());
+    return new;
+}
+
+CGPoint WXPixelPointResize(CGPoint value)
+{
+    CGPoint new = CGPointMake(value.x * WXScreenResizeRadio(),
+                              value.y * WXScreenResizeRadio());
+    return new;
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/View/WXComponent+PseudoClassManagement.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/View/WXComponent+PseudoClassManagement.h b/ios/sdk/WeexSDK/Sources/View/WXComponent+PseudoClassManagement.h
new file mode 100644
index 0000000..842978a
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/View/WXComponent+PseudoClassManagement.h
@@ -0,0 +1,66 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+
+#import <WeexSDK/WeexSDK.h>
+
+@interface WXComponent (PseudoClassManagement)
+
+/**
+ *  @abstract filter common styles and pseudoClassStyles.
+ *
+ */
+-(NSMutableDictionary *)parseStyles:(NSDictionary *)styles;
+
+/**
+ *  @abstract filter common styles and pseudoClassStyles.
+ *
+ */
+-(NSString *)getPseudoKey:(NSString *)key;
+
+/**
+ *  @abstract get pseudo class styles through key.
+ *
+ *  @param key      the key to search pseudo class
+ *
+ *  @return pseudo class.
+ */
+-(NSMutableDictionary *)getPseudoClassStyles:(NSString *)key;
+
+/**
+ *  @abstract get pseudo class styles through keys.
+ *
+ *  @param keys      the keys to search pseudo class
+ *  
+ *  @return pseudo class.
+ */
+-(NSMutableDictionary *)getPseudoClassStylesByKeys:(NSArray *)keys;
+
+///--------------------------------------
+/// @name Updating PseudoClass
+///--------------------------------------
+
+/**
+ * @abstract Called when component's style are updated
+ *
+ * @param styles The updated style dictionary
+ * @discussion It can be overrided to handle specific style updating. The method is called on the main thread.
+ **/
+- (void)updatePseudoClassStyles:(NSDictionary *)pseudoClassStyles;
+
+///--------------------------------------
+/// @name recovery styles
+///--------------------------------------
+
+/**
+ * @abstract Called when component recovery styles
+ *
+ * @discussion It can be overrided to handle specific style recovery. The method is called on the main thread.
+ **/
+- (void)recoveryPseudoStyles:(NSDictionary *)styles;
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/View/WXComponent+PseudoClassManagement.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/View/WXComponent+PseudoClassManagement.m b/ios/sdk/WeexSDK/Sources/View/WXComponent+PseudoClassManagement.m
new file mode 100644
index 0000000..0d8d9e6
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/View/WXComponent+PseudoClassManagement.m
@@ -0,0 +1,144 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+
+#import "WXComponent+PseudoClassManagement.h"
+#import "WXComponent_internal.h"
+#import "WXAssert.h"
+#import "WXComponentManager.h"
+#import "WXSDKInstance_private.h"
+#import "WXUtility.h"
+
+@implementation WXComponent (PseudoClassManagement)
+
+-(NSMutableDictionary *)parseStyles:(NSDictionary *)styles
+{
+    NSMutableDictionary *newStyles = [NSMutableDictionary new];
+    _pseudoClassStyles = [NSMutableDictionary new];
+    if (styles && [styles count] > 0 ) {
+        for (NSString *key in styles){
+            if([key rangeOfString:@":"].location != NSNotFound){
+                if ([key rangeOfString:@"active"].location != NSNotFound) { //all active listen
+                    _isListenPseudoTouch = YES;
+                }
+                [_pseudoClassStyles setObject:styles[key] forKey:key];
+            }else {
+                [newStyles setObject:styles[key] forKey:key];
+            }
+        }
+    }
+    return newStyles;
+}
+
+- (void)updatePseudoClassStyles:(NSDictionary *)pseudoClassStyles
+{
+    WXAssertMainThread();
+    NSMutableDictionary *styles = [NSMutableDictionary new];
+    for (NSString *k in pseudoClassStyles) {
+        [styles setObject:pseudoClassStyles[k] forKey:[self getPseudoKey:k]];
+    }
+    if ([styles count]>0) {
+        __weak typeof(self) weakSelf = self;
+        WXPerformBlockOnComponentThread(^{
+            WXComponentManager *manager = weakSelf.weexInstance.componentManager;
+            if (!manager.isValid) {
+                return;
+            }
+            [manager updatePseudoClassStyles:styles forComponent:self.ref];
+            [manager startComponentTasks];
+        });
+    }
+    
+    if (styles && [styles count] > 0) {
+        if(!_updatedPseudoClassStyles) {
+            _updatedPseudoClassStyles = [NSMutableDictionary new];
+        }
+        for (NSString *key in styles) {
+            [_updatedPseudoClassStyles setObject:styles[key] forKey:key];
+        }
+    }
+}
+
+-(NSString *)getPseudoKey:(NSString *)key
+{
+    if ([key rangeOfString:@":"].location == NSNotFound) {
+        return key;
+    }
+    NSRange range = [key rangeOfString:@":"];
+    NSString *subKey = [key substringToIndex:range.location];
+    return subKey;
+}
+
+-(NSMutableDictionary *)getPseudoClassStyles:(NSString *)key
+{
+    NSMutableDictionary *styles = [NSMutableDictionary new];
+    [styles addEntriesFromDictionary:[self getPseudoClassStyles:key level:1]];
+    [styles addEntriesFromDictionary:[self getPseudoClassStyles:key level:2]];
+    return styles;
+}
+
+-(NSMutableDictionary *)getPseudoClassStyles:(NSString *)key level:(NSInteger )level
+{
+    NSMutableDictionary *styles = [NSMutableDictionary new];
+    if (_pseudoClassStyles && [_pseudoClassStyles count] > 0 ) {
+        for (NSString *k in _pseudoClassStyles){
+            if ([k rangeOfString:key].location != NSNotFound && [WXUtility getSubStringNumber:k subString:@":"] == level) {
+                [styles setObject:_pseudoClassStyles[k] forKey:[self getPseudoKey:k]];
+            }
+        }
+    }
+    return styles;
+}
+
+-(NSMutableDictionary *)getPseudoClassStylesByKeys:(NSArray *)keys
+{
+    NSMutableDictionary *styles = [NSMutableDictionary new];
+    if(keys && [keys count]>0) {
+        if (_pseudoClassStyles && [_pseudoClassStyles count] > 0 ) {
+            for (NSString *k in _pseudoClassStyles){
+                if([WXUtility getSubStringNumber:k subString:@":"] == [keys count]){
+                    BOOL isContain = YES;
+                    for(NSString *pKey in keys){
+                        if ([k rangeOfString:pKey].location == NSNotFound) {
+                            isContain = NO;
+                            break;
+                        }
+                    }
+                    if (isContain) {
+                        [styles setObject:_pseudoClassStyles[k] forKey:[self getPseudoKey:k]];
+                    }
+                }
+            }
+        }
+    }
+    
+    return styles;
+}
+
+- (void)recoveryPseudoStyles:(NSDictionary *)styles
+{
+    WXAssertMainThread();
+    __weak typeof(self) weakSelf = self;
+    NSMutableDictionary *resetStyles = [styles mutableCopy];
+    if(_updatedPseudoClassStyles && [_updatedPseudoClassStyles count]>0){
+        for (NSString *key in _updatedPseudoClassStyles) {
+            if (![styles objectForKey:key] && [key length]>0) {
+                [resetStyles setObject:@"" forKey:key];
+            }
+        }
+    }
+    WXPerformBlockOnComponentThread(^{
+        WXComponentManager *manager = weakSelf.weexInstance.componentManager;
+        if (!manager.isValid) {
+            return;
+        }
+        [manager updatePseudoClassStyles:resetStyles forComponent:self.ref];
+        [manager startComponentTasks];
+    });
+}
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/View/WXComponent+ViewManagement.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/View/WXComponent+ViewManagement.m b/ios/sdk/WeexSDK/Sources/View/WXComponent+ViewManagement.m
index 5cc5094..16f8ddc 100644
--- a/ios/sdk/WeexSDK/Sources/View/WXComponent+ViewManagement.m
+++ b/ios/sdk/WeexSDK/Sources/View/WXComponent+ViewManagement.m
@@ -8,6 +8,7 @@
 
 #import "WXComponent+ViewManagement.h"
 #import "WXComponent_internal.h"
+#import "WXComponent+GradientColor.h"
 #import "WXAssert.h"
 #import "WXView.h"
 #import "WXSDKInstance_private.h"
@@ -93,6 +94,7 @@
 - (void)_initViewPropertyWithStyles:(NSDictionary *)styles
 {
     _backgroundColor = styles[@"backgroundColor"] ? [WXConvert UIColor:styles[@"backgroundColor"]] : [UIColor clearColor];
+    _backgroundImage = styles[@"backgroundImage"] ? [[WXConvert NSString:styles[@"backgroundImage"]]stringByReplacingOccurrencesOfString:@" " withString:@""]: nil;
     _opacity = styles[@"opacity"] ? [WXConvert CGFloat:styles[@"opacity"]] : 1.0;
     _clipToBounds = styles[@"overflow"] ? [WXConvert WXClipType:styles[@"overflow"]] : NO;
     _visibility = styles[@"visibility"] ? [WXConvert WXVisibility:styles[@"visibility"]] : WXVisibilityShow;
@@ -108,6 +110,15 @@
         _layer.backgroundColor = _backgroundColor.CGColor;
         [self setNeedsDisplay];
     }
+    
+    if (styles[@"backgroundImage"]) {
+        _backgroundImage = styles[@"backgroundImage"] ? [[WXConvert NSString:styles[@"backgroundImage"]]stringByReplacingOccurrencesOfString:@" " withString:@""]: nil;
+        
+        if (_backgroundImage) {
+            [self setGradientLayer];
+        }
+    }
+    
     if (styles[@"opacity"]) {
         _opacity = [WXConvert CGFloat:styles[@"opacity"]];
         _layer.opacity = _opacity;
@@ -156,7 +167,7 @@
     if (styles[@"transform"]) {
         if (!CGRectEqualToRect(self.calculatedFrame, CGRectZero)) {
             _transform = [WXConvert NSString:styles[@"transform"]];
-            _layer.transform = [[WXTransform new] getTransform:_transform withView:_view withOrigin:_transformOrigin];
+            _layer.transform = [[[WXTransform alloc] initWithInstance:self.weexInstance] getTransform:_transform withView:_view withOrigin:_transformOrigin];
             [_layer setNeedsDisplay];
         }
     }
@@ -166,6 +177,7 @@
 {
     if (styles && [styles containsObject:@"backgroundColor"]) {
         _backgroundColor = [UIColor clearColor];
+        [self setNeedsDisplay];
     }
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/View/WXErrorView.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/View/WXErrorView.m b/ios/sdk/WeexSDK/Sources/View/WXErrorView.m
index 9be62fb..f447656 100644
--- a/ios/sdk/WeexSDK/Sources/View/WXErrorView.m
+++ b/ios/sdk/WeexSDK/Sources/View/WXErrorView.m
@@ -16,7 +16,8 @@
     
     if (self) {
         UIImageView *imageView = [[UIImageView alloc]initWithFrame:self.bounds];
-        NSString *file = [[NSBundle mainBundle] pathForResource:@"wx_load_error@3x" ofType:@"png"];
+        NSBundle *bundle = [NSBundle bundleForClass:self.class];
+        NSString *file = [bundle pathForResource:@"wx_load_error@3x" ofType:@"png"];
         imageView.image = [UIImage imageWithContentsOfFile:file];
         [self addSubview:imageView];
         

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/View/WXView.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/View/WXView.m b/ios/sdk/WeexSDK/Sources/View/WXView.m
index 94870cf..6185427 100644
--- a/ios/sdk/WeexSDK/Sources/View/WXView.m
+++ b/ios/sdk/WeexSDK/Sources/View/WXView.m
@@ -22,7 +22,7 @@
     /**
      *  Capturing touches on a subview outside the frame of its superview if it does not clips to bounds.
      */
-    if (self.hidden) {
+    if (self.hidden || !self.userInteractionEnabled) {
         return nil;
     }
     

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/WebSocket/SRWebSocket+Weex.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/WebSocket/SRWebSocket+Weex.h b/ios/sdk/WeexSDK/Sources/WebSocket/SRWebSocket+Weex.h
new file mode 100644
index 0000000..c4823d6
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/WebSocket/SRWebSocket+Weex.h
@@ -0,0 +1,18 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+
+#import "SRWebSocket.h"
+#import "WXWebSocketHandler.h"
+#import <objc/runtime.h>
+
+@interface SRWebSocket (Weex)
+
+@property (nonatomic, copy) NSString *wx_Identifier;
+@property (nonatomic, weak) id<WXWebSocketDelegate> wx_WebSocketDelegate;
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/WebSocket/SRWebSocket+Weex.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/WebSocket/SRWebSocket+Weex.m b/ios/sdk/WeexSDK/Sources/WebSocket/SRWebSocket+Weex.m
new file mode 100644
index 0000000..f6cdfd1
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/WebSocket/SRWebSocket+Weex.m
@@ -0,0 +1,36 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+
+#import "SRWebSocket+Weex.h"
+static char wx_IdentifierKey;
+static char wx_WebSocketDelegateKey;
+
+
+@implementation SRWebSocket (Weex)
+
+-(void)setWx_Identifier:(NSString *)wx_Identifier
+{
+    objc_setAssociatedObject(self, &wx_IdentifierKey, wx_Identifier, OBJC_ASSOCIATION_COPY);
+}
+
+-(NSString *)wx_Identifier
+{
+    return objc_getAssociatedObject(self, &wx_IdentifierKey);
+}
+
+-(void)setWx_WebSocketDelegate:(id<WXWebSocketDelegate>)wx_WebSocketDelegate
+{
+    objc_setAssociatedObject(self, &wx_WebSocketDelegateKey, wx_WebSocketDelegate, OBJC_ASSOCIATION_COPY);
+}
+
+-(NSString *)wx_WebSocketDelegate
+{
+    return objc_getAssociatedObject(self, &wx_WebSocketDelegateKey);
+}
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/WebSocket/WXWebSocketDefaultImpl.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/WebSocket/WXWebSocketDefaultImpl.h b/ios/sdk/WeexSDK/Sources/WebSocket/WXWebSocketDefaultImpl.h
new file mode 100644
index 0000000..5ff8009
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/WebSocket/WXWebSocketDefaultImpl.h
@@ -0,0 +1,14 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+
+#import <Foundation/Foundation.h>
+#import "WXWebSocketHandler.h"
+
+@interface WXWebSocketDefaultImpl : NSObject<WXWebSocketHandler>
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/WebSocket/WXWebSocketDefaultImpl.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/WebSocket/WXWebSocketDefaultImpl.m b/ios/sdk/WeexSDK/Sources/WebSocket/WXWebSocketDefaultImpl.m
new file mode 100644
index 0000000..12bb4ff
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/WebSocket/WXWebSocketDefaultImpl.m
@@ -0,0 +1,110 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+
+#import "WXWebSocketDefaultImpl.h"
+#import "SRWebSocket.h"
+#import "WXThreadSafeMutableDictionary.h"
+#import "SRWebSocket+Weex.h"
+
+@interface WXWebSocketDefaultImpl()<SRWebSocketDelegate>
+
+@end
+
+@implementation WXWebSocketDefaultImpl
+{
+    WXThreadSafeMutableDictionary<NSString *, SRWebSocket *> *_webSockets;
+}
+
+#pragma mark - WXWebSocketHandler
+- (void)open:(NSString *)url protocol:(NSString *)protocol identifier:(NSString *)identifier withDelegate:(id<WXWebSocketDelegate>)delegate
+{
+    if(!_webSockets)
+    {
+        _webSockets = [WXThreadSafeMutableDictionary new];
+    }
+    if([_webSockets objectForKey:identifier]){
+        SRWebSocket *webSocket = [_webSockets objectForKey:identifier];
+        webSocket.delegate = nil;
+        [webSocket close];
+        
+    }
+    NSArray *protols;
+    if([protocol length]>0){
+       protols = [NSArray arrayWithObject:protocol];
+    }
+    SRWebSocket *webSocket = [[SRWebSocket alloc] initWithURL:[NSURL URLWithString:url] protocols:protols];
+    webSocket.delegate = self;
+    [webSocket open];
+    webSocket.wx_Identifier = identifier;
+    webSocket.wx_WebSocketDelegate = delegate;
+    [_webSockets setObject:webSocket forKey:identifier];
+}
+
+- (void)send:(NSString *)identifier data:(NSString *)data
+{
+    SRWebSocket *webSocket = [_webSockets objectForKey:identifier];
+    if(webSocket) {
+        [webSocket send:data];
+    }
+}
+
+- (void)close:(NSString *)identifier
+{
+    SRWebSocket *webSocket = [_webSockets objectForKey:identifier];
+    if(webSocket) {
+        [webSocket close];
+    }
+}
+
+- (void)close:(NSString *)identifier code:(NSInteger)code reason:(NSString *)reason
+{
+    SRWebSocket *webSocket = [_webSockets objectForKey:identifier];
+    if(webSocket) {
+        [webSocket closeWithCode:code reason:reason];
+    }
+}
+
+- (void)clear:(NSString *)identifier
+{
+    SRWebSocket *webSocket = [_webSockets objectForKey:identifier];
+    if(webSocket) {
+        webSocket.delegate = nil;
+        [webSocket close];
+        [_webSockets removeObjectForKey:identifier];
+    }
+}
+
+#pragma mark -SRWebSocketDelegate
+- (void)webSocketDidOpen:(SRWebSocket *)webSocket;
+{
+    if (webSocket.wx_WebSocketDelegate && [webSocket.wx_WebSocketDelegate respondsToSelector:@selector(didOpen)]) {
+        [webSocket.wx_WebSocketDelegate didOpen];
+    }
+}
+
+- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error;
+{
+    if (webSocket.wx_WebSocketDelegate && [webSocket.wx_WebSocketDelegate respondsToSelector:@selector(didFailWithError:)]) {
+        [webSocket.wx_WebSocketDelegate didFailWithError:error];
+    }
+}
+
+- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message;
+{
+    if (webSocket.wx_WebSocketDelegate && [webSocket.wx_WebSocketDelegate respondsToSelector:@selector(didReceiveMessage:)]) {
+        [webSocket.wx_WebSocketDelegate didReceiveMessage:message];
+    }
+}
+
+- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean;
+{
+    if (webSocket.wx_WebSocketDelegate && [webSocket.wx_WebSocketDelegate respondsToSelector:@selector(didCloseWithCode:reason:wasClean:)]) {
+        [webSocket.wx_WebSocketDelegate didCloseWithCode:code reason:reason wasClean:wasClean];
+    }
+}
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/WebSocket/WXWebSocketHandler.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/WebSocket/WXWebSocketHandler.h b/ios/sdk/WeexSDK/Sources/WebSocket/WXWebSocketHandler.h
new file mode 100644
index 0000000..3346609
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/WebSocket/WXWebSocketHandler.h
@@ -0,0 +1,26 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+
+#import <Foundation/Foundation.h>
+#import "WXModuleProtocol.h"
+
+@protocol WXWebSocketDelegate<NSObject>
+- (void)didOpen;
+- (void)didFailWithError:(NSError *)error;
+- (void)didReceiveMessage:(id)message;
+- (void)didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean;
+@end
+
+@protocol WXWebSocketHandler<NSObject>
+
+- (void)open:(NSString *)url protocol:(NSString *)protocol identifier:(NSString *)identifier withDelegate:(id<WXWebSocketDelegate>)delegate;
+- (void)send:(NSString *)identifier data:(NSString *)data;
+- (void)close:(NSString *)identifier;
+- (void)close:(NSString *)identifier code:(NSInteger)code reason:(NSString *)reason;
+- (void)clear:(NSString *)identifier;
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/WeexSDK.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/WeexSDK.h b/ios/sdk/WeexSDK/Sources/WeexSDK.h
index d552031..33eb2bb 100644
--- a/ios/sdk/WeexSDK/Sources/WeexSDK.h
+++ b/ios/sdk/WeexSDK/Sources/WeexSDK.h
@@ -18,6 +18,7 @@
 #import "WXSDKError.h"
 #import "WXSDKEngine.h"
 #import "WXRootViewController.h"
+#import "WXResourceRequest.h"
 #import "WXNetworkProtocol.h"
 #import "WXNavigationProtocol.h"
 #import "WXMonitor.h"

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDKTests/TestSupportUtils.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDKTests/TestSupportUtils.h b/ios/sdk/WeexSDKTests/TestSupportUtils.h
index ead0e6c..748d8e9 100644
--- a/ios/sdk/WeexSDKTests/TestSupportUtils.h
+++ b/ios/sdk/WeexSDKTests/TestSupportUtils.h
@@ -7,6 +7,11 @@
  */
 
 #import <Foundation/Foundation.h>
+#import <UIKit/UIKit.h>
+
+extern bool WXTransform3DApproximateToTransform(CATransform3D a,CATransform3D b);
+
+extern bool WXRectApproximateToRect(CGRect a,CGRect b);
 
 @interface TestSupportUtils : NSObject
 /**

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDKTests/TestSupportUtils.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDKTests/TestSupportUtils.m b/ios/sdk/WeexSDKTests/TestSupportUtils.m
index d244045..3c315b9 100644
--- a/ios/sdk/WeexSDKTests/TestSupportUtils.m
+++ b/ios/sdk/WeexSDKTests/TestSupportUtils.m
@@ -8,9 +8,43 @@
 
 #import "TestSupportUtils.h"
 
-@implementation TestSupportUtils
 
-static dispatch_once_t onceToken;
+bool WXIsDoubleApproximate(double x, double y) {
+    return fabs(x - y) < 0.001;
+}
+
+bool WXTransform3DApproximateToTransform(CATransform3D a,CATransform3D b)
+{
+    return
+    WXIsDoubleApproximate(a.m11, b.m11) &&
+    WXIsDoubleApproximate(a.m12, b.m12) &&
+    WXIsDoubleApproximate(a.m13, b.m13) &&
+    WXIsDoubleApproximate(a.m14, b.m14) &&
+    WXIsDoubleApproximate(a.m21, b.m21) &&
+    WXIsDoubleApproximate(a.m22, b.m22) &&
+    WXIsDoubleApproximate(a.m23, b.m23) &&
+    WXIsDoubleApproximate(a.m24, b.m24) &&
+    WXIsDoubleApproximate(a.m31, b.m31) &&
+    WXIsDoubleApproximate(a.m32, b.m32) &&
+    WXIsDoubleApproximate(a.m33, b.m33) &&
+    WXIsDoubleApproximate(a.m34, b.m34) &&
+    WXIsDoubleApproximate(a.m41, b.m41) &&
+    WXIsDoubleApproximate(a.m42, b.m42) &&
+    WXIsDoubleApproximate(a.m43, b.m43) &&
+    WXIsDoubleApproximate(a.m44, b.m44);
+}
+
+bool WXRectApproximateToRect(CGRect a,CGRect b)
+{
+    return
+    WXIsDoubleApproximate(a.origin.x, b.origin.x) &&
+    WXIsDoubleApproximate(a.origin.y, b.origin.y) &&
+    WXIsDoubleApproximate(a.size.width, b.size.width) &&
+    WXIsDoubleApproximate(a.size.height, b.size.height);
+}
+
+
+@implementation TestSupportUtils
 
 +(void)waitSecs:(NSTimeInterval)secs{
     NSDate *timeoutDate = [NSDate dateWithTimeIntervalSinceNow:secs];

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDKTests/WXAnimationModuleTests.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDKTests/WXAnimationModuleTests.m b/ios/sdk/WeexSDKTests/WXAnimationModuleTests.m
index 3f7dd4c..95cdf0f 100644
--- a/ios/sdk/WeexSDKTests/WXAnimationModuleTests.m
+++ b/ios/sdk/WeexSDKTests/WXAnimationModuleTests.m
@@ -34,22 +34,14 @@
     
 }
 
-- (void)testPerformanceExample {
-    // This is an example of a performance test case.
-    [self measureBlock:^{
-        // Put the code you want to measure the time of here.
-    }];
-}
-
 - (void)testAnimationRotate {
     WXComponent *component = [self component];
     WXAnimationModule *object = [[WXAnimationModule alloc]init];
     [object animation:component args:@{@"duration":@500, @"timingFunction":@"ease-in-out", @"styles":@{@"transform":@"rotate(90deg)"}} callback:nil];
     [TestSupportUtils waitSecs:1];
     
-    CGFloat angle = [(NSNumber *)[component.layer valueForKeyPath:@"transform.rotation.z"] floatValue];
-    
-    XCTAssert(fabs(angle - M_PI_2) < 0.00001);
+    CATransform3D transformToVerify = CATransform3DMakeAffineTransform(CGAffineTransformRotate(CGAffineTransformIdentity, M_PI / 2));
+    XCTAssert(WXTransform3DApproximateToTransform(component.layer.transform, transformToVerify));
 }
 
 - (void)testAnimationTranslate {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDKTests/WXBridgeMethodTests.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDKTests/WXBridgeMethodTests.m b/ios/sdk/WeexSDKTests/WXBridgeMethodTests.m
index 26ecffe..d9d9eba 100644
--- a/ios/sdk/WeexSDKTests/WXBridgeMethodTests.m
+++ b/ios/sdk/WeexSDKTests/WXBridgeMethodTests.m
@@ -7,7 +7,7 @@
  */
 
 #import <XCTest/XCTest.h>
-#import "WXBridgeMethod.h"
+#import "WXCallJSMethod.h"
 #import "WXSDKInstance.h"
 
 @interface WXBridgeMethodTests : XCTestCase
@@ -29,36 +29,29 @@
 - (void)testExample {
     // This is an example of a functional test case.
     // Use XCTAssert and related functions to verify your tests produce the correct results.
+    WXSDKInstance *instance = [[WXSDKInstance alloc] init];
     
-    NSDictionary *data = @{@"module":@"dom", @"method":@"test", @"args":@[@"1", @"2", @"3"]};
-    WXBridgeMethod *method = [[WXBridgeMethod alloc] initWithInstance:@"0" data:[NSMutableDictionary dictionaryWithDictionary:data]];
+    WXCallJSMethod *method = [[WXCallJSMethod alloc] initWithModuleName:@"dom" methodName:@"test" arguments:@[@"1", @"2", @"3"] instance:instance];
     
-    NSDictionary *desc = [method dataDesc];
-    XCTAssertEqualObjects(desc[@"module"], @"dom");
-    XCTAssertEqualObjects(desc[@"method"], @"test");
+    NSDictionary *task = [method callJSTask];
+    XCTAssertEqualObjects(task[@"module"], @"dom");
+    XCTAssertEqualObjects(task[@"method"], @"test");
     
-    NSArray *args = desc[@"args"];
+    NSArray *args = task[@"args"];
     XCTAssertTrue(args.count == 3);
     XCTAssertEqualObjects(args[0], @"1");
     XCTAssertEqualObjects(args[1], @"2");
     XCTAssertEqualObjects(args[2], @"3");
     
-    method = [[WXBridgeMethod alloc] initWithInstance:@"1" data:[NSMutableDictionary dictionary]];
+    WXCallJSMethod *method2 = [[WXCallJSMethod alloc] initWithModuleName:nil methodName:nil arguments:nil instance:[[WXSDKInstance alloc] init]];
     
-    desc = [method dataDesc];
-    XCTAssertEqualObjects(desc[@"module"], @"");
-    XCTAssertEqualObjects(desc[@"method"], @"");
+    task = [method2 callJSTask];
+    XCTAssertEqualObjects(task[@"module"], @"");
+    XCTAssertEqualObjects(task[@"method"], @"");
     
-    args = desc[@"args"];
+    args = task[@"args"];
     XCTAssertNotNil(args);
     XCTAssertTrue(args.count == 0);
 }
 
-- (void)testPerformanceExample {
-    // This is an example of a performance test case.
-    [self measureBlock:^{
-        // Put the code you want to measure the time of here.
-    }];
-}
-
 @end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDKTests/WXConvertTests.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDKTests/WXConvertTests.m b/ios/sdk/WeexSDKTests/WXConvertTests.m
index 7c960d6..3e89911 100644
--- a/ios/sdk/WeexSDKTests/WXConvertTests.m
+++ b/ios/sdk/WeexSDKTests/WXConvertTests.m
@@ -63,11 +63,4 @@
     
 }
 
-- (void)testPerformanceExample {
-    // This is an example of a performance test case.
-    [self measureBlock:^{
-        // Put the code you want to measure the time of here.
-    }];
-}
-
 @end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDKTests/WXInstanceWrapTests.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDKTests/WXInstanceWrapTests.m b/ios/sdk/WeexSDKTests/WXInstanceWrapTests.m
index 9e004d8..57b6372 100644
--- a/ios/sdk/WeexSDKTests/WXInstanceWrapTests.m
+++ b/ios/sdk/WeexSDKTests/WXInstanceWrapTests.m
@@ -48,13 +48,6 @@
     // Use XCTAssert and related functions to verify your tests produce the correct results.
 }
 
-- (void)testPerformanceExample {
-    // This is an example of a performance test case.
-    [self measureBlock:^{
-        // Put the code you want to measure the time of here.
-    }];
-}
-
 - (void)testErrorCodeInfo {
     
     self.exp = [self expectationWithDescription:@" Error!"];

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDKTests/WXNetworkTests.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDKTests/WXNetworkTests.m b/ios/sdk/WeexSDKTests/WXNetworkTests.m
deleted file mode 100644
index eda53d8..0000000
--- a/ios/sdk/WeexSDKTests/WXNetworkTests.m
+++ /dev/null
@@ -1,116 +0,0 @@
-/**
- * Created by Weex.
- * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
- *
- * This source code is licensed under the Apache Licence 2.0.
- * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
- */
-
-#import <XCTest/XCTest.h>
-#import "WXNetworkDefaultImpl.h"
-#import "WXUtility.h"
-
-@interface WXNetworkTests : XCTestCase
-
-@property (nonatomic, strong)  WXNetworkDefaultImpl *networkHandler;
-
-@end
-
-@implementation WXNetworkTests
-
-- (void)setUp {
-    [super setUp];
-    // Put setup code here. This method is called before the invocation of each test method in the class.
-    
-    self.networkHandler = [[WXNetworkDefaultImpl alloc] init];
-}
-
-- (void)tearDown {
-    // Put teardown code here. This method is called after the invocation of each test method in the class.
-    [super tearDown];
-}
-
-- (void)testExample {
-    // This is an example of a functional test case.
-    // Use XCTAssert and related functions to verify your tests produce the correct results.
-}
-
-- (void)testPerformanceExample {
-    // This is an example of a performance test case.
-    [self measureBlock:^{
-        // Put the code you want to measure the time of here.
-    }];
-}
-
-- (void) testSendRequestSuccess {
-    
-    XCTestExpectation *exp = [self expectationWithDescription:@"SendRequestSuccess Unit Test Error!"];
-    
-    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.taobao.com"]];
-    
-    __block NSURLResponse *urlResponse;
-    __block NSError *respError;
-    __block NSData *respData;
-    
-    [_networkHandler sendRequest:request
-                withSendingData:^(int64_t bytesSent, int64_t totalBytes) {}
-                   withResponse:^(NSURLResponse *response) {
-                       urlResponse = response;
-                   }
-                withReceiveData:^(NSData *data) {}
-                withCompeletion:^(NSData *totalData, NSError *error) {
-                    
-                    if (!error && [urlResponse isKindOfClass:[NSHTTPURLResponse class]] && ((NSHTTPURLResponse *)urlResponse).statusCode != 200) {
-                        error = [NSError errorWithDomain:WX_ERROR_DOMAIN
-                                                    code:((NSHTTPURLResponse *)urlResponse).statusCode
-                                                userInfo:@{@"message":@"status code error."}];
-                    }
-                    
-                    respError = error;
-                    respData = totalData;
-                    
-                    [exp fulfill];
-                }];
-    
-    [self waitForExpectationsWithTimeout:10 handler:^(NSError * _Nullable error) {
-        XCTAssertNil(respError);
-        XCTAssertNotNil(respData);
-    }];
-}
-
-/*- (void) testSendRequestFailure {
-    
-    XCTestExpectation *exp = [self expectationWithDescription:@"SendRequestFailure Unit Test Error!"];
-    
-    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.123.abc"]];
-    
-    __block NSURLResponse *urlResponse;
-    __block NSError *respError;
-    __block NSData *respData;
-    
-    [_networkHandler sendRequest:request
-                 withSendingData:^(int64_t bytesSent, int64_t totalBytes) {}
-                    withResponse:^(NSURLResponse *response) {
-                        urlResponse = response;
-                    }
-                 withReceiveData:^(NSData *data) {}
-                 withCompeletion:^(NSData *totalData, NSError *error) {
-                     
-                     if (!error && [urlResponse isKindOfClass:[NSHTTPURLResponse class]] && ((NSHTTPURLResponse *)urlResponse).statusCode != 200) {
-                         error = [NSError errorWithDomain:WX_ERROR_DOMAIN
-                                                     code:((NSHTTPURLResponse *)urlResponse).statusCode
-                                                 userInfo:@{@"message":@"status code error."}];
-                     }
-                     
-                     respError = error;
-                     respData = totalData;
-                     [exp fulfill];
-                 }];
-    
-    [self waitForExpectationsWithTimeout:10 handler:^(NSError * _Nullable error) {
-        XCTAssertNotNil(respError);
-        XCTAssertNil(respData);
-    }];
-}*/
-
-@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDKTests/WXRootViewTests.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDKTests/WXRootViewTests.m b/ios/sdk/WeexSDKTests/WXRootViewTests.m
index b8cac0f..19c0e0a 100644
--- a/ios/sdk/WeexSDKTests/WXRootViewTests.m
+++ b/ios/sdk/WeexSDKTests/WXRootViewTests.m
@@ -41,7 +41,7 @@
     NSBundle *bundle = [NSBundle bundleForClass:[self class]];
     NSString *path = [bundle pathForResource:@"main" ofType:@"js"];
     NSString *script = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
-    [WXSDKEngine initSDKEnviroment:script];
+    [WXSDKEngine initSDKEnvironment:script];
     [WXLog setLogLevel:WXLogLevelDebug];
     
     NSString *jsPath = [bundle pathForResource:@"testRootView" ofType:@"js"];
@@ -53,8 +53,8 @@
     [instance1 renderView:jsScript options:nil data:nil];
     XCTestExpectation *expectation1 = [self expectationWithDescription:@"instance 1"];
     instance1.renderFinish = ^(UIView *view){
-        XCTAssert(CGRectEqualToRect(view.frame, instanceFrame));
-        XCTAssert(CGRectEqualToRect(view.subviews[0].frame, CGRectMake(0, 0, instanceFrame.size.width, instanceFrame.size.height)));
+        XCTAssert(WXRectApproximateToRect(view.frame, instanceFrame));
+        XCTAssert(WXRectApproximateToRect(view.subviews[0].frame, CGRectMake(0, 0, instanceFrame.size.width, instanceFrame.size.height)));
         [expectation1 fulfill];
     };
     
@@ -65,8 +65,8 @@
     [instance2 renderView:jsScript options:nil data:templateRootFrameData];
     XCTestExpectation *expectation2 = [self expectationWithDescription:@"instance 2"];
     instance2.renderFinish = ^(UIView *view){
-        XCTAssert(CGRectEqualToRect(view.frame, instanceFrame));
-        XCTAssert(CGRectEqualToRect(view.subviews[0].frame,
+        XCTAssert(WXRectApproximateToRect(view.frame, instanceFrame));
+        XCTAssert(WXRectApproximateToRect(view.subviews[0].frame,
                                     CGRectMake(
                                                WXPixelResize(templateRootFrame.origin.x),
                                                WXPixelResize(templateRootFrame.origin.y),
@@ -83,11 +83,11 @@
     XCTestExpectation *expectation3 = [self expectationWithDescription:@"instance 3"];
     XCTestExpectation *expectation31 = [self expectationWithDescription:@"instance 3 onLayoutChange"];
     instance3.renderFinish = ^(UIView *view){
-        XCTAssert(CGRectEqualToRect(view.frame,
+        XCTAssert(WXRectApproximateToRect(view.frame,
                                     CGRectMake(0,0,
                                                WXPixelResize(templateRootFrame.size.width),
                                                WXPixelResize(templateRootFrame.size.height))));
-        XCTAssert(CGRectEqualToRect(view.subviews[0].frame,
+        XCTAssert(WXRectApproximateToRect(view.subviews[0].frame,
                                     CGRectMake(
                                                WXPixelResize(templateRootFrame.origin.x),
                                                WXPixelResize(templateRootFrame.origin.y),
@@ -101,7 +101,7 @@
         
         [instance3 refreshInstance:changedFrameData];
         instance3.onLayoutChange = ^(UIView *view) {
-            XCTAssert(CGRectEqualToRect(view.frame,
+            XCTAssert(WXRectApproximateToRect(view.frame,
                                         CGRectMake(0,0,
                                                    WXPixelResize(templateRootFrame.size.width),
                                                    WXPixelResize(400))));
@@ -115,14 +115,14 @@
     [instance4 renderView:jsScript options:nil data:nil];
     XCTestExpectation *expectation4 = [self expectationWithDescription:@"instance 4"];
     instance4.renderFinish = ^(UIView *view){
-        XCTAssert(CGRectEqualToRect(view.frame,
+        XCTAssert(WXRectApproximateToRect(view.frame,
                                     CGRectMake(0,0,WXPixelResize(100),WXPixelResize(200))));
-        XCTAssert(CGRectEqualToRect(view.subviews[0].frame,
+        XCTAssert(WXRectApproximateToRect(view.subviews[0].frame,
                                     CGRectMake(0,0,WXPixelResize(100),WXPixelResize(200))));
         [expectation4 fulfill];
     };
     
-    [self waitForExpectationsWithTimeout:5.0 handler:^(NSError *error) {
+    [self waitForExpectationsWithTimeout:10.0 handler:^(NSError *error) {
         if (error) {
             NSLog(@"Timeout Error: %@", error);
         }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDKTests/WXSDKEngineTests.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDKTests/WXSDKEngineTests.m b/ios/sdk/WeexSDKTests/WXSDKEngineTests.m
index 7f06d4f..a3a22ed 100644
--- a/ios/sdk/WeexSDKTests/WXSDKEngineTests.m
+++ b/ios/sdk/WeexSDKTests/WXSDKEngineTests.m
@@ -11,7 +11,8 @@
 #import "WXModuleFactory.h"
 #import "WXComponentFactory.h"
 #import "WXHandlerFactory.h"
-#import "WXNetworkDefaultImpl.h"
+#import "WXResourceRequest.h"
+#import "WXResourceRequestHandlerDefaultImpl.h"
 
 @interface WXSDKEngineTests : XCTestCase
 
@@ -34,13 +35,6 @@
     // Use XCTAssert and related functions to verify your tests produce the correct results.
 }
 
-- (void)testPerformanceExample {
-    // This is an example of a performance test case.
-    [self measureBlock:^{
-        // Put the code you want to measure the time of here.
-    }];
-}
-
 - (void)testRegisterModule {
     
     [WXSDKEngine registerModule:@"stream" withClass:NSClassFromString(@"WXStreamModule")];
@@ -56,7 +50,7 @@
     Class cls = [WXModuleFactory classWithModuleName:@"stream"];
     XCTAssertEqualObjects(NSStringFromClass(cls), @"WXStreamModule");
     
-    SEL selector = [WXModuleFactory methodWithModuleName:@"stream" withMethod:@"fetch"];
+    SEL selector = [WXModuleFactory selectorWithModuleName:@"stream" methodName:@"fetch" isSync:nil];
     XCTAssertEqualObjects(NSStringFromSelector(selector), @"fetch:callback:progressCallback:");
 }
 
@@ -92,15 +86,15 @@
 
 - (void)testRegisterHandler {
     
-    [WXSDKEngine registerHandler:[WXNetworkDefaultImpl new] withProtocol:@protocol(WXNetworkProtocol)];
-    id handler = [WXHandlerFactory handlerForProtocol:@protocol(WXNetworkProtocol)];
+    [WXSDKEngine registerHandler:[WXResourceRequestHandlerDefaultImpl new] withProtocol:@protocol(WXResourceRequestHandler)];
+    id handler = [WXHandlerFactory handlerForProtocol:@protocol(WXResourceRequestHandler)];
     XCTAssertNotNil(handler);
-    XCTAssertTrue([handler conformsToProtocol:@protocol(WXNetworkProtocol)]);
+    XCTAssertTrue([handler conformsToProtocol:@protocol(WXResourceRequestHandler)]);
     
     NSDictionary *handlerConfigs = [WXHandlerFactory handlerConfigs];
-    handler = [handlerConfigs objectForKey:NSStringFromProtocol(@protocol(WXNetworkProtocol))];
+    handler = [handlerConfigs objectForKey:NSStringFromProtocol(@protocol(WXResourceRequestHandler))];
     XCTAssertNotNil(handler);
-    XCTAssertTrue([handler conformsToProtocol:@protocol(WXNetworkProtocol)]);
+    XCTAssertTrue([handler conformsToProtocol:@protocol(WXResourceRequestHandler)]);
 }
 
 - (void)testComponentFactory {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDKTests/WXSDKManagerTests.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDKTests/WXSDKManagerTests.m b/ios/sdk/WeexSDKTests/WXSDKManagerTests.m
index f3e65bb..94d44fe 100644
--- a/ios/sdk/WeexSDKTests/WXSDKManagerTests.m
+++ b/ios/sdk/WeexSDKTests/WXSDKManagerTests.m
@@ -32,22 +32,11 @@
     // Use XCTAssert and related functions to verify your tests produce the correct results.
 }
 
-- (void)testPerformanceExample {
-    // This is an example of a performance test case.
-    [self measureBlock:^{
-        // Put the code you want to measure the time of here.
-    }];
-}
-
 - (void)testWXSDKManager {
     id bridgeMgr = [WXSDKManager bridgeMgr];
     XCTAssertNotNil(bridgeMgr);
     XCTAssertTrue([bridgeMgr isKindOfClass:NSClassFromString(@"WXBridgeManager")]);
     
-    id moduleMgr = [WXSDKManager moduleMgr];
-    XCTAssertNotNil(moduleMgr);
-    XCTAssertTrue([moduleMgr isKindOfClass:NSClassFromString(@"WXModuleManager")]);
-    
     [WXSDKManager storeInstance:[WXSDKInstance new] forID:@"0"];
     WXSDKInstance *instance0 = [WXSDKManager instanceForID:@"0"];
     XCTAssertNotNil(instance0);

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDKTests/WXStorageTests.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDKTests/WXStorageTests.m b/ios/sdk/WeexSDKTests/WXStorageTests.m
index 862535b..3a48f1e 100644
--- a/ios/sdk/WeexSDKTests/WXStorageTests.m
+++ b/ios/sdk/WeexSDKTests/WXStorageTests.m
@@ -411,11 +411,4 @@
     }];
 }
 
-- (void)testPerformanceExample {
-    // This is an example of a performance test case.
-    [self measureBlock:^{
-        // Put the code you want to measure the time of here.
-    }];
-}
-
 @end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDKTests/WXStreamModuleTests.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDKTests/WXStreamModuleTests.m b/ios/sdk/WeexSDKTests/WXStreamModuleTests.m
index cf65463..6e024f0 100644
--- a/ios/sdk/WeexSDKTests/WXStreamModuleTests.m
+++ b/ios/sdk/WeexSDKTests/WXStreamModuleTests.m
@@ -9,7 +9,7 @@
 #import <XCTest/XCTest.h>
 #import "WXStreamModule.h"
 #import <WeexSDK/WeexSDK.h>
-#import "WXNetworkDefaultImpl.h"
+#import "WXResourceRequestHandlerDefaultImpl.h"
 
 @interface WXStreamModuleTests : XCTestCase
 @property (nonatomic, strong)  WXStreamModule *streamModule;
@@ -22,7 +22,7 @@
 - (void)setUp {
     [super setUp];
     _streamModule = [[WXStreamModule alloc] init];
-    [WXSDKEngine registerHandler:[WXNetworkDefaultImpl new] withProtocol:@protocol(WXNetworkProtocol)];
+    [WXSDKEngine registerHandler:[WXResourceRequestHandlerDefaultImpl new] withProtocol:@protocol(WXResourceRequestHandler)];
     _exp = [self expectationWithDescription:@"SendRequestSuccess Unit Test Error!"];
 }
 
@@ -55,7 +55,7 @@
         callbackResult = result;
         [_exp fulfill];
     }];
-    [self waitForExpectationsWithTimeout:10 handler:^(NSError * error) {
+    [self waitForExpectationsWithTimeout:20 handler:^(NSError * error) {
         XCTAssertNotNil(callbackResult);
     }];
     

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDKTests/WXTimerModuleTests.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDKTests/WXTimerModuleTests.m b/ios/sdk/WeexSDKTests/WXTimerModuleTests.m
index fc918c0..e6de37d 100644
--- a/ios/sdk/WeexSDKTests/WXTimerModuleTests.m
+++ b/ios/sdk/WeexSDKTests/WXTimerModuleTests.m
@@ -40,13 +40,6 @@
     // Use XCTAssert and related functions to verify your tests produce the correct results.
 }
 
-- (void)testPerformanceExample {
-    // This is an example of a performance test case.
-    [self measureBlock:^{
-        // Put the code you want to measure the time of here.
-    }];
-}
-
 - (void)testSetTimeout{
     
     self.exp = [self expectationWithDescription:@"Set Timeout Unit Test Error!"];

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDKTests/WXURLRewriteTests.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDKTests/WXURLRewriteTests.m b/ios/sdk/WeexSDKTests/WXURLRewriteTests.m
index 0612aa3..7a1f334 100644
--- a/ios/sdk/WeexSDKTests/WXURLRewriteTests.m
+++ b/ios/sdk/WeexSDKTests/WXURLRewriteTests.m
@@ -79,7 +79,7 @@ static id _mockNSBundle;
 - (void)testFileURL {
     NSBundle *bundle = [NSBundle bundleForClass:[self class]];
     NSURL *fileURL = [bundle URLForResource:@"testRootView" withExtension:@"js"];
-    NSURL *rewriteURL = [_rewriteHandler rewriteURL:fileURL.absoluteString withResourceType:WXResourceTypeBundle withInstance:_instance];
+    NSURL *rewriteURL = [_rewriteHandler rewriteURL:fileURL.absoluteString withResourceType:WXResourceTypeMainBundle withInstance:_instance];
     XCTAssertEqualObjects(fileURL.absoluteString, [rewriteURL absoluteString]);
 }
 
@@ -87,7 +87,7 @@ static id _mockNSBundle;
     NSString *testURL = @"local://testRootView.js";
     NSBundle *bundle = [NSBundle bundleForClass:[self class]];
     NSURL *fileURL = [bundle URLForResource:@"testRootView" withExtension:@"js"];
-    NSURL *rewriteURL = [_rewriteHandler rewriteURL:testURL withResourceType:WXResourceTypeBundle withInstance:_instance];
+    NSURL *rewriteURL = [_rewriteHandler rewriteURL:testURL withResourceType:WXResourceTypeMainBundle withInstance:_instance];
     XCTAssertEqualObjects(fileURL.absoluteString, [rewriteURL absoluteString]);
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDKTests/WeexSDKTests.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDKTests/WeexSDKTests.m b/ios/sdk/WeexSDKTests/WeexSDKTests.m
index 276dad8..d7cd73e 100644
--- a/ios/sdk/WeexSDKTests/WeexSDKTests.m
+++ b/ios/sdk/WeexSDKTests/WeexSDKTests.m
@@ -29,11 +29,5 @@
     // Use XCTAssert and related functions to verify your tests produce the correct results.
 }
 
-- (void)testPerformanceExample {
-    // This is an example of a performance test case.
-    [self measureBlock:^{
-        // Put the code you want to measure the time of here.
-    }];
-}
 
 @end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/package.json
----------------------------------------------------------------------
diff --git a/package.json b/package.json
index 21649af..d4331be 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,11 @@
 {
   "name": "weex",
   "version": "0.4.0",
+  "subversion": {
+    "browser": "0.5.0",
+    "framework": "0.19.6",
+    "transformer": ">=0.1.5 <0.5"
+  },
   "description": "A framework for building Mobile cross-platform UI",
   "license": "Apache-2.0",
   "repository": {
@@ -32,8 +37,9 @@
   },
   "scripts": {
     "postinstall": "bash ./bin/install-hooks.sh",
-    "build:native": "rollup -c build/rollup.config.js",
-    "build:browser": "wwp && rollup -c build/rollup.browser.config.js",
+    "build:native": "node build/build.js native",
+    "build:runtime": "node build/build.js runtime",
+    "build:browser": "wwp && node build/build.js browser",
     "build:browser:common": "rollup -c build/rollup.browser.common.config.js",
     "build:examples": "webpack --config build/webpack.examples.config.js",
     "build:test": "webpack --config build/webpack.test.config.js",
@@ -41,8 +47,9 @@
     "build": "npm run build:native && npm run build:browser && npm run build:examples && npm run build:test",
     "dist:browser": "npm run build:browser && npm run build:browser:common && bash ./bin/dist-browser.sh",
     "dist": "npm run dist:browser",
-    "dev:native": "rollup -w -c build/rollup.config.js",
-    "dev:browser": "rollup -w -c build/rollup.browser.config.js",
+    "dev:native": "node build/build.js native --watch",
+    "dev:runtime": "node build/build.js runtime --watch",
+    "dev:browser": "wwp && node build/build.js native --watch",
     "dev:examples": "webpack --watch --config build/webpack.examples.config.js",
     "dev:test": "webpack --watch --config build/webpack.test.config.js",
     "lint": "eslint html5",
@@ -61,11 +68,6 @@
     "copy:examples": "rm -rf ./android/playground/app/src/main/assets/* && cp -vrf ./examples/build/* ./android/playground/app/src/main/assets/",
     "copy": "npm run copy:js && npm run copy:examples"
   },
-  "subversion": {
-    "browser": "0.5.0",
-    "framework": "0.16.18",
-    "transformer": ">=0.1.5 <0.4"
-  },
   "dependencies": {
     "animationjs": "^0.1.5",
     "core-js": "^2.4.0",
@@ -76,8 +78,9 @@
     "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",
@@ -116,10 +119,8 @@
     "uglify-js": "^2.6.4",
     "webpack": "^1.13.1",
     "weex-components": "^0.2.0",
-    "weex-loader": "^0.3.1",
-    "weex-vdom-tester": "^0.1.2",
-    "weex-vue-components": "^0.1.0",
-    "weex-vue-loader": "^0.1.1",
+    "weex-loader": "^0.4.0",
+    "weex-vdom-tester": "^0.2.0",
     "wwp": "^0.3.0"
   }
 }


[49/50] [abbrv] incubator-weex git commit: * [doc] updated guide/intro/page-arch

Posted by ji...@apache.org.
* [doc] updated guide/intro/page-arch


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

Branch: refs/heads/master
Commit: 6228f653d8bad2b246d7673283cd8a8244859024
Parents: 7d94533
Author: Jinjiang <zh...@me.com>
Authored: Fri Feb 17 15:08:28 2017 +0800
Committer: Jinjiang <zh...@me.com>
Committed: Fri Feb 17 15:08:28 2017 +0800

----------------------------------------------------------------------
 doc/source/cn/guide/intro/page-architecture.md | 18 +++++-----
 doc/source/guide/intro/page-architecture.md    | 40 ++++++++++++++++++++-
 2 files changed, 48 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/6228f653/doc/source/cn/guide/intro/page-architecture.md
----------------------------------------------------------------------
diff --git a/doc/source/cn/guide/intro/page-architecture.md b/doc/source/cn/guide/intro/page-architecture.md
index 686fdd5..296ee98 100644
--- a/doc/source/cn/guide/intro/page-architecture.md
+++ b/doc/source/cn/guide/intro/page-architecture.md
@@ -15,13 +15,17 @@ version: 2.1
 
 Weex \u9875\u9762\u901a\u8fc7\u7c7b\u4f3c HTML DOM \u7684\u65b9\u5f0f\u7ba1\u7406\u754c\u9762\uff0c\u9996\u5148\u9875\u9762\u4f1a\u88ab\u5206\u89e3\u4e3a\u4e00\u4e2a DOM \u6811\uff0c\uff0c\u6bcf\u4e2a DOM \u7ed3\u70b9\u90fd\u4ee3\u8868\u4e86\u4e00\u4e2a\u76f8\u5bf9\u72ec\u7acb\u7684 native \u89c6\u56fe\u7684\u5355\u5143\u3002\u7136\u540e\u4e0d\u540c\u7684\u89c6\u56fe\u5355\u5143\u4e4b\u95f4\u901a\u8fc7\u6811\u5f62\u7ed3\u6784\u7ec4\u5408\u5728\u4e86\u4e00\u8d77\uff0c\u6784\u6210\u4e00\u4e2a\u5b8c\u6574\u7684\u9875\u9762\u3002
 
-<!-- DOM APIs -->
+**\u76f8\u5173\u94fe\u63a5**
+
+* [Weex Native DOM APIs](../../references/native-dom-api.html)
 
 ### \u7ec4\u4ef6
 
 Weex \u652f\u6301\u6587\u5b57\u3001\u56fe\u7247\u3001\u89c6\u9891\u7b49\u5185\u5bb9\u578b\u7ec4\u4ef6\uff0c\u4e5f\u652f\u6301 div\u3001list\u3001scroller \u7b49\u5bb9\u5668\u578b\u7ec4\u4ef6\uff0c\u8fd8\u5305\u62ec slider\u3001input\u3001textarea\u3001switch \u7b49\u591a\u79cd\u7279\u6b8a\u7684\u7ec4\u4ef6\u3002Weex \u7684\u754c\u9762\u5c31\u662f\u7531\u8fd9\u4e9b\u7ec4\u4ef6\u4ee5 DOM \u6811\u7684\u65b9\u5f0f\u6784\u5efa\u51fa\u6765\u7684\u3002
 
-<!-- \u7ec4\u4ef6\u5217\u8868 -->
+**\u76f8\u5173\u94fe\u63a5**
+
+* [Weex \u7ec4\u4ef6\u5217\u8868](../../references/components/index.html)
 
 ### \u5e03\u5c40\u7cfb\u7edf
 
@@ -35,14 +39,10 @@ Weex \u9875\u9762\u4e2d\u7684\u7ec4\u4ef6\u4f1a\u6309\u7167\u4e00\u5b9a\u7684\u5e03\u5c40\u89c4\u8303\u6765\u8fdb\u884c\u6392\u5e03\uff0c\u6211\u4eec\u8fd9
 
 Weex \u63d0\u4f9b\u4e86\u975e\u5e38\u4e30\u5bcc\u7684\u7cfb\u7edf\u529f\u80fd API\uff0c\u5305\u62ec\u5f39\u51fa\u5b58\u50a8\u3001\u7f51\u7edc\u3001\u5bfc\u822a\u3001\u5f39\u5bf9\u8bdd\u6846\u548c toast \u7b49\uff0c\u5f00\u53d1\u8005\u53ef\u4ee5\u5728 Weex \u9875\u9762\u901a\u8fc7\u83b7\u53d6\u4e00\u4e2a native module \u7684\u65b9\u5f0f\u5f15\u5165\u5e76\u8c03\u7528\u8fd9\u4e9b\u5ba2\u6237\u7aef\u529f\u80fd API\u3002
 
-<!-- \u6a21\u5757\u5217\u8868 -->
+**\u76f8\u5173\u94fe\u63a5**
+
+* [Weex \u6a21\u5757\u5217\u8868](../../references/modules/index.html)
 
 ## \u751f\u547d\u5468\u671f
 
 \u6bcf\u4e2a Weex \u9875\u9762\u90fd\u6709\u5176\u81ea\u8eab\u7684\u751f\u547d\u5468\u671f\uff0c\u9875\u9762\u4ece\u5f00\u59cb\u88ab\u521b\u5efa\u5230\u6700\u540e\u88ab\u9500\u6bc1\uff0c\u4f1a\u7ecf\u5386\u5230\u6574\u4e2a\u8fc7\u7a0b\u3002\u8fd9\u662f\u901a\u8fc7\u5bf9 Weex \u9875\u9762\u7684\u521b\u5efa\u548c\u9500\u6bc1\uff0c\u5728\u8def\u7531\u4e2d\u901a\u8fc7 SDK \u81ea\u884c\u5b9a\u4e49\u5e76\u5b9e\u73b0\u7684\u3002
-
-<!-- ios apis -->
-
-<!-- android apis -->
-
-<!-- html5 apis -->
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/6228f653/doc/source/guide/intro/page-architecture.md
----------------------------------------------------------------------
diff --git a/doc/source/guide/intro/page-architecture.md b/doc/source/guide/intro/page-architecture.md
index 73e5302..a9d8014 100644
--- a/doc/source/guide/intro/page-architecture.md
+++ b/doc/source/guide/intro/page-architecture.md
@@ -7,4 +7,42 @@ version: 2.1
 
 # Weex Page Architecture
 
-Work in progress.
+A Weex page is a independent mobile page which includes UI, interaction logic, device power, lifecycle management etc.
+
+## UI
+
+### Native DOM Model
+
+Weex page has its HTML-like DOM model to manage UI. It will be decomposed into a DOM tree which consists of some DOM nodes.
+
+**Links**
+
+* [Weex Native DOM APIs](../../references/native-dom-api.html)
+
+### Components
+
+Weex supports many kinds of components. Some of them are content components such as text, image and videos. Some of them are container components such as div, list, scroller. Also there are some special components like slider, input, textarea, and switch.
+
+**Links**
+
+* [All components Weex supports](../../references/components/index.html)
+
+### Layout System
+
+Weex use some CSS properties to layout every nodes in the DOM tree together. It includes:
+
+* Box model: Describe the `width`, `height`, `padding`, `margin` and `border` of a component node.
+* Flexbox: Describe the relations between different nodes with CSS Flexbox Spec.
+* Supportting `absolute`, `relative`, `fixed` and `sticky` value of CSS `position` property.
+
+### Features
+
+Weex supports lots of device features through modules such as storage, navigation, modals etc. Each of them exposes some JS APIs.
+
+**Links**
+
+* [All modules Weex supports](../../references/modules/index.html)
+
+### Lifecycle
+
+Every Weex page has its lifecycle which is defined and implemented in WeexSDK. All Weex pages will go through the whole process, from being created and last to being destroyed.


[18/50] [abbrv] incubator-weex git commit: V0.10.0 stable gitlab (#178)

Posted by ji...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/references/common-style.md
----------------------------------------------------------------------
diff --git a/doc/references/common-style.md b/doc/references/common-style.md
index 3752bd9..144b4f8 100644
--- a/doc/references/common-style.md
+++ b/doc/references/common-style.md
@@ -1,6 +1,5 @@
 # Common Style
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/issues/23"  class="weex-translate">cn</a>
 
 All of weex tags share some common style rules
 
@@ -31,6 +30,7 @@ you can use the definition below in weex box model.
     - `border-right-style`: values `solid` | `dashed` | `dotted`, default value `solid`
     - `border-bottom-style`: values `solid` | `dashed` | `dotted`, default value `solid`
   - `border-width`: [length](styles/units/length.md) type, non-negative, default value `0`
+    **DO NOT** use `border-width:1`. There is a default viewport `<viewport width="750">`, if the actual width of a device is 720px, then `border-width:1` will be `border-width:0.96`. As weex **do not** support sub-pixel, this border would not be rendered.
     - `border-left-width`: [length](styles/units/length.md) type, non-negative, default value `0`
     - `border-top-width`: [length](styles/units/length.md) type, non-negative, default value `0`
     - `border-right-width`: [length](styles/units/length.md) type, non-negative, default value `0`
@@ -41,6 +41,8 @@ you can use the definition below in weex box model.
     - `border-right-color`: [color](styles/units/color.md) type, default value `#000000`
     - `border-bottom-color`: [color](styles/units/color.md) type, default value `#000000`
   - `border-radius`: [length](styles/units/length.md) type, default value `0`, (rounded borders to elements , default value is 0 meaning right angle )
+
+  Although the the default overflow style is `overflow:hidden` in android, a view will not be clipped by its parents' `border-radius`. This only happens on Android, it works fine on iOS.
     - `border-bottom-left-radius`: [length](styles/units/length.md) type, non-negative, default value `0`
     - `border-bottom-right-radius`: [length](styles/units/length.md) type, non-negative, default value `0`
     - `border-top-left-radius`: [length](styles/units/length.md) type, non-negative, default value `0`

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/references/component-defs.md
----------------------------------------------------------------------
diff --git a/doc/references/component-defs.md b/doc/references/component-defs.md
index 7b75982..1a8774d 100644
--- a/doc/references/component-defs.md
+++ b/doc/references/component-defs.md
@@ -1,6 +1,5 @@
 # Component Definition
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/issues/31"  class="weex-translate">cn</a>
 
 A component definition is a set of options to describe a component. It's always assigned to `module.exports` in `<script>`.
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/references/styles/units/color.md
----------------------------------------------------------------------
diff --git a/doc/references/styles/units/color.md b/doc/references/styles/units/color.md
index 35821d5..02244b2 100644
--- a/doc/references/styles/units/color.md
+++ b/doc/references/styles/units/color.md
@@ -21,6 +21,10 @@ Supported value types:
 }
 ```
 
-**Note:** `hsl()`, `hsla()`, `currentColor`, 8-chars hex colors are not supported.
+## Note
+
+* `hsl()`, `hsla()`, `currentColor`, 8-chars hex colors are not supported.
+
+* `rgb(a,b,c)` or `rgba(a,b,c,d)` have much worse performance than ohter color format. Choose your color format wisely.
 
 See more for [named colors](../../color-names.md).

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/references/text-style.md
----------------------------------------------------------------------
diff --git a/doc/references/text-style.md b/doc/references/text-style.md
index 1f9d503..1056ea1 100644
--- a/doc/references/text-style.md
+++ b/doc/references/text-style.md
@@ -1,6 +1,5 @@
 # Text Style
 <span class="weex-version">0.5</span>
-<a href="https://github.com/weexteam/article/issues/37"  class="weex-translate">cn</a>
 
 Text alike components share some common style rules. The text alike components currently includes [`text`](../components/text.md) and [`input`](../components/input.md).
 
@@ -12,7 +11,7 @@ Text alike components share some common style rules. The text alike components c
 - `font-weight`: &lt;enum&gt; `normal` | `bold`. This property specifies the boldness of the font. Default value is `normal`.
 - `text-decoration`: &lt;enum&gt; `none` | `underline` | `line-through`. This property is used to set the text formatting to underline or line-through. The default value is `none`.
 - `text-align`: &lt;enum&gt; `left` | `center` | `right`. This property describes how inline content like text is aligned in its parent component. The default value is `left`.
-- `font-family`:&lt;string&gt; this property set the font-family of the text. This property **doesn't guarteen** the given font will always be set to the text. If the specified font cannot be found at the device, a typeface fallback will occurr and the default typeface will be load. The fallback mechanism may vary in different devices.
+- `font-family`:&lt;string&gt; this property set the font-family of the text. This property **doesn't guarantee** the given font will always be set to the text. If the specified font cannot be found at the device, a typeface fallback will occur and the default typeface will be load. The fallback mechanism may vary in different devices.
 - `text-overflow`:&lt;string&gt; `clip` | `ellipsis`. This property determines how overflowed content that is not displayed is signaled to users. It can be clipped, display an ellipsis.  
 
 The property `color` support multiple fomats of values, contains rgb, rgba, #fff, #ffffff, named-color.

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/specs/js-framework-apis.md
----------------------------------------------------------------------
diff --git a/doc/specs/js-framework-apis.md b/doc/specs/js-framework-apis.md
index 1fa80a5..aa37742 100644
--- a/doc/specs/js-framework-apis.md
+++ b/doc/specs/js-framework-apis.md
@@ -1,6 +1,5 @@
 # JS Framework APIs
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/wiki/%E6%AC%A2%E8%BF%8E%E5%8F%82%E4%B8%8EWeex%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3%E7%BF%BB%E8%AF%91"  class="weex-translate incomplete">cn</a>
 
 ## Intro about JS Runtime
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/specs/virtual-dom-apis.md
----------------------------------------------------------------------
diff --git a/doc/specs/virtual-dom-apis.md b/doc/specs/virtual-dom-apis.md
index caa8553..2fa71b0 100644
--- a/doc/specs/virtual-dom-apis.md
+++ b/doc/specs/virtual-dom-apis.md
@@ -1,6 +1,5 @@
 # Virtual DOM APIs
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/wiki/%E6%AC%A2%E8%BF%8E%E5%8F%82%E4%B8%8EWeex%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3%E7%BF%BB%E8%AF%91"  class="weex-translate incomplete">cn</a>
 
 ## `Document`
 
@@ -100,11 +99,11 @@ Removes a child. The parameter `preserved` means whether destroy the removed nod
 
 ##### `setAttr(key: string, value: string, silent: boolean?)`
 
-If `slient` is truthy, it won't cause native calls. Used for handling event with virtual-DOM changes.
+If `silent` is true, it won't cause native calls. Used for handling event with virtual-DOM changes.
 
 ##### `setStyle(key: string, value: string, silent: boolean?)`
 
-The `slient` parameter is just same as `setAttr` method.
+The `silent` parameter is just same as `setAttr` method.
 
 ##### `setClassStyle(classStyle: Object)`
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/syntax/comm.md
----------------------------------------------------------------------
diff --git a/doc/syntax/comm.md b/doc/syntax/comm.md
index c531167..e99f356 100644
--- a/doc/syntax/comm.md
+++ b/doc/syntax/comm.md
@@ -1,6 +1,5 @@
 # Communicate Between Components
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/issues/16"  class="weex-translate">cn</a>
 
 ## For Child-Parent Communication
 
@@ -49,7 +48,7 @@ eg:
 
 ## For Parent-Child Communication
 
-Parent component can using `this.$([String id])` get context of child component. you can access child component information using the context object.
+Parent component can use `this.$vm([String id])` get vm instance of child component. you can access child component information using the vm instance.
 
 ```html
 <we-element name="foo">
@@ -85,7 +84,7 @@ Parent component can using `this.$([String id])` get context of child component.
   module.exports = {
     methods: {
       test: function (e) {
-        var foo = this.$('fooEl')
+        var foo = this.$vm('fooEl')
         foo.setTitle('...')
         foo.imageUrl = '...'
       }
@@ -148,7 +147,7 @@ eg:
   <div>
     <text onclick="test">click to update foo</text>
     <foo></foo>
-    <foo></foo>
+    <bar></bar>
   </div>
 </template>
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/syntax/composed-component.md
----------------------------------------------------------------------
diff --git a/doc/syntax/composed-component.md b/doc/syntax/composed-component.md
index d1297c9..64e88f8 100644
--- a/doc/syntax/composed-component.md
+++ b/doc/syntax/composed-component.md
@@ -1,6 +1,5 @@
 # Composed Component
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/issues/2"  class="weex-translate">cn</a>
 
 If some part of weex file is reused often, you could create a composed component represent these part.
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/syntax/config-n-data.md
----------------------------------------------------------------------
diff --git a/doc/syntax/config-n-data.md b/doc/syntax/config-n-data.md
index 4908a88..417f117 100644
--- a/doc/syntax/config-n-data.md
+++ b/doc/syntax/config-n-data.md
@@ -1,6 +1,5 @@
 # Page Config & Data
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/issues/9"  class="weex-translate">cn</a>
 
 You can write some instance config and data in some additional `<script>` at the **top-level** Weex component.
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/syntax/data-binding.md
----------------------------------------------------------------------
diff --git a/doc/syntax/data-binding.md b/doc/syntax/data-binding.md
index eeabc52..7f6fd73 100644
--- a/doc/syntax/data-binding.md
+++ b/doc/syntax/data-binding.md
@@ -1,6 +1,5 @@
 # Data-Binding
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/issues/5"  class="weex-translate">cn</a>
 
 In Weex, we use the *mustache* syntax `{{...}}` to bind data in `<template>` which are defined in `<script>`. Once data and template is bound, the data changes will influence the corresponding template content immediately and automatically.
 
@@ -212,5 +211,31 @@ example2.items = []
 
 * [See more about display logic control](./display-logic.md)
 
+### `static`
+
+`static` attribute can cancel the data binding, and the data changes will not be synchronized to UI.
+
+```html
+<template>
+  <div static>
+    <text>{{ word }}</text>
+  </div>
+</template>
+
+<script>
+  module.exports = {
+    ready: function() {
+      this.word = 'Data changes'
+    },
+    data: {
+      word: 'Hello, static'
+    }
+  }
+</script>
+```
+
+As shown above, after the `static` attribute is added, the rendering result will be `Hello, static`, which is equivalent to rendering a static node. The change of the data `word` in ready function will not be listened, so the text value will not change. 
+`static` property is designed to reduce the long list or pure static page memory overhead. Be careful with it, as it will likely break your page logic.
+
 Next, let's have a look at [style and class](./style-n-class.md).
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/syntax/display-logic.md
----------------------------------------------------------------------
diff --git a/doc/syntax/display-logic.md b/doc/syntax/display-logic.md
index da13040..49db592 100644
--- a/doc/syntax/display-logic.md
+++ b/doc/syntax/display-logic.md
@@ -1,6 +1,5 @@
 # Display Logic Control
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/issues/12"  class="weex-translate">cn</a>
 
 There are two attributes for display logic control: `if` and `repeat`. We can create Weex page structure and effects more flexible with them.
 
@@ -95,7 +94,7 @@ The origin data properties which not belongs to the array will also be bound:
 </script>
 ```
 
-### A extension of repeat syntax
+### An extension of repeat syntax
 
 #### use default `$index` for the index of array.
 <span class="weex-version">0.5</span>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/syntax/events.md
----------------------------------------------------------------------
diff --git a/doc/syntax/events.md b/doc/syntax/events.md
index 4b4e118..4ffd727 100644
--- a/doc/syntax/events.md
+++ b/doc/syntax/events.md
@@ -1,6 +1,5 @@
 #  Events
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/issues/15"  class="weex-translate">cn</a>
 
 Weex allow `<template>` to bind event type and handler on an Element. The attribute name is the event type with prefix `on...` and the attribute value is handler method name. For instance: `onclick="handler"`. e.g.
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/syntax/id.md
----------------------------------------------------------------------
diff --git a/doc/syntax/id.md b/doc/syntax/id.md
index 851d0e6..bfe8696 100644
--- a/doc/syntax/id.md
+++ b/doc/syntax/id.md
@@ -1,6 +1,5 @@
 # Find an Element
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/issues/3"  class="weex-translate">cn</a>
 
 In Weex, we may set the `id` property for a particular element, just as unique identification of a particular element.
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/syntax/main.md
----------------------------------------------------------------------
diff --git a/doc/syntax/main.md b/doc/syntax/main.md
index 8bce0f8..6b54e6b 100644
--- a/doc/syntax/main.md
+++ b/doc/syntax/main.md
@@ -1,6 +1,5 @@
 # Syntax
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/issues/8"  class="weex-translate">cn</a>
 
 
 *The syntax of Weex is deeply inspired from [Vue.js](http://vuejs.org/), an elegant JavaScript framework with component system and reactive data binding.*

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/syntax/render-logic.md
----------------------------------------------------------------------
diff --git a/doc/syntax/render-logic.md b/doc/syntax/render-logic.md
index 08c9547..fbc820f 100644
--- a/doc/syntax/render-logic.md
+++ b/doc/syntax/render-logic.md
@@ -1,6 +1,5 @@
 # Render Logic Control
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/issues/7"  class="weex-translate">cn</a>
 
 ## `append`
 
@@ -21,7 +20,7 @@ Attribute `append` do not have data-binding. It won't change the final rendering
 </template>
 ```
 
-In the code snippet above, the element with id 'world' will wait for all its children to be rendered then it will be rendered entiely, while the element with id 'weex' will only render itself to the page, then its child elements will be rendered to page one by one.
+In the code snippet above, the element with id 'world' will wait for all its children to be rendered then it will be rendered entirely, while the element with id 'weex' will only render itself to the page, then its child elements will be rendered to page one by one.
 
 The rendering result is obvious, The latter statement will render the element a bit faster on the first-paint, but the total time might be longger than `append="tree"` case.
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/syntax/style-n-class.md
----------------------------------------------------------------------
diff --git a/doc/syntax/style-n-class.md b/doc/syntax/style-n-class.md
index 190884b..7470f1a 100644
--- a/doc/syntax/style-n-class.md
+++ b/doc/syntax/style-n-class.md
@@ -1,6 +1,5 @@
 # Style & Class
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/issues/6"  class="weex-translate">cn</a>
 
 ## The Basic Syntax
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/tools/devtools-android.md
----------------------------------------------------------------------
diff --git a/doc/tools/devtools-android.md b/doc/tools/devtools-android.md
index 0607a3c..559e9a3 100644
--- a/doc/tools/devtools-android.md
+++ b/doc/tools/devtools-android.md
@@ -1,5 +1,7 @@
 # Devtools for Android
 
+[![GitHub release](https://img.shields.io/github/release/weexteam/weex_devtools_android.svg)](https://github.com/weexteam/weex_devtools_android/releases)   [![Codacy Badge](https://api.codacy.com/project/badge/Grade/af0790bf45c9480fb0ec90ad834b89a3)](https://www.codacy.com/app/weex_devtools/weex_devtools_android?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=weexteam/weex_devtools_android&amp;utm_campaign=Badge_Grade) 	[![Code Climate](https://codeclimate.com/github/weexteam/weex_devtools_android/badges/gpa.svg)](https://codeclimate.com/github/weexteam/weex_devtools_android) [![Issue Count](https://codeclimate.com/github/weexteam/weex_devtools_android/badges/issue_count.svg)](https://codeclimate.com/github/weexteam/weex_devtools_android) [![GitHub issues](https://img.shields.io/github/issues/weexteam/weex_devtools_android.svg)](https://github.com/weexteam/weex_devtools_android/issues)  [ ![Download](https://api.bintray.com/packages/alibabaweex/maven/weex_inspector/ima
 ges/download.svg) ](https://bintray.com/alibabaweex/maven/weex_inspector/_latestVersion)
+
 Weex devtools is a custom devtools for weex that implements [Chrome Debugging Protocol](https://developer.chrome.com/devtools/docs/debugger-protocol) inspired by [Stetho](https://github.com/facebook/stetho), it is designed to help you quickly inspect your app and debug your JS bundle source in a chrome web page.At present The devtools consist of two part : `Inspector` and `Debugger`. If you want it work well, you must install a `weex-devtool` as debug server.
 
 - **Inspector**
@@ -41,7 +43,7 @@ There are two choices to set the dependency, the Choice A is recommanded if you
   * *A - aar dependency from jcenter*.
   ````
   dependencies {
-          compile 'com.taobao.android:weex_inspector:0.0.2.7'
+          compile 'com.taobao.android:weex_inspector:0.0.8.1'
   }
   ````
 I strongly recommend you use the latest version since both weex sdk and devtools are developed iteratively and rapidly. See the release version list [here](https://github.com/weexteam/weex_devtools_android/releases). All the release version will publish to the [jcenter repo](https://bintray.com/alibabaweex/maven/weex_inspector).
@@ -55,6 +57,15 @@ I strongly recommend you use the latest version since both weex sdk and devtools
   }
   ````
 
+##### Version compatibility
+
+| weex sdk | weex inspector | debug server |
+|----------|----------------|--------------|
+|0.8.0.1+  | 0.0.8.1        |0.2.39+       |
+|0.7.0+    | 0.0.7.13       |0.2.38        |
+|0.6.0+    | 0.0.2.2        |              |
+
+
 #### Initialize in your XXXApplication file.
 ````
     public class MyApplication extends Application {
@@ -102,4 +113,4 @@ client.networkInterceptors().add(new OkHttpInterceptor());
   The network inspection only support OKHttpClient right now!!! If you want to use the network inspection to catch your bundle request, you must change your bundle server ip to the real server ip.
   
 #### Known Issues
- You can report issues and bugs [here](https://github.com/weexteam/weex_devtools_android/issues). We will replay as soon as possible.
+ You can report issues and bugs [here](https://github.com/weexteam/weex_devtools_android/issues). We will reply as soon as possible.

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/tools/devtools-ios.md
----------------------------------------------------------------------
diff --git a/doc/tools/devtools-ios.md b/doc/tools/devtools-ios.md
index 73f7c1f..5a13910 100644
--- a/doc/tools/devtools-ios.md
+++ b/doc/tools/devtools-ios.md
@@ -1,4 +1,5 @@
 # Devtools for IOS
+
 Remote debug for your native iOS app using Chrome Developer Tools
 
 ## weex-devtool launch\uff1a
@@ -65,4 +66,4 @@ Your app must be linked against the following frameworks/dylibs
 * CFNetwork.framework
 * CoreData.framework
 * Security.framework
-* Foundation.framework
\ No newline at end of file
+* Foundation.framework

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/tools/devtools.md
----------------------------------------------------------------------
diff --git a/doc/tools/devtools.md b/doc/tools/devtools.md
index b866cd3..22e7ce9 100644
--- a/doc/tools/devtools.md
+++ b/doc/tools/devtools.md
@@ -50,14 +50,18 @@ use -e to set the entry of these bundles. and the url of "index.we" will display
 ![devtools-main](https://img.alicdn.com/tps/TB13fwSKFXXXXXDaXXXXXXXXXXX-887-828.png "connecting (multiple) devices")
 
 ### Inspector
- Inspector can be used to show your `Element` \ `NetWork` \ `Console log` \ `ScreenCast` \ `BoxModel` \ `Native View` and so on.
+ Inspector can be used to show your `Element` \ `Network` \ `Console log` \ `ScreenCast` \ `BoxModel` \ `Native View` and so on.
 
 ![devtools-inspector](https://img.alicdn.com/tps/TB1O.nwKFXXXXX8XpXXXXXXXXXX-1436-811.png "devtools-inspector")
 
 #### Element
-![inspector-element](https://img.alicdn.com/tps/TB1.02bKFXXXXXwaXXXXXXXXXXX-2880-1800.png "inspector-element")
+##### native view element
+![native-element](https://img.alicdn.com/tps/TB16L3ENXXXXXcsXVXXXXXXXXXX-2878-1798.png "native-element")
 
-#### NetWork
+##### weex dom element
+![dom-element](https://img.alicdn.com/tps/TB1TsMuNXXXXXcsaXXXXXXXXXXX-2450-1460.png "dom-element")
+
+#### Network
 
 ##### show the total time and latency
 ![inspector-network](https://img.alicdn.com/tps/TB1NjO_KFXXXXcaaXXXXXXXXXXX-2880-1800.png "inspector-network")

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/tools/how-to-debug.md
----------------------------------------------------------------------
diff --git a/doc/tools/how-to-debug.md b/doc/tools/how-to-debug.md
index e12004c..c14cdbc 100644
--- a/doc/tools/how-to-debug.md
+++ b/doc/tools/how-to-debug.md
@@ -27,10 +27,10 @@ weex --debugger
 
 #####3.start debug
 If you start server success you can find the address which like this:  
- ![IP](http://gw.alicdn.com/mt/TB107u8JVXXXXcaXVXXXXXXXXXX-718-110.png)  
+ ![IP](//gw.alicdn.com/mt/TB107u8JVXXXXcaXVXXXXXXXXXX-718-110.png)  
 copy "http://30.10.217.78:4000/" to your browser\u3002The browser will show a QR Code.  
 Use your 'playgroud' to scan the code QR in your browser.you can find this content:  
-![server](http://gw.alicdn.com/mt/TB1EgO_JVXXXXa9XVXXXXXXXXXX-1698-648.png)
+![server](//gw.alicdn.com/mt/TB1EgO_JVXXXXa9XVXXXXXXXXXX-1698-648.png)
 
 #####Device Log Level
 
@@ -42,4 +42,4 @@ For example, you select "Debug", the device will send "error", "Info","Warn" lev
 
 Blue button is used to filter the log Level\u3002  
 For example, you select the "error", you can only see the "error" level log
-![](http://gw.alicdn.com/mt/TB1RtTmJVXXXXbfXpXXXXXXXXXX-1460-488.png)
\ No newline at end of file
+![](//gw.alicdn.com/mt/TB1RtTmJVXXXXbfXpXXXXXXXXXX-1460-488.png)

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/tools/playground-app.md
----------------------------------------------------------------------
diff --git a/doc/tools/playground-app.md b/doc/tools/playground-app.md
index 0209061..a3fc73a 100644
--- a/doc/tools/playground-app.md
+++ b/doc/tools/playground-app.md
@@ -1,18 +1,16 @@
 Weex Playground App
 ===================
-<a href="https://github.com/weexteam/article/issues/48"  class="weex-translate">cn</a>
 
 One of best parts of Weex is Native Runtime . After preview your `we file` render in H5 using weex-toolkit CLI , you can try Native Runtime in a standalone App , this is Weex Playground App . More then that ,Weex playground App preset  a lot of  Demo & ShowCase ,so you will get to experience  performance of Weex native runtime  easily.
 
-Android version of Playground App can be downloaded [here](http://alibaba.github.io/weex/download.html).  iOS version will soon be ready to download.
-
+Android and IOS version of Playground App can be downloaded [here](http://alibaba.github.io/weex/download.html).
 
 ## Screenshot 
 
-![Weex playground App](http://gtms01.alicdn.com/tps/i1/TB1bC5LMpXXXXb7XXXXA0gJJXXX-720-1280.png)
+![Weex playground App](//gw.alicdn.com/mt/TB1AoPdOXXXXXcXapXXXXXXXXXX-720-1280.png)
 
 
-This is main interface of Weex Playground App , grey color list item is Demo/Showcase entry . click top right  corner Icon will active QR scaner that  work with Weex [toolkit CLI](../tools/cli.md)
+This is main interface of Weex Playground App , you can click the item to see the corresponding demo  . click top right  corner Icon will active QR scaner that  work with Weex [toolkit CLI](../tools/cli.md)
 
 please refer to [Weex Tutorial](../tutorial.md)
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/doc/tutorial.md
----------------------------------------------------------------------
diff --git a/doc/tutorial.md b/doc/tutorial.md
index 1670af4..ff28bf8 100644
--- a/doc/tutorial.md
+++ b/doc/tutorial.md
@@ -1,7 +1,6 @@
 # Tutorial
 
 <span class="weex-version">0.4</span>
-<a href="https://github.com/weexteam/article/issues/4"  class="weex-translate">cn</a>
 
 We will make a simple but realistic list, in which the technologies Weex uses will be shown. This form of list also works for a lot of e-commercial apps and mobile sites.
 
@@ -60,7 +59,7 @@ weex tech_list.we
 
 A browser window will be opened automatically to display the running result like below     (weex-toolkit version should be greater than 0.1.0, use `weex --version` to check it):
 
-![weex html5 render](http://gtms02.alicdn.com/tps/i2/TB1y151LVXXXXXXaXXXoRYgWVXX-495-584.jpg)
+![weex html5 render](https://gtms02.alicdn.com/tps/i2/TB1y151LVXXXXXXaXXXoRYgWVXX-495-584.jpg)
 
 ## Introduce to Weex Syntax
 
@@ -68,9 +67,9 @@ So it's time for introducing the syntax.
 
 Given the content of `tech_list.we`, Weex source code is composed of three parts -- *template*, *style*, and *script*, just like html, css, and javascript for the Web.
 
-Template is the skeleton that gives Weex structure. It is composed of tags which surround content and apply meaning to it. Weex has two types of tag, opening tag & closing tag. We call every pair of opening tags & closing tags a Weex tag. Tags have *attributes*, different attribute has different meaning, for example, `class` attribute makes it possible to define equal styles for multiple tags, `onclick` attribute makes the tag respond to click event.
+Template is the skeleton that gives Weex structure. It is composed of tags which surround content and apply meaning to it. Tags have *attributes*, different attribute means different feature, for example, `class` attribute makes it possible to define the same styles for multiple tags, `onclick` attribute makes the tag respond to click event.
 
-Style describes how Weex tags are to be displayed. We like you, love the CSS, so we try to keep consistent with CSS standard as possible. Weex Style supports a lot of CSS features, like margin, padding, fixed and so on. Better yet, flexbox layout (flex) is well supported in Weex Style.
+Style describes how Weex tags are to be displayed. We prefer CSS very much. So we try to keep consistent with CSS standard as possible. Weex Style supports a lot of CSS features, like margin, padding, fixed and so on. Better yet, flexbox layout (flex) is well supported in Weex Style.
 
 Script adds *data* & *logic* to Weex tags, helping you easily access local or remote data and update tags. You can also define some methods for your tag to respond to different events. Weex Script organization learns a lot from CommonJS module style.
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/component/input-demo.we
----------------------------------------------------------------------
diff --git a/examples/component/input-demo.we b/examples/component/input-demo.we
index ed52984..7056218 100644
--- a/examples/component/input-demo.we
+++ b/examples/component/input-demo.we
@@ -136,4 +136,4 @@
             }
         }
     };
-</script>
\ No newline at end of file
+</script>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/component/slider-neighbor/index.we
----------------------------------------------------------------------
diff --git a/examples/component/slider-neighbor/index.we b/examples/component/slider-neighbor/index.we
new file mode 100644
index 0000000..cbb608d
--- /dev/null
+++ b/examples/component/slider-neighbor/index.we
@@ -0,0 +1,74 @@
+<template>
+	<scroller style="flex-direction: column; background-color: #ffffff;width:750;height:600;border-width: 0;">
+		<div style="height:410; border-width:3; border-style:solid; border-color:#000000;margin:10;">
+		<slider-neighbor style="width:700;height:400;" neighbor-scale="0.8" neighbor-space="30" current-item-scale="0.95" interval="3000" neighbor-alpha="0.8" auto-play="{{attr_auto_play}}">
+			<container style="">
+				<image style="width:650;background-color:#FFFFDF;height:400;" src="https://gw.alicdn.com/tps/TB1dzanMVXXXXXQXVXXXXXXXXXX-573-412.png"></image>
+			</container>
+			<container style="">
+				<image style="width:650;background-color:#FFFFDF;height:400;" src="https://gw.alicdn.com/tps/TB1p9CCMVXXXXa_XFXXXXXXXXXX-450-340.png"></image>
+			</container>
+			<container style="">
+				<image style="width:650;background-color:#FFFFDF;height:400;" src="https://gw.alicdn.com/tps/TB1zpSiMVXXXXchXFXXXXXXXXXX-448-338.png"></image>
+			</container>
+      		<container style="">
+				<image style="width:650;background-color:#FFFFDF;height:400;" src="https://gw.alicdn.com/tps/TB1EuGIMVXXXXcoXpXXXXXXXXXX-452-337.png"></image>
+			</container>
+			<indicator style="height:60;position:absolute;bottom:15;width:700;left:0;itemSelectedColor:#0000FF;itemSize:20;itemColor:#FF0000;"></indicator>
+		</slider-neighbor>
+		</div>
+		<scroller style="height:100; border-width:0; margin:10;">
+			<TC_Support_SubTitle title="auto-play"></TC_Support_SubTitle>
+			<div repeat="btnList2100" style="flex-direction:row">
+				<text onclick="update2100" flagid="{{index}}" repeat="row" style="width:310; height:50;text-align: center; border-width: 1;border-color: #696969;border-style:solid;border-radius:5; margin:10; background-color: {{bgc}}">auto play: {{value}}</text>
+			</div>
+		</scroller>
+	</scroller>
+</template>
+
+
+<script>
+	module.exports = {
+		data : {
+			log_detail:[],
+			attr_auto_play:false,
+			btnList2100: [
+				{row:
+					[
+						{value: "false",bgc:'#EEEEEE',index:0},
+						{value: "true",bgc:'#EEEEEE',index:1},
+					],
+				},
+			],
+		},
+		methods : {
+			update2100: function (e) {
+				var self = this
+				var index = e.target.attr.flagid
+				for (var i = 0; i < self.btnList2100.length; i++) {
+					var row = self.btnList2100[i];
+					var columnlist = row.row;
+					for (var j = 0; j < columnlist.length; j++) {
+						var column = columnlist[j];
+						if (column.index === index) {
+							column.bgc = '#B2DFEE'
+							switch (index) {
+								case 0:
+									self.attr_auto_play=false;
+									break;
+								case 1:
+									self.attr_auto_play=true;
+									break;
+								default:
+									break;
+							}
+						}
+						else {
+							column.bgc = '#EEEEEE'
+						}
+					}
+				}
+			},
+		},
+	}
+</script>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/component/slider-neighbor/silder-neighbor.we
----------------------------------------------------------------------
diff --git a/examples/component/slider-neighbor/silder-neighbor.we b/examples/component/slider-neighbor/silder-neighbor.we
deleted file mode 100644
index 811afab..0000000
--- a/examples/component/slider-neighbor/silder-neighbor.we
+++ /dev/null
@@ -1,75 +0,0 @@
-<template>
-	<scroller style="flex-direction: column; background-color: #ffffff;width:750;height:600;border-width: 0;">
-		<TC_Support_MainTitle title="AG_Test_Slider-Neighbor_Auto_Play"></TC_Support_MainTitle>
-		<div style="height:410; border-width:3; border-style:solid; border-color:#000000;margin:10;">
-		<slider-neighbor style="width:700;height:400;" neighbor-scale="0.7" interval="3000" neighbor-alpha="0.8" auto-play="{{attr_auto_play}}">
-			<container style="">
-				<image style="width:650;background-color:#FFFFDF;height:400;" src="https://gw.alicdn.com/tps/TB1dzanMVXXXXXQXVXXXXXXXXXX-573-412.png"></image>
-			</container>
-			<container style="">
-				<image style="width:650;background-color:#FFFFDF;height:400;" src="https://gw.alicdn.com/tps/TB1p9CCMVXXXXa_XFXXXXXXXXXX-450-340.png"></image>
-			</container>
-			<container style="">
-				<image style="width:650;background-color:#FFFFDF;height:400;" src="https://gw.alicdn.com/tps/TB1zpSiMVXXXXchXFXXXXXXXXXX-448-338.png"></image>
-			</container>
-      		<container style="">
-				<image style="width:650;background-color:#FFFFDF;height:400;" src="https://gw.alicdn.com/tps/TB1EuGIMVXXXXcoXpXXXXXXXXXX-452-337.png"></image>
-			</container>
-			<indicator style="height:60;position:absolute;bottom:15;width:700;left:0;itemSelectedColor:#0000FF;itemSize:20;itemColor:#FF0000;"></indicator>
-		</slider-neighbor>
-		</div>
-		<scroller style="height:100; border-width:0; margin:10;">
-			<TC_Support_SubTitle title="auto-play"></TC_Support_SubTitle>
-			<div repeat="btnList2100" style="flex-direction:row">
-				<text onclick="update2100" flagid="{{index}}" repeat="row" style="width:310; height:50;text-align: center; border-width: 1;border-color: #696969;border-style:solid;border-radius:5; margin:10; background-color: {{bgc}}">auto play: {{value}}</text>
-			</div>
-		</scroller>
-	</scroller>
-</template>
-
-
-<script>
-	module.exports = {
-		data : {
-			log_detail:[],
-			attr_auto_play:false,
-			btnList2100: [
-				{row:
-					[
-						{value: "false",bgc:'#EEEEEE',index:0},
-						{value: "true",bgc:'#EEEEEE',index:1},
-					],
-				},
-			],
-		},
-		methods : {
-			update2100: function (e) {
-				var self = this
-				var index = e.target.attr.flagid
-				for (var i = 0; i < self.btnList2100.length; i++) {
-					var row = self.btnList2100[i];
-					var columnlist = row.row;
-					for (var j = 0; j < columnlist.length; j++) {
-						var column = columnlist[j];
-						if (column.index === index) {
-							column.bgc = '#B2DFEE'
-							switch (index) {
-								case 0:
-									self.attr_auto_play=false;
-									break;
-								case 1:
-									self.attr_auto_play=true;
-									break;
-								default:
-									break;
-							}
-						}
-						else {
-							column.bgc = '#EEEEEE'
-						}
-					}
-				}
-			},
-		},
-	}
-</script>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/component/web-demo.we
----------------------------------------------------------------------
diff --git a/examples/component/web-demo.we b/examples/component/web-demo.we
index 62cc209..2be930c 100644
--- a/examples/component/web-demo.we
+++ b/examples/component/web-demo.we
@@ -46,7 +46,6 @@
     module.exports = {
         methods: {
             goback: function() {
-                var $webview = require('@weex-module/webview');
                 var webElement = this.$el('webview');
                 $webview.goBack(webElement.ref);
              },

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/index.we
----------------------------------------------------------------------
diff --git a/examples/index.we b/examples/index.we
index 3b7adfa..bd79e8d 100644
--- a/examples/index.we
+++ b/examples/index.we
@@ -25,6 +25,7 @@
         {name: 'component/list/list-basic', title: 'List (Basic)'},
         {name: 'component/list/list-demo', title: 'List (Advanced)'},
         {name: 'component/slider/index', title: 'Slider'},
+        {name: 'component/slider-neighbor/index', title: 'Slider Neighbor'},
         {name: 'component/a-demo', title: 'A'},
         {name: 'component/video-demo', title: 'Video'},
         {name: 'component/countdown-demo', title: 'Countdown'},
@@ -38,6 +39,7 @@
         {name: 'module/instance-api', title: 'Instance API'},
         {name: 'module/modal', title: 'Modal'},
         {name: 'module/stream-demo', title: 'Stream'},
+        {name: 'module/websocket-demo', title: 'WebSocket'},
         {name: 'module/storage-demo',title:'Storage'},
         {name: 'module/picker-demo',title:'Picker'},
         {name: 'module/componentRect',title:'componentRect'},

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/module/stream-demo.we
----------------------------------------------------------------------
diff --git a/examples/module/stream-demo.we b/examples/module/stream-demo.we
index d52c1b0..e1817c8 100644
--- a/examples/module/stream-demo.we
+++ b/examples/module/stream-demo.we
@@ -91,7 +91,8 @@
       stream.fetch({
         method: 'POST',
         url: POST_URL,
-        type:'json'
+        type:'json',
+        body:JSON.stringify({username:'weex'})//or you can just use JSON Object {username:'weex'}
       }, function(ret) {
         if(!ret.ok){
           me.postResult = "request failed";

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/module/websocket-demo.we
----------------------------------------------------------------------
diff --git a/examples/module/websocket-demo.we b/examples/module/websocket-demo.we
new file mode 100644
index 0000000..11d9c11
--- /dev/null
+++ b/examples/module/websocket-demo.we
@@ -0,0 +1,112 @@
+<template>
+    <scroller>
+        <wxc-panel title="websocket" type="primary">
+            <input
+                    type="text"
+                    placeholder="please input message to send"
+                    class="input"
+                    autofocus="false"
+                    value=""
+                    onchange="onchange"
+                    oninput="oninput"
+                    id = "input"
+            />
+            <div style="flex-direction: row; justify-content: center;">
+                <wxc-button value="connect" size="small"  type="primary" onclick="{{connect}}"></wxc-button>
+                <wxc-button value="send" size="small" onclick="{{send}}" type="primary" style="margin-left:20px;"></wxc-button>
+                <wxc-button value="close" size="small" onclick="{{close}}" type="primary" style="margin-left:20px;"></wxc-button>
+
+            </div>
+
+            <wxc-panel title="method = send">
+                <text>{{sendinfo}}</text>
+            </wxc-panel>
+
+            <wxc-panel title="method = onopen">
+                <text>{{onopeninfo}}</text>
+            </wxc-panel>
+
+            <wxc-panel title="method = onmessage">
+                <text>{{onmessage}}</text>
+            </wxc-panel>
+
+            <wxc-panel title="method = onclose">
+                <text>{{oncloseinfo}}</text>
+            </wxc-panel>
+
+            <wxc-panel title="method = onerror">
+                <text>{{onerrorinfo}}</text>
+            </wxc-panel>
+
+            <wxc-panel title="method = close">
+                <text>{{closeinfo}}</text>
+            </wxc-panel>
+        </wxc-panel>
+    </scroller>
+</template>
+
+<style>
+    .input {
+        font-size: 40px;
+        height: 80px;
+        width: 600px;
+    }
+</style>
+
+<script>
+    require('weex-components');
+    var navigator = require('@weex-module/navigator');
+    var modal = require('@weex-module/modal');
+    var websocket = require('@weex-module/webSocket');
+    module.exports = {
+        data: {
+            connectinfo: '',
+            sendinfo: '',
+            onopeninfo: '',
+            onmessage: '',
+            oncloseinfo: '',
+            onerrorinfo: '',
+            closeinfo: '',
+            txtInput:'',
+            navBarHeight: 88,
+            title: 'Navigator',
+            dir: 'examples',
+            baseURL: '',
+        },
+        methods: {
+            connect:function() {
+                websocket.WebSocket('ws://115.29.193.48:8088','');
+                var self = this;
+                websocket.onopen = function(e)
+                {
+                    self.onopeninfo = e;
+                }
+                websocket.onmessage = function(e)
+                {
+                    self.onmessage = e.data;
+                }
+                websocket.onerror = function(e)
+                {
+                    self.onerrorinfo = e.data;
+                }
+                websocket.onclose = function(e)
+                {
+                    self.onerrorinfo = e.code;
+                }
+            },
+            send:function(e) {
+                var input = this.$el('input');
+                input.blur();
+                websocket.send(this.txtInput);
+                this.sendinfo = this.txtInput;
+
+            },
+            oninput: function(event) {
+                this.txtInput = event.value;
+            },
+            close:function(e) {
+                websocket.close();
+            },
+        }
+    };
+</script>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vanilla/index.js
----------------------------------------------------------------------
diff --git a/examples/vanilla/index.js b/examples/vanilla/index.js
index ac6cbc0..82d8d1d 100644
--- a/examples/vanilla/index.js
+++ b/examples/vanilla/index.js
@@ -5,7 +5,7 @@ var body = document.createElement('div', {
 })
 
 var image = document.createElement('image', {
-  attr: { src: 'http://alibaba.github.io/weex/img/weex_logo_blue@3x.png' },
+  attr: { src: 'https://alibaba.github.io/weex/img/weex_logo_blue@3x.png' },
   classStyle: { width: 360, height: 82 }
 })
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/animation.vue
----------------------------------------------------------------------
diff --git a/examples/vue/animation.vue b/examples/vue/animation.vue
index 84761bd..9b2b2c2 100644
--- a/examples/vue/animation.vue
+++ b/examples/vue/animation.vue
@@ -25,19 +25,21 @@
 <script>
   var animation = require('@weex-module/animation')
   module.exports = {
-    data: {
-      transformOrigin: 'center center',
-      current_rotate: 0,
-      current_scale: 1,
-      current_color: '#FF0000',
-      current_opacity: 1,
-      current_translate: '',
-      current_transform: '',
-      isStop: true
+    data: function () {
+      return {
+        transformOrigin: 'center center',
+        current_rotate: 0,
+        current_scale: 1,
+        current_color: '#FF0000',
+        current_opacity: 1,
+        current_translate: '',
+        current_transform: '',
+        isStop: true
+      }
     },
     components: {
-      panel: require('weex-vue-components/panel.vue'),
-      button: require('weex-vue-components/button.vue')
+      panel: require('./include/panel.vue'),
+      button: require('./include/button.vue')
     },
     methods: {
       anim: function(styles, timingFunction, duration, callback) {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/components/a.vue
----------------------------------------------------------------------
diff --git a/examples/vue/components/a.vue b/examples/vue/components/a.vue
index 7d6ed23..ff0149b 100644
--- a/examples/vue/components/a.vue
+++ b/examples/vue/components/a.vue
@@ -1,7 +1,7 @@
 <template>
   <scroller>
     <panel title="Hyperlink" type="primary">
-      <a href="http://g.tbcdn.cn/ali-wireless-h5/res/0.0.16/hello.js">
+      <a href="http://alibaba.github.io/weex/index.html">
         <tip type="info" style="margin-bottom: 20px;"
           value="Click me to see how 'A' element opens a new world."></tip>
       </a>
@@ -11,12 +11,14 @@
 
 <script>
   module.exports = {
-    data: {
-      img: '//gw.alicdn.com/tps/i2/TB1DpsmMpXXXXabaXXX20ySQVXX-512-512.png_400x400.jpg'
+    data: function () {
+      return {
+        img: '//gw.alicdn.com/tps/i2/TB1DpsmMpXXXXabaXXX20ySQVXX-512-512.png_400x400.jpg'
+      }
     },
     components: {
-      panel: require('weex-vue-components/panel.vue'),
-      tip: require('weex-vue-components/tip.vue')
+      panel: require('../include/panel.vue'),
+      tip: require('../include/tip.vue')
     }
   }
 </script>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/components/countdown.vue
----------------------------------------------------------------------
diff --git a/examples/vue/components/countdown.vue b/examples/vue/components/countdown.vue
index 36df716..cb29c43 100644
--- a/examples/vue/components/countdown.vue
+++ b/examples/vue/components/countdown.vue
@@ -55,27 +55,29 @@
 
 <script>
   module.exports = {
-    data: {
-      countdown1: {
-        remain: 5000,
-        time: {
-          D: '0',
-          hh: '00',
-          mm: '00',
-          ss: '00'
-        }
-      },
-      countdown2: {
-        remain: 5000,
-        time: {
-          MM: '0',
-          ss: '0'
+    data: function () {
+      return {
+        countdown1: {
+          remain: 5000,
+          time: {
+            D: '0',
+            hh: '00',
+            mm: '00',
+            ss: '00'
+          }
+        },
+        countdown2: {
+          remain: 5000,
+          time: {
+            MM: '0',
+            ss: '0'
+          }
         }
       }
     },
     components: {
-      panel: require('weex-vue-components/panel.vue'),
-      countdown: require('weex-vue-components/countdown.vue')
+      panel: require('../include/panel.vue'),
+      countdown: require('../include/countdown.vue')
     },
     methods: {
       tick: function (e, k) {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/components/image.vue
----------------------------------------------------------------------
diff --git a/examples/vue/components/image.vue b/examples/vue/components/image.vue
index 5bcf86b..c0a43ea 100644
--- a/examples/vue/components/image.vue
+++ b/examples/vue/components/image.vue
@@ -44,12 +44,14 @@
 
 <script>
   module.exports = {
-    data: {
-      img: '//gw.alicdn.com/tps/i2/TB1DpsmMpXXXXabaXXX20ySQVXX-512-512.png_400x400.jpg'
+    data: function () {
+      return {
+        img: '//gw.alicdn.com/tps/i2/TB1DpsmMpXXXXabaXXX20ySQVXX-512-512.png_400x400.jpg'
+      }
     },
     components: {
-      panel: require('weex-vue-components/panel.vue'),
-      tip: require('weex-vue-components/tip.vue')
+      panel: require('../include/panel.vue'),
+      tip: require('../include/tip.vue')
     }
   }
 </script>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/components/input.vue
----------------------------------------------------------------------
diff --git a/examples/vue/components/input.vue b/examples/vue/components/input.vue
index e2a957e..6f56fde 100644
--- a/examples/vue/components/input.vue
+++ b/examples/vue/components/input.vue
@@ -25,22 +25,31 @@
 </style>
 
 <script>
+  var modal = require('@weex-module/modal')
   module.exports = {
-    data: {
-      txtInput: '',
-      txtChange: ''
+    data: function () {
+      return {
+        txtInput: '',
+        txtChange: ''
+      }
     },
     components: {
-      panel: require('weex-vue-components/panel.vue')
+      panel: require('../include/panel.vue')
     },
     methods: {
       onchange: function(event) {
         this.txtChange = event.value;
-        console.log('onchange', event.value);
+        modal.toast({
+          message: 'onchange: ' + event.value,
+          duration: 2
+        })
       },
       oninput: function(event) {
         this.txtInput = event.value;
-        console.log('oninput', event.value);
+        modal.toast({
+          message: 'onitput: ' + event.value,
+          duration: 1
+        })
       }
     }
   };

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/components/list.vue
----------------------------------------------------------------------
diff --git a/examples/vue/components/list.vue b/examples/vue/components/list.vue
index 4c5b7f7..81056c3 100644
--- a/examples/vue/components/list.vue
+++ b/examples/vue/components/list.vue
@@ -3,6 +3,7 @@
     <list class="list">
       <cell
         v-for="(v,i) in rows"
+        append="tree"
         :index="i"
         class="row"
         @appear="onappear"
@@ -72,41 +73,43 @@
         this.appearMin = appearIds[0];
       }
     },
-    data: {
-      appearMin:1,
-      appearMax:1,
-      appearIds:[],
-      rows:[
-        {id: 1},
-        {id: 2},
-        {id: 3},
-        {id: 4},
-        {id: 5},
-        {id: 6},
-        {id: 7},
-        {id: 8},
-        {id: 9},
-        {id: 10},
-        {id: 11},
-        {id: 12},
-        {id: 13},
-        {id: 14},
-        {id: 15},
-        {id: 16},
-        {id: 17},
-        {id: 18},
-        {id: 19},
-        {id: 20},
-        {id: 21},
-        {id: 22},
-        {id: 23},
-        {id: 24},
-        {id: 25},
-        {id: 26},
-        {id: 27},
-        {id: 28},
-        {id: 29}
-      ]
+    data: function () {
+      return {
+        appearMin:1,
+        appearMax:1,
+        appearIds:[],
+        rows:[
+          {id: 1},
+          {id: 2},
+          {id: 3},
+          {id: 4},
+          {id: 5},
+          {id: 6},
+          {id: 7},
+          {id: 8},
+          {id: 9},
+          {id: 10},
+          {id: 11},
+          {id: 12},
+          {id: 13},
+          {id: 14},
+          {id: 15},
+          {id: 16},
+          {id: 17},
+          {id: 18},
+          {id: 19},
+          {id: 20},
+          {id: 21},
+          {id: 22},
+          {id: 23},
+          {id: 24},
+          {id: 25},
+          {id: 26},
+          {id: 27},
+          {id: 28},
+          {id: 29}
+        ]
+      }
     }
   }
 </script>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/components/marquee.vue
----------------------------------------------------------------------
diff --git a/examples/vue/components/marquee.vue b/examples/vue/components/marquee.vue
index ca0a4cc..0736112 100644
--- a/examples/vue/components/marquee.vue
+++ b/examples/vue/components/marquee.vue
@@ -37,24 +37,26 @@
 
 <script>
   module.exports = {
-    data: {
-      marquee: {
-        height: 30,
-        duration: 1500,
-        interval: 2000,
-        list: [
-          {text: 'Introducing Bots on Messenger'},
-          {text: 'Capturing 3D 360-Stereo VR Video'},
-          {text: 'The Future of Video on Facebook'},
-          {text: 'Announcing Vue.js 2.0'},
-          {text: 'Not Your Average Virtual-DOM'},
-          {text: 'Templates, JSX, or Hyperscript?'}
-        ]
+    data: function () {
+      return {
+        marquee: {
+          height: 30,
+          duration: 1500,
+          interval: 2000,
+          list: [
+            {text: 'Introducing Bots on Messenger'},
+            {text: 'Capturing 3D 360-Stereo VR Video'},
+            {text: 'The Future of Video on Facebook'},
+            {text: 'Announcing Vue.js 2.0'},
+            {text: 'Not Your Average Virtual-DOM'},
+            {text: 'Templates, JSX, or Hyperscript?'}
+          ]
+        }
       }
     },
     components: {
-      panel: require('weex-vue-components/panel.vue'),
-      marquee: require('weex-vue-components/marquee.vue')
+      panel: require('../include/panel.vue'),
+      marquee: require('../include/marquee.vue')
     },
     methods: {
       marqueeChange: function (e) {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/components/navigator.vue
----------------------------------------------------------------------
diff --git a/examples/vue/components/navigator.vue b/examples/vue/components/navigator.vue
index 48e98b8..7b0d15b 100644
--- a/examples/vue/components/navigator.vue
+++ b/examples/vue/components/navigator.vue
@@ -23,16 +23,18 @@
   var navigator = require('@weex-module/navigator')
   var getBaseURL = require('../include/base-url.js').getBaseURL
   module.exports = {
-    data: {
-      navBarHeight: 88,
-      title: 'Navigator',
-      dir: 'examples',
-      baseURL: '',
+    data: function () {
+      return {
+        navBarHeight: 88,
+        title: 'Navigator',
+        dir: 'examples',
+        baseURL: ''
+      }
     },
     components: {
-      panel: require('weex-vue-components/panel.vue'),
-      navpage: require('weex-vue-components/navpage.vue'),
-      button: require('weex-vue-components/button.vue')
+      panel: require('../include/panel.vue'),
+      navpage: require('../include/navpage.vue'),
+      button: require('../include/button.vue')
     },
     created: function() {
       this.$getConfig(function (config) {
@@ -41,7 +43,7 @@
           var scale = env.scale;
           var deviceWidth = env.deviceWidth / scale;
           this.navBarHeight = 64.0 * 750.0 / deviceWidth;
-        }   
+        }
       }.bind(this));
       this.baseURL = getBaseURL(this)
     },

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/components/scroller.vue
----------------------------------------------------------------------
diff --git a/examples/vue/components/scroller.vue b/examples/vue/components/scroller.vue
index 94bf4b3..d5d4610 100644
--- a/examples/vue/components/scroller.vue
+++ b/examples/vue/components/scroller.vue
@@ -87,75 +87,77 @@
         }, 1000)
       }
     },
-    data: {
-      refresh_display: 'hide',
-      loading_display: 'hide',
-      sections: [
-        {
-          title: 'Header 1',
-          items: [
-            {id: 1},
-            {id: 2},
-            {id: 3},
-            {id: 4},
-            {id: 5}
-          ]
-        },
-        {
-          title: 'Header 2',
-          items: [
-            {id: 6},
-            {id: 7},
-            {id: 8},
-            {id: 9},
-            {id: 10},
-            {id: 11}
-          ]
-        }
-      ],
-      moreSections: [
-        {
-          title: 'Header 3',
-          items: [
-            {id: 12},
-            {id: 13},
-            {id: 14},
-            {id: 15},
-            {id: 16},
-            {id: 17},
-            {id: 18}
-          ]
-        },
-        {
-          title: 'Header 4',
-          items: [
-            {id: 19},
-            {id: 20},
-            {id: 21},
-            {id: 22}
-          ]
-        },
-        {
-          title: 'Header 5',
-          items: [
+    data: function () {
+      return {
+        refresh_display: 'hide',
+        loading_display: 'hide',
+        sections: [
+          {
+            title: 'Header 1',
+            items: [
+              {id: 1},
+              {id: 2},
+              {id: 3},
+              {id: 4},
+              {id: 5}
+            ]
+          },
+          {
+            title: 'Header 2',
+            items: [
+              {id: 6},
+              {id: 7},
+              {id: 8},
+              {id: 9},
+              {id: 10},
+              {id: 11}
+            ]
+          }
+        ],
+        moreSections: [
+          {
+            title: 'Header 3',
+            items: [
+              {id: 12},
+              {id: 13},
+              {id: 14},
+              {id: 15},
+              {id: 16},
+              {id: 17},
+              {id: 18}
+            ]
+          },
+          {
+            title: 'Header 4',
+            items: [
+              {id: 19},
+              {id: 20},
+              {id: 21},
+              {id: 22}
+            ]
+          },
+          {
+            title: 'Header 5',
+            items: [
             {id: 23},
             {id: 24},
             {id: 25},
             {id: 26},
             {id: 27}
-          ]
-        },
-        {
-          title: 'Header 6',
-          items: [
+            ]
+          },
+          {
+            title: 'Header 6',
+            items: [
             {id: 28},
             {id: 29},
             {id: 30},
             {id: 31},
             {id: 32}
+            ]
+          }
           ]
-        }
-      ]
+      }
     }
   }
 </script>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/components/slider.vue
----------------------------------------------------------------------
diff --git a/examples/vue/components/slider.vue b/examples/vue/components/slider.vue
index b2a9dba..9359ac5 100644
--- a/examples/vue/components/slider.vue
+++ b/examples/vue/components/slider.vue
@@ -77,16 +77,59 @@
   var img0 = '//gw.alicdn.com/tps/i2/TB1DpsmMpXXXXabaXXX20ySQVXX-512-512.png_400x400.jpg';
   var img1 = '//gw.alicdn.com/tps/i1/TB1M3sQMpXXXXakXXXXApNeJVXX-360-360.png';
   module.exports = {
-    data: {
-      eventCnt: 0,
-      togglePlayMsg: 'pause',
-      sliders: [
-        {
-          interval: 1000,
-          autoPlay: true,
-          sliderPages: [
-            {
-              items: [
+    data: function () {
+      return {
+        eventCnt: 0,
+        togglePlayMsg: 'pause',
+        sliders: [
+          {
+            interval: 1000,
+            autoPlay: true,
+            sliderPages: [
+              {
+                items: [
+                  {
+                    image: img0,
+                    link: '//h5.m.taobao.com/1'
+                  },
+                  {
+                    image: img0,
+                    link: '//h5.m.taobao.com/1'
+                  }
+                ]
+              },
+              {
+                items: [
+                  {
+                    image: img1,
+                    link: '//h5.m.taobao.com/1'
+                  },
+                  {
+                    image: img1,
+                    link: '//h5.m.taobao.com/1'
+                  }
+                ]
+              },
+              {
+                items: [
+                  {
+                    image: img0,
+                    link: '//h5.m.taobao.com/1'
+                  },
+                  {
+                    image: img1,
+                    link: '//h5.m.taobao.com/1'
+                  }
+                ]
+              }
+            ]
+          },
+          {
+            interval: 3000,
+            autoPlay: true,
+            sliderPages: [
+              {
+                items: [
                 {
                   image: img0,
                   link: '//h5.m.taobao.com/1'
@@ -95,10 +138,10 @@
                   image: img0,
                   link: '//h5.m.taobao.com/1'
                 }
-              ]
-            },
-            {
-              items: [
+                ]
+              },
+              {
+                items: [
                 {
                   image: img1,
                   link: '//h5.m.taobao.com/1'
@@ -107,10 +150,10 @@
                   image: img1,
                   link: '//h5.m.taobao.com/1'
                 }
-              ]
-            },
-            {
-              items: [
+                ]
+              },
+              {
+                items: [
                 {
                   image: img0,
                   link: '//h5.m.taobao.com/1'
@@ -119,58 +162,16 @@
                   image: img1,
                   link: '//h5.m.taobao.com/1'
                 }
-              ]
-            }
-          ]
-        },
-        {
-          interval: 3000,
-          autoPlay: true,
-          sliderPages: [
-            {
-              items: [
-                {
-                  image: img0,
-                  link: '//h5.m.taobao.com/1'
-                },
-                {
-                  image: img0,
-                  link: '//h5.m.taobao.com/1'
-                }
+                ]
+              }
               ]
             },
             {
-              items: [
-                {
-                  image: img1,
-                  link: '//h5.m.taobao.com/1'
-                },
-                {
-                  image: img1,
-                  link: '//h5.m.taobao.com/1'
-                }
-              ]
-            },
-            {
-              items: [
-                {
-                  image: img0,
-                  link: '//h5.m.taobao.com/1'
-                },
-                {
-                  image: img1,
-                  link: '//h5.m.taobao.com/1'
-                }
-              ]
-            }
-          ]
-        },
-        {
-          interval: 5000,
-          autoPlay: true,
-          sliderPages: [
-            {
-              items: [
+              interval: 5000,
+              autoPlay: true,
+              sliderPages: [
+              {
+                items: [
                 {
                   image: img0,
                   link: '//h5.m.taobao.com/1'
@@ -179,10 +180,10 @@
                   image: img0,
                   link: '//h5.m.taobao.com/1'
                 }
-              ]
-            },
-            {
-              items: [
+                ]
+              },
+              {
+                items: [
                 {
                   image: img1,
                   link: '//h5.m.taobao.com/1'
@@ -191,10 +192,10 @@
                   image: img1,
                   link: '//h5.m.taobao.com/1'
                 }
-              ]
-            },
-            {
-              items: [
+                ]
+              },
+              {
+                items: [
                 {
                   image: img0,
                   link: '//h5.m.taobao.com/1'
@@ -203,14 +204,15 @@
                   image: img1,
                   link: '//h5.m.taobao.com/1'
                 }
+                ]
+              }
               ]
             }
-          ]
-        }
-      ]
+            ]
+      }
     },
     components: {
-      panel: require('weex-vue-components/panel.vue'),
+      panel: require('../include/panel.vue'),
       sliderPage: require('../include/slider-page.vue')
     },
     methods: {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/components/tabbar.vue
----------------------------------------------------------------------
diff --git a/examples/vue/components/tabbar.vue b/examples/vue/components/tabbar.vue
index 7c9b212..7cc54ae 100644
--- a/examples/vue/components/tabbar.vue
+++ b/examples/vue/components/tabbar.vue
@@ -7,43 +7,45 @@
 <script>
   var getBaseURL = require('../include/base-url.js').getBaseURL
   module.exports = {
-    data: {
-      dir: 'examples',
-      tabItems: [
-        {
-          index: 0,
-          title: 'tab1',
-          titleColor: '#000000',
-          icon: '',
-          image: 'http://gtms01.alicdn.com/tps/i1/TB1qw.hMpXXXXagXXXX9t7RGVXX-46-46.png',
-          selectedImage: 'http://gtms04.alicdn.com/tps/i4/TB16jjPMpXXXXazXVXX9t7RGVXX-46-46.png',
-          src: 'component/tabbar/tabbar-item.js?itemId=tab1',
-          visibility: 'visible',
-        },
-        {
-          index: 1,
-          title: 'tab2',
-          titleColor: '#000000',
-          icon: '',
-          image: 'http://gtms03.alicdn.com/tps/i3/TB1LEn9MpXXXXaUXpXX9t7RGVXX-46-46.png',
-          selectedImage: 'http://gtms02.alicdn.com/tps/i2/TB1qysbMpXXXXcnXXXX9t7RGVXX-46-46.png',
-          src: 'component/tabbar/tabbar-item.js?itemId=tab2',
-          visibility: 'hidden',
-        },
-        {
-          index: 2,
-          title: 'tab3',
-          titleColor: '#000000',
-          icon: '',
-          image: 'http://gtms01.alicdn.com/tps/i1/TB1B0v5MpXXXXcvXpXX9t7RGVXX-46-46.png',
-          selectedImage: 'http://gtms04.alicdn.com/tps/i4/TB1NxY5MpXXXXcrXpXX9t7RGVXX-46-46.png',
-          src: 'component/tabbar/tabbar-item.js?itemId=tab3',
-          visibility: 'hidden',
-        }
-      ],
+    data: function () {
+      return {
+        dir: 'examples',
+        tabItems: [
+          {
+            index: 0,
+            title: 'tab1',
+            titleColor: '#000000',
+            icon: '',
+            image: 'http://gtms01.alicdn.com/tps/i1/TB1qw.hMpXXXXagXXXX9t7RGVXX-46-46.png',
+            selectedImage: 'http://gtms04.alicdn.com/tps/i4/TB16jjPMpXXXXazXVXX9t7RGVXX-46-46.png',
+            src: 'component/tabbar/tabbar-item.js?itemId=tab1',
+            visibility: 'visible',
+          },
+          {
+            index: 1,
+            title: 'tab2',
+            titleColor: '#000000',
+            icon: '',
+            image: 'http://gtms03.alicdn.com/tps/i3/TB1LEn9MpXXXXaUXpXX9t7RGVXX-46-46.png',
+            selectedImage: 'http://gtms02.alicdn.com/tps/i2/TB1qysbMpXXXXcnXXXX9t7RGVXX-46-46.png',
+            src: 'component/tabbar/tabbar-item.js?itemId=tab2',
+            visibility: 'hidden',
+          },
+          {
+            index: 2,
+            title: 'tab3',
+            titleColor: '#000000',
+            icon: '',
+            image: 'http://gtms01.alicdn.com/tps/i1/TB1B0v5MpXXXXcvXpXX9t7RGVXX-46-46.png',
+            selectedImage: 'http://gtms04.alicdn.com/tps/i4/TB1NxY5MpXXXXcrXpXX9t7RGVXX-46-46.png',
+            src: 'component/tabbar/tabbar-item.js?itemId=tab3',
+            visibility: 'hidden',
+          }
+        ],
+      }
     },
     components: {
-      tabbar: require('weex-vue-components/tabbar.vue')
+      tabbar: require('../include/tabbar.vue')
     },
     created: function() {
       var baseURL = getBaseURL(this)

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/components/text.vue
----------------------------------------------------------------------
diff --git a/examples/vue/components/text.vue b/examples/vue/components/text.vue
index d4fd69c..277e95e 100644
--- a/examples/vue/components/text.vue
+++ b/examples/vue/components/text.vue
@@ -54,7 +54,7 @@
 <script>
   module.exports = {
     components: {
-      panel: require('weex-vue-components/panel.vue')
+      panel: require('../include/panel.vue')
     }
   }
 </script>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/components/video.vue
----------------------------------------------------------------------
diff --git a/examples/vue/components/video.vue b/examples/vue/components/video.vue
index 6e1da0e..df49f30 100644
--- a/examples/vue/components/video.vue
+++ b/examples/vue/components/video.vue
@@ -5,8 +5,8 @@
            auto-play="true" :playStatus="playStatus">
     </video>
     <div style="flex-direction: row; justify-content: center;">
-      <button value="Pause" @click="pause"></button>
-      <button value="Play" @click="play" type="primary" style="margin-left:20px;"></button>
+      <button value="Pause" @click.native="pause"></button>
+      <button value="Play" @click.native="play" type="primary" style="margin-left:20px;"></button>
     </div>
   </scroller>
 </template>
@@ -22,18 +22,22 @@
 <script>
   var modal = require('@weex-module/modal')
   module.exports = {
-    data: {
-      playStatus: 'play'
+    data: function () {
+      return {
+        playStatus: 'play'
+      }
     },
     components: {
-      button: require('weex-vue-components/button.vue')
+      button: require('../include/button.vue')
     },
     methods: {
       pause: function() {
         this.playStatus = 'pause'
+        modal.toast({ 'message': 'click pause' })
       },
       play: function() {
         this.playStatus = 'play'
+        modal.toast({ 'message': 'click play' })
       },
       onpause: function(e) {
         this.playStatus = e.playStatus

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/components/web.vue
----------------------------------------------------------------------
diff --git a/examples/vue/components/web.vue b/examples/vue/components/web.vue
index 7934f5b..7e66c64 100644
--- a/examples/vue/components/web.vue
+++ b/examples/vue/components/web.vue
@@ -11,7 +11,7 @@
         style="margin-left:30px;width:210px; margin-top:5px; margin-bottom:5px"
         @click.native="refresh"></button>
     </div>
-    <web class="content" ref="webview" src='https://m.taobao.com/?spm=0.0.0.0&v=0#index'
+    <web class="content" ref="webview" src='http://alibaba.github.io/weex/index.html'
       @pagestart="startload" @pagefinish="finishload" @error="failload"></web>
   </div>
 </template>
@@ -48,7 +48,7 @@
   var webview = require('@weex-module/webview');
   module.exports = {
     components: {
-      button: require('weex-vue-components/button.vue')
+      button: require('../include/button.vue')
     },
     methods: {
       goback: function() {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/include/button.vue
----------------------------------------------------------------------
diff --git a/examples/vue/include/button.vue b/examples/vue/include/button.vue
new file mode 100644
index 0000000..63612df
--- /dev/null
+++ b/examples/vue/include/button.vue
@@ -0,0 +1,162 @@
+<!-- Inspired by bootstrap http://getbootstrap.com/ -->
+<template>
+  <div :class="['btn', 'btn-' + type, 'btn-sz-' + size]">
+    <text :class="['btn-txt', 'btn-txt-' + type, 'btn-txt-sz-' + size]">{{value}}</text>
+  </div>
+</template>
+
+<script>
+  module.exports = {
+    props: {
+      type: { default: 'default' },
+      size: { default: 'large' },
+      value: { default: '' }
+    }
+  }
+</script>
+
+<style>
+  .btn {
+    margin-bottom: 0;
+    align-items: center;
+    justify-content: center;
+    border-width: 1px;
+    border-style: solid;
+    border-color: #333;
+
+    /*white-space: nowrap;*/
+    /*vertical-align: middle;*/
+    /*touch-action: manipulation;*/
+    /*cursor: pointer;*/
+    /*-webkit-user-select: none;*/
+    /*background-image: none;*/
+    /*border-image-source: initial;*/
+    /*border-image-slice: initial;*/
+    /*border-image-width: initial;*/
+    /*border-image-outset: initial;*/
+    /*border-image-repeat: initial;*/
+  }
+
+  .btn-txt {
+
+  }
+
+  /**TYPE**/
+
+  .btn-default {
+    color: rgb(51, 51, 51);
+  }
+
+  .btn-primary {
+    background-color: rgb(40, 96, 144);
+    border-color: rgb(40, 96, 144);
+  }
+
+  .btn-success {
+    background-color: rgb(92, 184, 92);
+    border-color: rgb(76, 174, 76);
+  }
+
+  .btn-info {
+    background-color: rgb(91, 192, 222);
+    border-color: rgb(70, 184, 218);
+  }
+
+  .btn-warning {
+    background-color: rgb(240, 173, 78);
+    border-color: rgb(238, 162, 54);
+  }
+
+  .btn-danger {
+    background-color: rgb(217, 83, 79);
+    border-color: rgb(212, 63, 58);
+  }
+
+  .btn-link {
+    border-color: transparent;
+    border-radius: 0;
+  }
+
+  .btn-txt-default {
+    color: rgb(51, 51, 51);
+  }
+
+  .btn-txt-primary {
+    color: rgb(255, 255, 255);
+  }
+
+  .btn-txt-success {
+    color: rgb(255, 255, 255);
+  }
+
+  .btn-txt-info {
+    color: rgb(255, 255, 255);
+  }
+
+  .btn-txt-warning {
+    color: rgb(255, 255, 255);
+  }
+
+  .btn-txt-danger {
+    color: rgb(255, 255, 255);
+  }
+
+  .btn-txt-link {
+    color: rgb(51, 122, 183);
+    /*font-weight: 400;*/
+  }
+
+  /**SIZE**/
+
+  .btn-sz-large {
+    width: 300px;
+    height: 100px;
+    padding-top: 25px;
+    padding-bottom: 25px;
+    padding-left: 40px;
+    padding-right: 40px;
+    /*line-height: 1.33333;*/
+    border-radius: 15px;
+  }
+
+  .btn-sz-middle {
+    width: 240px;
+    height: 80px;
+    padding-top: 15px;
+    padding-bottom: 15px;
+    padding-left: 30px;
+    padding-right: 30px;
+    /*line-height: 1.42857;*/
+    border-radius: 10px;
+  }
+
+  .btn-sz-small {
+    width: 170px;
+    height: 60px;
+    padding-top: 12px;
+    padding-bottom: 12px;
+    padding-left: 25px;
+    padding-right: 25px;
+    /*line-height: 1.5;*/
+    border-radius: 7px;
+  }
+
+  .btn-txt-sz-large {
+    font-size: 45px;
+  }
+
+  .btn-txt-sz-middle {
+    font-size: 35px;
+  }
+
+  .btn-txt-sz-small {
+    font-size: 30px;
+  }
+
+  /*DISABLED*/
+
+  .disabled {
+
+  }
+
+</style>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/include/countdown.vue
----------------------------------------------------------------------
diff --git a/examples/vue/include/countdown.vue b/examples/vue/include/countdown.vue
new file mode 100644
index 0000000..4058ed2
--- /dev/null
+++ b/examples/vue/include/countdown.vue
@@ -0,0 +1,93 @@
+<template>
+  <div style="overflow: hidden; flex-direction: row;"
+  v-on:appear="appeared"
+  v-on:disappear="disappeared">
+  <slot></slot>
+</div>
+</template>
+
+<style>
+.wrap {
+  overflow: hidden;
+}
+</style>
+
+<script>
+function format (str) {
+  if (str.length >= 2) {
+    return str;
+  } else {
+    return '0' + str;
+  }
+}
+
+function getTime(target, now) {
+  var remain = parseInt((target - now) / 1000)
+  var D = String(parseInt(remain / 86400))
+  var DD = format(D)
+  var h = String(parseInt((remain - parseInt(D) * 86400) / 3600))
+  var hh = format(h)
+  var H = String(parseInt(remain / 3600))
+  var HH = format(H)
+  var m = String(parseInt((remain - parseInt(H) * 3600) / 60))
+  var mm = format(m)
+  var M = String(parseInt(remain / 60))
+  var MM = format(M)
+  var s = String(remain - parseInt(M) * 60)
+  var ss = format(s)
+  var S = String(remain)
+  var SS = format(S)
+  return {
+    D: D, DD: DD,
+    h: h, hh: hh,
+    H: H, HH: HH,
+    m: m, mm: mm,
+    M: M, MM: MM,
+    s: s, ss: ss,
+    S: S, SS: SS
+  }
+}
+
+module.exports = {
+  props: {
+    remain: {
+      default: 0
+    }
+  },
+  data: function () {
+    return {
+      now: 0,
+      target: 0,
+      outofview: false
+    }
+  },
+  created: function() {
+    this.now = Date.now();
+    this.target = this.now + this.remain * 1000
+    if (this.remain > 0) {
+      this.run();
+    }
+  },
+  methods: {
+    run: function() {
+      if (!this.outofview) {
+        this.now = Date.now()
+      }
+      var time = getTime(this.target, this.now)
+      if (this.target >= this.now) {
+        this.$emit('tick', time)
+      } else {
+        this.$emit('alarm', time)
+        return
+      }
+      setTimeout(this.run.bind(this), 1000)
+    },
+    appeared: function() {
+      this.outofview = false
+    },
+    disappeared: function() {
+      this.outofview = true
+    }
+  }
+}
+</script>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/include/example-list-item.vue
----------------------------------------------------------------------
diff --git a/examples/vue/include/example-list-item.vue b/examples/vue/include/example-list-item.vue
index 2b69a88..c78d1da 100644
--- a/examples/vue/include/example-list-item.vue
+++ b/examples/vue/include/example-list-item.vue
@@ -19,7 +19,7 @@
       url: { default: '' }
     },
     components: {
-      listItem: require('weex-vue-components/list-item.vue')
+      listItem: require('./list-item.vue')
     },
     methods: {
       redirect: function() {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/include/hn.vue
----------------------------------------------------------------------
diff --git a/examples/vue/include/hn.vue b/examples/vue/include/hn.vue
new file mode 100644
index 0000000..52c5742
--- /dev/null
+++ b/examples/vue/include/hn.vue
@@ -0,0 +1,47 @@
+<template>
+  <div :class="['h' + level]" style="justify-content: center;">
+    <text :class="['txt-h' + level]">{{value}}</text>
+  </div>
+</template>
+
+<script>
+  module.exports = {
+    props: {
+      level: { default: 1 },
+      value: { default: '' }
+    }
+  }
+</script>
+
+<style>
+  .h1 {
+    height: 110px;
+    padding-top: 20px;
+    padding-bottom: 20px;
+  }
+
+  .h2 {
+    height: 110px;
+    padding-top: 20px;
+    padding-bottom: 20px;
+  }
+
+  .h3 {
+    height: 110px;
+    padding-top: 20px;
+    padding-bottom: 20px;
+  }
+  
+
+  .txt-h1 {
+    font-size: 70px;
+  }
+
+  .txt-h2 {
+    font-size: 52px;
+  }
+
+  .txt-h3 {
+    font-size: 42px;
+  }
+</style>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/include/list-item.vue
----------------------------------------------------------------------
diff --git a/examples/vue/include/list-item.vue b/examples/vue/include/list-item.vue
new file mode 100644
index 0000000..9e62712
--- /dev/null
+++ b/examples/vue/include/list-item.vue
@@ -0,0 +1,46 @@
+<template>
+  <div
+    :style="{ backgroundColor: bgColor }"
+    class="item"
+    v-on:click="click"
+    v-on:touchstart="touchstart"
+    v-on:touchend="touchend">
+    <slot></slot>
+  </div>
+</template>
+
+<script>
+  module.exports = {
+    props:  {
+      bgColor: { default: '#ffffff' }
+    },
+    methods: {
+      click: function () {
+        this.$emit('click')
+      },
+      touchstart: function() {
+        // FIXME android touch
+        // TODO adaptive opposite bgColor
+        // this.bgColor = '#e6e6e6';
+      },
+      touchend: function() {
+        // FIXME android touchend not triggered
+        // this.bgColor = '#ffffff';
+      }
+    }
+  }
+</script>
+
+<style>
+  .item {
+    padding-top: 25px;
+    padding-bottom: 25px;
+    padding-left: 35px;
+    padding-right: 35px;
+    height: 160px;
+    justify-content: center;
+    /*margin-bottom: 1px; FUTURE */
+    border-bottom-width: 1px;
+    border-color: #dddddd;
+  }
+</style>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/include/marquee.vue
----------------------------------------------------------------------
diff --git a/examples/vue/include/marquee.vue b/examples/vue/include/marquee.vue
new file mode 100644
index 0000000..35d0f04
--- /dev/null
+++ b/examples/vue/include/marquee.vue
@@ -0,0 +1,78 @@
+<template>
+  <div
+    class="wrap"
+    @appear="appeared"
+    @disappear="disappeared">
+    <div
+      ref="anim"
+      class="anim">
+      <slot></slot>
+    </div>
+  </div>
+</template>
+
+<style>
+  .wrap {
+    overflow: hidden;
+    position: relative;
+  }
+  .anim {
+    flex-direction: column;
+    position: absolute;
+    transform: translateY(0) translateZ(0);
+  }
+</style>
+
+<script>
+  var animation = require('@weex-module/animation')
+
+  module.exports = {
+    props: {
+      step: { default: 0 },
+      count: { default: 0 },
+      index: { default: 1 },
+      duration: { default: 0 },
+      interval: { default: 0 },
+      outofview: { default: false }
+    },
+    created: function () {
+      if (this.interval > 0 && this.step > 0 && this.duration > 0) {
+        this.run()
+      }
+    },
+    methods: {
+      run: function () {
+        if (this.outofview) {
+          setTimeout(this.run.bind(this), this.interval)
+        } else {
+          setTimeout(function () {
+            this.animation(this.run.bind(this))
+          }.bind(this), this.interval)
+        }
+      },
+      animation: function (cb) {
+        var offset = -this.step * this.index;
+        animation.transition(this.$refs.anim.ref, {
+          styles: {
+            transform: 'translateY(' + offset + 'px) translateZ(0)'
+          },
+          timingFunction: 'ease',
+          duration: this.duration
+        }, function () {
+          this.index = (this.index + 1) % (this.count);
+          this.$emit('change', {
+            index: this.index,
+            count: this.count
+          });
+          cb && cb();
+        }.bind(this));
+      },
+      appeared: function() {
+        this.outofview = false
+      },
+      disappeared: function() {
+        this.outofview = true
+      }
+    }
+  }
+</script>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/include/navbar.vue
----------------------------------------------------------------------
diff --git a/examples/vue/include/navbar.vue b/examples/vue/include/navbar.vue
new file mode 100644
index 0000000..9e755f2
--- /dev/null
+++ b/examples/vue/include/navbar.vue
@@ -0,0 +1,121 @@
+<template>
+  <div
+    :dataRole="dataRole"
+    class="container"
+    :style="{ height: height, backgroundColor: backgroundColor }">
+    <text
+      v-if="!rightItemSrc"
+      naviItemPosition="right"
+      :style="{ color: rightItemColor }"
+      class="right-text"
+      v-on:click="onclickrightitem">{{rightItemTitle}}</text>
+    <image
+      v-if="rightItemSrc"
+      naviItemPosition="right"
+      :src="rightItemSrc"
+      class="right-image"
+      v-on:click="onclickrightitem"></image>
+    <text
+      v-if="!leftItemSrc"
+      naviItemPosition="left"
+      :style="{ color: leftItemColor }"
+      class="left-text"
+      v-on:click="onclickleftitem">{{leftItemTitle}}</text>
+    <image
+      v-if="leftItemSrc"
+      naviItemPosition="left"
+      :src="leftItemSrc"
+      class="left-image"
+      v-on:click="onclickleftitem"></image>
+    <text
+      naviItemPosition="center"
+      :style="{ color: titleColor }"
+      class="center-text">{{title}}</text>
+  </div>
+</template>
+
+<style>
+  .container {
+    flex-direction: row; 
+    position: fixed; 
+    top: 0; 
+    left: 0; 
+    right: 0; 
+    width: 750;
+  }
+  .right-text {
+    position: absolute; 
+    bottom: 28; 
+    right: 32; 
+    text-align: right;
+    font-size: 32; 
+    font-family: 'Open Sans', sans-serif;
+  }
+  .left-text {
+    position: absolute; 
+    bottom: 28; 
+    left :32; 
+    text-align :left;  
+    font-size: 32; 
+    font-family: 'Open Sans', sans-serif;
+  }
+  .center-text {
+    position: absolute; 
+    bottom: 25; 
+    left: 172; 
+    right: 172;
+    text-align: center; 
+    font-size: 36; 
+    font-weight: bold;
+  }
+  .left-image {
+    position: absolute; 
+    bottom: 20; 
+    left: 28; 
+    width: 50; 
+    height: 50;
+  }
+  .right-image {
+    position: absolute; 
+    bottom: 20; 
+    right: 28; 
+    width: 50; 
+    height: 50;
+  }
+</style>
+
+<script>
+  module.exports = {
+    props: {
+      dataRole: { default: 'navbar' },
+      //\u5bfc\u822a\u6761\u80cc\u666f\u8272
+      backgroundColor: { default: 'black' },
+      //\u5bfc\u822a\u6761\u9ad8\u5ea6
+      height: { default: 88 },
+      //\u5bfc\u822a\u6761\u6807\u9898 
+      title: { default: '' },
+      //\u5bfc\u822a\u6761\u6807\u9898\u989c\u8272
+      titleColor: { default: 'black' },
+      //\u53f3\u4fa7\u6309\u94ae\u56fe\u7247
+      rightItemSrc: { default: '' },
+      //\u53f3\u4fa7\u6309\u94ae\u6807\u9898
+      rightItemTitle: { default: '' },
+      //\u53f3\u4fa7\u6309\u94ae\u6807\u9898\u989c\u8272
+      rightItemColor: { default: 'black' },
+      //\u5de6\u4fa7\u6309\u94ae\u56fe\u7247
+      leftItemSrc: { default: '' },
+      //\u5de6\u4fa7\u6309\u94ae\u6807\u9898
+      leftItemTitle: { default: '' },
+      //\u5de6\u4fa7\u6309\u94ae\u989c\u8272
+      leftItemColor: { default: 'black' }
+    },
+    methods: {
+      onclickrightitem: function (e) {
+        this.$emit('naviBarRightItemClick');
+      },
+      onclickleftitem: function (e) {
+        this.$emit('naviBarLeftItemClick');
+      }
+    }
+  }
+</script>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/include/navpage.vue
----------------------------------------------------------------------
diff --git a/examples/vue/include/navpage.vue b/examples/vue/include/navpage.vue
new file mode 100644
index 0000000..2fd6e49
--- /dev/null
+++ b/examples/vue/include/navpage.vue
@@ -0,0 +1,62 @@
+<template>
+  <div class="wrapper">
+    <navbar
+      :dataRole="dataRole"
+      :height="height"
+      :backgroundColor="backgroundColor"
+      :title="title"
+      :titleColor="titleColor"
+      :leftItemSrc="leftItemSrc"
+      :leftItemTitle="leftItemTitle"
+      :leftItemColor="leftItemColor"
+      :rightItemSrc="rightItemSrc"
+      :rightItemTitle="rightItemTitle"
+      :rightItemColor="rightItemColor"
+      @naviBarRightItemClick="naviBarRightItemClick"
+      @naviBarLeftItemClick="naviBarLeftItemClick"
+      ></navbar>
+    <div class="wrapper" :style="{ marginTop: height }">
+      <slot></slot>
+    </div>
+  </div>
+</template>
+
+<style>
+  .wrapper {
+    position: absolute; 
+    top: 0; 
+    left: 0; 
+    right: 0; 
+    bottom: 0; 
+    width: 750;
+  }
+</style>
+
+<script>
+  module.exports = {
+    components: {
+      navbar: require('./navbar.vue')
+    },
+    props: {
+      dataRole: { default: 'navbar' },
+      backgroundColor: { default: 'black' },
+      height: { default: 88 },
+      title: { default: "" },
+      titleColor: { default: 'black' },
+      rightItemSrc: { default: '' },
+      rightItemTitle: { default: '' },
+      rightItemColor: { default: 'black' },
+      leftItemSrc: { default: '' },
+      leftItemTitle: { default: '' },
+      leftItemColor: { default: 'black' }
+    },
+    methods: {
+      naviBarRightItemClick: function (e) {
+        this.$emit('naviBarRightItemClick', e)
+      },
+      naviBarLeftItemClick: function (e) {
+        this.$emit('naviBarLeftItemClick', e)
+      }
+    }
+  }
+</script>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/include/panel.vue
----------------------------------------------------------------------
diff --git a/examples/vue/include/panel.vue b/examples/vue/include/panel.vue
new file mode 100644
index 0000000..13bbbe1
--- /dev/null
+++ b/examples/vue/include/panel.vue
@@ -0,0 +1,141 @@
+<!-- Inspired by bootstrap http://getbootstrap.com/ -->
+<template>
+  <div
+    :class="['panel', 'panel-' + type]"
+    :style="{ borderWidth: border }">
+    <text
+      :class="['panel-header', 'panel-header-' + type]"
+      :style="{
+        paddingTop: paddingHead,
+        paddingBottom: paddingHead,
+        paddingLeft: paddingHead*1.5,
+        paddingRight: paddingHead*1.5
+      }">{{title}}</text>
+    <div
+      :class="['panel-body', 'panel-body-' + type]"
+      :style="{
+        paddingTop: paddingBody,
+        paddingBottom: paddingBody,
+        paddingLeft: paddingBody*1.5,
+        paddingRight: paddingBody*1.5
+      }">
+      <slot></slot>
+    </div>
+  </div>
+</template>
+
+<script>
+  module.exports = {
+    props: {
+      type: { default: 'default' },
+      title: { default: '' },
+      paddingBody: { default: 20 },
+      paddingHead: { default: 20 },
+      dataClass: { default: '' }, // FIXME transfer class
+      border:{ default: 0 }
+    }
+  }
+</script>
+
+<style>
+  .panel {
+    margin-bottom: 20px;
+    background-color: #fff;
+    /*border: 1px solid transparent;*/
+    /*border-radius: 10px;*/
+    /*-webkit-box-shadow: 0 1px 1px rgba(0,0,0,.05);*/
+    /*box-shadow: 0 1px 1px rgba(0,0,0,.05);*/
+    border-color: #dddddd;
+    border-width: 1px;
+  }
+
+  .panel-default {
+  }
+
+  .panel-primary {
+    border-color: rgb(40, 96, 144);
+  }
+
+  .panel-success {
+    border-color: rgb(76, 174, 76);
+
+  }
+
+  .panel-info {
+    border-color: rgb(70, 184, 218);
+
+  }
+
+  .panel-warning {
+    border-color: rgb(238, 162, 54);
+
+  }
+
+  .panel-danger {
+    border-color: rgb(212, 63, 58);
+
+  }
+
+  .panel-header {
+    background-color: #f5f5f5;
+    font-size: 40px;
+    /*padding-left: 12px;*/
+    /*padding-right: 12px;*/
+    /*padding-top: 20px;*/
+    /*padding-bottom: 20px;*/
+    color: #333;
+  }
+
+  .panel-header-default {
+  }
+
+  .panel-header-primary {
+    background-color: rgb(40, 96, 144);
+    color: #ffffff;
+  }
+
+  .panel-header-success {
+    background-color: rgb(92, 184, 92);
+    color: #ffffff;
+  }
+
+  .panel-header-info {
+    background-color: rgb(91, 192, 222);
+    color: #ffffff;
+  }
+
+  .panel-header-warning {
+    background-color: rgb(240, 173, 78);
+    color: #ffffff;
+  }
+
+  .panel-header-danger {
+    background-color: rgb(217, 83, 79);
+    color: #ffffff;
+  }
+
+  .panel-body {
+    /*padding-left: 12px;*/
+    /*padding-right: 12px;*/
+    /*padding-top: 20px;*/
+    /*padding-bottom: 20px;*/
+  }
+
+  .panel-body-default {
+  }
+
+  .panel-body-primary {
+  }
+
+  .panel-body-success {
+  }
+
+  .panel-body-info {
+  }
+
+  .panel-body-warning {
+  }
+
+  .panel-body-danger {
+  }
+</style>



[03/50] [abbrv] incubator-weex git commit: Merge pull request #2586 from MrRaindrop/html5-bugfix-viewport

Posted by ji...@apache.org.
Merge pull request #2586 from MrRaindrop/html5-bugfix-viewport

[html5] fix bugs for viewport in some old android webkit browsers.

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

Branch: refs/heads/master
Commit: 26f96448aac835736d371aba8e89dfc30bd3bb0e
Parents: 308e1de 9c81153
Author: Hanks <zh...@gmail.com>
Authored: Wed Feb 15 23:34:18 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Wed Feb 15 23:34:18 2017 +0800

----------------------------------------------------------------------
 html5/render/vue/env/viewport.js | 7 ++++++-
 vue.html                         | 2 +-
 2 files changed, 7 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/26f96448/html5/render/vue/env/viewport.js
----------------------------------------------------------------------


[37/50] [abbrv] incubator-weex git commit: Merge pull request #2614 from alibaba/html5-feature-0.10

Posted by ji...@apache.org.
Merge pull request #2614 from alibaba/html5-feature-0.10

[html5] Merge html5-feature-0.10 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/a1e612b2
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/a1e612b2
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/a1e612b2

Branch: refs/heads/master
Commit: a1e612b2d50614705d3201bbfb89757ce1282a2a
Parents: f1062d8 9172b4f
Author: sospartan zheng <so...@apache.org>
Authored: Fri Feb 17 10:28:51 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Fri Feb 17 10:28:51 2017 +0800

----------------------------------------------------------------------
 .eslintignore                                   |   2 +
 .gitignore                                      |   2 +
 .wwprc                                          |   3 +-
 build/build.js                                  |   5 +
 build/config.js                                 |   5 +-
 build/karma.vue.conf.js                         |  44 ++
 build/webpack.examples.web.config.js            |  68 +++
 build/webpack.vue.config.js                     |  52 ++
 examples/component/lengthunitwx-demo.we         |  68 +++
 examples/vue/animation.vue                      |   2 +-
 examples/vue/components/input.vue               |   2 +-
 examples/vue/components/navigator.vue           |   2 +-
 examples/vue/components/video.vue               |   2 +-
 examples/vue/components/web.vue                 |   2 +-
 examples/vue/iconfont.vue                       |   2 +-
 examples/vue/include/base-url.js                |   2 +-
 examples/vue/include/example-list-item.vue      |   2 +-
 examples/vue/include/marquee.vue                |   2 +-
 examples/vue/index.vue                          |  53 +-
 examples/vue/modules/clipboard.vue              |   4 +-
 examples/vue/modules/modal.vue                  |   2 +-
 examples/vue/modules/storage.vue                |   2 +-
 examples/vue/modules/stream.vue                 |   2 +-
 examples/vue/showcase/calculator.vue            |   2 +-
 examples/vue/showcase/include/banner.vue        |   2 +-
 examples/vue/showcase/include/coupon.vue        |   2 +-
 examples/vue/showcase/include/link.vue          |   2 +-
 examples/vue/showcase/itemlist.vue              |   2 +-
 examples/vue/showcase/new-fashion.vue           |   4 +-
 examples/vue/syntax/script-instance.vue         |   2 +-
 examples/vue/syntax/script-module.vue           |   4 +-
 examples/vue/template.vue                       |   2 +-
 html5/render/browser/base/component/operate.js  | 105 +++-
 .../browser/base/component/valueFilter.js       |  26 +-
 html5/render/browser/extend/api/globalEvent.js  |   2 +-
 .../browser/extend/components/richtext.js       |  95 ++++
 html5/render/browser/extend/components/text.js  |   2 +-
 html5/render/browser/render/index.js            |   3 +-
 html5/render/vue/.eslintrc                      |   5 +
 html5/render/vue/README.md                      |   9 +
 html5/render/vue/components/a.js                |  24 +
 html5/render/vue/components/div.js              |  25 +
 html5/render/vue/components/image.js            |  39 ++
 html5/render/vue/components/index.js            |  40 ++
 html5/render/vue/components/input.js            |  53 ++
 .../render/vue/components/scrollable/header.js  |  18 +
 .../vue/components/scrollable/list/cell.js      |  18 +
 .../vue/components/scrollable/list/index.js     |  71 +++
 .../vue/components/scrollable/list/listMixin.js |  91 ++++
 .../components/scrollable/loading-indicator.js  |  10 +
 .../render/vue/components/scrollable/loading.js |  50 ++
 .../render/vue/components/scrollable/refresh.js |  51 ++
 .../vue/components/scrollable/scroller.js       |  91 ++++
 .../render/vue/components/scrollable/shared.js  |  22 +
 html5/render/vue/components/slider/index.js     | 137 +++++
 html5/render/vue/components/slider/indicator.js |  23 +
 .../render/vue/components/slider/slideMixin.js  | 113 +++++
 html5/render/vue/components/switch.js           |  57 +++
 html5/render/vue/components/text.js             |  38 ++
 html5/render/vue/components/textarea.js         |  43 ++
 html5/render/vue/components/video.js            |  54 ++
 html5/render/vue/components/warning.js          |  11 +
 html5/render/vue/components/web.js              |  52 ++
 html5/render/vue/env/WXEnvironment.js           |  39 ++
 html5/render/vue/env/index.js                   |  24 +
 html5/render/vue/env/viewport.js                |  44 ++
 html5/render/vue/env/weex.js                    |  63 +++
 html5/render/vue/index.js                       |  43 ++
 html5/render/vue/mixins/base.js                 |  22 +
 html5/render/vue/mixins/event.js                |  76 +++
 html5/render/vue/mixins/index.js                |   9 +
 html5/render/vue/mixins/scrollable.js           |  37 ++
 html5/render/vue/mixins/style.js                |  89 ++++
 html5/render/vue/modules/animation.js           |  44 ++
 html5/render/vue/modules/dom.js                 |  86 ++++
 html5/render/vue/modules/index.js               |  38 ++
 html5/render/vue/modules/modal/alert.js         |  44 ++
 html5/render/vue/modules/modal/confirm.js       |  55 ++
 html5/render/vue/modules/modal/index.js         |  48 ++
 html5/render/vue/modules/modal/modal.js         |  62 +++
 html5/render/vue/modules/modal/prompt.js        |  76 +++
 html5/render/vue/modules/modal/toast.js         |  78 +++
 html5/render/vue/modules/navigator.js           |  16 +
 html5/render/vue/modules/webview.js             |  21 +
 html5/render/vue/styles/components.css          | 503 +++++++++++++++++++
 html5/render/vue/styles/reset.css               |  64 +++
 html5/render/vue/utils/component.js             |  61 +++
 html5/render/vue/utils/event.js                 |  57 +++
 html5/render/vue/utils/func.js                  |  41 ++
 html5/render/vue/utils/index.js                 | 103 ++++
 html5/render/vue/validator/check.js             |  88 ++++
 html5/render/vue/validator/index.js             |  74 +++
 html5/render/vue/validator/prop.js              |   4 +
 html5/render/vue/validator/style.js             | 109 ++++
 html5/test/render/index.js                      |   3 +
 html5/test/render/vue/components/image.js       |  49 ++
 html5/test/render/vue/components/list.js        |  21 +
 html5/test/render/vue/components/switch.js      |  87 ++++
 html5/test/render/vue/components/text.js        |  72 +++
 html5/test/render/vue/components/web.js         |  29 ++
 html5/test/render/vue/examples/list-cell.js     |  37 ++
 html5/test/render/vue/helper.js                 |  31 ++
 html5/test/render/vue/utils.js                  |  48 ++
 html5/test/render/vue/validator/check.js        |  38 ++
 html5/test/render/vue/validator/index.js        |  43 ++
 html5/test/render/vue/validator/prop.js         |  14 +
 html5/test/render/vue/validator/style.js        | 271 ++++++++++
 html5/test/render/vue/vender/vue-2.0.0.js       |   7 +
 html5/test/render/vue/vender/vue-2.1.0.js       |   8 +
 package.json                                    |  33 +-
 packages/weex-vue-render/README.md              |   5 +
 packages/weex-vue-render/package.json           |  24 +
 vue.html                                        |  43 ++
 113 files changed, 4636 insertions(+), 75 deletions(-)
----------------------------------------------------------------------



[04/50] [abbrv] incubator-weex git commit: * [html5] set default page to index.

Posted by ji...@apache.org.
* [html5] set default page to index.


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

Branch: refs/heads/master
Commit: 2fc724d2ca78ec42de98be098e4c11626f0cc316
Parents: 71b3cbe
Author: MrRaindrop <te...@gmail.com>
Authored: Thu Feb 16 10:32:12 2017 +0800
Committer: MrRaindrop <te...@gmail.com>
Committed: Thu Feb 16 10:32:12 2017 +0800

----------------------------------------------------------------------
 vue.html | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2fc724d2/vue.html
----------------------------------------------------------------------
diff --git a/vue.html b/vue.html
index adba6c1..a7fb765 100644
--- a/vue.html
+++ b/vue.html
@@ -24,7 +24,15 @@
         return match && match[1]
       }
 
-      var page = getUrlParam('page') || 'examples/build/vue-web/vue/index.js'
+      var page = getUrlParam('page')
+      var defaultPage = 'examples/build/vue-web/vue/index.js'
+      if (!page) {
+        var url = location.href.replace(/\?|$/, function(f) {
+          var query = '?page=' + defaultPage
+          return f ? query + '&' : query
+        })
+        location.href = url
+      }
 
       var bundle = document.createElement('script')
       bundle.src = page


[30/50] [abbrv] incubator-weex git commit: Update cell.md

Posted by ji...@apache.org.
Update cell.md

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

Branch: refs/heads/master
Commit: 86c8657abfd60159f3b2500784fe9f532dea314e
Parents: f252d2b
Author: Yun Dong <yu...@gmail.com>
Authored: Thu Feb 16 17:51:44 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Thu Feb 16 17:51:44 2017 +0800

----------------------------------------------------------------------
 doc/source/references/components/cell.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/86c8657a/doc/source/references/components/cell.md
----------------------------------------------------------------------
diff --git a/doc/source/references/components/cell.md b/doc/source/references/components/cell.md
index ac8127c..8820104 100644
--- a/doc/source/references/components/cell.md
+++ b/doc/source/references/components/cell.md
@@ -17,13 +17,13 @@ This type of component supports all kinds of weex component as its child compone
 
 ### Attributes
 
-**common attributes**: check out the [common attributes](../references/common-attrs.md).
+**common attributes**: check out the [common attributes](../common-attrs.html).
 
 **Notes:** you can't give `<cell>` a `flex` value. Width of `<cell>` is equal to the width of its parent component `<list>`, and you don't need to specify its height.
 
 ### Styles
 
-**common styles**: check out the [common styles](../common-attrs.html)
+**common styles**: check out the [common styles](../common-style.html)
 
 - support flexbox related styles
 - support box model related styles


[32/50] [abbrv] incubator-weex git commit: * [ios] add doc for new version

Posted by ji...@apache.org.
* [ios] add doc for new 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/7e579b92
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/7e579b92
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/7e579b92

Branch: refs/heads/master
Commit: 7e579b92eadf816b25c8547bd1accf5673f1d220
Parents: 9b69a04
Author: acton393 <zh...@gmail.com>
Authored: Thu Feb 16 17:57:37 2017 +0800
Committer: acton393 <zh...@gmail.com>
Committed: Thu Feb 16 17:57:37 2017 +0800

----------------------------------------------------------------------
 .../cn/references/advanced/extend-to-android.md | 25 ++++++++++++
 .../cn/references/advanced/extend-to-ios.md     | 43 +++++++++++++++++++-
 .../references/advanced/extend-to-android.md    | 28 +++++++++++++
 doc/source/references/advanced/extend-to-ios.md | 42 ++++++++++++++++++-
 4 files changed, 136 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7e579b92/doc/source/cn/references/advanced/extend-to-android.md
----------------------------------------------------------------------
diff --git a/doc/source/cn/references/advanced/extend-to-android.md b/doc/source/cn/references/advanced/extend-to-android.md
index ef9c5b9..9575203 100644
--- a/doc/source/cn/references/advanced/extend-to-android.md
+++ b/doc/source/cn/references/advanced/extend-to-android.md
@@ -140,5 +140,30 @@ public class ImageAdapter implements IWXImgLoaderAdapter {
   }
 }
 ```
+#### \u7ec4\u4ef6\u65b9\u6cd5\u652f\u6301
+\u4eceWeexSDK 0.9.5\u5f00\u59cb\uff0c\u4f60\u53ef\u4ee5\u5b9a\u4e49\u7ec4\u4ef6\u65b9\u6cd5
+
+- \u5728\u7ec4\u4ef6\u4e2d\u5982\u4e0b\u58f0\u660e\u4e00\u4e2a\u7ec4\u4ef6\u65b9\u6cd5
+
+ ```java
+ @JSMethod
+ public void focus(){
+ 	//method implementation
+ }
+ ```
+- \u6ce8\u518c\u7ec4\u4e4b\u540e\uff0c\u4f60\u53ef\u4ee5\u5728weex \u6587\u4ef6\u4e2d\u8c03\u7528
+  
+  ```html
+	<template>
+ 		<mycomponent id='mycomponent'></mycomponent>
+	</template>
+	<script>
+   		module.exports = {
+    		created: function() {
+    			this.$el('mycomponent').focus();
+    		}
+   		}
+	</script>
+	```
 
 \u6ce8:\u5de5\u7a0b\u8981\u6dfb\u52a0\u4f9d\u8d56 `compile 'com.squareup.picasso:picasso:2.5.2'`
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7e579b92/doc/source/cn/references/advanced/extend-to-ios.md
----------------------------------------------------------------------
diff --git a/doc/source/cn/references/advanced/extend-to-ios.md b/doc/source/cn/references/advanced/extend-to-ios.md
index 1f1d868..7fe5601 100644
--- a/doc/source/cn/references/advanced/extend-to-ios.md
+++ b/doc/source/cn/references/advanced/extend-to-ios.md
@@ -232,4 +232,45 @@ return [[WXImageView alloc] init];
 
 ```html
 <image style="your-custom-style" src="image-remote-source" resize="contain/cover/stretch"></image>
-```
\ No newline at end of file
+```
+
+##### component \u65b9\u6cd5
+  WeexSDK 0.9.5 \u4e4b\u540e\u652f\u6301\u4e86\u5728js\u4e2d\u76f4\u63a5\u8c03\u7528component\u7684\u65b9\u6cd5\uff0c\u8fd9\u91cc\u63d0\u4f9b\u4e00\u4e2a\u4f8b\u5b50\uff0c
+  
+  - \u81ea\u5b9a\u4e49\u4e00\u4e2aWXMyCompoenent \u7684\u7ec4\u4ef6
+  
+	 ```
+	 @implementation WXMyComponent
+	 	WX_EXPORT_METHOD(@selector(focus)) // \u66b4\u9732\u8be5\u65b9\u6cd5\u7ed9js
+	 - (instancetype)initWithRef:(NSString *)ref type:(NSString *)type styles:(NSDictionary *)styles attributes:(NSDictionary *)attributes events:(NSArray *)events weexInstance:(WXSDKInstance *)weexInstance
+	 {
+	     if (self = [super initWithRef:ref type:type styles:styles attributes:attributes events:events weexInstance:weexInstance]) {
+	         // handle your attributes
+	         // handle your styles
+	     }
+	     
+	     return self;
+	 }
+	 
+	 - (void)focus
+	   {
+	   		NSLog(@"you got it");
+	   }
+	 @end
+	 ```
+	
+	- \u6ce8\u518c\u7ec4\u4ef6 `[WXSDKEngine registerComponent:@"mycomponent" withClass:[WXMyComponent class]] `
+	- \u5728weex \u6587\u4ef6\u4e2d\u8c03\u7528
+
+		```
+		<template>
+	     		<mycomponent id='mycomponent'></mycomponent>
+	 	</template>
+		<script>
+		   module.exports = {
+		    	created: function() {
+		    		this.$el('mycomponent').focus();
+		    		}
+		   }
+		</script>
+ 		``` 
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7e579b92/doc/source/references/advanced/extend-to-android.md
----------------------------------------------------------------------
diff --git a/doc/source/references/advanced/extend-to-android.md b/doc/source/references/advanced/extend-to-android.md
index ab5e08f..e382372 100644
--- a/doc/source/references/advanced/extend-to-android.md
+++ b/doc/source/references/advanced/extend-to-android.md
@@ -158,3 +158,31 @@ public class ImageAdapter implements IWXImgLoaderAdapter {
   }
 }
 ```
+
+#### Component Method
+ from WeexSDK `0.9.5`, you can define your component method
+
+ for example, define a method in component:
+ 
+ ```java
+ 
+ @JSMethod
+ public void focus(){
+ 	//method implementation
+ }
+ 
+ ```
+ after your registration for your own custom component, now you can call it in your js file.
+ 
+ ```html
+<template>
+ 		<mycomponent id='mycomponent'></mycomponent>
+</template>
+<script>
+   module.exports = {
+    	created: function() {
+    		this.$el('mycomponent').focus();
+    		}
+   }
+</script>
+``` 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7e579b92/doc/source/references/advanced/extend-to-ios.md
----------------------------------------------------------------------
diff --git a/doc/source/references/advanced/extend-to-ios.md b/doc/source/references/advanced/extend-to-ios.md
index c0d8639..133e784 100644
--- a/doc/source/references/advanced/extend-to-ios.md
+++ b/doc/source/references/advanced/extend-to-ios.md
@@ -259,4 +259,44 @@ Now you can use `<image>` and its attributes wherever you want in the template.
 
 ```html
 <image style="your-custom-style" src="image-remote-source" resize="contain/cover/stretch"></image>
-```
\ No newline at end of file
+```
+
+#### Component Method
+from WeexSDK `0.9.5`, you can define your component method by macro `WX_EXPORT_METHOD`
+for example:
+
+```
+@implementation WXMyComponent
+ +WX_EXPORT_METHOD(@selector(focus))
+ +- (instancetype)initWithRef:(NSString *)ref type:(NSString *)type styles:(NSDictionary *)styles attributes:(NSDictionary *)attributes events:(NSArray *)events weexInstance:(WXSDKInstance *)weexInstance
+ {
+     if (self = [super initWithRef:ref type:type styles:styles attributes:attributes events:events weexInstance:weexInstance]) {
+         // handle your attributes
+         // handle your styles
+     }
+     
+     return self;
+ }
+
+ 
+ - (void)focus
+   {
+   		NSLog(@"you got it");
+   }
+@end
+```
+   
+after your registration for your own custom component, now you can call it in your js file.
+ 
+```
+<template>
+ 		<mycomponent id='mycomponent'></mycomponent>
+</template>
+<script>
+   module.exports = {
+    	created: function() {
+    		this.$el('mycomponent').focus();
+    		}
+   }
+</script>
+``` 
\ No newline at end of file


[27/50] [abbrv] incubator-weex git commit: + [doc] Adding docs for 0.10.0 features.

Posted by ji...@apache.org.
+ [doc]  Adding docs for 0.10.0 features.

  * Add docs for horizontal/vertical pan
  * Add docs for extending ios sync module API


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

Branch: refs/heads/master
Commit: f252d2b3d6f3b8b45af24ffcb126ea397ba9241f
Parents: 0d244c7
Author: \u9690\u98ce <cx...@gmail.com>
Authored: Thu Feb 16 17:17:29 2017 +0800
Committer: \u9690\u98ce <cx...@gmail.com>
Committed: Thu Feb 16 17:17:29 2017 +0800

----------------------------------------------------------------------
 doc/source/references/advanced/extend-to-ios.md | 36 +++++++++++---------
 doc/source/references/components/cell.md        |  4 ++-
 doc/source/references/gesture.md                |  9 +++--
 3 files changed, 28 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/f252d2b3/doc/source/references/advanced/extend-to-ios.md
----------------------------------------------------------------------
diff --git a/doc/source/references/advanced/extend-to-ios.md b/doc/source/references/advanced/extend-to-ios.md
index 753c1a1..3af0373 100644
--- a/doc/source/references/advanced/extend-to-ios.md
+++ b/doc/source/references/advanced/extend-to-ios.md
@@ -6,7 +6,7 @@ version: 2.1
 ---
 
 # Extend to iOS
- 
+
 ### Module extend
 
 Weex SDK provides only rendering capabilities, rather than have other capabilities, such as network, picture, and URL redirection. If you want these features, you need to implement it.
@@ -15,11 +15,11 @@ For example: If you want to implement an address jumping function, you can achie
 
 #### Step to customize a module
 
-1. Module 
+1. Module
     customized must implement WXModuleProtocol
-2. A macro named `WX_EXPORT_METHOD` must be added, as it is the only way to be recognized by Weex. It takes arguments that specifies the method in module   called by JavaScript code.
+2. A macro named `WX_EXPORT_METHOD` must be added, as it is the only way to export methods to JavaScript.
 3. The weexInstance should be synthesized. Each module object is bind to a specific instance.
-4. Module methods will be invoked in UI thread, so do not put time consuming operation there. If you want to  execute the whole module methods in other     thread, please implement the method `- (NSThread *)targetExecuteThread` in protocol. In the way, tasks distributed to this module will be executed in targetExecuteThread. 
+4. Module methods will be invoked in UI thread, so do not put time consuming operation there. If you want to  execute the whole module methods in other     thread, please implement the method `- (NSThread *)targetExecuteThread` in protocol. In the way, tasks distributed to this module will be executed in targetExecuteThread.
 5. Weex params can be String or Map.
 6. Module supports to return results to Javascript in callback. This callback is type of `WXModuleCallback`, the params of which can be String or Map.
 
@@ -46,7 +46,9 @@ For example: If you want to implement an address jumping function, you can achie
 
 @end
 ```
-    
+
+In addition, `0.10.0` begins to support synchronous module API call, you can use macro `WX_EXPORT_METHOD_SYNC` to export module methods which could make JavaScript receive return values from native,  it **can only be called on JS thread**.
+
 #### Register the module
 
 You can register the customized module by calling the method `registerModule:withClass` in WXSDKEngine.
@@ -62,7 +64,7 @@ WXSDKEngine.h
 
 [WXSDKEngine registerModule:@"event" withClass:[WXEventModule class]];
 ```
-    	
+
 ### Handler extend
 
 Weex SDK doesn't have capabilitis, such as image download \u3001navigator operation\uff0cplease implement these protocols by yourself.
@@ -102,7 +104,7 @@ Implement above protocol as follows.
     if ([url hasPrefix:@"//"]) {
         url = [@"http:" stringByAppendingString:url];
     }
-    return (id<WXImageOperationProtocol>)[[SDWebImageManager sharedManager] downloadImageWithURL:[NSURL URLWithString:url] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {     
+    return (id<WXImageOperationProtocol>)[[SDWebImageManager sharedManager] downloadImageWithURL:[NSURL URLWithString:url] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
     } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
     if (completedBlock) {
         completedBlock(image, error, finished);
@@ -111,7 +113,7 @@ Implement above protocol as follows.
 }
 @end
 ```
-	
+
 #### Register the handler
 
 You can register the handler which implements the protocol by calling  `registerHandler:withProtocol` in WXSDKEngine.
@@ -124,10 +126,10 @@ WXSDKEngine.h
 * @param protocol The protocol to confirm
 */
 + (void)registerHandler:(id)handler withProtocol:(Protocol *)protocol;
-        
+
 [WXSDKEngine registerHandler:[WXImgLoaderDefaultImpl new] withProtocol:@protocol(WXImgLoaderProtocol)];
 ```
-              
+
 ## Custom Native Components for iOS
 
 ### Component extend
@@ -176,7 +178,7 @@ All of the styles, attributes and events will be passed to the component's initi
         _imageSrc = [WXConvert NSString:attributes[@"src"]];
         _resizeMode = [WXConvert UIViewContentMode:attributes[@"resize"]];
     }
-    
+
     return self;
 }
 
@@ -192,12 +194,12 @@ A Native Component has a life cycle managed by Weex. Weex creates it, layout it,
 
 Weex offers component life cycle hooks that give you visibility into these key moments and the ability to act when they occur.
 
-method| description 
+method| description
 :----:|------
-initWithRef:type:...| Initializes a new component using the specified  properties. 
+initWithRef:type:...| Initializes a new component using the specified  properties.
 layoutDidFinish | Called when the component has just laid out.
-loadView   | Creates the view that the component manages.  
-viewWillLoad | Called before the load of component's view .  
+loadView   | Creates the view that the component manages.
+viewWillLoad | Called before the load of component's view .
 viewDidLoad | Called after the component's view is loaded and set.
 viewWillUnload | Called just before releasing the component's view.
 viewDidUnload | Called when the component's view is released.
@@ -230,7 +232,7 @@ As an image component, we will need to fetch the remote image and set it to the
     imageView.userInteractionEnabled = YES;
     imageView.clipsToBounds = YES;
     imageView.exclusiveTouch = YES;
-    
+
     // Do your image fetching and updating logic
 }
 ```
@@ -245,7 +247,7 @@ If image's remote source can be changed, you can also hook the `updateAttributes
         _imageSrc = [WXConvert NSString:attributes[@"src"]];
         // Do your image updating logic
     }
-    
+
     if (attributes[@"resize"]) {
         _resizeMode = [WXConvert UIViewContentMode:attributes[@"resize"]];
         self.view.contentMode = _resizeMode;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/f252d2b3/doc/source/references/components/cell.md
----------------------------------------------------------------------
diff --git a/doc/source/references/components/cell.md b/doc/source/references/components/cell.md
index fb2d957..ac8127c 100644
--- a/doc/source/references/components/cell.md
+++ b/doc/source/references/components/cell.md
@@ -17,7 +17,7 @@ This type of component supports all kinds of weex component as its child compone
 
 ### Attributes
 
-There is no specific attribute for this component other than the [common attributes](../common-attrs.html).
+**common attributes**: check out the [common attributes](../references/common-attrs.md).
 
 **Notes:** you can't give `<cell>` a `flex` value. Width of `<cell>` is equal to the width of its parent component `<list>`, and you don't need to specify its height.
 
@@ -30,6 +30,8 @@ There is no specific attribute for this component other than the [common attribu
 - support ``position`` related styles
 - support ``opacity``, ``background-color`` etc.
 
+**Notes:** cell itself is a container, its layout info is managed by list, so specifying cell's margin info will not work.
+
 ### Events
 
 **common events**: check out the [common events](../common-event.html)

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/f252d2b3/doc/source/references/gesture.md
----------------------------------------------------------------------
diff --git a/doc/source/references/gesture.md b/doc/source/references/gesture.md
index 605bc63..147aec8 100644
--- a/doc/source/references/gesture.md
+++ b/doc/source/references/gesture.md
@@ -23,6 +23,9 @@ For now, there are four types of gestures:
 	* `panstart`
 	* `panmove`
 	* `panend`
+* **Horizontal/Vertical Pan** <span class="weex-version">0.10</span> . Mainly used for cell swipe gestures before conflict resolving system is completed. start/move/end state of the gesture will be passed by `state` property. **Note**: These gestures are in conflict with click event on Android currently.
+  * `horizontalpan`
+  * `verticalpan`
 * **Swipe**. Swipe is fired when user swipe a touch point on the screen. A serial of motion will only trigger one Swipe gesture.
 * **LongPress**. Swipe is fired when a touch point is held for 500 ms or more.
 
@@ -37,17 +40,17 @@ Users may choose their gesture according to their situation.
 The following properties can be used in gesture callback:
 
 * `direction`. Only exists for **Swipe** gesture. Indicate the direcion of the swipe, choose from `up`, `left`, `bottom`, `right`.
-* `changedTouches`. An array of motion for every touch pointer that has contribute to the current gesture. 
+* `changedTouches`. An array of motion for every touch pointer that has contribute to the current gesture.
 
 ### changedTouches
 
 `changedTouches` is an array, with the following properties in its children:
 
 * `identifier`. A unique identifier for a touch pointer.
-* `pageX`. The X coordinate of the touch pointer relative to the left edge of the document. 
+* `pageX`. The X coordinate of the touch pointer relative to the left edge of the document.
 * `pageY`. The Y coordinate of the touch pointer relative to the top of the document.
 * `screenX`. The X coordinate of the touch point relative to the left edge of the screen.
 * `screenY`. The Y coordinate of the touch point relative to the top edge of the screen.
 
 ## Constrain
-Currently, Weex Android do not support listening to gesture on `scroller`, `list` and `webview`, as it would lead a large amount of event conflicting. 
\ No newline at end of file
+Currently, Weex Android do not support listening to gesture on `scroller`, `list` and `webview`, as it would lead a large amount of event conflicting.
\ No newline at end of file


[20/50] [abbrv] incubator-weex git commit: V0.10.0 stable gitlab (#178)

Posted by ji...@apache.org.
V0.10.0 stable gitlab (#178)

* [ios] added a new jsservice method -> registerService:withScriptUrl:WithOptions:

* * [ios] fix test running problem

* * [ios] fix test running problem

* + [ios] feature: add websocket , follow w3c standard. weex provide multiple websocket Instance

* * [ios] placeholder position is not strict same as text & user domchange, not update text .chinese is ok

* * [jsfm] use app.callTasks to set module methods

* * [jsfm] support to return values for component method

* * [jsfm] use moduleHandler by default in task center

* * [jsfm] add new method for task center

* * [ios] add annotation for placeholder position

* * [ios] bugfix slider-neighbor may beyond item count index

* * [ios] refactor input component

* - [ios] remove location module in sdk

* * [jsfm] use app.callTasks instead of sendModuleTask

* * [ios] Fixed :Merge remote-tracking branch 'alibaba/ios-feature-20170118' into ios-feature-20170118-new-slider-neighbor-fix    move "sliderview init" code to loadview method.

* * [ios] revert podfile change

* * [jsfm] add returns for callNative tasks

* * [ios] bugfix:delete configpicker not delete the method in header

* * [ios] bugfix: playground cannot open

* * [ios] add websocket demo & add delegate for datepicker

* * [jsfm] insert blank line in js bundle function body

* * [jsfm] always return '-1' in original callNative

* * [jsfm] omit amd service temporary

* * [ios] upgrade JSFM to 0.19.3 to fix callback problem

* * [ios]  lazy create date picker view when the type is date or time

* * [jsfm] no more runing Android & iOS test on jsfm branch

* * [jsfm] v0.19.3

* * [jsfm] v0.19.3

* * [ios] add horizontal/vertical pan gesture to support cell swipe,  support insert/delete animation on cells

* * [jsfm] fixed Promies bug in android

* * [jsfm] removed extra log in test

* + [ios] feature: optimize websocket module and WXWebSocketDefaultImpl

* * [test] iOS update uitest-demo

* + [ios] feature: add pseudoclass support .support active enabled disabled focus;support priority

* * [ios] add demoViewController to fire background event

* * [ios] add active/resgin active event support

* * [ios] add fire active/resign active event for WXBaseViewController

* * [ios] remove all observer entries for globalEvent when object dealloc

* + [ios] feature delete no use code

* + [ios] feature : optimize websocket \uff0cnot use websocket model. use url and protocol

* + [ios] feature: pseudo-class ,format code in WXUtility.m

* * [ios] gradient color feature optimize

* * [ios] confront fontStorage should not set  before download

* * [ios] keep same as html5

* * [ios] support set rgb and rgba for gradient-color.

* * [ios] fix error

* + [ios] add tempSrc for confront , save to src when download success

* + [ios] add file judgement , file not download

* * [ios] update jsfm to v0.19.4

* * [ios]  add css update and add focus for input and teaxarea

* * [jsfm] v0.19.4

* * [ios] adapter to refactored sdk

* * [ios] delete unused line

* * [doc] update font-wegit doc

* * [doc] push wrong doc

* * [ios] update js-framework version to 0.19.5

* * [ios] optimize Pseudo Class

* * [jsfm] update rax framework to 0.0.17

* + [ios] add startComponentTasks for ui refresh

* modify bundleUrl to string, fix the error ''Invalid type in JSON write (URL)''

* * [jsfm] update rax framework to 0.0.18

* * [ios] bugfix multi input or textarea maybe wrongly change root view frame

* * [jsfm] update rax framework to 0.0.19

* * [ios] bugfix view event

* * [ios] fixed issues that horizontal/vertical pan not respond while recyling views.

* * [ios] add deprecated API

* * [ios] bugfix rootView information  coordinate

* * [ios] remove unused

* * [ios] fix compile problem

* * [jsfm] fix mismatch of weex.require and weex.document

* * [jsfm] remove sourcemap for minified files

* * [jsfm] update rax framework to 0.1.0

* * [ios] viewport 'device-width' or 'device-hight' should be of real device pixel

* * [jsfm] v0.19.6

* * [ios] handle  component render

* * [ios] remove unused code

* * [ios] set trackComponent default value

* * [ios] For 32-bit BOOL is a signed char, whereas under 64-bit it is a bool,  you should initialize BOOL yourself just in case that it is initialized to an unexpected value.

* + [ios] feature\uff1aPseudo Class support  priority

* * [ios] remove unused code

* + [ios] use real style

* * [ios] fix issue that rotate(0) not work after rotate(>180degree)

demo: http://dotwe.org/cad4d4cd051ab3e565f3cd42bbcac73b

* * [ios] override image readyToRender behavior

* + [ios] remove unused variable

* * [ios] notify render when image download completely

* * [ios] rename method name

* * [ios] fix issue that cells pushed down by inserted cells will not trigger disappear event.

Demo: http://dotwe.org/db565d149c302ead36cef4f70df9a189

* - [ios] remove CAAnimation's delegate supported only for iOS10

* * [jsfm] export weex.requireModule instead of weex.require

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

* * [ios] fixed component's view should be removed separately since its view is a subview of rootview.

Demo: http://dotwe.org/4a852d2cacc5b460f9567c57230fc614

* * [ios] update jsframework version to 0.19.7.

* * [ios] bugfix moduleEvent compatible

* * [ios] moduleEvent support variable value

* * [ios] remove param count restriction

* * [ios] refactor code

* * [ios] fix compiler complains

* * [ios] fix variable name spelling error

* * [ios] fix bug that horizontalpan and verticalpan can not trigger simultaneously

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

* * [ios] bugfix call renderFinish

* * [ios] format callback ret data

* * [ios] fix compiler complains

* * [ios] format code

* * [ios] fix bug: text input padding is not right

* * [ios] prevent loadmore event from being triggered while pulling down.

* * [ios] notify component readyToShow

* * [ios] adjust notify time

* * [ios] ensure default modules/components/handlers are ready before create instance.

* * [ios] rename method

* * [ios] support textarea padding

* * [ios] update weexSDK version

* * [ios] update weexSDK version number.

* * [test] revert android ci command

* 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

* * [android] modify android inspector version

* * [html5] fix compatibility problem & support deps arguments.

* * [jsfm] fix lint

* + [jsfm] add component callback support

* + [jsfm] add callback destory

* [android] add wx unit. change to submit on 0.10.0 in order to publish on March 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/b5123119
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/b5123119
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/b5123119

Branch: refs/heads/master
Commit: b51231190b18a8b5d98fe6f6d78b4011ebd07910
Parents: 754d83d
Author: xkli <56...@qq.com>
Authored: Thu Feb 16 13:01:58 2017 +0800
Committer: sospartan zheng <so...@apache.org>
Committed: Thu Feb 16 13:01:58 2017 +0800

----------------------------------------------------------------------
 .eslintrc                                       |   1 +
 .travis.yml                                     |   2 +
 README.md                                       |  17 +-
 .../weex/commons/AbstractWeexActivity.java      |   4 +-
 android/playground/app/build.gradle             |   5 +-
 .../extend/adapter/InterceptWXHttpAdapter.java  |  63 ++
 .../java/com/taobao/weex/WXSDKInstance.java     |   4 +-
 .../weex/adapter/DefaultWXHttpAdapter.java      |  52 +-
 .../java/com/taobao/weex/utils/WXUtils.java     | 200 +++++--
 .../java/com/taobao/weex/utils/WXUtilsTest.java | 125 +++-
 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 +-
 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/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                     |   1 -
 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                |   2 +-
 examples/component/slider-neighbor/index.we     |  74 +++
 .../slider-neighbor/silder-neighbor.we          |  75 ---
 examples/component/web-demo.we                  |   1 -
 examples/index.we                               |   2 +
 examples/module/stream-demo.we                  |   3 +-
 examples/module/websocket-demo.we               | 112 ++++
 examples/vanilla/index.js                       |   2 +-
 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        | 120 ++--
 html5/frameworks/legacy/app/ctrl/misc.js        |  91 +--
 html5/frameworks/legacy/app/index.js            |   4 +-
 html5/frameworks/legacy/app/instance.js         |   4 +-
 html5/frameworks/legacy/app/register.js         |  25 +-
 html5/frameworks/legacy/app/viewport.js         |  38 ++
 html5/frameworks/legacy/static/create.js        |  11 +-
 html5/frameworks/legacy/vm/directive.js         |   2 +-
 html5/frameworks/vanilla/index.js               |  43 +-
 html5/render/native/index.js                    |   6 +-
 html5/runtime/callback-manager.js               |  37 ++
 html5/runtime/config.js                         |  15 +
 html5/runtime/handler.js                        |   2 +-
 html5/runtime/index.js                          |  32 +-
 html5/runtime/init.js                           |  83 ++-
 html5/runtime/service.js                        |  58 ++
 html5/runtime/task-center.js                    | 129 ++++
 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                     |  86 +++
 html5/services/broadcast-channel/index.js       | 106 ++++
 .../services/broadcast-channel/message-event.js |  21 +
 html5/services/index.js                         |   5 +
 html5/shared/setTimeout.js                      |   2 +
 html5/test/case/basic/dynamic-id.output.js      |  44 ++
 html5/test/case/basic/dynamic-id.source.js      |  76 +++
 .../case/basic/global-weex-object.output.js     |   6 +
 .../case/basic/global-weex-object.source.js     |  19 +
 html5/test/case/basic/id.output.js              |  32 +
 html5/test/case/basic/id.source.js              |  62 ++
 html5/test/case/prepare.js                      |   4 +
 html5/test/case/tester.js                       |   5 +
 html5/test/unit/default/api/methods.js          |   6 +-
 html5/test/unit/default/app/bundle.js           |  30 +-
 html5/test/unit/default/app/ctrl.js             |  45 +-
 html5/test/unit/default/app/index.js            |  66 +--
 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       | 197 ++++++-
 .../xcschemes/WeexSDKTests.xcscheme             |  90 +++
 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/WXEmbedComponent.m        |  22 +-
 .../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     |  20 +-
 .../Sources/Component/WXSliderComponent.m       |  48 +-
 .../Component/WXSliderNeighborComponent.m       | 132 +++--
 .../Sources/Component/WXTextAreaComponent.m     | 203 ++++---
 .../WeexSDK/Sources/Component/WXTextComponent.m |  44 +-
 .../Sources/Component/WXTextInputComponent.m    | 266 ++++-----
 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 | 144 ++++-
 .../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        |  59 +-
 .../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     |  42 +-
 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        |   8 +-
 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 | 240 ++++----
 .../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 +-
 .../WeexSDK/Sources/Protocol/WXModuleProtocol.h |   1 -
 .../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/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/WeexSDK/Sources/WeexSDK.h               |   1 +
 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/WXNetworkTests.m           | 116 ----
 ios/sdk/WeexSDKTests/WXRootViewTests.m          |  22 +-
 ios/sdk/WeexSDKTests/WXSDKEngineTests.m         |  22 +-
 ios/sdk/WeexSDKTests/WXSDKManagerTests.m        |  11 -
 ios/sdk/WeexSDKTests/WXStorageTests.m           |   7 -
 ios/sdk/WeexSDKTests/WXStreamModuleTests.m      |   6 +-
 ios/sdk/WeexSDKTests/WXTimerModuleTests.m       |   7 -
 ios/sdk/WeexSDKTests/WXURLRewriteTests.m        |   4 +-
 ios/sdk/WeexSDKTests/WeexSDKTests.m             |   6 -
 package.json                                    |  31 +-
 361 files changed, 9106 insertions(+), 4320 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/.eslintrc
----------------------------------------------------------------------
diff --git a/.eslintrc b/.eslintrc
index 6c95c0d..deb0975 100644
--- a/.eslintrc
+++ b/.eslintrc
@@ -16,6 +16,7 @@
     "window": false,
     "location": false,
     "callNative": false,
+    "callNativeModule": false,
     "callAddElement":false,
     "callJS": false
   },

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/.travis.yml
----------------------------------------------------------------------
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..70bfbdb
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,2 @@
+language: objective-c
+script: xcodebuild -project ios/sdk/WeexSDK.xcodeproj test -scheme WeexSDKTests CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO -destination 'platform=iOS Simulator,name=iPhone 6'
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/README.md
----------------------------------------------------------------------
diff --git a/README.md b/README.md
index 8b04c2f..d8aeeb4 100644
--- a/README.md
+++ b/README.md
@@ -1,13 +1,13 @@
 # Weex    
 Android[![Download](https://api.bintray.com/packages/alibabaweex/maven/weex_sdk/images/download.svg)](https://bintray.com/alibabaweex/maven/weex_sdk/_latestVersion)
-iOS[![Pod version](https://badge.fury.io/co/WeexSDK.svg)](https://cocoapods.org/pods/WeexSDK) 
+iOS[![Pod version](https://badge.fury.io/co/WeexSDK.svg)](https://cocoapods.org/pods/WeexSDK)
 HTML5[![npm version](https://badge.fury.io/js/weex-html5.svg)](https://www.npmjs.com/package/weex-html5)
 
 > A framework for building Mobile cross-platform UI.
 
 [![CircleCI](https://circleci.com/gh/alibaba/weex/tree/dev.svg?style=svg&circle-token=b83b047a3a01f6ec26458a455530a5ddc261925f)](https://circleci.com/gh/alibaba/weex/tree/dev) [![Gitter](https://img.shields.io/gitter/room/weexteam/cn.svg?maxAge=2592000)](https://gitter.im/weexteam) <sub>(English Gitter)</sub> [![Gitter](https://img.shields.io/gitter/room/weexteam/cn.svg?maxAge=2592000)](https://gitter.im/weexteam/cn) <sub>(Chinese \u4e2d\u6587\u804a\u5929\u5ba4)</sub>
 
-Support Android 4.1 (API 16) and iOS 7.0+. See [Weex website](https://alibaba.github.io/weex/) for more information. 
+Support Android 4.1 (API 16) and iOS 7.0+. See [Weex website](https://alibaba.github.io/weex/) for more information.
 
 ## For Windows
 
@@ -26,12 +26,12 @@ Please ***INSTALL [Git for Windows](https://git-scm.com/download/win)*** and run
 * [Tutorial](https://alibaba.github.io/weex/doc/tutorial.html)
 * Doc: [English](https://alibaba.github.io/weex/doc/), [\u4e2d\u6587](https://github.com/weexteam/article/wiki/Weex%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3)
 
-### Android 
+### Android
 
 0. Prerequisites
     0. Install [Node.js](http://nodejs.org/) 4.0+
-    0. Under project root 
-        0. `npm install`, install project 
+    0. Under project root
+        0. `npm install`, install project
         0. `./start`
     0. Install [Android Environment](http://developer.android.com/training/basics/firstapp/index.html)
 0. Run playground, In Android Studio
@@ -49,8 +49,8 @@ On Android Platform , Weex code is executed in [weex_v8core](https://github.com/
 
 0. Prerequisites
 	0. Install [Node.js](http://nodejs.org/) 4.0+
-    0. Under project root 
-        0. `npm install`, install project 
+    0. Under project root
+        0. `npm install`, install project
         0. `./start`
     0. Install [iOS Environment](https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppStoreDistributionTutorial/Setup/Setup.html)
     0. Install [CocoaPods](https://guides.cocoapods.org/using/getting-started.html)
@@ -78,7 +78,7 @@ Weex team have developed a [DevTool](https://github.com/weexteam/weex-devtool) t
 See [FAQ](https://alibaba.github.io/weex/doc/faq.html) for more information.
 
 
-### Community based Weex knowledge site 
+### Community based Weex knowledge site
 
 * [weex article](https://github.com/weexteam/article/wiki) : article collection about Weex(\u6587\u7ae0\u96c6\u5408)
 * [weex.help](http://weex.help/)  : 3rd forum about Weex(\u7b2c\u4e09\u65b9Weex\u4e2d\u6587\u6280\u672f\u8bba\u575b)
@@ -87,4 +87,3 @@ See [FAQ](https://alibaba.github.io/weex/doc/faq.html) for more information.
 ## Contributing
 
 See [Weex Contributing Guide](./CONTRIBUTING.md) for more information.
-

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/android/commons/src/main/java/com/alibaba/weex/commons/AbstractWeexActivity.java
----------------------------------------------------------------------
diff --git a/android/commons/src/main/java/com/alibaba/weex/commons/AbstractWeexActivity.java b/android/commons/src/main/java/com/alibaba/weex/commons/AbstractWeexActivity.java
index f655b5e..f043d6d 100644
--- a/android/commons/src/main/java/com/alibaba/weex/commons/AbstractWeexActivity.java
+++ b/android/commons/src/main/java/com/alibaba/weex/commons/AbstractWeexActivity.java
@@ -239,10 +239,10 @@ public abstract class AbstractWeexActivity extends AppCompatActivity implements
     super.onCreate(savedInstanceState);
     createWeexInstance();
     mInstance.onActivityCreate();
-    getWindow().setFormat(PixelFormat.TRANSLUCENT);
-
+    
     mWxAnalyzerDelegate = new WXAnalyzerDelegate(this);
     mWxAnalyzerDelegate.onCreate();
+    getWindow().setFormat(PixelFormat.TRANSLUCENT);
   }
 
   protected final void setContainer(ViewGroup container){

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/android/playground/app/build.gradle
----------------------------------------------------------------------
diff --git a/android/playground/app/build.gradle b/android/playground/app/build.gradle
index a29a04b..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')
@@ -105,7 +104,7 @@ 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.google.android.gms:play-services-appindexing:8.1.0'
+    compile 'com.taobao.android.weex_inspection:urlconnection_interceptor:1.0.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'
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/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/b5123119/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
index 855efb8..ac39f9a 100755
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
@@ -301,11 +301,11 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
     this.mViewPortWidth = mViewPortWidth;
   }
 
-  public int getViewPortWidth() {
+  public static int getViewPortWidth() {
     return mViewPortWidth;
   }
 
-  private int mViewPortWidth = 750;
+  private static volatile int mViewPortWidth = 750;
 
   /**
    * Render strategy.

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/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
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/android/sdk/src/main/java/com/taobao/weex/utils/WXUtils.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/utils/WXUtils.java b/android/sdk/src/main/java/com/taobao/weex/utils/WXUtils.java
index 60e70bd..b2842eb 100755
--- a/android/sdk/src/main/java/com/taobao/weex/utils/WXUtils.java
+++ b/android/sdk/src/main/java/com/taobao/weex/utils/WXUtils.java
@@ -212,6 +212,8 @@ import android.support.annotation.Nullable;
 import android.text.TextUtils;
 
 import com.taobao.weex.WXEnvironment;
+import com.taobao.weex.WXSDKInstance;
+import com.taobao.weex.common.WXConfig;
 
 public class WXUtils {
 
@@ -230,38 +232,57 @@ public class WXUtils {
   }
 
   public static float getFloat(Object value) {
-    if (value == null) {
-      return Float.NaN;
-    }
-    String temp = value.toString().trim();
-    if (temp.endsWith("px")) {
-      temp = temp.substring(0, temp.indexOf("px"));
-    }
-    float result = Float.NaN;
-    try {
-      result = Float.parseFloat(temp);
-    } catch (NumberFormatException e) {
-      WXLogUtils.e("Argument format error!");
-    }
-    return result;
+    return getFloat(value, Float.NaN);
   }
 
   public static Float getFloat(Object value, @Nullable Float df) {
-
     if (value == null) {
       return df;
     }
 
-    try {
-      String temp = value.toString().trim();
-      temp = temp.replace("px","");
-      return Float.parseFloat(temp);
-    } catch (Exception cce) {
-      WXLogUtils.e("Argument error!");
+    String temp = value.toString().trim();
+    if (temp.endsWith("wx")) {
+      try {
+        return transferWx(temp);
+      } catch (NumberFormatException e) {
+        WXLogUtils.e("Argument format error! value is " + value, e);
+      } catch (Exception e) {
+        WXLogUtils.e("Argument error! value is " + value, e);
+      }
+    }else if (temp.endsWith("px")) {
+      try {
+        temp = temp.substring(0, temp.indexOf("px"));
+        return Float.parseFloat(temp);
+      } catch (NumberFormatException nfe) {
+        WXLogUtils.e("Argument format error! value is " + value, nfe);
+      } catch (Exception e) {
+        WXLogUtils.e("Argument error! value is " + value, e);
+      }
+    }else {
+      try {
+        return Float.parseFloat(temp);
+      } catch (NumberFormatException nfe) {
+        WXLogUtils.e("Argument format error! value is " + value, nfe);
+      } catch (Exception e) {
+        WXLogUtils.e("Argument error! value is " + value, e);
+      }
     }
     return df;
   }
 
+  private static float transferWx(String stringWithWXPostfix) {
+    if(null == stringWithWXPostfix) {
+      return 0;
+    }
+    String temp = stringWithWXPostfix;
+    if(stringWithWXPostfix.endsWith("wx")) {
+      temp = stringWithWXPostfix.substring(0, stringWithWXPostfix.indexOf("wx"));
+    }
+    Float f = Float.parseFloat(temp);
+    float density = Float.parseFloat(WXEnvironment.getConfig().get(WXConfig.scale));
+    return density * f * WXSDKInstance.getViewPortWidth() / WXViewUtils.getScreenWidth();
+  }
+
   public static float fastGetFloat(String raw, int precision){
     if(!TextUtils.isEmpty(raw)){
       boolean positive=true;
@@ -287,8 +308,8 @@ public class WXUtils {
           int remainderLength=10;
           int counter=0;
           while(loc<raw.length() &&
-                counter<precision &&
-                ((digit=raw.charAt(loc))>='0'&& digit<='9')){
+                  counter<precision &&
+                  ((digit=raw.charAt(loc))>='0'&& digit<='9')){
             result+=(digit-'0')/(float)remainderLength;
             remainderLength*=10;
             loc++;
@@ -318,20 +339,7 @@ public class WXUtils {
   }
 
   public static int getInt(Object value) {
-    if (value == null) {
-      return 0;
-    }
-    String temp = value.toString().trim();
-    if (temp.endsWith("px")) {
-      temp = temp.substring(0, temp.indexOf("px"));
-    }
-    int result = 0;
-    try {
-      result = Integer.parseInt(temp);
-    } catch (NumberFormatException e) {
-
-    }
-    return result;
+    return getInteger(value, 0);
   }
 
   public static Integer getInteger(@Nullable Object value, @Nullable Integer df) {
@@ -344,52 +352,118 @@ public class WXUtils {
       return (Integer) value;
     } catch (ClassCastException cce) {
       String temp = value.toString().trim();
-      if (temp.endsWith("px")) {
-        temp = temp.substring(0, temp.indexOf("px"));
-      }
-      try {
-        return Integer.parseInt(temp);
-      } catch (NumberFormatException nfe) {
-        WXLogUtils.e("Argument format error!");
-      } catch (Exception e) {
-        WXLogUtils.e("Argument error!");
+
+      if (temp.endsWith("wx")) {
+        try {
+          return (int) transferWx(temp);
+        } catch (NumberFormatException e) {
+          WXLogUtils.e("Argument format error! value is " + value, e);
+        } catch (Exception e) {
+          WXLogUtils.e("Argument error! value is " + value, e);
+        }
+      }else if (temp.endsWith("px")) {
+        try {
+          temp = temp.substring(0, temp.indexOf("px"));
+          return Integer.parseInt(temp);
+        } catch (NumberFormatException nfe) {
+          WXLogUtils.e("Argument format error! value is " + value, nfe);
+        } catch (Exception e) {
+          WXLogUtils.e("Argument error! value is " + value, e);
+        }
+      }else {
+        try {
+          return Integer.parseInt(temp);
+        } catch (NumberFormatException nfe) {
+          WXLogUtils.e("Argument format error! value is " + value, nfe);
+        } catch (Exception e) {
+          WXLogUtils.e("Argument error! value is " + value, e);
+        }
       }
     }
 
     return df;
   }
 
+  /**
+   * Looks like no longer usage exists, Mark deprecate first.
+   * @param value
+   * @return
+   */
+  @Deprecated
   public static long getLong(Object value) {
     if (value == null) {
       return 0;
     }
-    String temp = value.toString().trim();
-    if (temp.endsWith("px")) {
-      temp = temp.substring(0, temp.indexOf("px"));
-    }
     long result = 0;
-    try {
-      result = Long.parseLong(temp);
-    } catch (NumberFormatException e) {
-      WXLogUtils.e("[WXUtils] getLong:", e);
+    String temp = value.toString().trim();
+    if (temp.endsWith("wx")) {
+      try {
+        return (long)transferWx(temp);
+      } catch (NumberFormatException e) {
+        WXLogUtils.e("Argument format error! value is " + value, e);
+      } catch (Exception e) {
+        WXLogUtils.e("Argument error! value is " + value, e);
+      }
+    }else if (temp.endsWith("px")) {
+      try {
+        temp = temp.substring(0, temp.indexOf("px"));
+        return Long.parseLong(temp);
+      } catch (NumberFormatException nfe) {
+        WXLogUtils.e("Argument format error! value is " + value, nfe);
+      } catch (Exception e) {
+        WXLogUtils.e("Argument error! value is " + value, e);
+      }
+    }else {
+      try {
+        return Long.parseLong(temp);
+      } catch (NumberFormatException nfe) {
+        WXLogUtils.e("Argument format error! value is " + value, nfe);
+      } catch (Exception e) {
+        WXLogUtils.e("Argument error! value is " + value, e);
+      }
     }
     return result;
   }
 
+  /**
+   * Looks like no longer usage exists, Mark deprecate first.
+   * @param value
+   * @return
+   */
+  @Deprecated
   public static double getDouble(Object value) {
     if (value == null) {
       return 0;
     }
-    String temp = value.toString().trim();
-    if (temp.endsWith("px")) {
-      temp = temp.substring(0, temp.indexOf("px"));
-    }
     double result = 0;
-    try {
-      result = Double.parseDouble(temp);
-    } catch (NumberFormatException e) {
-      WXLogUtils.e("[WXUtils] getDouble:", e);
+    String temp = value.toString().trim();
+    if (temp.endsWith("wx")) {
+      try {
+        return transferWx(temp);
+      } catch (NumberFormatException e) {
+        WXLogUtils.e("Argument format error! value is " + value, e);
+      } catch (Exception e) {
+        WXLogUtils.e("Argument error! value is " + value, e);
+      }
+    }else if (temp.endsWith("px")) {
+      try {
+        temp = temp.substring(0, temp.indexOf("px"));
+        return Double.parseDouble(temp);
+      } catch (NumberFormatException nfe) {
+        WXLogUtils.e("Argument format error! value is " + value, nfe);
+      } catch (Exception e) {
+        WXLogUtils.e("Argument error! value is " + value, e);
+      }
+    }else {
+      try {
+        return Double.parseDouble(temp);
+      } catch (NumberFormatException nfe) {
+        WXLogUtils.e("Argument format error! value is " + value, nfe);
+      } catch (Exception e) {
+        WXLogUtils.e("Argument error! value is " + value, e);
+      }
     }
+
     return result;
   }
 
@@ -453,4 +527,4 @@ public class WXUtils {
     return (int)(Float.parseFloat(raw) / HUNDRED * unit);
   }
 
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/android/sdk/src/test/java/com/taobao/weex/utils/WXUtilsTest.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/test/java/com/taobao/weex/utils/WXUtilsTest.java b/android/sdk/src/test/java/com/taobao/weex/utils/WXUtilsTest.java
index c8080e6..024c224 100755
--- a/android/sdk/src/test/java/com/taobao/weex/utils/WXUtilsTest.java
+++ b/android/sdk/src/test/java/com/taobao/weex/utils/WXUtilsTest.java
@@ -204,35 +204,76 @@
  */
 package com.taobao.weex.utils;
 
+import android.text.TextUtils;
+
 import com.taobao.weappplus_sdk.BuildConfig;
+import com.taobao.weex.WXEnvironment;
+import com.taobao.weex.WXSDKInstance;
+import com.taobao.weex.common.WXConfig;
+
 import junit.framework.TestCase;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+import org.powermock.api.mockito.PowerMockito;
 import org.powermock.core.classloader.annotations.PowerMockIgnore;
-import org.robolectric.RobolectricGradleTestRunner;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
 import org.robolectric.annotation.Config;
 
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.mockito.Matchers.any;
+
 /**
  * Created by lixinke on 16/2/24.
  */
-@RunWith(RobolectricGradleTestRunner.class)
+@RunWith(PowerMockRunner.class)
 @Config(constants = BuildConfig.class, sdk = 19)
 @PowerMockIgnore( {"org.mockito.*", "org.robolectric.*", "android.*"})
+@PrepareForTest( {WXEnvironment.class, WXViewUtils.class, WXSDKInstance.class, TextUtils.class})
 public class WXUtilsTest extends TestCase {
 
+    public static final float TEST_DENSITY = 3.0f;
+    public static final int TEST_SCREEN_WIDTH = 1024;
+    public static final int TEST_VIEW_PORT = 800;
+
     @Before
     public void setUp() throws Exception {
         super.setUp();
 
+        Map<String, String> map = new HashMap<>();
+        map.put(WXConfig.scale, Float.toString(TEST_DENSITY));
+        PowerMockito.mockStatic(WXEnvironment.class);
+        PowerMockito.when(WXEnvironment.class, "getConfig").thenReturn(map);
+
+        PowerMockito.mockStatic(WXViewUtils.class);
+        PowerMockito.when(WXViewUtils.class, "getScreenWidth").thenReturn(TEST_SCREEN_WIDTH);
+
+        PowerMockito.mockStatic(WXSDKInstance.class);
+        PowerMockito.when(WXSDKInstance.class, "getViewPortWidth").thenReturn(TEST_VIEW_PORT);
+
+        PowerMockito.mockStatic(TextUtils.class);
+        PowerMockito.when(TextUtils.isEmpty(any(CharSequence.class))).thenAnswer(new Answer<Boolean>() {
+            @Override
+            public Boolean answer(InvocationOnMock invocation) throws Throwable {
+                CharSequence a = (CharSequence) invocation.getArguments()[0];
+                return !(a != null && a.length() > 0);
+            }
+        });
+        // also look at @PrepareForTest if add mock of new class
     }
 
     @Test
     public void testGetFloat() throws Exception {
         float test_float = WXUtils.getFloat("12324.9px");
-        assertEquals(12324.9, test_float, 0.9);
+        assertEquals(12324.9, test_float, 0.01);
 
-        assertEquals(WXUtils.fastGetFloat("1.2345",2),1.23f);
+        assertEquals(WXUtils.fastGetFloat("1.2345",2), 1.23f);
     }
 
     @Test
@@ -250,6 +291,80 @@ public class WXUtilsTest extends TestCase {
     @Test
     public void testGetDouble() throws Exception {
         double test_Double = WXUtils.getDouble("8098.8989px");
-        assertEquals(8098.8, test_Double, 0.89);
+        assertEquals(8098.8, test_Double, 0.1);
+    }
+
+    @Test
+    public void testGetFloatWX() throws Exception {
+        Float test_float = WXUtils.getFloat("100wx");
+        Float want = 100 * TEST_DENSITY * TEST_VIEW_PORT / TEST_SCREEN_WIDTH;
+        assertEquals(test_float, want , 0.01);
+
+        test_float = WXUtils.getFloat("100px");
+        want = 100F;
+        assertEquals(test_float, want);
+
+        test_float = WXUtils.getFloat("100.2");
+        want = 100.2F;
+        assertEquals(test_float, want);
+
+        test_float = WXUtils.getFloat(100.2F);
+        want = 100.2F;
+        assertEquals(test_float, want, 0.0001);
+
+        test_float = WXUtils.getFloat(100.2D);
+        want = 100.2F;
+        assertEquals(test_float, want, 0.0001);
+
+        test_float = WXUtils.getFloat("NaN");
+        want = Float.NaN;
+        assertEquals(test_float, want);
+    }
+
+    @Test
+    public void testGetIntWX() throws Exception {
+        Integer test_int = WXUtils.getInt("100wx");
+        Integer want = (int)(100 * TEST_DENSITY * TEST_VIEW_PORT / TEST_SCREEN_WIDTH);
+        assertEquals(test_int, want);
+
+        test_int = WXUtils.getInt("100px");
+        want = 100;
+        assertEquals(test_int, want);
+
+        test_int = WXUtils.getInt("100");
+        want = 100;
+        assertEquals(test_int, want);
+
+        test_int = WXUtils.getInt(100);
+        want = 100;
+        assertEquals(test_int, want);
+
+        test_int = WXUtils.getInt(100.1);
+        want = 0;
+        assertEquals(test_int, want); // double can not cast to integer
     }
+
+    @Test
+    public void testGetDoubleWX() throws Exception {
+        Double test_double = WXUtils.getDouble("100.32wx");
+        Double want = (100.32D * TEST_DENSITY * TEST_VIEW_PORT / TEST_SCREEN_WIDTH);
+        assertEquals(test_double, want, 0.01);
+
+        test_double = WXUtils.getDouble("100px");
+        want = 100D;
+        assertEquals(test_double, want, 0.01);
+
+        test_double = WXUtils.getDouble("100");
+        want = 100D;
+        assertEquals(test_double, want, 0.01);
+
+        test_double = WXUtils.getDouble(100);
+        want = 100D;
+        assertEquals(test_double, want, 0.01);
+
+        test_double = WXUtils.getDouble(100.1);
+        want = 100.1D;
+        assertEquals(test_double, want, 0.01);
+    }
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/build/build.js
----------------------------------------------------------------------
diff --git a/build/build.js b/build/build.js
index 9843944..c405368 100644
--- a/build/build.js
+++ b/build/build.js
@@ -2,179 +2,106 @@ const fs = require('fs')
 const path = require('path')
 const gzip = require('zlib').createGzip()
 const pkg = require('../package.json')
-const { rollup } = require('rollup')
-const json = require('rollup-plugin-json')
-const eslint = require('rollup-plugin-eslint')
-const replace = require('rollup-plugin-replace')
-const postcss = require('rollup-plugin-postcss')
-const nodeResolve = require('rollup-plugin-node-resolve')
-const uglify = require('rollup-plugin-uglify')
-const commonjs = require('rollup-plugin-commonjs')
-const buble = require('rollup-plugin-buble')
+const rollup = require('rollup')
+const watch = require('rollup-watch')
 
-const frameworkVersion = pkg.subversion.framework
-const browserVersion = pkg.subversion.browser
-const commonBanner = `(this.getJSFMVersion = function(){return "${frameworkVersion}"});`
-  + `var global = this, process = { env: {} };var setTimeout = global.setTimeout;\n`
+const getConfig = require('./config')
 
 // create dist folder
 if (!fs.existsSync('dist')) {
   fs.mkdirSync('dist')
 }
 
+let isWatch = false
+if (process.argv[3]) {
+  isWatch = process.argv[3] === '--watch' || process.argv[3] === '-w'
+}
+
 // build specific package
 if (process.argv[2]) {
-  switch (process.argv[2]) {
-    case 'native': buildNative(); break;
-    case 'runtime': buildRuntime(); break;
-    case 'browser': buildBrowser(); break;
-    default: console.log('\n  invalid package name.\n')
-  }
+  build(process.argv[2])
 }
-
-// build all packages by default
 else {
-  buildNative()
-  buildRuntime()
+  console.log('\nPlease specify the package you want to build. [native, runtime, browser, vue]')
 }
 
-function runRollup (config) {
-  return rollup(config).then(bundle => {
-    bundle.write(config)
-      .then(() => {
-        const size = getSize(config.dest)
-        console.log(`write file at: ${config.dest} ${size}`)
+function runRollupOnWatch(config) {
+  const watcher = watch(rollup, config)
+  watcher.on('event', event => {
+    switch ( event.code ) {
+      case 'STARTING':
+        console.log('checking rollup-watch version...')
+        break
+
+      case 'BUILD_START':
+        console.log('bundling...')
+        break
+
+      case 'BUILD_END':
+        console.log('bundled in ' + path.relative(process.cwd(), config.dest)
+          + ' (' + event.duration + 'ms)')
+        console.log('Watching for changes...' )
+        break
+
+      case 'ERROR':
+        console.error('ERROR: ', event.error)
+        break
+
+      default:
+        console.error('unknown event', event)
+    }
+  })
+}
 
-        // gzip minified file
-        if (/\.min\.js$/.test(config.dest)) {
-          const read = fs.createReadStream(config.dest)
-          const write = fs.createWriteStream(config.dest + '.gz')
-          read.pipe(gzip).pipe(write).on('close', () => {
-            const gzipSize = getSize(config.dest + '.gz')
-            console.log(`write file at: ${config.dest}.gz ${gzipSize}`)
-          })
-        }
+function runRollup (config) {
+  return new Promise((resolve, reject) => {
+    rollup.rollup(config).then(bundle => {
+      bundle.write(config).then(() => {
+        report(config.dest)
+        resolve()
       })
+    })
   })
 }
 
-function build (name, options, plugins) {
-  const env = options.env
-  plugins = plugins || options.plugins
-  delete options.env
-
-  // build development version
-  if (!env || env === 'development') {
-    // console.log(`start building ${name}.js (development version)`)
-    runRollup(Object.assign({}, options, {
-      dest: `./dist/${name}.js`,
-      sourceMap: 'inline',
-      plugins: [
-        ...plugins,
-        replace({
-          'process.env.NODE_ENV': JSON.stringify('development'),
-          'process.env.VUE_ENV': JSON.stringify('weex'),
-          'process.env.NODE_DEBUG': false
-        })
-      ]
-    }))
-  }
-
-  // build production version
-  if (!env || env === 'production') {
-    // console.log(`start building ${name}.min.js (production version)`)
-    runRollup(Object.assign({}, options, {
-      dest: `./dist/${name}.min.js`,
-      plugins: [
-        ...plugins,
-        replace({
-          'process.env.NODE_ENV': JSON.stringify('production'),
-          'process.env.VUE_ENV': JSON.stringify('weex'),
-          'process.env.NODE_DEBUG': false
-        }),
-        uglify()
-      ]
-    }))
+function build (name) {
+  let pkgName = 'weex-js-framework'
+  switch (name) {
+    case 'native': pkgName = 'weex-js-framework'; break;
+    case 'runtime': pkgName = 'weex-js-runtime'; break;
+    case 'browser': pkgName = 'weex-web-render'; break;
+    case 'vue': pkgName = 'weex-vue-render'; break;
   }
-}
 
-function buildNative () {
-  const banner = `(this.nativeLog || function(s) {console.log(s)})`
-    + `('START JS FRAMEWORK: ${frameworkVersion} Build ${now()}');\n`
-    + commonBanner
+  const config = getConfig(pkgName)
+  const minifyConfig = getConfig(pkgName, true)
 
-  build('native', {
-    entry: './html5/render/native/index.js',
-    banner,
-    format: 'umd',
-    plugins: [
-      json(),
-      eslint({
-        exclude: './package.json'
-      }),
-      nodeResolve({
-        jsnext: true,
-        main: true
-      }),
-      commonjs(),
-      buble()
-    ]
-  })
-}
-
-function buildRuntime () {
-  const banner = `('WEEX JS RUNTIME: ${frameworkVersion}, Build ${now()}');`
-    + `var global = this, process = { env: {} };var setTimeout = global.setTimeout;\n`
-
-  build('runtime', {
-    moduleName: 'weexRuntime',
-    entry: './html5/runtime/index.js',
-    format: 'umd',
-    banner,
-    plugins: [
-      eslint(),
-      nodeResolve({
-        jsnext: true,
-        main: true
-      }),
-      commonjs(),
-      buble()
-    ]
-  })
+  if (isWatch) {
+    return runRollupOnWatch(config)
+  }
+  else {
+    console.log(`\n => start to build ${name} (${pkgName})\n`)
+    return new Promise((resolve, reject) => {
+      runRollup(config).then(() => {
+        runRollup(minifyConfig).then(() => {
+          zip(minifyConfig.dest, resolve)
+        })
+      })
+    })
+  }
 }
 
-function buildBrowser () {
-  const banner = `(this.nativeLog || function(s) {console.log(s)})`
-    + `('START WEEX HTML5: ${browserVersion} Build ${now()}');\n`
-    + commonBanner
-
-  build('browser', {
-    moduleName: 'weex',
-    entry: './html5/render/browser/index.js',
-    banner,
-    format: 'umd',
-    plugins: [
-      postcss(),
-      json(),
-      eslint({
-        exclude: ['./package.json', '**/*.css']
-      }),
-      nodeResolve({
-        jsnext: true,
-        main: true,
-        browser: true
-      }),
-      commonjs(),
-      buble()
-    ]
+function zip (filePath, callback) {
+  const read = fs.createReadStream(filePath)
+  const write = fs.createWriteStream(filePath + '.gz')
+  read.pipe(gzip).pipe(write).on('close', () => {
+    report(filePath + '.gz')
+    callback && callback()
   })
 }
 
-function getSize (file) {
-  return (fs.statSync(file).size / 1024).toFixed(2) + 'KB'
-}
-
-function now () {
-  const time = Date.now() - (new Date()).getTimezoneOffset() * 60000
-  return (new Date(time)).toISOString().replace('T', ' ').substring(0, 16)
+function report (filePath) {
+  const size = (fs.statSync(filePath).size / 1024).toFixed(2) + 'KB'
+  const file = path.relative(process.cwd(), filePath)
+  console.log(` => write ${file} (${size})`)
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/build/config.js
----------------------------------------------------------------------
diff --git a/build/config.js b/build/config.js
new file mode 100644
index 0000000..edb4db8
--- /dev/null
+++ b/build/config.js
@@ -0,0 +1,121 @@
+const path = require('path')
+const json = require('rollup-plugin-json')
+const eslint = require('rollup-plugin-eslint')
+const replace = require('rollup-plugin-replace')
+const postcss = require('rollup-plugin-postcss')
+const nodeResolve = require('rollup-plugin-node-resolve')
+const uglify = require('rollup-plugin-uglify')
+const commonjs = require('rollup-plugin-commonjs')
+const buble = require('rollup-plugin-buble')
+const subversion = require('../package.json').subversion
+
+const frameworkBanner = `;(this.getJSFMVersion = function()`
+  + `{return "${subversion.framework}"});\n`
+  + `var global = this, process = { env: {} };var setTimeout = global.setTimeout;\n`
+
+const configs = {
+  'weex-js-framework': {
+    moduleName: 'Weex',
+    entry: absolute('html5/render/native/index.js'),
+    dest: absolute('dist/native.js'),
+    banner: `(this.nativeLog || function(s) {console.log(s)})`
+      + `('START JS FRAMEWORK ${subversion.framework}, Build ${now()}.');\n`
+      + frameworkBanner,
+    format: 'umd',
+    plugins: [
+      nodeResolve({
+        jsnext: true,
+        main: true
+      }),
+    ]
+  },
+  'weex-js-runtime': {
+    moduleName: 'WeexRuntime',
+    entry: absolute('html5/runtime/index.js'),
+    dest: absolute('dist/runtime.js'),
+    banner: `/* 'WEEX JS RUNTIME ${subversion.framework}, Build ${now()}. */\n\n`
+      + frameworkBanner,
+    format: 'umd',
+    plugins: [
+      nodeResolve({
+        jsnext: true,
+        main: true
+      }),
+    ]
+  },
+  'weex-web-render': {
+    moduleName: 'Weex',
+    entry: absolute('html5/render/browser/index.js'),
+    dest: absolute('dist/browser.js'),
+    banner: `(this.nativeLog || function(s) {console.log(s)})`
+      + `('START WEEX HTML5: ${subversion.browser}, Build ${now()}.');\n`
+      + frameworkBanner,
+    format: 'umd',
+    plugins: [
+      postcss(),
+      nodeResolve({
+        jsnext: true,
+        main: true,
+        browser: true
+      })
+    ]
+  },
+  'weex-vue-render': {
+    moduleName: 'VueRenderer',
+    entry: absolute('html5/render/vue/index.js'),
+    dest: absolute('dist/weex-vue-render.js'),
+    banner: `/* 'WEEX VUE RENDER ${subversion.vueRender}, Build ${now()}. */\n\n`,
+    format: 'umd',
+    plugins: [
+      postcss(),
+      nodeResolve({
+        jsnext: true,
+        main: true,
+        browser: true
+      })
+    ]
+  }
+}
+
+function getConfig (name, minify) {
+  const opt = configs[name]
+  const config = {
+    moduleName: opt.moduleName,
+    entry: opt.entry,
+    dest: minify ? opt.dest.replace(/\.js$/, '.min.js') : opt.dest,
+    format: opt.format,
+    banner: opt.banner,
+    plugins: opt.plugins.concat([
+      json(),
+      replace({
+        'process.env.NODE_ENV': JSON.stringify(minify ? 'production' : 'development'),
+        'process.env.VUE_ENV': JSON.stringify('WEEX'),
+        'process.env.NODE_DEBUG': false
+      }),
+      commonjs(),
+      buble()
+    ])
+  }
+
+  if (minify) {
+    config.plugins.push(uglify())
+  }
+  else {
+    config.sourceMap = 'inline'
+    config.plugins.unshift(eslint({ exclude: ['**/*.json', '**/*.css'] }))
+  }
+
+  return config
+}
+
+// get the absolute path
+function absolute (str) {
+  return path.resolve(__dirname, '..', str)
+}
+
+function now () {
+  const time = Date.now() - (new Date()).getTimezoneOffset() * 60000
+  return (new Date(time)).toISOString().replace('T', ' ').substring(0, 16)
+}
+
+module.exports = getConfig

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/build/rollup.browser.config.js
----------------------------------------------------------------------
diff --git a/build/rollup.browser.config.js b/build/rollup.browser.config.js
deleted file mode 100644
index 47325f1..0000000
--- a/build/rollup.browser.config.js
+++ /dev/null
@@ -1,38 +0,0 @@
-import { rollup } from 'rollup'
-import postcss from 'rollup-plugin-postcss'
-import json from 'rollup-plugin-json'
-import eslint from 'rollup-plugin-eslint'
-import nodeResolve from 'rollup-plugin-node-resolve'
-import commonjs from 'rollup-plugin-commonjs'
-import buble from 'rollup-plugin-buble'
-
-const pkg = require('../package.json')
-const version = pkg.subversion.browser
-const date = new Date().toISOString().split('T')[0].replace(/\-/g, '')
-const banner = `\
-(this.nativeLog || function(s) {console.log(s)})('START WEEX HTML5: ${version} Build ${date}');
-var global = this, process = { env: {}};
-`
-
-export default {
-  entry: './html5/render/browser/index.js',
-  dest: './dist/browser.js',
-  banner,
-  format: 'umd',
-  moduleName: 'weex',
-  sourceMap: 'inline',
-  plugins: [
-    postcss(),
-    json(),
-    eslint({
-      exclude: ['./package.json', '**/*.css']
-    }),
-    nodeResolve({
-      jsnext: true,
-      main: true,
-      browser: true
-    }),
-    commonjs(),
-    buble()
-  ]
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/build/rollup.config.js
----------------------------------------------------------------------
diff --git a/build/rollup.config.js b/build/rollup.config.js
deleted file mode 100644
index 0752427..0000000
--- a/build/rollup.config.js
+++ /dev/null
@@ -1,34 +0,0 @@
-import { rollup } from 'rollup'
-import json from 'rollup-plugin-json'
-import eslint from 'rollup-plugin-eslint'
-import nodeResolve from 'rollup-plugin-node-resolve'
-import commonjs from 'rollup-plugin-commonjs'
-import buble from 'rollup-plugin-buble'
-
-const pkg = require('../package.json')
-const version = pkg.subversion.framework
-const date = new Date().toISOString().split('T')[0].replace(/\-/g, '')
-const banner = `\
-(this.nativeLog || function(s) {console.log(s)})('START JS FRAMEWORK: ${version} Build ${date}');
-var global = this, process = { env: {}};var setTimeout = global.setTimeout;
-`
-
-export default {
-  entry: './html5/render/native/index.js',
-  dest: './dist/native.js',
-  banner,
-  format: 'umd',
-  sourceMap: 'inline',
-  plugins: [
-    json(),
-    eslint({
-      exclude: './package.json'
-    }),
-    nodeResolve({
-      jsnext: true,
-      main: true
-    }),
-    commonjs(),
-    buble()
-  ]
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/build/webpack.examples.config.js
----------------------------------------------------------------------
diff --git a/build/webpack.examples.config.js b/build/webpack.examples.config.js
index d39807d..29c3048 100644
--- a/build/webpack.examples.config.js
+++ b/build/webpack.examples.config.js
@@ -44,12 +44,8 @@ module.exports = {
   module: {
     loaders: [
       {
-        test: /\.we(\?[^?]+)?$/,
+        test: /\.(we|vue)(\?[^?]+)?$/,
         loader: 'weex'
-      },
-      {
-        test: /\.vue(\?[^?]+)?$/,
-        loader: 'weex-vue-loader'
       }
     ]
   },

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/dist/weex-html5/LICENSE
----------------------------------------------------------------------
diff --git a/dist/weex-html5/LICENSE b/dist/weex-html5/LICENSE
deleted file mode 100644
index 8dada3e..0000000
--- a/dist/weex-html5/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
-                                 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 {yyyy} {name of copyright owner}
-
-   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.

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/dist/weex-html5/NOTICE
----------------------------------------------------------------------
diff --git a/dist/weex-html5/NOTICE b/dist/weex-html5/NOTICE
deleted file mode 100644
index 4190feb..0000000
--- a/dist/weex-html5/NOTICE
+++ /dev/null
@@ -1,7 +0,0 @@
-Weex 
-Copyright 2016 Alibaba Group
-
-This product includes software developed at Alibaba Group. (http://www.alibabagroup.com)
-
-This product contains software (https://github.com/component/scroll-to) developed
-by TooTallNate , licensed under the MIT License.
\ No newline at end of file


[29/50] [abbrv] incubator-weex git commit: * [ios] update weex examples

Posted by ji...@apache.org.
* [ios] update weex examples


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

Branch: refs/heads/master
Commit: c0a6edf63dfeac6f89b9c9278c3432f51313a718
Parents: 91389e0
Author: boboning <ni...@163.com>
Authored: Thu Feb 16 17:42:24 2017 +0800
Committer: boboning <ni...@163.com>
Committed: Thu Feb 16 17:42:24 2017 +0800

----------------------------------------------------------------------
 examples/index.we                               |  1 +
 examples/linear-gradient.we                     | 70 ++++++++++++++++++++
 .../xcshareddata/xcschemes/WeexDemo.xcscheme    |  2 +-
 ios/sdk/WeexSDK.podspec                         |  2 +-
 4 files changed, 73 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/c0a6edf6/examples/index.we
----------------------------------------------------------------------
diff --git a/examples/index.we b/examples/index.we
index 62d9cf2..54feddc 100644
--- a/examples/index.we
+++ b/examples/index.we
@@ -16,6 +16,7 @@
         {name: 'hello', title: 'Hello World'},
         {name: 'style/index', title: 'Common Style'},
         {name: 'animation', title: 'Animation'},
+        {name: 'linear-gradient', title: 'Gradient Color'},
 
         // component
         {name: 'component/text-demo', title: 'Text'},

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/c0a6edf6/examples/linear-gradient.we
----------------------------------------------------------------------
diff --git a/examples/linear-gradient.we b/examples/linear-gradient.we
new file mode 100644
index 0000000..babe158
--- /dev/null
+++ b/examples/linear-gradient.we
@@ -0,0 +1,70 @@
+<template>
+    <scroller style="background-color: #3a3a3a">
+        <div class="container1" style="background-image:linear-gradient(to right,#43C6AC,#F8FFAE);">
+            <text class="direction">to right</text>
+        </div>
+        <div class="container1" style="background-image:linear-gradient(to left,#DCE35B,#45B649);">
+            <text class="direction">to left</text>
+        </div>
+        <div class="container1" style="background-image:linear-gradient(to bottom,#3494E6,#EC6EAD);">
+            <text class="direction">to bottom</text>
+        </div>
+        <div class="container1" style="background-image:linear-gradient(to top,#ee0979,#ff6a00);">
+            <text class="direction">to top</text>
+        </div>
+        <div style="flex-direction: row;align-items: center;justify-content: center">
+            <div class="container2" style="background-image:linear-gradient(to bottom right,#00c3ff,#ffff1c);">
+                <text class="direction">to bottom right</text>
+            </div>
+            <div class="container2" style="background-image:linear-gradient(to top left,#ff00cc,#333399);">
+                <text class="direction">to top left</text>
+            </div>
+        </div>
+        <div class="container1" style="background-image:linear-gradient(to right,#a80077,#66ff00);">
+            <text class="direction">to right</text>
+        </div>
+        <div class="container1" style="background-image:linear-gradient(to left,#a80077,#66ff00);">
+            <text class="direction">to left</text>
+        </div>
+        <div class="container1" style="background-image:linear-gradient(to bottom,#a80077,#66ff00);">
+            <text class="direction">to bottom</text>
+        </div>
+        <div class="container1" style="background-image:linear-gradient(to top,#a80077,#66ff00);">
+            <text class="direction">to top</text>
+        </div>
+        <div style="flex-direction: row;align-items: center;justify-content: center">
+            <div class="container2" style="background-image:linear-gradient(to bottom right,#a80077,#66ff00);">
+                <text class="direction">to bottom right</text>
+            </div>
+            <div class="container2" style="background-image:linear-gradient(to top left,#a80077,#66ff00);">
+                <text class="direction">to top left</text>
+            </div>
+        </div>
+    </scroller>
+</template>
+<style>
+    .container1 {
+        margin: 10px;
+        width: 730px;
+        height: 200px;
+        align-items: center;
+        justify-content: center;
+        border: solid;
+        border-radius: 10px;
+    }
+
+    .container2 {
+        margin: 10px;
+        width: 300px;
+        height: 300px;
+        align-items: center;
+        justify-content: center;
+        border: solid;
+        border-radius: 10px;
+    }
+
+    .direction {
+        font-size: 40px;
+        color: white;
+    }
+</style>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/c0a6edf6/ios/playground/WeexDemo.xcodeproj/xcshareddata/xcschemes/WeexDemo.xcscheme
----------------------------------------------------------------------
diff --git a/ios/playground/WeexDemo.xcodeproj/xcshareddata/xcschemes/WeexDemo.xcscheme b/ios/playground/WeexDemo.xcodeproj/xcshareddata/xcschemes/WeexDemo.xcscheme
index a0422b6..a33c31d 100644
--- a/ios/playground/WeexDemo.xcodeproj/xcshareddata/xcschemes/WeexDemo.xcscheme
+++ b/ios/playground/WeexDemo.xcodeproj/xcshareddata/xcschemes/WeexDemo.xcscheme
@@ -63,7 +63,7 @@
       </AdditionalOptions>
    </TestAction>
    <LaunchAction
-      buildConfiguration = "Release"
+      buildConfiguration = "Debug"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
       launchStyle = "0"

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/c0a6edf6/ios/sdk/WeexSDK.podspec
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK.podspec b/ios/sdk/WeexSDK.podspec
index 17ec318..66af1d4 100644
--- a/ios/sdk/WeexSDK.podspec
+++ b/ios/sdk/WeexSDK.podspec
@@ -3,7 +3,7 @@ Pod::Spec.new do |s|
 
   s.name         = "WeexSDK"
 
-  s.version      = "0.9.5"
+  s.version      = "0.10.0"
 
   s.summary      = "WeexSDK Source ."
 


[22/50] [abbrv] incubator-weex git commit: Merge pull request #2581 from IskenHuang/doc-feature-jsservice

Posted by ji...@apache.org.
Merge pull request #2581 from IskenHuang/doc-feature-jsservice

Doc feature jsservice

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

Branch: refs/heads/master
Commit: 01a4a60d91848fbac3f0a5e2c61fef765c7a54f7
Parents: a9f433f e640922
Author: \u52fe\u4e09\u80a1\u56db <zh...@me.com>
Authored: Thu Feb 16 14:16:13 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Thu Feb 16 14:16:13 2017 +0800

----------------------------------------------------------------------
 doc/package.json                                |   5 +-
 doc/source/references/advanced/extend-jsfm.md   |   2 +-
 .../references/advanced/extend-to-android.md    |   2 +-
 .../references/advanced/extend-to-html5.md      |   2 +-
 doc/source/references/advanced/extend-to-ios.md |   2 +-
 doc/source/references/advanced/index.md         |   2 +-
 .../advanced/integrate-devtool-to-android.md    |   2 +-
 .../advanced/integrate-devtool-to-ios.md        |   2 +-
 doc/source/references/js-service/index.md       | 114 +++++++++++++++++++
 doc/source/references/vue/difference-of-vuex.md |   2 +-
 .../references/vue/difference-with-web.md       |   2 +-
 doc/source/references/vue/index.md              |   2 +-
 12 files changed, 128 insertions(+), 11 deletions(-)
----------------------------------------------------------------------



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

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

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

Branch: refs/heads/master
Commit: 579d27d7868691818109613cc54761eea1a6f9b8
Parents: dcd99ea 0d244c7
Author: Hanks <zh...@gmail.com>
Authored: Thu Feb 16 20:40:16 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Thu Feb 16 20:40:16 2017 +0800

----------------------------------------------------------------------
 .eslintignore                                   |   2 +
 .github/ISSUE_TEMPLATE.md                       |  30 +-
 .github/PULL_REQUEST_TEMPLATE.md                |  26 +-
 .gitignore                                      |   9 +-
 .wwprc                                          |  10 +-
 README.md                                       |  37 +-
 doc/.gitignore                                  |   5 -
 doc/INSTALL.md                                  |  38 -
 doc/LICENSE                                     | 202 ----
 doc/NOTICE                                      |   5 -
 doc/README.md                                   |   9 -
 doc/SUMMARY.md                                  |  95 --
 doc/_config.yml                                 | 323 +++++++
 doc/_layouts/header.html                        | 269 ------
 doc/_legacy/core-concepts/animation.md          |  34 -
 doc/_legacy/integrating.md                      |   3 -
 doc/_legacy/syntax/javascript.md                |  53 --
 doc/advanced/extend-to-android.md               | 160 ----
 doc/advanced/extend-to-html5.md                 | 252 -----
 doc/advanced/extend-to-ios.md                   | 262 ------
 doc/advanced/how-data-binding-works.md          |  32 -
 doc/advanced/how-it-works.md                    | 140 ---
 doc/advanced/integrate-to-android.md            | 197 ----
 doc/advanced/integrate-to-html5.md              |  70 --
 doc/advanced/integrate-to-ios.md                | 109 ---
 doc/advanced/main.md                            |   3 -
 doc/ali_addition/weex_doc.css                   | 146 ---
 doc/ali_addition/weex_doc.js                    |  78 --
 doc/book.json                                   |  19 -
 doc/components/a.md                             |  25 -
 doc/components/cell.md                          |  36 -
 doc/components/div.md                           |  42 -
 doc/components/image.md                         |  49 -
 doc/components/indicator.md                     |  92 --
 doc/components/input.md                         |  79 --
 doc/components/list.md                          |  57 --
 doc/components/main.md                          |   3 -
 doc/components/refresh-loading.md               |  27 -
 doc/components/scroller.md                      |  70 --
 doc/components/slider.md                        |  65 --
 doc/components/special-element.md               |  29 -
 doc/components/switch.md                        |  55 --
 doc/components/text.md                          |  60 --
 doc/components/textarea.md                      |  74 --
 doc/components/video.md                         |  49 -
 doc/components/web.md                           |  49 -
 doc/components/wxc-navpage.md                   |  68 --
 doc/components/wxc-tabbar.md                    |  91 --
 doc/demo/animation.md                           |  10 -
 doc/demo/clipboard.md                           |   9 -
 doc/demo/hello-world.md                         |  16 -
 doc/demo/list.md                                |   9 -
 doc/demo/main.md                                |   3 -
 doc/demo/modal.md                               |   9 -
 doc/demo/slider.md                              |   9 -
 doc/faq.md                                      | 127 ---
 doc/guide.md                                    |   3 -
 doc/how-to/customize-a-native-component.md      |  49 -
 doc/how-to/cuszomize-native-apis.md             |  73 --
 doc/how-to/debug-with-html5.md                  |  40 -
 doc/how-to/debug-with-remote-tools.md           |  34 -
 doc/how-to/main.md                              |   3 -
 doc/how-to/preview-in-browser.md                |  31 -
 doc/how-to/preview-in-playground-app.md         |  13 -
 doc/how-to/require-3rd-party-libs.md            |  50 -
 doc/how-to/transform-code-into-js-bundle.md     |  98 --
 doc/images/css-boxmodel.png                     | Bin 12581 -> 0 bytes
 doc/images/css-flexbox-align.jpg                | Bin 35005 -> 0 bytes
 doc/images/css-flexbox-justify.svg              |  59 --
 doc/images/css-flexbox-sample.png               | Bin 3210 -> 0 bytes
 doc/images/how-arch.png                         | Bin 62303 -> 0 bytes
 doc/images/how-render.png                       | Bin 42957 -> 0 bytes
 doc/images/snapshot-animation.gif               | Bin 521431 -> 0 bytes
 doc/images/snapshot-calculator.jpg              | Bin 28504 -> 0 bytes
 doc/images/snapshot-helloworld.png              | Bin 6092 -> 0 bytes
 doc/images/snapshot-minesweeper.jpg             | Bin 53257 -> 0 bytes
 doc/images/snapshot-modals.jpg                  | Bin 27458 -> 0 bytes
 doc/images/snapshot-skeletons.gif               | Bin 518271 -> 0 bytes
 doc/images/tut-cli-qrcode.png                   | Bin 45480 -> 0 bytes
 doc/images/tut-first.png                        | Bin 51434 -> 0 bytes
 doc/images/tut-second.png                       | Bin 78519 -> 0 bytes
 doc/images/tut1.jpg                             | Bin 47442 -> 0 bytes
 doc/images/tut2.jpg                             | Bin 52428 -> 0 bytes
 doc/images/tut3.png                             | Bin 52198 -> 0 bytes
 doc/images/tut4.gif                             | Bin 218245 -> 0 bytes
 doc/modules/animation.md                        |  64 --
 doc/modules/clipboard.md                        |  48 -
 doc/modules/dom.md                              | 109 ---
 doc/modules/globalevent.md                      |  76 --
 doc/modules/main.md                             |  13 -
 doc/modules/modal.md                            | 114 ---
 doc/modules/navigator.md                        |  52 --
 doc/modules/storage.md                          | 104 ---
 doc/modules/stream.md                           |  52 --
 doc/modules/timer.md                            |  66 --
 doc/modules/webview.md                          |  62 --
 doc/package.json                                |  27 +
 doc/references/api.md                           |  78 --
 doc/references/bootstrap.md                     |  41 -
 doc/references/cheatsheet.md                    | 102 --
 doc/references/color-names.md                   | 175 ----
 doc/references/common-attrs.md                  |  80 --
 doc/references/common-event.md                  | 121 ---
 doc/references/common-style.md                  | 202 ----
 doc/references/component-defs.md                | 125 ---
 doc/references/events/appear.md                 |  28 -
 doc/references/events/blur.md                   |  42 -
 doc/references/events/change.md                 |  47 -
 doc/references/events/click.md                  |  43 -
 doc/references/events/disappear.md              |  28 -
 doc/references/events/focus.md                  |  42 -
 doc/references/events/input.md                  |  45 -
 doc/references/gesture.md                       |  66 --
 doc/references/main.md                          |   3 -
 doc/references/replace.md                       |  57 --
 doc/references/styles/background-color.md       |  25 -
 doc/references/styles/color.md                  |  26 -
 doc/references/styles/font-family.md            |  27 -
 doc/references/styles/font-size.md              |  31 -
 doc/references/styles/font-style.md             |  25 -
 doc/references/styles/font-weight.md            |  26 -
 doc/references/styles/line-height.md            |  27 -
 doc/references/styles/lines.md                  |  27 -
 doc/references/styles/main.md                   |  42 -
 doc/references/styles/opacity.md                |  22 -
 doc/references/styles/position.md               |  26 -
 doc/references/styles/text-align.md             |  26 -
 doc/references/styles/text-decoration.md        |  26 -
 doc/references/styles/text-overflow.md          |  32 -
 doc/references/styles/units/color.md            |  30 -
 doc/references/styles/units/length.md           |  12 -
 doc/references/styles/units/number.md           |   7 -
 doc/references/styles/units/percentage.md       |   5 -
 doc/references/text-style.md                    |  36 -
 doc/scaffolds/draft.md                          |   4 +
 doc/scaffolds/page.md                           |   4 +
 doc/scaffolds/post.md                           |   5 +
 doc/source/_posts/cn/hello.md                   |   6 +
 doc/source/_posts/hello_world.md                |   6 +
 doc/source/blog/index.md                        |   4 +
 doc/source/cn/blog/index.md                     |   4 +
 doc/source/cn/download.ejs                      |   3 +
 doc/source/cn/faq.md                            | 227 +++++
 doc/source/cn/guide/.gitkeep                    |   0
 doc/source/cn/guide/dev-with-weexpack.md        |  11 +
 doc/source/cn/guide/images/flow.png             | Bin 0 -> 57741 bytes
 doc/source/cn/guide/images/tut-cli-qrcode.png   | Bin 0 -> 45480 bytes
 doc/source/cn/guide/images/tut-first.png        | Bin 0 -> 51434 bytes
 doc/source/cn/guide/images/tut-second.png       | Bin 0 -> 78519 bytes
 doc/source/cn/guide/images/tut1.jpg             | Bin 0 -> 47442 bytes
 doc/source/cn/guide/images/tut2.jpg             | Bin 0 -> 52428 bytes
 doc/source/cn/guide/images/tut3.png             | Bin 0 -> 52198 bytes
 doc/source/cn/guide/images/tut4.gif             | Bin 0 -> 218245 bytes
 doc/source/cn/guide/index.md                    | 125 +++
 doc/source/cn/guide/integrate-to-your-app.md    | 321 +++++++
 doc/source/cn/guide/intro/app-architecture.md   |  77 ++
 doc/source/cn/guide/intro/devtools.md           |  99 ++
 doc/source/cn/guide/intro/how-it-works.md       |  66 ++
 doc/source/cn/guide/intro/index.md              |  15 +
 doc/source/cn/guide/intro/page-architecture.md  |  48 +
 doc/source/cn/guide/intro/using-vue.md          | 101 ++
 doc/source/cn/guide/intro/web-dev-experience.md |  42 +
 doc/source/cn/guide/intro/write-once.md         |  25 +
 doc/source/cn/index.md                          |   4 +
 doc/source/cn/playground.ejs                    |   3 +
 .../cn/references/advanced/extend-jsfm.md       | 172 ++++
 .../cn/references/advanced/extend-to-android.md | 144 +++
 .../cn/references/advanced/extend-to-html5.md   | 103 +++
 .../cn/references/advanced/extend-to-ios.md     | 235 +++++
 doc/source/cn/references/advanced/index.md      |  15 +
 .../advanced/integrate-devtool-to-android.md    | 271 ++++++
 .../advanced/integrate-devtool-to-ios.md        | 229 +++++
 doc/source/cn/references/android-apis.md        | 214 +++++
 doc/source/cn/references/color-names.md         | 180 ++++
 doc/source/cn/references/common-event.md        | 138 +++
 doc/source/cn/references/common-style.md        | 469 ++++++++++
 doc/source/cn/references/components/a.md        | 104 +++
 doc/source/cn/references/components/cell.md     | 105 +++
 doc/source/cn/references/components/div.md      | 116 +++
 doc/source/cn/references/components/image.md    | 161 ++++
 doc/source/cn/references/components/index.md    |  24 +
 .../cn/references/components/indicator.md       | 135 +++
 doc/source/cn/references/components/input.md    | 181 ++++
 doc/source/cn/references/components/list.md     | 158 ++++
 doc/source/cn/references/components/loading.md  | 125 +++
 doc/source/cn/references/components/refresh.md  | 125 +++
 doc/source/cn/references/components/scroller.md | 174 ++++
 doc/source/cn/references/components/slider.md   | 105 +++
 doc/source/cn/references/components/switch.md   | 133 +++
 doc/source/cn/references/components/text.md     | 101 ++
 doc/source/cn/references/components/textarea.md | 162 ++++
 doc/source/cn/references/components/video.md    |  94 ++
 doc/source/cn/references/components/web.md      | 154 ++++
 doc/source/cn/references/gesture.md             |  59 ++
 doc/source/cn/references/html5-apis.md          |  10 +
 doc/source/cn/references/images/Artboard.jpg    | Bin 0 -> 36223 bytes
 .../cn/references/images/coding_weex_1.jpg      | Bin 0 -> 56225 bytes
 .../cn/references/images/css-boxmodel.png       | Bin 0 -> 12581 bytes
 .../cn/references/images/css-flexbox-align.jpg  | Bin 0 -> 35005 bytes
 .../references/images/css-flexbox-justify.svg   |  59 ++
 .../cn/references/images/css-flexbox-sample.png | Bin 0 -> 3210 bytes
 doc/source/cn/references/images/div_1.jpg       | Bin 0 -> 59561 bytes
 doc/source/cn/references/images/div_2.jpg       | Bin 0 -> 62574 bytes
 doc/source/cn/references/images/div_3.jpg       | Bin 0 -> 82345 bytes
 doc/source/cn/references/images/div_4.jpg       | Bin 0 -> 200642 bytes
 doc/source/cn/references/images/image_1.jpg     | Bin 0 -> 163705 bytes
 doc/source/cn/references/images/image_2.jpg     | Bin 0 -> 255560 bytes
 doc/source/cn/references/images/list_2.jpg      | Bin 0 -> 56635 bytes
 doc/source/cn/references/images/list_3.jpg      | Bin 0 -> 128082 bytes
 doc/source/cn/references/images/list_4.jpg      | Bin 0 -> 339799 bytes
 doc/source/cn/references/images/nav.jpg         | Bin 0 -> 124441 bytes
 doc/source/cn/references/images/nav.png         | Bin 0 -> 83497 bytes
 doc/source/cn/references/images/scroller_1.jpg  | Bin 0 -> 344783 bytes
 doc/source/cn/references/images/style_1.jpg     | Bin 0 -> 59366 bytes
 doc/source/cn/references/images/style_2.jpg     | Bin 0 -> 59696 bytes
 doc/source/cn/references/index.md               |  17 +
 doc/source/cn/references/ios-apis.md            |  91 ++
 doc/source/cn/references/jsfm-apis.md           |  66 ++
 .../cn/references/migration/difference.md       | 249 +++++
 doc/source/cn/references/migration/index.md     |  11 +
 .../references/migration/migration-from-weex.md | 116 +++
 doc/source/cn/references/modules/animation.md   |  96 ++
 doc/source/cn/references/modules/clipboard.md   | 101 ++
 doc/source/cn/references/modules/dom.md         | 210 +++++
 doc/source/cn/references/modules/globalevent.md |  88 ++
 doc/source/cn/references/modules/index.md       |  30 +
 doc/source/cn/references/modules/modal.md       | 139 +++
 doc/source/cn/references/modules/navigator.md   |  90 ++
 doc/source/cn/references/modules/picker.md      | 129 +++
 doc/source/cn/references/modules/storage.md     | 184 ++++
 doc/source/cn/references/modules/stream.md      | 124 +++
 doc/source/cn/references/modules/webview.md     | 137 +++
 doc/source/cn/references/native-dom-api.md      | 223 +++++
 doc/source/cn/references/path.md                |  37 +
 doc/source/cn/references/platform-difference.md |  70 ++
 doc/source/cn/references/text-style.md          |  46 +
 doc/source/cn/references/unit.md                |  64 ++
 .../cn/references/vue/difference-of-vuex.md     |  87 ++
 .../cn/references/vue/difference-with-web.md    | 138 +++
 doc/source/cn/references/vue/index.md           |  12 +
 doc/source/cn/references/web-standards.md       | 584 ++++++++++++
 doc/source/cn/references/weex-variable.md       |  47 +
 .../cn/v-0.10/advanced/create-a-weex-project.md | 271 ++++++
 .../advanced/customize-a-native-component.md    | 168 ++++
 .../cn/v-0.10/advanced/cuszomize-native-apis.md |  85 ++
 .../cn/v-0.10/advanced/extend-to-android.md     | 145 +++
 .../cn/v-0.10/advanced/extend-to-html5.md       | 253 +++++
 doc/source/cn/v-0.10/advanced/extend-to-ios.md  | 129 +++
 .../v-0.10/advanced/how-data-binding-works.md   |  39 +
 .../cn/v-0.10/advanced/images/how-arch.png      | Bin 0 -> 62303 bytes
 .../cn/v-0.10/advanced/images/how-render.png    | Bin 0 -> 42957 bytes
 doc/source/cn/v-0.10/advanced/index.md          | 146 +++
 .../advanced/integrate-devtools-to-android.md   | 272 ++++++
 .../advanced/integrate-devtools-to-ios.md       | 230 +++++
 .../cn/v-0.10/advanced/integrate-to-android.md  | 201 ++++
 .../cn/v-0.10/advanced/integrate-to-html5.md    |  69 ++
 .../cn/v-0.10/advanced/integrate-to-ios.md      | 110 +++
 doc/source/cn/v-0.10/blog/index.md              |   4 +
 .../guide/develop-on-your-local-machine.md      | 175 ++++
 .../cn/v-0.10/guide/how-to/debug-with-html5.md  |  47 +
 doc/source/cn/v-0.10/guide/how-to/index.md      | 185 ++++
 .../guide/how-to/require-3rd-party-libs.md      |  57 ++
 .../how-to/transform-code-into-js-bundle.md     | 112 +++
 doc/source/cn/v-0.10/guide/index.md             |  60 ++
 doc/source/cn/v-0.10/guide/syntax/comm.md       | 134 +++
 .../v-0.10/guide/syntax/composed-component.md   | 158 ++++
 .../cn/v-0.10/guide/syntax/config-n-data.md     |  72 ++
 .../cn/v-0.10/guide/syntax/data-binding.md      | 332 +++++++
 .../cn/v-0.10/guide/syntax/display-logic.md     | 252 +++++
 doc/source/cn/v-0.10/guide/syntax/events.md     | 103 +++
 doc/source/cn/v-0.10/guide/syntax/id.md         | 124 +++
 doc/source/cn/v-0.10/guide/syntax/index.md      | 134 +++
 .../cn/v-0.10/guide/syntax/render-logic.md      |  44 +
 .../cn/v-0.10/guide/syntax/style-n-class.md     | 117 +++
 doc/source/cn/v-0.10/index.md                   |   5 +
 doc/source/cn/v-0.10/references/api.md          |  67 ++
 doc/source/cn/v-0.10/references/cheatsheet.md   | 114 +++
 doc/source/cn/v-0.10/references/color-names.md  | 180 ++++
 doc/source/cn/v-0.10/references/common-attrs.md | 166 ++++
 doc/source/cn/v-0.10/references/common-event.md | 492 ++++++++++
 doc/source/cn/v-0.10/references/common-style.md | 322 +++++++
 .../cn/v-0.10/references/component-defs.md      | 126 +++
 doc/source/cn/v-0.10/references/components/a.md | 273 ++++++
 .../cn/v-0.10/references/components/cell.md     | 191 ++++
 .../cn/v-0.10/references/components/div.md      | 245 +++++
 .../cn/v-0.10/references/components/image.md    | 161 ++++
 .../cn/v-0.10/references/components/index.md    |  24 +
 .../v-0.10/references/components/indicator.md   | 124 +++
 .../cn/v-0.10/references/components/input.md    | 143 +++
 .../cn/v-0.10/references/components/list.md     | 375 ++++++++
 .../cn/v-0.10/references/components/loading.md  | 118 +++
 .../cn/v-0.10/references/components/refresh.md  | 204 ++++
 .../cn/v-0.10/references/components/scroller.md | 324 +++++++
 .../cn/v-0.10/references/components/slider.md   | 121 +++
 .../cn/v-0.10/references/components/switch.md   |  98 ++
 .../cn/v-0.10/references/components/text.md     | 116 +++
 .../cn/v-0.10/references/components/textarea.md | 115 +++
 .../cn/v-0.10/references/components/video.md    |  82 ++
 .../cn/v-0.10/references/components/web.md      | 143 +++
 doc/source/cn/v-0.10/references/gesture.md      |  79 ++
 .../cn/v-0.10/references/images/Artboard.jpg    | Bin 0 -> 36223 bytes
 .../v-0.10/references/images/coding_weex_1.jpg  | Bin 0 -> 56225 bytes
 .../v-0.10/references/images/css-boxmodel.png   | Bin 0 -> 12581 bytes
 .../references/images/css-flexbox-align.jpg     | Bin 0 -> 35005 bytes
 .../references/images/css-flexbox-justify.svg   |  59 ++
 .../cn/v-0.10/references/images/div_1.jpg       | Bin 0 -> 59561 bytes
 .../cn/v-0.10/references/images/div_2.jpg       | Bin 0 -> 62574 bytes
 .../cn/v-0.10/references/images/div_3.jpg       | Bin 0 -> 82345 bytes
 .../cn/v-0.10/references/images/div_4.jpg       | Bin 0 -> 200642 bytes
 .../cn/v-0.10/references/images/image_1.jpg     | Bin 0 -> 163705 bytes
 .../cn/v-0.10/references/images/image_2.jpg     | Bin 0 -> 255560 bytes
 .../cn/v-0.10/references/images/list_2.jpg      | Bin 0 -> 56635 bytes
 .../cn/v-0.10/references/images/list_3.jpg      | Bin 0 -> 128082 bytes
 .../cn/v-0.10/references/images/list_4.jpg      | Bin 0 -> 339799 bytes
 doc/source/cn/v-0.10/references/images/nav.jpg  | Bin 0 -> 124441 bytes
 .../cn/v-0.10/references/images/scroller_1.jpg  | Bin 0 -> 344783 bytes
 .../cn/v-0.10/references/images/style_1.jpg     | Bin 0 -> 59366 bytes
 .../cn/v-0.10/references/images/style_2.jpg     | Bin 0 -> 59696 bytes
 doc/source/cn/v-0.10/references/index.md        |  46 +
 .../cn/v-0.10/references/modules/animation.md   |  90 ++
 .../cn/v-0.10/references/modules/clipboard.md   | 112 +++
 doc/source/cn/v-0.10/references/modules/dom.md  |  79 ++
 .../cn/v-0.10/references/modules/globalevent.md |  87 ++
 .../cn/v-0.10/references/modules/index.md       |  20 +
 .../cn/v-0.10/references/modules/modal.md       | 196 ++++
 .../cn/v-0.10/references/modules/navigator.md   | 110 +++
 .../cn/v-0.10/references/modules/storage.md     | 224 +++++
 .../cn/v-0.10/references/modules/stream.md      | 220 +++++
 .../cn/v-0.10/references/modules/webview.md     |  66 ++
 doc/source/cn/v-0.10/references/replace.md      |  57 ++
 .../cn/v-0.10/references/special-element.md     |  38 +
 doc/source/cn/v-0.10/references/specs/index.md  | 309 +++++++
 .../references/specs/js-framework-apis.md       | 190 ++++
 .../v-0.10/references/specs/virtual-dom-apis.md | 148 +++
 doc/source/cn/v-0.10/references/text-style.md   |  40 +
 doc/source/cn/v-0.10/references/units.md        |  66 ++
 doc/source/cn/v-0.10/references/wxc/index.md    |  44 +
 .../cn/v-0.10/references/wxc/wxc-navpage.md     | 192 ++++
 .../cn/v-0.10/references/wxc/wxc-tabbar.md      | 176 ++++
 doc/source/cn/v-0.10/tools/devtools-android.md  | 123 +++
 doc/source/cn/v-0.10/tools/devtools-ios.md      |  65 ++
 doc/source/cn/v-0.10/tools/devtools.md          |  99 ++
 doc/source/cn/v-0.10/tools/index.md             |  96 ++
 doc/source/cn/v-0.10/tools/playground.md        |  22 +
 doc/source/cn/v-0.10/tools/transformer.md       |  38 +
 doc/source/download.ejs                         |   3 +
 doc/source/examples/a.md                        |  39 +
 doc/source/examples/animation.md                |  47 +
 doc/source/examples/clipboard.md                |  64 ++
 doc/source/examples/div.md                      |  27 +
 doc/source/examples/dom-rect.md                 |  67 ++
 doc/source/examples/dom-scroll.md               |  93 ++
 doc/source/examples/image.md                    |  58 ++
 doc/source/examples/indicator.md                |  80 ++
 doc/source/examples/input.md                    |  68 ++
 doc/source/examples/list.md                     |  64 ++
 doc/source/examples/modal.md                    |  81 ++
 doc/source/examples/navigator.md                |  54 ++
 doc/source/examples/refresh.md                  |  74 ++
 doc/source/examples/scroller.md                 |  92 ++
 doc/source/examples/slider.md                   |  53 ++
 doc/source/examples/storage.md                  | 103 +++
 doc/source/examples/stream.md                   |  74 ++
 doc/source/examples/switch.md                   |  69 ++
 doc/source/examples/text.md                     |  44 +
 doc/source/examples/textarea.md                 |  68 ++
 doc/source/examples/video.md                    |  55 ++
 doc/source/examples/web.md                      |  97 ++
 doc/source/faq.md                               | 210 +++++
 doc/source/guide/.gitkeep                       |   0
 doc/source/guide/dev-with-weexpack.md           |  12 +
 doc/source/guide/images/flow.png                | Bin 0 -> 57741 bytes
 doc/source/guide/images/tut-cli-qrcode.png      | Bin 0 -> 45480 bytes
 doc/source/guide/images/tut-first.png           | Bin 0 -> 51434 bytes
 doc/source/guide/images/tut-second.png          | Bin 0 -> 78519 bytes
 doc/source/guide/images/tut1.jpg                | Bin 0 -> 47442 bytes
 doc/source/guide/images/tut2.jpg                | Bin 0 -> 52428 bytes
 doc/source/guide/images/tut3.png                | Bin 0 -> 52198 bytes
 doc/source/guide/images/tut4.gif                | Bin 0 -> 218245 bytes
 doc/source/guide/index.md                       |  11 +
 doc/source/guide/integrate-to-your-app.md       |  11 +
 doc/source/guide/intro/app-architecture.md      |  10 +
 doc/source/guide/intro/devtools.md              | 100 ++
 doc/source/guide/intro/how-it-works.md          |  12 +
 doc/source/guide/intro/index.md                 |  17 +
 doc/source/guide/intro/page-architecture.md     |  10 +
 doc/source/guide/intro/using-vue.md             |  10 +
 doc/source/guide/intro/web-dev-experience.md    |  11 +
 doc/source/guide/intro/write-once.md            |  10 +
 doc/source/index.md                             |   4 +
 doc/source/playground.ejs                       |   3 +
 doc/source/references/advanced/extend-jsfm.md   |  10 +
 .../references/advanced/extend-to-android.md    | 160 ++++
 .../references/advanced/extend-to-html5.md      |  10 +
 doc/source/references/advanced/extend-to-ios.md | 262 ++++++
 doc/source/references/advanced/index.md         |  15 +
 .../advanced/integrate-devtool-to-android.md    |  11 +
 .../advanced/integrate-devtool-to-ios.md        |  10 +
 doc/source/references/android-apis.md           |  10 +
 doc/source/references/color-names.md            | 182 ++++
 doc/source/references/common-event.md           | 129 +++
 doc/source/references/common-style.md           | 367 ++++++++
 doc/source/references/components/a.md           |  71 ++
 doc/source/references/components/cell.md        |  42 +
 doc/source/references/components/div.md         |  64 ++
 doc/source/references/components/image.md       | 107 +++
 doc/source/references/components/index.md       |  24 +
 doc/source/references/components/indicator.md   | 121 +++
 doc/source/references/components/input.md       | 156 ++++
 doc/source/references/components/list.md        | 175 ++++
 doc/source/references/components/refresh.md     | 216 +++++
 doc/source/references/components/scroller.md    | 152 +++
 doc/source/references/components/slider.md      |  93 ++
 doc/source/references/components/switch.md      | 117 +++
 doc/source/references/components/text.md        |  98 ++
 doc/source/references/components/textarea.md    | 142 +++
 doc/source/references/components/video.md       |  89 ++
 doc/source/references/components/web.md         | 149 +++
 doc/source/references/gesture.md                |  53 ++
 doc/source/references/html5-apis.md             |  10 +
 doc/source/references/images/css-boxmodel.png   | Bin 0 -> 12581 bytes
 .../references/images/css-flexbox-align.jpg     | Bin 0 -> 35005 bytes
 .../references/images/css-flexbox-justify.svg   |  59 ++
 .../references/images/css-flexbox-sample.png    | Bin 0 -> 3210 bytes
 doc/source/references/images/nav.png            | Bin 0 -> 83497 bytes
 doc/source/references/index.md                  |  17 +
 doc/source/references/ios-apis.md               |  12 +
 doc/source/references/js-service/index.md       | 114 +++
 doc/source/references/jsfm-apis.md              |  66 ++
 doc/source/references/migration/difference.md   |  10 +
 doc/source/references/migration/index.md        |  11 +
 .../references/migration/migration-from-weex.md |  10 +
 doc/source/references/modules/animation.md      | 106 +++
 doc/source/references/modules/clipboard.md      |  98 ++
 doc/source/references/modules/dom.md            | 204 ++++
 doc/source/references/modules/globalevent.md    |  89 ++
 doc/source/references/modules/index.md          |  29 +
 doc/source/references/modules/modal.md          | 144 +++
 doc/source/references/modules/navigator.md      |  89 ++
 doc/source/references/modules/picker.md         | 129 +++
 doc/source/references/modules/storage.md        | 172 ++++
 doc/source/references/modules/stream.md         | 131 +++
 doc/source/references/modules/webview.md        | 155 ++++
 doc/source/references/native-dom-api.md         |  11 +
 doc/source/references/path.md                   |  37 +
 doc/source/references/text-style.md             |  50 +
 doc/source/references/unit.md                   |  11 +
 doc/source/references/vue/difference-of-vuex.md |  10 +
 .../references/vue/difference-with-web.md       |  10 +
 doc/source/references/vue/index.md              |  11 +
 doc/source/references/web-standards.md          | 584 ++++++++++++
 doc/source/references/weex-variable.md          |  10 +
 doc/source/v-0.10/advanced/extend-to-android.md | 162 ++++
 doc/source/v-0.10/advanced/extend-to-html5.md   | 258 ++++++
 doc/source/v-0.10/advanced/extend-to-ios.md     | 272 ++++++
 .../v-0.10/advanced/how-data-binding-works.md   |  39 +
 doc/source/v-0.10/advanced/images/how-arch.png  | Bin 0 -> 62303 bytes
 .../v-0.10/advanced/images/how-render.png       | Bin 0 -> 42957 bytes
 doc/source/v-0.10/advanced/index.md             | 148 +++
 .../v-0.10/advanced/integrate-to-android.md     | 204 ++++
 .../v-0.10/advanced/integrate-to-html5.md       |  77 ++
 doc/source/v-0.10/advanced/integrate-to-ios.md  | 118 +++
 doc/source/v-0.10/guide/.gitkeep                |   0
 .../how-to/customize-a-native-component.md      |  58 ++
 .../guide/how-to/cuszomize-native-apis.md       |  80 ++
 .../v-0.10/guide/how-to/debug-with-html5.md     |  47 +
 doc/source/v-0.10/guide/how-to/index.md         |  40 +
 .../guide/how-to/preview-in-playground-app.md   |  20 +
 .../guide/how-to/require-3rd-party-libs.md      |  56 ++
 .../how-to/transform-code-into-js-bundle.md     | 110 +++
 .../v-0.10/guide/images/tut-cli-qrcode.png      | Bin 0 -> 45480 bytes
 doc/source/v-0.10/guide/images/tut-first.png    | Bin 0 -> 51434 bytes
 doc/source/v-0.10/guide/images/tut-second.png   | Bin 0 -> 78519 bytes
 doc/source/v-0.10/guide/images/tut1.jpg         | Bin 0 -> 47442 bytes
 doc/source/v-0.10/guide/images/tut2.jpg         | Bin 0 -> 52428 bytes
 doc/source/v-0.10/guide/images/tut3.png         | Bin 0 -> 52198 bytes
 doc/source/v-0.10/guide/images/tut4.gif         | Bin 0 -> 218245 bytes
 doc/source/v-0.10/guide/index.md                | 211 +++++
 doc/source/v-0.10/guide/syntax/comm.md          | 228 +++++
 .../v-0.10/guide/syntax/composed-component.md   | 114 +++
 doc/source/v-0.10/guide/syntax/config-n-data.md |  61 ++
 doc/source/v-0.10/guide/syntax/data-binding.md  | 248 +++++
 doc/source/v-0.10/guide/syntax/display-logic.md | 173 ++++
 doc/source/v-0.10/guide/syntax/events.md        |  59 ++
 doc/source/v-0.10/guide/syntax/id.md            |  65 ++
 doc/source/v-0.10/guide/syntax/index.md         | 122 +++
 doc/source/v-0.10/guide/syntax/render-logic.md  |  35 +
 doc/source/v-0.10/guide/syntax/style-n-class.md | 118 +++
 doc/source/v-0.10/references/api.md             |  84 ++
 doc/source/v-0.10/references/cheatsheet.md      | 102 ++
 doc/source/v-0.10/references/color-names.md     | 182 ++++
 doc/source/v-0.10/references/common-attrs.md    |  78 ++
 doc/source/v-0.10/references/common-event.md    | 120 +++
 doc/source/v-0.10/references/common-style.md    | 208 +++++
 doc/source/v-0.10/references/component-defs.md  | 131 +++
 doc/source/v-0.10/references/components/a.md    |  50 +
 doc/source/v-0.10/references/components/cell.md |  42 +
 doc/source/v-0.10/references/components/div.md  |  48 +
 .../v-0.10/references/components/image.md       |  55 ++
 .../v-0.10/references/components/index.md       |  24 +
 .../v-0.10/references/components/indicator.md   |  98 ++
 .../v-0.10/references/components/input.md       | 124 +++
 doc/source/v-0.10/references/components/list.md | 293 ++++++
 .../references/components/refresh-loading.md    | 298 ++++++
 .../v-0.10/references/components/scroller.md    | 136 +++
 .../v-0.10/references/components/slider.md      | 107 +++
 .../v-0.10/references/components/switch.md      |  81 ++
 doc/source/v-0.10/references/components/text.md |  94 ++
 .../v-0.10/references/components/textarea.md    |  81 ++
 .../v-0.10/references/components/video.md       |  75 ++
 doc/source/v-0.10/references/components/web.md  | 152 +++
 .../v-0.10/references/components/wxc-navpage.md |  74 ++
 .../v-0.10/references/components/wxc-tabbar.md  |  94 ++
 doc/source/v-0.10/references/gesture.md         |  74 ++
 .../v-0.10/references/images/css-boxmodel.png   | Bin 0 -> 12581 bytes
 .../references/images/css-flexbox-align.jpg     | Bin 0 -> 35005 bytes
 .../references/images/css-flexbox-justify.svg   |  59 ++
 .../references/images/css-flexbox-sample.png    | Bin 0 -> 3210 bytes
 doc/source/v-0.10/references/images/nav.png     | Bin 0 -> 83497 bytes
 doc/source/v-0.10/references/index.md           |  49 +
 .../v-0.10/references/modules/animation.md      |  63 ++
 .../v-0.10/references/modules/clipboard.md      |  53 ++
 doc/source/v-0.10/references/modules/dom.md     | 114 +++
 .../v-0.10/references/modules/globalevent.md    |  89 ++
 doc/source/v-0.10/references/modules/index.md   |  28 +
 doc/source/v-0.10/references/modules/modal.md   | 192 ++++
 .../v-0.10/references/modules/navigator.md      | 198 ++++
 doc/source/v-0.10/references/modules/storage.md | 111 +++
 doc/source/v-0.10/references/modules/stream.md  |  86 ++
 doc/source/v-0.10/references/modules/timer.md   |  60 ++
 doc/source/v-0.10/references/modules/webview.md | 160 ++++
 doc/source/v-0.10/references/special-element.md |  36 +
 doc/source/v-0.10/references/specs/index.md     | 309 +++++++
 .../v-0.10/references/specs/js-bundle-format.md | 307 ++++++
 .../references/specs/js-framework-apis.md       | 191 ++++
 .../v-0.10/references/specs/virtual-dom-apis.md | 147 +++
 doc/source/v-0.10/references/text-style.md      |  43 +
 doc/source/v-0.10/tools/devtools-android.md     | 123 +++
 doc/source/v-0.10/tools/devtools-ios.md         |  76 ++
 doc/source/v-0.10/tools/devtools.md             | 102 ++
 doc/source/v-0.10/tools/index.md                |  97 ++
 doc/source/v-0.10/tools/playground.md           |  24 +
 doc/source/v-0.10/tools/transformer.md          |  38 +
 doc/specs/js-bundle-format.md                   | 300 ------
 doc/specs/js-framework-apis.md                  | 184 ----
 doc/specs/virtual-dom-apis.md                   | 140 ---
 doc/syntax/comm.md                              | 222 -----
 doc/syntax/composed-component.md                | 108 ---
 doc/syntax/config-n-data.md                     |  55 --
 doc/syntax/data-binding.md                      | 241 -----
 doc/syntax/display-logic.md                     | 169 ----
 doc/syntax/events.md                            |  54 --
 doc/syntax/id.md                                |  59 --
 doc/syntax/main.md                              | 116 ---
 doc/syntax/render-logic.md                      |  29 -
 doc/syntax/style-n-class.md                     | 106 ---
 doc/themes/weex/_config.yml                     |  42 +
 doc/themes/weex/languages/cn.yml                | 103 +++
 doc/themes/weex/languages/en.yml                | 104 +++
 .../weex/layout/_partial/after-footer.ejs       |   3 +
 .../weex/layout/_partial/archive-post.ejs       |  11 +
 doc/themes/weex/layout/_partial/archive.ejs     |  19 +
 doc/themes/weex/layout/_partial/article.ejs     |  11 +
 doc/themes/weex/layout/_partial/footer.ejs      |  28 +
 doc/themes/weex/layout/_partial/head.ejs        |  36 +
 doc/themes/weex/layout/_partial/header.ejs      |  49 +
 .../weex/layout/_partial/post/category.ejs      |  10 +
 doc/themes/weex/layout/_partial/post/nav.ejs    |   8 +
 .../weex/layout/_partial/post/summary.ejs       |  43 +
 doc/themes/weex/layout/_partial/post/title.ejs  |  18 +
 doc/themes/weex/layout/_partial/search-form.ejs |   8 +
 doc/themes/weex/layout/_partial/sidebar.ejs     |  56 ++
 doc/themes/weex/layout/_partial/slider.ejs      |  17 +
 doc/themes/weex/layout/archive.ejs              |   3 +
 doc/themes/weex/layout/blog.ejs                 |   3 +
 doc/themes/weex/layout/category.ejs             |   1 +
 doc/themes/weex/layout/download.ejs             |  20 +
 doc/themes/weex/layout/example.ejs              |  40 +
 doc/themes/weex/layout/index.ejs                | 211 +++++
 doc/themes/weex/layout/layout.ejs               |  17 +
 doc/themes/weex/layout/page.ejs                 |   6 +
 doc/themes/weex/layout/playground.ejs           |  30 +
 doc/themes/weex/layout/post.ejs                 |   3 +
 doc/themes/weex/layout/tag.ejs                  |   1 +
 doc/themes/weex/scripts/helper.js               |  38 +
 doc/themes/weex/source/css/animation.scss       | 250 +++++
 doc/themes/weex/source/css/atom-one-dark.scss   |  96 ++
 doc/themes/weex/source/css/blog.scss            |  36 +
 doc/themes/weex/source/css/common.scss          | 250 +++++
 doc/themes/weex/source/css/example.scss         | 103 +++
 doc/themes/weex/source/css/index.scss           | 540 +++++++++++
 doc/themes/weex/source/css/media-queries.scss   | 190 ++++
 .../weex/source/css/partial/article-title.scss  |  28 +
 doc/themes/weex/source/css/partial/article.scss |  68 ++
 doc/themes/weex/source/css/partial/footer.scss  |  62 ++
 doc/themes/weex/source/css/partial/header.scss  | 104 +++
 .../weex/source/css/partial/highlight.scss      | 108 +++
 .../weex/source/css/partial/search-form.scss    |  74 ++
 doc/themes/weex/source/css/partial/sidebar.scss |  74 ++
 doc/themes/weex/source/css/partial/summary.scss |  48 +
 doc/themes/weex/source/css/playground.scss      |  50 +
 doc/themes/weex/source/css/post.scss            |  66 ++
 doc/themes/weex/source/css/style.scss           |  28 +
 doc/themes/weex/source/css/swiper.min.css       |  15 +
 doc/themes/weex/source/css/variable.scss        |  40 +
 doc/themes/weex/source/images/_slide1.png       | Bin 0 -> 381001 bytes
 .../weex/source/images/ali-open-source.png      | Bin 0 -> 2193 bytes
 doc/themes/weex/source/images/alibaba.png       | Bin 0 -> 2107 bytes
 doc/themes/weex/source/images/aliyun.png        | Bin 0 -> 1292 bytes
 doc/themes/weex/source/images/android.png       | Bin 0 -> 5973 bytes
 doc/themes/weex/source/images/avatar.png        | Bin 0 -> 32736 bytes
 doc/themes/weex/source/images/cainiao.png       | Bin 0 -> 3353 bytes
 doc/themes/weex/source/images/ding.png          | Bin 0 -> 5929 bytes
 doc/themes/weex/source/images/extendable.svg    |  51 +
 doc/themes/weex/source/images/feature.png       | Bin 0 -> 1090905 bytes
 doc/themes/weex/source/images/feizhu.jpg        | Bin 0 -> 5988 bytes
 doc/themes/weex/source/images/flow.png          | Bin 0 -> 14440 bytes
 doc/themes/weex/source/images/galaxy_1.svg      |  53 ++
 doc/themes/weex/source/images/galaxy_2.svg      |  53 ++
 doc/themes/weex/source/images/ios.png           | Bin 0 -> 6272 bytes
 doc/themes/weex/source/images/level1.png        | Bin 0 -> 14951 bytes
 doc/themes/weex/source/images/level2.png        | Bin 0 -> 101449 bytes
 doc/themes/weex/source/images/level3.png        | Bin 0 -> 101212 bytes
 doc/themes/weex/source/images/level4.png        | Bin 0 -> 339831 bytes
 doc/themes/weex/source/images/lightweight.svg   |  31 +
 doc/themes/weex/source/images/logo.png          | Bin 0 -> 5398 bytes
 doc/themes/weex/source/images/logo.svg          |  29 +
 doc/themes/weex/source/images/performance.svg   |  29 +
 doc/themes/weex/source/images/playground.png    | Bin 0 -> 12659 bytes
 doc/themes/weex/source/images/qr.png            | Bin 0 -> 1801 bytes
 doc/themes/weex/source/images/slide1.png        | Bin 0 -> 226303 bytes
 doc/themes/weex/source/images/taobao.png        | Bin 0 -> 3074 bytes
 doc/themes/weex/source/images/tmall.png         | Bin 0 -> 8562 bytes
 doc/themes/weex/source/images/vue-logo.png      | Bin 0 -> 5346 bytes
 doc/themes/weex/source/images/vue.png           | Bin 0 -> 16582 bytes
 doc/themes/weex/source/images/web.png           | Bin 0 -> 9297 bytes
 doc/themes/weex/source/images/xiami.png         | Bin 0 -> 2615 bytes
 doc/themes/weex/source/images/youku.png         | Bin 0 -> 2178 bytes
 doc/themes/weex/source/js/common.js             | 522 +++++++++++
 doc/themes/weex/source/js/example.js            |  37 +
 doc/themes/weex/source/js/examples/a.web.js     | 528 +++++++++++
 doc/themes/weex/source/js/examples/a.weex.js    | 198 ++++
 .../weex/source/js/examples/animation.web.js    | 569 ++++++++++++
 .../weex/source/js/examples/animation.weex.js   | 224 +++++
 .../weex/source/js/examples/clipboard.web.js    | 583 ++++++++++++
 .../weex/source/js/examples/clipboard.weex.js   | 249 +++++
 doc/themes/weex/source/js/examples/div.web.js   | 523 +++++++++++
 doc/themes/weex/source/js/examples/div.weex.js  | 183 ++++
 .../weex/source/js/examples/dom-rect.web.js     | 589 ++++++++++++
 .../weex/source/js/examples/dom-rect.weex.js    | 254 +++++
 .../weex/source/js/examples/dom-scroll.web.js   | 598 ++++++++++++
 .../weex/source/js/examples/dom-scroll.weex.js  | 288 ++++++
 doc/themes/weex/source/js/examples/image.web.js | 542 +++++++++++
 .../weex/source/js/examples/image.weex.js       | 225 +++++
 .../weex/source/js/examples/indicator.web.js    | 618 +++++++++++++
 .../weex/source/js/examples/indicator.weex.js   | 307 ++++++
 doc/themes/weex/source/js/examples/input.web.js | 586 ++++++++++++
 .../weex/source/js/examples/input.weex.js       | 251 +++++
 doc/themes/weex/source/js/examples/list.web.js  | 584 ++++++++++++
 doc/themes/weex/source/js/examples/list.weex.js | 252 +++++
 doc/themes/weex/source/js/examples/modal.web.js | 604 ++++++++++++
 .../weex/source/js/examples/modal.weex.js       | 272 ++++++
 .../weex/source/js/examples/navigator.web.js    | 562 +++++++++++
 .../weex/source/js/examples/navigator.weex.js   | 230 +++++
 .../weex/source/js/examples/refresh.web.js      | 594 ++++++++++++
 .../weex/source/js/examples/refresh.weex.js     | 267 ++++++
 .../weex/source/js/examples/scroller.web.js     | 598 ++++++++++++
 .../weex/source/js/examples/scroller.weex.js    | 288 ++++++
 .../weex/source/js/examples/slider.web.js       | 587 ++++++++++++
 .../weex/source/js/examples/slider.weex.js      | 255 +++++
 .../weex/source/js/examples/storage.web.js      | 634 +++++++++++++
 .../weex/source/js/examples/storage.weex.js     | 317 +++++++
 .../weex/source/js/examples/stream.web.js       | 590 ++++++++++++
 .../weex/source/js/examples/stream.weex.js      | 259 ++++++
 .../weex/source/js/examples/switch.web.js       | 605 ++++++++++++
 .../weex/source/js/examples/switch.weex.js      | 280 ++++++
 doc/themes/weex/source/js/examples/text.web.js  | 535 +++++++++++
 doc/themes/weex/source/js/examples/text.weex.js | 208 +++++
 .../weex/source/js/examples/textarea.web.js     | 582 ++++++++++++
 .../weex/source/js/examples/textarea.weex.js    | 247 +++++
 doc/themes/weex/source/js/examples/video.web.js | 593 ++++++++++++
 .../weex/source/js/examples/video.weex.js       | 254 +++++
 doc/themes/weex/source/js/examples/web.web.js   | 923 +++++++++++++++++++
 doc/themes/weex/source/js/examples/web.weex.js  | 600 ++++++++++++
 doc/themes/weex/source/js/highlight.pack.js     |   2 +
 doc/themes/weex/source/js/mobile-detect.js      |   3 +
 doc/themes/weex/source/js/qrcode.min.js         |   1 +
 doc/themes/weex/source/js/reqwest.js            |   7 +
 doc/themes/weex/source/js/swiper.min.js         |  18 +
 doc/themes/weex/source/js/velocity.js           |   5 +
 doc/tools/README.md                             |   6 -
 doc/tools/cli.md                                |  90 --
 doc/tools/devtools-android.md                   | 116 ---
 doc/tools/devtools-ios.md                       |  69 --
 doc/tools/devtools.md                           |  94 --
 doc/tools/how-to-debug.md                       |  45 -
 doc/tools/main.md                               |  10 -
 doc/tools/playground-app.md                     |  17 -
 doc/tools/transformer.md                        |  30 -
 doc/tutorial.md                                 | 206 -----
 doc/tutorial_source/tech_list.we                |  22 -
 doc/tutorial_source/tech_list_0.we              |  15 -
 doc/tutorial_source/tech_list_1.we              |  24 -
 doc/tutorial_source/tech_list_2.we              |  62 --
 examples/component/scroller-demo.we             |   2 +-
 examples/module/picker-demo.we                  |   2 +-
 html5/render/browser/base/component/index.js    |  42 +-
 html5/render/browser/base/component/operate.js  |   4 +-
 .../browser/base/component/valueFilter.js       |  18 +-
 html5/render/browser/base/moduleEvent.js        |  41 +
 html5/render/browser/bridge/receiver.js         |  65 +-
 html5/render/browser/dom/appearWatcher.js       | 162 +---
 html5/render/browser/dom/componentManager.js    |  33 +-
 html5/render/browser/extend/api/clipboard.js    |   2 +-
 html5/render/browser/extend/api/dom.js          | 106 ++-
 html5/render/browser/extend/api/globalEvent.js  |   2 +-
 html5/render/browser/extend/api/index.js        |  27 -
 html5/render/browser/extend/api/meta.js         |  26 +
 html5/render/browser/extend/api/stream.js       |  40 +-
 html5/render/browser/extend/api/webSocket.js    | 113 +++
 .../browser/extend/components/image/index.js    |  20 +-
 html5/render/browser/extend/components/index.js |  52 --
 .../extend/components/indicator/index.js        |  23 +-
 .../render/browser/extend/components/marquee.js |  15 +-
 .../browser/extend/components/neighbor/index.js | 638 +++++++++++++
 .../extend/components/neighbor/neighbor.css     |  11 +
 .../components/scrollable/loading/index.js      |   4 +-
 .../components/scrollable/refresh/index.js      |   4 +-
 .../extend/components/scrollable/scrollable.js  |   1 -
 .../browser/extend/components/slider/index.js   |   5 +-
 .../browser/extend/components/switch/index.js   |   8 +-
 html5/render/browser/extend/components/text.js  |   2 +-
 .../browser/extend/components/video/index.js    |  15 +-
 html5/render/browser/render/index.js            |  15 +-
 html5/render/browser/render/register.js         |  23 +
 html5/render/browser/render/style/base.css      |  10 +
 html5/render/browser/utils/frameUpdater.js      |  47 -
 html5/render/browser/utils/index.js             |   3 -
 index.html                                      |   5 +-
 ios/sdk/WeexSDK.xcodeproj/project.pbxproj       |  32 +-
 .../WeexSDK/Sources/Bridge/WXBridgeContext.h    |   4 +-
 .../WeexSDK/Sources/Bridge/WXBridgeContext.m    |   4 +-
 ios/sdk/WeexSDK/Sources/Bridge/WXBridgeMethod.h |  25 +
 ios/sdk/WeexSDK/Sources/Bridge/WXBridgeMethod.m |  87 ++
 .../Sources/Bridge/WXDebugLoggerBridge.m        |   2 +-
 ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.m |   2 +-
 ios/sdk/WeexSDK/Sources/Bridge/WXModuleMethod.m |  12 +-
 .../WeexSDK/Sources/Component/WXCellComponent.m |   6 +-
 .../Sources/Component/WXEmbedComponent.m        |   2 +-
 .../Sources/Component/WXImageComponent.m        |   4 +-
 .../Sources/Component/WXLoadingComponent.m      |   6 +-
 .../Sources/Component/WXRefreshComponent.m      |   6 +-
 .../Sources/Component/WXScrollerComponent.m     |  14 +-
 .../Sources/Component/WXSliderComponent.m       |   6 +-
 .../Component/WXSliderNeighborComponent.m       |   2 +-
 .../Sources/Component/WXTextAreaComponent.m     |   4 +-
 .../WeexSDK/Sources/Component/WXTextComponent.m |   2 +-
 .../Sources/Component/WXTextInputComponent.m    |  15 +-
 .../Sources/Component/WXVideoComponent.m        |   8 +-
 .../Sources/Controller/WXBaseViewController.h   |   4 +-
 .../Sources/Controller/WXBaseViewController.m   |  18 +-
 .../Sources/Controller/WXRootViewController.h   |   4 +-
 .../Sources/Display/WXComponent+Display.m       |  26 +-
 ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.h    |   8 +-
 ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.m    |  10 +-
 ios/sdk/WeexSDK/Sources/Engine/WXSDKError.h     |   4 +-
 .../WeexSDK/Sources/Manager/WXBridgeManager.h   |   9 +-
 .../WeexSDK/Sources/Manager/WXBridgeManager.m   |   4 +-
 .../Sources/Manager/WXComponentFactory.m        |   5 +-
 .../Sources/Manager/WXComponentManager.h        |   2 +-
 .../Sources/Manager/WXComponentManager.m        |  16 +-
 .../Sources/Manager/WXDatePickerManager.m       |   4 +-
 .../WeexSDK/Sources/Manager/WXServiceFactory.h  |   2 +-
 ios/sdk/WeexSDK/Sources/Model/WXBridgeMethod.h  |  25 -
 ios/sdk/WeexSDK/Sources/Model/WXBridgeMethod.m  |  87 --
 ios/sdk/WeexSDK/Sources/Model/WXComponent.h     |   6 +-
 ios/sdk/WeexSDK/Sources/Model/WXComponent.m     |   8 +-
 ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.h   |   2 +-
 ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m   |   2 +-
 ios/sdk/WeexSDK/Sources/Module/WXDomModule.m    |  78 +-
 .../Sources/Module/WXGlobalEventModule.m        |   2 +-
 ios/sdk/WeexSDK/Sources/Module/WXStreamModule.m |  12 +-
 ios/sdk/WeexSDK/Sources/Monitor/WXMonitor.m     |   2 +-
 .../WeexSDK/Sources/Protocol/WXModuleProtocol.h |   2 +-
 .../Sources/Protocol/WXNetworkProtocol.h        |   4 +-
 ios/sdk/WeexSDK/Sources/Utility/WXAssert.h      |   4 +-
 ios/sdk/WeexSDK/Sources/Utility/WXAssert.m      |   2 +-
 ios/sdk/WeexSDK/Sources/Utility/WXConvert.h     |   4 +-
 .../Utility/WXSimulatorShortcutManager.h        |  16 +
 .../Utility/WXSimulatorShortcutManager.m        | 118 +++
 .../Utility/WXSimulatorShortcutMananger.h       |  16 -
 .../Utility/WXSimulatorShortcutMananger.m       | 118 ---
 ios/sdk/WeexSDK/Sources/Utility/WXUtility.h     |  16 +-
 package.json                                    |   6 +-
 794 files changed, 61715 insertions(+), 9868 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/579d27d7/package.json
----------------------------------------------------------------------
diff --cc package.json
index 02cfbe0,642e5f5..7e6e98d
--- a/package.json
+++ b/package.json
@@@ -79,7 -80,8 +80,8 @@@
      "scroll-to": "0.0.2",
      "semver": "^5.1.0",
      "weex-components": "^0.2.0",
+     "weex-picker": "^0.1.0",
 -    "weex-rax-framework": "0.1.0",
 +    "weex-rax-framework": "0.1.7",
      "weex-vue-framework": "2.1.8-weex.1"
    },
    "devDependencies": {


[44/50] [abbrv] incubator-weex git commit: * [doc] Fix typo errors.

Posted by ji...@apache.org.
* [doc] Fix typo errors.


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

Branch: refs/heads/master
Commit: a28979367c59cb42e6aa192bef2d9b18a669b035
Parents: 6289eed
Author: Yun Dong <yu...@gmail.com>
Authored: Fri Feb 17 12:42:55 2017 +0800
Committer: Yun Dong <yu...@gmail.com>
Committed: Fri Feb 17 12:42:55 2017 +0800

----------------------------------------------------------------------
 .../cn/references/advanced/extend-to-android.md | 15 ++--
 .../cn/references/advanced/extend-to-ios.md     | 75 ++++++++++----------
 .../cn/v-0.10/advanced/extend-to-android.md     | 14 ++--
 doc/source/cn/v-0.10/advanced/extend-to-ios.md  | 74 +++++++++----------
 .../references/advanced/extend-to-android.md    | 17 +++--
 doc/source/references/advanced/extend-to-ios.md | 14 ++--
 doc/source/v-0.10/advanced/extend-to-android.md | 64 ++++++++---------
 doc/source/v-0.10/advanced/extend-to-ios.md     | 18 ++---
 8 files changed, 146 insertions(+), 145 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/a2897936/doc/source/cn/references/advanced/extend-to-android.md
----------------------------------------------------------------------
diff --git a/doc/source/cn/references/advanced/extend-to-android.md b/doc/source/cn/references/advanced/extend-to-android.md
index 9575203..343fdce 100644
--- a/doc/source/cn/references/advanced/extend-to-android.md
+++ b/doc/source/cn/references/advanced/extend-to-android.md
@@ -148,21 +148,22 @@ public class ImageAdapter implements IWXImgLoaderAdapter {
  ```java
  @JSMethod
  public void focus(){
- 	//method implementation
+  //method implementation
  }
  ```
+ 
 - \u6ce8\u518c\u7ec4\u4e4b\u540e\uff0c\u4f60\u53ef\u4ee5\u5728weex \u6587\u4ef6\u4e2d\u8c03\u7528
   
   ```html
 	<template>
- 		<mycomponent id='mycomponent'></mycomponent>
+    <mycomponent id='mycomponent'></mycomponent>
 	</template>
 	<script>
-   		module.exports = {
-    		created: function() {
-    			this.$el('mycomponent').focus();
-    		}
-   		}
+    module.exports = {
+      created: function() {
+        this.$el('mycomponent').focus();
+      }
+    }
 	</script>
 	```
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/a2897936/doc/source/cn/references/advanced/extend-to-ios.md
----------------------------------------------------------------------
diff --git a/doc/source/cn/references/advanced/extend-to-ios.md b/doc/source/cn/references/advanced/extend-to-ios.md
index d293487..85f7660 100644
--- a/doc/source/cn/references/advanced/extend-to-ios.md
+++ b/doc/source/cn/references/advanced/extend-to-ios.md
@@ -235,43 +235,44 @@ return [[WXImageView alloc] init];
 ```
 
 ##### component \u65b9\u6cd5
-  WeexSDK 0.9.5 \u4e4b\u540e\u652f\u6301\u4e86\u5728js\u4e2d\u76f4\u63a5\u8c03\u7528component\u7684\u65b9\u6cd5\uff0c\u8fd9\u91cc\u63d0\u4f9b\u4e00\u4e2a\u4f8b\u5b50\uff0c
+
+WeexSDK 0.9.5 \u4e4b\u540e\u652f\u6301\u4e86\u5728 js \u4e2d\u76f4\u63a5\u8c03\u7528 component \u7684\u65b9\u6cd5\uff0c\u8fd9\u91cc\u63d0\u4f9b\u4e00\u4e2a\u4f8b\u5b50
   
-  - \u81ea\u5b9a\u4e49\u4e00\u4e2aWXMyCompoenent \u7684\u7ec4\u4ef6
+- \u81ea\u5b9a\u4e49\u4e00\u4e2a WXMyCompoenent \u7684\u7ec4\u4ef6
   
-	 ```
-	 @implementation WXMyComponent
-	 	WX_EXPORT_METHOD(@selector(focus)) // \u66b4\u9732\u8be5\u65b9\u6cd5\u7ed9js
-	 - (instancetype)initWithRef:(NSString *)ref type:(NSString *)type styles:(NSDictionary *)styles attributes:(NSDictionary *)attributes events:(NSArray *)events weexInstance:(WXSDKInstance *)weexInstance
-	 {
-	     if (self = [super initWithRef:ref type:type styles:styles attributes:attributes events:events weexInstance:weexInstance]) {
-	         // handle your attributes
-	         // handle your styles
-	     }
-	     
-	     return self;
-	 }
-	 
-	 - (void)focus
-	   {
-          NSLog(@"you got it");
-	   }
-	 @end
-	 ```
+  ```
+  @implementation WXMyComponent
+  WX_EXPORT_METHOD(@selector(focus)) // \u66b4\u9732\u8be5\u65b9\u6cd5\u7ed9js
+  - (instancetype)initWithRef:(NSString *)ref type:(NSString *)type styles:(NSDictionary *)styles attributes:(NSDictionary *)attributes events:(NSArray *)events weexInstance:(WXSDKInstance *)weexInstance
+  {
+      if (self = [super initWithRef:ref type:type styles:styles attributes:attributes events:events weexInstance:weexInstance]) {
+          // handle your attributes
+          // handle your styles
+      }
+      
+      return self;
+  }
+
+  - (void)focus
+  {
+      NSLog(@"you got it");
+  }
+  @end
+  ```
 	
-	- \u6ce8\u518c\u7ec4\u4ef6 `[WXSDKEngine registerComponent:@"mycomponent" withClass:[WXMyComponent class]]`
-
-	- \u5728weex \u6587\u4ef6\u4e2d\u8c03\u7528
-
-      ```
-        <template>
-          <mycomponent id='mycomponent'></mycomponent>
-	 	</template>
-		<script>
-          module.exports = {
-            created:function() {
-                      this.$el('mycomponent').focus();
-		    		}
-          }
-		</script>
-      ``` 
+- \u6ce8\u518c\u7ec4\u4ef6 `[WXSDKEngine registerComponent:@"mycomponent" withClass:[WXMyComponent class]]`
+
+- \u5728 weex \u6587\u4ef6\u4e2d\u8c03\u7528
+
+  ```html
+  <template>
+    <mycomponent id='mycomponent'></mycomponent>
+  </template>
+  <script>
+    module.exports = {
+      created:function() {
+        this.$el('mycomponent').focus();
+      }
+    }
+  </script>
+  ``` 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/a2897936/doc/source/cn/v-0.10/advanced/extend-to-android.md
----------------------------------------------------------------------
diff --git a/doc/source/cn/v-0.10/advanced/extend-to-android.md b/doc/source/cn/v-0.10/advanced/extend-to-android.md
index f794f73..f816ebd 100644
--- a/doc/source/cn/v-0.10/advanced/extend-to-android.md
+++ b/doc/source/cn/v-0.10/advanced/extend-to-android.md
@@ -149,21 +149,21 @@ public class ImageAdapter implements IWXImgLoaderAdapter {
  ```java
  @JSMethod
  public void focus(){
- 	//method implementation
+ //method implementation
  }
  ```
 - \u6ce8\u518c\u7ec4\u4e4b\u540e\uff0c\u4f60\u53ef\u4ee5\u5728weex \u6587\u4ef6\u4e2d\u8c03\u7528
   
   ```html
 	<template>
- 		<mycomponent id='mycomponent'></mycomponent>
+    <mycomponent id='mycomponent'></mycomponent>
 	</template>
 	<script>
-   		module.exports = {
-    		created: function() {
-    			this.$el('mycomponent').focus();
-    		}
-   		}
+    module.exports = {
+      created: function() {
+        this.$el('mycomponent').focus();
+      }
+    }
 	</script>
 	```
 	

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/a2897936/doc/source/cn/v-0.10/advanced/extend-to-ios.md
----------------------------------------------------------------------
diff --git a/doc/source/cn/v-0.10/advanced/extend-to-ios.md b/doc/source/cn/v-0.10/advanced/extend-to-ios.md
index 54b855b..b163d62 100644
--- a/doc/source/cn/v-0.10/advanced/extend-to-ios.md
+++ b/doc/source/cn/v-0.10/advanced/extend-to-ios.md
@@ -234,45 +234,45 @@ Weex SDK \u53ea\u63d0\u4f9b\u6e32\u67d3\uff0c\u800c\u4e0d\u662f\u5176\u4ed6\u7684\u80fd\u529b\uff0c\u5982\u679c\u4f60\u9700\u8981 \u50cf\u7f51\u7edc
    <image style="your-custom-style" src="image-remote-source" resize="contain/cover/stretch"></image>
    ```
 ##### component \u65b9\u6cd5
-  WeexSDK 0.9.5 \u4e4b\u540e\u652f\u6301\u4e86\u5728js\u4e2d\u76f4\u63a5\u8c03\u7528component\u7684\u65b9\u6cd5\uff0c\u8fd9\u91cc\u63d0\u4f9b\u4e00\u4e2a\u4f8b\u5b50\uff0c
-  
-  - \u81ea\u5b9a\u4e49\u4e00\u4e2aWXMyCompoenent \u7684\u7ec4\u4ef6
-  
-	 ```
-	 @implementation WXMyComponent
-	 	WX_EXPORT_METHOD(@selector(focus)) // \u66b4\u9732\u8be5\u65b9\u6cd5\u7ed9js
-	 - (instancetype)initWithRef:(NSString *)ref type:(NSString *)type styles:(NSDictionary *)styles attributes:(NSDictionary *)attributes events:(NSArray *)events weexInstance:(WXSDKInstance *)weexInstance
-	 {
-	     if (self = [super initWithRef:ref type:type styles:styles attributes:attributes events:events weexInstance:weexInstance]) {
-	         // handle your attributes
-	         // handle your styles
-	     }
-	     
-	     return self;
-	 }
-	 
-	 - (void)focus
-	   {
-	   		NSLog(@"you got it");
-	   }
-	 @end
-	 ```
+WeexSDK 0.9.5 \u4e4b\u540e\u652f\u6301\u4e86\u5728js\u4e2d\u76f4\u63a5\u8c03\u7528component\u7684\u65b9\u6cd5\uff0c\u8fd9\u91cc\u63d0\u4f9b\u4e00\u4e2a\u4f8b\u5b50\uff0c
+
+- \u81ea\u5b9a\u4e49\u4e00\u4e2aWXMyCompoenent \u7684\u7ec4\u4ef6
+
+    ```
+    @implementation WXMyComponent
+    WX_EXPORT_METHOD(@selector(focus)) // \u66b4\u9732\u8be5\u65b9\u6cd5\u7ed9js
+    - (instancetype)initWithRef:(NSString *)ref type:(NSString *)type styles:(NSDictionary *)styles attributes:(NSDictionary *)attributes events:(NSArray *)events weexInstance:(WXSDKInstance *)weexInstance
+    {
+        if (self = [super initWithRef:ref type:type styles:styles attributes:attributes events:events weexInstance:weexInstance]) {
+            // handle your attributes
+            // handle your styles
+        }
+        
+        return self;
+    }
+    
+    - (void)focus
+    {
+        NSLog(@"you got it");
+    }
+    @end
+    ```
 	
-	- \u6ce8\u518c\u7ec4\u4ef6 `[WXSDKEngine registerComponent:@"mycomponent" withClass:[WXMyComponent class]] `
-	- \u5728weex \u6587\u4ef6\u4e2d\u8c03\u7528
+- \u6ce8\u518c\u7ec4\u4ef6 `[WXSDKEngine registerComponent:@"mycomponent" withClass:[WXMyComponent class]] `
+- \u5728weex \u6587\u4ef6\u4e2d\u8c03\u7528
 
-		```
-		<template>
-	     		<mycomponent id='mycomponent'></mycomponent>
-	 	</template>
-		<script>
-		   module.exports = {
-		    	created: function() {
-		    		this.$el('mycomponent').focus();
-		    		}
-		   }
-		</script>
- 		``` 
+  ```html
+  <template>
+    <mycomponent id='mycomponent'></mycomponent>
+  </template>
+  <script>
+    module.exports = {
+      created: function() {
+        this.$el('mycomponent').focus();
+      }
+    }
+  </script>
+  ``` 
  
  
  

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/a2897936/doc/source/references/advanced/extend-to-android.md
----------------------------------------------------------------------
diff --git a/doc/source/references/advanced/extend-to-android.md b/doc/source/references/advanced/extend-to-android.md
index e382372..3d5a8ae 100644
--- a/doc/source/references/advanced/extend-to-android.md
+++ b/doc/source/references/advanced/extend-to-android.md
@@ -165,24 +165,23 @@ public class ImageAdapter implements IWXImgLoaderAdapter {
  for example, define a method in component:
  
  ```java
- 
  @JSMethod
  public void focus(){
- 	//method implementation
+  //method implementation
  }
- 
  ```
+
  after your registration for your own custom component, now you can call it in your js file.
  
  ```html
 <template>
- 		<mycomponent id='mycomponent'></mycomponent>
+  <mycomponent id='mycomponent'></mycomponent>
 </template>
 <script>
-   module.exports = {
-    	created: function() {
-    		this.$el('mycomponent').focus();
-    		}
-   }
+  module.exports = {
+    created: function() {
+      this.$el('mycomponent').focus();
+    }
+  }
 </script>
 ``` 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/a2897936/doc/source/references/advanced/extend-to-ios.md
----------------------------------------------------------------------
diff --git a/doc/source/references/advanced/extend-to-ios.md b/doc/source/references/advanced/extend-to-ios.md
index 133e784..398e0d8 100644
--- a/doc/source/references/advanced/extend-to-ios.md
+++ b/doc/source/references/advanced/extend-to-ios.md
@@ -288,15 +288,15 @@ for example:
    
 after your registration for your own custom component, now you can call it in your js file.
  
-```
+```html
 <template>
- 		<mycomponent id='mycomponent'></mycomponent>
+  <mycomponent id='mycomponent'></mycomponent>
 </template>
 <script>
-   module.exports = {
-    	created: function() {
-    		this.$el('mycomponent').focus();
-    		}
-   }
+  module.exports = {
+    created: function() {
+      this.$el('mycomponent').focus();
+    }
+  }
 </script>
 ``` 
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/a2897936/doc/source/v-0.10/advanced/extend-to-android.md
----------------------------------------------------------------------
diff --git a/doc/source/v-0.10/advanced/extend-to-android.md b/doc/source/v-0.10/advanced/extend-to-android.md
index 4816578..97bb49e 100644
--- a/doc/source/v-0.10/advanced/extend-to-android.md
+++ b/doc/source/v-0.10/advanced/extend-to-android.md
@@ -95,19 +95,19 @@ public class MyViewComponent extends WXComponent{
   public MyViewComponent(WXSDKInstance instance, WXDomObject dom,
                      WXVContainer parent, String instanceId, boolean isLazy)
    {
-	   public MyViewComponent(WXSDKInstance instance, WXDomObject dom,
-	     WXVContainer parent, String instanceId, boolean isLazy) {
-	    super(instance, dom, parent, instanceId, isLazy);
-	   }
-
-	   @Override
-	   protected void initView() {
-	      mHost = new TextView(mContext);
-	   }
-	   @WXComponentProp(name=WXDomPropConstant.WX_ATTR_VALUE)
-	   public void setMyViewValue(String value) {
-	      ((TextView)mHost).setText(value);
-	   }
+     public MyViewComponent(WXSDKInstance instance, WXDomObject dom,
+       WXVContainer parent, String instanceId, boolean isLazy) {
+      super(instance, dom, parent, instanceId, isLazy);
+     }
+
+     @Override
+     protected void initView() {
+        mHost = new TextView(mContext);
+     }
+     @WXComponentProp(name=WXDomPropConstant.WX_ATTR_VALUE)
+     public void setMyViewValue(String value) {
+        ((TextView)mHost).setText(value);
+     }
 }
 ```
 
@@ -160,30 +160,30 @@ public class ImageAdapter implements IWXImgLoaderAdapter {
   }
 }
 ```
+
 #### Component Method
- from WeexSDK `0.9.5`, you can define your component method
+from WeexSDK `0.9.5`, you can define your component method
 
- for example, define a method in component:
- 
- ```java
- 
- @JSMethod
- public void focus(){
- 	//method implementation
- }
- 
- ```
- after your registration for your own custom component, now you can call it in your js file.
+for example, define a method in component:
+
+```java
+@JSMethod
+public void focus(){
+//method implementation
+}
+```
+
+after your registration for your own custom component, now you can call it in your js file.
  
- ```html
+```html
 <template>
- 		<mycomponent id='mycomponent'></mycomponent>
+  <mycomponent id='mycomponent'></mycomponent>
 </template>
 <script>
-   module.exports = {
-    	created: function() {
-    		this.$el('mycomponent').focus();
-    		}
-   }
+  module.exports = {
+    created: function() {
+      this.$el('mycomponent').focus();
+    }
+  }
 </script>
 ``` 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/a2897936/doc/source/v-0.10/advanced/extend-to-ios.md
----------------------------------------------------------------------
diff --git a/doc/source/v-0.10/advanced/extend-to-ios.md b/doc/source/v-0.10/advanced/extend-to-ios.md
index cfc69cd..bddb96e 100644
--- a/doc/source/v-0.10/advanced/extend-to-ios.md
+++ b/doc/source/v-0.10/advanced/extend-to-ios.md
@@ -281,23 +281,23 @@ for example:
  
  - (void)focus
    {
-   		NSLog(@"you got it");
+      NSLog(@"you got it");
    }
 @end
 ```
    
- after your registration for your own custom component, now you can call it in your js file.
+after your registration for your own custom component, now you can call it in your js file.
  
-```
+```html
 <template>
- 		<mycomponent id='mycomponent'></mycomponent>
+  <mycomponent id='mycomponent'></mycomponent>
 </template>
 <script>
-   module.exports = {
-    	created: function() {
-    		this.$el('mycomponent').focus();
-    		}
-   }
+  module.exports = {
+    created: function() {
+      this.$el('mycomponent').focus();
+    }
+  }
 </script>
 ``` 
 


[07/50] [abbrv] incubator-weex git commit: * [doc] update js-service doc

Posted by ji...@apache.org.
* [doc] update js-service doc

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

Branch: refs/heads/master
Commit: e6409220e88b7d32ade74f62a8960da448c5dc85
Parents: e687713
Author: Yun Dong <yu...@gmail.com>
Authored: Thu Feb 16 10:59:50 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Thu Feb 16 10:59:50 2017 +0800

----------------------------------------------------------------------
 doc/source/references/js-service/index.md | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/e6409220/doc/source/references/js-service/index.md
----------------------------------------------------------------------
diff --git a/doc/source/references/js-service/index.md b/doc/source/references/js-service/index.md
index 1accdd7..9414452 100644
--- a/doc/source/references/js-service/index.md
+++ b/doc/source/references/js-service/index.md
@@ -8,6 +8,8 @@ version: 2.1
 
 # JS Service
 
+<span class="weex-version">v0.9.5+</span>
+
 JS service and Weex instance are parallel in js runtime. Weex instance lifecycle will invoke JS service lifecycle. Currently provide create, refresh, destroy of lifecycle.
 
 !!!Important: JS Service is very powerful. Please be careful to use.
@@ -96,7 +98,7 @@ service.register(options.serviceName, {
 ```
 
 ## Using JS Service (vuejs)
-```
+```html
 <script>
 var _InstanceService = new InstanceService(weex)
 var _NormalService = new service.normalService(weex)


[17/50] [abbrv] incubator-weex git commit: V0.10.0 stable gitlab (#178)

Posted by ji...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/include/tabbar.vue
----------------------------------------------------------------------
diff --git a/examples/vue/include/tabbar.vue b/examples/vue/include/tabbar.vue
new file mode 100644
index 0000000..fbaa29f
--- /dev/null
+++ b/examples/vue/include/tabbar.vue
@@ -0,0 +1,92 @@
+<template>
+  <div class="wrapper">
+    <embed
+      v-for="item in tabItems"
+      :src="item.src"
+      type="weex"
+      :style="{ visibility: item.visibility }"
+      class="content"
+      ></embed>
+    <div class="tabbar" append="tree">
+      <tabitem
+        v-for="item in tabItems"
+        :index="item.index"
+        :icon="item.icon"
+        :title="item.title"
+        :titleColor="item.titleColor"
+        @tabItemOnClick="tabItemOnClick"
+        ></tabItem>
+    </div>
+  </div>
+</template>
+
+<style>
+  .wrapper {
+    width: 750;
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+  }
+  .content {
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    margin-top: 0;
+    margin-bottom: 88;
+  }
+  .tabbar {
+    flex-direction: row;
+    position: fixed;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    height: 88;
+  }
+</style>
+
+<script>
+  module.exports = {
+    props: {
+      tabItems: { default: [] },
+      selectedColor: { default: '#ff0000' },
+      unselectedColor: { default: '#000000' }
+    },
+    data: function () {
+      return {
+        selectedIndex: 0
+      }
+    },
+    components: {
+      tabitem: require('./tabitem.vue')
+    },
+    created: function () {
+      this.select(this.selectedIndex);
+    },
+    methods: {
+      tabItemOnClick: function (e) {
+        this.selectedIndex = e.index;
+        this.select(e.index);
+        this.$emit('tabBarOnClick', e);
+      },
+      select: function(index) {
+        for(var i = 0; i < this.tabItems.length; i++) {
+          var tabItem = this.tabItems[i];
+          if(i == index){
+            tabItem.icon = tabItem.selectedImage;
+            tabItem.titleColor = this.selectedColor;
+            tabItem.visibility = 'visible';
+          }
+          else {
+            tabItem.icon = tabItem.image;
+            tabItem.titleColor = this.unselectedColor;
+            tabItem.visibility = 'hidden';
+          }
+        }
+      },
+    }
+  }
+</script>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/include/tabitem.vue
----------------------------------------------------------------------
diff --git a/examples/vue/include/tabitem.vue b/examples/vue/include/tabitem.vue
new file mode 100644
index 0000000..ee41ced
--- /dev/null
+++ b/examples/vue/include/tabitem.vue
@@ -0,0 +1,63 @@
+<template>
+  <div
+    :style="{ backgroundColor: backgroundColor }"
+    class="container"
+    @click="onclickitem">
+    <image
+      src="http://gtms03.alicdn.com/tps/i3/TB1mdsiMpXXXXXpXXXXNw4JIXXX-640-4.png"
+      class="top-line"></image>
+    <image
+      :src="icon"
+      class="tab-icon"></image>
+    <text
+      :style="{ color: titleColor }"
+      class="tab-text">{{title}}</text>
+  </div>  
+</template>
+
+<style>
+  .container {
+    flex: 1; 
+    flex-direction: column; 
+    align-items:center; 
+    justify-content:center; 
+    height: 88;
+  }
+  .top-line {
+    position: absolute; 
+    top: 0; 
+    left: 0; 
+    right: 0; 
+    height: 2;
+  }
+  .tab-icon {
+    margin-top: 5; 
+    width: 40; 
+    height: 40
+  }
+  .tab-text {
+    margin-top: 5; 
+    text-align: center;  
+    font-size: 20;
+  }
+</style>
+
+<script>
+  module.exports = {
+    props: {
+      index: { default: 0 },
+      title: { default: '' },
+      titleColor: { default: '#000000' },
+      icon: { default: '' },
+      backgroundColor: { default: '#ffffff' }
+    },
+    methods: {
+      onclickitem: function (e) {
+        var params = {
+          index: this.index
+        };
+        this.$emit('tabItemOnClick', params);
+      }
+    }
+  }
+</script>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/include/tip.vue
----------------------------------------------------------------------
diff --git a/examples/vue/include/tip.vue b/examples/vue/include/tip.vue
new file mode 100644
index 0000000..11f74b4
--- /dev/null
+++ b/examples/vue/include/tip.vue
@@ -0,0 +1,65 @@
+<!-- Inspired by bootstrap http://getbootstrap.com/ -->
+<template>
+  <div :class="['tip', 'tip-' + type]">
+    <text :class="['tip-txt', 'tip-txt-' + type]">{{value}}</text>
+  </div>
+</template>
+
+<script>
+  module.exports = {
+    props: {
+      type: { default: 'success' },
+      value: { default: '' }
+    }
+  }
+</script>
+
+<style>
+  .tip {
+    padding-left: 36px;
+    padding-right: 36px;
+    padding-top: 36px;
+    padding-bottom: 36px;
+    border-radius: 10px;
+  }
+
+  .tip-txt{
+    font-size: 28px;
+  }
+
+  .tip-success {
+    background-color: #dff0d8;
+    border-color: #d6e9c6;
+  }
+
+  .tip-txt-success {
+    color: #3c763d;
+  }
+
+  .tip-info {
+    background-color: #d9edf7;
+    border-color: #bce8f1;
+  }
+
+  .tip-txt-info {
+    color: #31708f;
+  }
+
+  .tip-warning {
+    background-color: #fcf8e3;
+    border-color: #faebcc;
+  }
+
+  .tip-txt-warning {
+    color: #8a6d3b;
+  }
+
+  .tip-danger {
+    background-color: #f2dede;
+    border-color: #ebccd1;
+  }
+
+  .tip-txt-danger {
+    color: #a94442;
+  }
+</style>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/index.vue
----------------------------------------------------------------------
diff --git a/examples/vue/index.vue b/examples/vue/index.vue
index 94498c5..413565d 100644
--- a/examples/vue/index.vue
+++ b/examples/vue/index.vue
@@ -4,43 +4,45 @@
 
 <script>
   module.exports = {
-    data: {
-      items: [
-        // common
-        {name: 'vue/syntax/hello-world', title: 'Hello World'},
-        {name: 'vue/style/index', title: 'Common Style'},
-        {name: 'vue/animation', title: 'Animation'},
+    data: function () {
+      return {
+        items: [
+          // common
+          {name: 'vue/syntax/hello-world', title: 'Hello World'},
+          {name: 'vue/style/index', title: 'Common Style'},
+          {name: 'vue/animation', title: 'Animation'},
 
-        // component
-        {name: 'vue/components/text', title: 'Text'},
-        {name: 'vue/components/image', title: 'Image'},
-        {name: 'vue/components/input', title: 'Input'},
-        {name: 'vue/components/scroller', title: 'Scroller'},
-        {name: 'vue/components/list', title: 'List'},
-        {name: 'vue/components/slider', title: 'Slider'},
-        {name: 'vue/components/a', title: 'A'},
-        {name: 'vue/components/video', title: 'Video'},
-        {name: 'vue/components/countdown', title: 'Countdown'},
-        {name: 'vue/components/marquee', title: 'Marquee'},
-        {name: 'vue/components/web', title: 'Web'},
-        {name: 'vue/components/navigator', title: 'Navigator'},
-        {name: 'vue/components/tabbar', title: 'Tabbar'},
+          // component
+          {name: 'vue/components/text', title: 'Text'},
+          {name: 'vue/components/image', title: 'Image'},
+          {name: 'vue/components/input', title: 'Input'},
+          {name: 'vue/components/scroller', title: 'Scroller'},
+          {name: 'vue/components/list', title: 'List'},
+          {name: 'vue/components/slider', title: 'Slider'},
+          {name: 'vue/components/a', title: 'A'},
+          {name: 'vue/components/video', title: 'Video'},
+          {name: 'vue/components/countdown', title: 'Countdown'},
+          {name: 'vue/components/marquee', title: 'Marquee'},
+          {name: 'vue/components/web', title: 'Web'},
+          {name: 'vue/components/navigator', title: 'Navigator'},
+          {name: 'vue/components/tabbar', title: 'Tabbar'},
 
-        // module
-        {name: 'vue/modules/instance-api', title: 'Instance API'},
-        {name: 'vue/modules/modal', title: 'Modal'},
-        {name: 'vue/modules/stream', title: 'Stream'},
-        {name: 'vue/modules/storage',title:'Storage'},
-        // {name: 'module/clipboard', title: 'Clipboard'}, // 0.8 , developing
+          // module
+          {name: 'vue/modules/instance-api', title: 'Instance API'},
+          {name: 'vue/modules/modal', title: 'Modal'},
+          {name: 'vue/modules/stream', title: 'Stream'},
+          {name: 'vue/modules/storage',title:'Storage'},
+          // {name: 'module/clipboard', title: 'Clipboard'}, // 0.8 , developing
 
-        // showcase
-        {name: 'vue/showcase/progress', title: 'Progress Bar'},
-        {name: 'vue/showcase/itemlist', title: 'List (Advanced)'},
-        {name: 'vue/showcase/calculator', title: 'Calculator'},
-        // {name: 'vue/showcase/minesweeper', title: 'Minesweeper'},
-        // {name: 'vue/showcase/ui', title: 'UI Gallery'},
-        // {name: 'vue/showcase/dropdown/dropdown-demo', title: 'Dropdown'}
-      ]
+          // showcase
+          {name: 'vue/showcase/progress', title: 'Progress Bar'},
+          {name: 'vue/showcase/itemlist', title: 'List (Advanced)'},
+          {name: 'vue/showcase/calculator', title: 'Calculator'},
+          // {name: 'vue/showcase/minesweeper', title: 'Minesweeper'},
+          // {name: 'vue/showcase/ui', title: 'UI Gallery'},
+          // {name: 'vue/showcase/dropdown/dropdown-demo', title: 'Dropdown'}
+        ]
+      }
     },
     components: {
       exampleList: require('./include/example-list.vue')

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/modules/clipboard.vue
----------------------------------------------------------------------
diff --git a/examples/vue/modules/clipboard.vue b/examples/vue/modules/clipboard.vue
index 94f17f8..014bb7a 100644
--- a/examples/vue/modules/clipboard.vue
+++ b/examples/vue/modules/clipboard.vue
@@ -3,12 +3,12 @@
     <panel title="Clipboard" type="primary">
       <panel title="Copy to clipboard5">
         <text style="line-height: 40px; font-size: 28px">{{textToCopy}}</text>
-        <button type="info" size="middle" value="Copy" @click="doCopy"></button>
+        <button type="info" size="middle" value="Copy" @click.native="doCopy"></button>
       </panel>
 
       <panel title="Paste from clipboard">
         <text style="line-height: 40px; font-size: 28px">{{textFromPaste}}</text>
-        <button type="info" size="middle" value="Paste" @click="doPaste"></button>
+        <button type="info" size="middle" value="Paste" @click.native="doPaste"></button>
       </panel>
 
       <panel title="Result">
@@ -23,31 +23,32 @@
   var modal = require('@weex-module/modal')
   var clipboard = require('@weex-module/clipboard')
   module.exports = {
-    data: {
-      textToCopy : '',
-      textFromPaste: '',
-      tips : '',
+    data: function () {
+      return {
+        textToCopy : '',
+        textFromPaste: '',
+        tips : ''
+      }
     },
     components: {
-      panel: require('weex-vue-components/panel.vue'),
-      tip: require('weex-vue-components/tip.vue'),
-      button: require('weex-vue-components/button.vue')
+      panel: require('../include/panel.vue'),
+      tip: require('../include/tip.vue'),
+      button: require('../include/button.vue')
     },
-    ready : function() {
+    mounted: function() {
       this.tips = "1. Just click COPY button. It will auto generate a string with random text, and copy to system clipboard. \n 2. do copy in another app, then come back and click PASTE button."
     },
     methods: {
-      clicked: function() {
-        modal.toast({'message': 'clicked!', duration: 0.5})
-      },
       doCopy: function() {
+        modal.toast({'message': 'doCopy!', duration: 0.5})
         textToCopy = "autoGenerateTextToCopy" + Math.random()
         clipboard.setString(textToCopy)
         this.textToCopy = textToCopy
-        this.tips = "copy done. Now system clipboard has string of '" + textToCopy + "', try PASTE button, or paste in another app." 
+        this.tips = "copy done. Now system clipboard has string of '" + textToCopy + "', try PASTE button, or paste in another app."
       },
       doPaste: function() {
         var me = this
+        modal.toast({'message': 'doPaste!', duration: 0.5})
         clipboard.getString(function(ret) {
           console.log("paste result is " + JSON.stringify(ret))
           me.textFromPaste = ret.data

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/modules/instance-api.vue
----------------------------------------------------------------------
diff --git a/examples/vue/modules/instance-api.vue b/examples/vue/modules/instance-api.vue
index b605841..d5dbf51 100644
--- a/examples/vue/modules/instance-api.vue
+++ b/examples/vue/modules/instance-api.vue
@@ -8,11 +8,13 @@
 
 <script>
   module.exports = {
-    data: {
-      config: ''
+    data: function () {
+      return {
+        config: ''
+      }
     },
     components: {
-      panel: require('weex-vue-components/panel.vue')
+      panel: require('../include/panel.vue')
     },
     created: function() {
       var config = this.$getConfig();

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/modules/modal.vue
----------------------------------------------------------------------
diff --git a/examples/vue/modules/modal.vue b/examples/vue/modules/modal.vue
index 2369757..7552a7b 100644
--- a/examples/vue/modules/modal.vue
+++ b/examples/vue/modules/modal.vue
@@ -15,10 +15,12 @@
 <script>
   var modal = require('@weex-module/modal')
   module.exports = {
-    data: {},
+    data: function () {
+      return {}
+    },
     components: {
-      panel: require('weex-vue-components/panel.vue'),
-      button: require('weex-vue-components/button.vue')
+      panel: require('../include/panel.vue'),
+      button: require('../include/button.vue')
     },
     methods: {
       toast: function(msg, duration) {
@@ -54,7 +56,7 @@
           'okTitle': okTitle,
           'cancelTitle': cancelTitle
         }, function(result) {
-          modal.toast({ message: "Click Confirm  " + result })
+          modal.toast({ message: "Click Confirm  " + JSON.stringify(result) })
         })
       },
       prompt: function() {
@@ -63,7 +65,7 @@
           'okTitle': 'ok',
           'cancelTitle': 'cancel'
         }, function(result) {
-          modal.toast({ message: "Click Prompt  " + result })
+          modal.toast({ message: "Click Prompt  " + JSON.stringify(result) })
         })
       }
     }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/modules/storage.vue
----------------------------------------------------------------------
diff --git a/examples/vue/modules/storage.vue b/examples/vue/modules/storage.vue
index 22b39b7..0ca10fb 100644
--- a/examples/vue/modules/storage.vue
+++ b/examples/vue/modules/storage.vue
@@ -24,15 +24,17 @@
 <script>
   var storage = require('@weex-module/storage')
   module.exports = {
-    data: {
-      setItemResult:'loading',
-      getItemResult:'loading',
-      removeItemResult:'loading',
-      lengthResult:'loading',
-      getAllKeysResult:'loading'
+    data: function () {
+      return {
+        setItemResult:'loading',
+        getItemResult:'loading',
+        removeItemResult:'loading',
+        lengthResult:'loading',
+        getAllKeysResult:'loading'
+      }
     },
     components: {
-      panel: require('weex-vue-components/panel.vue')
+      panel: require('../include/panel.vue')
     },
     created: function() {
       var me = this

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/modules/stream.vue
----------------------------------------------------------------------
diff --git a/examples/vue/modules/stream.vue b/examples/vue/modules/stream.vue
index 6ede1c9..575aaff 100644
--- a/examples/vue/modules/stream.vue
+++ b/examples/vue/modules/stream.vue
@@ -29,17 +29,19 @@
 <script>
   var stream = require('@weex-module/stream');
   module.exports = {
-    data: {
-      getJsonpResult: 'loading...',
-      getResult: 'loading...',
-      postResult: 'loading...',
-      putResult: 'loading...',
-      deleteResult: 'loading...',
-      headResult: 'loading...',
-      patchResult: 'loading...',
+    data: function () {
+      return {
+        getJsonpResult: 'loading...',
+        getResult: 'loading...',
+        postResult: 'loading...',
+        putResult: 'loading...',
+        deleteResult: 'loading...',
+        headResult: 'loading...',
+        patchResult: 'loading...'
+      }
     },
     components: {
-      panel: require('weex-vue-components/panel.vue')
+      panel: require('../include/panel.vue')
     },
     created: function() {
       var me = this;
@@ -50,7 +52,7 @@
       var DELETE_URL = 'http://httpbin.org/delete';
       var HEAD_URL = 'http://httpbin.org/status/418';
       var PATCH_URL = 'http://httpbin.org/patch';
-      
+
       stream.fetch({
         method: 'GET',
         url: GET_URL_JSONP,
@@ -131,7 +133,7 @@
         console.log('get in progress:'+response.length);
         me.deleteResult = "bytes received:"+response.length;
       });
-      
+
       stream.fetch({
         method: 'HEAD',
         url: HEAD_URL,

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/showcase/calculator.vue
----------------------------------------------------------------------
diff --git a/examples/vue/showcase/calculator.vue b/examples/vue/showcase/calculator.vue
index 8f8868b..f0cabc1 100644
--- a/examples/vue/showcase/calculator.vue
+++ b/examples/vue/showcase/calculator.vue
@@ -62,13 +62,17 @@
 
 <script>
   var OP = ['+', '-', '*', '/'];
+  var modal = require('@weex-module/modal')
   module.exports = {
-    data: {
-      result: '',
-      inputs: []
+    data: function () {
+      return {
+        result: '',
+        inputs: []
+      }
     },
     methods: {
       input: function(e) {
+        modal.toast({ message: 'input: ' + e.target.attr.value, duration: 1 })
         var value = e.target.attr['value'];
         var inputs = this.inputs;
         var lastOne = inputs.length ? inputs[inputs.length - 1] : '';

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/showcase/itemlist.vue
----------------------------------------------------------------------
diff --git a/examples/vue/showcase/itemlist.vue b/examples/vue/showcase/itemlist.vue
index 28fe542..fc7a1a4 100644
--- a/examples/vue/showcase/itemlist.vue
+++ b/examples/vue/showcase/itemlist.vue
@@ -219,308 +219,310 @@
 <script>
   var modal = require('@weex-module/modal')
   module.exports = {
-    data: {
-      shopList: [
-        {
-          id: 1,
-          scopeValue: 1,
-          PersonPhoto: 'https://gw.alicdn.com/tps/i3/TB1yeWeIFXXXXX5XFXXuAZJYXXX-210-210.png_60x60.jpg',
-          PersonName: 'Mendeleyev',
-          PersonVisitTime: 'today',
-          shopDesc: 'Genius only means hard-working all one\'s life',
-          shopImgList: [{
-            shopImgWidth: 220,
-            shopImgHeight: 220,
-            shopImg: 'https://gd2.alicdn.com/bao/uploaded/i2/TB1rtOnHpXXXXXLaXXXXXXXXXXX_!!0-item_pic.jpg_220x220.jpg'
-          }, {
-            shopImgWidth: 220,
-            shopImgHeight: 220,
-            shopImg: 'https://gd4.alicdn.com/bao/uploaded/i4/TB15KrfFVXXXXXJXXXXXXXXXXXX_!!0-item_pic.jpg_220x220.jpg'
-          }, {
-            shopImgWidth: 220,
-            shopImgHeight: 220,
-            shopImg: 'https://gd2.alicdn.com/bao/uploaded/i2/TB1t5YBGVXXXXXcaXXXXXXXXXXX_!!0-item_pic.jpg_220x220.jpg'
-          }],
-          shopLikeImg: 'https://img.alicdn.com/tps/i1/TB1jTxXIVXXXXb8XXXX07tlTXXX-200-200.png_88x88xz.jpg',
-          shopLikeText: '6',
-          shopCommentImg: 'https://img.alicdn.com/tps/i1/TB1kTKyIVXXXXacXFXX07tlTXXX-200-200.png_88x88xz.jpg',
-          shopCommentText: '97',
-          shopLookImg: 'https://img.alicdn.com/imgextra/i4/397746073/TB2IseKeFXXXXcVXXXXXXXXXXXX-397746073.png_88x88xz.jpg',
-          shopLookText: '1003',
-          shareImg: 'https://cbu01.alicdn.com/cms/upload/2015/930/224/2422039_702806130.png_88x88xz.jpg',
-          shareText: "10",
+    data: function () {
+      return {
+        shopList: [
+          {
+            id: 1,
+            scopeValue: 1,
+            PersonPhoto: 'https://gw.alicdn.com/tps/i3/TB1yeWeIFXXXXX5XFXXuAZJYXXX-210-210.png_60x60.jpg',
+            PersonName: 'Mendeleyev',
+            PersonVisitTime: 'today',
+            shopDesc: 'Genius only means hard-working all one\'s life',
+            shopImgList: [{
+              shopImgWidth: 220,
+              shopImgHeight: 220,
+              shopImg: 'https://gd2.alicdn.com/bao/uploaded/i2/TB1rtOnHpXXXXXLaXXXXXXXXXXX_!!0-item_pic.jpg_220x220.jpg'
+            }, {
+              shopImgWidth: 220,
+              shopImgHeight: 220,
+              shopImg: 'https://gd4.alicdn.com/bao/uploaded/i4/TB15KrfFVXXXXXJXXXXXXXXXXXX_!!0-item_pic.jpg_220x220.jpg'
+            }, {
+              shopImgWidth: 220,
+              shopImgHeight: 220,
+              shopImg: 'https://gd2.alicdn.com/bao/uploaded/i2/TB1t5YBGVXXXXXcaXXXXXXXXXXX_!!0-item_pic.jpg_220x220.jpg'
+            }],
+            shopLikeImg: 'https://img.alicdn.com/tps/i1/TB1jTxXIVXXXXb8XXXX07tlTXXX-200-200.png_88x88xz.jpg',
+            shopLikeText: '6',
+            shopCommentImg: 'https://img.alicdn.com/tps/i1/TB1kTKyIVXXXXacXFXX07tlTXXX-200-200.png_88x88xz.jpg',
+            shopCommentText: '97',
+            shopLookImg: 'https://img.alicdn.com/imgextra/i4/397746073/TB2IseKeFXXXXcVXXXXXXXXXXXX-397746073.png_88x88xz.jpg',
+            shopLookText: '1003',
+            shareImg: 'https://cbu01.alicdn.com/cms/upload/2015/930/224/2422039_702806130.png_88x88xz.jpg',
+            shareText: "10",
 
-        },
-        {
-          id: 2,
-          scopeValue: 2,
-          PersonPhoto: 'https://gw.alicdn.com/tps/i3/TB1yeWeIFXXXXX5XFXXuAZJYXXX-210-210.png_60x60.jpg',
-          PersonName: 'Napoleon',
-          PersonVisitTime: 'yesterday',
-          shopDesc: 'The man who has made up his mind to win will never say "impossible "',
-          shopImgList: [{
-            shopImgWidth: 220,
-            shopImgHeight: 220,
-            shopImg: 'https://gd1.alicdn.com/imgextra/i1/2655929383/TB2.qITjpXXXXcIXXXXXXXXXXXX_!!2655929383.jpg_220x220.jpg'
-          }, {
-            shopImgWidth: 220,
-            shopImgHeight: 220,
-            shopImg: 'https://gd3.alicdn.com/imgextra/i3/2655929383/TB2eWwZjpXXXXbHXXXXXXXXXXXX_!!2655929383.jpg_220x220.jpg'
-          }, {
-            shopImgWidth: 220,
-            shopImgHeight: 220,
-            shopImg: 'https://gd2.alicdn.com/imgextra/i2/2655929383/TB2tgQWjpXXXXbZXXXXXXXXXXXX_!!2655929383.jpg_220x220.jpg'
-          }],
-          shopLikeImg: 'https://img.alicdn.com/tps/i1/TB1jTxXIVXXXXb8XXXX07tlTXXX-200-200.png_88x88xz.jpg',
-          shopLikeText: '6',
-          shopCommentImg: 'https://img.alicdn.com/tps/i1/TB1kTKyIVXXXXacXFXX07tlTXXX-200-200.png_88x88xz.jpg',
-          shopCommentText: '97',
-          shopLookImg: 'https://img.alicdn.com/imgextra/i4/397746073/TB2IseKeFXXXXcVXXXXXXXXXXXX-397746073.png_88x88xz.jpg',
-          shopLookText: '1003',
-          shareImg: 'https://cbu01.alicdn.com/cms/upload/2015/930/224/2422039_702806130.png_88x88xz.jpg',
-          shareText: "10",
+          },
+          {
+            id: 2,
+            scopeValue: 2,
+            PersonPhoto: 'https://gw.alicdn.com/tps/i3/TB1yeWeIFXXXXX5XFXXuAZJYXXX-210-210.png_60x60.jpg',
+            PersonName: 'Napoleon',
+            PersonVisitTime: 'yesterday',
+            shopDesc: 'The man who has made up his mind to win will never say "impossible "',
+            shopImgList: [{
+              shopImgWidth: 220,
+              shopImgHeight: 220,
+              shopImg: 'https://gd1.alicdn.com/imgextra/i1/2655929383/TB2.qITjpXXXXcIXXXXXXXXXXXX_!!2655929383.jpg_220x220.jpg'
+            }, {
+              shopImgWidth: 220,
+              shopImgHeight: 220,
+              shopImg: 'https://gd3.alicdn.com/imgextra/i3/2655929383/TB2eWwZjpXXXXbHXXXXXXXXXXXX_!!2655929383.jpg_220x220.jpg'
+            }, {
+              shopImgWidth: 220,
+              shopImgHeight: 220,
+              shopImg: 'https://gd2.alicdn.com/imgextra/i2/2655929383/TB2tgQWjpXXXXbZXXXXXXXXXXXX_!!2655929383.jpg_220x220.jpg'
+            }],
+            shopLikeImg: 'https://img.alicdn.com/tps/i1/TB1jTxXIVXXXXb8XXXX07tlTXXX-200-200.png_88x88xz.jpg',
+            shopLikeText: '6',
+            shopCommentImg: 'https://img.alicdn.com/tps/i1/TB1kTKyIVXXXXacXFXX07tlTXXX-200-200.png_88x88xz.jpg',
+            shopCommentText: '97',
+            shopLookImg: 'https://img.alicdn.com/imgextra/i4/397746073/TB2IseKeFXXXXcVXXXXXXXXXXXX-397746073.png_88x88xz.jpg',
+            shopLookText: '1003',
+            shareImg: 'https://cbu01.alicdn.com/cms/upload/2015/930/224/2422039_702806130.png_88x88xz.jpg',
+            shareText: "10",
 
-        },
-        {
-          id: 3,
-          scopeValue: 3,
-          PersonPhoto: 'https://gw.alicdn.com/tps/i3/TB1yeWeIFXXXXX5XFXXuAZJYXXX-210-210.png_60x60.jpg',
-          PersonName: 'Balzac',
-          PersonVisitTime: 'yesterday',
-          shopDesc: 'There is no such thing as a great talent without great will - power',
-          shopImgList: [{
-            shopImgWidth: 220,
-            shopImgHeight: 220,
-            shopImg: 'https://gd1.alicdn.com/imgextra/i1/TB1AFz9LXXXXXbrXVXXXXXXXXXX_!!0-item_pic.jpg_220x220.jpg'
-          }, {
-            shopImgWidth: 220,
-            shopImgHeight: 220,
-            shopImg: 'https://gd2.alicdn.com/imgextra/i2/2557954751/TB2is2njXXXXXatXpXXXXXXXXXX_!!2557954751.jpg_220x220.jpg'
-          }, {
-            shopImgWidth: 220,
-            shopImgHeight: 220,
-            shopImg: 'https://gd2.alicdn.com/imgextra/i2/2557954751/TB2PNYGjXXXXXbXXXXXXXXXXXXX_!!2557954751.jpg_220x220.jpg'
-          }],
-          shopLikeImg: 'https://img.alicdn.com/tps/i1/TB1jTxXIVXXXXb8XXXX07tlTXXX-200-200.png_88x88xz.jpg',
-          shopLikeText: '6',
-          shopCommentImg: 'https://img.alicdn.com/tps/i1/TB1kTKyIVXXXXacXFXX07tlTXXX-200-200.png_88x88xz.jpg',
-          shopCommentText: '97',
-          shopLookImg: 'https://img.alicdn.com/imgextra/i4/397746073/TB2IseKeFXXXXcVXXXXXXXXXXXX-397746073.png_88x88xz.jpg',
-          shopLookText: '1003',
-          shareImg: 'https://cbu01.alicdn.com/cms/upload/2015/930/224/2422039_702806130.png_88x88xz.jpg',
-          shareText: "10",
+          },
+          {
+            id: 3,
+            scopeValue: 3,
+            PersonPhoto: 'https://gw.alicdn.com/tps/i3/TB1yeWeIFXXXXX5XFXXuAZJYXXX-210-210.png_60x60.jpg',
+            PersonName: 'Balzac',
+            PersonVisitTime: 'yesterday',
+            shopDesc: 'There is no such thing as a great talent without great will - power',
+            shopImgList: [{
+              shopImgWidth: 220,
+              shopImgHeight: 220,
+              shopImg: 'https://gd1.alicdn.com/imgextra/i1/TB1AFz9LXXXXXbrXVXXXXXXXXXX_!!0-item_pic.jpg_220x220.jpg'
+            }, {
+              shopImgWidth: 220,
+              shopImgHeight: 220,
+              shopImg: 'https://gd2.alicdn.com/imgextra/i2/2557954751/TB2is2njXXXXXatXpXXXXXXXXXX_!!2557954751.jpg_220x220.jpg'
+            }, {
+              shopImgWidth: 220,
+              shopImgHeight: 220,
+              shopImg: 'https://gd2.alicdn.com/imgextra/i2/2557954751/TB2PNYGjXXXXXbXXXXXXXXXXXXX_!!2557954751.jpg_220x220.jpg'
+            }],
+            shopLikeImg: 'https://img.alicdn.com/tps/i1/TB1jTxXIVXXXXb8XXXX07tlTXXX-200-200.png_88x88xz.jpg',
+            shopLikeText: '6',
+            shopCommentImg: 'https://img.alicdn.com/tps/i1/TB1kTKyIVXXXXacXFXX07tlTXXX-200-200.png_88x88xz.jpg',
+            shopCommentText: '97',
+            shopLookImg: 'https://img.alicdn.com/imgextra/i4/397746073/TB2IseKeFXXXXcVXXXXXXXXXXXX-397746073.png_88x88xz.jpg',
+            shopLookText: '1003',
+            shareImg: 'https://cbu01.alicdn.com/cms/upload/2015/930/224/2422039_702806130.png_88x88xz.jpg',
+            shareText: "10",
 
-        },
-        {
-          id: 4,
-          scopeValue: 4,
-          PersonPhoto: 'https://gw.alicdn.com/tps/i3/TB1yeWeIFXXXXX5XFXXuAZJYXXX-210-210.png_60x60.jpg',
-          PersonName: 'Thomas Carlyle',
-          PersonVisitTime: '3 day ago',
-          shopDesc: 'Cease to struggle and you cease to live',
-          shopImgList: [{
-            shopImgWidth: 220,
-            shopImgHeight: 220,
-            shopImg: 'https://gd4.alicdn.com/imgextra/i4/69426324/TB2zbwdfXXXXXa4XpXXXXXXXXXX_!!69426324.jpg_220x220.jpg'
-          }, {
-            shopImgWidth: 220,
-            shopImgHeight: 220,
-            shopImg: 'https://gd4.alicdn.com/imgextra/i4/69426324/TB2L7ZAfXXXXXXOXXXXXXXXXXXX_!!69426324.jpg_220x220.jpg'
-          }, {
-            shopImgWidth: 220,
-            shopImgHeight: 220,
-            shopImg: 'https://gd4.alicdn.com/imgextra/i4/69426324/TB2p9wufXXXXXbiXXXXXXXXXXXX_!!69426324.jpg_220x220.jpg'
-          }],
-          shopLikeImg: 'https://img.alicdn.com/tps/i1/TB1jTxXIVXXXXb8XXXX07tlTXXX-200-200.png_88x88xz.jpg',
-          shopLikeText: '6',
-          shopCommentImg: 'https://img.alicdn.com/tps/i1/TB1kTKyIVXXXXacXFXX07tlTXXX-200-200.png_88x88xz.jpg',
-          shopCommentText: '97',
-          shopLookImg: 'https://img.alicdn.com/imgextra/i4/397746073/TB2IseKeFXXXXcVXXXXXXXXXXXX-397746073.png_88x88xz.jpg',
-          shopLookText: '1003',
-          shareImg: 'https://cbu01.alicdn.com/cms/upload/2015/930/224/2422039_702806130.png_88x88xz.jpg',
-          shareText: "10",
+          },
+          {
+            id: 4,
+            scopeValue: 4,
+            PersonPhoto: 'https://gw.alicdn.com/tps/i3/TB1yeWeIFXXXXX5XFXXuAZJYXXX-210-210.png_60x60.jpg',
+            PersonName: 'Thomas Carlyle',
+            PersonVisitTime: '3 day ago',
+            shopDesc: 'Cease to struggle and you cease to live',
+            shopImgList: [{
+              shopImgWidth: 220,
+              shopImgHeight: 220,
+              shopImg: 'https://gd4.alicdn.com/imgextra/i4/69426324/TB2zbwdfXXXXXa4XpXXXXXXXXXX_!!69426324.jpg_220x220.jpg'
+            }, {
+              shopImgWidth: 220,
+              shopImgHeight: 220,
+              shopImg: 'https://gd4.alicdn.com/imgextra/i4/69426324/TB2L7ZAfXXXXXXOXXXXXXXXXXXX_!!69426324.jpg_220x220.jpg'
+            }, {
+              shopImgWidth: 220,
+              shopImgHeight: 220,
+              shopImg: 'https://gd4.alicdn.com/imgextra/i4/69426324/TB2p9wufXXXXXbiXXXXXXXXXXXX_!!69426324.jpg_220x220.jpg'
+            }],
+            shopLikeImg: 'https://img.alicdn.com/tps/i1/TB1jTxXIVXXXXb8XXXX07tlTXXX-200-200.png_88x88xz.jpg',
+            shopLikeText: '6',
+            shopCommentImg: 'https://img.alicdn.com/tps/i1/TB1kTKyIVXXXXacXFXX07tlTXXX-200-200.png_88x88xz.jpg',
+            shopCommentText: '97',
+            shopLookImg: 'https://img.alicdn.com/imgextra/i4/397746073/TB2IseKeFXXXXcVXXXXXXXXXXXX-397746073.png_88x88xz.jpg',
+            shopLookText: '1003',
+            shareImg: 'https://cbu01.alicdn.com/cms/upload/2015/930/224/2422039_702806130.png_88x88xz.jpg',
+            shareText: "10",
 
-        },
-        {
-          id: 5,
-          scopeValue: 5,
-          PersonPhoto: 'https://gw.alicdn.com/tps/i3/TB1yeWeIFXXXXX5XFXXuAZJYXXX-210-210.png_60x60.jpg',
-          PersonName: 'Addison',
-          PersonVisitTime: 'yesterday',
-          shopDesc: 'A strong man will struggle with the storms of fate',
-          shopImgList: [{
-            shopImgWidth: 220,
-            shopImgHeight: 220,
-            shopImg: 'https://gd3.alicdn.com/bao/uploaded/i3/TB1MQ8_KVXXXXaLXVXXXXXXXXXX_!!0-item_pic.jpg_220x220.jpg'
-          }, {
-            shopImgWidth: 220,
-            shopImgHeight: 220,
-            shopImg: 'https://gd2.alicdn.com/imgextra/i2/53218032/TB2bGSqiXXXXXXyXpXXXXXXXXXX_!!53218032.jpg_220x220.jpg'
-          }, {
-            shopImgWidth: 220,
-            shopImgHeight: 220,
-            shopImg: 'https://gd2.alicdn.com/bao/uploaded/i2/TB1kP2zKFXXXXbIXXXXXXXXXXXX_!!0-item_pic.jpg_220x220.jpg'
-          }],
-          shopLikeImg: 'https://img.alicdn.com/tps/i1/TB1jTxXIVXXXXb8XXXX07tlTXXX-200-200.png_88x88xz.jpg',
-          shopLikeText: '6',
-          shopCommentImg: 'https://img.alicdn.com/tps/i1/TB1kTKyIVXXXXacXFXX07tlTXXX-200-200.png_88x88xz.jpg',
-          shopCommentText: '97',
-          shopLookImg: 'https://img.alicdn.com/imgextra/i4/397746073/TB2IseKeFXXXXcVXXXXXXXXXXXX-397746073.png_88x88xz.jpg',
-          shopLookText: '1003',
-          shareImg: 'https://cbu01.alicdn.com/cms/upload/2015/930/224/2422039_702806130.png_88x88xz.jpg',
-          shareText: "10",
+          },
+          {
+            id: 5,
+            scopeValue: 5,
+            PersonPhoto: 'https://gw.alicdn.com/tps/i3/TB1yeWeIFXXXXX5XFXXuAZJYXXX-210-210.png_60x60.jpg',
+            PersonName: 'Addison',
+            PersonVisitTime: 'yesterday',
+            shopDesc: 'A strong man will struggle with the storms of fate',
+            shopImgList: [{
+              shopImgWidth: 220,
+              shopImgHeight: 220,
+              shopImg: 'https://gd3.alicdn.com/bao/uploaded/i3/TB1MQ8_KVXXXXaLXVXXXXXXXXXX_!!0-item_pic.jpg_220x220.jpg'
+            }, {
+              shopImgWidth: 220,
+              shopImgHeight: 220,
+              shopImg: 'https://gd2.alicdn.com/imgextra/i2/53218032/TB2bGSqiXXXXXXyXpXXXXXXXXXX_!!53218032.jpg_220x220.jpg'
+            }, {
+              shopImgWidth: 220,
+              shopImgHeight: 220,
+              shopImg: 'https://gd2.alicdn.com/bao/uploaded/i2/TB1kP2zKFXXXXbIXXXXXXXXXXXX_!!0-item_pic.jpg_220x220.jpg'
+            }],
+            shopLikeImg: 'https://img.alicdn.com/tps/i1/TB1jTxXIVXXXXb8XXXX07tlTXXX-200-200.png_88x88xz.jpg',
+            shopLikeText: '6',
+            shopCommentImg: 'https://img.alicdn.com/tps/i1/TB1kTKyIVXXXXacXFXX07tlTXXX-200-200.png_88x88xz.jpg',
+            shopCommentText: '97',
+            shopLookImg: 'https://img.alicdn.com/imgextra/i4/397746073/TB2IseKeFXXXXcVXXXXXXXXXXXX-397746073.png_88x88xz.jpg',
+            shopLookText: '1003',
+            shareImg: 'https://cbu01.alicdn.com/cms/upload/2015/930/224/2422039_702806130.png_88x88xz.jpg',
+            shareText: "10",
 
-        },
-        {
-          id: 6,
-          scopeValue: 1,
-          PersonPhoto: 'https://gw.alicdn.com/tps/i3/TB1yeWeIFXXXXX5XFXXuAZJYXXX-210-210.png_60x60.jpg',
-          PersonName: 'Ruskin',
-          PersonVisitTime: 'yesterday',
-          shopDesc: 'Living without an aim is like sailing without a compass',
-          shopImgList: [{
-            shopImgWidth: 220,
-            shopImgHeight: 220,
-            shopImg: 'https://gd4.alicdn.com/bao/uploaded/i4/TB11yFnHXXXXXakaXXXXXXXXXXX_!!0-item_pic.jpg_220x220.jpg'
-          }, {
-            shopImgWidth: 220,
-            shopImgHeight: 220,
-            shopImg: 'https://gd4.alicdn.com/imgextra/i4/32720628/TB2CRJUcXXXXXXwXpXXXXXXXXXX_!!32720628.jpg_220x220.jpg'
-          }, {
-            shopImgWidth: 220,
-            shopImgHeight: 220,
-            shopImg: 'https://gd2.alicdn.com/bao/uploaded/i2/TB17LUzHXXXXXcEaXXXXXXXXXXX_!!0-item_pic.jpg_220x220.jpg'
-          }],
-          shopLikeImg: 'https://img.alicdn.com/tps/i1/TB1jTxXIVXXXXb8XXXX07tlTXXX-200-200.png_88x88xz.jpg',
-          shopLikeText: '6',
-          shopCommentImg: 'https://img.alicdn.com/tps/i1/TB1kTKyIVXXXXacXFXX07tlTXXX-200-200.png_88x88xz.jpg',
-          shopCommentText: '97',
-          shopLookImg: 'https://img.alicdn.com/imgextra/i4/397746073/TB2IseKeFXXXXcVXXXXXXXXXXXX-397746073.png_88x88xz.jpg',
-          shopLookText: '1003',
-          shareImg: 'https://cbu01.alicdn.com/cms/upload/2015/930/224/2422039_702806130.png_88x88xz.jpg',
-          shareText: "10",
+          },
+          {
+            id: 6,
+            scopeValue: 1,
+            PersonPhoto: 'https://gw.alicdn.com/tps/i3/TB1yeWeIFXXXXX5XFXXuAZJYXXX-210-210.png_60x60.jpg',
+            PersonName: 'Ruskin',
+            PersonVisitTime: 'yesterday',
+            shopDesc: 'Living without an aim is like sailing without a compass',
+            shopImgList: [{
+              shopImgWidth: 220,
+              shopImgHeight: 220,
+              shopImg: 'https://gd4.alicdn.com/bao/uploaded/i4/TB11yFnHXXXXXakaXXXXXXXXXXX_!!0-item_pic.jpg_220x220.jpg'
+            }, {
+              shopImgWidth: 220,
+              shopImgHeight: 220,
+              shopImg: 'https://gd4.alicdn.com/imgextra/i4/32720628/TB2CRJUcXXXXXXwXpXXXXXXXXXX_!!32720628.jpg_220x220.jpg'
+            }, {
+              shopImgWidth: 220,
+              shopImgHeight: 220,
+              shopImg: 'https://gd2.alicdn.com/bao/uploaded/i2/TB17LUzHXXXXXcEaXXXXXXXXXXX_!!0-item_pic.jpg_220x220.jpg'
+            }],
+            shopLikeImg: 'https://img.alicdn.com/tps/i1/TB1jTxXIVXXXXb8XXXX07tlTXXX-200-200.png_88x88xz.jpg',
+            shopLikeText: '6',
+            shopCommentImg: 'https://img.alicdn.com/tps/i1/TB1kTKyIVXXXXacXFXX07tlTXXX-200-200.png_88x88xz.jpg',
+            shopCommentText: '97',
+            shopLookImg: 'https://img.alicdn.com/imgextra/i4/397746073/TB2IseKeFXXXXcVXXXXXXXXXXXX-397746073.png_88x88xz.jpg',
+            shopLookText: '1003',
+            shareImg: 'https://cbu01.alicdn.com/cms/upload/2015/930/224/2422039_702806130.png_88x88xz.jpg',
+            shareText: "10",
 
-        },
-        {
-          id: 7,
-          scopeValue: 2,
-          PersonPhoto: 'https://gw.alicdn.com/tps/i3/TB1yeWeIFXXXXX5XFXXuAZJYXXX-210-210.png_60x60.jpg',
-          PersonName: 'Yiming',
-          PersonVisitTime: 'today',
-          shopDesc: 'Live a noble and honest life. Reviving past times in your old age will help you to enjoy your life again',
-          shopImgList: [{
-            shopImgWidth: 220,
-            shopImgHeight: 220,
-            shopImg: 'https://gd4.alicdn.com/bao/uploaded/i4/TB1hvNoJXXXXXaMaXXXXXXXXXXX_!!0-item_pic.jpg_220x220.jpg'
-          }, {
-            shopImgWidth: 220,
-            shopImgHeight: 220,
-            shopImg: 'https://gd4.alicdn.com/imgextra/i4/2058567235/TB2V8iygFXXXXaRXpXXXXXXXXXX_!!2058567235.jpg_220x220.jpg'
-          }, {
-            shopImgWidth: 220,
-            shopImgHeight: 220,
-            shopImg: 'https://gd2.alicdn.com/imgextra/i2/2058567235/TB2im1QgFXXXXX8XXXXXXXXXXXX_!!2058567235.jpg_220x220.jpg'
-          }],
-          shopLikeImg: 'https://img.alicdn.com/tps/i1/TB1jTxXIVXXXXb8XXXX07tlTXXX-200-200.png_88x88xz.jpg',
-          shopLikeText: '6',
-          shopCommentImg: 'https://img.alicdn.com/tps/i1/TB1kTKyIVXXXXacXFXX07tlTXXX-200-200.png_88x88xz.jpg',
-          shopCommentText: '97',
-          shopLookImg: 'https://img.alicdn.com/imgextra/i4/397746073/TB2IseKeFXXXXcVXXXXXXXXXXXX-397746073.png_88x88xz.jpg',
-          shopLookText: '1003',
-          shareImg: 'https://cbu01.alicdn.com/cms/upload/2015/930/224/2422039_702806130.png_88x88xz.jpg',
-          shareText: "10",
+          },
+          {
+            id: 7,
+            scopeValue: 2,
+            PersonPhoto: 'https://gw.alicdn.com/tps/i3/TB1yeWeIFXXXXX5XFXXuAZJYXXX-210-210.png_60x60.jpg',
+            PersonName: 'Yiming',
+            PersonVisitTime: 'today',
+            shopDesc: 'Live a noble and honest life. Reviving past times in your old age will help you to enjoy your life again',
+            shopImgList: [{
+              shopImgWidth: 220,
+              shopImgHeight: 220,
+              shopImg: 'https://gd4.alicdn.com/bao/uploaded/i4/TB1hvNoJXXXXXaMaXXXXXXXXXXX_!!0-item_pic.jpg_220x220.jpg'
+            }, {
+              shopImgWidth: 220,
+              shopImgHeight: 220,
+              shopImg: 'https://gd4.alicdn.com/imgextra/i4/2058567235/TB2V8iygFXXXXaRXpXXXXXXXXXX_!!2058567235.jpg_220x220.jpg'
+            }, {
+              shopImgWidth: 220,
+              shopImgHeight: 220,
+              shopImg: 'https://gd2.alicdn.com/imgextra/i2/2058567235/TB2im1QgFXXXXX8XXXXXXXXXXXX_!!2058567235.jpg_220x220.jpg'
+            }],
+            shopLikeImg: 'https://img.alicdn.com/tps/i1/TB1jTxXIVXXXXb8XXXX07tlTXXX-200-200.png_88x88xz.jpg',
+            shopLikeText: '6',
+            shopCommentImg: 'https://img.alicdn.com/tps/i1/TB1kTKyIVXXXXacXFXX07tlTXXX-200-200.png_88x88xz.jpg',
+            shopCommentText: '97',
+            shopLookImg: 'https://img.alicdn.com/imgextra/i4/397746073/TB2IseKeFXXXXcVXXXXXXXXXXXX-397746073.png_88x88xz.jpg',
+            shopLookText: '1003',
+            shareImg: 'https://cbu01.alicdn.com/cms/upload/2015/930/224/2422039_702806130.png_88x88xz.jpg',
+            shareText: "10",
 
-        },
-        {
-          id: 8,
-          scopeValue: 3,
-          PersonPhoto: 'https://gw.alicdn.com/tps/i3/TB1yeWeIFXXXXX5XFXXuAZJYXXX-210-210.png_60x60.jpg',
-          PersonName: 'Brown',
-          PersonVisitTime: 'yesterday',
-          shopDesc: 'Behind every successful man there\'s a lot u unsuccessful years',
-          shopImgList: [{
-            shopImgWidth: 220,
-            shopImgHeight: 220,
-            shopImg: 'https://gd1.alicdn.com/bao/uploaded/i1/TB18BZ2KFXXXXb8XFXXXXXXXXXX_!!0-item_pic.jpg_220x220.jpg'
-          }, {
-            shopImgWidth: 220,
-            shopImgHeight: 220,
-            shopImg: 'https://gd1.alicdn.com/imgextra/i1/2775383848/TB2r012jVXXXXXHXpXXXXXXXXXX_!!2775383848.jpg_220x220.jpg'
-          }, {
-            shopImgWidth: 220,
-            shopImgHeight: 220,
-            shopImg: 'https://gd3.alicdn.com/imgextra/i3/2775383848/TB2iI9VjVXXXXaoXpXXXXXXXXXX_!!2775383848.jpg_220x220.jpg'
-          }],
-          shopLikeImg: 'https://img.alicdn.com/tps/i1/TB1jTxXIVXXXXb8XXXX07tlTXXX-200-200.png_88x88xz.jpg',
-          shopLikeText: '6',
-          shopCommentImg: 'https://img.alicdn.com/tps/i1/TB1kTKyIVXXXXacXFXX07tlTXXX-200-200.png_88x88xz.jpg',
-          shopCommentText: '97',
-          shopLookImg: 'https://img.alicdn.com/imgextra/i4/397746073/TB2IseKeFXXXXcVXXXXXXXXXXXX-397746073.png_88x88xz.jpg',
-          shopLookText: '1003',
-          shareImg: 'https://cbu01.alicdn.com/cms/upload/2015/930/224/2422039_702806130.png_88x88xz.jpg',
-          shareText: "10",
+          },
+          {
+            id: 8,
+            scopeValue: 3,
+            PersonPhoto: 'https://gw.alicdn.com/tps/i3/TB1yeWeIFXXXXX5XFXXuAZJYXXX-210-210.png_60x60.jpg',
+            PersonName: 'Brown',
+            PersonVisitTime: 'yesterday',
+            shopDesc: 'Behind every successful man there\'s a lot u unsuccessful years',
+            shopImgList: [{
+              shopImgWidth: 220,
+              shopImgHeight: 220,
+              shopImg: 'https://gd1.alicdn.com/bao/uploaded/i1/TB18BZ2KFXXXXb8XFXXXXXXXXXX_!!0-item_pic.jpg_220x220.jpg'
+            }, {
+              shopImgWidth: 220,
+              shopImgHeight: 220,
+              shopImg: 'https://gd1.alicdn.com/imgextra/i1/2775383848/TB2r012jVXXXXXHXpXXXXXXXXXX_!!2775383848.jpg_220x220.jpg'
+            }, {
+              shopImgWidth: 220,
+              shopImgHeight: 220,
+              shopImg: 'https://gd3.alicdn.com/imgextra/i3/2775383848/TB2iI9VjVXXXXaoXpXXXXXXXXXX_!!2775383848.jpg_220x220.jpg'
+            }],
+            shopLikeImg: 'https://img.alicdn.com/tps/i1/TB1jTxXIVXXXXb8XXXX07tlTXXX-200-200.png_88x88xz.jpg',
+            shopLikeText: '6',
+            shopCommentImg: 'https://img.alicdn.com/tps/i1/TB1kTKyIVXXXXacXFXX07tlTXXX-200-200.png_88x88xz.jpg',
+            shopCommentText: '97',
+            shopLookImg: 'https://img.alicdn.com/imgextra/i4/397746073/TB2IseKeFXXXXcVXXXXXXXXXXXX-397746073.png_88x88xz.jpg',
+            shopLookText: '1003',
+            shareImg: 'https://cbu01.alicdn.com/cms/upload/2015/930/224/2422039_702806130.png_88x88xz.jpg',
+            shareText: "10",
 
-        },
-        {
-          id: 9,
-          scopeValue: 4,
-          PersonPhoto: 'https://gw.alicdn.com/tps/i3/TB1yeWeIFXXXXX5XFXXuAZJYXXX-210-210.png_60x60.jpg',
-          PersonName: 'YIMING',
-          PersonVisitTime: 'today',
-          shopDesc: 'Enrich your life today,. yesterday is history.tomorrow is mystery',
-          shopImgList: [{
-            shopImgWidth: 220,
-            shopImgHeight: 220,
-            shopImg: 'https://gd1.alicdn.com/bao/uploaded/i1/TB1JB.rLpXXXXXLXXXXXXXXXXXX_!!0-item_pic.jpg_220x220.jpg'
-          }, {
-            shopImgWidth: 220,
-            shopImgHeight: 220,
-            shopImg: 'https://gd4.alicdn.com/imgextra/i4/2702739128/TB2JdvmjVXXXXXjXXXXXXXXXXXX_!!2702739128.jpg_220x220.jpg'
-          }, {
-            shopImgWidth: 220,
-            shopImgHeight: 220,
-            shopImg: 'https://gd2.alicdn.com/imgextra/i2/2702739128/TB2A.e6jVXXXXXGXpXXXXXXXXXX_!!2702739128.jpg_220x220.jpg'
-          }],
-          shopLikeImg: 'https://img.alicdn.com/tps/i1/TB1jTxXIVXXXXb8XXXX07tlTXXX-200-200.png_88x88xz.jpg',
-          shopLikeText: '6',
-          shopCommentImg: 'https://img.alicdn.com/tps/i1/TB1kTKyIVXXXXacXFXX07tlTXXX-200-200.png_88x88xz.jpg',
-          shopCommentText: '97',
-          shopLookImg: 'https://img.alicdn.com/imgextra/i4/397746073/TB2IseKeFXXXXcVXXXXXXXXXXXX-397746073.png_88x88xz.jpg',
-          shopLookText: '1003',
-          shareImg: 'https://cbu01.alicdn.com/cms/upload/2015/930/224/2422039_702806130.png_88x88xz.jpg',
-          shareText: "10",
+          },
+          {
+            id: 9,
+            scopeValue: 4,
+            PersonPhoto: 'https://gw.alicdn.com/tps/i3/TB1yeWeIFXXXXX5XFXXuAZJYXXX-210-210.png_60x60.jpg',
+            PersonName: 'YIMING',
+            PersonVisitTime: 'today',
+            shopDesc: 'Enrich your life today,. yesterday is history.tomorrow is mystery',
+            shopImgList: [{
+              shopImgWidth: 220,
+              shopImgHeight: 220,
+              shopImg: 'https://gd1.alicdn.com/bao/uploaded/i1/TB1JB.rLpXXXXXLXXXXXXXXXXXX_!!0-item_pic.jpg_220x220.jpg'
+            }, {
+              shopImgWidth: 220,
+              shopImgHeight: 220,
+              shopImg: 'https://gd4.alicdn.com/imgextra/i4/2702739128/TB2JdvmjVXXXXXjXXXXXXXXXXXX_!!2702739128.jpg_220x220.jpg'
+            }, {
+              shopImgWidth: 220,
+              shopImgHeight: 220,
+              shopImg: 'https://gd2.alicdn.com/imgextra/i2/2702739128/TB2A.e6jVXXXXXGXpXXXXXXXXXX_!!2702739128.jpg_220x220.jpg'
+            }],
+            shopLikeImg: 'https://img.alicdn.com/tps/i1/TB1jTxXIVXXXXb8XXXX07tlTXXX-200-200.png_88x88xz.jpg',
+            shopLikeText: '6',
+            shopCommentImg: 'https://img.alicdn.com/tps/i1/TB1kTKyIVXXXXacXFXX07tlTXXX-200-200.png_88x88xz.jpg',
+            shopCommentText: '97',
+            shopLookImg: 'https://img.alicdn.com/imgextra/i4/397746073/TB2IseKeFXXXXcVXXXXXXXXXXXX-397746073.png_88x88xz.jpg',
+            shopLookText: '1003',
+            shareImg: 'https://cbu01.alicdn.com/cms/upload/2015/930/224/2422039_702806130.png_88x88xz.jpg',
+            shareText: "10",
 
-        },
-        {
-          id: 10,
-          scopeValue: 5,
-          PersonPhoto: 'https://gw.alicdn.com/tps/i3/TB1yeWeIFXXXXX5XFXXuAZJYXXX-210-210.png_60x60.jpg',
-          PersonName: 'YIMING',
-          PersonVisitTime: 'yesterday',
-          shopDesc: 'The secret of success is constancy to purpose',
-          shopImgList: [{
-            shopImgWidth: 220,
-            shopImgHeight: 220,
-            shopImg: 'https://gd3.alicdn.com/bao/uploaded/i3/TB17zXOGXXXXXbEXVXXXXXXXXXX_!!0-item_pic.jpg_220x220.jpg'
-          }, {
-            shopImgWidth: 220,
-            shopImgHeight: 220,
-            shopImg: 'https://gd1.alicdn.com/imgextra/i1/2265445951/TB22ACTbFXXXXXBXXXXXXXXXXXX_!!2265445951.jpg_220x220.jpg'
-          }, {
-            shopImgWidth: 220,
-            shopImgHeight: 220,
-            shopImg: 'https://gd3.alicdn.com/imgextra/i3/2265445951/TB2oXqUbFXXXXXIXXXXXXXXXXXX_!!2265445951.jpg_220x220.jpg'
-          }],
-          shopLikeImg: 'https://img.alicdn.com/tps/i1/TB1jTxXIVXXXXb8XXXX07tlTXXX-200-200.png_88x88xz.jpg',
-          shopLikeText: '6',
-          shopCommentImg: 'https://img.alicdn.com/tps/i1/TB1kTKyIVXXXXacXFXX07tlTXXX-200-200.png_88x88xz.jpg',
-          shopCommentText: '97',
-          shopLookImg: 'https://img.alicdn.com/imgextra/i4/397746073/TB2IseKeFXXXXcVXXXXXXXXXXXX-397746073.png_88x88xz.jpg',
-          shopLookText: '1003',
-          shareImg: 'https://cbu01.alicdn.com/cms/upload/2015/930/224/2422039_702806130.png_88x88xz.jpg',
-          shareText: "10",
-        }
-      ],
+          },
+          {
+            id: 10,
+            scopeValue: 5,
+            PersonPhoto: 'https://gw.alicdn.com/tps/i3/TB1yeWeIFXXXXX5XFXXuAZJYXXX-210-210.png_60x60.jpg',
+            PersonName: 'YIMING',
+            PersonVisitTime: 'yesterday',
+            shopDesc: 'The secret of success is constancy to purpose',
+            shopImgList: [{
+              shopImgWidth: 220,
+              shopImgHeight: 220,
+              shopImg: 'https://gd3.alicdn.com/bao/uploaded/i3/TB17zXOGXXXXXbEXVXXXXXXXXXX_!!0-item_pic.jpg_220x220.jpg'
+            }, {
+              shopImgWidth: 220,
+              shopImgHeight: 220,
+              shopImg: 'https://gd1.alicdn.com/imgextra/i1/2265445951/TB22ACTbFXXXXXBXXXXXXXXXXXX_!!2265445951.jpg_220x220.jpg'
+            }, {
+              shopImgWidth: 220,
+              shopImgHeight: 220,
+              shopImg: 'https://gd3.alicdn.com/imgextra/i3/2265445951/TB2oXqUbFXXXXXIXXXXXXXXXXXX_!!2265445951.jpg_220x220.jpg'
+            }],
+            shopLikeImg: 'https://img.alicdn.com/tps/i1/TB1jTxXIVXXXXb8XXXX07tlTXXX-200-200.png_88x88xz.jpg',
+            shopLikeText: '6',
+            shopCommentImg: 'https://img.alicdn.com/tps/i1/TB1kTKyIVXXXXacXFXX07tlTXXX-200-200.png_88x88xz.jpg',
+            shopCommentText: '97',
+            shopLookImg: 'https://img.alicdn.com/imgextra/i4/397746073/TB2IseKeFXXXXcVXXXXXXXXXXXX-397746073.png_88x88xz.jpg',
+            shopLookText: '1003',
+            shareImg: 'https://cbu01.alicdn.com/cms/upload/2015/930/224/2422039_702806130.png_88x88xz.jpg',
+            shareText: "10",
+          }
+          ],
+      }
     },
     methods: {
       loadmore: function(e) {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/showcase/progress.vue
----------------------------------------------------------------------
diff --git a/examples/vue/showcase/progress.vue b/examples/vue/showcase/progress.vue
index 7824f1f..8311bcf 100644
--- a/examples/vue/showcase/progress.vue
+++ b/examples/vue/showcase/progress.vue
@@ -22,12 +22,14 @@
 <script>
   var INC = 20;
   module.exports = {
-    data: {
-      fullW: 600,
-      w: 40
+    data: function () {
+      return {
+        fullW: 600,
+        w: 40
+      }
     },
     components: {
-      panel: require('weex-vue-components/panel.vue')
+      panel: require('../include/panel.vue')
     },
     created: function() {
       var me = this;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/style/index.vue
----------------------------------------------------------------------
diff --git a/examples/vue/style/index.vue b/examples/vue/style/index.vue
index ece5f49..dafa348 100644
--- a/examples/vue/style/index.vue
+++ b/examples/vue/style/index.vue
@@ -32,7 +32,7 @@
 <script>
   module.exports = {
     components: {
-      panel: require('weex-vue-components/panel.vue'),
+      panel: require('../include/panel.vue'),
       styleBox: require('./style-box.vue'),
       styleFlex: require('./style-flex.vue'),
       styleItem: require('./style-item.vue')

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/style/style-box.vue
----------------------------------------------------------------------
diff --git a/examples/vue/style/style-box.vue b/examples/vue/style/style-box.vue
index 90edc3d..ac2e290 100644
--- a/examples/vue/style/style-box.vue
+++ b/examples/vue/style/style-box.vue
@@ -62,8 +62,8 @@
 <script>
   module.exports = {
     components: {
-      panel: require('weex-vue-components/panel.vue'),
-      tip: require('weex-vue-components/tip.vue'),
+      panel: require('../include/panel.vue'),
+      tip: require('../include/tip.vue'),
       styleItem: require('./style-item.vue')
     }
   }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/style/style-flex.vue
----------------------------------------------------------------------
diff --git a/examples/vue/style/style-flex.vue b/examples/vue/style/style-flex.vue
index 5c34b10..fc8b7b1 100644
--- a/examples/vue/style/style-flex.vue
+++ b/examples/vue/style/style-flex.vue
@@ -118,7 +118,7 @@
 <script>
   module.exports = {
     components: {
-      panel: require('weex-vue-components/panel.vue'),
+      panel: require('../include/panel.vue'),
       styleItem: require('./style-item.vue')
     }
   }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/syntax/hello-world.vue
----------------------------------------------------------------------
diff --git a/examples/vue/syntax/hello-world.vue b/examples/vue/syntax/hello-world.vue
index 7dbe838..e4f4826 100644
--- a/examples/vue/syntax/hello-world.vue
+++ b/examples/vue/syntax/hello-world.vue
@@ -38,6 +38,7 @@
     methods: {
       update: function (e) {
         this.target = 'Weex'
+        console.log('target:', this.target)
       }
     }
   }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/syntax/script-component.vue
----------------------------------------------------------------------
diff --git a/examples/vue/syntax/script-component.vue b/examples/vue/syntax/script-component.vue
index d8f8af5..1a29561 100644
--- a/examples/vue/syntax/script-component.vue
+++ b/examples/vue/syntax/script-component.vue
@@ -15,12 +15,14 @@
 
 <script>
   module.exports = {
-    data: {
-      items: [
-        {title: 'A', url: 'a'},
-        {title: 'B', url: 'b'},
-        {title: 'C', url: 'c'}
-      ]
+    data: function () {
+      return {
+        items: [
+          {title: 'A', url: 'a'},
+          {title: 'B', url: 'b'},
+          {title: 'C', url: 'c'}
+        ]
+      }
     },
     components: {
       item: require('./include/sub.vue')

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/syntax/script-data.vue
----------------------------------------------------------------------
diff --git a/examples/vue/syntax/script-data.vue b/examples/vue/syntax/script-data.vue
index 09743c6..be65fa5 100644
--- a/examples/vue/syntax/script-data.vue
+++ b/examples/vue/syntax/script-data.vue
@@ -54,14 +54,17 @@
   // }
 
   module.exports = {
-    data: {
-      firstName: 'John',
-      lastName: 'Smith',
-      date: Date.now()
+    data: function () {
+      return {
+        firstName: 'John',
+        lastName: 'Smith',
+        date: Date.now()
+      }
     },
     methods: {
       update: function () {
         this.today = '2016-01-01'
+        console.log('today:', this.today)
       }
     },
     computed: {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/syntax/script-events.vue
----------------------------------------------------------------------
diff --git a/examples/vue/syntax/script-events.vue b/examples/vue/syntax/script-events.vue
index 95963bb..a4e437d 100644
--- a/examples/vue/syntax/script-events.vue
+++ b/examples/vue/syntax/script-events.vue
@@ -16,12 +16,15 @@
 
 <script>
   module.exports = {
-    data: {
-      list: []
+    data: function () {
+      return {
+        list: []
+      }
     },
     mounted: function () {
       function custom(e) {
         this.list.push('custom: ' + JSON.stringify(e))
+        console.log(this.list)
       }
 
       this.$emit('custom', {x: 1})

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/syntax/script-instance.vue
----------------------------------------------------------------------
diff --git a/examples/vue/syntax/script-instance.vue b/examples/vue/syntax/script-instance.vue
index 8448bd8..792f900 100644
--- a/examples/vue/syntax/script-instance.vue
+++ b/examples/vue/syntax/script-instance.vue
@@ -21,9 +21,11 @@
 
 <script>
   module.exports = {
-    data: {
-      x: 1,
-      y: 2
+    data: function () {
+      return {
+        x: 1,
+        y: 2
+      }
     },
     methods: {
       foo: function () {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/syntax/script-lifecycle.vue
----------------------------------------------------------------------
diff --git a/examples/vue/syntax/script-lifecycle.vue b/examples/vue/syntax/script-lifecycle.vue
index 2863a7b..3c5c731 100644
--- a/examples/vue/syntax/script-lifecycle.vue
+++ b/examples/vue/syntax/script-lifecycle.vue
@@ -11,18 +11,23 @@
 <script>
   var initMessage
   module.exports = {
-    data: {
-      list: ['Lifecycle List']
+    data: function () {
+      return {
+        list: ['Lifecycle List']
+      }
     },
     init: function () {
       initMessage = 'component init: nothing more happen even the data initialization'
+      console.log('init:', this.list)
     },
     created: function () {
       this.list.push(initMessage)
       this.list.push('component created: data observed')
+      console.log('created:', this.list)
     },
     mounted: function () {
       this.list.push('component mounted: virtual dom generated')
+      console.log('mounted:', this.list)
     }
   }
 </script>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/syntax/template-class.vue
----------------------------------------------------------------------
diff --git a/examples/vue/syntax/template-class.vue b/examples/vue/syntax/template-class.vue
index 85aa31b..55d50e1 100644
--- a/examples/vue/syntax/template-class.vue
+++ b/examples/vue/syntax/template-class.vue
@@ -23,6 +23,7 @@
     methods: {
       update: function (e) {
         this.x = 'b'
+        console.log('x', this.x)
       }
     }
   }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/syntax/template-event.vue
----------------------------------------------------------------------
diff --git a/examples/vue/syntax/template-event.vue b/examples/vue/syntax/template-event.vue
index f55db76..034cf02 100644
--- a/examples/vue/syntax/template-event.vue
+++ b/examples/vue/syntax/template-event.vue
@@ -20,16 +20,20 @@
 
 <script>
   module.exports = {
-    data: {
-      name: 'Steve',
-      temp: 'Mike'
+    data: function () {
+      return {
+        name: 'Steve',
+        temp: 'Mike'
+      }
     },
     methods: {
       update: function (e) {
         this.setName('David')
+        console.log('setName', this.name)
       },
       setName: function (value) {
         this.name = value
+        console.log('name', this.name)
       }
     }
   }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/syntax/template-if.vue
----------------------------------------------------------------------
diff --git a/examples/vue/syntax/template-if.vue b/examples/vue/syntax/template-if.vue
index 8570f25..c0951b7 100644
--- a/examples/vue/syntax/template-if.vue
+++ b/examples/vue/syntax/template-if.vue
@@ -23,6 +23,7 @@
     methods: {
       toggle: function (e) {
         this.flag = !this.flag
+        console.log('this.flag:', this.flag)
       }
     }
   }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/syntax/template-repeat-update.vue
----------------------------------------------------------------------
diff --git a/examples/vue/syntax/template-repeat-update.vue b/examples/vue/syntax/template-repeat-update.vue
index 7bed982..c320dc9 100644
--- a/examples/vue/syntax/template-repeat-update.vue
+++ b/examples/vue/syntax/template-repeat-update.vue
@@ -7,7 +7,7 @@
 <template>
   <div>
     <text class="title">Track by</text>
-    <text class="subtitle" v-for="item in list" track-by="item.key">{{$index}}-{{item.text}}</text>
+    <text class="subtitle" v-for="(item, k, $index) in list" track-by="item.key">{{$index}}-{{item.text}}</text>
     <text class="btn" @click="update">Update</text>
     <text class="btn" @click="mutate">Mutate</text>
   </div>
@@ -21,21 +21,24 @@
 
 <script>
   module.exports = {
-    data: {
-      list: [
-        {key: 1, text: 'a'},
-        {key: 2, text: 'a'},
-        {key: 3, text: 'b'},
-        {key: 4, text: 'c'},
-        {key: 5, text: 'a'}
-      ],
-      flag: true
+    data: function () {
+      return {
+        list: [
+          {key: 1, text: 'a'},
+          {key: 2, text: 'a'},
+          {key: 3, text: 'b'},
+          {key: 4, text: 'c'},
+          {key: 5, text: 'a'}
+        ],
+        flag: true
+      }
     },
     methods: {
       update: function (e) {
         // equals to `this.list.text = 'foo'`
         // DO NOT USE: `this.list[2] = {key: 3, text: 'foo'}}`
         Vue.set(this.list, 2, {key: 3, text: 'foo'})
+        console.log('this.list', this.list)
       },
       mutate: function (e) {
         if (this.list.length % 2) {
@@ -44,6 +47,7 @@
         else {
           this.list.pop()
         }
+        console.log('this.list', this.list)
       }
     }
   }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/syntax/template-repeat.vue
----------------------------------------------------------------------
diff --git a/examples/vue/syntax/template-repeat.vue b/examples/vue/syntax/template-repeat.vue
index 3c062ff..e52f3c4 100644
--- a/examples/vue/syntax/template-repeat.vue
+++ b/examples/vue/syntax/template-repeat.vue
@@ -6,11 +6,11 @@
 <template>
   <div>
     <text class="title">Custom item</text>
-    <text class="subtitle" v-for="item in list">{{$index}}-{{item}}</text>
+    <text class="subtitle" v-for="item in list">{{item}}</text>
     <text class="title">Custom key and item</text>
     <text class="subtitle" v-for="(i,v) in list">{{i}}-{{v}}</text>
     <text class="title">Array of Object</text>
-    <text class="subtitle" v-for="item in list2">{{$index}}-{{item.text}}</text>
+    <text class="subtitle" v-for="(item, k, index) in list2">> {{index}}-{{item.text}}</text>
   </div>
 </template>
 
@@ -21,21 +21,23 @@
 
 <script>
   module.exports = {
-    data: {
-      list: [
-        'a',
-        'b',
-        'c',
-        'd',
-        'e'
-      ],
-      list2: [
-        {text: 'a'},
-        {text: 'b'},
-        {text: 'c'},
-        {text: 'd'},
-        {text: 'e'}
-      ]
+    data: function () {
+      return {
+        list: [
+          'a',
+          'b',
+          'c',
+          'd',
+          'e'
+        ],
+        list2: [
+          {text: 'a'},
+          {text: 'b'},
+          {text: 'c'},
+          {text: 'd'},
+          {text: 'e'}
+        ]
+      }
     }
   }
 </script>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/syntax/template-style.vue
----------------------------------------------------------------------
diff --git a/examples/vue/syntax/template-style.vue b/examples/vue/syntax/template-style.vue
index dadc13a..c150919 100644
--- a/examples/vue/syntax/template-style.vue
+++ b/examples/vue/syntax/template-style.vue
@@ -11,13 +11,16 @@
 
 <script>
   module.exports = {
-    data: {
-      size: 32,
-      color: '#ff0000'
+    data: function () {
+      return {
+        size: 32,
+        color: '#ff0000'
+      }
     },
     methods: {
       update: function (e) {
         this.size = 48
+        console.log('this.size', this.size)
       }
     }
   }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/template.vue
----------------------------------------------------------------------
diff --git a/examples/vue/template.vue b/examples/vue/template.vue
index 729ed84..ece8af9 100644
--- a/examples/vue/template.vue
+++ b/examples/vue/template.vue
@@ -3,9 +3,9 @@
     <panel title="Dialog" type="primary">
       <tip type="success" value="It's a weex example template." style="margin-bottom: 20px;"></tip>
       <hn level="1" value="H1"></hn>
-      <button type="primary" @click="toast" value="Toast"></button>
+      <button type="primary" @click.native="toast" value="Toast"></button>
       <hn level="2" value="H3"></hn>
-      <button type="warning" @click="toast" value="Toast"></button>
+      <button type="warning" @click.native="toast" value="Toast"></button>
     </panel>
     <panel title="Image" type="primary">
       <tip type="warning" value="Weex screen width is 750" style="margin-bottom: 20px;"></tip>
@@ -18,18 +18,18 @@
 </template>
 
 <script>
-  var getBaseURL = require('./include/base-url.js').getBaseURL
-  var baseURL = getBaseURL(this)
   var modal = require('@weex-module/modal')
   module.exports = {
-    data: {
-      img: '//gw.alicdn.com/tps/i2/TB1DpsmMpXXXXabaXXX20ySQVXX-512-512.png_400x400.jpg'
+    data: function () {
+      return {
+        img: '//gw.alicdn.com/tps/i2/TB1DpsmMpXXXXabaXXX20ySQVXX-512-512.png_400x400.jpg'
+      }
     },
     components: {
-      panel: require('weex-vue-components/panel.vue'),
-      hn: require('weex-vue-components/hn.vue'),
-      tip: require('weex-vue-components/tip.vue'),
-      button: require('weex-vue-components/button.vue')
+      panel: require('./include/panel.vue'),
+      hn: require('./include/hn.vue'),
+      tip: require('./include/tip.vue'),
+      button: require('./include/button.vue')
     },
     methods: {
       toast: function() {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/test.vue
----------------------------------------------------------------------
diff --git a/examples/vue/test.vue b/examples/vue/test.vue
deleted file mode 100644
index e47e331..0000000
--- a/examples/vue/test.vue
+++ /dev/null
@@ -1,16 +0,0 @@
-<template>
-  <foo>
-    <text>{{x}}</text>
-  </foo>
-</template>
-
-<script>
-  module.exports = {
-    data: {
-      x: 'xxx'
-    },
-    components: {
-      foo: require('./test2.vue')
-    }
-  }
-</script>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/examples/vue/test2.vue
----------------------------------------------------------------------
diff --git a/examples/vue/test2.vue b/examples/vue/test2.vue
deleted file mode 100644
index ce7cb34..0000000
--- a/examples/vue/test2.vue
+++ /dev/null
@@ -1,6 +0,0 @@
-<template>
-  <div>
-    <text>World</text>
-    <slot></slot>
-  </div>
-</template>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/frameworks/index.js
----------------------------------------------------------------------
diff --git a/html5/frameworks/index.js b/html5/frameworks/index.js
index 1b21251..1e3d409 100644
--- a/html5/frameworks/index.js
+++ b/html5/frameworks/index.js
@@ -1,9 +1,11 @@
 import * as Vanilla from './vanilla/index'
 import * as Vue from 'weex-vue-framework'
 import * as Weex from './legacy/index'
+import Rax from 'weex-rax-framework'
 
 export default {
   Vanilla,
   Vue,
+  Rax,
   Weex
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/frameworks/legacy/api/methods.js
----------------------------------------------------------------------
diff --git a/html5/frameworks/legacy/api/methods.js b/html5/frameworks/legacy/api/methods.js
index 6a26119..29449c6 100644
--- a/html5/frameworks/legacy/api/methods.js
+++ b/html5/frameworks/legacy/api/methods.js
@@ -1,15 +1,6 @@
 /**
  * @fileOverview The api for invoking with "$" prefix
  */
-import config from '../config'
-
-const { nativeComponentMap } = config
-
-/**
- * ==========================================================
- * common
- * ==========================================================
- */
 
 /**
  * @deprecated use $vm instead
@@ -26,25 +17,6 @@ export function $ (id) {
   }
 }
 
-function addComponentMethods (app, el) {
-  if (el && el.type) {
-    const component = nativeComponentMap[el.type]
-    if (component && component.methods) {
-      component.methods.forEach((method) => {
-        el[method] = (...args) => {
-          app.callTasks({
-            component: component.type,
-            ref: el.ref,
-            method: method,
-            args: args
-          })
-        }
-      })
-    }
-  }
-  return el
-}
-
 /**
  * find the element by id
  * Note: there is only one id in whole component
@@ -54,7 +26,7 @@ function addComponentMethods (app, el) {
 export function $el (id) {
   const info = this._ids[id]
   if (info) {
-    return addComponentMethods(info.vm._app || {}, info.el)
+    return info.el
   }
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/frameworks/legacy/app/bundle/bootstrap.js
----------------------------------------------------------------------
diff --git a/html5/frameworks/legacy/app/bundle/bootstrap.js b/html5/frameworks/legacy/app/bundle/bootstrap.js
index a2980cf..b6d0cac 100644
--- a/html5/frameworks/legacy/app/bundle/bootstrap.js
+++ b/html5/frameworks/legacy/app/bundle/bootstrap.js
@@ -1,6 +1,7 @@
 import semver from 'semver'
 import Vm from '../../vm/index'
 import * as downgrade from '../downgrade'
+import { setViewport } from '../viewport'
 import {
   requireCustomComponent
 } from '../register'
@@ -61,6 +62,11 @@ export function bootstrap (app, name, config, data) {
     return new Error(`Downgrade[${downgradeResult.code}]: ${downgradeResult.errorMessage}`)
   }
 
+  // set viewport
+  if (config.viewport) {
+    setViewport(app, config.viewport)
+  }
+
   // 3. create a new Vm with custom component name and data
   app.vm = new Vm(cleanName, null, { _app: app }, null, data)
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/frameworks/legacy/app/ctrl/init.js
----------------------------------------------------------------------
diff --git a/html5/frameworks/legacy/app/ctrl/init.js b/html5/frameworks/legacy/app/ctrl/init.js
index a3fb93a..0e5d0be 100644
--- a/html5/frameworks/legacy/app/ctrl/init.js
+++ b/html5/frameworks/legacy/app/ctrl/init.js
@@ -22,7 +22,7 @@ import { updateActions } from './misc'
  * @param  {string} code
  * @param  {object} data
  */
-export function init (app, code, data) {
+export function init (app, code, data, services) {
   console.debug('[JS Framework] Intialize an instance with:\n', data)
   let result
 
@@ -49,6 +49,17 @@ export function init (app, code, data) {
   /* istanbul ignore next */
   const bundleRequireModule = name => app.requireModule(removeWeexPrefix(name))
 
+  const weexGlobalObject = {
+    config: app.options,
+    define: bundleDefine,
+    bootstrap: bundleBootstrap,
+    requireModule: bundleRequireModule,
+    document: bundleDocument,
+    Vm: bundleVm
+  }
+
+  Object.freeze(weexGlobalObject)
+
   // prepare code
   let functionBody
   /* istanbul ignore if */
@@ -61,30 +72,28 @@ export function init (app, code, data) {
   else if (code) {
     functionBody = code.toString()
   }
-
   // wrap IFFE and use strict mode
-  functionBody = `(function(global){"use strict"; ${functionBody} })(Object.create(this))`
+  functionBody = `(function(global){\n\n"use strict";\n\n ${functionBody} \n\n})(Object.create(this))`
 
   // run code and get result
   const { WXEnvironment } = global
+  const timerAPIs = {}
   /* istanbul ignore if */
   if (WXEnvironment && WXEnvironment.platform !== 'Web') {
     // timer APIs polyfill in native
     const timer = app.requireModule('timer')
-    const timerAPIs = {
+    Object.assign(timerAPIs, {
       setTimeout: (...args) => {
         const handler = function () {
           args[0](...args.slice(2))
         }
         timer.setTimeout(handler, args[1])
-        return app.uid.toString()
       },
       setInterval: (...args) => {
         const handler = function () {
           args[0](...args.slice(2))
         }
         timer.setInterval(handler, args[1])
-        return app.uid.toString()
       },
       clearTimeout: (n) => {
         timer.clearTimeout(n)
@@ -92,73 +101,42 @@ export function init (app, code, data) {
       clearInterval: (n) => {
         timer.clearInterval(n)
       }
-    }
-
-    const fn = new Function(
-      'define',
-      'require',
-      'document',
-      'bootstrap',
-      'register',
-      'render',
-      '__weex_define__', // alias for define
-      '__weex_bootstrap__', // alias for bootstrap
-      '__weex_document__', // alias for bootstrap
-      '__weex_require__',
-      '__weex_viewmodel__',
-      'setTimeout',
-      'setInterval',
-      'clearTimeout',
-      'clearInterval',
-      functionBody
-    )
-
-    fn(
-      bundleDefine,
-      bundleRequire,
-      bundleDocument,
-      bundleBootstrap,
-      bundleRegister,
-      bundleRender,
-      bundleDefine,
-      bundleBootstrap,
-      bundleDocument,
-      bundleRequireModule,
-      bundleVm,
-      timerAPIs.setTimeout,
-      timerAPIs.setInterval,
-      timerAPIs.clearTimeout,
-      timerAPIs.clearInterval)
+    })
   }
-  else {
-    const fn = new Function(
-      'define',
-      'require',
-      'document',
-      'bootstrap',
-      'register',
-      'render',
-      '__weex_define__', // alias for define
-      '__weex_bootstrap__', // alias for bootstrap
-      '__weex_document__', // alias for bootstrap
-      '__weex_require__',
-      '__weex_viewmodel__',
-      functionBody
-    )
+  // run code and get result
+  const globalObjects = Object.assign({
+    define: bundleDefine,
+    require: bundleRequire,
+    bootstrap: bundleBootstrap,
+    register: bundleRegister,
+    render: bundleRender,
+    __weex_define__: bundleDefine, // alias for define
+    __weex_bootstrap__: bundleBootstrap, // alias for bootstrap
+    __weex_document__: bundleDocument,
+    __weex_require__: bundleRequireModule,
+    __weex_viewmodel__: bundleVm,
+    weex: weexGlobalObject
+  }, timerAPIs, services)
+  callFunction(globalObjects, functionBody)
 
-    fn(
-      bundleDefine,
-      bundleRequire,
-      bundleDocument,
-      bundleBootstrap,
-      bundleRegister,
-      bundleRender,
-      bundleDefine,
-      bundleBootstrap,
-      bundleDocument,
-      bundleRequireModule,
-      bundleVm)
+  return result
+}
+
+/**
+ * Call a new function body with some global objects.
+ * @param  {object} globalObjects
+ * @param  {string} code
+ * @return {any}
+ */
+function callFunction (globalObjects, body) {
+  const globalKeys = []
+  const globalValues = []
+  for (const key in globalObjects) {
+    globalKeys.push(key)
+    globalValues.push(globalObjects[key])
   }
+  globalKeys.push(body)
 
-  return result
+  const result = new Function(...globalKeys)
+  return result(...globalValues)
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/frameworks/legacy/app/ctrl/misc.js
----------------------------------------------------------------------
diff --git a/html5/frameworks/legacy/app/ctrl/misc.js b/html5/frameworks/legacy/app/ctrl/misc.js
index b1940d2..847cb16 100644
--- a/html5/frameworks/legacy/app/ctrl/misc.js
+++ b/html5/frameworks/legacy/app/ctrl/misc.js
@@ -10,7 +10,6 @@
  * corresponded with the API of instance manager (framework.js)
  */
 import { extend, typof } from '../../util/index'
-import renderer from '../../config'
 
 /**
  * Refresh an app with data to its root component options.
@@ -22,16 +21,14 @@ export function refresh (app, data) {
             `in instance[${app.id}]`)
   const vm = app.vm
   if (vm && data) {
-    // app.doc.close()
     if (typeof vm.refreshData === 'function') {
       vm.refreshData(data)
     }
     else {
       extend(vm, data)
     }
-    updateActions(app)
-    app.doc.listener.refreshFinish()
-    // app.doc.open()
+    app.differ.flush()
+    app.doc.taskCenter.send('dom', { action: 'refreshFinish' }, [])
     return
   }
   return new Error(`invalid data "${data}"`)
@@ -52,11 +49,11 @@ export function destroy (app) {
   app.options = null
   app.blocks = null
   app.vm = null
+  app.doc.taskCenter.destroyCallback()
   app.doc.destroy()
   app.doc = null
   app.customComponentMap = null
   app.commonModules = null
-  app.callbacks = null
 }
 
 /**
@@ -131,11 +128,9 @@ export function fireEvent (app, ref, type, e, domChanges) {
   }
   const el = app.doc.getRef(ref)
   if (el) {
-    // app.doc.close()
     const result = app.doc.fireEvent(el, type, e, domChanges)
-    updateActions(app)
-    app.doc.listener.updateFinish()
-    // app.doc.open()
+    app.differ.flush()
+    app.doc.taskCenter.send('dom', { action: 'updateFinish' }, [])
     return result
   }
   return new Error(`invalid element reference "${ref}"`)
@@ -151,19 +146,10 @@ export function fireEvent (app, ref, type, e, domChanges) {
 export function callback (app, callbackId, data, ifKeepAlive) {
   console.debug(`[JS Framework] Invoke a callback(${callbackId}) with`, data,
             `in instance(${app.id})`)
-  const callback = app.callbacks[callbackId]
-  if (typeof callback === 'function') {
-    // app.doc.close()
-    callback(data)
-    if (typeof ifKeepAlive === 'undefined' || ifKeepAlive === false) {
-      app.callbacks[callbackId] = undefined
-    }
-    updateActions(app)
-    app.doc.listener.updateFinish()
-    // app.doc.open()
-    return
-  }
-  return new Error(`invalid callback id "${callbackId}"`)
+  const result = app.doc.taskCenter.callback(callbackId, data, ifKeepAlive)
+  updateActions(app)
+  app.doc.taskCenter.send('dom', { action: 'updateFinish' }, [])
+  return result
 }
 
 /**
@@ -172,14 +158,6 @@ export function callback (app, callbackId, data, ifKeepAlive) {
  */
 export function updateActions (app) {
   app.differ.flush()
-  const tasks = []
-  if (app.doc && app.doc.listener && app.doc.listener.updates.length) {
-    tasks.push(...app.doc.listener.updates)
-    app.doc.listener.updates = []
-  }
-  if (tasks.length) {
-    return callTasks(app, tasks)
-  }
 }
 
 /**
@@ -188,50 +166,23 @@ export function updateActions (app) {
  * @param  {array}  tasks
  */
 export function callTasks (app, tasks) {
+  let result
+
   /* istanbul ignore next */
   if (typof(tasks) !== 'array') {
     tasks = [tasks]
   }
 
-  tasks.forEach((task) => {
-    task.args = task.args.map(arg => normalize(arg, app))
+  tasks.forEach(task => {
+    result = app.doc.taskCenter.send(
+      'module',
+      {
+        module: task.module,
+        method: task.method
+      },
+      task.args
+    )
   })
 
-  return renderer.sendTasks(app.id, tasks, '-1')
-}
-
-/**
- * Normalize a value. Specially, if the value is a function, then generate a function id
- * and save it to `app.callbacks`, at last return the function id.
- * @param  {any}        v
- * @param  {object}     app
- * @return {primitive}
- */
-function normalize (v, app) {
-  const type = typof(v)
-
-  switch (type) {
-    case 'undefined':
-    case 'null':
-      return ''
-    case 'regexp':
-      return v.toString()
-    case 'date':
-      return v.toISOString()
-    case 'number':
-    case 'string':
-    case 'boolean':
-    case 'array':
-    case 'object':
-      if (v instanceof renderer.Element) {
-        return v.ref
-      }
-      return v
-    case 'function':
-      app.callbacks[++app.uid] = v
-      return app.uid.toString()
-    /* istanbul ignore next */
-    default:
-      return JSON.stringify(v)
-  }
+  return result
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/frameworks/legacy/app/index.js
----------------------------------------------------------------------
diff --git a/html5/frameworks/legacy/app/index.js b/html5/frameworks/legacy/app/index.js
index cb646fb..c54d3f4 100644
--- a/html5/frameworks/legacy/app/index.js
+++ b/html5/frameworks/legacy/app/index.js
@@ -18,14 +18,14 @@ App.prototype.requireModule = function (name) {
  * @deprecated
  */
 App.prototype.updateActions = function () {
-  updateActions(this)
+  return updateActions(this)
 }
 
 /**
  * @deprecated
  */
 App.prototype.callTasks = function (tasks) {
-  callTasks(this, tasks)
+  return callTasks(this, tasks)
 }
 
 /**

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/frameworks/legacy/app/instance.js
----------------------------------------------------------------------
diff --git a/html5/frameworks/legacy/app/instance.js b/html5/frameworks/legacy/app/instance.js
index f2edb82..dda49ce 100644
--- a/html5/frameworks/legacy/app/instance.js
+++ b/html5/frameworks/legacy/app/instance.js
@@ -17,7 +17,8 @@ export default function App (id, options) {
   this.vm = null
   this.customComponentMap = {}
   this.commonModules = {}
-  this.callbacks = {}
+
+  // document
   this.doc = new renderer.Document(
     id,
     this.options.bundleUrl,
@@ -25,5 +26,4 @@ export default function App (id, options) {
     renderer.Listener
   )
   this.differ = new Differ(id)
-  this.uid = 0
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/frameworks/legacy/app/register.js
----------------------------------------------------------------------
diff --git a/html5/frameworks/legacy/app/register.js b/html5/frameworks/legacy/app/register.js
index 7df649f..a7075e3 100644
--- a/html5/frameworks/legacy/app/register.js
+++ b/html5/frameworks/legacy/app/register.js
@@ -59,8 +59,6 @@ export function initMethods (Vm, apis) {
   }
 }
 
-// for app
-
 /**
  * get a module of methods for an app instance
  */
@@ -68,10 +66,25 @@ export function requireModule (app, name) {
   const methods = nativeModules[name]
   const target = {}
   for (const methodName in methods) {
-    target[methodName] = (...args) => app.callTasks({
-      module: name,
-      method: methodName,
-      args: args
+    Object.defineProperty(target, methodName, {
+      configurable: true,
+      enumerable: true,
+      get: function moduleGetter () {
+        return (...args) => app.callTasks({
+          module: name,
+          method: methodName,
+          args: args
+        })
+      },
+      set: function moduleSetter (value) {
+        if (typeof value === 'function') {
+          return app.callTasks({
+            module: name,
+            method: methodName,
+            args: [value]
+          })
+        }
+      }
     })
   }
   return target

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/frameworks/legacy/app/viewport.js
----------------------------------------------------------------------
diff --git a/html5/frameworks/legacy/app/viewport.js b/html5/frameworks/legacy/app/viewport.js
new file mode 100644
index 0000000..3d0a6c1
--- /dev/null
+++ b/html5/frameworks/legacy/app/viewport.js
@@ -0,0 +1,38 @@
+export function setViewport (app, configs = {}) {
+  /* istanbul ignore if */
+  if (process.env.NODE_ENV === 'development') {
+    console.debug(`[JS Framework] Set viewport (width: ${configs.width}) for app#${app.id}.`)
+    validateViewport(configs)
+  }
+
+  // Send viewport configs to native
+  if (app && app.callTasks) {
+    return app.callTasks([{
+      module: 'meta',
+      method: 'setViewport',
+      args: [configs]
+    }])
+  }
+
+  /* istanbul ignore next */
+  else if (process.env.NODE_ENV === 'development') {
+    console.warn(`[JS Framework] Can't find "callTasks" method on current app.`)
+  }
+}
+
+/**
+ * Validate the viewport config.
+ * @param {Object} configs
+ */
+export function validateViewport (configs = {}) {
+  const { width } = configs
+  if (width) {
+    if (typeof width !== 'number' && width !== 'device-width') {
+      console.warn(`[JS Framework] Not support to use ${width} as viewport width.`)
+      return false
+    }
+    return true
+  }
+  console.warn('[JS Framework] the viewport config should contain the "width" property.')
+  return false
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/frameworks/legacy/static/create.js
----------------------------------------------------------------------
diff --git a/html5/frameworks/legacy/static/create.js b/html5/frameworks/legacy/static/create.js
index 5411903..b81c9d3 100644
--- a/html5/frameworks/legacy/static/create.js
+++ b/html5/frameworks/legacy/static/create.js
@@ -8,10 +8,13 @@ import { resetTarget } from '../core/dep'
  *
  * @param  {string} id
  * @param  {string} code
- * @param  {object} [options] option `HAS_LOG` enable print log
- * @param  {object} [data]
+ * @param  {object} options
+ *         option `HAS_LOG` enable print log
+ * @param  {object} data
+ * @param  {object} info { created, ... services }
  */
-export function createInstance (id, code, options, data) {
+export function createInstance (id, code, options, data, info) {
+  const { services } = info || {}
   resetTarget()
   let instance = instanceMap[id]
   /* istanbul ignore else */
@@ -21,7 +24,7 @@ export function createInstance (id, code, options, data) {
   if (!instance) {
     instance = new App(id, options)
     instanceMap[id] = instance
-    result = initApp(instance, code, data)
+    result = initApp(instance, code, data, services)
   }
   else {
     result = new Error(`invalid instance id "${id}"`)

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/frameworks/legacy/vm/directive.js
----------------------------------------------------------------------
diff --git a/html5/frameworks/legacy/vm/directive.js b/html5/frameworks/legacy/vm/directive.js
index 7268dd4..b1c2527 100644
--- a/html5/frameworks/legacy/vm/directive.js
+++ b/html5/frameworks/legacy/vm/directive.js
@@ -192,7 +192,7 @@ export function setId (vm, el, id, target) {
   if (typeof id === 'function') {
     const handler = id
     id = handler.call(vm)
-    if (id) {
+    if (id || id === 0) {
       vm._ids[id] = map
     }
     watch(vm, handler, (newId) => {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/frameworks/vanilla/index.js
----------------------------------------------------------------------
diff --git a/html5/frameworks/vanilla/index.js b/html5/frameworks/vanilla/index.js
index b26e05c..b5ed952 100644
--- a/html5/frameworks/vanilla/index.js
+++ b/html5/frameworks/vanilla/index.js
@@ -17,9 +17,10 @@ function registerMethods (apis) {}
 
 function prepareInstance (id, options, data) {}
 
-function createInstance (id, code, options, data) {
+function createInstance (id, code, options, data, serviceObjects) {
   const document = new config.Document(id, options.bundleUrl)
   const callbacks = {}
+
   let lastCallbackId = 0
   document.addCallback = func => {
     lastCallbackId++
@@ -34,27 +35,25 @@ function createInstance (id, code, options, data) {
     return callback(data)
   }
   instanceMap[id] = document
-  const result = new Function(
-    'Document',
-    'Element',
-    'Comment',
-    'sendTasks',
-    'id',
-    'options',
-    'data',
-    'document',
-    code
-  )
-  return result(
-    config.Document,
-    config.Element,
-    config.Comment,
-    config.sendTasks,
-    id,
-    options,
-    data,
-    document
-  )
+
+  const globalObjects = Object.assign({
+    Document: config.Document,
+    Element: config.Element,
+    Comment: config.Comment,
+    sendTasks: config.sendTasks,
+    id, options, data, document
+  }, serviceObjects)
+
+  const globalKeys = []
+  const globalValues = []
+  for (const key in globalObjects) {
+    globalKeys.push(key)
+    globalValues.push(globalObjects[key])
+  }
+  globalKeys.push(code)
+
+  const result = new Function(...globalKeys)
+  return result(...globalValues)
 }
 
 function refreshInstance (id, data) {}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/render/native/index.js
----------------------------------------------------------------------
diff --git a/html5/render/native/index.js b/html5/render/native/index.js
index 58ed57a..f989ba0 100644
--- a/html5/render/native/index.js
+++ b/html5/render/native/index.js
@@ -1,14 +1,18 @@
 import { subversion } from '../../../package.json'
 import runtime from '../../runtime'
 import frameworks from '../../frameworks/index'
+import services from '../../services/index'
 
 const { init, config } = runtime
 config.frameworks = frameworks
 const { native, transformer } = subversion
 
+for (const serviceName in services) {
+  runtime.service.register(serviceName, services[serviceName])
+}
+
 runtime.freezePrototype()
 runtime.setNativeConsole()
-runtime.setNativeTimer()
 
 // register framework meta info
 global.frameworkVersion = native



[38/50] [abbrv] incubator-weex git commit: Merge pull request #2612 from alibaba/jsfm-feature-0.19

Posted by ji...@apache.org.
Merge pull request #2612 from alibaba/jsfm-feature-0.19

[jsfm] Merge jsfm-feature-0.19 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/e37ebc35
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/e37ebc35
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/e37ebc35

Branch: refs/heads/master
Commit: e37ebc35e07be4dd1242b8cfef038c45ded4962f
Parents: a1e612b 579d27d
Author: sospartan zheng <so...@apache.org>
Authored: Fri Feb 17 10:29:23 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Fri Feb 17 10:29:23 2017 +0800

----------------------------------------------------------------------
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/e37ebc35/package.json
----------------------------------------------------------------------


[21/50] [abbrv] incubator-weex git commit: Merge branch 'v0.10.0-stable' of gitlab.alibaba-inc.com:weex/weex into v0.10.0-stable

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

* 'v0.10.0-stable' of gitlab.alibaba-inc.com:weex/weex: (583 commits)
  [android] add wx unit. change to submit on 0.10.0 in order to publish on March 1.
  + [jsfm] add callback destory
  + [jsfm] add component callback support
  * [jsfm] fix lint
  * [html5] fix compatibility problem & support deps arguments.
  * [android] modify android inspector version
  Android feature urlconnection interceptor (#92)
  * [test] revert android ci command
  * [ios] update weexSDK version number.
  * [ios] update weexSDK version
  * [ios] support textarea padding
  * [ios] rename method
  * [ios] ensure default modules/components/handlers are ready before create instance.
  * [ios] adjust notify time
  * [ios] notify component readyToShow
  * [ios] prevent loadmore event from being triggered while pulling down.
  * [ios] fix bug: text input padding is not right
  * [ios] format code
  * [ios] fix compiler complains
  * [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/36ed260d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/36ed260d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/36ed260d

Branch: refs/heads/master
Commit: 36ed260d7b3ecf589319c98b7af4883c9d1edc69
Parents: b512311 75e1a2d
Author: xkli <56...@qq.com>
Authored: Thu Feb 16 13:09:12 2017 +0800
Committer: xkli <56...@qq.com>
Committed: Thu Feb 16 13:09:12 2017 +0800

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

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



[46/50] [abbrv] incubator-weex git commit: Merge pull request #2598 from acton393/dev

Posted by ji...@apache.org.
Merge pull request #2598 from acton393/dev

doc for component 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/dd44ab54
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/dd44ab54
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/dd44ab54

Branch: refs/heads/master
Commit: dd44ab54f3ddbd51c90cc0a16bb8fc8e77082c03
Parents: 85f9fe2 a289793
Author: \u52fe\u4e09\u80a1\u56db <zh...@me.com>
Authored: Fri Feb 17 13:52:47 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Fri Feb 17 13:52:47 2017 +0800

----------------------------------------------------------------------
 .../cn/references/advanced/extend-to-android.md |  26 ++++
 .../cn/references/advanced/extend-to-ios.md     |  45 +++++-
 .../cn/v-0.10/advanced/extend-to-android.md     |  27 +++-
 doc/source/cn/v-0.10/advanced/extend-to-ios.md  | 154 ++++++++++++++++++-
 .../references/advanced/extend-to-android.md    |  27 ++++
 doc/source/references/advanced/extend-to-ios.md |  42 ++++-
 doc/source/v-0.10/advanced/extend-to-android.md |  57 +++++--
 doc/source/v-0.10/advanced/extend-to-ios.md     |  39 +++++
 8 files changed, 397 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/dd44ab54/doc/source/references/advanced/extend-to-android.md
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/dd44ab54/doc/source/references/advanced/extend-to-ios.md
----------------------------------------------------------------------


[02/50] [abbrv] incubator-weex git commit: Merge pull request #2547 from myhirra/html5-feature-0.10

Posted by ji...@apache.org.
Merge pull request #2547 from myhirra/html5-feature-0.10

* [html5] add configurable VIEWPORT_WIDTH 

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

Branch: refs/heads/master
Commit: 308e1de1de19b759eaa5d91078d11faef23da441
Parents: 9e619aa 6a163c2
Author: Hanks <zh...@gmail.com>
Authored: Wed Feb 15 23:17:57 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Wed Feb 15 23:17:57 2017 +0800

----------------------------------------------------------------------
 build/config.js                  | 1 +
 html5/render/vue/env/viewport.js | 2 +-
 2 files changed, 2 insertions(+), 1 deletion(-)
----------------------------------------------------------------------



[16/50] [abbrv] incubator-weex git commit: V0.10.0 stable gitlab (#178)

Posted by ji...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/runtime/callback-manager.js
----------------------------------------------------------------------
diff --git a/html5/runtime/callback-manager.js b/html5/runtime/callback-manager.js
new file mode 100644
index 0000000..3dad20d
--- /dev/null
+++ b/html5/runtime/callback-manager.js
@@ -0,0 +1,37 @@
+/**
+ * For general callback management of a certain Weex instance.
+ * Because function can not passed into native, so we create callback
+ * callback id for each function and pass the callback id into native
+ * in fact. And when a callback called from native, we can find the real
+ * callback through the callback id we have passed before.
+ */
+export default class CallbackManager {
+  constructor (instanceId) {
+    this.instanceId = instanceId
+    this.lastCallbackId = 0
+    this.callbacks = []
+  }
+  add (callback) {
+    this.lastCallbackId++
+    this.callbacks[this.lastCallbackId] = callback
+    return this.lastCallbackId
+  }
+  remove (callbackId) {
+    const callback = this.callbacks[callbackId]
+    this.callbacks[callbackId] = undefined
+    return callback
+  }
+  consume (callbackId, data, ifKeepAlive) {
+    const callback = this.callbacks[callbackId]
+    if (typeof ifKeepAlive === 'undefined' || ifKeepAlive === false) {
+      this.callbacks[callbackId] = undefined
+    }
+    if (typeof callback === 'function') {
+      return callback(data)
+    }
+    return new Error(`invalid callback id "${callbackId}"`)
+  }
+  close () {
+    this.callbacks = this.callbacks.map(cb => undefined)
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/runtime/config.js
----------------------------------------------------------------------
diff --git a/html5/runtime/config.js b/html5/runtime/config.js
new file mode 100644
index 0000000..d69d44e
--- /dev/null
+++ b/html5/runtime/config.js
@@ -0,0 +1,15 @@
+import { Document, Element, Comment } from './vdom'
+import Listener from './listener'
+import { TaskCenter } from './task-center'
+
+const config = {
+  Document, Element, Comment, Listener,
+  TaskCenter,
+  sendTasks (...args) {
+    return global.callNative(...args)
+  }
+}
+
+Document.handler = config.sendTasks
+
+export default config

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/runtime/handler.js
----------------------------------------------------------------------
diff --git a/html5/runtime/handler.js b/html5/runtime/handler.js
index c285d65..21a68bd 100644
--- a/html5/runtime/handler.js
+++ b/html5/runtime/handler.js
@@ -21,7 +21,7 @@ const handlerMap = {
  * @return {function} taskHandler
  */
 export function createHandler (id, handler) {
-  const defaultHandler = handler || callNative
+  const defaultHandler = handler || global.callNative
 
   /* istanbul ignore if */
   if (typeof defaultHandler !== 'function') {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/runtime/index.js
----------------------------------------------------------------------
diff --git a/html5/runtime/index.js b/html5/runtime/index.js
index 88c6381..aaa3423 100644
--- a/html5/runtime/index.js
+++ b/html5/runtime/index.js
@@ -6,30 +6,27 @@
  */
 
 import * as shared from '../shared'
-import { Document, Element, Comment } from './vdom'
-import Listener from './listener'
-import init from './init'
 
-const config = {
-  Document, Element, Comment, Listener,
-  sendTasks (...args) {
-    return global.callNative(...args)
-  }
-}
+import init from './init'
+import config from './config'
 
-Document.handler = config.sendTasks
+import {
+  register,
+  unregister,
+  has
+} from './service'
 
 /* istanbul ignore next */
 function freezePrototype () {
   shared.freezePrototype()
 
-  Object.freeze(Element)
-  Object.freeze(Comment)
-  Object.freeze(Listener)
-  Object.freeze(Document.prototype)
-  Object.freeze(Element.prototype)
-  Object.freeze(Comment.prototype)
-  Object.freeze(Listener.prototype)
+  Object.freeze(config.Element)
+  Object.freeze(config.Comment)
+  Object.freeze(config.Listener)
+  Object.freeze(config.Document.prototype)
+  Object.freeze(config.Element.prototype)
+  Object.freeze(config.Comment.prototype)
+  Object.freeze(config.Listener.prototype)
 }
 
 export default {
@@ -37,6 +34,7 @@ export default {
   resetNativeConsole: shared.resetNativeConsole,
   setNativeTimer: shared.setNativeTimer,
   resetNativeTimer: shared.resetNativeTimer,
+  service: { register, unregister, has },
   freezePrototype,
   init,
   config

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/runtime/init.js
----------------------------------------------------------------------
diff --git a/html5/runtime/init.js b/html5/runtime/init.js
index 1cba7ca..ad44460 100644
--- a/html5/runtime/init.js
+++ b/html5/runtime/init.js
@@ -1,4 +1,9 @@
+import { init as initTaskHandler } from './task-center'
+import { registerElement } from './vdom/element-types'
+import { services, register, unregister } from './service'
+
 let frameworks
+let runtimeConfig
 
 const versionRegExp = /^\s*\/\/ *(\{[^}]*\}) *\r?\n/
 
@@ -21,6 +26,26 @@ function checkVersion (code) {
   return info
 }
 
+function createServices (id, env, config) {
+  // Init JavaScript services for this instance.
+  const serviceMap = Object.create(null)
+  serviceMap.service = Object.create(null)
+  services.forEach(({ name, options }) => {
+    if (process.env.NODE_ENV === 'development') {
+      console.debug(`[JS Runtime] create service ${name}.`)
+    }
+    const create = options.create
+    if (create) {
+      const result = create(id, env, config)
+      Object.assign(serviceMap.service, result)
+      Object.assign(serviceMap, result.instance)
+    }
+  })
+  delete serviceMap.service.instance
+  Object.freeze(serviceMap.service)
+  return serviceMap
+}
+
 const instanceMap = {}
 
 /**
@@ -33,24 +58,38 @@ const instanceMap = {}
  */
 function createInstance (id, code, config, data) {
   let info = instanceMap[id]
+
   if (!info) {
+    // Init instance info.
     info = checkVersion(code) || {}
     if (!frameworks[info.framework]) {
       info.framework = 'Weex'
     }
-    info.created = Date.now()
-    instanceMap[id] = info
+
+    // Init instance config.
     config = JSON.parse(JSON.stringify(config || {}))
     config.bundleVersion = info.version
     config.env = JSON.parse(JSON.stringify(global.WXEnvironment || {}))
     console.debug(`[JS Framework] create an ${info.framework}@${config.bundleVersion} instance from ${config.bundleVersion}`)
-    return frameworks[info.framework].createInstance(id, code, config, data)
+
+    const env = {
+      info,
+      config,
+      created: Date.now(),
+      framework: info.framework
+    }
+    env.services = createServices(id, env, runtimeConfig)
+    instanceMap[id] = env
+
+    return frameworks[info.framework].createInstance(id, code, config, data, env)
   }
   return new Error(`invalid instance id "${id}"`)
 }
 
 const methods = {
-  createInstance
+  createInstance,
+  registerService: register,
+  unregisterService: unregister
 }
 
 /**
@@ -59,6 +98,9 @@ const methods = {
  */
 function genInit (methodName) {
   methods[methodName] = function (...args) {
+    if (methodName === 'registerComponents') {
+      checkComponentMethods(args[0])
+    }
     for (const name in frameworks) {
       const framework = frameworks[name]
       if (framework && framework[methodName]) {
@@ -68,6 +110,16 @@ function genInit (methodName) {
   }
 }
 
+function checkComponentMethods (components) {
+  if (Array.isArray(components)) {
+    components.forEach((name) => {
+      if (name && name.type && name.methods) {
+        registerElement(name.type, name.methods)
+      }
+    })
+  }
+}
+
 /**
  * Register methods which will be called for each instance.
  * @param {string} methodName
@@ -78,9 +130,26 @@ function genInstance (methodName) {
     const info = instanceMap[id]
     if (info && frameworks[info.framework]) {
       const result = frameworks[info.framework][methodName](...args)
-      if (methodName === 'destroyInstance') {
+
+      // Lifecycle methods
+      if (methodName === 'refreshInstance') {
+        services.forEach(service => {
+          const refresh = service.options.refresh
+          if (refresh) {
+            refresh(id, { info, runtime: runtimeConfig })
+          }
+        })
+      }
+      else if (methodName === 'destroyInstance') {
+        services.forEach(service => {
+          const destroy = service.options.destroy
+          if (destroy) {
+            destroy(id, { info, runtime: runtimeConfig })
+          }
+        })
         delete instanceMap[id]
       }
+
       return result
     }
     return new Error(`invalid instance id "${id}"`)
@@ -105,7 +174,9 @@ function adaptInstance (methodName, nativeMethodName) {
 }
 
 export default function init (config) {
-  frameworks = config.frameworks || {}
+  runtimeConfig = config || {}
+  frameworks = runtimeConfig.frameworks || {}
+  initTaskHandler()
 
   // Init each framework by `init` method and `config` which contains three
   // virtual-DOM Class: `Document`, `Element` & `Comment`, and a JS bridge method:

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/runtime/service.js
----------------------------------------------------------------------
diff --git a/html5/runtime/service.js b/html5/runtime/service.js
new file mode 100644
index 0000000..0773ed6
--- /dev/null
+++ b/html5/runtime/service.js
@@ -0,0 +1,58 @@
+// JS Services
+
+export const services = []
+
+/**
+ * Register a JavaScript service.
+ * A JavaScript service options could have a set of lifecycle methods
+ * for each Weex instance. For example: create, refresh, destroy.
+ * For the JS framework maintainer if you want to supply some features
+ * which need to work well in different Weex instances, even in different
+ * frameworks separately. You can make a JavaScript service to init
+ * its variables or classes for each Weex instance when it's created
+ * and recycle them when it's destroyed.
+ * @param {object} options Could have { create, refresh, destroy }
+ *                         lifecycle methods. In create method it should
+ *                         return an object of what variables or classes
+ *                         would be injected into the Weex instance.
+ */
+export function register (name, options) {
+  if (has(name)) {
+    console.warn(`Service "${name}" has been registered already!`)
+  }
+  else {
+    options = Object.assign({}, options)
+    services.push({ name, options })
+  }
+}
+
+/**
+ * Unregister a JavaScript service by name
+ * @param {string} name
+ */
+export function unregister (name) {
+  services.some((service, index) => {
+    if (service.name === name) {
+      services.splice(index, 1)
+      return true
+    }
+  })
+}
+
+/**
+ * Check if a JavaScript service with a certain name existed.
+ * @param  {string}  name
+ * @return {Boolean}
+ */
+export function has (name) {
+  return indexOf(name) >= 0
+}
+
+/**
+ * Find the index of a JavaScript service by name
+ * @param  {string} name
+ * @return {number}
+ */
+function indexOf (name) {
+  return services.map(service => service.name).indexOf(name)
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/runtime/task-center.js
----------------------------------------------------------------------
diff --git a/html5/runtime/task-center.js b/html5/runtime/task-center.js
new file mode 100644
index 0000000..c39192a
--- /dev/null
+++ b/html5/runtime/task-center.js
@@ -0,0 +1,129 @@
+import CallbackManager from './callback-manager'
+import Element from './vdom/element'
+
+let fallback = function () {}
+
+// The API of TaskCenter would be re-design.
+export class TaskCenter {
+  constructor (id, sendTasks) {
+    Object.defineProperty(this, 'instanceId', {
+      enumerable: true,
+      value: id
+    })
+    Object.defineProperty(this, 'callbackManager', {
+      enumerable: true,
+      value: new CallbackManager()
+    })
+    fallback = sendTasks || function () {}
+  }
+
+  callback (callbackId, data, ifKeepAlive) {
+    return this.callbackManager.consume(callbackId, data, ifKeepAlive)
+  }
+
+  destroyCallback () {
+    return this.callbackManager.close()
+  }
+
+  typof (v) {
+    const s = Object.prototype.toString.call(v)
+    return s.substring(8, s.length - 1).toLowerCase()
+  }
+
+  /**
+   * Normalize a value. Specially, if the value is a function, then generate a function id
+   * and save it to `CallbackManager`, at last return the function id.
+   * @param  {any}        v
+   * @param  {object}     app
+   * @return {primitive}
+   */
+  normalize (v) {
+    const type = this.typof(v)
+
+    switch (type) {
+      case 'undefined':
+      case 'null':
+        return ''
+      case 'regexp':
+        return v.toString()
+      case 'date':
+        return v.toISOString()
+      case 'number':
+      case 'string':
+      case 'boolean':
+      case 'array':
+      case 'object':
+        if (v instanceof Element) {
+          return v.ref
+        }
+        return v
+      case 'function':
+        return this.callbackManager.add(v).toString()
+      /* istanbul ignore next */
+      default:
+        return JSON.stringify(v)
+    }
+  }
+
+  send (type, options, args) {
+    const { action, component, ref, module, method } = options
+
+    args = args.map(arg => this.normalize(arg))
+
+    switch (type) {
+      case 'dom':
+        return this[action](this.instanceId, args)
+      case 'component':
+        return this.componentHandler(this.instanceId, ref, method, args, { component })
+      default:
+        return this.moduleHandler(this.instanceId, module, method, args, {})
+    }
+  }
+
+  callDOM (action, args) {
+    return this[action](this.instanceId, args)
+  }
+
+  callComponent (ref, method, args) {
+    return this.componentHandler(this.instanceId, ref, method, args, {})
+  }
+
+  callModule (module, method, args) {
+    return this.moduleHandler(this.instanceId, module, method, args, {})
+  }
+}
+
+export function init () {
+  const DOM_METHODS = {
+    createFinish: global.callCreateFinish,
+    updateFinish: global.callUpdateFinish,
+    refreshFinish: global.callRefreshFinish,
+
+    createBody: global.callCreateBody,
+
+    addElement: global.callAddElement,
+    removeElement: global.callRemoveElement,
+    moveElement: global.callMoveElement,
+    updateAttrs: global.callUpdateAttrs,
+    updateStyle: global.callUpdateStyle,
+
+    addEvent: global.callAddEvent,
+    removeEvent: global.callRemoveEvent
+  }
+  const proto = TaskCenter.prototype
+
+  for (const name in DOM_METHODS) {
+    const method = DOM_METHODS[name]
+    proto[name] = method ?
+      (id, args) => method(id, ...args) :
+      (id, args) => fallback(id, [{ module: 'dom', method: name, args }], '-1')
+  }
+
+  proto.componentHandler = global.callNativeComponent ||
+    ((id, ref, method, args, options) =>
+      fallback(id, [{ component: options.component, ref, method, args }]))
+
+  proto.moduleHandler = global.callNativeModule ||
+    ((id, module, method, args) =>
+      fallback(id, [{ module, method, args }]))
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/runtime/vdom/document.js
----------------------------------------------------------------------
diff --git a/html5/runtime/vdom/document.js b/html5/runtime/vdom/document.js
index cf6b097..34e8936 100644
--- a/html5/runtime/vdom/document.js
+++ b/html5/runtime/vdom/document.js
@@ -7,6 +7,7 @@ import '../../shared/objectAssign'
 import Comment from './comment'
 import Element from './element'
 import Listener from '../listener'
+import { TaskCenter } from '../task-center'
 import { createHandler } from '../handler'
 import { addDoc, removeDoc, appendBody, setBody } from './operation'
 
@@ -18,7 +19,8 @@ export default function Document (id, url, handler) {
   addDoc(id, this)
   this.nodeMap = {}
   const L = Document.Listener || Listener
-  this.listener = new L(id, handler || createHandler(id, Document.handler))
+  this.listener = new L(id, handler || createHandler(id, Document.handler)) // deprecated
+  this.taskCenter = new TaskCenter(id, handler ? (id, ...args) => handler(...args) : Document.handler)
   this.createDocumentElement()
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/runtime/vdom/element-types.js
----------------------------------------------------------------------
diff --git a/html5/runtime/vdom/element-types.js b/html5/runtime/vdom/element-types.js
new file mode 100644
index 0000000..a4a24cc
--- /dev/null
+++ b/html5/runtime/vdom/element-types.js
@@ -0,0 +1,65 @@
+import { getTaskCenter } from './operation'
+
+let Element
+
+export function setElement (El) {
+  Element = El
+}
+
+/**
+ * A map which stores all type of elements.
+ * @type {Object}
+ */
+export const elementTypes = {}
+
+/**
+ * Register an extended element type with component methods.
+ * @param  {string} type    component type
+ * @param  {array}  methods a list of method names
+ */
+export function registerElement (type, methods) {
+  // Skip when no special component methods.
+  if (!methods || !methods.length) {
+    return
+  }
+
+  // Init constructor.
+  const XElement = function (props) {
+    Element.call(this, type, props, true)
+  }
+
+  // Init prototype.
+  XElement.prototype = Object.create(Element.prototype)
+  Object.defineProperty(XElement.prototype, 'constructor', {
+    configurable: false,
+    enumerable: false,
+    writable: false,
+    value: Element
+  })
+
+  // Add methods to prototype.
+  methods.forEach(methodName => {
+    XElement.prototype[methodName] = function (...args) {
+      const taskCenter = getTaskCenter(this.docId)
+      if (taskCenter) {
+        return taskCenter.send('component', {
+          ref: this.ref,
+          component: type,
+          method: methodName
+        }, args)
+      }
+    }
+  })
+
+  // Add to element type map.
+  elementTypes[type] = XElement
+}
+
+/**
+ * Clear all element types. Only for testing.
+ */
+export function clearElementTypes () {
+  for (const type in elementTypes) {
+    delete elementTypes[type]
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/runtime/vdom/element.js
----------------------------------------------------------------------
diff --git a/html5/runtime/vdom/element.js b/html5/runtime/vdom/element.js
index 2af5054..e7a7526 100644
--- a/html5/runtime/vdom/element.js
+++ b/html5/runtime/vdom/element.js
@@ -7,7 +7,7 @@ import '../../shared/objectAssign'
 import Node from './node'
 import {
   getDoc,
-  getListener,
+  getTaskCenter,
   uniqueId,
   linkParent,
   nextElement,
@@ -16,10 +16,18 @@ import {
   moveIndex,
   removeIndex
 } from './operation'
+import {
+  elementTypes,
+  setElement
+} from './element-types'
 
 const DEFAULT_TAG_NAME = 'div'
 
-export default function Element (type = DEFAULT_TAG_NAME, props) {
+export default function Element (type = DEFAULT_TAG_NAME, props, isExtended) {
+  const XElement = elementTypes[type]
+  if (XElement && !isExtended) {
+    return new XElement(props)
+  }
   props = props || {}
   this.nodeType = 1
   this.nodeId = uniqueId()
@@ -41,6 +49,8 @@ function registerNode (docId, node) {
   doc.nodeMap[node.nodeId] = node
 }
 
+setElement(Element)
+
 Object.assign(Element.prototype, {
   /**
    * Append a child node.
@@ -60,9 +70,13 @@ Object.assign(Element.prototype, {
       }
       if (node.nodeType === 1) {
         insertIndex(node, this.pureChildren, this.pureChildren.length)
-        const listener = getListener(this.docId)
-        if (listener) {
-          return listener.addElement(node, this.ref, -1)
+        const taskCenter = getTaskCenter(this.docId)
+        if (taskCenter) {
+          return taskCenter.send(
+            'dom',
+            { action: 'addElement' },
+            [this.ref, node.toJSON(), -1]
+          )
         }
       }
     }
@@ -70,9 +84,13 @@ Object.assign(Element.prototype, {
       moveIndex(node, this.children, this.children.length, true)
       if (node.nodeType === 1) {
         const index = moveIndex(node, this.pureChildren, this.pureChildren.length)
-        const listener = getListener(this.docId)
-        if (listener && index >= 0) {
-          return listener.moveElement(node.ref, this.ref, index)
+        const taskCenter = getTaskCenter(this.docId)
+        if (taskCenter && index >= 0) {
+          return taskCenter.send(
+            'dom',
+            { action: 'moveElement' },
+            [node.ref, this.ref, index]
+          )
         }
       }
     }
@@ -106,9 +124,13 @@ Object.assign(Element.prototype, {
           ? this.pureChildren.indexOf(pureBefore)
           : this.pureChildren.length
         )
-        const listener = getListener(this.docId)
-        if (listener) {
-          return listener.addElement(node, this.ref, index)
+        const taskCenter = getTaskCenter(this.docId)
+        if (taskCenter) {
+          return taskCenter.send(
+            'dom',
+            { action: 'addElement' },
+            [this.ref, node.toJSON(), index]
+          )
         }
       }
     }
@@ -116,6 +138,7 @@ Object.assign(Element.prototype, {
       moveIndex(node, this.children, this.children.indexOf(before), true)
       if (node.nodeType === 1) {
         const pureBefore = nextElement(before)
+        /* istanbul ignore next */
         const index = moveIndex(
           node,
           this.pureChildren,
@@ -123,9 +146,13 @@ Object.assign(Element.prototype, {
           ? this.pureChildren.indexOf(pureBefore)
           : this.pureChildren.length
         )
-        const listener = getListener(this.docId)
-        if (listener && index >= 0) {
-          return listener.moveElement(node.ref, this.ref, index)
+        const taskCenter = getTaskCenter(this.docId)
+        if (taskCenter && index >= 0) {
+          return taskCenter.send(
+            'dom',
+            { action: 'moveElement' },
+            [node.ref, this.ref, index]
+          )
         }
       }
     }
@@ -157,10 +184,14 @@ Object.assign(Element.prototype, {
           this.pureChildren,
           this.pureChildren.indexOf(previousElement(after)) + 1
         )
-        const listener = getListener(this.docId)
+        const taskCenter = getTaskCenter(this.docId)
         /* istanbul ignore else */
-        if (listener) {
-          return listener.addElement(node, this.ref, index)
+        if (taskCenter) {
+          return taskCenter.send(
+            'dom',
+            { action: 'addElement' },
+            [this.ref, node.toJSON(), index]
+          )
         }
       }
     }
@@ -172,9 +203,13 @@ Object.assign(Element.prototype, {
           this.pureChildren,
           this.pureChildren.indexOf(previousElement(after)) + 1
         )
-        const listener = getListener(this.docId)
-        if (listener && index >= 0) {
-          return listener.moveElement(node.ref, this.ref, index)
+        const taskCenter = getTaskCenter(this.docId)
+        if (taskCenter && index >= 0) {
+          return taskCenter.send(
+            'dom',
+            { action: 'moveElement' },
+            [node.ref, this.ref, index]
+          )
         }
       }
     }
@@ -190,9 +225,13 @@ Object.assign(Element.prototype, {
       removeIndex(node, this.children, true)
       if (node.nodeType === 1) {
         removeIndex(node, this.pureChildren)
-        const listener = getListener(this.docId)
-        if (listener) {
-          listener.removeElement(node.ref)
+        const taskCenter = getTaskCenter(this.docId)
+        if (taskCenter) {
+          taskCenter.send(
+            'dom',
+            { action: 'removeElement' },
+            [node.ref]
+          )
         }
       }
     }
@@ -205,11 +244,15 @@ Object.assign(Element.prototype, {
    * Clear all child nodes.
    */
   clear () {
-    const listener = getListener(this.docId)
+    const taskCenter = getTaskCenter(this.docId)
     /* istanbul ignore else */
-    if (listener) {
+    if (taskCenter) {
       this.pureChildren.forEach(node => {
-        listener.removeElement(node.ref)
+        taskCenter.send(
+          'dom',
+          { action: 'removeElement' },
+          [node.ref]
+        )
       })
     }
     this.children.forEach(node => {
@@ -230,9 +273,15 @@ Object.assign(Element.prototype, {
       return
     }
     this.attr[key] = value
-    const listener = getListener(this.docId)
-    if (!silent && listener) {
-      listener.setAttr(this.ref, key, value)
+    const taskCenter = getTaskCenter(this.docId)
+    if (!silent && taskCenter) {
+      const result = {}
+      result[key] = value
+      taskCenter.send(
+        'dom',
+        { action: 'updateAttrs' },
+        [this.ref, result]
+      )
     }
   },
 
@@ -247,9 +296,15 @@ Object.assign(Element.prototype, {
       return
     }
     this.style[key] = value
-    const listener = getListener(this.docId)
-    if (!silent && listener) {
-      listener.setStyle(this.ref, key, value)
+    const taskCenter = getTaskCenter(this.docId)
+    if (!silent && taskCenter) {
+      const result = {}
+      result[key] = value
+      taskCenter.send(
+        'dom',
+        { action: 'updateStyle' },
+        [this.ref, result]
+      )
     }
   },
 
@@ -264,9 +319,13 @@ Object.assign(Element.prototype, {
     }
 
     Object.assign(this.classStyle, classStyle)
-    const listener = getListener(this.docId)
-    if (listener) {
-      listener.setStyles(this.ref, this.toStyle())
+    const taskCenter = getTaskCenter(this.docId)
+    if (taskCenter) {
+      taskCenter.send(
+        'dom',
+        { action: 'updateStyle' },
+        [this.ref, this.toStyle()]
+      )
     }
   },
 
@@ -278,9 +337,13 @@ Object.assign(Element.prototype, {
   addEvent (type, handler) {
     if (!this.event[type]) {
       this.event[type] = handler
-      const listener = getListener(this.docId)
-      if (listener) {
-        listener.addEvent(this.ref, type)
+      const taskCenter = getTaskCenter(this.docId)
+      if (taskCenter) {
+        taskCenter.send(
+          'dom',
+          { action: 'addEvent' },
+          [this.ref, type]
+        )
       }
     }
   },
@@ -292,9 +355,13 @@ Object.assign(Element.prototype, {
   removeEvent (type) {
     if (this.event[type]) {
       delete this.event[type]
-      const listener = getListener(this.docId)
-      if (listener) {
-        listener.removeEvent(this.ref, type)
+      const taskCenter = getTaskCenter(this.docId)
+      if (taskCenter) {
+        taskCenter.send(
+          'dom',
+          { action: 'removeEvent' },
+          [this.ref, type]
+        )
       }
     }
   },

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/runtime/vdom/index.js
----------------------------------------------------------------------
diff --git a/html5/runtime/vdom/index.js b/html5/runtime/vdom/index.js
index 67a85b4..e2f0ad7 100644
--- a/html5/runtime/vdom/index.js
+++ b/html5/runtime/vdom/index.js
@@ -1,9 +1,15 @@
 import Node from './node'
-import Comment from './comment'
 import Element from './element'
+import Comment from './comment'
 import Document from './document'
 
 export {
+  elementTypes,
+  registerElement,
+  clearElementTypes
+} from './element-types'
+
+export {
   Document,
   Node,
   Element,

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/runtime/vdom/operation.js
----------------------------------------------------------------------
diff --git a/html5/runtime/vdom/operation.js b/html5/runtime/vdom/operation.js
index e9bdd99..7f8c65f 100644
--- a/html5/runtime/vdom/operation.js
+++ b/html5/runtime/vdom/operation.js
@@ -29,6 +29,7 @@ export function removeDoc (id) {
 }
 
 /**
+ * @deprecated
  * Get listener by document id.
  * @param {string} id
  * @return {object} listener
@@ -42,6 +43,19 @@ export function getListener (id) {
 }
 
 /**
+ * Get TaskCenter instance by id.
+ * @param {string} id
+ * @return {object} TaskCenter
+ */
+export function getTaskCenter (id) {
+  const doc = docMap[id]
+  if (doc && doc.taskCenter) {
+    return doc.taskCenter
+  }
+  return null
+}
+
+/**
  * Get a unique id.
  */
 let nextNodeRef = 1
@@ -88,7 +102,7 @@ export function appendBody (doc, node, before) {
       delete doc.nodeMap[node.nodeId]
     }
     documentElement.pureChildren.push(node)
-    doc.listener.createBody(node)
+    sendBody(doc, node)
   }
   else {
     node.parentNode = documentElement
@@ -96,6 +110,19 @@ export function appendBody (doc, node, before) {
   }
 }
 
+function sendBody (doc, node) {
+  const body = node.toJSON()
+  const children = body.children
+  delete body.children
+  let result = doc.taskCenter.send('dom', { action: 'createBody' }, [body])
+  if (children) {
+    children.forEach(child => {
+      result = doc.taskCenter.send('dom', { action: 'addElement' }, [body.ref, child, -1])
+    })
+  }
+  return result
+}
+
 /**
  * Set up body node.
  * @param {object} document

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/services/amd/index.js
----------------------------------------------------------------------
diff --git a/html5/services/amd/index.js b/html5/services/amd/index.js
new file mode 100644
index 0000000..dd5a0eb
--- /dev/null
+++ b/html5/services/amd/index.js
@@ -0,0 +1,86 @@
+/**
+ * @fileOverview
+ * A simple implementation of AMD for weex.
+ */
+
+/**
+ * amd modules (<id, module> pair)
+ *  - id : instance id.
+ *  - module: {
+ *        name: module name
+ *        , factory: module's factory function
+ *        , cached: cached module,
+ *        , deps: module's dependencies, always be [] under most circumstances.
+ *      }
+ */
+const modules = {}
+
+const amdService = {
+
+  // create a amd service.
+  create: (id, env, config) => {
+    if (!env.framework.match(/Vue/i)) {
+      return
+    }
+
+    const mod = {}
+    modules[id] = mod
+    const amdObject = {
+
+      /**
+       * define a module.
+       * @param  {String} name: module name.
+       * @param  {Array} deps: dependencies. Always be empty array.
+       * @param  {function} factory: factory function.
+       */
+      define (name, deps, factory) {
+        if (mod[name]) {
+          console.warn(`[amdService] already defined module: '${name}'`)
+        }
+        if (typeof deps === 'function') {
+          factory = deps
+          deps = []
+        }
+        mod[name] = { name, factory, cached: false, deps }
+      },
+
+      /**
+       * require a module.
+       * @param  {string} name - module name.
+       */
+      require (name) {
+        const servMod = mod[name]
+        if (!servMod) {
+          return console.warn(`[amdService] module '${name}' is not defined.`)
+        }
+        if (servMod.cached) {
+          return servMod.cached
+        }
+        const exports = {}
+        const module = { exports }
+        const { deps } = servMod
+        let ret
+        if (deps && deps.length >= 1) {
+          /**
+           * to support:
+           *   define(name, ['foo', 'bar'], function (foo, bar) { ... })
+           */
+          const args = deps.map(depName => require(depName))
+          ret = servMod.factory(...args)
+        }
+        else {
+          ret = servMod.factory(amdObject.require, exports, module)
+        }
+        servMod.cached = ret || module.exports
+        return servMod.cached
+      }
+    }
+    return { instance: amdObject }
+  },
+
+  destroy: (id, env) => {
+    delete modules[id]
+  }
+}
+
+export default amdService

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/services/broadcast-channel/index.js
----------------------------------------------------------------------
diff --git a/html5/services/broadcast-channel/index.js b/html5/services/broadcast-channel/index.js
new file mode 100644
index 0000000..2e04e30
--- /dev/null
+++ b/html5/services/broadcast-channel/index.js
@@ -0,0 +1,106 @@
+/**
+ * @fileOverview
+ * The polyfill of BroadcastChannel API.
+ * This api can be used to achieve inter-instance communications.
+ *
+ * https://html.spec.whatwg.org/multipage/comms.html#broadcasting-to-other-browsing-contexts
+ */
+
+import { MessageEvent } from './message-event'
+
+const channels = {}
+const instances = {}
+
+/**
+ * An empty constructor for BroadcastChannel polyfill.
+ * The real constructor will be defined when a Weex instance created because
+ * we need to track the channel by Weex instance id.
+ */
+function BroadcastChannel () {}
+
+/**
+ * Sends the given message to other BroadcastChannel objects set up for this channel.
+ * @param {any} message
+ */
+BroadcastChannel.prototype.postMessage = function (message) {
+  if (this._closed) {
+    throw new Error(`BroadcastChannel "${this.name}" is closed.`)
+  }
+
+  const subscribers = channels[this.name]
+  if (subscribers && subscribers.length) {
+    for (let i = 0; i < subscribers.length; ++i) {
+      const member = subscribers[i]
+
+      if (member._closed || member === this) continue
+
+      if (typeof member.onmessage === 'function') {
+        member.onmessage(new MessageEvent('message', { data: message }))
+      }
+    }
+  }
+}
+
+/**
+ * Closes the BroadcastChannel object, opening it up to garbage collection.
+ */
+BroadcastChannel.prototype.close = function () {
+  if (this._closed) {
+    return
+  }
+
+  this._closed = true
+
+  // remove itself from channels.
+  if (channels[this.name]) {
+    const subscribers = channels[this.name].filter(x => x !== this)
+    if (subscribers.length) {
+      channels[this.name] = subscribers
+    }
+    else {
+      delete channels[this.name]
+    }
+  }
+}
+
+export default {
+  create: (id, env, config) => {
+    instances[id] = []
+    if (typeof global.BroadcastChannel === 'function') {
+      return {}
+    }
+    const serviceObject = {
+      /**
+       * Returns a new BroadcastChannel object via which messages for the given
+       * channel name can be sent and received.
+       * @param {string} name
+       */
+      BroadcastChannel: function (name) {
+        // the name property is readonly
+        Object.defineProperty(this, 'name', {
+          configurable: false,
+          enumerable: true,
+          writable: false,
+          value: String(name)
+        })
+
+        this._closed = false
+        this.onmessage = null
+
+        if (!channels[this.name]) {
+          channels[this.name] = []
+        }
+        channels[this.name].push(this)
+        instances[id].push(this)
+      }
+    }
+    serviceObject.BroadcastChannel.prototype = BroadcastChannel.prototype
+    return {
+      instance: serviceObject
+    }
+  },
+  destroy: (id, env) => {
+    instances[id].forEach(channel => channel.close())
+    delete instances[id]
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/services/broadcast-channel/message-event.js
----------------------------------------------------------------------
diff --git a/html5/services/broadcast-channel/message-event.js b/html5/services/broadcast-channel/message-event.js
new file mode 100644
index 0000000..437728e
--- /dev/null
+++ b/html5/services/broadcast-channel/message-event.js
@@ -0,0 +1,21 @@
+/**
+ * Mock MessageEvent type
+ * @param {string} type
+ * @param {object} dict { data, origin, source, ports }
+ *
+ * This type has been simplified.
+ * https://html.spec.whatwg.org/multipage/comms.html#messageevent
+ * https://dom.spec.whatwg.org/#interface-event
+ */
+export function MessageEvent (type, dict = {}) {
+  this.type = type || 'message'
+
+  this.data = dict.data || null
+  this.origin = dict.origin || ''
+  this.source = dict.source || null
+  this.ports = dict.ports || []
+
+  // inherit properties
+  this.target = null
+  this.timeStamp = Date.now()
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/services/index.js
----------------------------------------------------------------------
diff --git a/html5/services/index.js b/html5/services/index.js
new file mode 100644
index 0000000..266a4d3
--- /dev/null
+++ b/html5/services/index.js
@@ -0,0 +1,5 @@
+import BroadcastChannel from './broadcast-channel/index'
+
+export default {
+  BroadcastChannel
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/shared/setTimeout.js
----------------------------------------------------------------------
diff --git a/html5/shared/setTimeout.js b/html5/shared/setTimeout.js
index cc3790f..c0fd472 100644
--- a/html5/shared/setTimeout.js
+++ b/html5/shared/setTimeout.js
@@ -40,3 +40,5 @@ export function resetNativeTimer () {
   global.setTimeout = originalSetTimeout
   global.setTimeoutCallback = null
 }
+
+setNativeTimer()

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/test/case/basic/dynamic-id.output.js
----------------------------------------------------------------------
diff --git a/html5/test/case/basic/dynamic-id.output.js b/html5/test/case/basic/dynamic-id.output.js
new file mode 100644
index 0000000..5029a30
--- /dev/null
+++ b/html5/test/case/basic/dynamic-id.output.js
@@ -0,0 +1,44 @@
+{
+  type: 'div',
+  children: [
+    {
+      type: 'text',
+      attr: {
+        value: 'Hello',
+        a: 1
+      }
+    },
+    {
+      type: 'text',
+      attr: {
+        value: 'Hello',
+        a: 1,
+        b: 1
+      }
+    },
+    {
+      type: 'text',
+      attr: {
+        value: 'Hello'
+      }
+    },
+    {
+      type: 'text',
+      attr: {
+        value: 'Hello'
+      }
+    },
+    {
+      type: 'text',
+      attr: {
+        value: 'Hello'
+      }
+    },
+    {
+      type: 'text',
+      attr: {
+        value: 'Hello'
+      }
+    }
+  ]
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/test/case/basic/dynamic-id.source.js
----------------------------------------------------------------------
diff --git a/html5/test/case/basic/dynamic-id.source.js b/html5/test/case/basic/dynamic-id.source.js
new file mode 100644
index 0000000..d9abf61
--- /dev/null
+++ b/html5/test/case/basic/dynamic-id.source.js
@@ -0,0 +1,76 @@
+define('@weex-component/id', function (require, exports, module) {
+
+;
+  module.exports = {
+    ready: function () {
+      if (this.$el('x')) {
+        this.$el('x').setAttr('a', 1)
+      }
+      if (this.$el('y')) {
+        this.$el('y').setAttr('a', 1)
+      }
+      if (this.$el('')) {
+        this.$el('').setAttr('a', 1)
+      }
+      if (this.$el('0')) {
+        this.$el('0').setAttr('a', 1)
+      }
+      if (this.$el(0)) {
+        this.$el(0).setAttr('b', 1)
+      }
+    }
+  }
+
+;module.exports.template = {
+  "type": "div",
+  "children": [
+    {
+      "type": "text",
+      "id": function () { return "x" },
+      "attr": {
+        "value": "Hello"
+      }
+    },
+    {
+      "type": "text",
+      "id": function () { return 0 },
+      "attr": {
+        "value": "Hello"
+      }
+    },
+    {
+      "type": "text",
+      "id": function () { return '' },
+      "attr": {
+        "value": "Hello"
+      }
+    },
+    {
+      "type": "text",
+      "id": function () { return null },
+      "attr": {
+        "value": "Hello"
+      }
+    },
+    {
+      "type": "text",
+      "id": function () { return NaN },
+      "attr": {
+        "value": "Hello"
+      }
+    },
+    {
+      "type": "text",
+      "id": function () { return },
+      "attr": {
+        "value": "Hello"
+      }
+    }
+  ]
+}
+
+;})
+
+// require module
+
+bootstrap('@weex-component/id')

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/test/case/basic/global-weex-object.output.js
----------------------------------------------------------------------
diff --git a/html5/test/case/basic/global-weex-object.output.js b/html5/test/case/basic/global-weex-object.output.js
new file mode 100644
index 0000000..3e1fa19
--- /dev/null
+++ b/html5/test/case/basic/global-weex-object.output.js
@@ -0,0 +1,6 @@
+{
+    type: 'div',
+    attr: {
+        a: 'WeexDemo'
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/test/case/basic/global-weex-object.source.js
----------------------------------------------------------------------
diff --git a/html5/test/case/basic/global-weex-object.source.js b/html5/test/case/basic/global-weex-object.source.js
new file mode 100644
index 0000000..3a8e99f
--- /dev/null
+++ b/html5/test/case/basic/global-weex-object.source.js
@@ -0,0 +1,19 @@
+weex.define('@weex-component/foo', function (require, exports, module) {
+  module.exports = {
+    data: function () {
+      return {
+        x: weex.config.env.appName
+      }
+    },
+    template: {
+      "type": "div",
+      "attr": {
+        "a": function () {
+          return this.x
+        }
+      }
+    }
+  }
+})
+
+weex.bootstrap('@weex-component/foo')

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/test/case/basic/id.output.js
----------------------------------------------------------------------
diff --git a/html5/test/case/basic/id.output.js b/html5/test/case/basic/id.output.js
new file mode 100644
index 0000000..7ce073c
--- /dev/null
+++ b/html5/test/case/basic/id.output.js
@@ -0,0 +1,32 @@
+{
+  type: 'div',
+  children: [
+    {
+      type: 'text',
+      attr: {
+        value: 'Hello',
+        a: 1
+      }
+    },
+    {
+      type: 'text',
+      attr: {
+        value: 'Hello',
+        a: 1,
+        b: 1
+      }
+    },
+    {
+      type: 'text',
+      attr: {
+        value: 'Hello'
+      }
+    },
+    {
+      type: 'text',
+      attr: {
+        value: 'Hello'
+      }
+    }
+  ]
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/test/case/basic/id.source.js
----------------------------------------------------------------------
diff --git a/html5/test/case/basic/id.source.js b/html5/test/case/basic/id.source.js
new file mode 100644
index 0000000..4a5fb65
--- /dev/null
+++ b/html5/test/case/basic/id.source.js
@@ -0,0 +1,62 @@
+define('@weex-component/id', function (require, exports, module) {
+
+;
+  module.exports = {
+    ready: function () {
+      if (this.$el('x')) {
+        this.$el('x').setAttr('a', 1)
+      }
+      if (this.$el('y')) {
+        this.$el('y').setAttr('a', 1)
+      }
+      if (this.$el('')) {
+        this.$el('').setAttr('a', 1)
+      }
+      if (this.$el('0')) {
+        this.$el('0').setAttr('a', 1)
+      }
+      if (this.$el(0)) {
+        this.$el(0).setAttr('b', 1)
+      }
+    }
+  }
+
+;module.exports.template = {
+  "type": "div",
+  "children": [
+    {
+      "type": "text",
+      "id": "x",
+      "attr": {
+        "value": "Hello"
+      }
+    },
+    {
+      "type": "text",
+      "id": "0",
+      "attr": {
+        "value": "Hello"
+      }
+    },
+    {
+      "type": "text",
+      "id": '',
+      "attr": {
+        "value": "Hello"
+      }
+    },
+    {
+      "type": "text",
+      "id": null,
+      "attr": {
+        "value": "Hello"
+      }
+    }
+  ]
+}
+
+;})
+
+// require module
+
+bootstrap('@weex-component/id')

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/test/case/prepare.js
----------------------------------------------------------------------
diff --git a/html5/test/case/prepare.js b/html5/test/case/prepare.js
index fd92918..9629dbb 100644
--- a/html5/test/case/prepare.js
+++ b/html5/test/case/prepare.js
@@ -11,6 +11,7 @@ import {
 import shared from '../../shared'
 import { Document, Element, Comment } from '../../runtime/vdom'
 import Listener from '../../runtime/listener'
+import { TaskCenter, init } from '../../runtime/task-center'
 
 // load framework
 import * as defaultFramework from '../../frameworks/legacy'
@@ -27,10 +28,13 @@ global.callAddElement = function (id, ref, json, index) {
   return callNativeHandler(id, [{ module: 'dom', method: 'addElement', args: [ref, json, index] }])
 }
 
+init()
+
 // create test driver runtime
 export function createRuntime () {
   const config = {
     Document, Element, Comment, Listener,
+    TaskCenter,
     sendTasks (...args) {
       return callNativeHandler(...args)
     }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/test/case/tester.js
----------------------------------------------------------------------
diff --git a/html5/test/case/tester.js b/html5/test/case/tester.js
index 490a3a4..9c2b299 100644
--- a/html5/test/case/tester.js
+++ b/html5/test/case/tester.js
@@ -46,6 +46,8 @@ describe('test input and output', function () {
       app.$destroy()
     }
 
+    it('global Weex object', () => checkOutput(app, 'global-weex-object'))
+
     it('single case', () => checkOutput(app, 'foo'))
     it('foo2 case', () => checkOutput(app, 'foo2'))
     it('foo3 case', () => checkOutput(app, 'foo3'))
@@ -78,6 +80,9 @@ describe('test input and output', function () {
     it('repeat with array non-obj case', () => checkOutput(app, 'repeat-array-non-obj'))
     it('repeat watch case', () => checkOutput(app, 'repeat-watch'))
 
+    it('id case', () => checkOutput(app, 'id'))
+    it('dynamic id case', () => checkOutput(app, 'dynamic-id'))
+
     it('reset style case', () => checkOutput(app, 'reset-style'))
     it('dynamic type case', () => checkOutput(app, 'dynamic-type'))
     it('dynamic property case', () => checkOutput(app, 'dynamic-property'))

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/test/unit/default/api/methods.js
----------------------------------------------------------------------
diff --git a/html5/test/unit/default/api/methods.js b/html5/test/unit/default/api/methods.js
index 56f4ce0..6a7d26a 100644
--- a/html5/test/unit/default/api/methods.js
+++ b/html5/test/unit/default/api/methods.js
@@ -35,17 +35,17 @@ describe('built-in methods', () => {
         differ: new Differ(),
         requireModule: (name) => {
           requireSpy(name)
-
           const module = requireModule(this, name)
+          const mockModule = {}
           for (const moduleName in module) {
-            module[moduleName] = function (...args) {
+            mockModule[moduleName] = function (...args) {
               moduleSpy(...args)
               if (typeof args[args.length - 1] === 'function') {
                 args[args.length - 1]()
               }
             }
           }
-          return module
+          return mockModule
         }
       },
       _setStyle: function () {},

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/test/unit/default/app/bundle.js
----------------------------------------------------------------------
diff --git a/html5/test/unit/default/app/bundle.js b/html5/test/unit/default/app/bundle.js
index 195b457..183ba49 100644
--- a/html5/test/unit/default/app/bundle.js
+++ b/html5/test/unit/default/app/bundle.js
@@ -4,9 +4,6 @@ import sinonChai from 'sinon-chai'
 const { expect } = chai
 chai.use(sinonChai)
 
-global.callNative = function () {}
-global.callAddElement = function () {}
-
 import * as bundle from '../../../../frameworks/legacy/app/bundle'
 import * as register from '../../../../frameworks/legacy/app/register'
 import { removeWeexPrefix } from '../../../../frameworks/legacy/util'
@@ -46,19 +43,16 @@ describe('parsing a bundle file', () => {
       const id = Date.now()
       callTasksSpy = sinon.spy()
 
-      const doc = new Document(id, '', (tasks, callback) => {
-        app.callTasks(tasks, callback)
-      }, Listener)
+      const doc = new Document(id, '', (tasks) => {
+        app.callTasks(tasks)
+      })
 
       app = {
         id, doc,
         customComponentMap: {},
         commonModules: {},
         callbacks: {},
-        callTasks: (tasks, callback) => {
-          callTasksSpy(tasks)
-          callback && callback()
-        },
+        callTasks: callTasksSpy,
         requireModule: function (name) {
           return register.requireModule(this, name)
         }
@@ -213,7 +207,6 @@ describe('parsing a bundle file', () => {
         expect(callTasksSpy.calledTwice).to.be.true
 
         expect(ready.calledOnce).to.be.true
-
         const task1 = callTasksSpy.firstCall.args[0][0]
         expect(task1.module).to.be.equal('dom')
         expect(task1.method).to.be.equal('createBody')
@@ -256,6 +249,21 @@ describe('parsing a bundle file', () => {
         )
         expect(result).instanceof(Error)
       })
+
+      it('with viewport config', () => {
+        bundle.bootstrap(
+          app,
+          '@weex-component/undefined',
+          {
+            viewport: { width: 640 }
+          }
+        )
+        expect(callTasksSpy.callCount).to.be.equal(1)
+        const tasks = callTasksSpy.lastCall.args[0]
+        expect(tasks[0].module).to.be.equal('meta')
+        expect(tasks[0].method).to.be.equal('setViewport')
+        expect(tasks[0].args).to.deep.equal([{ width: 640 }])
+      })
     })
   })
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/test/unit/default/app/ctrl.js
----------------------------------------------------------------------
diff --git a/html5/test/unit/default/app/ctrl.js b/html5/test/unit/default/app/ctrl.js
index 9f69431..f7d91f2 100644
--- a/html5/test/unit/default/app/ctrl.js
+++ b/html5/test/unit/default/app/ctrl.js
@@ -4,13 +4,9 @@ import sinonChai from 'sinon-chai'
 const { expect } = chai
 chai.use(sinonChai)
 
-global.callNative = function () {}
-global.callAddElement = function () {}
-
 import * as ctrl from '../../../../frameworks/legacy/app/ctrl'
 import Differ from '../../../../frameworks/legacy/app/differ'
 import { Document } from '../../../../runtime/vdom'
-import Listener from '../../../../runtime/listener'
 
 describe('the api of app', () => {
   let app
@@ -26,15 +22,14 @@ describe('the api of app', () => {
       registerComponent: function () {},
       // define: sinon.spy(),
       // bootstrap: sinon.stub(),
-      callbacks: {
-        1: spy2
-      },
       vm: {},
       differ: new Differ(id)
     }
 
-    app.doc = new Document(id, '', spy1, Listener)
+    app.doc = new Document(id, '', spy1)
     app.doc.createBody('div')
+
+    app.doc.taskCenter.callbackManager.add(spy2)
     // app.bootstrap.returns()
 
     return app
@@ -129,8 +124,6 @@ describe('the api of app', () => {
       const data = { a: 'b' }
       ctrl.callback(app, '1', data, true)
       expect(spy2.calledOnce).to.be.true
-      expect(spy2.args[0][0]).to.deep.equal(data)
-      expect(app.callbacks[1]).to.be.a('function')
 
       const task = spy1.firstCall.args[0][0]
       expect(task.module).to.be.equal('dom')
@@ -142,13 +135,9 @@ describe('the api of app', () => {
       const data = { a: 'b' }
       ctrl.callback(app, '1', data, true)
       expect(spy2.calledTwice).to.be.true
-      expect(spy2.args[0][0]).to.deep.equal(data)
-      expect(app.callbacks[1]).to.be.a('function')
 
       ctrl.callback(app, '1', data, false)
       expect(spy2.calledThrice).to.be.true
-      expect(spy2.args[0][0]).to.deep.equal(data)
-      expect(app.callbacks[1]).to.be.undefined
     })
 
     it('error', () => {
@@ -158,31 +147,6 @@ describe('the api of app', () => {
     })
   })
 
-  describe('updateActions', () => {
-    let originalCallNative
-
-    before(() => {
-      originalCallNative = global.callNative
-      global.callNative = function () {}
-    })
-
-    after(() => {
-      global.callNative = originalCallNative
-    })
-
-    it('update actions in listener', () => {
-      app.doc.listener.updates = [
-        {
-          method () {},
-          args: [undefined, null, /\.x/i, new Date(), 2, '3', true, ['']]
-        }
-      ]
-      ctrl.updateActions(app)
-
-      expect(app.doc.listener.updates).to.deep.equal([])
-    })
-  })
-
   describe('refreshData', () => {
     it('a simple data', () => {
       const data = { b: 'c' }
@@ -219,7 +183,6 @@ describe('the api of app', () => {
       expect(app.vm).to.be.null
       expect(app.doc).to.be.null
       expect(app.customComponentMap).to.be.null
-      expect(app.callbacks).to.be.null
     })
     it('the incomplete data', () => {
       const appx = createApp()
@@ -230,7 +193,6 @@ describe('the api of app', () => {
       expect(appx.vm).to.be.null
       expect(appx.doc).to.be.null
       expect(appx.customComponentMap).to.be.null
-      expect(appx.callbacks).to.be.null
     })
     it('clear vms', () => {
       const appy = createApp()
@@ -245,7 +207,6 @@ describe('the api of app', () => {
       expect(appy.vm).to.be.null
       expect(appy.doc).to.be.null
       expect(appy.customComponentMap).to.be.null
-      expect(appy.callbacks).to.be.null
     })
   })
 })

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/test/unit/default/app/index.js
----------------------------------------------------------------------
diff --git a/html5/test/unit/default/app/index.js b/html5/test/unit/default/app/index.js
index c8c57c0..53a6938 100644
--- a/html5/test/unit/default/app/index.js
+++ b/html5/test/unit/default/app/index.js
@@ -4,43 +4,22 @@ import sinonChai from 'sinon-chai'
 const { expect } = chai
 chai.use(sinonChai)
 
-global.callNative = function () {}
-global.callAddElement = function () {}
-
 import App from '../../../../frameworks/legacy/app'
-import { Element } from '../../../../runtime/vdom'
+import { Element, Document } from '../../../../runtime/vdom'
 
 describe('App Instance', () => {
-  const oriCallNative = global.callNative
-  const oriCallAddElement = global.callAddElement
-  const callNativeSpy = sinon.spy()
-  const callAddElementSpy = sinon.spy()
+  const oriDocumentHandler = Document.handler
+  const sendTasksSpy = sinon.spy()
   let app
 
-  before(() => {
-    global.callNative = (id, tasks, callbackId) => {
-      callNativeSpy(id, tasks, callbackId)
-      /* istanbul ignore if */
-      if (callbackId !== '-1') {
-        app.callbacks[callbackId] && app.callbacks[callbackId]()
-      }
-    }
-    global.callAddElement = (name, ref, json, index, callbackId) => {
-      callAddElementSpy(name, ref, json, index, callbackId)
-      /* istanbul ignore if */
-      if (callbackId !== '-1') {
-        app.callbacks[callbackId] && app.callbacks[callbackId]()
-      }
-    }
-  })
-
   beforeEach(() => {
-    app = new App(Date.now() + '')
+    Document.handler = sendTasksSpy
+    const id = Date.now() + ''
+    app = new App(id, {})
   })
 
-  after(() => {
-    global.callNative = oriCallNative
-    global.callAddElement = oriCallAddElement
+  afterEach(() => {
+    Document.handler = oriDocumentHandler
   })
 
   describe('normal check', () => {
@@ -75,7 +54,7 @@ describe('App Instance', () => {
       }]
 
       app.callTasks(tasks)
-      expect(callNativeSpy.lastCall.args[1]).to.deep.equal(tasks)
+      expect(sendTasksSpy.lastCall.args[1]).to.deep.equal(tasks)
     })
 
     it('with callback', (done) => {
@@ -86,11 +65,13 @@ describe('App Instance', () => {
       }]
 
       app.callTasks(tasks)
-      expect(callNativeSpy.lastCall.args[1]).to.deep.equal(tasks)
+      expect(sendTasksSpy.lastCall.args[1]).to.deep.equal(tasks)
       done()
     })
 
     it('with function arg', (done) => {
+      const callbackId = '1'
+
       const tasks = [{
         module: 'dom',
         method: 'createBody',
@@ -98,8 +79,11 @@ describe('App Instance', () => {
       }]
 
       app.callTasks(tasks)
-      expect(callNativeSpy.lastCall.args[1]).to.deep.equal(tasks)
-      expect(callNativeSpy.lastCall.args[1][0].args[0]).to.be.a('string')
+      expect(sendTasksSpy.lastCall.args[1]).to.deep.equal([{
+        module: 'dom',
+        method: 'createBody',
+        args: [callbackId]
+      }])
       done()
     })
 
@@ -114,12 +98,17 @@ describe('App Instance', () => {
       }]
 
       app.callTasks(tasks)
-      expect(callNativeSpy.lastCall.args[1]).to.deep.equal(tasks)
-      expect(callNativeSpy.lastCall.args[1][0].args[0]).to.be.equal('1')
+      expect(sendTasksSpy.lastCall.args[1]).to.deep.equal([{
+        module: 'dom',
+        method: 'createBody',
+        args: [node.ref]
+      }])
       done()
     })
 
     it('with callback after close', (done) => {
+      const callbackId = '1'
+
       const tasks = [{
         module: 'dom',
         method: 'createBody',
@@ -129,8 +118,11 @@ describe('App Instance', () => {
       app.doc.close()
 
       app.callTasks(tasks)
-      expect(callNativeSpy.lastCall.args[1]).to.deep.equal(tasks)
-      expect(callNativeSpy.lastCall.args[1][0].args[0]).to.be.a('string')
+      expect(sendTasksSpy.lastCall.args[1]).to.deep.equal([{
+        module: 'dom',
+        method: 'createBody',
+        args: [callbackId]
+      }])
       done()
     })
   })

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/test/unit/default/app/viewport.js
----------------------------------------------------------------------
diff --git a/html5/test/unit/default/app/viewport.js b/html5/test/unit/default/app/viewport.js
new file mode 100644
index 0000000..ea914a3
--- /dev/null
+++ b/html5/test/unit/default/app/viewport.js
@@ -0,0 +1,61 @@
+import chai from 'chai'
+import sinon from 'sinon'
+import sinonChai from 'sinon-chai'
+const { expect } = chai
+chai.use(sinonChai)
+
+import * as viewport from '../../../../frameworks/legacy/app/viewport'
+
+describe('viewport', function () {
+  const originalCallNative = global.callNative
+  const { setViewport, validateViewport } = viewport
+  const mockApp = {
+    id: 'mock',
+    callTasks (...args) {
+      global.callNative(...args)
+    }
+  }
+
+  before(() => {
+    sinon.stub(console, 'warn')
+  })
+
+  beforeEach(() => {
+    global.callNative = sinon.spy()
+  })
+  afterEach(() => {
+    global.callNative = originalCallNative
+    console.warn.reset()
+  })
+
+  it('invalid setViewport', () => {
+    setViewport()
+    expect(global.callNative.callCount).to.be.equal(0)
+    setViewport({})
+    expect(global.callNative.callCount).to.be.equal(0)
+  })
+
+  it('setViewport', () => {
+    setViewport(mockApp, {})
+    expect(global.callNative.callCount).to.be.equal(1)
+    setViewport(mockApp, { width: 640 })
+    expect(global.callNative.callCount).to.be.equal(2)
+    setViewport(mockApp, { width: 'device-width' })
+    expect(global.callNative.callCount).to.be.equal(3)
+  })
+
+  it('validateViewport', () => {
+    expect(validateViewport()).to.be.false
+    expect(console.warn.callCount).to.be.equal(1)
+    expect(validateViewport({})).to.be.false
+    expect(console.warn.callCount).to.be.equal(2)
+
+    expect(validateViewport({ width: 200 })).to.be.true
+    expect(console.warn.callCount).to.be.equal(2)
+    expect(validateViewport({ width: 'device-width' })).to.be.true
+    expect(console.warn.callCount).to.be.equal(2)
+
+    expect(validateViewport({ width: 'initial-width' })).to.be.false
+    expect(console.warn.callCount).to.be.equal(3)
+  })
+})

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/test/unit/default/runtime.js
----------------------------------------------------------------------
diff --git a/html5/test/unit/default/runtime.js b/html5/test/unit/default/runtime.js
index 67a59ab..57a36b2 100644
--- a/html5/test/unit/default/runtime.js
+++ b/html5/test/unit/default/runtime.js
@@ -9,6 +9,7 @@ chai.use(sinonChai)
 import runtime from '../../../runtime'
 import frameworks from '../../../frameworks'
 import defaultConfig from '../../../frameworks/legacy/config'
+import { init as resetTaskHandler } from '../../../runtime/task-center'
 
 const { init, config } = runtime
 config.frameworks = frameworks
@@ -29,8 +30,10 @@ function clearRefs (json) {
 describe('framework entry', () => {
   const oriCallNative = global.callNative
   const oriCallAddElement = global.callAddElement
+  const oriDocumentHandler = config.Document.handler
   const callNativeSpy = sinon.spy()
   const callAddElementSpy = sinon.spy()
+  const documentHandlerSpy = sinon.spy()
   const instanceId = Date.now() + ''
 
   before(() => {
@@ -44,7 +47,6 @@ describe('framework entry', () => {
         }])
       }
     }
-    config.Document.handler = global.callNative
     global.callAddElement = (name, id, ref, json, index, callbackId) => {
       callAddElementSpy(name, ref, json, index, callbackId)
       /* istanbul ignore if */
@@ -55,15 +57,18 @@ describe('framework entry', () => {
         }])
       }
     }
+    config.Document.handler = oriDocumentHandler
+    resetTaskHandler()
   })
 
   afterEach(() => {
     callNativeSpy.reset()
     callAddElementSpy.reset()
+    documentHandlerSpy.reset()
   })
 
   after(() => {
-    config.Document.handler = function () {}
+    config.Document.handler = oriDocumentHandler
     global.callNative = oriCallNative
     global.callAddElement = oriCallAddElement
   })
@@ -104,7 +109,6 @@ describe('framework entry', () => {
         bootstrap('@weex-component/main')
       `
       framework.createInstance(instanceId, code)
-
       expect(callNativeSpy.callCount).to.be.equal(2)
       expect(callAddElementSpy.callCount).to.be.equal(1)
 
@@ -168,7 +172,7 @@ describe('framework entry', () => {
       expect(frameworks.xxx.createInstance.callCount).equal(1)
       expect(frameworks.yyy.createInstance.callCount).equal(0)
       expect(frameworks.Weex.createInstance.callCount).equal(0)
-      expect(frameworks.xxx.createInstance.firstCall.args).eql([
+      expect(frameworks.xxx.createInstance.firstCall.args.slice(0, 4)).eql([
         instanceId + '~',
         code,
         { bundleVersion: '0.3.1', env: {}},
@@ -191,7 +195,7 @@ describe('framework entry', () => {
       expect(frameworks.xxx.createInstance.callCount).equal(2)
       expect(frameworks.yyy.createInstance.callCount).equal(0)
       expect(frameworks.Weex.createInstance.callCount).equal(1)
-      expect(frameworks.Weex.createInstance.firstCall.args).eql([
+      expect(frameworks.Weex.createInstance.firstCall.args.slice(0, 4)).eql([
         instanceId + '~~~',
         code,
         { bundleVersion: undefined, env: {}},
@@ -212,7 +216,7 @@ describe('framework entry', () => {
       expect(frameworks.xxx.createInstance.callCount).equal(2)
       expect(frameworks.yyy.createInstance.callCount).equal(1)
       expect(frameworks.Weex.createInstance.callCount).equal(1)
-      expect(frameworks.yyy.createInstance.firstCall.args).eql([
+      expect(frameworks.yyy.createInstance.firstCall.args.slice(0, 4)).eql([
         instanceId + '~~~~',
         code,
         { bundleVersion: undefined, env: {}},
@@ -225,7 +229,7 @@ describe('framework entry', () => {
       expect(frameworks.xxx.createInstance.callCount).equal(2)
       expect(frameworks.yyy.createInstance.callCount).equal(1)
       expect(frameworks.Weex.createInstance.callCount).equal(2)
-      expect(frameworks.Weex.createInstance.secondCall.args).eql([
+      expect(frameworks.Weex.createInstance.secondCall.args.slice(0, 4)).eql([
         instanceId + '~~~~~',
         code,
         { bundleVersion: undefined, env: {}},
@@ -238,7 +242,7 @@ describe('framework entry', () => {
       expect(frameworks.xxx.createInstance.callCount).equal(2)
       expect(frameworks.yyy.createInstance.callCount).equal(1)
       expect(frameworks.Weex.createInstance.callCount).equal(3)
-      expect(frameworks.Weex.createInstance.thirdCall.args).eql([
+      expect(frameworks.Weex.createInstance.thirdCall.args.slice(0, 4)).eql([
         instanceId + '~~~~~~',
         code,
         { bundleVersion: undefined, env: {}},
@@ -320,14 +324,13 @@ describe('framework entry', () => {
       const textRef = json.children[0].ref
       framework.refreshInstance(instanceId, { showText: false })
       expect(callNativeSpy.callCount).to.be.equal(2)
-
       expect(callNativeSpy.firstCall.args[0]).to.be.equal(instanceId)
       expect(callNativeSpy.firstCall.args[1]).to.deep.equal([{
         module: 'dom',
         method: 'removeElement',
         args: [textRef]
       }])
-      expect(callNativeSpy.firstCall.args[2]).to.be.equal('-1')
+      // expect(callNativeSpy.firstCall.args[2]).to.be.equal('-1')
 
       expect(callNativeSpy.secondCall.args[0]).to.be.equal(instanceId)
       expect(callNativeSpy.secondCall.args[1]).to.deep.equal([{
@@ -335,7 +338,7 @@ describe('framework entry', () => {
         method: 'refreshFinish',
         args: []
       }])
-      expect(callNativeSpy.secondCall.args[2]).to.be.equal('-1')
+      // expect(callNativeSpy.secondCall.args[2]).to.be.equal('-1')
     })
 
     it('with a non-exist instanceId', () => {
@@ -384,6 +387,21 @@ describe('framework entry', () => {
       })
       expect(defaultConfig.nativeComponentMap).not.contain.keys('e')
     })
+
+    it('with methods', () => {
+      const components = [{
+        type: 'x',
+        methods: ['foo', 'bar']
+      }, {
+        type: 'y',
+        methods: []
+      }, {
+        type: 'z',
+        methods: null
+      }]
+      framework.registerComponents(components)
+      expect(defaultConfig.nativeComponentMap).to.contain.keys('x', 'y', 'z')
+    })
   })
 
   describe('register modules', () => {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/test/unit/default/vm/dom-helper.js
----------------------------------------------------------------------
diff --git a/html5/test/unit/default/vm/dom-helper.js b/html5/test/unit/default/vm/dom-helper.js
index 1f4c9c8..fbcd8d2 100644
--- a/html5/test/unit/default/vm/dom-helper.js
+++ b/html5/test/unit/default/vm/dom-helper.js
@@ -1,9 +1,6 @@
 import chai from 'chai'
 const { expect } = chai
 
-global.callNative = function () {}
-global.callAddElement = function () {}
-
 import {
   createElement,
   createBlock,
@@ -104,10 +101,13 @@ describe('help attach target', () => {
   })
 
   it('attach body to documentElement', () => {
+    const oriCallnative = global.callNative
+    global.callNative = function () {}
     const target = createBody(vm, 'bar')
     const dest = vm._app.doc.documentElement
     attachTarget(vm, target, dest)
     expect(dest.children).eql([target])
+    global.callNative = oriCallnative
   })
 
   it('attach element to body', () => {
@@ -329,12 +329,15 @@ describe('help remove target', () => {
   })
 
   it('remove body', () => {
+    const oriCallnative = global.callNative
+    global.callNative = function () {}
     const parent = vm._app.doc.documentElement
     const element = createBody(vm, 'baz')
     parent.appendChild(element)
     expect(parent.children).eql([element])
     removeTarget(vm, element)
     expect(parent.children).eql([])
+    global.callNative = oriCallnative
   })
 
   it('remove element', () => {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/test/unit/default/vm/events.js
----------------------------------------------------------------------
diff --git a/html5/test/unit/default/vm/events.js b/html5/test/unit/default/vm/events.js
index 28e9a59..e065e7f 100644
--- a/html5/test/unit/default/vm/events.js
+++ b/html5/test/unit/default/vm/events.js
@@ -4,12 +4,8 @@ import sinonChai from 'sinon-chai'
 const { expect } = chai
 chai.use(sinonChai)
 
-global.callNative = function () {}
-global.callAddElement = function () {}
-
 import Vm from '../../../../frameworks/legacy/vm'
 import { Document } from '../../../../runtime/vdom'
-import Listener from '../../../../runtime/listener'
 
 describe('bind and fire events', () => {
   let doc, customComponentMap, spy
@@ -26,9 +22,7 @@ describe('bind and fire events', () => {
 
   beforeEach(() => {
     spy = sinon.spy()
-    doc = new Document('test', '', (actions) => {
-      spy(actions)
-    }, Listener)
+    doc = new Document('test', '', spy)
     customComponentMap = {}
   })
 
@@ -59,7 +53,6 @@ describe('bind and fire events', () => {
     const vm = new Vm('foo', customComponentMap.foo, { _app: app })
 
     checkReady(vm, function () {
-      doc.close()
       expect(doc.body.event.click).a('function')
 
       const el = doc.body
@@ -68,10 +61,9 @@ describe('bind and fire events', () => {
       expect(doc.listener.updates.length).eql(0)
 
       el.event.click({ xxx: 1 })
-
       expect(el.attr.a).eql(2)
-      expect(spy.args.length).eql(1)
-      expect(doc.listener.updates).eql([
+      expect(spy.args.length).eql(2)
+      expect(spy.args[1][0]).eql([
         { module: 'dom', method: 'updateAttrs', args: [el.ref, { a: 2 }] }
       ])
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/test/unit/default/vm/vm.js
----------------------------------------------------------------------
diff --git a/html5/test/unit/default/vm/vm.js b/html5/test/unit/default/vm/vm.js
index e12b068..ffd9eb7 100644
--- a/html5/test/unit/default/vm/vm.js
+++ b/html5/test/unit/default/vm/vm.js
@@ -4,14 +4,13 @@ import sinonChai from 'sinon-chai'
 const { expect } = chai
 chai.use(sinonChai)
 
-global.callNative = function () {}
-global.callAddElement = function () {}
-
 import Vm from '../../../../frameworks/legacy/vm'
 import { Document } from '../../../../runtime/vdom'
-import Listener from '../../../../runtime/listener'
+import { init as resetTaskHandler } from '../../../../runtime/task-center'
 import Differ from '../../../../frameworks/legacy/app/differ'
 
+const oriCallNative = global.callNative
+
 describe('generate virtual dom for a single vm', () => {
   const spy = sinon.spy()
   const spy1 = sinon.spy()
@@ -25,7 +24,7 @@ describe('generate virtual dom for a single vm', () => {
       actions.forEach((action) => {
         spy.apply(null, ['test', action.method].concat(action.args))
       })
-    }, Listener)
+    })
     customComponentMap = {}
   })
 
@@ -942,13 +941,16 @@ describe('generate virtual dom for sub vm', () => {
   let differ
 
   beforeEach(() => {
-    doc = new Document('test', null, null, Listener)
+    global.callNative = function () {}
+    resetTaskHandler()
+    doc = new Document('test', null, null)
     customComponentMap = {}
     differ = new Differ('test')
   })
 
   afterEach(() => {
     doc.destroy()
+    global.callNative = oriCallNative
   })
 
   it('generate sub elements', () => {
@@ -1588,7 +1590,7 @@ describe('generate dom actions', () => {
       actions.forEach((action) => {
         spy.apply(null, ['bar', action.method].concat(action.args))
       })
-    }, Listener)
+    })
     differ = new Differ('foo')
     customComponentMap = {}
     app = { doc, customComponentMap, differ }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/test/unit/shared/BroadcastChannel.js
----------------------------------------------------------------------
diff --git a/html5/test/unit/shared/BroadcastChannel.js b/html5/test/unit/shared/BroadcastChannel.js
new file mode 100644
index 0000000..3fda443
--- /dev/null
+++ b/html5/test/unit/shared/BroadcastChannel.js
@@ -0,0 +1,220 @@
+import { expect } from 'chai'
+import sinon from 'sinon'
+
+import service from '../../../services/broadcast-channel/index'
+import { MessageEvent } from '../../../services/broadcast-channel/message-event'
+const { BroadcastChannel } = service.create('foo').instance
+
+describe('BroadcastChannel', () => {
+  it('is a function', () => {
+    expect(BroadcastChannel).is.an('function')
+  })
+
+  it('has standard APIs', () => {
+    const JamesBond = new BroadcastChannel('007')
+    expect(JamesBond.name).is.an('string')
+    expect(JamesBond.onmessage).is.an('null')
+    expect(JamesBond.postMessage).is.an('function')
+    expect(JamesBond.close).is.an('function')
+
+    expect(JamesBond).to.have.ownProperty('name')
+    expect(JamesBond).to.have.ownProperty('onmessage')
+    expect(JamesBond).not.to.have.ownProperty('postMessage')
+    expect(JamesBond).not.to.have.ownProperty('close')
+    JamesBond.close()
+  })
+
+  it.skip('inherit APIs', () => {
+    const ProfessorX = new BroadcastChannel('Charles')
+    expect(ProfessorX.addEventListener).is.an('function')
+    expect(ProfessorX.removeEventListener).is.an('function')
+    expect(ProfessorX.dispatchEvent).is.an('function')
+  })
+
+  it('name attribute is readonly', () => {
+    const Wolverine = new BroadcastChannel('Logan')
+    expect(Wolverine.name).to.equal('Logan')
+    Wolverine.name = 'Wolverine'
+    expect(Wolverine.name).to.equal('Logan')
+    Wolverine.close()
+  })
+
+  describe('basci usage', () => {
+    const Hulk = new BroadcastChannel('Avengers')
+    const Stack = new BroadcastChannel('Avengers')
+    const Steven = new BroadcastChannel('Avengers')
+    const Logan = new BroadcastChannel('Mutants')
+    const Erik = new BroadcastChannel('Mutants')
+
+    beforeEach(() => {
+      Hulk.onmessage = sinon.spy()
+      Stack.onmessage = sinon.spy()
+      Steven.onmessage = sinon.spy()
+      Logan.onmessage = sinon.spy()
+    })
+
+    afterEach(() => {
+      Hulk.onmessage = null
+      Stack.onmessage = null
+      Steven.onmessage = null
+      Logan.onmessage = null
+      Erik.onmessage = null
+    })
+
+    it('trigger onmessage', () => {
+      Hulk.postMessage('Hulk Smash !!!')
+      expect(Hulk.onmessage.callCount).to.be.equal(0)
+      expect(Logan.onmessage.callCount).to.be.equal(0)
+      expect(Stack.onmessage.callCount).to.be.equal(1)
+      expect(Steven.onmessage.callCount).to.be.equal(1)
+    })
+
+    it('don\'t trigger onmessage itself', () => {
+      Logan.postMessage('Any one here ?')
+      expect(Hulk.onmessage.callCount).to.be.equal(0)
+      expect(Logan.onmessage.callCount).to.be.equal(0)
+      expect(Stack.onmessage.callCount).to.be.equal(0)
+      expect(Steven.onmessage.callCount).to.be.equal(0)
+    })
+
+    it('send multi messages', () => {
+      Hulk.postMessage('Hulk Smash !!!')
+      Logan.postMessage('I will fight you !')
+      Stack.postMessage('whatever')
+      Hulk.postMessage('whatever')
+      Stack.postMessage('whatever')
+      Steven.postMessage('whatever')
+      Stack.postMessage('whatever')
+
+      expect(Hulk.onmessage.callCount).to.be.equal(4)
+      expect(Logan.onmessage.callCount).to.be.equal(0)
+      expect(Stack.onmessage.callCount).to.be.equal(3)
+      expect(Steven.onmessage.callCount).to.be.equal(5)
+    })
+
+    it('send string message', () => {
+      Stack.postMessage('I am Iron-Man.')
+
+      expect(Hulk.onmessage.callCount).to.be.equal(1)
+      expect(Steven.onmessage.callCount).to.be.equal(1)
+
+      const event = Hulk.onmessage.firstCall.args[0]
+      expect(event).is.an('object')
+      expect(event.data).is.a('string')
+      expect(event.data).to.be.equal('I am Iron-Man.')
+    })
+
+    it('send object message', () => {
+      const message = {
+        type: 'SOKOVIA ACCORDS',
+        approvedCountry: 117,
+        content: 'The Avengers shall no longer be a private organization.'
+      }
+
+      Stack.postMessage(message)
+
+      const event = Steven.onmessage.firstCall.args[0]
+      expect(event).is.an('object')
+      expect(event.data).is.a('object')
+      expect(event.data).to.deep.equal(message)
+    })
+
+    it('close channel', () => {
+      Hulk.close()
+
+      Steven.postMessage('come to fight !')
+      expect(Hulk.onmessage.callCount).to.be.equal(0)
+      expect(Stack.onmessage.callCount).to.be.equal(1)
+      expect(Steven.onmessage.callCount).to.be.equal(0)
+    })
+
+    it('send message after close', () => {
+      Hulk.close()
+
+      expect(() => { Hulk.postMessage('I am leaving.') }).to.throw(Error)
+
+      expect(Hulk.onmessage.callCount).to.be.equal(0)
+      expect(Logan.onmessage.callCount).to.be.equal(0)
+      expect(Stack.onmessage.callCount).to.be.equal(0)
+      expect(Steven.onmessage.callCount).to.be.equal(0)
+    })
+
+    it('MessageEvent dafault parameters', () => {
+      const event = new MessageEvent()
+
+      expect(event).is.an('object')
+      expect(event.data).to.be.null
+      expect(event.type).to.be.equal('message')
+      expect(event.origin).to.be.equal('')
+      expect(event.target).to.be.null
+      expect(event.source).to.be.null
+      expect(event.timeStamp).to.be.a('number')
+      expect(event.ports).to.be.an('array')
+    })
+
+    it('MessageEvent constructor', () => {
+      const source = { type: 'empty' }
+      const event = new MessageEvent('custom', {
+        source,
+        data: 'Nothing',
+        origin: 'http://127.0.0.1',
+        ports: ['8080']
+      })
+
+      expect(event).is.an('object')
+      expect(event.data).to.be.equal('Nothing')
+      expect(event.type).to.be.equal('custom')
+      expect(event.origin).to.be.equal('http://127.0.0.1')
+      expect(event.target).to.be.null
+      expect(event.source).to.deep.equal(source)
+      expect(event.timeStamp).to.be.a('number')
+      expect(event.ports).to.deep.equal(['8080'])
+    })
+
+    it('use MessageEvent', () => {
+      Steven.postMessage('Be Together.')
+
+      const event = Stack.onmessage.firstCall.args[0]
+      expect(event).is.an('object')
+      expect(event.data).to.be.equal('Be Together.')
+      expect(event.type).to.be.equal('message')
+      expect(event.origin).to.be.equal('')
+      expect(event.target).to.be.null
+      expect(event.timeStamp).to.be.a('number')
+    })
+
+    it('invalid usage', () => {
+      const stranger = {
+        name: 'stranger',
+        close: Erik.close,
+        postMessage: Erik.postMessage
+      }
+
+      stranger.postMessage('hello world.')
+
+      expect(Hulk.onmessage.callCount).to.be.equal(0)
+      expect(Logan.onmessage.callCount).to.be.equal(0)
+      expect(Stack.onmessage.callCount).to.be.equal(0)
+      expect(Steven.onmessage.callCount).to.be.equal(0)
+
+      stranger.close()
+    })
+
+    it('close all', () => {
+      Hulk.close()
+      Stack.close()
+      Steven.close()
+      Logan.close()
+      Erik.close()
+
+      // close again
+      expect(() => {
+        Hulk.close()
+        Stack.close()
+        Steven.close()
+        Logan.close()
+        Erik.close()
+      }).to.not.throw
+    })
+  })
+})

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/test/unit/vanilla/index.js
----------------------------------------------------------------------
diff --git a/html5/test/unit/vanilla/index.js b/html5/test/unit/vanilla/index.js
index 24584da..a0e84e8 100644
--- a/html5/test/unit/vanilla/index.js
+++ b/html5/test/unit/vanilla/index.js
@@ -1,8 +1,5 @@
 import { expect } from 'chai'
 
-global.callNative = function () {}
-global.callAddElement = function () {}
-
 import vanilla from '../../../frameworks/vanilla'
 import runtime from '../../../runtime'
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/test/unit/vdom/index.js
----------------------------------------------------------------------
diff --git a/html5/test/unit/vdom/index.js b/html5/test/unit/vdom/index.js
index 886d7e6..7c8d854 100644
--- a/html5/test/unit/vdom/index.js
+++ b/html5/test/unit/vdom/index.js
@@ -4,28 +4,15 @@ import sinonChai from 'sinon-chai'
 const { expect } = chai
 chai.use(sinonChai)
 
-global.callNative = function () {}
-global.callAddElement = function () {}
-
 import {
   Document,
   Element,
-  Comment
+  Comment,
+  elementTypes,
+  registerElement,
+  clearElementTypes
 } from '../../../runtime/vdom'
 
-global.callNative = function () {}
-global.callAddElement = function () {}
-
-const tempHandler = Document.handler
-
-before(() => {
-  Document.handler = global.callNative
-})
-
-after(() => {
-  Document.handler = tempHandler
-})
-
 describe('document constructor', () => {
   it('create & destroy document', () => {
     const doc = new Document('foo', 'http://path/to/url')
@@ -38,6 +25,49 @@ describe('document constructor', () => {
   })
 })
 
+describe('component methods management', () => {
+  before(() => {
+    registerElement('x', ['foo', 'bar'])
+    registerElement('y', [])
+    registerElement('z')
+  })
+
+  after(() => {
+    clearElementTypes()
+  })
+
+  it('has registered element types', () => {
+    expect(Object.keys(elementTypes)).eql(['x'])
+  })
+
+  it('will call component method', () => {
+    const spy = sinon.spy()
+    const doc = new Document('test', '', spy)
+    const x = new Element('x')
+    const y = new Element('y')
+    const z = new Element('z')
+    const n = new Element('n')
+    expect(x.foo).is.function
+    expect(x.bar).is.function
+    expect(x.baz).is.undefined
+    expect(y.foo).is.undefined
+    expect(z.foo).is.undefined
+    expect(n.foo).is.undefined
+
+    doc.createBody('r')
+    doc.documentElement.appendChild(doc.body)
+    doc.body.appendChild(x)
+    doc.body.appendChild(y)
+    doc.body.appendChild(z)
+    doc.body.appendChild(n)
+    expect(spy.args.length).eql(5)
+
+    x.foo(1, 2, 3)
+    expect(spy.args.length).eql(6)
+    expect(spy.args[5]).eql([[{ component: 'x', method: 'foo', ref: x.ref, args: [1, 2, 3] }]])
+  })
+})
+
 describe('document methods', () => {
   let doc
 
@@ -435,12 +465,12 @@ describe('complicated situations', () => {
     doc = new Document('foo', '', spy)
     doc.createBody('r')
     doc.documentElement.appendChild(doc.body)
-    el = new Element('bar', null, doc)
-    el2 = new Element('baz', null, doc)
-    el3 = new Element('qux', null, doc)
-    c = new Comment('aaa', doc)
-    c2 = new Comment('bbb', doc)
-    c3 = new Comment('ccc', doc)
+    el = new Element('bar')
+    el2 = new Element('baz')
+    el3 = new Element('qux')
+    c = new Comment('aaa')
+    c2 = new Comment('bbb')
+    c3 = new Comment('ccc')
   })
 
   afterEach(() => {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/html5/test/unit/vdom/listener.js
----------------------------------------------------------------------
diff --git a/html5/test/unit/vdom/listener.js b/html5/test/unit/vdom/listener.js
index 1f260b6..84de22b 100644
--- a/html5/test/unit/vdom/listener.js
+++ b/html5/test/unit/vdom/listener.js
@@ -4,15 +4,9 @@ import sinonChai from 'sinon-chai'
 const { expect } = chai
 chai.use(sinonChai)
 
-global.callNative = function () {}
-global.callAddElement = function () {}
-
 import { Document } from '../../../runtime/vdom'
 import Listener from '../../../runtime/listener'
 
-global.callNative = function () {}
-global.callAddElement = function () {}
-
 describe('dom listener basic', () => {
   it('works with no id', () => {
     const doc = new Document(null, null, null)
@@ -20,6 +14,10 @@ describe('dom listener basic', () => {
   })
 
   it('works with no handler', () => {
+    const oriCallNative = global.callNative
+    const oriCallAddElement = global.callAddElement
+    const oriDocumentHandler = Document.handler
+
     Document.handler = null
     global.callNative = function () { return -1 }
     global.callAddElement = function () { return -1 }
@@ -30,6 +28,10 @@ describe('dom listener basic', () => {
     const el = doc.createElement('a')
     doc.body.appendChild(el)
     doc.destroy()
+
+    global.callNative = oriCallNative
+    global.callAddElement = oriCallAddElement
+    Document.handler = oriDocumentHandler
   })
 
   it('works with an handler', () => {
@@ -77,7 +79,7 @@ describe('dom listener details', () => {
     expect(spy.args[0]).eql([[{
       module: 'dom', method: 'createBody',
       args: [{ type: 'r', ref: '_root', attr: { a: 1 }, style: { b: 2 }}]
-    }]])
+    }], '-1'])
     done()
   })
 
@@ -108,7 +110,7 @@ describe('dom listener details', () => {
     expect(spy.args[0]).eql([[{
       module: 'dom', method: 'createBody',
       args: [{ type: 'r', ref: '_root', attr: { a: 1 }, style: { b: 2 }}]
-    }]])
+    }], '-1'])
     done()
   })
 
@@ -192,7 +194,7 @@ describe('dom listener details', () => {
     expect(spy.args[0]).eql([[{
       module: 'dom', method: 'createBody',
       args: [body.toJSON()]
-    }]])
+    }], '-1'])
 
     const el = doc.createElement('a')
     el.setAttr('x', 1)
@@ -202,7 +204,7 @@ describe('dom listener details', () => {
     expect(spy.args[1]).eql([[{
       module: 'dom', method: 'addElement',
       args: ['_root', el.toJSON(), -1]
-    }]])
+    }], '-1'])
 
     const el2 = doc.createElement('b')
     doc.body.insertBefore(el2, el) // [el2, el]
@@ -214,16 +216,16 @@ describe('dom listener details', () => {
     expect(spy.args[2]).eql([[{
       module: 'dom', method: 'addElement',
       args: ['_root', el2.toJSON(), 0]
-    }]])
+    }], '-1'])
     expect(spy.args[3]).eql([[{
       module: 'dom', method: 'addElement',
       args: ['_root', el3.toJSON(), 2]
-    }]])
+    }], '-1'])
 
     done()
   })
 
-  it('batch when document closed', (done) => {
+  it.skip('batch when document closed', (done) => {
     const body = doc.createBody('r')
 
     doc.documentElement.appendChild(body)
@@ -348,16 +350,14 @@ describe('dom listener details', () => {
       args: [el.ref, 'appear']
     }])
 
-    doc.close()
-
     el.setAttr('a', 1)
     el.setStyle('a', 2)
     el.setClassStyle({ a: 3, b: 4 })
     el.addEvent('click', () => {})
     el.addEvent('appear', () => {})
     el.removeEvent('appear')
-    expect(spy.args.length).eql(10)
-    expect(doc.listener.updates).eql([
+    expect(spy.args.length).eql(16)
+    expect(spy.args.slice(10).map(c => c[0][0])).eql([
       { module: 'dom', method: 'updateAttrs', args: [el.ref, { a: 1 }] },
       { module: 'dom', method: 'updateStyle', args: [el.ref, { a: 2 }] },
       { module: 'dom', method: 'updateStyle', args: [el.ref, { a: 2, b: 4 }] },


[25/50] [abbrv] incubator-weex git commit: V0.10.0 stable moudle sync doc (#179)

Posted by ji...@apache.org.
V0.10.0 stable moudle sync doc (#179)

* * [android] add sync callback develop doc

* * [android] delete  space line

* Update extend-to-android.md


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

Branch: refs/heads/master
Commit: 3bab145900c6b971776c57b2f7ef5c309c3fd313
Parents: 36ed260
Author: zhengshihan <zh...@gmail.com>
Authored: Thu Feb 16 16:34:34 2017 +0800
Committer: sospartan zheng <so...@apache.org>
Committed: Thu Feb 16 16:34:34 2017 +0800

----------------------------------------------------------------------
 doc/advanced/extend-to-android.md | 15 +++++++++++++++
 1 file changed, 15 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/3bab1459/doc/advanced/extend-to-android.md
----------------------------------------------------------------------
diff --git a/doc/advanced/extend-to-android.md b/doc/advanced/extend-to-android.md
index b4bae71..1d49dfd 100644
--- a/doc/advanced/extend-to-android.md
+++ b/doc/advanced/extend-to-android.md
@@ -29,7 +29,22 @@ Refer to the following example:
     }
 
 ```
+#### Support synchronous/asynchronous callback 
+you can add  `` @JSMethod (uiThread = false or true ) `` annotation to choose the  callback mode of moudle . see the follow  example.
+```java
+     // as sync-callback mode 
+    @JSMethod (uiThread = false)
+    public void testSyncCall(){
+        WXLogUtils.d("WXComponentSyncTest :"+ Thread.currentThread().getName());
+    }
+    
+    // as async-callback mode 
+    @JSMethod (uiThread = true)
+    public void testAsyncCall(){
+        WXLogUtils.e("WXComponentASynTest :"+ Thread.currentThread().getName() );
+    }
 
+```
 #### Register the moulde
 
 ```java


[39/50] [abbrv] incubator-weex git commit: * [ios] update jsfrm version to support strict mode.

Posted by ji...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/bcba010b/ios/sdk/WeexSDK/Resources/main.js
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Resources/main.js b/ios/sdk/WeexSDK/Resources/main.js
index d2aa93e..6eeb4c8 100644
--- a/ios/sdk/WeexSDK/Resources/main.js
+++ b/ios/sdk/WeexSDK/Resources/main.js
@@ -1,7 +1,7 @@
-(this.nativeLog||function(e){console.log(e)})("START JS FRAMEWORK 0.19.7, Build 2017-01-10 10:50."),this.getJSFMVersion=function(){return"0.19.7"};var global=this,process={env:{}},setTimeout=global.setTimeout;!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t():"function"==typeof define&&define.amd?define(t):t()}(this,function(){"use strict";function e(e){return e&&e.__esModule?e.default:e}function t(e,t){return t={exports:{}},e(t,t.exports),t.exports}function n(){if(o(),"undefined"==typeof global.console||global.WXEnvironment&&"iOS"===global.WXEnvironment.platform)global.console={debug:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];i("debug")&&global.nativeLog.apply(global,a(e).concat(["__DEBUG"]))},log:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];i("log")&&global.nativeLog.apply(global,a(e).concat(["__LOG"]))},info:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];i("info")&&global.nativeLog.apply(global,a(
 e).concat(["__INFO"]))},warn:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];i("warn")&&global.nativeLog.apply(global,a(e).concat(["__WARN"]))},error:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];i("error")&&global.nativeLog.apply(global,a(e).concat(["__ERROR"]))}};else{var e=console.debug,t=console.log,n=console.info,r=console.warn,s=console.error;console.__ori__={debug:e,log:t,info:n,warn:r,error:s},console.debug=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];i("debug")&&console.__ori__.debug.apply(console,e)},console.log=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];i("log")&&console.__ori__.log.apply(console,e)},console.info=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];i("info")&&console.__ori__.info.apply(console,e)},console.warn=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];i("warn")&&console.__ori__.warn.apply(console,e)},console.error=function(){for(var e=[],
 t=arguments.length;t--;)e[t]=arguments[t];i("error")&&console.__ori__.error.apply(console,e)}}}function r(){Ls={},global.console=Vs}function o(){qs.forEach(function(e){var t=qs.indexOf(e);Ls[e]={},qs.forEach(function(n){var r=qs.indexOf(n);r<=t&&(Ls[e][n]=!0)})})}function i(e){var t=global.WXEnvironment&&global.WXEnvironment.logLevel||"log";return Ls[t]&&Ls[t][e]}function a(e){return e.map(function(e){var t=Object.prototype.toString.call(e);return e="[object object]"===t.toLowerCase()?JSON.stringify(e):String(e)})}function s(){if("undefined"==typeof setTimeout&&"function"==typeof Js){var e={},t=0;global.setTimeout=function(n,r){e[++t]=n,Js(t.toString(),r)},global.setTimeoutCallback=function(t){"function"==typeof e[t]&&(e[t](),delete e[t])}}}function u(){global.setTimeout=Us,global.setTimeoutCallback=null}function c(){Object.freeze(Object),Object.freeze(Array),Object.freeze(Object.prototype),Object.freeze(Array.prototype),Object.freeze(String.prototype),Object.freeze(Number.prototype
 ),Object.freeze(Boolean.prototype),Object.freeze(Error.prototype),Object.freeze(Date.prototype),Object.freeze(RegExp.prototype)}function l(){var e={createFinish:global.callCreateFinish,updateFinish:global.callUpdateFinish,refreshFinish:global.callRefreshFinish,createBody:global.callCreateBody,addElement:global.callAddElement,removeElement:global.callRemoveElement,moveElement:global.callMoveElement,updateAttrs:global.callUpdateAttrs,updateStyle:global.callUpdateStyle,addEvent:global.callAddEvent,removeEvent:global.callRemoveEvent},t=Ws.prototype,n=function(n){var r=e[n];t[n]=r?function(e,t){return r.apply(void 0,[e].concat(t))}:function(e,t){return Bs(e,[{module:"dom",method:n,args:t}],"-1")}};for(var r in e)n(r);t.componentHandler=global.callNativeComponent||function(e,t,n,r,o){return Bs(e,[{component:o.component,ref:t,method:n,args:r}])},t.moduleHandler=global.callNativeModule||function(e,t,n,r){return Bs(e,[{module:t,method:n,args:r}])}}function f(e,t){e&&(Xs[e]=t)}function d(e){r
 eturn Xs[e]}function p(e){delete Xs[e]}function h(e){var t=Xs[e];return t&&t.taskCenter?t.taskCenter:null}function v(){return(Ks++).toString()}function m(e,t,n){var r=e.documentElement;if(!(r.pureChildren.length>0||t.parentNode)){var o=r.children,i=o.indexOf(n);i<0?o.push(t):o.splice(i,0,t),1===t.nodeType?("body"===t.role?(t.docId=e.id,t.ownerDocument=e,t.parentNode=r,g(t,r)):(t.children.forEach(function(e){e.parentNode=t}),_(e,t),t.docId=e.id,t.ownerDocument=e,g(t,r),delete e.nodeMap[t.nodeId]),r.pureChildren.push(t),y(e,t)):(t.parentNode=r,e.nodeMap[t.ref]=t)}}function y(e,t){var n=t.toJSON(),r=n.children;delete n.children;var o=e.taskCenter.send("dom",{action:"createBody"},[n]);return r&&r.forEach(function(t){o=e.taskCenter.send("dom",{action:"addElement"},[n.ref,t,-1])}),o}function _(e,t){t.role="body",t.depth=1,delete e.nodeMap[t.nodeId],t.ref="_root",e.nodeMap._root=t,e.body=t}function g(e,t){e.parentNode=t,t.docId&&(e.docId=t.docId,e.ownerDocument=t.ownerDocument,e.ownerDocum
 ent.nodeMap[e.nodeId]=e,e.depth=t.depth+1),e.children.forEach(function(t){g(t,e)})}function b(e){for(;e;){if(1===e.nodeType)return e;e=e.nextSibling}}function w(e){for(;e;){if(1===e.nodeType)return e;e=e.previousSibling}}function C(e,t,n,r){n<0&&(n=0);var o=t[n-1],i=t[n];return t.splice(n,0,e),r&&(o&&(o.nextSibling=e),e.previousSibling=o,e.nextSibling=i,i&&(i.previousSibling=e)),n}function k(e,t,n,r){var o=t.indexOf(e);if(o<0)return-1;if(r){var i=t[o-1],a=t[o+1];i&&(i.nextSibling=a),a&&(a.previousSibling=i)}t.splice(o,1);var s=n;o<=n&&(s=n-1);var u=t[s-1],c=t[s];return t.splice(s,0,e),r&&(u&&(u.nextSibling=e),e.previousSibling=u,e.nextSibling=c,c&&(c.previousSibling=e)),o===s?-1:n}function O(e,t,n){var r=t.indexOf(e);if(!(r<0)){if(n){var o=t[r-1],i=t[r+1];o&&(o.nextSibling=i),i&&(i.previousSibling=o)}t.splice(r,1)}}function x(e){zs=e}function E(e,t){if(t&&t.length){var n=function(t){zs.call(this,e,t,!0)};n.prototype=Object.create(zs.prototype),Object.defineProperty(n.prototype,"cons
 tructor",{configurable:!1,enumerable:!1,writable:!1,value:zs}),t.forEach(function(t){n.prototype[t]=function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];var o=h(this.docId);if(o)return o.send("component",{ref:this.ref,component:e,method:t},n)}}),Qs[e]=n}}function S(e,t){I(e)?console.warn('Service "'+e+'" has been registered already!'):(t=Object.assign({},t),Zs.push({name:e,options:t}))}function j(e){Zs.some(function(t,n){if(t.name===e)return Zs.splice(n,1),!0})}function I(e){return A(e)>=0}function A(e){return Zs.map(function(e){return e.name}).indexOf(e)}function T(e){var t,n=Ys.exec(e);if(n)try{t=JSON.parse(n[1])}catch(e){}return t}function N(e,t,n){var r=Object.create(null);return r.service=Object.create(null),Zs.forEach(function(o){var i=(o.name,o.options),a=i.create;if(a){var s=a(e,t,n);Object.assign(r.service,s),Object.assign(r,s.instance)}}),delete r.service.instance,Object.freeze(r.service),r}function R(e,t,n,r){var o=eu[e];if(!o){o=T(t)||{},Hs[o.framework]||(o.
 framework="Weex"),n=JSON.parse(JSON.stringify(n||{})),n.bundleVersion=o.version,n.env=JSON.parse(JSON.stringify(global.WXEnvironment||{})),console.debug("[JS Framework] create an "+o.framework+"@"+n.bundleVersion+" instance from "+n.bundleVersion);var i=new Gs.CallbackManager(e),a={info:o,config:n,callbacks:i,created:Date.now(),framework:o.framework};return a.services=N(e,a,Gs),eu[e]=a,Hs[o.framework].createInstance(e,t,n,r,a)}return new Error('invalid instance id "'+e+'"')}function D(e){tu[e]=function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];"registerComponents"===e&&$(t[0]);for(var r in Hs){var o=Hs[r];o&&o[e]&&o[e].apply(o,t)}}}function $(e){Array.isArray(e)&&e.forEach(function(e){e&&e.type&&e.methods&&E(e.type,e.methods)})}function P(e){tu[e]=function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];var r=t[0],o=eu[r];if(o&&Hs[o.framework]){var i=(a=Hs[o.framework])[e].apply(a,t);return"refreshInstance"===e?Zs.forEach(function(e){var t=e.options.refresh;t
 &&t(r,{info:o,runtime:Gs})}):"destroyInstance"===e&&(Zs.forEach(function(e){var t=e.options.destroy;t&&t(r,{info:o,runtime:Gs})}),delete eu[r]),i}return new Error('invalid instance id "'+r+'"');var a}}function M(e,t){tu[t]=function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];var r=t[0],o=eu[r];return o&&Hs[o.framework]?(i=Hs[o.framework])[e].apply(i,t):new Error('invalid instance id "'+r+'"');var i}}function F(e){Gs=e||{},Hs=Gs.frameworks||{},l();for(var t in Hs){var n=Hs[t];n.init(e)}return["registerComponents","registerModules","registerMethods"].forEach(D),["destroyInstance","refreshInstance","receiveTasks","getRoot"].forEach(P),M("receiveTasks","callJS"),tu}function q(){this.nodeId=v(),this.ref=this.nodeId,this.children=[],this.pureChildren=[],this.parentNode=null,this.nextSibling=null,this.previousSibling=null}function L(e,t,n){void 0===e&&(e=nu);var r=Qs[e];return r&&!n?new r(t):(t=t||{},this.nodeType=1,this.nodeId=v(),this.ref=this.nodeId,this.type=e,this.attr=t.
 attr||{},this.style=t.style||{},this.classStyle=t.classStyle||{},this.event={},this.children=[],void(this.pureChildren=[]))}function V(e,t){var n=d(e);n.nodeMap[t.nodeId]=t}function U(e){this.nodeType=8,this.nodeId=v(),this.ref=this.nodeId,this.type="comment",this.value=e,this.children=[],this.pureChildren=[]}function J(e,t){this.id=e,this.batched=!1,this.updates=[],"function"==typeof t?Object.defineProperty(this,"handler",{configurable:!0,enumerable:!0,writable:!0,value:t}):console.error("[JS Runtime] invalid parameter, handler must be a function")}function B(e,t){return void 0===t&&(t=[]),{module:"dom",method:e,args:t}}function W(e,t){var n=t||global.callNative;return"function"!=typeof n&&console.error("[JS Runtime] no default handler"),function(t){Array.isArray(t)||(t=[t]);for(var r=0;r<t.length;r++){var o=H(e,t[r],n);if(o===-1)return o}}}function z(e,t){return"dom"===e&&ru[t]&&"function"==typeof global[ru[t]]}function H(e,t,n){var r=t.module,o=t.method,i=t.args;return z(r,o)?glo
 bal[ru[o]].apply(global,[e].concat(i,["-1"])):n(e,[t],"-1")}function G(e,t,n){e=e?e.toString():"",this.id=e,this.URL=t,f(e,this),this.nodeMap={};var r=G.Listener||J;this.listener=new r(e,n||W(e,G.handler)),this.taskCenter=new Ws(e,n?function(e){for(var t=[],r=arguments.length-1;r-- >0;)t[r]=arguments[r+1];return n.apply(void 0,t)}:G.handler),this.createDocumentElement()}function X(e,t){var n=t.attrs||{};for(var r in n)e.setAttr(r,n[r],!0);var o=t.style||{};for(var i in o)e.setStyle(i,o[i],!0)}function K(){c(),Object.freeze(iu.Element),Object.freeze(iu.Comment),Object.freeze(iu.Listener),Object.freeze(iu.Document.prototype),Object.freeze(iu.Element.prototype),Object.freeze(iu.Comment.prototype),Object.freeze(iu.Listener.prototype)}function Q(e){uu.Document=e.Document,uu.Element=e.Element,uu.Comment=e.Comment,uu.sendTasks=e.sendTasks}function Z(e){}function Y(e){}function ee(e){}function te(e,t,n){}function ne(e,t,n,r,o){var i=new uu.Document(e,n.bundleUrl),a={},s=0;i.addCallback=func
 tion(e){return s++,a[s]=e,s},i.handleCallback=function(e,t,n){var r=a[e];return n&&delete a[e],r(t)},cu[e]=i;var u=Object.assign({Document:uu.Document,Element:uu.Element,Comment:uu.Comment,sendTasks:uu.sendTasks,id:e,options:n,data:r,document:i},o),c=[],l=[];for(var f in u)c.push(f),l.push(u[f]);c.push(t);var d=new(Function.prototype.bind.apply(Function,[null].concat(c)));return d.apply(void 0,l)}function re(e,t){}function oe(e){delete cu[e]}function ie(e){return cu[e].body.toJSON()}function ae(e,t){var n={fireEvent:function(e,t,n,r,o){var i=cu[e],a=i.getRef(t);return i.fireEvent(a,n,r,o)},callback:function(e,t,n,r){var o=cu[e];return o.handleCallback(t,n,r)}},r=cu[e];if(r&&Array.isArray(t)){var o=[];return t.forEach(function(t){var r=n[t.method],i=[].concat(t.args);"function"==typeof r&&(i.unshift(e),o.push(r.apply(void 0,i)))}),o}}function se(e){console.warn("[JS Framework] Vm#$ is deprecated, please use Vm#$vm instead");var t=this._ids[e];if(t)return t.vm}function ue(e){var t=thi
 s._ids[e];if(t)return t.el}function ce(e){var t=this._ids[e];if(t)return t.vm}function le(e){var t=this._app,n=t.differ;return n.then(function(){e()})}function fe(e,t){console.warn("[JS Framework] Vm#$scrollTo is deprecated, please use \"require('@weex-module/dom').scrollTo(el, options)\" instead");var n=this.$el(e);if(n){var r=this._app.requireModule("dom");r.scrollToElement(n.ref,{offset:t})}}function de(e,t,n){var r=this,o=this.$el(e);if(o&&t&&t.styles){var i=this._app.requireModule("animation");i.transition(o.ref,t,function(){for(var e=[],i=arguments.length;i--;)e[i]=arguments[i];r._setStyle(o,t.styles),n&&n.apply(void 0,e)})}}function pe(e){var t=this._app.options;return"function"==typeof e&&(console.warn("[JS Framework] the callback of Vm#$getConfig(callback) is deprecated, this api now can directly RETURN config info."),e(t)),t}function he(e,t){console.warn("[JS Framework] Vm#$sendHttp is deprecated, please use \"require('@weex-module/stream').sendHttp(params, callback)\" ins
 tead");var n=this._app.requireModule("stream");n.sendHttp(e,t)}function ve(e){console.warn("[JS Framework] Vm#$openURL is deprecated, please use \"require('@weex-module/event').openURL(url)\" instead");var t=this._app.requireModule("event");t.openURL(e)}function me(e){console.warn("[JS Framework] Vm#$setTitle is deprecated, please use \"require('@weex-module/pageInfo').setTitle(title)\" instead");var t=this._app.requireModule("pageInfo");t.setTitle(e)}function ye(e,t){for(var n=[],r=arguments.length-2;r-- >0;)n[r]=arguments[r+2];console.warn("[JS Framework] Vm#$call is deprecated, please use \"require('@weex-module/moduleName')\" instead");var o=this._app.requireModule(e);o&&o[t]&&o[t].apply(o,n)}function _e(e){for(var t=[],n=arguments.length-1;n-- >0;)t[n]=arguments[n+1];if("function"==typeof Object.assign)Object.assign.apply(Object,[e].concat(t));else{var r=t.shift();for(var o in r)e[o]=r[o];t.length&&_e.apply(void 0,[e].concat(t))}return e}function ge(e,t,n,r){Object.defineProper
 ty(e,t,{value:n,enumerable:!!r,writable:!0,configurable:!0})}function be(e,t){if(e.length){var n=e.indexOf(t);if(n>-1)return e.splice(n,1)}}function we(e,t){return Pu.call(e,t)}function Ce(e,t){return function(n){var r=arguments.length;return r?r>1?e.apply(t,arguments):e.call(t,n):e.call(t)}}function ke(e){return null!==e&&"object"==typeof e}function Oe(e){return Mu.call(e)===Fu}function xe(e){var t=(e+"").charCodeAt(0);return 36===t||95===t}function Ee(){return"object"==typeof nativeSet?nativeSet.create():new au}function Se(e){var t=Object.prototype.toString.call(e);return t.substring(8,t.length-1).toLowerCase()}function je(e){var t=e.replace(Lu,"").replace(Vu,"");return t}function Ie(e){return e.replace(Ju,"")}function Ae(){this.id=Gu++,this.subs=[]}function Te(e){Ae.target&&Xu.push(Ae.target),Ae.target=e}function Ne(){Ae.target=Xu.pop()}function Re(){Ae.target=null,Xu=[]}function De(e,t,n,r){r&&_e(this,r);var o="function"==typeof t;this.vm=e,e._watchers.push(this),this.expression
 =t,this.cb=n,this.id=++Ku,this.active=!0,this.dirty=this.lazy,this.deps=[],this.newDeps=[],this.depIds=Ee(),this.newDepIds=Ee(),o&&(this.getter=t),this.value=this.lazy?void 0:this.get(),this.queued=this.shallow=!1}function $e(e,t){var n,r,o,i;if(t||(t=Qu,t.clear()),o=Array.isArray(e),i=ke(e),o||i){if(e.__ob__){var a=e.__ob__.dep.id;if(t.has(a))return;t.add(a)}if(o)for(n=e.length;n--;)$e(e[n],t);else if(i)for(r=Object.keys(e),n=r.length;n--;)$e(e[r[n]],t)}}function Pe(e){if(this.value=e,this.dep=new Ae,ge(e,"__ob__",this),Array.isArray(e)){var t=qu?Me:Fe;t(e,Yu,ec),this.observeArray(e)}else this.walk(e)}function Me(e,t){e.__proto__=t}function Fe(e,t,n){for(var r=0,o=n.length;r<o;r++){var i=n[r];ge(e,i,t[i])}}function qe(e,t){if(ke(e)){var n;return we(e,"__ob__")&&e.__ob__ instanceof Pe?n=e.__ob__:(Array.isArray(e)||Oe(e))&&Object.isExtensible(e)&&!e._isVue&&(n=new Pe(e)),n&&t&&n.addVm(t),n}}function Le(e,t,n){var r=new Ae,o=Object.getOwnPropertyDescriptor(e,t);if(!o||o.configurable!=
 =!1){var i=o&&o.get,a=o&&o.set,s=qe(n);Object.defineProperty(e,t,{enumerable:!0,configurable:!0,get:function(){var t=i?i.call(e):n;if(Ae.target&&(r.depend(),s&&s.dep.depend(),Array.isArray(t)))for(var o=void 0,a=0,u=t.length;a<u;a++)o=t[a],o&&o.__ob__&&o.__ob__.dep.depend();return t},set:function(t){var o=i?i.call(e):n;t!==o&&(a?a.call(e,t):n=t,s=qe(t),r.notify())}})}}function Ve(e,t,n){if(Array.isArray(e))return e.splice(t,1,n);if(we(e,t))return void(e[t]=n);if(e._isVue)return void Ve(e._data,t,n);var r=e.__ob__;if(!r)return void(e[t]=n);if(r.convert(t,n),r.dep.notify(),r.vms)for(var o=r.vms.length;o--;){var i=r.vms[o];Je(i,t)}return n}function Ue(e,t){if(we(e,t)){delete e[t];var n=e.__ob__;if(!n)return void(e._isVue&&delete e._data[t]);if(n.dep.notify(),n.vms)for(var r=n.vms.length;r--;){var o=n.vms[r];Be(o,t)}}}function Je(e,t){(tc.indexOf(t)>-1||!xe(t))&&Object.defineProperty(e,t,{configurable:!0,enumerable:!0,get:function(){return e._data[t]},set:function(n){e._data[t]=n}})}fun
 ction Be(e,t){xe(t)||delete e[t]}function We(e){e._watchers=[],ze(e),Ge(e),Ke(e)}function ze(e){var t=e._data;Oe(t)||(t={});for(var n=Object.keys(t),r=n.length;r--;)Je(e,n[r]);qe(t,e)}function He(){}function Ge(e){var t=e._computed;if(t)for(var n in t){var r=t[n],o={enumerable:!0,configurable:!0};"function"==typeof r?(o.get=Xe(r,e),o.set=He):(o.get=r.get?r.cache!==!1?Xe(r.get,e):Ce(r.get,e):He,o.set=r.set?Ce(r.set,e):He),Object.defineProperty(e,n,o)}}function Xe(e,t){var n=new De(t,e,null,{lazy:!0});return function(){return n.dirty&&n.evaluate(),Ae.target&&n.depend(),n.value}}function Ke(e){var t=e._methods;if(t)for(var n in t)e[n]=t[n]}function Qe(e){var t=e.type,n=rc[t];if("object"==typeof n)for(var r in n)if(null==e[r])e[r]=n[r];else if("object"===Se(e[r])&&"object"===Se(n[r]))for(var o in n[r])null==e[r][o]&&(e[r][o]=n[r][o])}function Ze(e,t,n){ot(e,t,n.id,e),it(e,t,n.attr),st(e,t,n.classList),ut(e,t,n.style),lt(e,t,n.events)}function Ye(e,t,n,r){t=t||{},n=n||{};var o=t._options
 ||{},i=o.props;Array.isArray(i)&&(i=i.reduce(function(e,t){return e[t]=!0,e},{})),tt(r,i,e,t),tt(n.attr,i,e,t)}function et(e,t,n,r){void 0===r&&(r={}),rt(n.classList,e,t),nt(n.style,e,t),r.children?r.children[r.children.length-1]._vm=t:r._vm=t}function tt(e,t,n,r){if(e){var o=function(o){if(!t||t[o]){var i=e[o];if("function"==typeof i){var a=pt(n,i,function(e){r[o]=e});r[o]=a}else r[o]=i}};for(var i in e)o(i)}}function nt(e,t,n){var r=function(r){var o=e[r];if("function"==typeof o){var i=pt(t,o,function(e){n._rootEl&&n._rootEl.setStyle(r,e)});n._rootEl.setStyle(r,i)}else n._rootEl&&n._rootEl.setStyle(r,o)};for(var o in e)r(o)}function rt(e,t,n){function r(e,t){"array"===Se(e)&&e.unshift(t)}var o=t._options&&t._options.style||{};if(n._rootEl){var i="@originalRootEl";if(o[i]=n._rootEl.classStyle,"function"==typeof e){var a=pt(t,e,function(e){r(e,i),at(n._rootEl,o,e)});r(a,i),at(n._rootEl,o,a)}else null!=e&&(r(e,i),at(n._rootEl,o,e))}}function ot(e,t,n,r){var o=Object.create(null);if(O
 bject.defineProperties(o,{vm:{value:r,writable:!1,configurable:!1},el:{get:function(){return t||r._rootEl},configurable:!1}}),"function"==typeof n){var i=n;n=i.call(e),(n||0===n)&&(e._ids[n]=o),pt(e,i,function(t){t&&(e._ids[t]=o)})}else n&&"string"==typeof n&&(e._ids[n]=o)}function it(e,t,n){ft(e,t,"attr",n)}function at(e,t,n){for(var r={},o=n.length,i=function(e){var o=t[n[e]];o&&Object.keys(o).forEach(function(e){r[e]=o[e]})},a=0;a<o;a++)i(a);e.setClassStyle(r)}function st(e,t,n){if("function"==typeof n||Array.isArray(n)){if(Array.isArray(n)&&!n.length)return void t.setClassStyle({});var r=e._options&&e._options.style||{};if("function"==typeof n){var o=pt(e,n,function(e){at(t,r,e)});at(t,r,o)}else at(t,r,n)}}function ut(e,t,n){ft(e,t,"style",n)}function ct(e,t,n,r){t.addEvent(n,Ce(r,e))}function lt(e,t,n){if(n)for(var r=Object.keys(n),o=r.length;o--;){var i=r[o],a=n[i];"string"==typeof a&&(a=e[a],a||console.warn('[JS Framework] The event handler "'+a+'" is not defined.')),ct(e,t,i
 ,a)}}function ft(e,t,n,r){if(r)for(var o=Object.keys(r),i=o.length;i--;){var a=o[i],s=r[a];"function"==typeof s?dt(e,t,n,a,s):t[oc[n]](a,s)}}function dt(e,t,n,r,o){var i=oc[n],a=pt(e,o,function(n){function o(){t[i](r,n)}var a=e&&e._app&&e._app.differ;a?a.append("element",t.depth,t.ref,o):o()});t[i](r,a)}function pt(e,t,n){if(e._static)return t.call(e,e);var r=new De(e,t,function(e,t){"object"!=typeof e&&e===t||n(e)});return r.value}function ht(e,t){var n=e._app.doc;return n.createBody(t)}function vt(e,t){var n=e._app.doc;return n.createElement(t)}function mt(e,t){var n=yt(e),r=_t(e),o=ic++;if(t.element){var i=t.updateMark;i?(i.element&&(i=i.end),t.element.insertAfter(r,i),t.element.insertAfter(n,i),t.updateMark=r):(t.element.insertBefore(n,t.end),t.element.insertBefore(r,t.end)),t=t.element}else t.appendChild(n),t.appendChild(r);return{start:n,end:r,element:t,blockId:o}}function yt(e){var t=e._app.doc,n=t.createComment("start");return n}function _t(e){var t=e._app.doc,n=t.createComm
 ent("end");return n}function gt(e,t,n){if(n.element){var r=n.end,o=n.updateMark;if(n.children&&n.children.push(t),o){var i=bt(e,t,o);return n.updateMark=t.element?t.end:t,i}if(!t.element)return n.element.insertBefore(t,r);n.element.insertBefore(t.start,r),n.element.insertBefore(t.end,r)}else{if(!t.element)return n.appendChild(t);n.appendChild(t.start),n.appendChild(t.end)}}function bt(e,t,n){return t.element?Ct(t,n):wt(t,n)}function wt(e,t){var n=t.parentNode;if(n)return n.insertAfter(e,t)}function Ct(e,t){var n=t.parentNode;if(n){for(var r,o=e.start,i=[o];o&&o!==e.end;)o=o.nextSibling,i.push(o);var a=t;return i.every(function(e){return r=n.insertAfter(e,a),a=e,r!==-1}),r}}function kt(e,t,n){void 0===n&&(n=!1),t.element?xt(t,n):Ot(t),t._vm&&t._vm.$emit("hook:destroyed")}function Ot(e){var t=e.parentNode;t&&t.removeChild(e)}function xt(e,t){void 0===t&&(t=!1);for(var n=[],r=e.start.nextSibling;r&&r!==e.end;)n.push(r),r=r.nextSibling;t||Ot(e.start),n.forEach(function(e){Ot(e)}),t||Ot(
 e.end)}function Et(e){var t=e._options||{},n=t.template||{};t.replace?n.children&&1===n.children.length?St(e,n.children[0],e._parentEl):St(e,n.children,e._parentEl):St(e,n,e._parentEl),console.debug('[JS Framework] "ready" lifecycle in Vm('+e._type+")"),e.$emit("hook:ready"),e._ready=!0}function St(e,t,n,r){var o=e._app||{};if(o.lastSignal!==-1){if(t.attr&&t.attr.hasOwnProperty("static")&&(e._static=!0),jt(t))return void Dt(e,t,n,r);if(r=r||{},It(t))return console.debug('[JS Framework] compile "content" block by',t),void(e._content=mt(e,n));if(At(t,r))return console.debug('[JS Framework] compile "repeat" logic by',t),void("document"===n.type?console.warn("[JS Framework] The root element does't support `repeat` directive!"):$t(e,t,n));if(Tt(t,r))return console.debug('[JS Framework] compile "if" logic by',t),void("document"===n.type?console.warn("[JS Framework] The root element does't support `if` directive!"):Pt(e,t,n,r));var i=r.type||t.type;if(Nt(i,r))return void Mt(e,t,n,i,r);var 
 a=i,s=Rt(e,t,a);if(s)return console.debug("[JS Framework] compile composed component by",t),void Ft(e,s,t,n,a,r);console.debug("[JS Framework] compile native component by",t),qt(e,t,n,a)}}function jt(e){return Array.isArray(e)}function It(e){return"content"===e.type||"slot"===e.type}function At(e,t){return!t.hasOwnProperty("repeat")&&e.repeat}function Tt(e,t){return!t.hasOwnProperty("shown")&&e.shown}function Nt(e,t){return"function"==typeof e&&!t.hasOwnProperty("type")}function Rt(e,t,n){var r;return e._app&&e._app.customComponentMap&&(r=e._app.customComponentMap[n]),e._options&&e._options.components&&(r=e._options.components[n]),t.component&&(r=r||{}),r}function Dt(e,t,n,r){var o=mt(e,n);t.forEach(function(t){St(e,t,o,r)})}function $t(e,t,n){var r=t.repeat,o="function"==typeof r,i=r.getter||r.expression||r;"function"!=typeof i&&(i=function(){return[]});var a=r.key||"$index",s=r.value||"$value",u=r.trackBy||t.trackBy||t.attr&&t.attr.trackBy,c=mt(e,n);c.children=[],c.data=[],c.vms=[
 ],Vt(e,t,c,{getter:i,key:a,value:s,trackBy:u,oldStyle:o})}function Pt(e,t,n,r){var o={shown:!0},i=mt(e,n);n.element&&n.children&&n.children.push(i),r.repeat&&(o.repeat=r.repeat),Ut(e,t,i,o)}function Mt(e,t,n,r,o){var i=r.call(e),a=_e({type:i},o),s=mt(e,n);n.element&&n.children&&n.children.push(s),pt(e,r,function(n){var r=_e({type:n},o);kt(e,s,!0),St(e,t,s,r)}),St(e,t,s,a)}function Ft(e,t,n,r,o,i){var a=e.constructor,s=new a(o,t,e,r,void 0,{"hook:init":function(){e._static&&(this._static=e._static),ot(e,null,n.id,this),this._externalBinding={parent:e,template:n}},"hook:created":function(){Ye(e,this,n,i.repeat)},"hook:ready":function(){this._content&&Lt(e,n,this._content)}});et(e,s,n,r)}function qt(e,t,n,r){Qe(t);var o;if("_documentElement"===n.ref?(console.debug("[JS Framework] compile to create body for "+r),o=ht(e,r)):(console.debug("[JS Framework] compile to create element for "+r),o=vt(e,r)),!e._rootEl){e._rootEl=o;var i=e._externalBinding||{},a=i.template,s=i.parent;if(a&&a.even
 ts&&s&&o)for(var u in a.events){var c=s[a.events[u]];c&&o.addEvent(u,Ce(c,s))}}Ze(e,o,t),t.attr&&t.attr.append&&(t.append=t.attr.append),t.append&&(o.attr=o.attr||{},o.attr.append=t.append);var l="tree"===t.append,f=e._app||{};f.lastSignal===-1||l||(console.debug("[JS Framework] compile to append single node for",o),f.lastSignal=gt(e,o,n)),f.lastSignal!==-1&&Lt(e,t,o),f.lastSignal!==-1&&l&&(console.debug("[JS Framework] compile to append whole tree for",o),f.lastSignal=gt(e,o,n))}function Lt(e,t,n){var r=e._app||{},o=t.children;o&&o.length&&o.every(function(t){return St(e,t,n),r.lastSignal!==-1})}function Vt(e,t,n,r){function o(e,r,o){var a;c?(a=e,ke(e)?(a[l]=r,a.hasOwnProperty("INDEX")||Object.defineProperty(a,"INDEX",{value:function(){console.warn('[JS Framework] "INDEX" in repeat is deprecated, please use "$index" instead')}})):(console.warn("[JS Framework] Each list item must be an object in old-style repeat, please use `repeat={{v in list}}` instead."),a={},a[l]=r,a[f]=e)):(a={
 },a[l]=r,a[f]=e);var s=Bt(o,a);i.push(s),St(s,t,n,{repeat:e})}var i=n.vms,a=n.children,s=r.getter,u=r.trackBy,c=r.oldStyle,l=r.key,f=r.value,d=Jt(e,n,s,"repeat",function(t){if(console.debug('[JS Framework] the "repeat" item has changed',t),n&&t){var r=a.slice(),s=i.slice(),d=n.data.slice(),p={},h={};t.forEach(function(e,t){var n=u?e[u]:c?e[l]:t;null!=n&&""!==n&&(p[n]=e)});var v=[];d.forEach(function(t,n){var o=u?t[u]:c?t[l]:n;p.hasOwnProperty(o)?(h[o]={item:t,index:n,key:o,target:r[n],vm:s[n]},v.push(t)):kt(e,r[n])}),a.length=0,i.length=0,n.data=t.slice(),n.updateMark=n.start,t.forEach(function(t,r){var s=u?t[u]:c?t[l]:r,d=h[s];d?(d.item===v[0]?v.shift():(v.$remove(d.item),bt(e,d.target,n.updateMark,!0)),a.push(d.target),i.push(d.vm),c?d.vm=t:d.vm[f]=t,d.vm[l]=r,n.updateMark=d.target):o(t,r,e)}),delete n.updateMark}});n.data=d.slice(0),d.forEach(function(t,n){o(t,n,e)})}function Ut(e,t,n,r){var o=Jt(e,n,t.shown,"shown",function(o){console.debug('[JS Framework] the "if" item was chan
 ged',o),n&&!!n.display!=!!o&&(n.display=!!o,o?St(e,t,n,r):kt(e,n,!0))});n.display=!!o,o&&St(e,t,n,r)}function Jt(e,t,n,r,o){var i=e&&e._app&&e._app.differ,a={},s=(t.element.depth||0)+1;return pt(e,n,function(e){a.latestValue=e,i&&!a.recorded&&i.append(r,s,t.blockId,function(){var e=a.latestValue;o(e),a.recorded=!1,a.latestValue=void 0}),a.recorded=!0})}function Bt(e,t){var n=Object.create(e);return n._data=t,ze(n),Ge(n),n._realParent=e,e._static&&(n._static=e._static),n}function Wt(e,t){if(t instanceof Wt)return t;this.timestamp=Date.now(),this.detail=t,this.type=e;var n=!1;this.stop=function(){n=!0},this.hasStopped=function(){return n}}function zt(e,t){var n=this,r=this._vmEvents,o=r[e];if(o){var i=new Wt(e,t);o.forEach(function(e){e.call(n,i)})}}function Ht(e,t){var n=new Wt(e,t);this.$emit(e,n),!n.hasStopped()&&this._parent&&this._parent.$dispatch&&this._parent.$dispatch(e,n)}function Gt(e,t){var n=new Wt(e,t);this.$emit(e,n),!n.hasStopped()&&this._childrenVms&&this._childrenVms.
 forEach(function(t){t.$broadcast(e,n)})}function Xt(e,t){if(e&&"function"==typeof t){var n=this._vmEvents,r=n[e]||[];r.push(t),n[e]=r,"hook:ready"===e&&this._ready&&this.$emit("hook:ready")}}function Kt(e,t){if(e){var n=this._vmEvents;if(!t)return void delete n[e];var r=n[e];r&&r.$remove(t)}}function Qt(e,t){var n=e._options||{},r=n.events||{};for(var o in r)e.$on(o,r[o]);for(var i in t)e.$on(i,t[i]);ac.forEach(function(t){e.$on("hook:"+t,n[t])})}function Zt(e){e.$emit=zt,e.$dispatch=Ht,e.$broadcast=Gt,e.$on=Xt,e.$off=Kt}function Yt(e,t,n,r,o,i){n=n||{},this._parent=n._realParent?n._realParent:n,this._app=n._app||{},n._childrenVms&&n._childrenVms.push(this),!t&&this._app.customComponentMap&&(t=this._app.customComponentMap[e]),t=t||{};var a=t.data||{};this._options=t,this._methods=t.methods||{},this._computed=t.computed||{},this._css=t.style||{},this._ids={},this._vmEvents={},this._childrenVms=[],this._type=e,Qt(this,i),console.debug('[JS Framework] "init" lifecycle in Vm('+this._typ
 e+")"),this.$emit("hook:init"),this._inited=!0,this._data="function"==typeof a?a():a,o&&_e(this._data,o),We(this),console.debug('[JS Framework] "created" lifecycle in Vm('+this._type+")"),this.$emit("hook:created"),this._created=!0,t.methods&&t.methods.ready&&(console.warn('"exports.methods.ready" is deprecated, please use "exports.created" instead'),t.methods.ready.call(this)),this._app.doc&&(this._parentEl=r||this._app.doc.documentElement,Et(this))}function en(e,t){var n=function(n){var r=sc[n];r||(r={},sc[n]=r),e[n].forEach(function(e){"string"==typeof e&&(e={name:e}),r[e.name]&&!t||(r[e.name]=e)})};for(var r in e)n(r)}function tn(e,t){var n=e.prototype;for(var r in t)n.hasOwnProperty(r)||(n[r]=t[r])}function nn(e,t){var n=sc[t],r={},o=function(n){Object.defineProperty(r,n,{configurable:!0,enumerable:!0,get:function(){return function(){for(var r=[],o=arguments.length;o--;)r[o]=arguments[o];return e.callTasks({module:t,method:n,args:r})}},set:function(r){if("function"==typeof r)re
 turn e.callTasks({module:t,method:n,args:[r]})}})};for(var i in n)o(i);return r}function rn(e,t){var n=e.customComponentMap;return n[t]}function on(e,t,n){var r=e.customComponentMap;return r[t]?void console.error("[JS Framework] define a component("+t+") that already exists"):void(r[t]=n)}function an(e){var t=uc.valid(e);if(t)return e;e="string"==typeof e?e:"";for(var n=e.split("."),r=0,o=[];r<3;){var i="string"==typeof n[r]&&n[r]?n[r]:"0";o.push(i),r++}return o.join(".")}function sn(e,t,n){var r={isDowngrade:!0,errorType:1,code:1e3},o=function(e,t,n){return"Downgrade["+e+"] :: deviceInfo "+t+" matched criteria "+n},i=e.toLowerCase();return r.errorMessage=o(e,t,n),i.indexOf("osversion")>=0?r.code=1001:i.indexOf("appversion")>=0?r.code=1002:i.indexOf("weexversion")>=0?r.code=1003:i.indexOf("devicemodel")>=0&&(r.code=1004),r}function un(e,t){t=t||global.WXEnvironment,t=Oe(t)?t:{};var n={isDowngrade:!1};if("function"===Se(e)){var r=e.call(this,t,{semver:uc,normalizeVersion:an});r=!!r,n
 =r?sn("custom","","custom params"):n}else{e=Oe(e)?e:{};var o=t.platform||"unknow",i=o.toLowerCase(),a=e[i]||{};for(var s in t){var u=s,c=u.toLowerCase(),l=t[s],f=c.indexOf("version")>=0,d=c.indexOf("devicemodel")>=0,p=a[s];if(p&&f){var h=an(p),v=an(t[s]);if(uc.satisfies(v,h)){n=sn(u,l,p);break}}else if(d){var m="array"===Se(p)?p:[p];if(m.indexOf(l)>=0){n=sn(u,l,p);break}}}}return n}function cn(e,t){if(void 0===t&&(t={}),e&&e.callTasks)return e.callTasks([{module:"meta",method:"setViewport",args:[t]}])}function ln(e,t,n,r){console.debug("[JS Framework] bootstrap for "+t);var o;if(Bu(t))o=je(t);else{if(!Hu(t))return new Error("Wrong component name: "+t);if(o=Ie(t),!rn(e,o))return new Error("It's not a component: "+t)}if(n=Oe(n)?n:{},"string"==typeof n.transformerVersion&&"string"==typeof global.transformerVersion&&!uc.satisfies(n.transformerVersion,global.transformerVersion))return new Error("JS Bundle version: "+n.transformerVersion+" not compatible with "+global.transformerVersion);
 var i=un(n.downgrade);return i.isDowngrade?(e.callTasks([{module:"instanceWrap",method:"error",args:[i.errorType,i.code,i.errorMessage]
-}]),new Error("Downgrade["+i.code+"]: "+i.errorMessage)):(n.viewport&&cn(e,n.viewport),void(e.vm=new Yt(o,null,{_app:e},null,r)))}function fn(e,t,n){console.warn("[JS Framework] Register is deprecated, please install lastest transformer."),on(e,t,n)}function dn(e,t){console.debug("[JS Framework] Refresh with",t,"in instance["+e.id+"]");var n=e.vm;return n&&t?("function"==typeof n.refreshData?n.refreshData(t):_e(n,t),e.differ.flush(),void e.doc.taskCenter.send("dom",{action:"refreshFinish"},[])):new Error('invalid data "'+t+'"')}function pn(e){console.debug("[JS Framework] Destory an instance("+e.id+")"),e.vm&&hn(e.vm),e.id="",e.options=null,e.blocks=null,e.vm=null,e.doc.destroy(),e.doc=null,e.customComponentMap=null,e.commonModules=null,e.callbacks=null}function hn(e){if(delete e._app,delete e._computed,delete e._css,delete e._data,delete e._ids,delete e._methods,delete e._options,delete e._parent,delete e._parentEl,delete e._rootEl,e._watchers){for(var t=e._watchers.length;t--;)e._
 watchers[t].teardown();delete e._watchers}if(e._childrenVms){for(var n=e._childrenVms.length;n--;)hn(e._childrenVms[n]);delete e._childrenVms}console.debug('[JS Framework] "destroyed" lifecycle in Vm('+e._type+")"),e.$emit("hook:destroyed"),delete e._type,delete e._vmEvents}function vn(e){var t=e.doc||{},n=t.body||{};return n.toJSON?n.toJSON():{}}function mn(e,t,n,r,o){if(console.debug('[JS Framework] Fire a "'+n+'" event on an element('+t+") in instance("+e.id+")"),Array.isArray(t))return void t.some(function(t){return mn(e,t,n,r)!==!1});var i=e.doc.getRef(t);if(i){var a=e.doc.fireEvent(i,n,r,o);return e.differ.flush(),e.doc.taskCenter.send("dom",{action:"updateFinish"},[]),a}return new Error('invalid element reference "'+t+'"')}function yn(e,t,n,r){console.debug("[JS Framework] Invoke a callback("+t+") with",n,"in instance("+e.id+")");var o=e.callbacks[t];return"function"==typeof o?(o(n),"undefined"!=typeof r&&r!==!1||(e.callbacks[t]=void 0),e.differ.flush(),void e.doc.taskCenter.
 send("dom",{action:"updateFinish"},[])):new Error('invalid callback id "'+t+'"')}function _n(e){e.differ.flush()}function gn(e,t){var n;return"array"!==Se(t)&&(t=[t]),t.forEach(function(t){t.args=t.args.map(function(t){return bn(t,e)}),n=e.doc.taskCenter.send("module",{module:t.module,method:t.method},t.args)}),n}function bn(e,t){var n=Se(e);switch(n){case"undefined":case"null":return"";case"regexp":return e.toString();case"date":return e.toISOString();case"number":case"string":case"boolean":case"array":case"object":return e instanceof nc.Element?e.ref:e;case"function":return t.callbacks[++t.uid]=e,t.uid.toString();default:return JSON.stringify(e)}}function wn(e,t,n,r){console.debug("[JS Framework] Intialize an instance with:\n",n);var o,i=function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];return cc.apply(void 0,[e].concat(t))},a=function(t,r,i){o=ln(e,t,r,i||n),_n(e),e.doc.listener.createFinish(),console.debug("[JS Framework] After intialized an instance("+e.id+")")}
 ,s=Yt,u=function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];return fn.apply(void 0,[e].concat(t))},c=function(t,n){o=ln(e,t,{},n)},l=function(t){return function(n){o=ln(e,t,{},n)}},f=e.doc,d=function(t){return e.requireModule(je(t))},p={config:e.options,define:i,bootstrap:a,requireModule:d,document:f,Vm:s};Object.freeze(p);var h;"function"==typeof t?h=t.toString().substr(12):t&&(h=t.toString()),h="(function(global){\n\n "+h+" \n\n})(Object.create(this))";var v=global.WXEnvironment,m={};if(v&&"Web"!==v.platform){var y=e.requireModule("timer");Object.assign(m,{setTimeout:function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];var r=function(){t[0].apply(t,t.slice(2))};return y.setTimeout(r,t[1]),e.uid.toString()},setInterval:function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];var r=function(){t[0].apply(t,t.slice(2))};return y.setInterval(r,t[1]),e.uid.toString()},clearTimeout:function(e){y.clearTimeout(e)},clearInterval:function(e){y.clearInterva
 l(e)}})}var _=Object.assign({define:i,require:l,document:f,bootstrap:a,register:u,render:c,__weex_define__:i,__weex_bootstrap__:a,__weex_document__:f,__weex_require__:d,__weex_viewmodel__:s,weex:p},m,r);return Cn(_,h),o}function Cn(e,t){var n=[],r=[];for(var o in e)n.push(o),r.push(e[o]);n.push(t);var i=new(Function.prototype.bind.apply(Function,[null].concat(n)));return i.apply(void 0,r)}function kn(e,t){var n=e[t];for(var r in n)n[r]()}function On(e,t){var n=e[t];for(var r in n){var o=n[r];o.forEach(function(e){e()})}}function xn(e,t,n){this.id=e,this.options=t||{},this.vm=null,this.customComponentMap={},this.commonModules={},Object.defineProperty(this,"callbacks",{get:function(){return n.callbacks},set:function(e){e||n.close()}}),Object.defineProperty(this,"uid",{get:function(){return n.lastCallbackId},set:function(e){n.lastCallbackId=e}}),this.callbackManager=n,this.doc=new nc.Document(e,this.options.bundleUrl,null,nc.Listener),this.differ=new lc(e)}function En(e,t,n,r,o){var i=
 o||{},a=i.services,s=i.callbacks;Re();var u=fc[e];n=n||{};var c;return u?c=new Error('invalid instance id "'+e+'"'):(u=new xn(e,n,s),fc[e]=u,c=wn(u,t,r,a)),c}function Sn(e){nc.Document=e.Document,nc.Element=e.Element,nc.Comment=e.Comment,nc.sendTasks=e.sendTasks,nc.Listener=e.Listener}function jn(e,t){var n,r=fc[e];return n=r?dn(r,t):new Error('invalid instance id "'+e+'"')}function In(e){Re();var t=fc[e];return t?(pn(t),delete fc[e],fc):new Error('invalid instance id "'+e+'"')}function An(e){Array.isArray(e)&&e.forEach(function(e){e&&("string"==typeof e?dc[e]=!0:"object"==typeof e&&"string"==typeof e.type&&(dc[e.type]=e))})}function Tn(e){"object"==typeof e&&en(e)}function Nn(e){"object"==typeof e&&tn(Yt,e)}function Rn(e,t){var n=fc[e];if(n&&Array.isArray(t)){var r=[];return t.forEach(function(t){var n=pc[t.method],o=[].concat(t.args);"function"==typeof n&&(o.unshift(e),r.push(n.apply(void 0,o)))}),r}return new Error('invalid instance id "'+e+'" or tasks')}function Dn(e){var t,n=fc
 [e];return t=n?vn(n):new Error('invalid instance id "'+e+'"')}function $n(e,t){void 0===t&&(t={}),this.type=e||"message",this.data=t.data||null,this.origin=t.origin||"",this.source=t.source||null,this.ports=t.ports||[],this.target=null,this.timeStamp=Date.now()}function Pn(){}function Mn(e,t,n,r){console.warn("[Upgrade Warning] $userTrack will be removed in the next version!"),console.warn("[JS Framework] Vm#$userTrack is deprecated, please use \"require('@weex-module/userTrack').commit(type, name, comName, param)\" instead");var o=this._app.requireModule("userTrack");o.commit(e,t,n,r)}function Fn(e,t){if(console.warn("[Upgrade Warning] $sendMtop will be removed in the next version!"),console.warn("[JS Framework] Vm#$sendMtop is deprecated, please use \"require('@weex-module/stream').sendMtop(params, callback)\" instead"),"undefined"==typeof window){var n=this._app.requireModule("windvane");n.call({class:"MtopWVPlugin",method:"send",data:e},t)}else{var r=this._app.requireModule("str
 eam");r.sendMtop(e,t)}}function qn(e,t){console.warn("[Upgrade Warning] $callWindvane will be removed in the next version!"),console.warn("[JS Framework] Vm#$callWindvane is deprecated, please use \"require('@weex-module/windvane').call(params, callback)\" instead");var n=this._app.requireModule("windvane");n.call(e,t)}function Ln(e,t){console.warn("[Upgrade Warning] $setSpm will be removed in the next version!"),console.warn("[JS Framework] Vm#$setSpm is deprecated, please use \"require('@weex-module/pageInfo').setSpm(a, b)\" instead");var n=this._app.requireModule("pageInfo");n.setSpm(e,t)}function Vn(e){console.warn("[Upgrade Warning] $getUserInfo will be removed in the next version!"),console.warn("[JS Framework] Vm#$getUserInfo is deprecated, please use \"require('@weex-module/user').getUserInfo(callback)\" instead");var t=this._app.requireModule("user");t.getUserInfo(e)}function Un(e){console.warn("[Upgrade Warning] $login will be removed in the next version!"),console.warn("[
 JS Framework] Vm#$login is deprecated, please use \"require('@weex-module/user').login(callback)\" instead");var t=this._app.requireModule("user");t.login(e)}function Jn(e){console.warn("[Upgrade Warning] $logout will be removed in the next version!"),console.warn("[JS Framework] Vm#$logout is deprecated, please use \"require('@weex-module/user').logout(callback)\" instead");var t=this._app.requireModule("user");t.logout(e)}var Bn={browser:"0.5.0",framework:"0.19.7",transformer:">=0.1.5 <0.5"};Array.from||(Array.from=function(){var e=Object.prototype.toString,t=function(t){return"function"==typeof t||"[object Function]"===e.call(t)},n=function(e){var t=Number(e);return isNaN(t)?0:0!==t&&isFinite(t)?(t>0?1:-1)*Math.floor(Math.abs(t)):t},r=Math.pow(2,53)-1,o=function(e){var t=n(e);return Math.min(Math.max(t,0),r)};return function(e){var n=this,r=Object(e);if(null==e)throw new TypeError("Array.from requires an array-like object - not null or undefined");var i,a=arguments.length>1?argum
 ents[1]:void 0;if("undefined"!=typeof a){if(!t(a))throw new TypeError("Array.from: when provided, the second argument must be a function");arguments.length>2&&(i=arguments[2])}for(var s,u=o(r.length),c=t(n)?Object(new n(u)):new Array(u),l=0;l<u;)s=r[l],a?c[l]="undefined"==typeof i?a(s,l):a.call(i,s,l):c[l]=s,l+=1;return c.length=u,c}}());var Wn="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},zn=t(function(e){var t=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=t)}),Hn=t(function(e){var t=e.exports={version:"2.4.0"};"number"==typeof __e&&(__e=t)}),Gn=function(e){return"object"==typeof e?null!==e:"function"==typeof e},Xn=Gn,Kn=function(e){if(!Xn(e))throw TypeError(e+" is not an object!");return e},Qn=function(e){try{return!!e()}catch(e){return!0}},Zn=!Qn(function(){return 7!=Object.defineProperty({},"a",{get:function()
 {return 7}}).a}),Yn=Gn,er=zn.document,tr=Yn(er)&&Yn(er.createElement),nr=function(e){return tr?er.createElement(e):{}},rr=!Zn&&!Qn(function(){return 7!=Object.defineProperty(nr("div"),"a",{get:function(){return 7}}).a}),or=Gn,ir=function(e,t){if(!or(e))return e;var n,r;if(t&&"function"==typeof(n=e.toString)&&!or(r=n.call(e)))return r;if("function"==typeof(n=e.valueOf)&&!or(r=n.call(e)))return r;if(!t&&"function"==typeof(n=e.toString)&&!or(r=n.call(e)))return r;throw TypeError("Can't convert object to primitive value")},ar=Kn,sr=rr,ur=ir,cr=Object.defineProperty,lr=Zn?Object.defineProperty:function(e,t,n){if(ar(e),t=ur(t,!0),ar(n),sr)try{return cr(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e},fr={f:lr},dr=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},pr=fr,hr=dr,vr=Zn?function(e,t,n){return pr.f(e,t,hr(1,n))}:function(e,t,n){return e[t]=n,e},mr={}.hasOwnProperty,yr=funct
 ion(e,t){return mr.call(e,t)},_r=0,gr=Math.random(),br=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++_r+gr).toString(36))},wr=t(function(e){var t=zn,n=vr,r=yr,o=br("src"),i="toString",a=Function[i],s=(""+a).split(i);Hn.inspectSource=function(e){return a.call(e)},(e.exports=function(e,i,a,u){var c="function"==typeof a;c&&(r(a,"name")||n(a,"name",i)),e[i]!==a&&(c&&(r(a,o)||n(a,o,e[i]?""+e[i]:s.join(String(i)))),e===t?e[i]=a:u?e[i]?e[i]=a:n(e,i,a):(delete e[i],n(e,i,a)))})(Function.prototype,i,function(){return"function"==typeof this&&this[o]||a.call(this)})}),Cr=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e},kr=Cr,Or=function(e,t,n){if(kr(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,o){return e.call(t,n,r,o)}}return function(){return e.apply(t,arguments)}},xr=zn,Er=Hn,Sr=vr,jr=wr,Ir=Or,Ar="prototype",Tr=function(e,t,n){var 
 r,o,i,a,s=e&Tr.F,u=e&Tr.G,c=e&Tr.S,l=e&Tr.P,f=e&Tr.B,d=u?xr:c?xr[t]||(xr[t]={}):(xr[t]||{})[Ar],p=u?Er:Er[t]||(Er[t]={}),h=p[Ar]||(p[Ar]={});u&&(n=t);for(r in n)o=!s&&d&&void 0!==d[r],i=(o?d:n)[r],a=f&&o?Ir(i,xr):l&&"function"==typeof i?Ir(Function.call,i):i,d&&jr(d,r,i,e&Tr.U),p[r]!=i&&Sr(p,r,a),l&&h[r]!=i&&(h[r]=i)};xr.core=Er,Tr.F=1,Tr.G=2,Tr.S=4,Tr.P=8,Tr.B=16,Tr.W=32,Tr.U=64,Tr.R=128;var Nr=Tr,Rr={}.toString,Dr=function(e){return Rr.call(e).slice(8,-1)},$r=Dr,Pr=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==$r(e)?e.split(""):Object(e)},Mr=function(e){if(void 0==e)throw TypeError("Can't call method on  "+e);return e},Fr=Pr,qr=Mr,Lr=function(e){return Fr(qr(e))},Vr=Math.ceil,Ur=Math.floor,Jr=function(e){return isNaN(e=+e)?0:(e>0?Ur:Vr)(e)},Br=Jr,Wr=Math.min,zr=function(e){return e>0?Wr(Br(e),9007199254740991):0},Hr=Jr,Gr=Math.max,Xr=Math.min,Kr=function(e,t){return e=Hr(e),e<0?Gr(e+t,0):Xr(e,t)},Qr=Lr,Zr=zr,Yr=Kr,eo=function(e){return function(t,n,r){var 
 o,i=Qr(t),a=Zr(i.length),s=Yr(r,a);if(e&&n!=n){for(;a>s;)if(o=i[s++],o!=o)return!0}else for(;a>s;s++)if((e||s in i)&&i[s]===n)return e||s||0;return!e&&-1}},to=zn,no="__core-js_shared__",ro=to[no]||(to[no]={}),oo=function(e){return ro[e]||(ro[e]={})},io=oo("keys"),ao=br,so=function(e){return io[e]||(io[e]=ao(e))},uo=yr,co=Lr,lo=eo(!1),fo=so("IE_PROTO"),po=function(e,t){var n,r=co(e),o=0,i=[];for(n in r)n!=fo&&uo(r,n)&&i.push(n);for(;t.length>o;)uo(r,n=t[o++])&&(~lo(i,n)||i.push(n));return i},ho="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),vo=po,mo=ho,yo=Object.keys||function(e){return vo(e,mo)},_o=Object.getOwnPropertySymbols,go={f:_o},bo={}.propertyIsEnumerable,wo={f:bo},Co=Mr,ko=function(e){return Object(Co(e))},Oo=yo,xo=go,Eo=wo,So=ko,jo=Pr,Io=Object.assign,Ao=!Io||Qn(function(){var e={},t={},n=Symbol(),r="abcdefghijklmnopqrst";return e[n]=7,r.split("").forEach(function(e){t[e]=e}),7!=Io({},e)[n]||Object.keys(Io({},t)).
 join("")!=r})?function(e,t){for(var n=arguments,r=So(e),o=arguments.length,i=1,a=xo.f,s=Eo.f;o>i;)for(var u,c=jo(n[i++]),l=a?Oo(c).concat(a(c)):Oo(c),f=l.length,d=0;f>d;)s.call(c,u=l[d++])&&(r[u]=c[u]);return r}:Io,To=Nr;To(To.S+To.F,"Object",{assign:Ao}),Object.setPrototypeOf||(Object.setPrototypeOf=function(e,t){function n(e,t){return r.call(e,t),e}var r;try{r=e.getOwnPropertyDescriptor(e.prototype,t).set,r.call({},null)}catch(o){if(e.prototype!=={}[t]||void 0==={__proto__:null}.__proto__)return;r=function(e){this[t]=e},n.polyfill=n(n({},null),e.prototype)instanceof e}return n}(Object,"__proto__"));var No=Wn,Ro=No.WXEnvironment;Ro&&"iOS"===Ro.platform&&(Wn.Promise=void 0);var Do=t(function(e){var t=oo("wks"),n=br,r=zn.Symbol,o="function"==typeof r,i=e.exports=function(e){return t[e]||(t[e]=o&&r[e]||(o?r:n)("Symbol."+e))};i.store=t}),$o=Dr,Po=Do("toStringTag"),Mo="Arguments"==$o(function(){return arguments}()),Fo=function(e,t){try{return e[t]}catch(e){}},qo=function(e){var t,n,r;re
 turn void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=Fo(t=Object(e),Po))?n:Mo?$o(t):"Object"==(r=$o(t))&&"function"==typeof t.callee?"Arguments":r},Lo=qo,Vo={};Vo[Do("toStringTag")]="z",Vo+""!="[object z]"&&wr(Object.prototype,"toString",function(){return"[object "+Lo(this)+"]"},!0);var Uo=Jr,Jo=Mr,Bo=function(e){return function(t,n){var r,o,i=String(Jo(t)),a=Uo(n),s=i.length;return a<0||a>=s?e?"":void 0:(r=i.charCodeAt(a),r<55296||r>56319||a+1===s||(o=i.charCodeAt(a+1))<56320||o>57343?e?i.charAt(a):r:e?i.slice(a,a+2):(r-55296<<10)+(o-56320)+65536)}},Wo=!1,zo={},Ho=fr,Go=Kn,Xo=yo,Ko=Zn?Object.defineProperties:function(e,t){Go(e);for(var n,r=Xo(t),o=r.length,i=0;o>i;)Ho.f(e,n=r[i++],t[n]);return e},Qo=zn.document&&document.documentElement,Zo=Kn,Yo=Ko,ei=ho,ti=so("IE_PROTO"),ni=function(){},ri="prototype",oi=function(){var e,t=nr("iframe"),n=ei.length,r="<",o=">";for(t.style.display="none",Qo.appendChild(t),t.src="javascript:",e=t.contentWindow.document,e.open(),e.write(r+"s
 cript"+o+"document.F=Object"+r+"/script"+o),e.close(),oi=e.F;n--;)delete oi[ri][ei[n]];return oi()},ii=Object.create||function(e,t){var n;return null!==e?(ni[ri]=Zo(e),n=new ni,ni[ri]=null,n[ti]=e):n=oi(),void 0===t?n:Yo(n,t)},ai=fr.f,si=yr,ui=Do("toStringTag"),ci=function(e,t,n){e&&!si(e=n?e:e.prototype,ui)&&ai(e,ui,{configurable:!0,value:t})},li=ii,fi=dr,di=ci,pi={};vr(pi,Do("iterator"),function(){return this});var hi=function(e,t,n){e.prototype=li(pi,{next:fi(1,n)}),di(e,t+" Iterator")},vi=yr,mi=ko,yi=so("IE_PROTO"),_i=Object.prototype,gi=Object.getPrototypeOf||function(e){return e=mi(e),vi(e,yi)?e[yi]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?_i:null},bi=Wo,wi=Nr,Ci=wr,ki=vr,Oi=yr,xi=zo,Ei=hi,Si=ci,ji=gi,Ii=Do("iterator"),Ai=!([].keys&&"next"in[].keys()),Ti="@@iterator",Ni="keys",Ri="values",Di=function(){return this},$i=function(e,t,n,r,o,i,a){Ei(n,t,r);var s,u,c,l=function(e){if(!Ai&&e in h)return h[e];switch(e){ca
 se Ni:return function(){return new n(this,e)};case Ri:return function(){return new n(this,e)}}return function(){return new n(this,e)}},f=t+" Iterator",d=o==Ri,p=!1,h=e.prototype,v=h[Ii]||h[Ti]||o&&h[o],m=v||l(o),y=o?d?l("entries"):m:void 0,_="Array"==t?h.entries||v:v;if(_&&(c=ji(_.call(new e)),c!==Object.prototype&&(Si(c,f,!0),bi||Oi(c,Ii)||ki(c,Ii,Di))),d&&v&&v.name!==Ri&&(p=!0,m=function(){return v.call(this)}),bi&&!a||!Ai&&!p&&h[Ii]||ki(h,Ii,m),xi[t]=m,xi[f]=Di,o)if(s={values:d?m:l(Ri),keys:i?m:l(Ni),entries:y},a)for(u in s)u in h||Ci(h,u,s[u]);else wi(wi.P+wi.F*(Ai||p),t,s);return s},Pi=Bo(!0);$i(String,"String",function(e){this._t=String(e),this._i=0},function(){var e,t=this._t,n=this._i;return n>=t.length?{value:void 0,done:!0}:(e=Pi(t,n),this._i+=e.length,{value:e,done:!1})});var Mi=Do("unscopables"),Fi=Array.prototype;void 0==Fi[Mi]&&vr(Fi,Mi,{});var qi=function(e){Fi[Mi][e]=!0},Li=function(e,t){return{value:t,done:!!e}},Vi=qi,Ui=Li,Ji=zo,Bi=Lr,Wi=$i(Array,"Array",function(e
 ,t){this._t=Bi(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,Ui(1)):"keys"==t?Ui(0,n):"values"==t?Ui(0,e[n]):Ui(0,[n,e[n]])},"values");Ji.Arguments=Ji.Array,Vi("keys"),Vi("values"),Vi("entries");for(var zi=Wi,Hi=wr,Gi=zn,Xi=vr,Ki=zo,Qi=Do,Zi=Qi("iterator"),Yi=Qi("toStringTag"),ea=Ki.Array,ta=["NodeList","DOMTokenList","MediaList","StyleSheetList","CSSRuleList"],na=0;na<5;na++){var ra,oa=ta[na],ia=Gi[oa],aa=ia&&ia.prototype;if(aa){aa[Zi]||Xi(aa,Zi,ea),aa[Yi]||Xi(aa,Yi,oa),Ki[oa]=ea;for(ra in zi)aa[ra]||Hi(aa,ra,zi[ra],!0)}}var sa,ua,ca,la=function(e,t,n,r){if(!(e instanceof t)||void 0!==r&&r in e)throw TypeError(n+": incorrect invocation!");return e},fa=Kn,da=function(e,t,n,r){try{return r?t(fa(n)[0],n[1]):t(n)}catch(t){var o=e.return;throw void 0!==o&&fa(o.call(e)),t}},pa=zo,ha=Do("iterator"),va=Array.prototype,ma=function(e){return void 0!==e&&(pa.Array===e||va[ha]===e)},ya=qo,_a=Do("iterator"),ga=zo,ba=Hn.getIteratorMe
 thod=function(e){if(void 0!=e)return e[_a]||e["@@iterator"]||ga[ya(e)]},wa=t(function(e){var t=Or,n=da,r=ma,o=Kn,i=zr,a=ba,s={},u={},c=e.exports=function(e,c,l,f,d){var p,h,v,m,y=d?function(){return e}:a(e),_=t(l,f,c?2:1),g=0;if("function"!=typeof y)throw TypeError(e+" is not iterable!");if(r(y)){for(p=i(e.length);p>g;g++)if(m=c?_(o(h=e[g])[0],h[1]):_(e[g]),m===s||m===u)return m}else for(v=y.call(e);!(h=v.next()).done;)if(m=n(v,_,h.value,c),m===s||m===u)return m};c.BREAK=s,c.RETURN=u}),Ca=Kn,ka=Cr,Oa=Do("species"),xa=function(e,t){var n,r=Ca(e).constructor;return void 0===r||void 0==(n=Ca(r)[Oa])?t:ka(n)},Ea=function(e,t,n){var r=void 0===n;switch(t.length){case 0:return r?e():e.call(n);case 1:return r?e(t[0]):e.call(n,t[0]);case 2:return r?e(t[0],t[1]):e.call(n,t[0],t[1]);case 3:return r?e(t[0],t[1],t[2]):e.call(n,t[0],t[1],t[2]);case 4:return r?e(t[0],t[1],t[2],t[3]):e.call(n,t[0],t[1],t[2],t[3])}return e.apply(n,t)},Sa=Or,ja=Ea,Ia=Qo,Aa=nr,Ta=zn,Na=Ta.process,Ra=Ta.setImmediate,D
 a=Ta.clearImmediate,$a=Ta.MessageChannel,Pa=0,Ma={},Fa="onreadystatechange",qa=function(){var e=+this;if(Ma.hasOwnProperty(e)){var t=Ma[e];delete Ma[e],t()}},La=function(e){qa.call(e.data)};Ra&&Da||(Ra=function(e){for(var t=arguments,n=[],r=1;arguments.length>r;)n.push(t[r++]);return Ma[++Pa]=function(){ja("function"==typeof e?e:Function(e),n)},sa(Pa),Pa},Da=function(e){delete Ma[e]},"process"==Dr(Na)?sa=function(e){Na.nextTick(Sa(qa,e,1))}:$a?(ua=new $a,ca=ua.port2,ua.port1.onmessage=La,sa=Sa(ca.postMessage,ca,1)):Ta.addEventListener&&"function"==typeof postMessage&&!Ta.importScripts?(sa=function(e){Ta.postMessage(e+"","*")},Ta.addEventListener("message",La,!1)):sa=Fa in Aa("script")?function(e){Ia.appendChild(Aa("script"))[Fa]=function(){Ia.removeChild(this),qa.call(e)}}:function(e){setTimeout(Sa(qa,e,1),0)});var Va={set:Ra,clear:Da},Ua=zn,Ja=Va.set,Ba=Ua.MutationObserver||Ua.WebKitMutationObserver,Wa=Ua.process,za=Ua.Promise,Ha="process"==Dr(Wa),Ga=function(){var e,t,n,r=function
 (){var r,o;for(Ha&&(r=Wa.domain)&&r.exit();e;){o=e.fn,e=e.next;try{o()}catch(r){throw e?n():t=void 0,r}}t=void 0,r&&r.enter()};if(Ha)n=function(){Wa.nextTick(r)};else if(Ba){var o=!0,i=document.createTextNode("");new Ba(r).observe(i,{characterData:!0}),n=function(){i.data=o=!o}}else if(za&&za.resolve){var a=za.resolve();n=function(){a.then(r)}}else n=function(){Ja.call(Ua,r)};return function(r){var o={fn:r,next:void 0};t&&(t.next=o),e||(e=o,n()),t=o}},Xa=wr,Ka=function(e,t,n){for(var r in t)Xa(e,r,t[r],n);return e},Qa=zn,Za=fr,Ya=Zn,es=Do("species"),ts=function(e){var t=Qa[e];Ya&&t&&!t[es]&&Za.f(t,es,{configurable:!0,get:function(){return this}})},ns=Do("iterator"),rs=!1;try{var os=[7][ns]();os.return=function(){rs=!0},Array.from(os,function(){throw 2})}catch(e){}var is,as,ss,us=function(e,t){if(!t&&!rs)return!1;var n=!1;try{var r=[7],o=r[ns]();o.next=function(){return{done:n=!0}},r[ns]=function(){return o},e(r)}catch(e){}return n},cs=Wo,ls=zn,fs=Or,ds=qo,ps=Nr,hs=Gn,vs=Cr,ms=la,ys=
 wa,_s=xa,gs=Va.set,bs=Ga(),ws="Promise",Cs=ls.TypeError,ks=ls.process,Os=ls[ws],ks=ls.process,xs="process"==ds(ks),Es=function(){},Ss=!!function(){try{var e=Os.resolve(1),t=(e.constructor={})[Do("species")]=function(e){e(Es,Es)};return(xs||"function"==typeof PromiseRejectionEvent)&&e.then(Es)instanceof t}catch(e){}}(),js=function(e,t){return e===t||e===Os&&t===ss},Is=function(e){var t;return!(!hs(e)||"function"!=typeof(t=e.then))&&t},As=function(e){return js(Os,e)?new Ts(e):new as(e)},Ts=as=function(e){var t,n;this.promise=new e(function(e,r){if(void 0!==t||void 0!==n)throw Cs("Bad Promise constructor");t=e,n=r}),this.resolve=vs(t),this.reject=vs(n)},Ns=function(e){try{e()}catch(e){return{error:e}}},Rs=function(e,t){if(!e._n){e._n=!0;var n=e._c;bs(function(){for(var r=e._v,o=1==e._s,i=0,a=function(t){var n,i,a=o?t.ok:t.fail,s=t.resolve,u=t.reject,c=t.domain;try{a?(o||(2==e._h&&Ps(e),e._h=1),a===!0?n=r:(c&&c.enter(),n=a(r),c&&c.exit()),n===t.promise?u(Cs("Promise-chain cycle")):(i=Is
 (n))?i.call(n,s,u):s(n)):u(r)}catch(e){u(e)}};n.length>i;)a(n[i++]);e._c=[],e._n=!1,t&&!e._h&&Ds(e)})}},Ds=function(e){gs.call(ls,function(){var t,n,r,o=e._v;if($s(e)&&(t=Ns(function(){xs?ks.emit("unhandledRejection",o,e):(n=ls.onunhandledrejection)?n({promise:e,reason:o}):(r=ls.console)&&r.error&&r.error("Unhandled promise rejection",o)}),e._h=xs||$s(e)?2:1),e._a=void 0,t)throw t.error})},$s=function(e){if(1==e._h)return!1;for(var t,n=e._a||e._c,r=0;n.length>r;)if(t=n[r++],t.fail||!$s(t.promise))return!1;return!0},Ps=function(e){gs.call(ls,function(){var t;xs?ks.emit("rejectionHandled",e):(t=ls.onrejectionhandled)&&t({promise:e,reason:e._v})})},Ms=function(e){var t=this;t._d||(t._d=!0,t=t._w||t,t._v=e,t._s=2,t._a||(t._a=t._c.slice()),Rs(t,!0))},Fs=function(e){var t,n=this;if(!n._d){n._d=!0,n=n._w||n;try{if(n===e)throw Cs("Promise can't be resolved itself");(t=Is(e))?bs(function(){var r={_w:n,_d:!1};try{t.call(e,fs(Fs,r,1),fs(Ms,r,1))}catch(e){Ms.call(r,e)}}):(n._v=e,n._s=1,Rs(n,!1)
 )}catch(e){Ms.call({_w:n,_d:!1},e)}}};Ss||(Os=function(e){ms(this,Os,ws,"_h"),vs(e),is.call(this);try{e(fs(Fs,this,1),fs(Ms,this,1))}catch(e){Ms.call(this,e)}},is=function(e){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1},is.prototype=Ka(Os.prototype,{then:function(e,t){var n=As(_s(this,Os));return n.ok="function"!=typeof e||e,n.fail="function"==typeof t&&t,n.domain=xs?ks.domain:void 0,this._c.push(n),this._a&&this._a.push(n),this._s&&Rs(this,!1),n.promise},catch:function(e){return this.then(void 0,e)}}),Ts=function(){var e=new is;this.promise=e,this.resolve=fs(Fs,e,1),this.reject=fs(Ms,e,1)}),ps(ps.G+ps.W+ps.F*!Ss,{Promise:Os}),ci(Os,ws),ts(ws),ss=Hn[ws],ps(ps.S+ps.F*!Ss,ws,{reject:function(e){var t=As(this),n=t.reject;return n(e),t.promise}}),ps(ps.S+ps.F*(cs||!Ss),ws,{resolve:function(e){if(e instanceof Os&&js(e.constructor,this))return e;var t=As(this),n=t.resolve;return n(e),t.promise}}),ps(ps.S+ps.F*!(Ss&&us(function(e){Os.all(e).catch(Es)}
 )),ws,{all:function(e){var t=this,n=As(t),r=n.resolve,o=n.reject,i=Ns(function(){var n=[],i=0,a=1;ys(e,!1,function(e){var s=i++,u=!1;n.push(void 0),a++,t.resolve(e).then(function(e){u||(u=!0,n[s]=e,--a||r(n))},o)}),--a||r(n)});return i&&o(i.error),n.promise},race:function(e){var t=this,n=As(t),r=n.reject,o=Ns(function(){ys(e,!1,function(e){t.resolve(e).then(n.resolve,r)})});return o&&r(o.error),n.promise}});var qs=["off","error","warn","info","log","debug"],Ls={},Vs=global.console,Us=global.setTimeout,Js=global.setTimeoutNative;s();var Bs=function(){},Ws=function(e,t){Object.defineProperty(this,"instanceId",{enumerable:!0,value:e}),Bs=t||function(){}};Ws.prototype.send=function(e,t,n){var r=t.action,o=t.component,i=t.ref,a=t.module,s=t.method;switch(e){case"dom":return this[r](this.instanceId,n);case"component":return this.componentHandler(this.instanceId,i,s,n,{component:o});default:return this.moduleHandler(this.instanceId,a,s,n,{})}},Ws.prototype.callDOM=function(e,t){return this
 [e](this.instanceId,t)},Ws.prototype.callComponent=function(e,t,n){return this.componentHandler(this.instanceId,e,t,n,{})},Ws.prototype.callModule=function(e,t,n){return this.moduleHandler(this.instanceId,e,t,n,{})};var zs,Hs,Gs,Xs={},Ks=1,Qs={},Zs=[],Ys=/^\s*\/\/ *(\{[^}]*\}) *\r?\n/,eu={},tu={createInstance:R,registerService:S,unregisterService:j};q.prototype.destroy=function(){var e=d(this.docId);e&&(delete this.docId,delete e.nodeMap[this.nodeId]),this.children.forEach(function(e){e.destroy()})};var nu="div";L.prototype=Object.create(q.prototype),L.prototype.constructor=L,x(L),Object.assign(L.prototype,{appendChild:function(e){if(!e.parentNode||e.parentNode===this)if(e.parentNode){if(k(e,this.children,this.children.length,!0),1===e.nodeType){var t=k(e,this.pureChildren,this.pureChildren.length),n=h(this.docId);if(n&&t>=0)return n.send("dom",{action:"moveElement"},[e.ref,this.ref,t])}}else if(g(e,this),C(e,this.children,this.children.length,!0),this.docId&&V(this.docId,e),1===e.n
 odeType){C(e,this.pureChildren,this.pureChildren.length);var r=h(this.docId);if(r)return r.send("dom",{action:"addElement"},[this.ref,e.toJSON(),-1])}},insertBefore:function(e,t){if(!(e.parentNode&&e.parentNode!==this||e===t||e.nextSibling&&e.nextSibling===t))if(e.parentNode){if(k(e,this.children,this.children.indexOf(t),!0),1===e.nodeType){var n=b(t),r=k(e,this.pureChildren,n?this.pureChildren.indexOf(n):this.pureChildren.length),o=h(this.docId);if(o&&r>=0)return o.send("dom",{action:"moveElement"},[e.ref,this.ref,r])}}else if(g(e,this),C(e,this.children,this.children.indexOf(t),!0),this.docId&&V(this.docId,e),1===e.nodeType){var i=b(t),a=C(e,this.pureChildren,i?this.pureChildren.indexOf(i):this.pureChildren.length),s=h(this.docId);if(s)return s.send("dom",{action:"addElement"},[this.ref,e.toJSON(),a])}},insertAfter:function(e,t){if(!(e.parentNode&&e.parentNode!==this||e===t||e.previousSibling&&e.previousSibling===t))if(e.parentNode){if(k(e,this.children,this.children.indexOf(t)+1,
 !0),1===e.nodeType){var n=k(e,this.pureChildren,this.pureChildren.indexOf(w(t))+1),r=h(this.docId);if(r&&n>=0)return r.send("dom",{action:"moveElement"},[e.ref,this.ref,n])}}else if(g(e,this),C(e,this.children,this.children.indexOf(t)+1,!0),this.docId&&V(this.docId,e),1===e.nodeType){var o=C(e,this.pureChildren,this.pureChildren.indexOf(w(t))+1),i=h(this.docId);if(i)return i.send("dom",{action:"addElement"},[this.ref,e.toJSON(),o])}},removeChild:function(e,t){if(e.parentNode&&(O(e,this.children,!0),1===e.nodeType)){O(e,this.pureChildren);var n=h(this.docId);n&&n.send("dom",{action:"removeElement"},[e.ref])}t||e.destroy()},clear:function(){var e=h(this.docId);e&&this.pureChildren.forEach(function(t){e.send("dom",{action:"removeElement"},[t.ref])}),this.children.forEach(function(e){e.destroy()}),this.children.length=0,this.pureChildren.length=0},setAttr:function(e,t,n){if(this.attr[e]!==t||n===!1){this.attr[e]=t;var r=h(this.docId);if(!n&&r){var o={};o[e]=t,r.send("dom",{action:"updat
 eAttrs"},[this.ref,o])}}},setStyle:function(e,t,n){if(this.style[e]!==t||n===!1){this.style[e]=t;var r=h(this.docId);if(!n&&r){var o={};o[e]=t,r.send("dom",{action:"updateStyle"},[this.ref,o])}}},setClassStyle:function(e){var t=this;for(var n in this.classStyle)t.classStyle[n]="";Object.assign(this.classStyle,e);var r=h(this.docId);r&&r.send("dom",{action:"updateStyle"},[this.ref,this.toStyle()])},addEvent:function(e,t){if(!this.event[e]){this.event[e]=t;var n=h(this.docId);n&&n.send("dom",{action:"addEvent"},[this.ref,e])}},removeEvent:function(e){if(this.event[e]){delete this.event[e];var t=h(this.docId);t&&t.send("dom",{action:"removeEvent"},[this.ref,e])}},fireEvent:function(e,t){var n=this.event[e];if(n)return n.call(this,t)},toStyle:function(){return Object.assign({},this.classStyle,this.style)},toJSON:function(){var e={ref:this.ref.toString(),type:this.type,attr:this.attr,style:this.toStyle()},t=Object.keys(this.event);return t.length&&(e.event=t),this.pureChildren.length&&(e
 .children=this.pureChildren.map(function(e){return e.toJSON()})),e},toString:function(){return"<"+this.type+" attr="+JSON.stringify(this.attr)+" style="+JSON.stringify(this.toStyle())+">"+this.pureChildren.map(function(e){return e.toString()}).join("")+"</"+this.type+">"}}),U.prototype=Object.create(q.prototype),U.prototype.constructor=U,U.prototype.toString=function(){return"<!-- "+this.value+" -->"},Object.assign(J.prototype,{createFinish:function(e){var t=this.handler;return t([B("createFinish")],e)},updateFinish:function(e){var t=this.handler;return t([B("updateFinish")],e)},refreshFinish:function(e){var t=this.handler;return t([B("refreshFinish")],e)},createBody:function(e){var t=e.toJSON(),n=t.children;delete t.children;var r=[B("createBody",[t])];return n&&r.push.apply(r,n.map(function(e){return B("addElement",[t.ref,e,-1])})),this.addActions(r)},addElement:function(e,t,n){return n>=0||(n=-1),this.addActions(B("addElement",[t,e.toJSON(),n]))},removeElement:function(e){if(Arra
 y.isArray(e)){var t=e.map(function(e){return B("removeElement",[e])});return this.addActions(t)}return this.addActions(B("removeElement",[e]))},moveElement:function(e,t,n){return this.addActions(B("moveElement",[e,t,n]))},setAttr:function(e,t,n){var r={};return r[t]=n,this.addActions(B("updateAttrs",[e,r]))},setStyle:function(e,t,n){var r={};return r[t]=n,this.addActions(B("updateStyle",[e,r]))},setStyles:function(e,t){return this.addActions(B("updateStyle",[e,t]))},addEvent:function(e,t){return this.addActions(B("addEvent",[e,t]))},removeEvent:function(e,t){return this.addActions(B("removeEvent",[e,t]))},handler:function(e,t){return t&&t()},addActions:function(e){var t=this.updates,n=this.handler;return Array.isArray(e)||(e=[e]),this.batched?void t.push.apply(t,e):n(e)}});var ru={createBody:"callCreateBody",addElement:"callAddElement",removeElement:"callRemoveElement",moveElement:"callMoveElement",updateAttrs:"callUpdateAttrs",updateStyle:"callUpdateStyle",addEvent:"callAddEvent",r
 emoveEvent:"callRemoveEvent"};G.handler=null,Object.assign(G.prototype,{getRef:function(e){return this.nodeMap[e];
-},open:function(){this.listener.batched=!1},close:function(){this.listener.batched=!0},createDocumentElement:function(){var e=this;if(!this.documentElement){var t=new L("document");t.docId=this.id,t.ownerDocument=this,t.role="documentElement",t.depth=0,t.ref="_documentElement",this.nodeMap._documentElement=t,this.documentElement=t,Object.defineProperty(t,"appendChild",{configurable:!0,enumerable:!0,writable:!0,value:function(t){m(e,t)}}),Object.defineProperty(t,"insertBefore",{configurable:!0,enumerable:!0,writable:!0,value:function(t,n){m(e,t,n)}})}return this.documentElement},createBody:function(e,t){if(!this.body){var n=new L(e,t);_(this,n)}return this.body},createElement:function(e,t){return new L(e,t)},createComment:function(e){return new U(e)},fireEvent:function(e,t,n,r){if(e)return n=n||{},n.type=t,n.target=e,n.timestamp=Date.now(),r&&X(e,r),e.fireEvent(t,n)},destroy:function(){delete this.listener,delete this.nodeMap,p(this.id)}});var ou=function(e){this.instanceId=e,this.la
 stCallbackId=0,this.callbacks=[]};ou.prototype.add=function(e){return this.lastCallbackId++,this.callbacks[this.lastCallbackId]=e,this.lastCallbackId},ou.prototype.remove=function(e){var t=this.callbacks[e];return this.callbacks[e]=void 0,t},ou.prototype.consume=function(e,t,n){var r=this.callbacks[e];return"undefined"!=typeof n&&n!==!1||(this.callbacks[e]=void 0),"function"==typeof r?r(t):new Error('invalid callback id "'+e+'"')},ou.prototype.close=function(){this.callbacks=this.callbacks.map(function(e){})};var iu={Document:G,Element:L,Comment:U,Listener:J,TaskCenter:Ws,sendTasks:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return global.callNative.apply(global,e)},CallbackManager:ou};G.handler=iu.sendTasks;var au,su={setNativeConsole:n,resetNativeConsole:r,setNativeTimer:s,resetNativeTimer:u,service:{register:S,unregister:j,has:I},freezePrototype:K,init:F,config:iu},uu={},cu={},lu=Q,fu=Z,du=Y,pu=ee,hu=te,vu=ne,mu=re,yu=oe,_u=ie,gu=ae,bu={init:lu,registerCompo
 nents:fu,registerModules:du,registerMethods:pu,prepareInstance:hu,createInstance:vu,refreshInstance:mu,destroyInstance:yu,getRoot:_u,receiveTasks:gu},wu=Object.freeze({default:bu,__moduleExports:bu,init:lu,registerComponents:fu,registerModules:du,registerMethods:pu,prepareInstance:hu,createInstance:vu,refreshInstance:mu,destroyInstance:yu,getRoot:_u,receiveTasks:gu}),Cu=t(function(e,t){function n(e){return null==e?"":"object"==typeof e?JSON.stringify(e,null,2):String(e)}function r(e){var t=parseFloat(e,10);return t||0===t?t:e}function o(e,t){for(var n=Object.create(null),r=e.split(","),o=0;o<r.length;o++)n[r[o]]=!0;return t?function(e){return n[e.toLowerCase()]}:function(e){return n[e]}}function i(e,t){if(e.length){var n=e.indexOf(t);if(n>-1)return e.splice(n,1)}}function a(e,t){return Xt.call(e,t)}function s(e){return"string"==typeof e||"number"==typeof e}function u(e){var t=Object.create(null);return function(n){var r=t[n];return r||(t[n]=e(n))}}function c(e,t){function n(n){var r
 =arguments.length;return r?r>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n}function l(e,t){t=t||0;for(var n=e.length-t,r=new Array(n);n--;)r[n]=e[n+t];return r}function f(e,t){for(var n in t)e[n]=t[n];return e}function d(e){return null!==e&&"object"==typeof e}function p(e){return tn.call(e)===nn}function h(e){for(var t={},n=0;n<e.length;n++)e[n]&&f(t,e[n]);return t}function v(){}function m(e){return e.reduce(function(e,t){return e.concat(t.staticKeys||[])},[]).join(",")}function y(e,t){var n=d(e),r=d(t);return n&&r?JSON.stringify(e)===JSON.stringify(t):!n&&!r&&String(e)===String(t)}function _(e,t){for(var n=0;n<e.length;n++)if(y(e[n],t))return n;return-1}function g(e){var t=(e+"").charCodeAt(0);return 36===t||95===t}function b(e,t,n,r){Object.defineProperty(e,t,{value:n,enumerable:!!r,writable:!0,configurable:!0})}function w(e){if(!sn.test(e)){var t=e.split(".");return function(e){for(var n=0;n<t.length;n++){if(!e)return;e=e[t[n]]}return e}}}function C(e){
 return/native code/.test(e.toString())}function k(e){Cn.target&&kn.push(Cn.target),Cn.target=e}function O(){Cn.target=kn.pop()}function x(e,t){e.__proto__=t}function E(e,t,n){for(var r=0,o=n.length;r<o;r++){var i=n[r];b(e,i,t[i])}}function S(e,t){if(d(e)){var n;return a(e,"__ob__")&&e.__ob__ instanceof jn?n=e.__ob__:Sn.shouldConvert&&!mn()&&(Array.isArray(e)||p(e))&&Object.isExtensible(e)&&!e._isVue&&(n=new jn(e)),t&&n&&n.vmCount++,n}}function j(e,t,n,r){var o=new Cn,i=Object.getOwnPropertyDescriptor(e,t);if(!i||i.configurable!==!1){var a=i&&i.get,s=i&&i.set,u=S(n);Object.defineProperty(e,t,{enumerable:!0,configurable:!0,get:function(){var t=a?a.call(e):n;return Cn.target&&(o.depend(),u&&u.dep.depend(),Array.isArray(t)&&T(t)),t},set:function(t){var r=a?a.call(e):n;t===r||t!==t&&r!==r||(s?s.call(e,t):n=t,u=S(t),o.notify())}})}}function I(e,t,n){if(Array.isArray(e))return e.length=Math.max(e.length,t),e.splice(t,1,n),n;if(a(e,t))return void(e[t]=n);var r=e.__ob__;if(!(e._isVue||r&&r.v
 mCount))return r?(j(r.value,t,n),r.dep.notify(),n):void(e[t]=n)}function A(e,t){var n=e.__ob__;e._isVue||n&&n.vmCount||a(e,t)&&(delete e[t],n&&n.dep.notify())}function T(e){for(var t=void 0,n=0,r=e.length;n<r;n++)t=e[n],t&&t.__ob__&&t.__ob__.dep.depend(),Array.isArray(t)&&T(t)}function N(e,t){if(!t)return e;for(var n,r,o,i=Object.keys(t),s=0;s<i.length;s++)n=i[s],r=e[n],o=t[n],a(e,n)?p(r)&&p(o)&&N(r,o):I(e,n,o);return e}function R(e,t){return t?e?e.concat(t):Array.isArray(t)?t:[t]:e}function D(e,t){var n=Object.create(e||null);return t?f(n,t):n}function $(e){var t=e.props;if(t){var n,r,o,i={};if(Array.isArray(t))for(n=t.length;n--;)r=t[n],"string"==typeof r&&(o=Qt(r),i[o]={type:null});else if(p(t))for(var a in t)r=t[a],o=Qt(a),i[o]=p(r)?r:{type:r};e.props=i}}function P(e){var t=e.directives;if(t)for(var n in t){var r=t[n];"function"==typeof r&&(t[n]={bind:r,update:r})}}function M(e,t,n){function r(r){var o=In[r]||Tn;l[r]=o(e[r],t[r],n,r)}$(t),P(t);var o=t.extends;if(o&&(e="function"
 ==typeof o?M(e,o.options,n):M(e,o,n)),t.mixins)for(var i=0,s=t.mixins.length;i<s;i++){var u=t.mixins[i];u.prototype instanceof Be&&(u=u.options),e=M(e,u,n)}var c,l={};for(c in e)r(c);for(c in t)a(e,c)||r(c);return l}function F(e,t,n,r){if("string"==typeof n){var o=e[t];if(a(o,n))return o[n];var i=Qt(n);if(a(o,i))return o[i];var s=Zt(i);if(a(o,s))return o[s];var u=o[n]||o[i]||o[s];return u}}function q(e,t,n,r){var o=t[e],i=!a(n,e),s=n[e];if(U(Boolean,o.type)&&(i&&!a(o,"default")?s=!1:U(String,o.type)||""!==s&&s!==en(e)||(s=!0)),void 0===s){s=L(r,o,e);var u=Sn.shouldConvert;Sn.shouldConvert=!0,S(s),Sn.shouldConvert=u}return s}function L(e,t,n){if(a(t,"default")){var r=t.default;return d(r),e&&e.$options.propsData&&void 0===e.$options.propsData[n]&&void 0!==e[n]?e[n]:"function"==typeof r&&t.type!==Function?r.call(e):r}}function V(e){var t=e&&e.toString().match(/^\s*function (\w+)/);return t&&t[1]}function U(e,t){if(!Array.isArray(t))return V(t)===V(e);for(var n=0,r=t.length;n<r;n++)if(
 V(t[n])===V(e))return!0;return!1}function J(e){return new Rn(void 0,void 0,void 0,String(e))}function B(e){var t=new Rn(e.tag,e.data,e.children,e.text,e.elm,e.context,e.componentOptions);return t.ns=e.ns,t.isStatic=e.isStatic,t.key=e.key,t.isCloned=!0,t}function W(e){for(var t=new Array(e.length),n=0;n<e.length;n++)t[n]=B(e[n]);return t}function z(e,t,n,r,o){if(e){var i=n.$options._base;if(d(e)&&(e=i.extend(e)),"function"==typeof e){if(!e.cid)if(e.resolved)e=e.resolved;else if(e=Y(e,i,function(){n.$forceUpdate()}),!e)return;Je(e),t=t||{};var a=ee(t,e);if(e.options.functional)return H(e,a,t,n,r);var s=t.on;t.on=t.nativeOn,e.options.abstract&&(t={}),ne(t);var u=e.options.name||o,c=new Rn("vue-component-"+e.cid+(u?"-"+u:""),t,void 0,void 0,void 0,n,{Ctor:e,propsData:a,listeners:s,tag:o,children:r});return c}}}function H(e,t,n,r,o){var i={},a=e.options.props;if(a)for(var s in a)i[s]=q(s,a,t);var u=Object.create(r),c=function(e,t,n,r){return de(u,e,t,n,r,!0)},l=e.options.render.call(null
 ,c,{props:i,data:n,parent:r,children:o,slots:function(){return ye(o,r)}});return l instanceof Rn&&(l.functionalContext=r,n.slot&&((l.data||(l.data={})).slot=n.slot)),l}function G(e,t,n,r){var o=e.componentOptions,i={_isComponent:!0,parent:t,propsData:o.propsData,_componentTag:o.tag,_parentVnode:e,_parentListeners:o.listeners,_renderChildren:o.children,_parentElm:n||null,_refElm:r||null},a=e.data.inlineTemplate;return a&&(i.render=a.render,i.staticRenderFns=a.staticRenderFns),new o.Ctor(i)}function X(e,t,n,r){if(!e.child||e.child._isDestroyed){var o=e.child=G(e,qn,n,r);o.$mount(t?e.elm:void 0,t)}else if(e.data.keepAlive){var i=e;K(i,i)}}function K(e,t){var n=t.componentOptions,r=t.child=e.child;r._updateFromParent(n.propsData,n.listeners,t,n.children)}function Q(e){e.child._isMounted||(e.child._isMounted=!0,xe(e.child,"mounted")),e.data.keepAlive&&(e.child._inactive=!1,xe(e.child,"activated"))}function Z(e){e.child._isDestroyed||(e.data.keepAlive?(e.child._inactive=!0,xe(e.child,"dea
 ctivated")):e.child.$destroy())}function Y(e,t,n){if(!e.requested){e.requested=!0;var r=e.pendingCallbacks=[n],o=!0,i=function(n){if(d(n)&&(n=t.extend(n)),e.resolved=n,!o)for(var i=0,a=r.length;i<a;i++)r[i](n)},a=function(e){},s=e(i,a);return s&&"function"==typeof s.then&&!e.resolved&&s.then(i,a),o=!1,e.resolved}e.pendingCallbacks.push(n)}function ee(e,t){var n=t.options.props;if(n){var r={},o=e.attrs,i=e.props,a=e.domProps;if(o||i||a)for(var s in n){var u=en(s);te(r,i,s,u,!0)||te(r,o,s,u)||te(r,a,s,u)}return r}}function te(e,t,n,r,o){if(t){if(a(t,n))return e[n]=t[n],o||delete t[n],!0;if(a(t,r))return e[n]=t[r],o||delete t[r],!0}return!1}function ne(e){e.hook||(e.hook={});for(var t=0;t<Pn.length;t++){var n=Pn[t],r=e.hook[n],o=$n[n];e.hook[n]=r?re(o,r):o}}function re(e,t){return function(n,r,o,i){e(n,r,o,i),t(n,r,o,i)}}function oe(e,t,n,r){r+=t;var o=e.__injected||(e.__injected={});if(!o[r]){o[r]=!0;var i=e[t];i?e[t]=function(){i.apply(this,arguments),n.apply(this,arguments)}:e[t]=n}
 }function ie(e,t,n,r,o){var i,a,s,u,c,l,f;for(i in e)if(a=e[i],s=t[i],a)if(s){if(a!==s)if(Array.isArray(s)){s.length=a.length;for(var d=0;d<s.length;d++)s[d]=a[d];e[i]=s}else s.fn=a,e[i]=s}else f="~"===i.charAt(0),c=f?i.slice(1):i,l="!"===c.charAt(0),c=l?c.slice(1):c,Array.isArray(a)?n(c,a.invoker=ae(a),f,l):(a.invoker||(u=a,a=e[i]={},a.fn=u,a.invoker=se(a)),n(c,a.invoker,f,l));else;for(i in t)e[i]||(f="~"===i.charAt(0),c=f?i.slice(1):i,l="!"===c.charAt(0),c=l?c.slice(1):c,r(c,t[i].invoker,l))}function ae(e){return function(t){for(var n=arguments,r=1===arguments.length,o=0;o<e.length;o++)r?e[o](t):e[o].apply(null,n)}}function se(e){return function(t){var n=1===arguments.length;n?e.fn(t):e.fn.apply(null,arguments)}}function ue(e){for(var t=0;t<e.length;t++)if(Array.isArray(e[t]))return Array.prototype.concat.apply([],e);return e}function ce(e){return s(e)?[J(e)]:Array.isArray(e)?le(e):void 0}function le(e,t){var n,r,o,i=[];for(n=0;n<e.length;n++)r=e[n],null!=r&&"boolean"!=typeof r&&(
 o=i[i.length-1],Array.isArray(r)?i.push.apply(i,le(r,(t||"")+"_"+n)):s(r)?o&&o.text?o.text+=String(r):""!==r&&i.push(J(r)):r.text&&o&&o.text?i[i.length-1]=J(o.text+r.text):(r.tag&&null==r.key&&null!=t&&(r.key="__vlist"+t+"_"+n+"__"),i.push(r)));return i}function fe(e){return e&&e.filter(function(e){return e&&e.componentOptions})[0]}function de(e,t,n,r,o,i){return(Array.isArray(n)||s(n))&&(o=r,r=n,n=void 0),i&&(o=Fn),pe(e,t,n,r,o)}function pe(e,t,n,r,o){if(n&&n.__ob__)return Dn();if(!t)return Dn();Array.isArray(r)&&"function"==typeof r[0]&&(n=n||{},n.scopedSlots={default:r[0]},r.length=0),o===Fn?r=ce(r):o===Mn&&(r=ue(r));var i,a;if("string"==typeof t){var s;a=an.getTagNamespace(t),i=an.isReservedTag(t)?new Rn(an.parsePlatformTagName(t),n,r,void 0,void 0,e):(s=F(e.$options,"components",t))?z(s,n,e,r,t):new Rn(t,n,r,void 0,void 0,e)}else i=z(t,n,e,r);return i?(a&&he(i,a),i):Dn()}function he(e,t){if(e.ns=t,"foreignObject"!==e.tag&&e.children)for(var n=0,r=e.children.length;n<r;n++){var 
 o=e.children[n];o.tag&&!o.ns&&he(o,t)}}function ve(e){e.$vnode=null,e._vnode=null,e._staticTrees=null;var t=e.$options._parentVnode,n=t&&t.context;e.$slots=ye(e.$options._renderChildren,n),e.$scopedSlots={},e._c=function(t,n,r,o){return de(e,t,n,r,o,!1)},e.$createElement=function(t,n,r,o){return de(e,t,n,r,o,!0)},e.$options.el&&e.$mount(e.$options.el)}function me(e){function t(e,t,n){if(Array.isArray(e))for(var r=0;r<e.length;r++)e[r]&&"string"!=typeof e[r]&&o(e[r],t+"_"+r,n);else o(e,t,n)}function o(e,t,n){e.isStatic=!0,e.key=t,e.isOnce=n}e.prototype.$nextTick=function(e){return _n(e,this)},e.prototype._render=function(){var e=this,t=e.$options,n=t.render,r=t.staticRenderFns,o=t._parentVnode;if(e._isMounted)for(var i in e.$slots)e.$slots[i]=W(e.$slots[i]);o&&o.data.scopedSlots&&(e.$scopedSlots=o.data.scopedSlots),r&&!e._staticTrees&&(e._staticTrees=[]),e.$vnode=o;var a;try{a=n.call(e._renderProxy,e.$createElement)}catch(t){if(!an.errorHandler)throw t;an.errorHandler.call(null,t,e),
 a=e._vnode}return a instanceof Rn||(a=Dn()),a.parent=o,a},e.prototype._s=n,e.prototype._v=J,e.prototype._n=r,e.prototype._e=Dn,e.prototype._q=y,e.prototype._i=_,e.prototype._m=function(e,n){var r=this._staticTrees[e];return r&&!n?Array.isArray(r)?W(r):B(r):(r=this._staticTrees[e]=this.$options.staticRenderFns[e].call(this._renderProxy),t(r,"__static__"+e,!1),r)},e.prototype._o=function(e,n,r){return t(e,"__once__"+n+(r?"_"+r:""),!0),e},e.prototype._f=function(e){return F(this.$options,"filters",e,!0)||on},e.prototype._l=function(e,t){var n,r,o,i,a;if(Array.isArray(e)||"string"==typeof e)for(n=new Array(e.length),r=0,o=e.length;r<o;r++)n[r]=t(e[r],r);else if("number"==typeof e)for(n=new Array(e),r=0;r<e;r++)n[r]=t(r+1,r);else if(d(e))for(i=Object.keys(e),n=new Array(i.length),r=0,o=i.length;r<o;r++)a=i[r],n[r]=t(e[a],a,r);return n},e.prototype._t=function(e,t,n,r){var o=this.$scopedSlots[e];if(o)return n=n||{},r&&f(n,r),o(n)||t;var i=this.$slots[e];return i||t},e.prototype._b=functio
 n(e,t,n,r){if(n)if(d(n)){Array.isArray(n)&&(n=h(n));for(var o in n)if("class"===o||"style"===o)e[o]=n[o];else{var i=r||an.mustUseProp(t,o)?e.domProps||(e.domProps={}):e.attrs||(e.attrs={});i[o]=n[o]}}else;return e},e.prototype._k=function(e,t,n){var r=an.keyCodes[t]||n;return Array.isArray(r)?r.indexOf(e)===-1:r!==e}}function ye(e,t){var n={};if(!e)return n;for(var r,o,i=[],a=0,s=e.length;a<s;a++)if(o=e[a],(o.context===t||o.functionalContext===t)&&o.data&&(r=o.data.slot)){var u=n[r]||(n[r]=[]);"template"===o.tag?u.push.apply(u,o.children):u.push(o)}else i.push(o);return i.length&&(1!==i.length||" "!==i[0].text&&!i[0].isComment)&&(n.default=i),n}function _e(e){e._events=Object.create(null),e._hasHookEvent=!1;var t=e.$options._parentListeners;t&&we(e,t)}function ge(e,t,n){n?An.$once(e,t):An.$on(e,t)}function be(e,t){An.$off(e,t)}function we(e,t,n){An=e,ie(t,n||{},ge,be,e)}function Ce(e){var t=/^hook:/;e.prototype.$on=function(e,n){var r=this;return(r._events[e]||(r._events[e]=[])).pus
 h(n),t.test(e)&&(r._hasHookEvent=!0),r},e.prototype.$once=function(e,t){function n(){r.$off(e,n),t.apply(r,arguments)}var r=this;return n.fn=t,r.$on(e,n),r},e.prototype.$off=function(e,t){var n=this;if(!arguments.length)return n._events=Object.create(null),n;var r=n._events[e];if(!r)return n;if(1===arguments.length)return n._events[e]=null,n;for(var o,i=r.length;i--;)if(o=r[i],o===t||o.fn===t){r.splice(i,1);break}return n},e.prototype.$emit=function(e){var t=this,n=t._events[e];if(n){n=n.length>1?l(n):n;for(var r=l(arguments,1),o=0,i=n.length;o<i;o++)n[o].apply(t,r)}return t}}function ke(e){var t=e.$options,n=t.parent;if(n&&!t.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(e)}e.$parent=n,e.$root=n?n.$root:e,e.$children=[],e.$refs={},e._watcher=null,e._inactive=!1,e._isMounted=!1,e._isDestroyed=!1,e._isBeingDestroyed=!1}function Oe(e){e.prototype._mount=function(e,t){var n=this;return n.$el=e,n.$options.render||(n.$options.render=Dn),xe(n,"beforeMount"),n
 ._watcher=new Hn(n,function(){n._update(n._render(),t)},v),t=!1,null==n.$vnode&&(n._isMounted=!0,xe(n,"mounted")),n},e.prototype._update=function(e,t){var n=this;n._isMounted&&xe(n,"beforeUpdate");var r=n.$el,o=n._vnode,i=qn;qn=n,n._vnode=e,o?n.$el=n.__patch__(o,e):n.$el=n.__patch__(n.$el,e,t,!1,n.$options._parentElm,n.$options._refElm),qn=i,r&&(r.__vue__=null),n.$el&&(n.$el.__vue__=n),n.$vnode&&n.$parent&&n.$vnode===n.$parent._vnode&&(n.$parent.$el=n.$el)},e.prototype._updateFromParent=function(e,t,n,r){var o=this,i=!(!o.$options._renderChildren&&!r);if(o.$options._parentVnode=n,o.$vnode=n,o._vnode&&(o._vnode.parent=n),o.$options._renderChildren=r,e&&o.$options.props){Sn.shouldConvert=!1;for(var a=o.$options._propKeys||[],s=0;s<a.length;s++){var u=a[s];o[u]=q(u,o.$options.props,e,o)}Sn.shouldConvert=!0,o.$options.propsData=e}if(t){var c=o.$options._parentListeners;o.$options._parentListeners=t,we(o,t,c)}i&&(o.$slots=ye(r,n.context),o.$forceUpdate())},e.prototype.$forceUpdate=functi
 on(){var e=this;e._watcher&&e._watcher.update()},e.prototype.$destroy=function(){var e=this;if(!e._isBeingDestroyed){xe(e,"beforeDestroy"),e._isBeingDestroyed=!0;var t=e.$parent;!t||t._isBeingDestroyed||e.$options.abstract||i(t.$children,e),e._watcher&&e._watcher.teardown();for(var n=e._watchers.length;n--;)e._watchers[n].teardown();e._data.__ob__&&e._data.__ob__.vmCount--,e._isDestroyed=!0,xe(e,"destroyed"),e.$off(),e.$el&&(e.$el.__vue__=null),e.__patch__(e._vnode,null)}}}function xe(e,t){var n=e.$options[t];if(n)for(var r=0,o=n.length;r<o;r++)n[r].call(e);e._hasHookEvent&&e.$emit("hook:"+t)}function Ee(){Ln.length=0,Vn={},Un=Jn=!1}function Se(){Jn=!0;var e,t,n;for(Ln.sort(function(e,t){return e.id-t.id}),Bn=0;Bn<Ln.length;Bn++)e=Ln[Bn],t=e.id,Vn[t]=null,e.run();for(Bn=Ln.length;Bn--;)e=Ln[Bn],n=e.vm,n._watcher===e&&n._isMounted&&xe(n,"updated");yn&&an.devtools&&yn.emit("flush"),Ee()}function je(e){var t=e.id;if(null==Vn[t]){if(Vn[t]=!0,Jn){for(var n=Ln.length-1;n>=0&&Ln[n].id>e.id
 ;)n--;Ln.splice(Math.max(n,Bn)+1,0,e)}else Ln.push(e);Un||(Un=!0,_n(Se))}}function Ie(e){Gn.clear(),Ae(e,Gn)}function Ae(e,t){var n,r,o=Array.isArray(e);if((o||d(e))&&Object.isExtensible(e)){if(e.__ob__){var i=e.__ob__.dep.id;if(t.has(i))return;t.add(i)}if(o)for(n=e.length;n--;)Ae(e[n],t);else for(r=Object.keys(e),n=r.length;n--;)Ae(e[r[n]],t)}}function Te(e){e._watchers=[];var t=e.$options;t.props&&Ne(e,t.props),t.methods&&Pe(e,t.methods),t.data?Re(e):S(e._data={},!0),t.computed&&De(e,t.computed),t.watch&&Me(e,t.watch)}function Ne(e,t){var n=e.$options.propsData||{},r=e.$options._propKeys=Object.keys(t),o=!e.$parent;Sn.shouldConvert=o;for(var i=function(o){var i=r[o];j(e,i,q(i,t,n,e))},a=0;a<r.length;a++)i(a);Sn.shouldConvert=!0}function Re(e){var t=e.$options.data;t=e._data="function"==typeof t?t.call(e):t||{},p(t)||(t={});for(var n=Object.keys(t),r=e.$options.props,o=n.length;o--;)r&&a(r,n[o])||Le(e,n[o]);S(t,!0)}function De(e,t){for(var n in t){var r=t[n];"function"==typeof r?(X
 n.get=$e(r,e),Xn.set=v):(Xn.get=r.get?r.cache!==!1?$e(r.get,e):c(r.get,e):v,Xn.set=r.set?c(r.set,e):v),Object.defineProperty(e,n,Xn)}}function $e(e,t){var n=new Hn(t,e,v,{lazy:!0});return function(){return n.dirty&&n.evaluate(),Cn.target&&n.depend(),n.value}}function Pe(e,t){for(var n in t)e[n]=null==t[n]?v:c(t[n],e)}function Me(e,t){for(var n in t){var r=t[n];if(Array.isArray(r))for(var o=0;o<r.length;o++)Fe(e,n,r[o]);else Fe(e,n,r)}}function Fe(e,t,n){var r;p(n)&&(r=n,n=n.handler),"string"==typeof n&&(n=e[n]),e.$watch(t,n,r)}function qe(e){var t={};t.get=function(){return this._data},Object.defineProperty(e.prototype,"$data",t),e.prototype.$set=I,e.prototype.$delete=A,e.prototype.$watch=function(e,t,n){var r=this;n=n||{},n.user=!0;var o=new Hn(r,e,t,n);return n.immediate&&t.call(r,o.value),function(){o.teardown()}}}function Le(e,t){g(t)||Object.defineProperty(e,t,{configurable:!0,enumerable:!0,get:function(){return e._data[t]},set:function(n){e._data[t]=n}})}function Ve(e){e.proto
 type._init=function(e){var t=this;t._uid=Kn++,t._isVue=!0,e&&e._isComponent?Ue(t,e):t.$options=M(Je(t.constructor),e||{},t),t._renderProxy=t,t._self=t,ke(t),_e(t),xe(t,"beforeCreate"),Te(t),xe(t,"created"),ve(t)}}function Ue(e,t){var n=e.$options=Object.create(e.constructor.options);n.parent=t.parent,n.propsData=t.propsData,n._parentVnode=t._parentVnode,n._parentListeners=t._parentListeners,n._renderChildren=t._renderChildren,n._componentTag=t._componentTag,n._parentElm=t._parentElm,n._refElm=t._refElm,t.render&&(n.render=t.render,n.staticRenderFns=t.staticRenderFns)}function Je(e){var t=e.options;if(e.super){var n=e.super.options,r=e.superOptions,o=e.extendOptions;n!==r&&(e.superOptions=n,o.render=t.render,o.staticRenderFns=t.staticRenderFns,o._scopeId=t._scopeId,t=e.options=M(n,o),t.name&&(t.components[t.name]=e))}return t}function Be(e){this._init(e)}function We(e){e.use=function(e){if(!e.installed){var t=l(arguments,1);return t.unshift(this),"function"==typeof e.install?e.instal
 l.apply(e,t):e.apply(null,t),e.installed=!0,this}}}function ze(e){e.mixin=function(e){this.options=M(this.options,e)}}function He(e){e.cid=0;var t=1;e.extend=function(e){e=e||{};var n=this,r=n.cid,o=e._Ctor||(e._Ctor={});if(o[r])return o[r];var i=e.name||n.options.name,a=function(e){this._init(e)};return a.prototype=Object.create(n.prototype),a.prototype.constructor=a,a.cid=t++,a.options=M(n.options,e),a.super=n,a.extend=n.extend,a.mixin=n.mixin,a.use=n.use,an._assetTypes.forEach(function(e){a[e]=n[e]}),i&&(a.options.components[i]=a),a.superOptions=n.options,a.extendOptions=e,o[r]=a,a}}function Ge(e){an._assetTypes.forEach(function(t){e[t]=function(e,n){return n?("component"===t&&p(n)&&(n.name=n.name||e,n=this.options._base.extend(n)),"directive"===t&&"function"==typeof n&&(n={bind:n,update:n}),this.options[t+"s"][e]=n,n):this.options[t+"s"][e]}})}function Xe(e,t){return"string"==typeof e?e.split(",").indexOf(t)>-1:e.test(t)}function Ke(e){var t={};t.get=function(){return an},Object
 .defineProperty(e,"config",t),e.util=Nn,e.set=I,e.delete=A,e.nextTick=_n,e.options=Object.create(null),an._assetTypes.forEach(function(t){e.options[t+"s"]=Object.create(null)}),e.options._base=e,f(e.options.components,Yn),We(e),ze(e),He(e),Ge(e)}function Qe(e){this.instanceId="",this.nodeId=er++,this.parentNode=null,this.nodeType=3,this.text=e}function Ze(e){return new tr.Element(e)}function Ye(e,t){return new tr.Element(e+":"+t)}function et(e){return new tr.TextNode(e)}function tt(e){return new tr.Comment(e)}function nt(e,t,n){if(3!==t.nodeType)e.insertBefore(t,n);else if("text"===e.type)e.setAttr("value",t.text),t.parentNode=e;else{var r=Ze("text");r.setAttr("value",t.text),e.insertBefore(r,n)}}function rt(e,t){return 3===t.nodeType?void e.setAttr("value",""):void e.removeChild(t)}function ot(e,t){if(3!==t.nodeType)e.appendChild(t);else if("text"===e.type)e.setAttr("value",t.text),t.parentNode=e;else{var n=Ze("text");n.setAttr("value",t.text),e.appendChild(n)}}function it(e){retur
 n e.parentNode}function at(e){return e.nextSibling}function st(e){return e.type}function ut(e,t){e.parentNode.setAttr("value",t)}function ct(e,t,n){e.setAttr(t,n)}function lt(e,t){var n=e.data.ref;if(n){var r=e.context,o=e.child||e.elm,a=r.$refs;t?Array.isArray(a[n])?i(a[n],o):a[n]===o&&(a[n]=void 0):e.data.refInFor?Array.isArray(a[n])&&a[n].indexOf(o)<0?a[n].push(o):a[n]=[o]:a[n]=o}}function ft(e){return null==e}function dt(e){return null!=e}function pt(e,t){return e.key===t.key&&e.tag===t.tag&&e.isComment===t.isComment&&!e.data==!t.data}function ht(e,t,n){var r,o,i={};for(r=t;r<=n;++r)o=e[r].key,dt(o)&&(i[o]=r);return i}function vt(e){function t(e){return new Rn(S.tagName(e).toLowerCase(),{},[],void 0,e)}function n(e,t){function n(){0===--n.listeners&&r(e)}return n.listeners=t,n}function r(e){var t=S.parentNode(e);t&&S.removeChild(t,e)}function i(e,t,n,r,o){if(e.isRootInsert=!o,!a(e,t,n,r)){var i=e.data,s=e.children,u=e.tag;if(dt(u)){e.elm=e.ns?S.createElementNS(e.ns,u):S.createEl
 ement(u,e),h(e);var f=i&&i.appendAsTree;f||(dt(i)&&d(e,t),c(n,e.elm,r)),l(e,s,t),f&&(dt(i)&&d(e,t),c(n,e.elm,r))}else e.isComment?(e.elm=S.createComment(e.text),c(n,e.elm,r)):(e.elm=S.createTextNode(e.text),c(n,e.elm,r))}}function a(e,t,n,r){var o=e.data;if(dt(o)){var i=dt(e.child)&&o.keepAlive;if(dt(o=o.hook)&&dt(o=o.init)&&o(e,!1,n,r),dt(e.child))return p(e,t),i&&u(e,t,n,r),!0}}function u(e,t,n,r){for(var o,i=e;i.child;)if(i=i.child._vnode,dt(o=i.data)&&dt(o=o.transition)){for(o=0;o<x.activate.length;++o)x.activate[o](ir,i);t.push(i);break}c(n,e.elm,r)}function c(e,t,n){e&&(n?S.insertBefore(e,t,n):S.appendChild(e,t))}function l(e,t,n){if(Array.isArray(t))for(var r=0;r<t.length;++r)i(t[r],n,e.elm,null,!0);else s(e.text)&&S.appendChild(e.elm,S.createTextNode(e.text))}function f(e){for(;e.child;)e=e.child._vnode;return dt(e.tag)}function d(e,t){for(var n=0;n<x.create.length;++n)x.create[n](ir,e);k=e.data.hook,dt(k)&&(k.create&&k.create(ir,e),k.insert&&t.push(e))}function p(e,t){e.dat
 a.pendingInsert&&t.push.apply(t,e.data.pendingInsert),e.elm=e.child.$el,f(e)?(d(e,t),h(e)):(lt(e),t.push(e))}function h

<TRUNCATED>


[12/50] [abbrv] incubator-weex git commit: V0.10.0 stable gitlab (#178)

Posted by ji...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/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 95e26b7..90a688c 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXTextAreaComponent.m
+++ b/ios/sdk/WeexSDK/Sources/Component/WXTextAreaComponent.m
@@ -11,46 +11,11 @@
 #import "WXConvert.h"
 #import "WXComponent_internal.h"
 #import "WXView.h"
+#import "WXAssert.h"
 #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;
@@ -65,12 +30,14 @@
 @property (nonatomic, strong)NSString *textValue;
 @property (nonatomic) NSUInteger rows;
 //style
+
 @property (nonatomic) WXPixelType fontSize;
 @property (nonatomic) WXTextStyle fontStyle;
-@property (nonatomic) WXTextWeight fontWeight;
+@property (nonatomic) CGFloat fontWeight;
 @property (nonatomic, strong) NSString *fontFamily;
 @property (nonatomic, strong) UIColor *color;
 @property (nonatomic) NSTextAlignment textAlign;
+
 //event
 @property (nonatomic) BOOL inputEvent;
 @property (nonatomic) BOOL focusEvent;
@@ -79,7 +46,6 @@
 @property (nonatomic) BOOL clickEvent;
 @property (nonatomic, strong) NSString *changeEventString;
 @property (nonatomic, assign) CGSize keyboardSize;
-@property (nonatomic, assign) CGRect rootViewOriginFrame;
 
 @end
 
@@ -101,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];
@@ -140,7 +108,7 @@ WX_EXPORT_METHOD(@selector(blur))
             _color = [WXConvert UIColor:styles[@"color"]];
         }
         if (styles[@"fontSize"]) {
-            _fontSize = [WXConvert WXPixelType:styles[@"fontSize"]];
+            _fontSize = [WXConvert WXPixelType:styles[@"fontSize"] scaleFactor:self.weexInstance.pixelScaleFactor];
         }
         if (styles[@"fontWeight"]) {
             _fontWeight = [WXConvert WXTextWeight:styles[@"fontWeight"]];
@@ -154,18 +122,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;
-        }
-        _rootViewOriginFrame = CGRectNull;
     }
     
     return self;
@@ -195,7 +151,7 @@ WX_EXPORT_METHOD(@selector(blur))
 }
 - (UIView *)loadView
 {
-    return [[WXTextAreaView alloc] initWithFrame:[UIScreen mainScreen].bounds];
+    return [[WXTextAreaView alloc] init];
 }
 - (void)viewDidLoad
 {
@@ -228,42 +184,29 @@ 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];
+    [self handlePseudoClass];
 }
 
--(void)focus
+- (void)focus
 {
     if (self.textView) {
         [self.textView becomeFirstResponder];
     }
 }
 
--(void)blur
+- (void)blur
 {
     if (self.textView) {
         [self.textView resignFirstResponder];
     }
 }
 
-#pragma mark - private method
--(UIColor *)convertColor:(id)value
-{
-    UIColor *color = [WXConvert UIColor:value];
-    if(value) {
-        NSString *str = [WXConvert NSString:value];
-        if(str && [@"" isEqualToString:str]) {
-            color = [UIColor blackColor];
-        }
-    }else {
-        color = [UIColor blackColor];
-    }
-    return color;
-}
-
 #pragma mark - add-remove Event
 - (void)addEvent:(NSString *)eventName
 {
@@ -338,7 +281,7 @@ WX_EXPORT_METHOD(@selector(blur))
         [_textView setTextColor:_color];
     }
     if (styles[@"fontSize"]) {
-        _fontSize = [WXConvert WXPixelType:styles[@"fontSize"]];
+        _fontSize = [WXConvert WXPixelType:styles[@"fontSize"] scaleFactor:self.weexInstance.pixelScaleFactor];
     }
     if (styles[@"fontWeight"]) {
         _fontWeight = [WXConvert WXTextWeight:styles[@"fontWeight"]];
@@ -362,17 +305,38 @@ WX_EXPORT_METHOD(@selector(blur))
         _placeholderColor = [UIColor colorWithRed:0x99/255.0 green:0x99/255.0 blue:0x99/255.0 alpha:1.0];
     }
     [self setPlaceholderAttributedString];
-    
-    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;
-        [_textView setBorder:_border];
-    }
+    [self updatePattern];
+}
+
+#pragma mark update touch styles
+- (void)handlePseudoClass
+{
+    NSMutableDictionary *styles = [NSMutableDictionary new];
+    NSMutableDictionary *recordStyles = [NSMutableDictionary new];
+    if(_disabled){
+        recordStyles = [self getPseudoClassStylesByKeys:@[@"disabled"]];
+        [styles addEntriesFromDictionary:recordStyles];
+    }else {
+        recordStyles = [NSMutableDictionary new];
+        recordStyles = [self getPseudoClassStylesByKeys:@[@"enabled"]];
+        [styles addEntriesFromDictionary:recordStyles];
+    }
+    if ([_textView isFirstResponder]){
+        recordStyles = [NSMutableDictionary new];
+        recordStyles = [self getPseudoClassStylesByKeys:@[@"focus"]];
+        [styles addEntriesFromDictionary:recordStyles];
+    }
+    NSString *disabledStr = @"enabled";
+    if (_disabled){
+        disabledStr = @"disabled";
+    }
+    if ([_textView isFirstResponder]) {
+        NSString *focusStr = @"focus";
+        recordStyles = [NSMutableDictionary new];
+        recordStyles = [self getPseudoClassStylesByKeys:@[focusStr,disabledStr]];
+        [styles addEntriesFromDictionary:recordStyles];
+    }
+    [self updatePseudoClassStyles:styles];
 }
 
 #pragma mark measure frame
@@ -393,11 +357,11 @@ WX_EXPORT_METHOD(@selector(blur))
         }
         
         if (!isnan(weakSelf.cssNode->style.minDimensions[CSS_HEIGHT])) {
-            computedSize.width = MAX(computedSize.height, weakSelf.cssNode->style.minDimensions[CSS_HEIGHT]);
+            computedSize.height = MAX(computedSize.height, weakSelf.cssNode->style.minDimensions[CSS_HEIGHT]);
         }
         
         if (!isnan(weakSelf.cssNode->style.maxDimensions[CSS_HEIGHT])) {
-            computedSize.width = MIN(computedSize.height, weakSelf.cssNode->style.maxDimensions[CSS_HEIGHT]);
+            computedSize.height = MIN(computedSize.height, weakSelf.cssNode->style.maxDimensions[CSS_HEIGHT]);
         }
         
         return (CGSize) {
@@ -418,6 +382,7 @@ WX_EXPORT_METHOD(@selector(blur))
         [self fireEvent:@"click" params:nil];
     }
     [textView becomeFirstResponder];
+    [self handlePseudoClass];
 }
 
 - (void)textViewDidChange:(UITextView *)textView
@@ -427,10 +392,8 @@ WX_EXPORT_METHOD(@selector(blur))
     }else{
         [self setPlaceholderAttributedString];
     }
-    if (textView.markedTextRange == nil) {
-        if (_inputEvent) {
-            [self fireEvent:@"input" params:@{@"value":[textView text]} domChanges:@{@"attrs":@{@"value":[textView text]}}];
-        }
+    if (_inputEvent) {
+        [self fireEvent:@"input" params:@{@"value":[textView text]} domChanges:@{@"attrs":@{@"value":[textView text]}}];
     }
 }
 
@@ -447,13 +410,16 @@ WX_EXPORT_METHOD(@selector(blur))
     if (_blurEvent) {
         [self fireEvent:@"blur" params:nil];
     }
+    if(self.pseudoClassStyles && [self.pseudoClassStyles count]>0){
+        [self recoveryPseudoStyles:self.styles];
+    }
 }
 
-#pragma mark - set properties
+#pragma mark - private method
 - (void)setPlaceholderAttributedString
 {
     NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:_placeholderString];
-    UIFont *font = [WXUtility fontWithSize:_fontSize textWeight:_fontWeight textStyle:_fontStyle fontFamily:_fontFamily];
+    UIFont *font = [WXUtility fontWithSize:_fontSize textWeight:_fontWeight textStyle:_fontStyle fontFamily:_fontFamily scaleFactor:self.weexInstance.pixelScaleFactor];
     if (_placeholderColor) {
         [attributedString addAttribute:NSForegroundColorAttributeName value:_placeholderColor range:NSMakeRange(0, _placeholderString.length)];
         [attributedString addAttribute:NSFontAttributeName value:font range:NSMakeRange(0, _placeholderString.length)];
@@ -467,11 +433,45 @@ WX_EXPORT_METHOD(@selector(blur))
     CGRect newFrame = _placeHolderLabel.frame;
     newFrame.size.height = ceil(expectedLabelSize.size.height);
     newFrame.size.width = _textView.frame.size.width;
-    newFrame.origin.y = 6;
+    newFrame.origin.x = 4; // the cursor origin.x
+    newFrame.origin.y = 7; // the cursor origin.y
     _placeHolderLabel.frame = newFrame;
     _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) {
@@ -483,7 +483,7 @@ WX_EXPORT_METHOD(@selector(blur))
 
 - (void)setTextFont
 {
-    UIFont *font = [WXUtility fontWithSize:_fontSize textWeight:_fontWeight textStyle:_fontStyle fontFamily:_fontFamily];
+    UIFont *font = [WXUtility fontWithSize:_fontSize textWeight:_fontWeight textStyle:_fontStyle fontFamily:_fontFamily scaleFactor:self.weexInstance.pixelScaleFactor];
     [_textView setFont:font];
 }
 
@@ -508,9 +508,6 @@ WX_EXPORT_METHOD(@selector(blur))
     _keyboardSize = end.size;
     UIView * rootView = self.weexInstance.rootView;
     CGRect screenRect = [[UIScreen mainScreen] bounds];
-    if (CGRectIsNull(_rootViewOriginFrame)) {
-        _rootViewOriginFrame = rootView.frame;
-    }
     CGRect keyboardRect = (CGRect){
         .origin.x = 0,
         .origin.y = CGRectGetMaxY(screenRect) - _keyboardSize.height - 54,
@@ -529,7 +526,7 @@ WX_EXPORT_METHOD(@selector(blur))
         return;
     }
     UIView * rootView = self.weexInstance.rootView;
-    if (rootView.frame.origin.y < 0) {
+    if (!CGRectEqualToRect(self.weexInstance.frame, rootView.frame)) {
         [self setViewMovedUp:NO];
         self.weexInstance.isRootViewFrozen = NO;
     }
@@ -544,11 +541,11 @@ WX_EXPORT_METHOD(@selector(blur))
 - (void)setViewMovedUp:(BOOL)movedUp
 {
     UIView *rootView = self.weexInstance.rootView;
-    CGRect rect = _rootViewOriginFrame;
+    CGRect rect = self.weexInstance.frame;
     CGRect rootViewFrame = rootView.frame;
     CGRect textAreaFrame = [_textView.superview convertRect:_textView.frame toView:rootView];
     if (movedUp) {
-        CGFloat offset =textAreaFrame.origin.y-(rootViewFrame.size.height-_keyboardSize.height-textAreaFrame.size.height);
+        CGFloat offset = textAreaFrame.origin.y-(rootViewFrame.size.height-_keyboardSize.height-textAreaFrame.size.height);
         if (offset > 0) {
             rect = (CGRect){
                 .origin.x = 0.f,
@@ -556,10 +553,6 @@ WX_EXPORT_METHOD(@selector(blur))
                 .size = rootViewFrame.size
             };
         }
-    }else {
-        // revert back to the origin state
-        rect = _rootViewOriginFrame;
-        _rootViewOriginFrame = CGRectNull;
     }
     self.weexInstance.rootView.frame = rect;
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/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 3896d04..256bda1 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXTextComponent.m
+++ b/ios/sdk/WeexSDK/Sources/Component/WXTextComponent.m
@@ -105,7 +105,7 @@
     UIColor *_color;
     NSString *_fontFamily;
     CGFloat _fontSize;
-    WXTextWeight _fontWeight;
+    CGFloat _fontWeight;
     WXTextStyle _fontStyle;
     NSUInteger _lines;
     NSTextAlignment _textAlign;
@@ -154,6 +154,8 @@ static BOOL _isUsingTextStorageLock = NO;
     }
 }
 
+
+
 #define WX_STYLE_FILL_TEXT(key, prop, type, needLayout)\
 do {\
     id value = styles[@#key];\
@@ -166,18 +168,30 @@ do {\
     }\
 } while(0);
 
+#define WX_STYLE_FILL_TEXT_PIXEL(key, prop, needLayout)\
+do {\
+    id value = styles[@#key];\
+    if (value) {\
+        _##prop = [WXConvert WXPixelType:value scaleFactor:self.weexInstance.pixelScaleFactor];\
+        [self setNeedsRepaint];\
+    if (needLayout) {\
+        [self setNeedsLayout];\
+    }\
+}\
+} while(0);
+
 - (void)fillCSSStyles:(NSDictionary *)styles
 {
     WX_STYLE_FILL_TEXT(color, color, UIColor, NO)
     WX_STYLE_FILL_TEXT(fontFamily, fontFamily, NSString, YES)
-    WX_STYLE_FILL_TEXT(fontSize, fontSize, WXPixelType, YES)
+    WX_STYLE_FILL_TEXT_PIXEL(fontSize, fontSize, YES)
     WX_STYLE_FILL_TEXT(fontWeight, fontWeight, WXTextWeight, YES)
     WX_STYLE_FILL_TEXT(fontStyle, fontStyle, WXTextStyle, YES)
     WX_STYLE_FILL_TEXT(lines, lines, NSUInteger, YES)
     WX_STYLE_FILL_TEXT(textAlign, textAlign, NSTextAlignment, NO)
     WX_STYLE_FILL_TEXT(textDecoration, textDecoration, WXTextDecoration, YES)
     WX_STYLE_FILL_TEXT(textOverflow, textOverflow, NSString, NO)
-    WX_STYLE_FILL_TEXT(lineHeight, lineHeight, WXPixelType, YES)
+    WX_STYLE_FILL_TEXT_PIXEL(lineHeight, lineHeight, YES)
     
     UIEdgeInsets padding = {
         WXFloorPixelValue(self.cssNode->style.padding[CSS_TOP] + self.cssNode->style.border[CSS_TOP]),
@@ -278,11 +292,11 @@ do {\
         }
         
         if (!isnan(weakSelf.cssNode->style.minDimensions[CSS_HEIGHT])) {
-            computedSize.width = MAX(computedSize.height, weakSelf.cssNode->style.minDimensions[CSS_HEIGHT]);
+            computedSize.height = MAX(computedSize.height, weakSelf.cssNode->style.minDimensions[CSS_HEIGHT]);
         }
         
         if (!isnan(weakSelf.cssNode->style.maxDimensions[CSS_HEIGHT])) {
-            computedSize.width = MIN(computedSize.height, weakSelf.cssNode->style.maxDimensions[CSS_HEIGHT]);
+            computedSize.height = MIN(computedSize.height, weakSelf.cssNode->style.maxDimensions[CSS_HEIGHT]);
         }
         
         return (CGSize) {
@@ -310,7 +324,20 @@ do {\
     }
     
     // set font
-    UIFont *font = [WXUtility fontWithSize:_fontSize textWeight:_fontWeight textStyle:_fontStyle fontFamily:_fontFamily];
+    if (!_fontFamily) {
+        NSString *regex = @".*[\\u4e00-\\u9faf].*";//Has Simplified Chinese char
+        NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];
+        if ([pred evaluateWithObject:string]) {
+            if ([[UIDevice currentDevice].systemVersion floatValue] < 9.0) {
+                //\u201cHeiti SC\u201d font is "[UIFont systemFontOfSize:]" for Simplified Chinese before iOS 9.0.
+                _fontFamily = @"Heiti SC";
+            } else {
+                //\u201cPingFang SC\u201d font is "[UIFont systemFontOfSize:]" for Simplified Chinese from iOS 9.0.
+                _fontFamily = @"PingFang SC";
+            }
+        }
+    }
+    UIFont *font = [WXUtility fontWithSize:_fontSize textWeight:_fontWeight textStyle:_fontStyle fontFamily:_fontFamily scaleFactor:self.weexInstance.pixelScaleFactor];
     if (font) {
         [attributedString addAttribute:NSFontAttributeName value:font range:NSMakeRange(0, string.length)];
     }
@@ -396,6 +423,7 @@ do {\
             if (_isUsingTextStorageLock) {
                 pthread_mutex_unlock(&_textStorageMutex);
             }
+            [self readyToRender]; // notify super component
             [self setNeedsDisplay];
         }
     }];
@@ -407,9 +435,9 @@ do {\
     [self syncTextStorageForView];
 }
 
-- (void)_updateStylesOnComponentThread:(NSDictionary *)styles resetStyles:(NSMutableArray *)resetStyles
+- (void)_updateStylesOnComponentThread:(NSDictionary *)styles resetStyles:(NSMutableArray *)resetStyles isUpdateStyles:(BOOL)isUpdateStyles
 {
-    [super _updateStylesOnComponentThread:styles resetStyles:(NSMutableArray *)resetStyles];
+    [super _updateStylesOnComponentThread:styles resetStyles:(NSMutableArray *)resetStyles isUpdateStyles:isUpdateStyles];
     
     [self fillCSSStyles:styles];
     

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/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 8f26924..01d362a 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXTextInputComponent.m
+++ b/ios/sdk/WeexSDK/Sources/Component/WXTextInputComponent.m
@@ -10,7 +10,11 @@
 #import "WXConvert.h"
 #import "WXUtility.h"
 #import "WXSDKInstance.h"
+#import "WXSDKInstance_private.h"
 #import "WXDefine.h"
+#import "WXAssert.h"
+#import "WXComponent_internal.h"
+#import "WXComponent+PseudoClassManagement.h"
 
 @interface WXTextInputView : UITextField
 @property (nonatomic, assign) UIEdgeInsets border;
@@ -54,16 +58,22 @@
 
 @property (nonatomic, strong) WXTextInputView *inputView;
 @property (nonatomic, strong) WXDatePickerManager *datePickerManager;
+@property (nonatomic, strong) NSDictionary *attr;
 //attribute
 @property (nonatomic, strong) UIColor *placeholderColor;
-@property (nonatomic, strong) NSString *placeholder;
+@property (nonatomic, strong) NSString *placeholderString;
 @property (nonatomic) NSNumber *maxLength;
+@property (nonatomic) NSString * value;
+@property (nonatomic) BOOL autofocus;
+@property (nonatomic) BOOL disabled;
+@property (nonatomic, copy) NSString *inputType;
 //style
 @property (nonatomic) WXPixelType fontSize;
 @property (nonatomic) WXTextStyle fontStyle;
-@property (nonatomic) WXTextWeight fontWeight;
+@property (nonatomic) CGFloat fontWeight;
 @property (nonatomic, strong) NSString *fontFamily;
-@property (nonatomic, copy) NSString *inputType;
+@property (nonatomic, strong) UIColor *colorForStyle;
+@property (nonatomic)NSTextAlignment textAlignForStyle;
 
 //event
 @property (nonatomic) BOOL inputEvent;
@@ -72,7 +82,6 @@
 @property (nonatomic) BOOL changeEvent;
 @property (nonatomic, strong) NSString *changeEventString;
 @property (nonatomic, assign) CGSize keyboardSize;
-@property (nonatomic, assign) CGRect rootViewOriginFrame;
 
 @end
 
@@ -98,53 +107,25 @@ WX_EXPORT_METHOD(@selector(blur))
         _focusEvent = NO;
         _blurEvent = NO;
         _changeEvent = NO;
-        
-        _inputView = [[WXTextInputView alloc] init];
-        _datePickerManager = [[WXDatePickerManager alloc] init];
-        _datePickerManager.delegate = self;
-        if (attributes[@"type"]) {
-            NSString *type = [WXConvert NSString:attributes[@"type"]];
-            if (type) {
-                [self setType: type];
-            }
-        }
-        
-        if (attributes[@"autofocus"]) {
-            [self setAutofocus:[attributes[@"autofocus"] boolValue]];
-        }
-        if (attributes[@"disabled"]) {
-            [_inputView setEnabled:![attributes[@"disabled"] boolValue]];
-        }
-        if (attributes[@"value"]) {
-            NSString* value = [WXConvert NSString:attributes[@"value"]];
-            if (value) {
-                _inputView.text = value;
-            }
-        }
-        if([_inputType isEqualToString:@"date"] || [_inputType isEqualToString:@"time"])
-        {
-            [_datePickerManager configDatePicker:attributes];
+        // handle attributes
+        _autofocus = [attributes[@"autofocus"] boolValue];
+        _disabled = [attributes[@"disabled"] boolValue];
+        _value = [WXConvert NSString:attributes[@"value"]]?:@"";
+        _placeholderString = [WXConvert NSString:attributes[@"placeholder"]]?:@"";
+        if(attributes[@"type"]) {
+            _inputType = [WXConvert NSString:attributes[@"type"]];
+            _attr = attributes;
         }
-        if (attributes[@"placeholder"]) {
-            NSString *placeHolder = [WXConvert NSString:attributes[@"placeholder"]];
-            if (placeHolder) {
-                _placeholder = placeHolder;
-            }
-        }
-        if (!_placeholder) {
-            _placeholder = @"";
-        }
-        
         if (attributes[@"maxlength"]) {
             _maxLength = [NSNumber numberWithUnsignedInteger:[attributes[@"maxlength"] integerValue]];
         }
         
+        // handle styles
         if (styles[@"color"]) {
-            [_inputView setTextColor:[WXConvert UIColor:styles[@"color"]]];
+            _colorForStyle = [WXConvert UIColor:styles[@"color"]];
         }
-        
         if (styles[@"fontSize"]) {
-            _fontSize = [WXConvert WXPixelType:styles[@"fontSize"]];
+            _fontSize = [WXConvert WXPixelType:styles[@"fontSize"] scaleFactor:self.weexInstance.pixelScaleFactor];
         }
         if (styles[@"fontWeight"]) {
             _fontWeight = [WXConvert WXTextWeight:styles[@"fontWeight"]];
@@ -156,7 +137,7 @@ WX_EXPORT_METHOD(@selector(blur))
             _fontFamily = styles[@"fontFamily"];
         }
         if (styles[@"textAlign"]) {
-            [_inputView setTextAlignment:[WXConvert NSTextAlignment:styles[@"textAlign"]]] ;
+            _textAlignForStyle = [WXConvert NSTextAlignment:styles[@"textAlign"]];
         }
         
         if (styles[@"placeholderColor"]) {
@@ -164,25 +145,14 @@ WX_EXPORT_METHOD(@selector(blur))
         }else {
             _placeholderColor = [UIColor colorWithRed:0x99/255.0 green:0x99/255.0 blue:0x99/255.0 alpha:1.0];
         }
-        [self setPlaceholderAttributedString];
-        [self setTextFont];
-        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];
-        }
-        
-        _rootViewOriginFrame = CGRectNull;
     }
     
     return self;
 }
 
--(UIView *)loadView
+- (UIView *)loadView
 {
+    _inputView = [[WXTextInputView alloc] init];
     return _inputView;
 }
 
@@ -197,6 +167,16 @@ WX_EXPORT_METHOD(@selector(blur))
     _border = UIEdgeInsetsZero;
     _inputView.delegate = self;
     _inputView.userInteractionEnabled = YES;
+    [self setType];
+    _inputView.text = _value;
+    [self setAutofocus:_autofocus];
+    [self setTextFont];
+    [self setPlaceholderAttributedString];
+    [_inputView setTextAlignment:_textAlignForStyle];
+    [_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];
@@ -204,6 +184,7 @@ WX_EXPORT_METHOD(@selector(blur))
     toolbar.items = [NSArray arrayWithObjects:space, barButton, nil];
     
     _inputView.inputAccessoryView = toolbar;
+    [self handlePseudoClass];
 }
 
 - (void)viewWillLoad
@@ -238,21 +219,6 @@ WX_EXPORT_METHOD(@selector(blur))
     }
 }
 
-#pragma mark - private method
--(UIColor *)convertColor:(id)value
-{
-    UIColor *color = [WXConvert UIColor:value];
-    if(value) {
-        NSString *str = [WXConvert NSString:value];
-        if(str && [@"" isEqualToString:str]) {
-            color = [UIColor blackColor];
-        }
-    }else {
-        color = [UIColor blackColor];
-    }
-    return color;
-}
-
 #pragma mark - Add Event
 - (void)addEvent:(NSString *)eventName
 {
@@ -292,40 +258,26 @@ WX_EXPORT_METHOD(@selector(blur))
 
 - (void)updateAttributes:(NSDictionary *)attributes
 {
+    _attr = attributes;
     if (attributes[@"type"]) {
-        NSString *type = [WXConvert NSString:attributes[@"type"]];
-        if (type) {
-            [self setType: type];
-        }
-    }
-    if (attributes[@"autofocus"]) {
-        [self setAutofocus:[attributes[@"autofocus"] boolValue]];
-    }
-    if (attributes[@"disabled"]) {
-        [_inputView setEnabled:![attributes[@"disabled"] boolValue]];
+        _inputType = [WXConvert NSString:attributes[@"type"]];
     }
+    [self setType];
+    _autofocus = [attributes[@"autofocus"] boolValue];
+    [self setAutofocus:_autofocus];
+    _disabled = [attributes[@"disabled"] boolValue];
+    [_inputView setEnabled:!_disabled];
     if (attributes[@"maxlength"]) {
         _maxLength = [NSNumber numberWithInteger:[attributes[@"maxlength"] integerValue]];
     }
     if (attributes[@"placeholder"]) {
-        NSString* placeholder = [WXConvert NSString:attributes[@"placeholder"]];
-        if (placeholder) {
-            _inputView.placeholder = _placeholder;
-            _placeholder = placeholder;
-        }
+        _placeholderString = [WXConvert NSString:attributes[@"placeholder"]]?:@"";
+        [self setPlaceholderAttributedString];
     }
     if (attributes[@"value"]) {
-        NSString* value = [WXConvert NSString:attributes[@"value"]];
-        if (value) {
-            _inputView.text = value;
-        }
+        _value = [WXConvert NSString:attributes[@"value"]]?:@"";
+        [_inputView setText:_value];
     }
-    if([_inputType isEqualToString:@"date"] || [_inputType isEqualToString:@"time"])
-    {
-        [_datePickerManager updateDatePicker:attributes];
-    }
-    
-    [self setPlaceholderAttributedString];
 }
 
 #pragma mark - upate styles
@@ -333,10 +285,11 @@ WX_EXPORT_METHOD(@selector(blur))
 - (void)updateStyles:(NSDictionary *)styles
 {
     if (styles[@"color"]) {
-       [_inputView setTextColor:[WXConvert UIColor:styles[@"color"]]];
+        _colorForStyle = [WXConvert UIColor:styles[@"color"]];
+       [_inputView setTextColor:_colorForStyle];
     }
     if (styles[@"fontSize"]) {
-        _fontSize = [WXConvert WXPixelType:styles[@"fontSize"]];
+        _fontSize = [WXConvert WXPixelType:styles[@"fontSize"] scaleFactor:self.weexInstance.pixelScaleFactor];
     }
     if (styles[@"fontWeight"]) {
         _fontWeight = [WXConvert WXTextWeight:styles[@"fontWeight"]];
@@ -347,8 +300,11 @@ WX_EXPORT_METHOD(@selector(blur))
     if (styles[@"fontFamily"]) {
         _fontFamily = [WXConvert NSString:styles[@"fontFamily"]];
     }
+    [self setTextFont];
+    
     if (styles[@"textAlign"]) {
-        [_inputView setTextAlignment:[WXConvert NSTextAlignment:styles[@"textAlign"]]] ;
+        _textAlignForStyle = [WXConvert NSTextAlignment:styles[@"textAlign"]];
+        [_inputView setTextAlignment:_textAlignForStyle] ;
     }
     if (styles[@"placeholderColor"]) {
         _placeholderColor = [WXConvert UIColor:styles[@"placeholderColor"]];
@@ -356,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];
@@ -366,8 +327,6 @@ WX_EXPORT_METHOD(@selector(blur))
     if (!UIEdgeInsetsEqualToEdgeInsets(border, _border)) {
         [self setBorder:border];
     }
-    
-    [self setTextFont];
 }
 
 - (CGSize (^)(CGSize))measureBlock
@@ -386,11 +345,11 @@ WX_EXPORT_METHOD(@selector(blur))
         }
         
         if (!isnan(weakSelf.cssNode->style.minDimensions[CSS_HEIGHT])) {
-            computedSize.width = MAX(computedSize.height, weakSelf.cssNode->style.minDimensions[CSS_HEIGHT]);
+            computedSize.height = MAX(computedSize.height, weakSelf.cssNode->style.minDimensions[CSS_HEIGHT]);
         }
         
         if (!isnan(weakSelf.cssNode->style.maxDimensions[CSS_HEIGHT])) {
-            computedSize.width = MIN(computedSize.height, weakSelf.cssNode->style.maxDimensions[CSS_HEIGHT]);
+            computedSize.height = MIN(computedSize.height, weakSelf.cssNode->style.maxDimensions[CSS_HEIGHT]);
         }
         
         return (CGSize) {
@@ -400,20 +359,8 @@ WX_EXPORT_METHOD(@selector(blur))
     };
 }
 
--(UIColor *)covertColor:(id)value
-{
-    UIColor *color = [WXConvert UIColor:value];
-    if(value) {
-        NSString *str = [WXConvert NSString:value];
-        if(str && [@"" isEqualToString:str]) {
-            color = [UIColor blackColor];
-        }
-    }
-    return color;
-}
-
-#pragma mark -
 #pragma mark WXDatePickerManagerDelegate
+
 -(void)fetchDatePickerValue:(NSString *)value
 {
     _inputView.text = value;
@@ -445,6 +392,7 @@ WX_EXPORT_METHOD(@selector(blur))
     if (_focusEvent) {
         [self fireEvent:@"focus" params:nil];
     }
+    [self handlePseudoClass];
 }
 
 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
@@ -471,6 +419,9 @@ WX_EXPORT_METHOD(@selector(blur))
     if (_blurEvent) {
         [self fireEvent:@"blur" params:nil];
     }
+    if(self.pseudoClassStyles && [self.pseudoClassStyles count]>0){
+        [self recoveryPseudoStyles:self.styles];
+    }
 }
 
 - (void)textFiledEditChanged:(NSNotification *)notifi
@@ -485,11 +436,11 @@ WX_EXPORT_METHOD(@selector(blur))
 - (void)setViewMovedUp:(BOOL)movedUp
 {
     UIView *rootView = self.weexInstance.rootView;
-    CGRect rect = _rootViewOriginFrame;
+    CGRect rect = self.weexInstance.frame;
     CGRect rootViewFrame = rootView.frame;
     CGRect inputFrame = [_inputView.superview convertRect:_inputView.frame toView:rootView];
     if (movedUp) {
-        CGFloat offset =inputFrame.origin.y-(rootViewFrame.size.height-_keyboardSize.height-inputFrame.size.height);
+        CGFloat offset = inputFrame.origin.y-(rootViewFrame.size.height-_keyboardSize.height-inputFrame.size.height);
         if (offset > 0) {
             rect = (CGRect){
                 .origin.x = 0.f,
@@ -497,18 +448,14 @@ WX_EXPORT_METHOD(@selector(blur))
                 .size = rootViewFrame.size
             };
         }
-    }else {
-        // revert back to the origin state
-        rect = _rootViewOriginFrame;
-        _rootViewOriginFrame = CGRectNull;
     }
     self.weexInstance.rootView.frame = rect;
 }
 
 
-#pragma mark
+#pragma mark private method
 
--(BOOL)isDateType
+- (BOOL)isDateType
 {
     if([_inputType isEqualToString:@"date"] || [_inputType isEqualToString:@"time"])
         return YES;
@@ -517,16 +464,14 @@ WX_EXPORT_METHOD(@selector(blur))
 
 - (void)setPlaceholderAttributedString
 {
-    if (_placeholderColor) {
-        NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:_placeholder];
-        [attributedString addAttribute:NSForegroundColorAttributeName value:_placeholderColor range:NSMakeRange(0, _placeholder.length)];
-        [_inputView setAttributedPlaceholder:attributedString];
-    }
+    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:_placeholderString];
+    [attributedString addAttribute:NSForegroundColorAttributeName value:_placeholderColor range:NSMakeRange(0, _placeholderString.length)];
+    [_inputView setAttributedPlaceholder:attributedString];
 }
 
 - (void)setTextFont
 {
-    UIFont *font = [WXUtility fontWithSize:_fontSize textWeight:_fontWeight textStyle:_fontStyle fontFamily:_fontFamily];
+    UIFont *font = [WXUtility fontWithSize:_fontSize textWeight:_fontWeight textStyle:_fontStyle fontFamily:_fontFamily scaleFactor:self.weexInstance.pixelScaleFactor];
     [_inputView setFont:font];
 }
 
@@ -551,26 +496,27 @@ WX_EXPORT_METHOD(@selector(blur))
     }
 }
 
-- (void)setType:(NSString*)type
+- (void)setType
 {
     [_inputView setKeyboardType:UIKeyboardTypeDefault];
     [_inputView setSecureTextEntry:NO];
-    _inputType = type;
     
-    if ([type isEqualToString:@"text"]) {
+    if ([_inputType isEqualToString:@"text"]) {
         [_inputView setKeyboardType:UIKeyboardTypeDefault];
-    }
-    else if ([type isEqualToString:@"password"]) {
+    }else if ([_inputType isEqualToString:@"password"]) {
         [_inputView setSecureTextEntry:YES];
-    }
-    else if ([type isEqualToString:@"tel"]) {
+    }else if ([_inputType isEqualToString:@"tel"]) {
         [_inputView setKeyboardType:UIKeyboardTypePhonePad];
-    }
-    else if ([type isEqualToString:@"email"]) {
+    }else if ([_inputType isEqualToString:@"email"]) {
         [_inputView setKeyboardType:UIKeyboardTypeEmailAddress];
-    }
-    else if ([type isEqualToString:@"url"]) {
+    }else if ([_inputType isEqualToString:@"url"]) {
         [_inputView setKeyboardType:UIKeyboardTypeURL];
+    }else if ([self isDateType]) {
+        if (!_datePickerManager) {
+            _datePickerManager = [[WXDatePickerManager alloc] init];
+            _datePickerManager.delegate = self;
+        }
+        [_datePickerManager updateDatePicker:_attr];
     }
 }
 
@@ -586,6 +532,37 @@ WX_EXPORT_METHOD(@selector(blur))
     [_inputView setBorder:border];
 }
 
+#pragma mark update touch styles
+-(void)handlePseudoClass
+{
+    NSMutableDictionary *styles = [NSMutableDictionary new];
+    NSMutableDictionary *recordStyles = [NSMutableDictionary new];
+    if(_disabled){
+        recordStyles = [self getPseudoClassStylesByKeys:@[@"disabled"]];
+        [styles addEntriesFromDictionary:recordStyles];
+    }else {
+        recordStyles = [NSMutableDictionary new];
+        recordStyles = [self getPseudoClassStylesByKeys:@[@"enabled"]];
+        [styles addEntriesFromDictionary:recordStyles];
+    }
+    if ([_inputView isFirstResponder]){
+        recordStyles = [NSMutableDictionary new];
+        recordStyles = [self getPseudoClassStylesByKeys:@[@"focus"]];
+        [styles addEntriesFromDictionary:recordStyles];
+    }
+    NSString *disabledStr = @"enabled";
+    if (_disabled){
+        disabledStr = @"disabled";
+    }
+    if ([_inputView isFirstResponder]) {
+        NSString *focusStr = @"focus";
+        recordStyles = [NSMutableDictionary new];
+        recordStyles = [self getPseudoClassStylesByKeys:@[focusStr,disabledStr]];
+        [styles addEntriesFromDictionary:recordStyles];
+    }
+    [self updatePseudoClassStyles:styles];
+}
+
 #pragma mark keyboard
 - (void)keyboardWasShown:(NSNotification*)notification
 {
@@ -601,9 +578,6 @@ WX_EXPORT_METHOD(@selector(blur))
     _keyboardSize = end.size;
     UIView * rootView = self.weexInstance.rootView;
     CGRect screenRect = [[UIScreen mainScreen] bounds];
-    if (CGRectIsNull(_rootViewOriginFrame)) {
-        _rootViewOriginFrame = rootView.frame;
-    }
     CGRect keyboardRect = (CGRect){
         .origin.x = 0,
         .origin.y = CGRectGetMaxY(screenRect) - _keyboardSize.height - 54,
@@ -622,7 +596,7 @@ WX_EXPORT_METHOD(@selector(blur))
         return;
     }
     UIView * rootView = self.weexInstance.rootView;
-    if (rootView.frame.origin.y < 0) {
+    if (!CGRectEqualToRect(self.weexInstance.frame, rootView.frame)) {
         [self setViewMovedUp:NO];
         self.weexInstance.isRootViewFrozen = NO;
     }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Component/WXTransform.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXTransform.h b/ios/sdk/WeexSDK/Sources/Component/WXTransform.h
index aab6d59..1fed421 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXTransform.h
+++ b/ios/sdk/WeexSDK/Sources/Component/WXTransform.h
@@ -8,11 +8,14 @@
 
 #import <Foundation/Foundation.h>
 #import <UIKit/UIKit.h>
+@class WXSDKInstance;
 
 @interface WXTransform : NSObject
 
 @property CGAffineTransform transform;
 
+- (instancetype)initWithInstance:(WXSDKInstance *)instance NS_DESIGNATED_INITIALIZER;
+
 - (CATransform3D)getTransform:(NSString *)cssValue;
 - (CATransform3D)getTransform:(NSString *)cssValue withView:(UIView *)view;
 - (CATransform3D)getTransform:(NSString *)cssValue withView:(UIView *)view withOrigin:(NSString *)origin;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Component/WXTransform.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXTransform.m b/ios/sdk/WeexSDK/Sources/Component/WXTransform.m
index b10dbd5..e25bd5c 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXTransform.m
+++ b/ios/sdk/WeexSDK/Sources/Component/WXTransform.m
@@ -9,12 +9,14 @@
 #import "WXTransform.h"
 #import "math.h"
 #import "WXUtility.h"
+#import "WXSDKInstance.h"
 
 @interface WXTransform()
 
 @property (nonatomic, weak) UIView *view;
 @property (nonatomic, assign) float rotateAngle;
 @property (nonatomic, assign) BOOL isTransformRotate;
+@property (nonatomic, weak) WXSDKInstance *weexInstance;
 
 @end
 
@@ -22,9 +24,15 @@
 
 - (instancetype)init
 {
+    return [self initWithInstance:nil];
+}
+
+- (instancetype)initWithInstance:(WXSDKInstance *)weexInstance;
+{
     if (self = [super init]) {
         _isTransformRotate = YES;
         _rotateAngle = 0.0;
+        _weexInstance = weexInstance;
     }
     
     return self;
@@ -124,14 +132,14 @@
                 if ([value hasSuffix:@"%"]) {
                     val *= width / 100;
                 } else {
-                    val = WXPixelResize(val);
+                    val = WXPixelScale(val, self.weexInstance.pixelScaleFactor);
                 }
                 x = val;
             } else {
                 if ([value hasSuffix:@"%"]) {
                     val *= height / 100;
                 } else {
-                    val = WXPixelResize(val);
+                    val = WXPixelScale(val, self.weexInstance.pixelScaleFactor);
                 }
                 y = val;
             }
@@ -139,7 +147,9 @@
     }
     x -= width / 2.0;
     y -= height / 2.0;
-    return CGPointMake(round(x / WXScreenResizeRadio()), round(y / WXScreenResizeRadio()));
+    
+    CGFloat scaleFactor = self.weexInstance.pixelScaleFactor;
+    return CGPointMake(round(x / scaleFactor), round(y / scaleFactor));
 }
 
 // Angle in radians
@@ -159,7 +169,7 @@
     if ([value[0] hasSuffix:@"%"] && _view) {
         x *= _view.bounds.size.width / 100;
     } else {
-        x = WXPixelResize(x);
+        x = WXPixelScale(x, self.weexInstance.pixelScaleFactor);
     }
 
     double y = 0;
@@ -169,7 +179,7 @@
         if ([value[1] hasSuffix:@"%"] && _view) {
             y *= _view.bounds.size.height / 100;
         } else {
-            y = WXPixelResize(y);
+            y = WXPixelScale(y, self.weexInstance.pixelScaleFactor);
         }
     }
     _transform = CGAffineTransformTranslate(_transform, x, y);
@@ -188,8 +198,9 @@
 - (void)doRotate:(NSArray *)value
 {
     float rotateAngle = [self getAngle:value[0]];
-    
-    if (_isTransformRotate || rotateAngle <= M_PI+0.0001) {
+    CGAffineTransform cgTransform = CATransform3DGetAffineTransform(_view.layer.transform);
+    float originAngle = atan2f(cgTransform.b, cgTransform.a) * (180 / M_PI);
+    if (_isTransformRotate || fabs(rotateAngle - originAngle) <= M_PI+0.0001){
         _transform = CGAffineTransformRotate(_transform, rotateAngle);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Component/WXVideoComponent.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXVideoComponent.m b/ios/sdk/WeexSDK/Sources/Component/WXVideoComponent.m
index 4b8cad2..135ba96 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXVideoComponent.m
+++ b/ios/sdk/WeexSDK/Sources/Component/WXVideoComponent.m
@@ -140,7 +140,7 @@
 - (void)setURL:(NSURL *)URL
 {
     NSMutableString *urlStr = nil;
-    WX_REWRITE_URL(URL.absoluteString, WXResourceTypeLink, self.weexSDKInstance, &urlStr)
+    WX_REWRITE_URL(URL.absoluteString, WXResourceTypeVideo, self.weexSDKInstance, &urlStr)
     
     if (!urlStr) {
         return;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Controller/WXBaseViewController.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Controller/WXBaseViewController.m b/ios/sdk/WeexSDK/Sources/Controller/WXBaseViewController.m
index fe8fff9..47ce11a 100644
--- a/ios/sdk/WeexSDK/Sources/Controller/WXBaseViewController.m
+++ b/ios/sdk/WeexSDK/Sources/Controller/WXBaseViewController.m
@@ -76,32 +76,15 @@
     }
 }
 
-- (void)addEdgePop
-{
-    UIScreenEdgePanGestureRecognizer *edgePanGestureRecognizer = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self action:@selector(edgePanGesture:)];
-    edgePanGestureRecognizer.delegate = self;
-    edgePanGestureRecognizer.edges = UIRectEdgeLeft;
-    [self.view addGestureRecognizer:edgePanGestureRecognizer];
-}
-
-- (void)edgePanGesture:(UIScreenEdgePanGestureRecognizer*)edgePanGestureRecognizer
-{
-    [self.navigationController popViewControllerAnimated:YES];
-}
-
-#pragma mark- UIGestureRecognizerDelegate
-
-- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
+- (void)viewWillDisappear:(BOOL)animated
 {
-    if (!self.navigationController || [self.navigationController.viewControllers count] == 1) {
-        return NO;
-    }
-    return YES;
+    [_instance fireGlobalEvent:WX_APPLICATION_WILL_RESIGN_ACTIVE params:nil];
 }
 
 - (void)viewDidAppear:(BOOL)animated
 {
     [super viewDidAppear:animated];
+    [_instance fireGlobalEvent:WX_APPLICATION_DID_BECOME_ACTIVE params:nil];
     [self _updateInstanceState:WeexInstanceAppear];
 }
 
@@ -123,6 +106,29 @@
     [self _renderWithURL:_sourceURL];
 }
 
+- (void)addEdgePop
+{
+    UIScreenEdgePanGestureRecognizer *edgePanGestureRecognizer = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self action:@selector(edgePanGesture:)];
+    edgePanGestureRecognizer.delegate = self;
+    edgePanGestureRecognizer.edges = UIRectEdgeLeft;
+    [self.view addGestureRecognizer:edgePanGestureRecognizer];
+}
+
+- (void)edgePanGesture:(UIScreenEdgePanGestureRecognizer*)edgePanGestureRecognizer
+{
+    [self.navigationController popViewControllerAnimated:YES];
+}
+
+#pragma mark- UIGestureRecognizerDelegate
+
+- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
+{
+    if (!self.navigationController || [self.navigationController.viewControllers count] == 1) {
+        return NO;
+    }
+    return YES;
+}
+
 - (void)_renderWithURL:(NSURL *)sourceURL
 {
     if (!sourceURL) {
@@ -143,7 +149,7 @@
     } else {
         newURL = [NSString stringWithFormat:@"%@?random=%d", sourceURL.absoluteString, arc4random()];
     }
-    [_instance renderWithURL:[NSURL URLWithString:newURL] options:@{@"bundleUrl":sourceURL} data:nil];
+    [_instance renderWithURL:[NSURL URLWithString:newURL] options:@{@"bundleUrl":sourceURL.absoluteString} data:nil];
     
     __weak typeof(self) weakSelf = self;
     _instance.onCreate = ^(UIView *view) {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Debug/WXDebugTool.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Debug/WXDebugTool.m b/ios/sdk/WeexSDK/Sources/Debug/WXDebugTool.m
index 99cef47..1d9d649 100644
--- a/ios/sdk/WeexSDK/Sources/Debug/WXDebugTool.m
+++ b/ios/sdk/WeexSDK/Sources/Debug/WXDebugTool.m
@@ -13,6 +13,9 @@
 #import "WXUtility.h"
 #import "WXSDKManager.h"
 #import "WXSDKEngine.h"
+#import "WXResourceRequest.h"
+#import "WXResourceResponse.h"
+#import "WXResourceLoader.h"
 
 static BOOL WXIsDebug;
 static BOOL WXIsDevToolDebug;
@@ -69,7 +72,7 @@ static NSString* WXDebugrepJSFramework;
         if ([key isEqualToString:@"jsframework"]) {
             WXDebugrepJSFramework = script;
             [WXSDKManager unload];
-            [WXSDKEngine initSDKEnviroment:script];
+            [WXSDKEngine initSDKEnvironment:script];
         }else {
             WXDebugrepBundleJS = script;
         }
@@ -88,33 +91,24 @@ static NSString* WXDebugrepJSFramework;
         });
     } else {
         // HTTP/HTTPS URL
-        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
-        [request setValue:[WXUtility userAgent] forHTTPHeaderField:@"User-Agent"];
+        WXResourceRequest *request = [WXResourceRequest requestWithURL:url resourceType:WXResourceTypeMainBundle referrer:nil cachePolicy:NSURLRequestUseProtocolCachePolicy];
+        request.userAgent = [WXUtility userAgent];
+        WXResourceLoader *loader = [[WXResourceLoader alloc] initWithRequest:request];
         
-        id<WXNetworkProtocol> networkHandler = [WXHandlerFactory handlerForProtocol:@protocol(WXNetworkProtocol)];
+        loader.onFinished = ^(const WXResourceResponse * response, NSData *data) {
+            if ([response isKindOfClass:[NSHTTPURLResponse class]] && ((NSHTTPURLResponse *)response).statusCode != 200) {
+                __unused NSError *error = [NSError errorWithDomain:WX_ERROR_DOMAIN
+                                                              code:((NSHTTPURLResponse *)response).statusCode
+                                                          userInfo:@{@"message":@"status code error."}];
+                
+                return ;
+            }
+            
+            NSString * script = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+            scriptLoadFinish(key, script);
+        };
         
-        __block NSURLResponse *urlResponse;
-        [networkHandler sendRequest:request
-                    withSendingData:^(int64_t bytesSent, int64_t totalBytes) {}
-                       withResponse:^(NSURLResponse *response) {
-                           urlResponse = response;
-                       }
-                    withReceiveData:^(NSData *data) {}
-                    withCompeletion:^(NSData *totalData, NSError *error) {
-                        if (error) {
-                            
-                        } else {
-                            if ([urlResponse isKindOfClass:[NSHTTPURLResponse class]] && ((NSHTTPURLResponse *)urlResponse).statusCode != 200) {
-                                __unused NSError *error = [NSError errorWithDomain:WX_ERROR_DOMAIN
-                                                                     code:((NSHTTPURLResponse *)urlResponse).statusCode
-                                                                 userInfo:@{@"message":@"status code error."}];
-                                
-                                return ;
-                            }
-                            NSString * script = [[NSString alloc] initWithData:totalData encoding:NSUTF8StringEncoding];
-                            scriptLoadFinish(key, script);
-                        }
-                    }];
+        [loader start];
     }
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/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 59d65f0..b2fcb54 100644
--- a/ios/sdk/WeexSDK/Sources/Display/WXComponent+Display.m
+++ b/ios/sdk/WeexSDK/Sources/Display/WXComponent+Display.m
@@ -16,6 +16,7 @@
 #import "WXThreadSafeCounter.h"
 #import "UIBezierPath+Weex.h"
 #import "WXRoundedRect.h"
+#import "WXSDKInstance.h"
 
 #pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
 
@@ -435,10 +436,45 @@ do {\
     }\
 } while (0);
     
+// TODO: refactor this hopefully
+#define WX_CHECK_BORDER_PROP_PIXEL(prop, direction1, direction2, direction3, direction4)\
+do {\
+    BOOL needsDisplay = NO; \
+    NSString *styleProp= WX_NSSTRING(WX_CONCAT(border, prop));\
+    if (styles[styleProp]) {\
+        _border##direction1##prop = _border##direction2##prop = _border##direction3##prop = _border##direction4##prop = [WXConvert WXPixelType:styles[styleProp] scaleFactor:self.weexInstance.pixelScaleFactor];\
+    needsDisplay = YES;\
+    }\
+    NSString *styleDirection1Prop = WX_NSSTRING(WX_CONCAT_TRIPLE(border, direction1, prop));\
+    if (styles[styleDirection1Prop]) {\
+        _border##direction1##prop = [WXConvert WXPixelType:styles[styleDirection1Prop] scaleFactor:self.weexInstance.pixelScaleFactor];\
+        needsDisplay = YES;\
+    }\
+    NSString *styleDirection2Prop = WX_NSSTRING(WX_CONCAT_TRIPLE(border, direction2, prop));\
+    if (styles[styleDirection2Prop]) {\
+        _border##direction2##prop = [WXConvert WXPixelType:styles[styleDirection2Prop] scaleFactor:self.weexInstance.pixelScaleFactor];\
+        needsDisplay = YES;\
+    }\
+    NSString *styleDirection3Prop = WX_NSSTRING(WX_CONCAT_TRIPLE(border, direction3, prop));\
+    if (styles[styleDirection3Prop]) {\
+        _border##direction3##prop = [WXConvert WXPixelType:styles[styleDirection3Prop] scaleFactor:self.weexInstance.pixelScaleFactor];\
+        needsDisplay = YES;\
+    }\
+    NSString *styleDirection4Prop = WX_NSSTRING(WX_CONCAT_TRIPLE(border, direction4, prop));\
+    if (styles[styleDirection4Prop]) {\
+        _border##direction4##prop = [WXConvert WXPixelType:styles[styleDirection4Prop] scaleFactor:self.weexInstance.pixelScaleFactor];\
+        needsDisplay = YES;\
+    }\
+    if (needsDisplay && updating) {\
+        [self setNeedsDisplay];\
+    }\
+} while (0);
+    
+    
     WX_CHECK_BORDER_PROP(Style, Top, Left, Bottom, Right, WXBorderStyle)
     WX_CHECK_BORDER_PROP(Color, Top, Left, Bottom, Right, UIColor)
-    WX_CHECK_BORDER_PROP(Width, Top, Left, Bottom, Right, WXPixelType)
-    WX_CHECK_BORDER_PROP(Radius, TopLeft, TopRight, BottomLeft, BottomRight, WXPixelType)
+    WX_CHECK_BORDER_PROP_PIXEL(Width, Top, Left, Bottom, Right)
+    WX_CHECK_BORDER_PROP_PIXEL(Radius, TopLeft, TopRight, BottomLeft, BottomRight)
 
     if (updating) {
         BOOL nowNeedsDrawBorder = [self _needsDrawBorder];

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/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 eaceaee..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
  *
@@ -45,6 +50,38 @@
 + (void)registerComponent:(NSString *)name withClass:(Class)clazz withProperties:(NSDictionary *)properties;
 
 /**
+ * @abstract Registers a component for a given name, options and js code
+ *
+ * @param name The service name to register
+ *
+ * @param options The service options to register
+ *
+ * @param code service js code to invoke
+ *
+ */
++ (void)registerService:(NSString *)name withScript:(NSString *)serviceScript withOptions:(NSDictionary *)options;
+
+/**
+ * @abstract Registers a component for a given name, options and js url
+ *
+ * @param name The service name to register
+ *
+ * @param options The service options to register
+ *
+ * @param url The service url to register
+ *
+ */
++ (void)registerService:(NSString *)name withScriptUrl:(NSURL *)serviceScriptUrl WithOptions:(NSDictionary *)options;
+
+/**
+ * @abstract Registers a component for a given name, options and js code
+ *
+ * @param name The name of register service
+ *
+ */
++ (void)unregisterService:(NSString *)name;
+
+/**
  * @abstract Registers a handler for a given handler instance and specific protocol
  *
  * @param handler The handler instance to register
@@ -54,6 +91,7 @@
  */
 + (void)registerHandler:(id)handler withProtocol:(Protocol *)protocol;
 
+
 /**
  * @abstract Returns a given handler instance for specific protocol
  *
@@ -68,13 +106,13 @@
  * @discussion Injects main.js in app bundle as default JSFramework script.
  *
  **/
-+ (void)initSDKEnviroment;
++ (void)initSDKEnvironment;
 
 /**
  * @abstract Initializes the enviroment with a given JSFramework script.
  *
  **/
-+ (void)initSDKEnviroment:(NSString *)script;
++ (void)initSDKEnvironment:(NSString *)script;
 
 /**
  * @abstract Unloads the bridge context
@@ -124,3 +162,10 @@
 + (void)connectDevToolServer:(NSString *)URL;
 
 @end
+
+@interface WXSDKEngine (Deprecated)
+
++ (void)initSDKEnviroment DEPRECATED_MSG_ATTRIBUTE("To fix typo, use initSDKEnvironment method instead.");
++ (void)initSDKEnviroment:(NSString *)script DEPRECATED_MSG_ATTRIBUTE("To fix typo,  use initSDKEnvironment: method instead.");
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/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 43489de..a23e03e 100644
--- a/ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.m
+++ b/ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.m
@@ -10,11 +10,14 @@
 #import "WXModuleFactory.h"
 #import "WXHandlerFactory.h"
 #import "WXComponentFactory.h"
+#import "WXBridgeManager.h"
 
 #import "WXAppConfiguration.h"
-#import "WXNetworkDefaultImpl.h"
+#import "WXResourceRequestHandlerDefaultImpl.h"
 #import "WXNavigationDefaultImpl.h"
 #import "WXURLRewriteDefaultImpl.h"
+#import "WXWebSocketDefaultImpl.h"
+
 #import "WXSDKManager.h"
 #import "WXSDKError.h"
 #import "WXMonitor.h"
@@ -43,6 +46,8 @@
     [self registerModule:@"globalEvent" withClass:NSClassFromString(@"WXGlobalEventModule")];
     [self registerModule:@"canvas" withClass:NSClassFromString(@"WXCanvasModule")];
     [self registerModule:@"picker" withClass:NSClassFromString(@"WXPickerModule")];
+    [self registerModule:@"meta" withClass:NSClassFromString(@"WXMetaModule")];
+    [self registerModule:@"webSocket" withClass:NSClassFromString(@"WXWebSocketModule")];
 }
 
 + (void)registerModule:(NSString *)name withClass:(Class)clazz
@@ -114,14 +119,33 @@
     }
 }
 
+
+# pragma mark Service Register
++ (void)registerService:(NSString *)name withScript:(NSString *)serviceScript withOptions:(NSDictionary *)options
+{
+    [[WXSDKManager bridgeMgr] registerService:name withService:serviceScript withOptions:options];
+}
+
++ (void)registerService:(NSString *)name withScriptUrl:(NSURL *)serviceScriptUrl WithOptions:(NSDictionary *)options
+{
+    [[WXSDKManager bridgeMgr] registerService:name withServiceUrl:serviceScriptUrl withOptions:options];
+}
+
++ (void)unregisterService:(NSString *)name
+{
+    [[WXSDKManager bridgeMgr] unregisterService:name];
+}
+
 # pragma mark Handler Register
 
 // register some default handlers when the engine initializes.
 + (void)_registerDefaultHandlers
 {
-    [self registerHandler:[WXNetworkDefaultImpl new] withProtocol:@protocol(WXNetworkProtocol)];
+    [self registerHandler:[WXResourceRequestHandlerDefaultImpl new] withProtocol:@protocol(WXResourceRequestHandler)];
     [self registerHandler:[WXNavigationDefaultImpl new] withProtocol:@protocol(WXNavigationProtocol)];
     [self registerHandler:[WXURLRewriteDefaultImpl new] withProtocol:@protocol(WXURLRewriteProtocol)];
+    [self registerHandler:[WXWebSocketDefaultImpl new] withProtocol:@protocol(WXWebSocketHandler)];
+
 }
 
 + (void)registerHandler:(id)handler withProtocol:(Protocol *)protocol
@@ -140,14 +164,14 @@
 
 # pragma mark SDK Initialize
 
-+ (void)initSDKEnviroment
++ (void)initSDKEnvironment
 {
     WX_MONITOR_PERF_START(WXPTInitalize)
     WX_MONITOR_PERF_START(WXPTInitalizeSync)
     
     NSString *filePath = [[NSBundle mainBundle] pathForResource:@"main" ofType:@"js"];
     NSString *script = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
-    [WXSDKEngine initSDKEnviroment:script];
+    [WXSDKEngine initSDKEnvironment:script];
     
     WX_MONITOR_PERF_END(WXPTInitalizeSync)
     
@@ -177,20 +201,28 @@
 #endif
 }
 
-+ (void)initSDKEnviroment:(NSString *)script
++ (void)initSDKEnvironment:(NSString *)script
 {
     if (!script || script.length <= 0) {
         WX_MONITOR_FAIL(WXMTJSFramework, WX_ERR_JSFRAMEWORK_LOAD, @"framework loading is failure!");
         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;
@@ -279,3 +311,17 @@ static NSDictionary *_customEnvironment;
 }
 
 @end
+
+@implementation WXSDKEngine (Deprecated)
+
++ (void)initSDKEnviroment
+{
+    [self initSDKEnvironment];
+}
+
++ (void)initSDKEnviroment:(NSString *)script
+{
+    [self initSDKEnvironment:script];
+}
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.h b/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.h
index 160a222..a0d69c7 100644
--- a/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.h
+++ b/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.h
@@ -34,9 +34,10 @@ typedef NS_ENUM(int, WXSDKErrCode)
     WX_ERR_RENDER_SCROLLTOELEMENT = -2110,
     WX_ERR_RENDER_END = -2199,
     
-    WX_ERR_JSDOWNLOAD_START = -2201,
+    WX_ERR_DOWNLOAD_START = -2201,
     WX_ERR_JSBUNDLE_DOWNLOAD = -2202,
     WX_ERR_JSBUNDLE_STRING_CONVERT = -2203,
-    WX_ERR_JSDOWNLOAD_END = -2299,
+    WX_ERR_CANCEL = -2204,
+    WX_ERR_DOWNLOAD_END = -2299,
 };
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Events/WXComponent+Events.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Events/WXComponent+Events.m b/ios/sdk/WeexSDK/Sources/Events/WXComponent+Events.m
index 501d7e0..c29ab4c 100644
--- a/ios/sdk/WeexSDK/Sources/Events/WXComponent+Events.m
+++ b/ios/sdk/WeexSDK/Sources/Events/WXComponent+Events.m
@@ -10,11 +10,14 @@
 #import "WXComponent.h"
 #import "WXComponent_internal.h"
 #import "WXSDKInstance.h"
+#import "WXComponentManager.h"
 #import "WXAssert.h"
 #import "WXUtility.h"
 #import "WXSDKManager.h"
+#import "WXSDKInstance_private.h"
 #import <objc/runtime.h>
 #import <UIKit/UIGestureRecognizerSubclass.h>
+#import "WXComponent+PseudoClassManagement.h"
 
 #pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
 
@@ -71,6 +74,7 @@
 @property (nonatomic, assign) BOOL listenTouchMove;
 @property (nonatomic, assign) BOOL listenTouchEnd;
 @property (nonatomic, assign) BOOL listenTouchCancel;
+@property (nonatomic, assign) BOOL listenPseudoTouch;
 
 - (instancetype)initWithComponent:(WXComponent *)component NS_DESIGNATED_INITIALIZER;
 
@@ -122,12 +126,18 @@ if ([removeEventName isEqualToString:@#eventName]) {\
 
 - (void)_initEvents:(NSArray *)events
 {
-    NSArray *eventsCopy = [events copy];
-    for (NSString *addEventName in eventsCopy) {
+    for (NSString *addEventName in events) {
         [self _addEventOnMainThread:addEventName];
     }
 }
 
+- (void)_initPseudoEvents:(BOOL)isListenPseudoTouch
+{
+    if(isListenPseudoTouch) {
+        self.touchGesture.listenPseudoTouch = YES;
+    }
+}
+
 - (void)_addEventOnMainThread:(NSString *)addEventName
 {
     WX_ADD_EVENT(appear, addAppearEvent)
@@ -141,6 +151,9 @@ if ([removeEventName isEqualToString:@#eventName]) {\
     WX_ADD_EVENT(panmove, addPanMoveEvent)
     WX_ADD_EVENT(panend, addPanEndEvent)
     
+    WX_ADD_EVENT(horizontalpan, addHorizontalPanEvent)
+    WX_ADD_EVENT(verticalpan, addVerticalPanEvent)
+    
     WX_ADD_EVENT(touchstart, addTouchStartEvent)
     WX_ADD_EVENT(touchmove, addTouchMoveEvent)
     WX_ADD_EVENT(touchend, addTouchEndEvent)
@@ -162,11 +175,18 @@ if ([removeEventName isEqualToString:@#eventName]) {\
     WX_REMOVE_EVENT(panmove, removePanMoveEvent)
     WX_REMOVE_EVENT(panend, removePanEndEvent)
     
+    WX_REMOVE_EVENT(horizontalpan, removeHorizontalPanEvent)
+    WX_REMOVE_EVENT(verticalpan, removeVerticalPanEvent)
+    
     WX_REMOVE_EVENT(touchstart, removeTouchStartEvent)
     WX_REMOVE_EVENT(touchmove, removeTouchMoveEvent)
     WX_REMOVE_EVENT(touchend, removeTouchEndEvent)
     WX_REMOVE_EVENT(touchcancel, removeTouchCancelEvent)
     
+    if(_isListenPseudoTouch) {
+        self.touchGesture.listenPseudoTouch = NO;
+    }
+
     [self removeEvent:removeEventName];
 }
 
@@ -177,11 +197,16 @@ if ([removeEventName isEqualToString:@#eventName]) {\
     [self removePanStartEvent];
     [self removePanMoveEvent];
     [self removePanEndEvent];
+    [self removeHorizontalPanEvent];
+    [self removeVerticalPanEvent];
+    
     [self removeTouchStartEvent];
     [self removeTouchMoveEvent];
     [self removeTouchEndEvent];
     [self removeTouchCancelEvent];
     [self removeSwipeEvent];
+    [self removePseudoTouchEvent];
+
 }
 
 #pragma mark - Appear & Disappear
@@ -210,6 +235,12 @@ if ([removeEventName isEqualToString:@#eventName]) {\
     [self.ancestorScroller removeScrollToListener:self];
 }
 
+- (void)removePseudoTouchEvent
+{
+    _touchGesture.listenPseudoTouch = NO;
+    [self checkRemoveTouchGesture];
+}
+
 #pragma mark - Click Event
 
 - (void)addClickEvent
@@ -232,13 +263,14 @@ if ([removeEventName isEqualToString:@#eventName]) {\
 - (void)onClick:(__unused UITapGestureRecognizer *)recognizer
 {
     NSMutableDictionary *position = [[NSMutableDictionary alloc] initWithCapacity:4];
+    CGFloat scaleFactor = self.weexInstance.pixelScaleFactor;
     
     if (!CGRectEqualToRect(self.calculatedFrame, CGRectZero)) {
         CGRect frame = [self.view.superview convertRect:self.calculatedFrame toView:self.view.window];
-        position[@"x"] = @(frame.origin.x/WXScreenResizeRadio());
-        position[@"y"] = @(frame.origin.y/WXScreenResizeRadio());
-        position[@"width"] = @(frame.size.width/WXScreenResizeRadio());
-        position[@"height"] = @(frame.size.height/WXScreenResizeRadio());
+        position[@"x"] = @(frame.origin.x/scaleFactor);
+        position[@"y"] = @(frame.origin.y/scaleFactor);
+        position[@"width"] = @(frame.size.width/scaleFactor);
+        position[@"height"] = @(frame.size.height/scaleFactor);
     }
 
     [self fireEvent:@"click" params:@{@"position":position}];
@@ -357,7 +389,7 @@ if ([removeEventName isEqualToString:@#eventName]) {\
     }
 }
 
-#pragma makr - Pan
+#pragma mark - Pan
 
 - (void)addPanGesture
 {
@@ -386,22 +418,56 @@ if ([removeEventName isEqualToString:@#eventName]) {\
     [self addPanGesture];
 }
 
+- (void)addHorizontalPanEvent
+{
+    _listenHorizontalPan = YES;
+    [self addPanGesture];
+}
+
+- (void)addVerticalPanEvent
+{
+    _listenVerticalPan = YES;
+    [self addPanGesture];
+}
+
+
 - (void)onPan:(UIPanGestureRecognizer *)gesture
 {
     CGPoint screenLocation = [gesture locationInView:self.view.window];
     CGPoint pageLoacation = [gesture locationInView:self.weexInstance.rootView];
     NSString *eventName;
+    NSString *state = @"";
     NSDictionary *resultTouch = [self touchResultWithScreenLocation:screenLocation pageLocation:pageLoacation identifier:gesture.wx_identifier];
     
     if (gesture.state == UIGestureRecognizerStateBegan) {
-        eventName = @"panstart";
+        if (_listenPanStart) {
+            eventName = @"panstart";
+        }
+        state = @"start";
     } else if (gesture.state == UIGestureRecognizerStateEnded) {
-        eventName = @"panend";
+        if (_listenPanEnd) {
+            eventName = @"panend";
+        }
+        state = @"end";
         gesture.wx_identifier = nil;
     } else if (gesture.state == UIGestureRecognizerStateChanged) {
-        eventName = @"panmove";
+        if (_listenPanMove) {
+             eventName = @"panmove";
+        }
+        state = @"move";
     }
     
+    
+    CGPoint translation = [_panGesture translationInView:self.view];
+    
+    if (_listenHorizontalPan && fabs(translation.y) <= fabs(translation.x)) {
+        [self fireEvent:@"horizontalpan" params:@{@"state":state, @"changedTouches":resultTouch ? @[resultTouch] : @[]}];
+    }
+        
+    if (_listenVerticalPan && fabs(translation.y) > fabs(translation.x)) {
+        [self fireEvent:@"verticalpan" params:@{@"state":state, @"changedTouches":resultTouch ? @[resultTouch] : @[]}];
+    }
+        
     if (eventName) {
         [self fireEvent:eventName params:@{@"changedTouches":resultTouch ? @[resultTouch] : @[]}];
     }
@@ -425,9 +491,24 @@ if ([removeEventName isEqualToString:@#eventName]) {\
     [self checkRemovePanGesture];
 }
 
+- (void)removeHorizontalPanEvent
+{
+    _listenHorizontalPan = NO;
+    [self checkRemovePanGesture];
+}
+
+- (void)removeVerticalPanEvent
+{
+    _listenVerticalPan = NO;
+    [self checkRemovePanGesture];
+}
+
 - (void)checkRemovePanGesture
 {
-    if (_panGesture && !_listenPanStart && !_listenPanMove && !_listenPanEnd) {
+    if (_panGesture
+        && !_listenPanStart && !_listenPanMove && !_listenPanEnd
+        && !_listenHorizontalPan && !_listenVerticalPan
+        ) {
         _panGesture.delegate = nil;
         _panGesture = nil;
     }
@@ -492,7 +573,7 @@ if ([removeEventName isEqualToString:@#eventName]) {\
 
 - (void)checkRemoveTouchGesture
 {
-    if (_touchGesture && !_touchGesture.listenTouchStart && !_touchGesture.listenTouchMove && !_touchGesture.listenTouchEnd && !_touchGesture.listenTouchCancel) {
+    if (_touchGesture && !_touchGesture.listenTouchStart && !_touchGesture.listenTouchMove && !_touchGesture.listenTouchEnd && !_touchGesture.listenTouchCancel && !_touchGesture.listenPseudoTouch) {
         _touchGesture.delegate = nil;
         _touchGesture = nil;
     }
@@ -507,6 +588,12 @@ if ([removeEventName isEqualToString:@#eventName]) {\
 
 - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
 {
+    if (gestureRecognizer == _panGesture) {
+        CGPoint translation = [_panGesture translationInView:self.view];
+        if (_listenHorizontalPan && !_listenVerticalPan && fabs(translation.y) > fabs(translation.x)) {
+            return NO;
+        }
+    }
     return YES;
 }
 
@@ -525,13 +612,6 @@ if ([removeEventName isEqualToString:@#eventName]) {\
         return YES;
     }
     
-//#ifdef DEBUG
-//    if ([gestureRecognizer isKindOfClass:[WXDebugLongPressGestureRecognizer class]]
-//        || [otherGestureRecognizer isKindOfClass:[WXDebugLongPressGestureRecognizer class]]) {
-//        return YES;
-//    }
-//#endif
-    
     return NO;
 }
 
@@ -540,10 +620,11 @@ if ([removeEventName isEqualToString:@#eventName]) {\
 - (NSDictionary *)touchResultWithScreenLocation:(CGPoint)screenLocation pageLocation:(CGPoint)pageLocation identifier:(NSNumber *)identifier
 {
     NSMutableDictionary *resultTouch = [[NSMutableDictionary alloc] initWithCapacity:5];
-    resultTouch[@"screenX"] = @(screenLocation.x/WXScreenResizeRadio());
-    resultTouch[@"screenY"] = @(screenLocation.y/WXScreenResizeRadio());
-    resultTouch[@"pageX"] = @(pageLocation.x/WXScreenResizeRadio());
-    resultTouch[@"pageY"] = @(pageLocation.y/WXScreenResizeRadio());
+    CGFloat scaleFactor = self.weexInstance.pixelScaleFactor;
+    resultTouch[@"screenX"] = @(screenLocation.x/scaleFactor);
+    resultTouch[@"screenY"] = @(screenLocation.y/scaleFactor);
+    resultTouch[@"pageX"] = @(pageLocation.x/scaleFactor);
+    resultTouch[@"pageY"] = @(pageLocation.y/scaleFactor);
     resultTouch[@"identifier"] = identifier;
     
     return resultTouch;
@@ -585,6 +666,11 @@ if ([removeEventName isEqualToString:@#eventName]) {\
     if (_listenTouchStart) {
         [self fireTouchEvent:@"touchstart" withTouches:touches];
     }
+    if(_listenPseudoTouch) {
+        NSMutableDictionary *styles = [_component getPseudoClassStyles:@"active"];
+        [_component updatePseudoClassStyles:styles];
+    }
+
 }
 
 - (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
@@ -604,6 +690,10 @@ if ([removeEventName isEqualToString:@#eventName]) {\
     if (_listenTouchEnd) {
         [self fireTouchEvent:@"touchend" withTouches:touches];
     }
+    if(_listenPseudoTouch) {
+        [self recoveryPseudoStyles:_component.styles];
+    }
+
 }
 
 - (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
@@ -613,6 +703,9 @@ if ([removeEventName isEqualToString:@#eventName]) {\
     if (_listenTouchCancel) {
         [self fireTouchEvent:@"touchcancel" withTouches:touches];
     }
+    if(_listenPseudoTouch) {
+        [self recoveryPseudoStyles:_component.styles];
+    }
 }
 
 - (void)fireTouchEvent:(NSString *)eventName withTouches:(NSSet<UITouch *> *)touches
@@ -632,6 +725,11 @@ if ([removeEventName isEqualToString:@#eventName]) {\
     [_component fireEvent:eventName params:@{@"changedTouches":resultTouches ?: @[]}];
 }
 
+- (void)recoveryPseudoStyles:(NSDictionary *)styles
+{
+    [_component recoveryPseudoStyles:styles];
+}
+
 - (void)touchResponse:(UIGestureRecognizer *)gesture
 {
     

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Handler/WXNetworkDefaultImpl.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Handler/WXNetworkDefaultImpl.h b/ios/sdk/WeexSDK/Sources/Handler/WXNetworkDefaultImpl.h
deleted file mode 100644
index 3578dd5..0000000
--- a/ios/sdk/WeexSDK/Sources/Handler/WXNetworkDefaultImpl.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
- * Created by Weex.
- * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
- *
- * This source code is licensed under the Apache Licence 2.0.
- * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
- */
-
-#import <Foundation/Foundation.h>
-#import "WXNetworkProtocol.h"
-
-@interface WXNetworkDefaultImpl : NSObject <WXNetworkProtocol, NSURLSessionDelegate>
-
-@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Handler/WXNetworkDefaultImpl.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Handler/WXNetworkDefaultImpl.m b/ios/sdk/WeexSDK/Sources/Handler/WXNetworkDefaultImpl.m
deleted file mode 100644
index 55f9af5..0000000
--- a/ios/sdk/WeexSDK/Sources/Handler/WXNetworkDefaultImpl.m
+++ /dev/null
@@ -1,111 +0,0 @@
-/**
- * Created by Weex.
- * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
- *
- * This source code is licensed under the Apache Licence 2.0.
- * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
- */
-
-#import "WXNetworkDefaultImpl.h"
-#import "WXAppConfiguration.h"
-
-@interface WXNetworkCallbackInfo : NSObject
-
-@property (nonatomic, copy) void(^sendDataCallback)(int64_t, int64_t);
-@property (nonatomic, copy) void(^responseCallback)(NSURLResponse *);
-@property (nonatomic, copy) void(^receiveDataCallback)(NSData *);
-@property (nonatomic, strong) NSMutableData *data;
-@property (nonatomic, copy) void(^compeletionCallback)(NSData *, NSError *);
-
-@end
-
-@implementation WXNetworkCallbackInfo
-
-@end
-
-@implementation WXNetworkDefaultImpl
-{
-    NSMutableDictionary *_callbacks;
-    NSURLSession *_session;
-}
-
-- (id)sendRequest:(NSURLRequest *)request withSendingData:(void (^)(int64_t, int64_t))sendDataCallback
-                                             withResponse:(void (^)(NSURLResponse *))responseCallback
-                                          withReceiveData:(void (^)(NSData *))receiveDataCallback
-                                          withCompeletion:(void (^)(NSData *, NSError *))compeletionCallback
-{
-    WXNetworkCallbackInfo *info = [WXNetworkCallbackInfo new];
-    info.sendDataCallback = sendDataCallback;
-    info.responseCallback = responseCallback;
-    info.receiveDataCallback = receiveDataCallback;
-    info.compeletionCallback = compeletionCallback;
-    
-    if (!_session) {
-        NSURLSessionConfiguration *urlSessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
-        if ([WXAppConfiguration customizeProtocolClasses] && [WXAppConfiguration customizeProtocolClasses].count > 0) {
-            NSArray *defaultProtocols = urlSessionConfig.protocolClasses;
-            urlSessionConfig.protocolClasses = [[WXAppConfiguration customizeProtocolClasses] arrayByAddingObjectsFromArray:defaultProtocols];
-        }
-        _session = [NSURLSession sessionWithConfiguration:urlSessionConfig
-                                                 delegate:self
-                                            delegateQueue:[NSOperationQueue mainQueue]];
-    }
-    
-    NSURLSessionDataTask *task = [_session dataTaskWithRequest:request];
-    if (!_callbacks) {
-        _callbacks = [NSMutableDictionary dictionary];
-    }
-    [_callbacks setObject:info forKey:task];
-    [task resume];
-    
-    return task;
-}
-
-- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
-                                didSendBodyData:(int64_t)bytesSent
-                                 totalBytesSent:(int64_t)totalBytesSent
-                       totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend
-{
-    WXNetworkCallbackInfo *info = [_callbacks objectForKey:task];
-    if (info.sendDataCallback) {
-        info.sendDataCallback(totalBytesSent, totalBytesExpectedToSend);
-    }
-}
-
-- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)task
-                                 didReceiveResponse:(NSURLResponse *)response
-                                  completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
-{
-    WXNetworkCallbackInfo *info = [_callbacks objectForKey:task];
-    if (info.responseCallback) {
-        info.responseCallback(response);
-    }
-    completionHandler(NSURLSessionResponseAllow);
-}
-
-- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)task didReceiveData:(NSData *)data
-{
-    WXNetworkCallbackInfo *info = [_callbacks objectForKey:task];
-    if (info.receiveDataCallback) {
-        info.receiveDataCallback(data);
-    }
-    
-    NSMutableData *mutableData = info.data;
-    if (!mutableData) {
-        mutableData = [NSMutableData new];
-        info.data = mutableData;
-    }
-    
-    [mutableData appendData:data];
-}
-
-- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
-{
-    WXNetworkCallbackInfo *info = [_callbacks objectForKey:task];
-    if (info.compeletionCallback) {
-        info.compeletionCallback(info.data, error);
-    }
-    [_callbacks removeObjectForKey:task];
-}
-
-@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Layout/WXComponent+Layout.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Layout/WXComponent+Layout.m b/ios/sdk/WeexSDK/Sources/Layout/WXComponent+Layout.m
index 63542b2..e6cfaba 100644
--- a/ios/sdk/WeexSDK/Sources/Layout/WXComponent+Layout.m
+++ b/ios/sdk/WeexSDK/Sources/Layout/WXComponent+Layout.m
@@ -119,7 +119,8 @@
             strongSelf.view.frame = strongSelf.calculatedFrame;
             
             if (strongSelf->_transform) {
-                strongSelf.layer.transform = [[WXTransform new] getTransform:strongSelf->_transform withView:strongSelf.view withOrigin:strongSelf->_transformOrigin];
+                WXTransform *transform = [[WXTransform alloc] initWithInstance:strongSelf.weexInstance];
+                strongSelf.layer.transform = [transform getTransform:strongSelf->_transform withView:strongSelf.view withOrigin:strongSelf->_transformOrigin];
             }
             
             [strongSelf setNeedsDisplay];
@@ -199,23 +200,39 @@ do {\
     id value = styles[@#key];\
     if (value) {\
         typeof(_cssNode->style.cssProp) convertedValue = (typeof(_cssNode->style.cssProp))[WXConvert type:value];\
-        if([@"WXPixelType" isEqualToString:@#type] && isnan(convertedValue)) {\
+        _cssNode->style.cssProp = convertedValue;\
+        [self setNeedsLayout];\
+    }\
+} while(0);
+
+#define WX_STYLE_FILL_CSS_NODE_PIXEL(key, cssProp)\
+do {\
+    id value = styles[@#key];\
+    if (value) {\
+        CGFloat pixel = [self WXPixelType:value];\
+        if (isnan(pixel)) {\
             WXLogError(@"Invalid NaN value for style:%@, ref:%@", @#key, self.ref);\
-        } else { \
-            _cssNode->style.cssProp = convertedValue;\
+        } else {\
+            _cssNode->style.cssProp = pixel;\
             [self setNeedsLayout];\
-        } \
+        }\
     }\
 } while(0);
 
-#define WX_STYLE_FILL_CSS_NODE_ALL_DIRECTION(key, cssProp, type) \
+#define WX_STYLE_FILL_CSS_NODE_ALL_DIRECTION(key, cssProp)\
 do {\
-    WX_STYLE_FILL_CSS_NODE(key, cssProp[CSS_TOP], type)\
-    WX_STYLE_FILL_CSS_NODE(key, cssProp[CSS_LEFT], type)\
-    WX_STYLE_FILL_CSS_NODE(key, cssProp[CSS_RIGHT], type)\
-    WX_STYLE_FILL_CSS_NODE(key, cssProp[CSS_BOTTOM], type)\
+    WX_STYLE_FILL_CSS_NODE_PIXEL(key, cssProp[CSS_TOP])\
+    WX_STYLE_FILL_CSS_NODE_PIXEL(key, cssProp[CSS_LEFT])\
+    WX_STYLE_FILL_CSS_NODE_PIXEL(key, cssProp[CSS_RIGHT])\
+    WX_STYLE_FILL_CSS_NODE_PIXEL(key, cssProp[CSS_BOTTOM])\
 } while(0);
 
+
+- (CGFloat)WXPixelType:(id)value
+{
+    return [WXConvert WXPixelType:value scaleFactor:self.weexInstance.pixelScaleFactor];
+}
+
 - (void)_fillCSSNode:(NSDictionary *)styles;
 {
     // flex
@@ -228,39 +245,39 @@ do {\
     
     // position
     WX_STYLE_FILL_CSS_NODE(position, position_type, css_position_type_t)
-    WX_STYLE_FILL_CSS_NODE(top, position[CSS_TOP], WXPixelType)
-    WX_STYLE_FILL_CSS_NODE(left, position[CSS_LEFT], WXPixelType)
-    WX_STYLE_FILL_CSS_NODE(right, position[CSS_RIGHT], WXPixelType)
-    WX_STYLE_FILL_CSS_NODE(bottom, position[CSS_BOTTOM], WXPixelType)
+    WX_STYLE_FILL_CSS_NODE_PIXEL(top, position[CSS_TOP])
+    WX_STYLE_FILL_CSS_NODE_PIXEL(left, position[CSS_LEFT])
+    WX_STYLE_FILL_CSS_NODE_PIXEL(right, position[CSS_RIGHT])
+    WX_STYLE_FILL_CSS_NODE_PIXEL(bottom, position[CSS_BOTTOM])
     
     // dimension
-    WX_STYLE_FILL_CSS_NODE(width, dimensions[CSS_WIDTH], WXPixelType)
-    WX_STYLE_FILL_CSS_NODE(height, dimensions[CSS_HEIGHT], WXPixelType)
-    WX_STYLE_FILL_CSS_NODE(minWidth, minDimensions[CSS_WIDTH], WXPixelType)
-    WX_STYLE_FILL_CSS_NODE(minHeight, minDimensions[CSS_HEIGHT], WXPixelType)
-    WX_STYLE_FILL_CSS_NODE(maxWidth, maxDimensions[CSS_WIDTH], WXPixelType)
-    WX_STYLE_FILL_CSS_NODE(maxHeight, maxDimensions[CSS_HEIGHT], WXPixelType)
+    WX_STYLE_FILL_CSS_NODE_PIXEL(width, dimensions[CSS_WIDTH])
+    WX_STYLE_FILL_CSS_NODE_PIXEL(height, dimensions[CSS_HEIGHT])
+    WX_STYLE_FILL_CSS_NODE_PIXEL(minWidth, minDimensions[CSS_WIDTH])
+    WX_STYLE_FILL_CSS_NODE_PIXEL(minHeight, minDimensions[CSS_HEIGHT])
+    WX_STYLE_FILL_CSS_NODE_PIXEL(maxWidth, maxDimensions[CSS_WIDTH])
+    WX_STYLE_FILL_CSS_NODE_PIXEL(maxHeight, maxDimensions[CSS_HEIGHT])
     
     // margin
-    WX_STYLE_FILL_CSS_NODE_ALL_DIRECTION(margin, margin, WXPixelType)
-    WX_STYLE_FILL_CSS_NODE(marginTop, margin[CSS_TOP], WXPixelType)
-    WX_STYLE_FILL_CSS_NODE(marginLeft, margin[CSS_LEFT], WXPixelType)
-    WX_STYLE_FILL_CSS_NODE(marginRight, margin[CSS_RIGHT], WXPixelType)
-    WX_STYLE_FILL_CSS_NODE(marginBottom, margin[CSS_BOTTOM], WXPixelType)
+    WX_STYLE_FILL_CSS_NODE_ALL_DIRECTION(margin, margin)
+    WX_STYLE_FILL_CSS_NODE_PIXEL(marginTop, margin[CSS_TOP])
+    WX_STYLE_FILL_CSS_NODE_PIXEL(marginLeft, margin[CSS_LEFT])
+    WX_STYLE_FILL_CSS_NODE_PIXEL(marginRight, margin[CSS_RIGHT])
+    WX_STYLE_FILL_CSS_NODE_PIXEL(marginBottom, margin[CSS_BOTTOM])
     
     // border
-    WX_STYLE_FILL_CSS_NODE_ALL_DIRECTION(borderWidth, border, WXPixelType)
-    WX_STYLE_FILL_CSS_NODE(borderTopWidth, border[CSS_TOP], WXPixelType)
-    WX_STYLE_FILL_CSS_NODE(borderLeftWidth, border[CSS_LEFT], WXPixelType)
-    WX_STYLE_FILL_CSS_NODE(borderRightWidth, border[CSS_RIGHT], WXPixelType)
-    WX_STYLE_FILL_CSS_NODE(borderBottomWidth, border[CSS_BOTTOM], WXPixelType)
+    WX_STYLE_FILL_CSS_NODE_ALL_DIRECTION(borderWidth, border)
+    WX_STYLE_FILL_CSS_NODE_PIXEL(borderTopWidth, border[CSS_TOP])
+    WX_STYLE_FILL_CSS_NODE_PIXEL(borderLeftWidth, border[CSS_LEFT])
+    WX_STYLE_FILL_CSS_NODE_PIXEL(borderRightWidth, border[CSS_RIGHT])
+    WX_STYLE_FILL_CSS_NODE_PIXEL(borderBottomWidth, border[CSS_BOTTOM])
     
     // padding
-    WX_STYLE_FILL_CSS_NODE_ALL_DIRECTION(padding, padding, WXPixelType)
-    WX_STYLE_FILL_CSS_NODE(paddingTop, padding[CSS_TOP], WXPixelType)
-    WX_STYLE_FILL_CSS_NODE(paddingLeft, padding[CSS_LEFT], WXPixelType)
-    WX_STYLE_FILL_CSS_NODE(paddingRight, padding[CSS_RIGHT], WXPixelType)
-    WX_STYLE_FILL_CSS_NODE(paddingBottom, padding[CSS_BOTTOM], WXPixelType)
+    WX_STYLE_FILL_CSS_NODE_ALL_DIRECTION(padding, padding)
+    WX_STYLE_FILL_CSS_NODE_PIXEL(paddingTop, padding[CSS_TOP])
+    WX_STYLE_FILL_CSS_NODE_PIXEL(paddingLeft, padding[CSS_LEFT])
+    WX_STYLE_FILL_CSS_NODE_PIXEL(paddingRight, padding[CSS_RIGHT])
+    WX_STYLE_FILL_CSS_NODE_PIXEL(paddingBottom, padding[CSS_BOTTOM])
 }
 
 #define WX_STYLE_RESET_CSS_NODE(key, cssProp, defaultValue)\

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Loader/WXResourceLoader.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Loader/WXResourceLoader.h b/ios/sdk/WeexSDK/Sources/Loader/WXResourceLoader.h
new file mode 100644
index 0000000..8b77a2c
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Loader/WXResourceLoader.h
@@ -0,0 +1,30 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+
+#import <Foundation/Foundation.h>
+#import "WXResourceRequest.h"
+#import "WXResourceResponse.h"
+
+
+@interface WXResourceLoader : NSObject
+
+@property (nonatomic, strong) WXResourceRequest *request;
+
+@property (nonatomic, copy) void (^onDataSent)(unsigned long long /* bytesSent */, unsigned long long /* totalBytesToBeSent */);
+@property (nonatomic, copy) void (^onResponseReceived)(const WXResourceResponse *);
+@property (nonatomic, copy) void (^onDataReceived)(NSData *);
+@property (nonatomic, copy) void (^onFinished)(const WXResourceResponse *, NSData *);
+@property (nonatomic, copy) void (^onFailed)(NSError *);
+
+- (instancetype)initWithRequest:(WXResourceRequest *)request;
+
+- (void)start;
+
+- (void)cancel:(NSError **)error;
+
+@end


[42/50] [abbrv] incubator-weex git commit: * [ios] update format

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


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

Branch: refs/heads/master
Commit: 6289eedbc38f297c175ca48ba78d12a995c3b9aa
Parents: 7e579b9
Author: acton393 <zh...@gmail.com>
Authored: Fri Feb 17 11:42:42 2017 +0800
Committer: acton393 <zh...@gmail.com>
Committed: Fri Feb 17 11:42:42 2017 +0800

----------------------------------------------------------------------
 .../cn/references/advanced/extend-to-ios.md     | 21 ++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/6289eedb/doc/source/cn/references/advanced/extend-to-ios.md
----------------------------------------------------------------------
diff --git a/doc/source/cn/references/advanced/extend-to-ios.md b/doc/source/cn/references/advanced/extend-to-ios.md
index 7fe5601..d293487 100644
--- a/doc/source/cn/references/advanced/extend-to-ios.md
+++ b/doc/source/cn/references/advanced/extend-to-ios.md
@@ -254,23 +254,24 @@ return [[WXImageView alloc] init];
 	 
 	 - (void)focus
 	   {
-	   		NSLog(@"you got it");
+          NSLog(@"you got it");
 	   }
 	 @end
 	 ```
 	
-	- \u6ce8\u518c\u7ec4\u4ef6 `[WXSDKEngine registerComponent:@"mycomponent" withClass:[WXMyComponent class]] `
+	- \u6ce8\u518c\u7ec4\u4ef6 `[WXSDKEngine registerComponent:@"mycomponent" withClass:[WXMyComponent class]]`
+
 	- \u5728weex \u6587\u4ef6\u4e2d\u8c03\u7528
 
-		```
-		<template>
-	     		<mycomponent id='mycomponent'></mycomponent>
+      ```
+        <template>
+          <mycomponent id='mycomponent'></mycomponent>
 	 	</template>
 		<script>
-		   module.exports = {
-		    	created: function() {
-		    		this.$el('mycomponent').focus();
+          module.exports = {
+            created:function() {
+                      this.$el('mycomponent').focus();
 		    		}
-		   }
+          }
 		</script>
- 		``` 
\ No newline at end of file
+      ``` 


[47/50] [abbrv] incubator-weex git commit: Merge pull request #2604 from cxfeng1/dev

Posted by ji...@apache.org.
Merge pull request #2604 from cxfeng1/dev

+ [doc]  Adding docs for 0.10.0 features.

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

Branch: refs/heads/master
Commit: 1b79066541c5b05c944e64c23c0592297c1712e7
Parents: dd44ab5 54489e4
Author: \u52fe\u4e09\u80a1\u56db <zh...@me.com>
Authored: Fri Feb 17 13:53:05 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Fri Feb 17 13:53:05 2017 +0800

----------------------------------------------------------------------
 doc/source/references/advanced/extend-to-ios.md | 36 +++++++++++---------
 doc/source/references/components/cell.md        |  6 ++--
 doc/source/references/gesture.md                |  9 +++--
 3 files changed, 29 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1b790665/doc/source/references/advanced/extend-to-ios.md
----------------------------------------------------------------------


[40/50] [abbrv] incubator-weex git commit: * [ios] update jsfrm version to support strict mode.

Posted by ji...@apache.org.
* [ios] update jsfrm version to support strict mode.


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

Branch: refs/heads/master
Commit: bcba010b4edf412b1dd07facbf57ff321cb8ebea
Parents: 5d7cacf
Author: boboning <ni...@163.com>
Authored: Fri Feb 17 10:52:44 2017 +0800
Committer: boboning <ni...@163.com>
Committed: Fri Feb 17 10:52:44 2017 +0800

----------------------------------------------------------------------
 ios/sdk/WeexSDK/Resources/main.js | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)
----------------------------------------------------------------------



[10/50] [abbrv] incubator-weex git commit: V0.10.0 stable gitlab (#178)

Posted by ji...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/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 f0e605e..8fcf3bb 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
+++ b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
@@ -22,20 +22,37 @@
 #import "WXView.h"
 #import "WXRootView.h"
 #import "WXThreadSafeMutableDictionary.h"
+#import "WXResourceRequest.h"
+#import "WXResourceResponse.h"
+#import "WXResourceLoader.h"
+#import "WXSDKEngine.h"
 
 NSString *const bundleUrlOptionKey = @"bundleUrl";
 
 NSTimeInterval JSLibInitTime = 0;
 
+typedef enum : NSUInteger {
+    WXLoadTypeNormal,
+    WXLoadTypeBack,
+    WXLoadTypeForward,
+    WXLoadTypeReload,
+    WXLoadTypeReplace
+} WXLoadType;
+
 @implementation WXSDKInstance
 {
-    id<WXNetworkProtocol> _networkHandler;
+    NSDictionary *_options;
+    id _jsData;
+    
+    WXResourceLoader *_mainBundleLoader;
     WXComponentManager *_componentManager;
     WXRootView *_rootView;
+    WXThreadSafeMutableDictionary *_moduleEventObservers;
 }
 
-- (void) dealloc
+- (void)dealloc
 {
+    [_moduleEventObservers removeAllObjects];
     [self removeObservers];
     [[NSNotificationCenter defaultCenter] removeObserver:self];
 }
@@ -61,12 +78,19 @@ NSTimeInterval JSLibInitTime = 0;
         _moduleInstances = [NSMutableDictionary new];
         _styleConfigs = [NSMutableDictionary new];
         _attrConfigs = [NSMutableDictionary new];
+        _moduleEventObservers = [WXThreadSafeMutableDictionary new];
+        _trackComponent = NO;
        
         [self addObservers];
     }
     return self;
 }
 
+- (NSString *)description
+{
+    return [NSString stringWithFormat:@"<%@: %p; id = %@; rootView = %@; url= %@>", NSStringFromClass([self class]), self, _instanceId, _rootView, _scriptURL];
+}
+
 #pragma mark Public Mehtods
 
 - (UIView *)rootView
@@ -74,6 +98,22 @@ NSTimeInterval JSLibInitTime = 0;
     return _rootView;
 }
 
+
+- (void)setFrame:(CGRect)frame
+{
+    if (!CGRectEqualToRect(frame, _frame)) {
+        _frame = frame;
+        WXPerformBlockOnMainThread(^{
+            if (_rootView) {
+                _rootView.frame = frame;
+                WXPerformBlockOnComponentThread(^{
+                    [self.componentManager rootViewFrameDidChange:frame];
+                });
+            }
+        });
+    }
+}
+
 - (void)renderWithURL:(NSURL *)url
 {
     [self renderWithURL:url options:nil data:nil];
@@ -86,100 +126,22 @@ NSTimeInterval JSLibInitTime = 0;
         return;
     }
     
-    _scriptURL = url;
-    NSMutableDictionary *newOptions = [options mutableCopy];
-    if (!newOptions) {
-        newOptions = [[NSMutableDictionary alloc] init];
-    }
-    if (!newOptions[bundleUrlOptionKey]) {
-        newOptions[bundleUrlOptionKey] = url.absoluteString;
-    }
-    if ([newOptions[bundleUrlOptionKey] isKindOfClass:[NSURL class]]) {
-        newOptions[bundleUrlOptionKey] = ((NSURL*)newOptions[bundleUrlOptionKey]).absoluteString;
-    }
-    
-    if (!self.pageName || [self.pageName isEqualToString:@""]) {
-        self.pageName = [WXUtility urlByDeletingParameters:url].absoluteString ? : @"";
-    }
-    
-    __weak typeof(self) weakSelf = self;
-    if ([url isFileURL]) {
-        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
-            NSString *path = [url path];
-            NSData *scriptData = [[NSFileManager defaultManager] contentsAtPath:path];
-            NSString *script = [[NSString alloc] initWithData:scriptData encoding:NSUTF8StringEncoding];
-            if (!script || script.length <= 0) {
-                NSString *errorDesc = [NSString stringWithFormat:@"File read error at url: %@", url];
-                WXLogError(@"%@", errorDesc);
-                if (weakSelf.onFailed) {
-                    weakSelf.onFailed([NSError errorWithDomain:WX_ERROR_DOMAIN code:0 userInfo:@{NSLocalizedDescriptionKey: errorDesc}]);
-                }
-                return;
-            }
-            [weakSelf renderView:script options:newOptions data:data];
-        });
-    } else {
-        WX_MONITOR_INSTANCE_PERF_START(WXPTJSDownload, self);
-        
-        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
-        [request setValue:[WXUtility userAgent] forHTTPHeaderField:@"User-Agent"];
-        [request setValue:@"weex" forHTTPHeaderField:@"f-refer"];
-        
-        id<WXNetworkProtocol> networkHandler = [self networkHandler];
-        
-        __block NSURLResponse *urlResponse;
-        [networkHandler sendRequest:request
-                   withSendingData:^(int64_t bytesSent, int64_t totalBytes) {}
-                      withResponse:^(NSURLResponse *response) {
-                          urlResponse = response;
-                      }
-                   withReceiveData:^(NSData *data) {}
-                   withCompeletion:^(NSData *totalData, NSError *error) {
-            //TODO 304
-            if (!error && [urlResponse isKindOfClass:[NSHTTPURLResponse class]] && ((NSHTTPURLResponse *)urlResponse).statusCode != 200) {
-                error = [NSError errorWithDomain:WX_ERROR_DOMAIN
-                                            code:((NSHTTPURLResponse *)urlResponse).statusCode
-                                        userInfo:@{@"message":@"status code error."}];
-            }
-            
-            if (error) {
-                NSString *errorMessage = [NSString stringWithFormat:@"Connection to %@ occurs an error:%@", request.URL, error.localizedDescription];
-                WX_MONITOR_FAIL_ON_PAGE(WXMTJSDownload, WX_ERR_JSBUNDLE_DOWNLOAD, errorMessage, weakSelf.pageName);
-                
-                if (weakSelf.onFailed) {
-                    weakSelf.onFailed(error);
-                }
-                return;
-            }
-                       
-            if (!totalData) {
-                NSString *errorMessage = [NSString stringWithFormat:@"Connection to %@ but no data return", request.URL];
-                WX_MONITOR_FAIL_ON_PAGE(WXMTJSDownload, WX_ERR_JSBUNDLE_DOWNLOAD, errorMessage, weakSelf.pageName);
-                
-                if (weakSelf.onFailed) {
-                    weakSelf.onFailed(error);
-                }
-                return;
-            }
-                       
-            NSString *script = [[NSString alloc] initWithData:totalData encoding:NSUTF8StringEncoding];
-            if (!script) {
-                WX_MONITOR_FAIL_ON_PAGE(WXMTJSDownload, WX_ERR_JSBUNDLE_STRING_CONVERT, @"data converting to string failed.", weakSelf.pageName)
-                return;
-            }
-            
-            WX_MONITOR_SUCCESS_ON_PAGE(WXMTJSDownload, weakSelf.pageName);
-            WX_MONITOR_INSTANCE_PERF_END(WXPTJSDownload, weakSelf);
-
-            [weakSelf renderView:script options:newOptions data:data];
-        }];
-    }
+    WXResourceRequest *request = [WXResourceRequest requestWithURL:url resourceType:WXResourceTypeMainBundle referrer:@"" cachePolicy:NSURLRequestUseProtocolCachePolicy];
+    [self _renderWithRequest:request options:options data:data];
 }
 
 - (void)renderView:(NSString *)source options:(NSDictionary *)options data:(id)data
 {
-    WXLogDebug(@"Render view: %@, data:%@", self, [WXUtility JSONString:data]);
+    WXLogDebug(@"Render source: %@, data:%@", self, [WXUtility JSONString:data]);
+    
+    _options = options;
+    _jsData = data;
     
+    [self _renderWithMainBundleString:source];
+}
+
+- (void)_renderWithMainBundleString:(NSString *)mainBundleString
+{
     if (!self.instanceId) {
         WXLogError(@"Fail to find instance\uff01");
         return;
@@ -194,13 +156,13 @@ NSTimeInterval JSLibInitTime = 0;
     WX_MONITOR_INSTANCE_PERF_START(WXPTFirstScreenRender, self);
     WX_MONITOR_INSTANCE_PERF_START(WXPTAllRender, self);
     
-    NSMutableDictionary *dictionary = [options mutableCopy];
+    NSMutableDictionary *dictionary = [_options mutableCopy];
     if ([WXLog logLevel] >= WXLogLevelLog) {
         dictionary[@"debug"] = @(YES);
     }
     
     if ([WXDebugTool getReplacedBundleJS]) {
-        source = [WXDebugTool getReplacedBundleJS];
+        mainBundleString = [WXDebugTool getReplacedBundleJS];
     }
     
     //TODO WXRootView
@@ -211,30 +173,100 @@ NSTimeInterval JSLibInitTime = 0;
             self.onCreate(_rootView);
         }
     });
-
-    [[WXSDKManager bridgeMgr] createInstance:self.instanceId template:source options:dictionary data:data];
-
-    WX_MONITOR_PERF_SET(WXPTBundleSize, [source lengthOfBytesUsingEncoding:NSUTF8StringEncoding], self);
+    
+    // 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);
 }
 
-- (void)setFrame:(CGRect)frame
+
+- (void)_renderWithRequest:(WXResourceRequest *)request options:(NSDictionary *)options data:(id)data;
 {
-    if (!CGRectEqualToRect(frame, _frame)) {
-        _frame = frame;
-        WXPerformBlockOnMainThread(^{
-            if (_rootView) {
-                _rootView.frame = frame;
-                WXPerformBlockOnComponentThread(^{
-                    [self.componentManager rootViewFrameDidChange:frame];
-                });
-            }
-        });
+    NSURL *url = request.URL;
+    _scriptURL = url;
+    _options = options;
+    _jsData = data;
+    NSMutableDictionary *newOptions = [options mutableCopy] ?: [NSMutableDictionary new];
+    
+    if (!newOptions[bundleUrlOptionKey]) {
+        newOptions[bundleUrlOptionKey] = url.absoluteString;
     }
+    // compatible with some wrong type, remove this hopefully in the future.
+    if ([newOptions[bundleUrlOptionKey] isKindOfClass:[NSURL class]]) {
+        WXLogWarning(@"Error type in options with key:bundleUrl, should be of type NSString, not NSURL!");
+        newOptions[bundleUrlOptionKey] = ((NSURL*)newOptions[bundleUrlOptionKey]).absoluteString;
+    }
+    
+    if (!self.pageName || [self.pageName isEqualToString:@""]) {
+        self.pageName = [WXUtility urlByDeletingParameters:url].absoluteString ? : @"";
+    }
+    
+    request.userAgent = [WXUtility userAgent];
+    
+    WX_MONITOR_INSTANCE_PERF_START(WXPTJSDownload, self);
+    __weak typeof(self) weakSelf = self;
+    _mainBundleLoader = [[WXResourceLoader alloc] initWithRequest:request];;
+    _mainBundleLoader.onFinished = ^(WXResourceResponse *response, NSData *data) {
+        __strong typeof(weakSelf) strongSelf = weakSelf;
+        
+        if ([response isKindOfClass:[NSHTTPURLResponse class]] && ((NSHTTPURLResponse *)response).statusCode != 200) {
+            NSError *error = [NSError errorWithDomain:WX_ERROR_DOMAIN
+                                        code:((NSHTTPURLResponse *)response).statusCode
+                                    userInfo:@{@"message":@"status code error."}];
+            if (strongSelf.onFailed) {
+                strongSelf.onFailed(error);
+            }
+            return ;
+        }
+
+        if (!data) {
+            NSString *errorMessage = [NSString stringWithFormat:@"Request to %@ With no data return", request.URL];
+            WX_MONITOR_FAIL_ON_PAGE(WXMTJSDownload, WX_ERR_JSBUNDLE_DOWNLOAD, errorMessage, strongSelf.pageName);
+
+            if (strongSelf.onFailed) {
+                strongSelf.onFailed(error);
+            }
+            return;
+        }
+        
+        NSString *jsBundleString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+        if (!jsBundleString) {
+            WX_MONITOR_FAIL_ON_PAGE(WXMTJSDownload, WX_ERR_JSBUNDLE_STRING_CONVERT, @"data converting to string failed.", strongSelf.pageName)
+            return;
+        }
+
+        WX_MONITOR_SUCCESS_ON_PAGE(WXMTJSDownload, strongSelf.pageName);
+        WX_MONITOR_INSTANCE_PERF_END(WXPTJSDownload, strongSelf);
+
+        [strongSelf _renderWithMainBundleString:jsBundleString];
+    };
+    
+    _mainBundleLoader.onFailed = ^(NSError *loadError) {
+        NSString *errorMessage = [NSString stringWithFormat:@"Request to %@ occurs an error:%@", request.URL, loadError.localizedDescription];
+        WX_MONITOR_FAIL_ON_PAGE(WXMTJSDownload, WX_ERR_JSBUNDLE_DOWNLOAD, errorMessage, weakSelf.pageName);
+        
+        if (weakSelf.onFailed) {
+            weakSelf.onFailed(loadError);
+        }
+    };
+    
+    [_mainBundleLoader start];
 }
 
-- (void)reloadData:(id)data
+- (void)reload:(BOOL)forcedReload
 {
-    [self refreshInstance:data];
+    // TODO: [self unload]
+    if (!_scriptURL) {
+        WXLogError(@"No script URL found while reloading!");
+        return;
+    }
+    
+    NSURLRequestCachePolicy cachePolicy = forcedReload ? NSURLRequestReloadIgnoringCacheData : NSURLRequestUseProtocolCachePolicy;
+    WXResourceRequest *request = [WXResourceRequest requestWithURL:_scriptURL resourceType:WXResourceTypeMainBundle referrer:_scriptURL.absoluteString cachePolicy:cachePolicy];
+    [self _renderWithRequest:request options:_options data:_jsData];
 }
 
 - (void)refreshInstance:(id)data
@@ -279,7 +311,7 @@ NSTimeInterval JSLibInitTime = 0;
     [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
@@ -312,16 +344,6 @@ NSTimeInterval JSLibInitTime = 0;
     return [_componentManager numberOfComponents];
 }
 
-- (void)finishPerformance
-{
-    //deperacated
-}
-
-- (void)creatFinish
-{
-    
-}
-
 - (void)fireGlobalEvent:(NSString *)eventName params:(NSDictionary *)params
 {
     if (!params){
@@ -334,6 +356,26 @@ NSTimeInterval JSLibInitTime = 0;
     [[NSNotificationCenter defaultCenter] postNotificationName:eventName object:self userInfo:userInfo];
 }
 
+- (void)fireModuleEvent:(Class)module eventName:(NSString *)eventName params:(NSDictionary*)params
+{
+    NSDictionary * userInfo = @{
+                                @"moduleId":NSStringFromClass(module)?:@"",
+                                @"param":params?:@{},
+                                @"eventName":eventName
+                                };
+    
+    [[NSNotificationCenter defaultCenter] postNotificationName:WX_MODULE_EVENT_FIRE_NOTIFICATION object:self userInfo:userInfo];
+}
+
+- (CGFloat)pixelScaleFactor
+{
+    if (self.viewportWidth > 0) {
+        return [WXUtility portraitScreenSize].width / self.viewportWidth;
+    } else {
+        return [WXUtility defaultPixelScaleFactor];
+    }
+}
+
 - (NSURL *)completeURL:(NSString *)url
 {
     if (!_scriptURL) {
@@ -349,10 +391,107 @@ NSTimeInterval JSLibInitTime = 0;
     return [NSURL URLWithString:url relativeToURL:_scriptURL];
 }
 
+- (BOOL)checkModuleEventRegistered:(NSString*)event moduleClassName:(NSString*)moduleClassName
+{
+    NSDictionary * observer = [_moduleEventObservers objectForKey:moduleClassName];
+    return observer && observer[event]? YES:NO;
+}
+
 #pragma mark Private Methods
 
+- (void)_addModuleEventObserversWithModuleMethod:(WXModuleMethod *)method
+{
+    if ([method.arguments count] < 2) {
+        WXLogError(@"please check your method parameter!!");
+        return;
+    }
+    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 = [method.arguments mutableCopy];
+    if ([methodArguments count] == 2) {
+        [methodArguments addObject:@{@"once": @false}];
+    }
+    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:NSStringFromClass(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),@"moduleName":moduleName};
+    if(![self checkModuleEventRegistered:event moduleClassName:moduleClassName]) {
+        //had not registered yet
+        observer = [NSMutableDictionary new];
+        [observer setObject:[@{event:[@[callbackInfo] mutableCopy]} mutableCopy] forKey:moduleClassName];
+        [_moduleEventObservers addEntriesFromDictionary:observer];
+    } else {
+        observer = _moduleEventObservers[moduleClassName];
+        [[observer objectForKey:event] addObject:callbackInfo];
+    }
+}
+
+- (void)_removeModuleEventObserverWithModuleMethod:(WXModuleMethod *)method
+{
+    if (![method.arguments count] && [method.arguments[0] isKindOfClass:[NSString class]]) {
+        return;
+    }
+    Class moduleClass =  [WXModuleFactory classWithModuleName:method.moduleName];
+    [self removeModuleEventObserver:method.arguments[0] moduleClassName:NSStringFromClass(moduleClass)];
+}
+
+- (void)removeModuleEventObserver:(NSString*)event moduleClassName:(NSString*)moduleClassName
+{
+    if (![self checkModuleEventRegistered:event moduleClassName:moduleClassName]) {
+        return;
+    }
+    [_moduleEventObservers[moduleClassName] removeObjectForKey:event];
+}
+
+- (void)moduleEventNotification:(NSNotification *)notification
+{
+    NSMutableDictionary *moduleEventObserversCpy = (NSMutableDictionary *)CFBridgingRelease(CFPropertyListCreateDeepCopy(kCFAllocatorDefault, (CFDictionaryRef)_moduleEventObservers, kCFPropertyListMutableContainers));// deep
+    NSDictionary * userInfo = notification.userInfo;
+    NSMutableArray * listeners = [moduleEventObserversCpy[userInfo[@"moduleId"]] objectForKey:userInfo[@"eventName"]];
+    if (![listeners isKindOfClass:[NSArray class]]) {
+        return;
+        // something wrong
+    }
+    for (int i = 0;i < [listeners count]; i ++) {
+        NSDictionary * callbackInfo = listeners[i];
+        NSString *callbackId = callbackInfo[@"callbackId"];
+        BOOL once = [callbackInfo[@"once"] boolValue];
+        NSDictionary * 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"]];
+            [moduleEventListener removeObject:callbackInfo];
+            if ([moduleEventListener count] == 0) {
+                [self removeModuleEventObserver:userInfo[@"eventName"] moduleClassName:userInfo[@"moduleId"]];
+            }
+            // if callback function is once. clear it after fire it.
+        }
+    }
+}
+
 - (void)addObservers
 {
+    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moduleEventNotification:) name:WX_MODULE_EVENT_FIRE_NOTIFICATION object:nil];
+    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:nil];
+    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive:) name:UIApplicationDidBecomeActiveNotification object:nil];
     [self addObserver:self forKeyPath:@"state" options:NSKeyValueObservingOptionNew context:nil];
 }
 
@@ -361,6 +500,16 @@ NSTimeInterval JSLibInitTime = 0;
     [self removeObserver:self forKeyPath:@"state"];
 }
 
+- (void)applicationWillResignActive:(NSNotification*)notification
+{
+    [self fireGlobalEvent:WX_APPLICATION_WILL_RESIGN_ACTIVE params:nil];
+}
+
+- (void)applicationDidBecomeActive:(NSNotification*)notification
+{
+    [self fireGlobalEvent:WX_APPLICATION_DID_BECOME_ACTIVE params:nil];
+}
+
 - (WXComponentManager *)componentManager
 {
     if (!_componentManager) {
@@ -370,15 +519,6 @@ NSTimeInterval JSLibInitTime = 0;
     return _componentManager;
 }
 
-- (id<WXNetworkProtocol>)networkHandler
-{
-    if (!_networkHandler) {
-        _networkHandler = [WXHandlerFactory handlerForProtocol:@protocol(WXNetworkProtocol)];
-    }
-    
-    return _networkHandler;
-}
-
 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
 {
     if ([keyPath isEqualToString:@"state"]) {
@@ -392,3 +532,24 @@ NSTimeInterval JSLibInitTime = 0;
 }
 
 @end
+
+@implementation WXSDKInstance (Deprecated)
+
+# pragma mark - Deprecated
+
+- (void)reloadData:(id)data
+{
+    [self refreshInstance:data];
+}
+
+- (void)finishPerformance
+{
+    //deperacated
+}
+
+- (void)creatFinish
+{
+    
+}
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/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 3ec3059..0bddbf9 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance_private.h
+++ b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance_private.h
@@ -9,9 +9,12 @@
 #import <Foundation/Foundation.h>
 #import "WXSDKInstance.h"
 #import "WXComponentManager.h"
+#import "WXModuleMethod.h"
 
 @interface WXSDKInstance ()
 
+@property (nonatomic, assign) CGFloat viewportWidth;
+
 @property (nonatomic, strong) NSMutableDictionary *moduleInstances;
 @property (nonatomic, strong) NSMutableDictionary *naviBarStyles;
 @property (nonatomic, strong) NSMutableDictionary *styleConfigs;
@@ -19,4 +22,9 @@
 
 @property (nonatomic, readonly, strong) WXComponentManager *componentManager;
 
+- (void)addModuleEventObservers:(NSString*)event callback:(NSString*)callbackId option:(NSDictionary*)option moduleClassName:(NSString*)moduleClassName;
+- (void)_addModuleEventObserversWithModuleMethod:(WXModuleMethod*)method;
+- (void)removeModuleEventObserver:(NSString*)event moduleClassName:(NSString*)moduleClassName;
+- (void)_removeModuleEventObserverWithModuleMethod:(WXModuleMethod*)method;
+
 @end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Module/WXAnimationModule.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Module/WXAnimationModule.m b/ios/sdk/WeexSDK/Sources/Module/WXAnimationModule.m
index 2197299..2af32c5 100644
--- a/ios/sdk/WeexSDK/Sources/Module/WXAnimationModule.m
+++ b/ios/sdk/WeexSDK/Sources/Module/WXAnimationModule.m
@@ -12,6 +12,10 @@
 #import "WXTransform.h"
 #import "WXUtility.h"
 
+@interface WXAnimationModule ()
+
+@end
+
 @implementation WXAnimationModule
 
 @synthesize weexInstance;
@@ -57,10 +61,11 @@ WX_EXPORT_METHOD(@selector(transition:args:callback:))
     for (NSString *property in styles) {
         if ([property isEqualToString:@"transform"]) {
             NSString *transformOrigin = styles[@"transformOrigin"];
-            WXTransform *wxTransform = [WXTransform new];
+            WXTransform *wxTransform = [[WXTransform alloc] initWithInstance:self.weexInstance];
             transform = [wxTransform getTransform:styles[property] withView:view withOrigin:transformOrigin isTransformRotate:NO];
             rotateAngle = [wxTransform getRotateAngle];
-            if (rotateAngle > M_PI+0.0001) {
+            CGFloat originAngle = [self getRotateAngleFromTransForm:layer.transform];
+            if (fabs(originAngle - rotateAngle) > M_PI + 0.0001) {
                 /**
                  Rotate >= 180 degree not working on UIView block animation, have not found any more elegant solution than using CAAnimation
                  See http://stackoverflow.com/questions/9844925/uiview-infinite-360-degree-rotation-animation
@@ -75,10 +80,10 @@ WX_EXPORT_METHOD(@selector(transition:args:callback:))
             opacity = [styles[property] floatValue];
             isAnimateOpacity = YES;
         } else if ([property isEqualToString:@"width"]) {
-            newFrame = CGRectMake(newFrame.origin.x, newFrame.origin.y, [WXConvert WXPixelType:styles[property]], newFrame.size.height);
+            newFrame = CGRectMake(newFrame.origin.x, newFrame.origin.y, [WXConvert WXPixelType:styles[property] scaleFactor:self.weexInstance.pixelScaleFactor], newFrame.size.height);
             isAnimateFrame = YES;
         } else if ([property isEqualToString:@"height"]) {
-            newFrame = CGRectMake(newFrame.origin.x, newFrame.origin.y, newFrame.size.width, [WXConvert WXPixelType:styles[property]]);
+            newFrame = CGRectMake(newFrame.origin.x, newFrame.origin.y, newFrame.size.width, [WXConvert WXPixelType:styles[property] scaleFactor:self.weexInstance.pixelScaleFactor]);
             isAnimateFrame = YES;
         }
     }
@@ -91,6 +96,10 @@ WX_EXPORT_METHOD(@selector(transition:args:callback:))
     [CATransaction begin];
     [CATransaction setAnimationTimingFunction:[WXConvert CAMediaTimingFunction:args[@"timingFunction"]]];
     [CATransaction setCompletionBlock:^{
+        if (isUsingCAAnimation) {
+            CGAffineTransform originTransform = CATransform3DGetAffineTransform(layer.transform);
+            layer.transform = CATransform3DMakeAffineTransform(CGAffineTransformRotate(originTransform, rotateAngle * M_PI / 180));
+        }
         if (callback) {
             callback(@"SUCCESS");
         }
@@ -100,6 +109,7 @@ WX_EXPORT_METHOD(@selector(transition:args:callback:))
         CABasicAnimation* rotationAnimation;
         rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
         rotationAnimation.toValue = [NSNumber numberWithFloat: rotateAngle];
+        rotationAnimation.fromValue = @([self getRotateAngleFromTransForm:layer.transform]);
         rotationAnimation.duration = duration;
         rotationAnimation.cumulative = YES;
         rotationAnimation.fillMode = kCAFillModeForwards;
@@ -139,4 +149,12 @@ WX_EXPORT_METHOD(@selector(transition:args:callback:))
     [CATransaction commit];
 }
 
+- (CGFloat)getRotateAngleFromTransForm:(CATransform3D)transform
+{
+    CGAffineTransform cgTransform = CATransform3DGetAffineTransform(transform);
+    CGFloat radians = atan2f(cgTransform.b, cgTransform.a);
+    CGFloat degrees = radians * (180 / M_PI);
+    return degrees;
+}
+
 @end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Module/WXDomModule.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Module/WXDomModule.m b/ios/sdk/WeexSDK/Sources/Module/WXDomModule.m
index d0d85cc..cd97795 100644
--- a/ios/sdk/WeexSDK/Sources/Module/WXDomModule.m
+++ b/ios/sdk/WeexSDK/Sources/Module/WXDomModule.m
@@ -168,21 +168,20 @@ WX_EXPORT_METHOD(@selector(getComponentRect:callback:))
 }
 
 - (void)getComponentRect:(NSString*)ref callback:(WXModuleKeepAliveCallback)callback {
-    
     [self performBlockOnComponentMananger:^(WXComponentManager * manager) {
         NSMutableDictionary * callbackRsp = [[NSMutableDictionary alloc] init];
         UIView *rootView = manager.weexInstance.rootView;
-        CGRect rootRect = [rootView.superview convertRect:rootView.frame toView:rootView.superview.superview];
-        CGFloat resize = WXScreenResizeRadio();
+        CGRect rootRect = [rootView.superview convertRect:rootView.frame toView:rootView];
+        CGFloat scaleFactor = self.weexInstance.pixelScaleFactor;
         if ([ref isEqualToString:@"viewport"]) {
             [callbackRsp setObject:@(true) forKey:@"result"];
             [callbackRsp setObject:@{
-                                     @"width":@(rootRect.size.width/resize),
-                                     @"height":@(rootRect.size.height/resize),
-                                     @"bottom":@(CGRectGetMaxY(rootRect)/WXScreenResizeRadio()),
-                                     @"left":@(rootRect.origin.x/resize),
-                                     @"right":@(CGRectGetMaxX(rootRect)/resize),
-                                     @"top":@(rootRect.origin.y/resize)
+                                     @"width":@(rootRect.size.width / scaleFactor),
+                                     @"height":@(rootRect.size.height / scaleFactor),
+                                     @"bottom":@(CGRectGetMaxY(rootRect) / scaleFactor),
+                                     @"left":@(rootRect.origin.x / scaleFactor),
+                                     @"right":@(CGRectGetMaxX(rootRect) / scaleFactor),
+                                     @"top":@(rootRect.origin.y / scaleFactor)
                                      } forKey:@"size"];
             callback(callbackRsp, false);
         }else {
@@ -192,15 +191,15 @@ WX_EXPORT_METHOD(@selector(getComponentRect:callback:))
                     [callbackRsp setObject:@(false) forKey:@"result"];
                     [callbackRsp setObject:[NSString stringWithFormat:@"Illegal parameter, no ref about \"%@\" can be found",ref] forKey:@"errMsg"];
                 } else {
-                    CGRect componentRect = [component.view.superview convertRect:component.calculatedFrame toView:rootView.superview.superview];
+                    CGRect componentRect = [component.view.superview convertRect:component.calculatedFrame toView:rootView];
                     [callbackRsp setObject:@(true)forKey:@"result"];
                     [callbackRsp setObject:@{
-                                             @"width":@(componentRect.size.width /resize),
-                                             @"height":@(componentRect.size.height / resize),
-                                             @"bottom":@(CGRectGetMaxY(componentRect) / resize),
-                                             @"left":@(componentRect.origin.x / resize),
-                                             @"right":@(CGRectGetMaxX(componentRect) / resize),
-                                             @"top":@(componentRect.origin.y / resize)
+                                             @"width":@(componentRect.size.width / scaleFactor),
+                                             @"height":@(componentRect.size.height / scaleFactor),
+                                             @"bottom":@(CGRectGetMaxY(componentRect) / scaleFactor),
+                                             @"left":@(componentRect.origin.x / scaleFactor),
+                                             @"right":@(CGRectGetMaxX(componentRect) / scaleFactor),
+                                             @"top":@(componentRect.origin.y / scaleFactor)
                                              } forKey:@"size"];
                 }
                 callback(callbackRsp, false);

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Module/WXGlobalEventModule.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Module/WXGlobalEventModule.m b/ios/sdk/WeexSDK/Sources/Module/WXGlobalEventModule.m
index bd5bbc1..4eb8cf8 100644
--- a/ios/sdk/WeexSDK/Sources/Module/WXGlobalEventModule.m
+++ b/ios/sdk/WeexSDK/Sources/Module/WXGlobalEventModule.m
@@ -46,7 +46,7 @@ WX_EXPORT_METHOD(@selector(removeEventListener:))
 {
     if (_eventCallback[event]) {
         [_eventCallback removeObjectForKey:event];
-        [[NSNotificationCenter defaultCenter] removeObserver:self name:event object:weexInstance];
+        [[NSNotificationCenter defaultCenter] removeObserver:self name:event object:nil];
     } else {
         WXLogWarning(@"eventName \"%@\" doesn't exist", event);
     }
@@ -70,4 +70,10 @@ WX_EXPORT_METHOD(@selector(removeEventListener:))
     }
 }
 
+- (void)dealloc
+{
+    [[NSNotificationCenter defaultCenter] removeObserver:self];
+    [_eventCallback removeAllObjects];
+}
+
 @end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Module/WXMetaModule.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Module/WXMetaModule.h b/ios/sdk/WeexSDK/Sources/Module/WXMetaModule.h
new file mode 100644
index 0000000..7d5c80c
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Module/WXMetaModule.h
@@ -0,0 +1,14 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+
+#import <Foundation/Foundation.h>
+#import "WXModuleProtocol.h"
+
+@interface WXMetaModule : NSObject <WXModuleProtocol>
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Module/WXMetaModule.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Module/WXMetaModule.m b/ios/sdk/WeexSDK/Sources/Module/WXMetaModule.m
new file mode 100644
index 0000000..3fa4f66
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Module/WXMetaModule.m
@@ -0,0 +1,40 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+#import "WXMetaModule.h"
+#import "WXConvert.h"
+#import "WXUtility.h"
+#import "WXSDKInstance_private.h"
+
+@implementation WXMetaModule
+
+@synthesize weexInstance;
+
+WX_EXPORT_METHOD(@selector(setViewport:))
+
+- (void)setViewport:(NSDictionary *)viewportArguments
+{
+    CGFloat viewportWidthFloat;
+    id viewportWidth = viewportArguments[@"width"];
+    if ([viewportWidth isKindOfClass:[NSString class]]) {
+        if ([viewportWidth isEqualToString:@"device-width"]) {
+            viewportWidthFloat = [WXUtility portraitScreenSize].width * WXScreenScale();
+        } else if ([viewportWidth isEqualToString:@"device-height"]) {
+            viewportWidthFloat = [WXUtility portraitScreenSize].height * WXScreenScale();
+        } else {
+            viewportWidthFloat = [WXConvert CGFloat:viewportWidth];
+        }
+    } else {
+        viewportWidthFloat = [WXConvert CGFloat:viewportWidth];
+    }
+    
+    if (viewportWidthFloat > 0) {
+        self.weexInstance.viewportWidth = viewportWidthFloat;
+    }
+}
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Module/WXNavigatorModule.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Module/WXNavigatorModule.m b/ios/sdk/WeexSDK/Sources/Module/WXNavigatorModule.m
index b20f566..5569866 100644
--- a/ios/sdk/WeexSDK/Sources/Module/WXNavigatorModule.m
+++ b/ios/sdk/WeexSDK/Sources/Module/WXNavigatorModule.m
@@ -18,9 +18,10 @@
 
 @synthesize weexInstance;
 
+WX_EXPORT_METHOD(@selector(open:success:failure:))
+WX_EXPORT_METHOD(@selector(close:success:failure:))
 WX_EXPORT_METHOD(@selector(push:callback:))
 WX_EXPORT_METHOD(@selector(pop:callback:))
-WX_EXPORT_METHOD(@selector(close:callback:))
 WX_EXPORT_METHOD(@selector(setNavBarBackgroundColor:callback:))
 WX_EXPORT_METHOD(@selector(setNavBarLeftItem:callback:))
 WX_EXPORT_METHOD(@selector(clearNavBarLeftItem:callback:))
@@ -40,33 +41,36 @@ WX_EXPORT_METHOD(@selector(setNavBarHidden:callback:))
 
 #pragma mark Weex Application Interface
 
-- (void)push:(NSDictionary *)param callback:(WXModuleCallback)callback
+- (void)open:(NSDictionary *)param success:(WXModuleCallback)success failure:(WXModuleCallback)failure
 {
     id<WXNavigationProtocol> navigator = [self navigator];
     UIViewController *container = self.weexInstance.viewController;
-    [navigator pushViewControllerWithParam:param completion:^(NSString *code, NSDictionary *responseData) {
-        if (callback && code) {
-            callback(code);
-        }
-    } withContainer:container];
+    [navigator open:param success:success failure:failure withContainer:container];
 }
-
-- (void)pop:(NSDictionary *)param callback:(WXModuleCallback)callback
+    
+- (void)close:(NSDictionary *)param success:(WXModuleCallback)success failure:(WXModuleCallback)failure
 {
     id<WXNavigationProtocol> navigator = [self navigator];
     UIViewController *container = self.weexInstance.viewController;
-    [navigator popViewControllerWithParam:param completion:^(NSString *code, NSDictionary *responseData) {
+    [navigator close:param success:success failure:failure withContainer:container];
+}
+    
+- (void)push:(NSDictionary *)param callback:(WXModuleCallback)callback
+{
+    id<WXNavigationProtocol> navigator = [self navigator];
+    UIViewController *container = self.weexInstance.viewController;
+    [navigator pushViewControllerWithParam:param completion:^(NSString *code, NSDictionary *responseData) {
         if (callback && code) {
             callback(code);
         }
     } withContainer:container];
 }
 
-- (void)close:(NSDictionary *)param callback:(WXModuleCallback)callback
+- (void)pop:(NSDictionary *)param callback:(WXModuleCallback)callback
 {
     id<WXNavigationProtocol> navigator = [self navigator];
     UIViewController *container = self.weexInstance.viewController;
-    [navigator popToRootViewControllerWithParam:param completion:^(NSString *code, NSDictionary *responseData) {
+    [navigator popViewControllerWithParam:param completion:^(NSString *code, NSDictionary *responseData) {
         if (callback && code) {
             callback(code);
         }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Module/WXStreamModule.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Module/WXStreamModule.h b/ios/sdk/WeexSDK/Sources/Module/WXStreamModule.h
index be1e75d..2eb949f 100644
--- a/ios/sdk/WeexSDK/Sources/Module/WXStreamModule.h
+++ b/ios/sdk/WeexSDK/Sources/Module/WXStreamModule.h
@@ -12,6 +12,6 @@
 @interface WXStreamModule : NSObject <WXModuleProtocol>
 
 - (void)fetch:(NSDictionary *)options callback:(WXModuleCallback)callback progressCallback:(WXModuleKeepAliveCallback)progressCallback;
-- (void)sendHttp:(NSDictionary*)param callback:(WXModuleCallback)callback;
+- (void)sendHttp:(NSDictionary*)param callback:(WXModuleCallback)callback DEPRECATED_MSG_ATTRIBUTE("Use fetch method instead.");
 
 @end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Module/WXStreamModule.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Module/WXStreamModule.m b/ios/sdk/WeexSDK/Sources/Module/WXStreamModule.m
index 594c0d2..021699a 100644
--- a/ios/sdk/WeexSDK/Sources/Module/WXStreamModule.m
+++ b/ios/sdk/WeexSDK/Sources/Module/WXStreamModule.m
@@ -12,6 +12,7 @@
 #import "WXHandlerFactory.h"
 #import "WXNetworkProtocol.h"
 #import "WXURLRewriteProtocol.h"
+#import "WXResourceLoader.h"
 
 @implementation WXStreamModule
 
@@ -20,40 +21,6 @@
 WX_EXPORT_METHOD(@selector(sendHttp:callback:))
 WX_EXPORT_METHOD(@selector(fetch:callback:progressCallback:))
 
-- (void)sendHttp:(NSDictionary*)param callback:(WXModuleCallback)callback
-{
-    NSString* method = [param objectForKey:@"method"];
-    NSString* urlStr = [param objectForKey:@"url"];
-    NSDictionary* header = [param objectForKey:@"header"];
-    NSString* body = [param objectForKey:@"body"];
-    
-    NSURL *url = [NSURL URLWithString:urlStr];
-    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
-    [request setHTTPMethod:method];
-    [request setTimeoutInterval:60.0];
-    [request setValue:[WXUtility userAgent] forHTTPHeaderField:@"User-Agent"];
-    for (NSString *key in header) {
-        NSString *value = [header objectForKey:key];
-        [request setValue:value forHTTPHeaderField:key];
-    }
-    [request setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]];
-    
-    id<WXNetworkProtocol> networkHandler = [WXHandlerFactory handlerForProtocol:@protocol(WXNetworkProtocol)];
-    
-    [networkHandler sendRequest:request
-                withSendingData:^(int64_t bytesSent, int64_t totalBytes) {
-                 } withResponse:^(NSURLResponse *response) {
-              } withReceiveData:^(NSData *data) {
-              } withCompeletion:^(NSData *totalData, NSError *error) {
-                    NSString *responseData = nil;
-                    if (!error) {
-                        responseData = [[NSString alloc] initWithData:totalData encoding:NSUTF8StringEncoding];
-                    }
-                    //else ok
-                    callback(responseData);
-              }];
-}
-
 - (void)fetch:(NSDictionary *)options callback:(WXModuleCallback)callback progressCallback:(WXModuleKeepAliveCallback)progressCallback
 {
     __block NSInteger received = 0;
@@ -79,98 +46,117 @@ WX_EXPORT_METHOD(@selector(fetch:callback:progressCallback:))
     }
     urlStr = newUrlStr;
     NSDictionary *headers = [options objectForKey:@"headers"];
-    NSString *body = [options objectForKey:@"body"];
     NSString *type = [options objectForKey:@"type"];
     NSURL *url = [NSURL URLWithString:urlStr];
-    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
-    [request setHTTPMethod:method];
-    [request setValue:[WXUtility userAgent] forHTTPHeaderField:@"User-Agent"];
     
+    //TODO:referrer
+    WXResourceRequest *request = [WXResourceRequest requestWithURL:url resourceType:WXResourceTypeOthers referrer:nil cachePolicy:NSURLRequestUseProtocolCachePolicy];
+    request.HTTPMethod = method;
     if ([options valueForKey:@"timeout"]){
         //ms
         [request setTimeoutInterval:([[options valueForKey:@"timeout"] floatValue])/1000];
     }
+    request.userAgent = [WXUtility userAgent];
     
     for (NSString *header in headers) {
         NSString *value = [headers objectForKey:header];
         [request setValue:value forHTTPHeaderField:header];
     }
-    [request setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]];
 
-    [callbackRsp setObject:@{ @"OPENED": @1 } forKey:@"readyState"];
+    if ([options objectForKey:@"body"]) {
+        NSData * body = nil;
+        if ([[options objectForKey:@"body"] isKindOfClass:[NSString class]]) {
+            // compatible with the string body
+            body = [[options objectForKey:@"body"] dataUsingEncoding:NSUTF8StringEncoding];
+        }
+        if ([[options objectForKey:@"body"] isKindOfClass:[NSDictionary class]]) {
+            body = [[WXUtility JSONString:[options objectForKey:@"body"]] dataUsingEncoding:NSUTF8StringEncoding];
+        }
+        if (!body) {
+            [callbackRsp setObject:@(-1) forKey:@"status"];
+            [callbackRsp setObject:@false forKey:@"ok"];
+            callback(callbackRsp);
+                
+            return;
+        }
+        
+        [request setHTTPBody:body];
+    }
     
+    [callbackRsp setObject:@{ @"OPENED": @1 } forKey:@"readyState"];
     progressCallback(callbackRsp, TRUE);
     
-    id<WXNetworkProtocol> networkHandler = [WXHandlerFactory handlerForProtocol:@protocol(WXNetworkProtocol)];
-    __block NSString *respEncode = nil;
+    WXResourceLoader *loader = [[WXResourceLoader alloc] initWithRequest:request];
     __weak typeof(self) weakSelf = self;
-    [networkHandler sendRequest:request
-                withSendingData:^(int64_t bytesSent, int64_t totalBytes) {
-                } withResponse:^(NSURLResponse *response) {
-                    httpResponse = (NSHTTPURLResponse*)response;
-                    respEncode = httpResponse.textEncodingName;
-                    if (weakSelf) {
-                        [callbackRsp setObject:@{ @"HEADERS_RECEIVED" : @2  } forKey:@"readyState"];
-                        [callbackRsp setObject:[NSNumber numberWithInteger:httpResponse.statusCode] forKey:@"status"];
-                        [callbackRsp setObject:httpResponse.allHeaderFields forKey:@"headers"];
-                        statusText = [WXStreamModule getStatusText:httpResponse.statusCode];
-                        [callbackRsp setObject:statusText forKey:@"statusText"];
-                        [callbackRsp setObject:[NSNumber numberWithInteger:received] forKey:@"length"];
-                         progressCallback(callbackRsp, TRUE);
-                    }
-                    
-                } withReceiveData:^(NSData *data) {
-                    [callbackRsp setObject:@{ @"LOADING" : @3 } forKey:@"readyState"];
-                    received += [data length];
-                    [callbackRsp setObject:[NSNumber numberWithInteger:received] forKey:@"length"];
-                     progressCallback(callbackRsp, TRUE);
-                    
-                } withCompeletion:^(NSData *totalData, NSError *error) {
-                    
-                    [callbackRsp removeObjectForKey:@"readyState"];
-                    [callbackRsp removeObjectForKey:@"length"];
-                    [callbackRsp removeObjectForKey:@"keepalive"];
-                    [callbackRsp setObject:httpResponse.statusCode >= 200 && httpResponse.statusCode <= 299 ? @true : @false forKey:@"ok"];
-                    if (error) {
-                        //error
-                        [callbackRsp setObject:@(-1) forKey:@"status"];
-                        [callbackRsp setObject:[NSString stringWithFormat:@"%@(%ld)",[error localizedDescription], (long)[error code]] forKey:@"data"];
-                        
-                        switch ([error code]) {
-                            case -1000:
-                            case -1002:
-                            case -1003:
-                                statusText = @"ERR_INVALID_REQUEST";
-                                break;
-                            default:
-                                break;
-                        }
-                        [callbackRsp setObject:statusText forKey:@"statusText"];
-                        
-                    }else {
-                        // no error
-                        NSString *responseData = [self stringfromData:totalData encode:respEncode];
-                        if ([type isEqualToString:@"json"] || [type isEqualToString:@"jsonp"]) {
-                            if ([type isEqualToString:@"jsonp"]) {
-                                NSUInteger start = [responseData rangeOfString:@"("].location + 1 ;
-                                NSUInteger end = [responseData rangeOfString:@")" options:NSBackwardsSearch].location;
-                                if (end < [responseData length] && end > start) {
-                                    responseData = [responseData substringWithRange:NSMakeRange(start, end-start)];
-                                }
-                            }
-                            id jsonObj = [self JSONObjFromData:[responseData dataUsingEncoding:NSUTF8StringEncoding]];
-                            if (jsonObj) {
-                                [callbackRsp setObject:jsonObj forKey:@"data"];
-                            }
-                            
-                        } else {
-                            if (responseData) {
-                                [callbackRsp setObject:responseData forKey:@"data"];
-                            }
-                        }
-                    }
-                    callback(callbackRsp);
-                }];
+    loader.onResponseReceived = ^(const WXResourceResponse *response) {
+        httpResponse = (NSHTTPURLResponse*)response;
+        if (weakSelf) {
+            [callbackRsp setObject:@{ @"HEADERS_RECEIVED" : @2  } forKey:@"readyState"];
+            [callbackRsp setObject:[NSNumber numberWithInteger:httpResponse.statusCode] forKey:@"status"];
+            [callbackRsp setObject:httpResponse.allHeaderFields forKey:@"headers"];
+            statusText = [WXStreamModule getStatusText:httpResponse.statusCode];
+            [callbackRsp setObject:statusText forKey:@"statusText"];
+            [callbackRsp setObject:[NSNumber numberWithInteger:received] forKey:@"length"];
+            progressCallback(callbackRsp, TRUE);
+        }
+    };
+    
+    loader.onDataReceived = ^(NSData *data) {
+        [callbackRsp setObject:@{ @"LOADING" : @3 } forKey:@"readyState"];
+        received += [data length];
+        [callbackRsp setObject:[NSNumber numberWithInteger:received] forKey:@"length"];
+        progressCallback(callbackRsp, TRUE);
+    };
+    
+    loader.onFinished = ^(const WXResourceResponse * response, NSData *data) {
+        [callbackRsp removeObjectForKey:@"readyState"];
+        [callbackRsp removeObjectForKey:@"length"];
+        [callbackRsp removeObjectForKey:@"keepalive"];
+        [callbackRsp setObject:httpResponse.statusCode >= 200 && httpResponse.statusCode <= 299 ? @true : @false forKey:@"ok"];
+    
+        NSString *responseData = [self stringfromData:data encode:httpResponse.textEncodingName];
+        if ([type isEqualToString:@"json"] || [type isEqualToString:@"jsonp"]) {
+            if ([type isEqualToString:@"jsonp"]) {
+                NSUInteger start = [responseData rangeOfString:@"("].location + 1 ;
+                NSUInteger end = [responseData rangeOfString:@")" options:NSBackwardsSearch].location;
+                if (end < [responseData length] && end > start) {
+                    responseData = [responseData substringWithRange:NSMakeRange(start, end-start)];
+                }
+            }
+            id jsonObj = [self JSONObjFromData:[responseData dataUsingEncoding:NSUTF8StringEncoding]];
+            if (jsonObj) {
+                [callbackRsp setObject:jsonObj forKey:@"data"];
+            }
+            
+        } else {
+            if (responseData) {
+                [callbackRsp setObject:responseData forKey:@"data"];
+            }
+        }
+        
+        callback(callbackRsp);
+    };
+    
+    loader.onFailed = ^(NSError *error) {
+        [callbackRsp removeObjectForKey:@"readyState"];
+        [callbackRsp removeObjectForKey:@"length"];
+        [callbackRsp removeObjectForKey:@"keepalive"];
+        [callbackRsp setObject:@(-1) forKey:@"status"];
+        [callbackRsp setObject:[NSString stringWithFormat:@"%@(%ld)",[error localizedDescription], (long)[error code]] forKey:@"data"];
+        
+        switch ([error code]) {
+            case -1000:
+            case -1002:
+            case -1003:
+                statusText = @"ERR_INVALID_REQUEST";
+                break;
+            default:
+                break;
+        }
+        [callbackRsp setObject:statusText forKey:@"statusText"];
+    };
+    
+    [loader start];
 }
 
 - (NSString*)stringfromData:(NSData *)data encode:(NSString *)encoding
@@ -340,4 +326,40 @@ WX_EXPORT_METHOD(@selector(fetch:callback:progressCallback:))
     return @"Unknown";
 }
 
+#pragma mark - Deprecated
+
+- (void)sendHttp:(NSDictionary*)param callback:(WXModuleCallback)callback
+{
+    NSString* method = [param objectForKey:@"method"];
+    NSString* urlStr = [param objectForKey:@"url"];
+    NSDictionary* headers = [param objectForKey:@"header"];
+    NSString* body = [param objectForKey:@"body"];
+    
+    NSURL *url = [NSURL URLWithString:urlStr];
+    
+    //TODO:referrer
+    WXResourceRequest *request = [WXResourceRequest requestWithURL:url resourceType:WXResourceTypeOthers referrer:nil cachePolicy:NSURLRequestUseProtocolCachePolicy];
+    request.HTTPMethod = method;
+    request.timeoutInterval = 60.0;
+    request.userAgent = [WXUtility userAgent];
+    
+    for (NSString *key in headers) {
+        NSString *value = [headers objectForKey:key];
+        [request setValue:value forHTTPHeaderField:key];
+    }
+    [request setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]];
+    
+    WXResourceLoader *loader = [[WXResourceLoader alloc] initWithRequest:request];
+    loader.onFinished = ^(const WXResourceResponse * response, NSData *data) {
+        NSString* responseData = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+        callback(responseData);
+    };
+    
+    loader.onFailed = ^(NSError *error) {
+        callback(nil);
+    };
+
+    [loader start];
+}
+
 @end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Module/WXWebSocketModule.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Module/WXWebSocketModule.h b/ios/sdk/WeexSDK/Sources/Module/WXWebSocketModule.h
new file mode 100644
index 0000000..12fb84c
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Module/WXWebSocketModule.h
@@ -0,0 +1,15 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+
+#import <Foundation/Foundation.h>
+#import "WXModuleProtocol.h"
+#import "SRWebSocket.h"
+
+@interface WXWebSocketModule : NSObject <WXModuleProtocol>
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Module/WXWebSocketModule.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Module/WXWebSocketModule.m b/ios/sdk/WeexSDK/Sources/Module/WXWebSocketModule.m
new file mode 100644
index 0000000..ae2e158
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Module/WXWebSocketModule.m
@@ -0,0 +1,137 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+
+#import "WXWebSocketModule.h"
+#import "WXUtility.h"
+#import "WXWebSocketHandler.h"
+#import "WXHandlerFactory.h"
+#import "WXWebSocketLoader.h"
+#import "WXConvert.h"
+
+@interface WXWebSocketModule()
+
+@property(nonatomic,copy)WXModuleKeepAliveCallback errorCallBack;
+@property(nonatomic,copy)WXModuleKeepAliveCallback messageCallBack;
+@property(nonatomic,copy)WXModuleKeepAliveCallback openCallBack;
+@property(nonatomic,copy)WXModuleKeepAliveCallback closeCallBack;
+
+@end
+
+@implementation WXWebSocketModule
+{
+    WXWebSocketLoader *loader;
+}
+WX_EXPORT_METHOD(@selector(WebSocket:protocol:))
+WX_EXPORT_METHOD(@selector(send:))
+WX_EXPORT_METHOD(@selector(close:reason:))
+WX_EXPORT_METHOD(@selector(onerror:))
+WX_EXPORT_METHOD(@selector(onmessage:))
+WX_EXPORT_METHOD(@selector(onopen:))
+WX_EXPORT_METHOD(@selector(onclose:))
+
+@synthesize weexInstance;
+
+- (void)WebSocket:(NSString *)url protocol:(NSString *)protocol
+{
+    if(loader)
+    {
+        [loader clear];
+    }
+    loader = [[WXWebSocketLoader alloc] initWithUrl:url protocol:protocol];
+    __weak typeof(self) weakSelf = self;
+    loader.onReceiveMessage = ^(id message) {
+        if (weakSelf) {
+            NSMutableDictionary *dic = [NSMutableDictionary new];
+            if([message isKindOfClass:[NSString class]]) {
+                [dic setObject:message forKey:@"data"];
+            }
+            if (weakSelf.messageCallBack) {
+                weakSelf.messageCallBack(dic,true);;
+            }
+        }
+    };
+    loader.onOpen = ^() {
+        if (weakSelf) {
+            if (weakSelf.openCallBack) {
+                NSMutableDictionary *dict = [NSMutableDictionary new];
+                weakSelf.openCallBack(dict,true);;
+            }
+        }
+    };
+    loader.onFail = ^(NSError *error) {
+        if (weakSelf) {
+            WXLogError(@":( Websocket Failed With Error %@", error);
+            NSMutableDictionary *dict = [NSMutableDictionary new];
+            [dict setObject:error.userInfo forKey:@"data"];
+            if (weakSelf.errorCallBack) {
+                weakSelf.errorCallBack(dict, true);
+            }
+        }
+    };
+    loader.onClose = ^(NSInteger code,NSString *reason,BOOL wasClean) {
+        if (weakSelf) {
+            if (weakSelf.closeCallBack) {
+                WXLogInfo(@"Websocket colse ");
+                NSMutableDictionary * callbackRsp = [[NSMutableDictionary alloc] init];
+                [callbackRsp setObject:[NSNumber numberWithInteger:code] forKey:@"code"];
+                [callbackRsp setObject:reason forKey:@"reason"];
+                [callbackRsp setObject:wasClean?@true:@false forKey:@"wasClean"];
+                weakSelf.closeCallBack(callbackRsp,false);
+            }
+        }
+    };
+    
+    [loader open];
+}
+
+- (void)send:(NSString *)data
+{
+    [loader send:data];
+}
+
+- (void)close
+{
+    [loader close];
+}
+
+- (void)close:(NSString *)code reason:(NSString *)reason
+{
+    if(!code)
+    {
+        [loader close];
+        return;
+    }
+    [loader close:[code integerValue] reason:reason];
+}
+
+- (void)onerror:(WXModuleKeepAliveCallback)callback
+{
+    self.errorCallBack = callback;
+}
+
+- (void)onmessage:(WXModuleKeepAliveCallback)callback
+{
+    self.messageCallBack = callback;
+}
+
+- (void)onopen:(WXModuleKeepAliveCallback)callback
+{
+    self.openCallBack = callback;
+}
+
+- (void)onclose:(WXModuleKeepAliveCallback)callback
+{
+    self.closeCallBack = callback;
+}
+
+-(void)dealloc
+{
+    [loader clear];
+}
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Monitor/WXMonitor.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Monitor/WXMonitor.h b/ios/sdk/WeexSDK/Sources/Monitor/WXMonitor.h
index c874935..076e0c7 100644
--- a/ios/sdk/WeexSDK/Sources/Monitor/WXMonitor.h
+++ b/ios/sdk/WeexSDK/Sources/Monitor/WXMonitor.h
@@ -8,6 +8,7 @@
 
 #import <Foundation/Foundation.h>
 #import "WXDefine.h"
+#import "WXSDKError.h"
 
 @class WXSDKInstance;
 
@@ -30,6 +31,7 @@ typedef enum : NSUInteger {
     WXMTJSDownload,
     WXMTJSBridge,
     WXMTNativeRender,
+    WXMTJSService,
 } WXMonitorTag;
 
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Network/WXResourceRequest.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Network/WXResourceRequest.h b/ios/sdk/WeexSDK/Sources/Network/WXResourceRequest.h
new file mode 100644
index 0000000..d8ab92a
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Network/WXResourceRequest.h
@@ -0,0 +1,35 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+
+#import <Foundation/Foundation.h>
+
+typedef enum : NSUInteger {
+    WXResourceTypeMainBundle,
+    WXResourceTypeServiceBundle,
+    WXResourceTypeImage,
+    WXResourceTypeFont,
+    WXResourceTypeVideo,
+    WXResourceTypeLink,
+    WXResourceTypeOthers
+} WXResourceType;
+
+
+@interface WXResourceRequest : NSMutableURLRequest
+
+@property (nonatomic, strong) id taskIdentifier;
+@property (nonatomic, assign) WXResourceType type;
+
+@property (nonatomic, strong) NSString *referrer;
+@property (nonatomic, strong) NSString *userAgent;
+
++ (instancetype)requestWithURL:(NSURL *)url
+                  resourceType:(WXResourceType)type
+                      referrer:(NSString *)referrer
+                   cachePolicy:(NSURLRequestCachePolicy)cachePolicy;
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Network/WXResourceRequest.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Network/WXResourceRequest.m b/ios/sdk/WeexSDK/Sources/Network/WXResourceRequest.m
new file mode 100644
index 0000000..b161d8f
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Network/WXResourceRequest.m
@@ -0,0 +1,57 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+
+#import "WXResourceRequest.h"
+
+NSString * const kHTTPHeaderNameUserAgent = @"User-Agent";
+NSString * const kHTTPHeaderNameReferrer = @"Referer"; // The misspelling referer originated in the original proposal by computer "scientist" Phillip Hallam-Baker to incorporate the field into the HTTP specification. \u256e(\u256f_\u2570)\u256d
+
+@implementation WXResourceRequest
+
++ (instancetype)requestWithURL:(NSURL *)url
+                  resourceType:(WXResourceType)type
+                      referrer:(NSString *)referrer
+                   cachePolicy:(NSURLRequestCachePolicy)cachePolicy
+{
+    return [[self alloc] initWithURL:url resourceType:type referrer:referrer cachePolicy:cachePolicy];
+}
+
+- (instancetype)initWithURL:(NSURL *)url
+               resourceType:(WXResourceType)type
+                   referrer:(NSString *)referrer cachePolicy:(NSURLRequestCachePolicy)cachePolicy
+{
+    if (self = [super initWithURL:url]) {
+        self.type = type;
+        self.cachePolicy = cachePolicy;
+        [self setValue:referrer forHTTPHeaderField:kHTTPHeaderNameReferrer];
+    }
+    
+    return self;
+}
+
+- (NSString *)referrer
+{
+    return [self valueForHTTPHeaderField:kHTTPHeaderNameReferrer];
+}
+
+- (void)setReferrer:(NSString *)referrer
+{
+    [self setValue:referrer forHTTPHeaderField:kHTTPHeaderNameReferrer];
+}
+
+- (NSString *)userAgent
+{
+    return [self valueForHTTPHeaderField:kHTTPHeaderNameUserAgent];
+}
+
+- (void)setUserAgent:(NSString *)userAgent
+{
+    [self setValue:userAgent forHTTPHeaderField:kHTTPHeaderNameUserAgent];
+}
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Network/WXResourceRequestHandler.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Network/WXResourceRequestHandler.h b/ios/sdk/WeexSDK/Sources/Network/WXResourceRequestHandler.h
new file mode 100644
index 0000000..7f5393b
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Network/WXResourceRequestHandler.h
@@ -0,0 +1,45 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+
+
+#import <Foundation/Foundation.h>
+#import "WXResourceRequest.h"
+#import "WXResourceResponse.h"
+
+@protocol WXResourceRequestDelegate <NSObject>
+
+// Periodically informs the delegate of the progress of sending content to the server.
+- (void)request:(WXResourceRequest *)request didSendData:(unsigned long long)bytesSent totalBytesToBeSent:(unsigned long long)totalBytesToBeSent;
+
+// Tells the delegate that the request received the initial reply (headers) from the server.
+- (void)request:(WXResourceRequest *)request didReceiveResponse:(WXResourceResponse *)response;
+
+// Tells the delegate that the request has received some of the expected data.
+- (void)request:(WXResourceRequest *)request didReceiveData:(NSData *)data;
+
+// Tells the delegate that the request finished transferring data.
+- (void)requestDidFinishLoading:(WXResourceRequest *)request;
+
+// Tells the delegate that the request failed to load successfully.
+- (void)request:(WXResourceRequest *)request didFailWithError:(NSError *)error;
+
+@end
+
+@protocol WXResourceRequestHandler <NSObject>
+
+// Send a resource request with a delegate
+- (void)sendRequest:(WXResourceRequest *)request withDelegate:(id<WXResourceRequestDelegate>)delegate;
+
+@optional
+
+// Cancel the ongoing request
+- (void)cancelRequest:(WXResourceRequest *)request;
+
+@end
+
+

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Network/WXResourceRequestHandlerDefaultImpl.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Network/WXResourceRequestHandlerDefaultImpl.h b/ios/sdk/WeexSDK/Sources/Network/WXResourceRequestHandlerDefaultImpl.h
new file mode 100644
index 0000000..d68ca8c
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Network/WXResourceRequestHandlerDefaultImpl.h
@@ -0,0 +1,15 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+
+
+#import <Foundation/Foundation.h>
+#import "WXResourceRequestHandler.h"
+
+@interface WXResourceRequestHandlerDefaultImpl : NSObject <WXResourceRequestHandler>
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Network/WXResourceRequestHandlerDefaultImpl.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Network/WXResourceRequestHandlerDefaultImpl.m b/ios/sdk/WeexSDK/Sources/Network/WXResourceRequestHandlerDefaultImpl.m
new file mode 100644
index 0000000..211471f
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Network/WXResourceRequestHandlerDefaultImpl.m
@@ -0,0 +1,90 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+
+
+#import "WXResourceRequestHandlerDefaultImpl.h"
+#import "WXThreadSafeMutableDictionary.h"
+#import "WXAppConfiguration.h"
+
+@interface WXResourceRequestHandlerDefaultImpl () <NSURLSessionDataDelegate>
+
+@end
+
+@implementation WXResourceRequestHandlerDefaultImpl
+{
+    NSURLSession *_session;
+    WXThreadSafeMutableDictionary<NSURLSessionDataTask *, id<WXResourceRequestDelegate>> *_delegates;
+}
+
+#pragma mark - WXResourceRequestHandler
+
+- (void)sendRequest:(WXResourceRequest *)request withDelegate:(id<WXResourceRequestDelegate>)delegate
+{
+    if (!_session) {
+        NSURLSessionConfiguration *urlSessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
+        if ([WXAppConfiguration customizeProtocolClasses].count > 0) {
+            NSArray *defaultProtocols = urlSessionConfig.protocolClasses;
+            urlSessionConfig.protocolClasses = [[WXAppConfiguration customizeProtocolClasses] arrayByAddingObjectsFromArray:defaultProtocols];
+        }
+        _session = [NSURLSession sessionWithConfiguration:urlSessionConfig
+                                                 delegate:self
+                                            delegateQueue:[NSOperationQueue mainQueue]];
+        _delegates = [WXThreadSafeMutableDictionary new];
+    }
+    
+    NSURLSessionDataTask *task = [_session dataTaskWithRequest:request];
+    request.taskIdentifier = task;
+    [_delegates setObject:delegate forKey:task];
+    [task resume];
+}
+
+- (void)cancelRequest:(WXResourceRequest *)request
+{
+    if ([request.taskIdentifier isKindOfClass:[NSURLSessionTask class]]) {
+        NSURLSessionTask *task = (NSURLSessionTask *)request.taskIdentifier;
+        [task cancel];
+        [_delegates removeObjectForKey:task];
+    }
+}
+
+#pragma mark - NSURLSessionTaskDelegate & NSURLSessionDataDelegate
+
+- (void)URLSession:(NSURLSession *)session
+              task:(NSURLSessionTask *)task
+   didSendBodyData:(int64_t)bytesSent
+    totalBytesSent:(int64_t)totalBytesSent
+totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend
+{
+    id<WXResourceRequestDelegate> delegate = [_delegates objectForKey:task];
+    [delegate request:(WXResourceRequest *)task.originalRequest didSendData:bytesSent totalBytesToBeSent:totalBytesExpectedToSend];
+}
+
+- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)task
+didReceiveResponse:(NSURLResponse *)response
+ completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
+{
+    id<WXResourceRequestDelegate> delegate = [_delegates objectForKey:task];
+    [delegate request:(WXResourceRequest *)task.originalRequest didReceiveResponse:(WXResourceResponse *)response];
+    completionHandler(NSURLSessionResponseAllow);
+}
+
+- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)task didReceiveData:(NSData *)data
+{
+    id<WXResourceRequestDelegate> delegate = [_delegates objectForKey:task];
+    [delegate request:(WXResourceRequest *)task.originalRequest didReceiveData:data];
+}
+
+- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
+{
+    id<WXResourceRequestDelegate> delegate = [_delegates objectForKey:task];
+    [delegate requestDidFinishLoading:(WXResourceRequest *)task.originalRequest];
+    [_delegates removeObjectForKey:task];
+}
+
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Network/WXResourceResponse.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Network/WXResourceResponse.h b/ios/sdk/WeexSDK/Sources/Network/WXResourceResponse.h
new file mode 100644
index 0000000..06ec6bd
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Network/WXResourceResponse.h
@@ -0,0 +1,14 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+
+
+#import <Foundation/Foundation.h>
+
+@interface WXResourceResponse : NSURLResponse
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Network/WXResourceResponse.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Network/WXResourceResponse.m b/ios/sdk/WeexSDK/Sources/Network/WXResourceResponse.m
new file mode 100644
index 0000000..b7b5e59
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Network/WXResourceResponse.m
@@ -0,0 +1,14 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+
+
+#import "WXResourceResponse.h"
+
+@implementation WXResourceResponse
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Protocol/WXBridgeProtocol.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Protocol/WXBridgeProtocol.h b/ios/sdk/WeexSDK/Sources/Protocol/WXBridgeProtocol.h
index 035b5b7..fd19706 100644
--- a/ios/sdk/WeexSDK/Sources/Protocol/WXBridgeProtocol.h
+++ b/ios/sdk/WeexSDK/Sources/Protocol/WXBridgeProtocol.h
@@ -8,9 +8,10 @@
 
 #import <JavaScriptCore/JavaScriptCore.h>
 
-typedef NSInteger (^WXJSCallNative)(NSString *instance, NSArray *tasks, NSString *callback);
-typedef NSInteger (^WXJSCallAddElement)(NSString *instanceId,  NSString *parentRef, NSDictionary *elementData, NSInteger index);
-
+typedef NSInteger(^WXJSCallNative)(NSString *instance, NSArray *tasks, NSString *callback);
+typedef NSInteger(^WXJSCallAddElement)(NSString *instanceId,  NSString *parentRef, NSDictionary *elementData, NSInteger index);
+typedef NSInvocation *(^WXJSCallNativeModule)(NSString *instanceId, NSString *moduleName, NSString *methodName, NSArray *args, NSDictionary *options);
+typedef void (^WXJSCallNativeComponent)(NSString *instanceId, NSString *componentRef, NSString *methodName, NSArray *args, NSDictionary *options);
 
 @protocol WXBridgeProtocol <NSObject>
 
@@ -23,6 +24,12 @@ typedef NSInteger (^WXJSCallAddElement)(NSString *instanceId,  NSString *parentR
 - (void)executeJSFramework:(NSString *)frameworkScript;
 
 /**
+ * Executes the js code in javascript engine
+ * You can do some setup in this method
+ */
+- (void)executeJavascript:(NSString *)script;
+
+/**
  * Executes global js method with specific arguments
  */
 - (JSValue *)callJSMethod:(NSString *)method args:(NSArray*)args;
@@ -40,13 +47,24 @@ typedef NSInteger (^WXJSCallAddElement)(NSString *instanceId,  NSString *parentR
 @optional
 
 /**
+ * Called when garbage collection is wanted by sdk.
+ */
+- (void)garbageCollect;
+
+/**
  * Register callback when addElement tasks occur
  */
 - (void)registerCallAddElement:(WXJSCallAddElement)callAddElement;
 
 /**
- * Called when garbage collection is wanted by sdk.
+ * Register callback for global js function `callNativeModule`
  */
-- (void)garbageCollect;
+- (void)registerCallNativeModule:(WXJSCallNativeModule)callNativeModuleBlock;
+
+/**
+ * Register callback for global js function `callNativeComponent`
+ */
+- (void)registerCallNativeComponent:(WXJSCallNativeComponent)callNativeComponentBlock;
+
 
 @end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Protocol/WXModuleProtocol.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Protocol/WXModuleProtocol.h b/ios/sdk/WeexSDK/Sources/Protocol/WXModuleProtocol.h
index 327d6d7..1e2528c 100644
--- a/ios/sdk/WeexSDK/Sources/Protocol/WXModuleProtocol.h
+++ b/ios/sdk/WeexSDK/Sources/Protocol/WXModuleProtocol.h
@@ -24,7 +24,6 @@
  * @discussion callback data to js, the id of callback function will be removed to save memory.
  */
 typedef void (^WXModuleCallback)(id result);
-typedef void (^WXModuleKeepAliveCallback)(id result, BOOL keepAlive);
 
 /**
  * @abstract the module callback , result can be string or dictionary.

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Protocol/WXNavigationProtocol.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Protocol/WXNavigationProtocol.h b/ios/sdk/WeexSDK/Sources/Protocol/WXNavigationProtocol.h
index c8f76b4..80cf2ae 100644
--- a/ios/sdk/WeexSDK/Sources/Protocol/WXNavigationProtocol.h
+++ b/ios/sdk/WeexSDK/Sources/Protocol/WXNavigationProtocol.h
@@ -119,18 +119,39 @@ typedef void (^WXNavigationResultBlock)(NSString *code, NSDictionary * responseD
                         completion:(WXNavigationResultBlock)block
                      withContainer:(UIViewController *)container;
 
+    
+@optional
+    
 /**
- * @abstract Pops all the view controllers on the stack except the root view controller.
+ * @abstract open the resource at the specified URL which supports many common schemes, including the http, https, tel and mailto schemes.
  *
  * @param param The data which is passed to the implementation of the protocol.
  *
- * @param block A block called once the action is completed.
+ * @param block A block called once the action is completed successfully.
+ *
+ * @param block A block called once the action failed to be completed.
  *
  * @param container The target controller.
  *
  */
-- (void)popToRootViewControllerWithParam:(NSDictionary *)param
-                              completion:(WXNavigationResultBlock)block
-                           withContainer:(UIViewController *)container;
+- (void)open:(NSDictionary *)param success:(WXModuleCallback)success
+                                   failure:(WXModuleCallback)failure
+                             withContainer:(UIViewController *)container;
 
+
+/**
+  * @abstract close the current weex page
+  *
+  * @param param The data which is passed to the implementation of the protocol.
+  *
+  * @param block A block called once the action is completed successfully.
+  *
+  * @param block A block called once the action failed to be completed.
+  *
+  * @param container The target controller.
+  *
+  */
+- (void)close:(NSDictionary *)param success:(WXModuleCallback)success
+                                   failure:(WXModuleCallback)failure
+                             withContainer:(UIViewController *)container;
 @end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Protocol/WXNetworkProtocol.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Protocol/WXNetworkProtocol.h b/ios/sdk/WeexSDK/Sources/Protocol/WXNetworkProtocol.h
index ced6ce7..0f0f335 100644
--- a/ios/sdk/WeexSDK/Sources/Protocol/WXNetworkProtocol.h
+++ b/ios/sdk/WeexSDK/Sources/Protocol/WXNetworkProtocol.h
@@ -9,6 +9,7 @@
 #import <Foundation/Foundation.h>
 #import "WXModuleProtocol.h"
 
+__attribute__ ((deprecated("Use WXResourceRequestHandler instead")))
 @protocol WXNetworkProtocol <NSObject>
 
 /**

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Protocol/WXURLRewriteProtocol.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Protocol/WXURLRewriteProtocol.h b/ios/sdk/WeexSDK/Sources/Protocol/WXURLRewriteProtocol.h
index a48f8a0..9f065ad 100644
--- a/ios/sdk/WeexSDK/Sources/Protocol/WXURLRewriteProtocol.h
+++ b/ios/sdk/WeexSDK/Sources/Protocol/WXURLRewriteProtocol.h
@@ -7,18 +7,10 @@
  */
 
 #import <Foundation/Foundation.h>
+#import "WXResourceRequest.h"
 
 @class WXSDKInstance;
 
-typedef enum : NSUInteger {
-    WXResourceTypeBundle,
-    WXResourceTypeImage,
-    WXResourceTypeFont,
-    WXResourceTypeVideo,
-    WXResourceTypeLink,
-    WXResourceTypeOthers
-} WXResourceType;
-
 #define WX_REWRITE_URL(url, resourceType, instance, newUrl)\
 do {\
     (*newUrl) = nil;\

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Utility/WXConvert.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Utility/WXConvert.h b/ios/sdk/WeexSDK/Sources/Utility/WXConvert.h
index c502229..3005c82 100644
--- a/ios/sdk/WeexSDK/Sources/Utility/WXConvert.h
+++ b/ios/sdk/WeexSDK/Sources/Utility/WXConvert.h
@@ -24,7 +24,8 @@
  *  750px Adaptive
  */
 typedef CGFloat WXPixelType;
-+ (WXPixelType)WXPixelType:(id)value;
+// @prameter scaleFactor: please use weexInstance's pixelScaleFactor property
++ (WXPixelType)WXPixelType:(id)value scaleFactor:(CGFloat)scaleFactor;
 
 + (css_flex_direction_t)css_flex_direction_t:(id)value;
 + (css_align_t)css_align_t:(id)value;
@@ -44,15 +45,32 @@ typedef BOOL WXClipType;
 + (WXPositionType)WXPositionType:(id)value;
 
 + (WXTextStyle)WXTextStyle:(id)value;
-+ (WXTextWeight)WXTextWeight:(id)value;
+/**
+ * @abstract UIFontWeightRegular ,UIFontWeightBold,etc are not support by the system which is less than 8.2. weex sdk set the float value.
+ *
+ * @param value, support normal,blod,100,200,300,400,500,600,700,800,900
+ *
+ * @return A float value.
+ *
+ */
++ (CGFloat)WXTextWeight:(id)value;
 + (WXTextDecoration)WXTextDecoration:(id)value;
 + (NSTextAlignment)NSTextAlignment:(id)value;
 
 + (WXScrollDirection)WXScrollDirection:(id)value;
++ (UITableViewRowAnimation)UITableViewRowAnimation:(id)value;
 
 + (UIViewAnimationOptions)UIViewAnimationTimingFunction:(id)value;
 + (CAMediaTimingFunction *)CAMediaTimingFunction:(id)value;
 
 + (WXVisibility)WXVisibility:(id)value;
 
++ (WXGradientType)gradientType:(id)value;
+
+@end
+
+@interface WXConvert (Deprecated)
+
++ (WXPixelType)WXPixelType:(id)value DEPRECATED_MSG_ATTRIBUTE("Use [WXConvert WXPixelType:scaleFactor:] instead");
+
 @end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Utility/WXConvert.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Utility/WXConvert.m b/ios/sdk/WeexSDK/Sources/Utility/WXConvert.m
index ecb2fea..cc76c5e 100644
--- a/ios/sdk/WeexSDK/Sources/Utility/WXConvert.m
+++ b/ios/sdk/WeexSDK/Sources/Utility/WXConvert.m
@@ -70,11 +70,11 @@ WX_NUMBER_CONVERT(NSUInteger, unsignedIntegerValue)
     return nil;
 }
 
-+ (WXPixelType)WXPixelType:(id)value
++ (WXPixelType)WXPixelType:(id)value scaleFactor:(CGFloat)scaleFactor
 {
     CGFloat pixel = [self CGFloat:value];
     
-    return pixel * WXScreenResizeRadio();
+    return pixel * scaleFactor;
 }
 
 #pragma mark CSS Layout
@@ -478,16 +478,35 @@ WX_NUMBER_CONVERT(NSUInteger, unsignedIntegerValue)
     return WXTextStyleNormal;
 }
 
-+ (WXTextWeight)WXTextWeight:(id)value
++ (CGFloat)WXTextWeight:(id)value
 {
     if([value isKindOfClass:[NSString class]]){
         NSString *string = (NSString *)value;
         if ([string isEqualToString:@"normal"])
-            return WXTextWeightNormal;
+            return WX_SYS_VERSION_LESS_THAN(@"8.2")?0:UIFontWeightRegular;
         else if ([string isEqualToString:@"bold"])
-            return WXTextWeightBold;
+            return WX_SYS_VERSION_LESS_THAN(@"8.2")?0.4:UIFontWeightBold;
+        else if ([string isEqualToString:@"100"])
+            return WX_SYS_VERSION_LESS_THAN(@"8.2")?-0.8:UIFontWeightUltraLight;
+        else if ([string isEqualToString:@"200"])
+            return WX_SYS_VERSION_LESS_THAN(@"8.2")?-0.6:UIFontWeightThin;
+        else if ([string isEqualToString:@"300"])
+            return WX_SYS_VERSION_LESS_THAN(@"8.2")?-0.4:UIFontWeightLight;
+        else if ([string isEqualToString:@"400"])
+            return WX_SYS_VERSION_LESS_THAN(@"8.2")?0:UIFontWeightRegular;
+        else if ([string isEqualToString:@"500"])
+            return WX_SYS_VERSION_LESS_THAN(@"8.2")?0.23:UIFontWeightMedium;
+        else if ([string isEqualToString:@"600"])
+            return WX_SYS_VERSION_LESS_THAN(@"8.2")?0.3:UIFontWeightSemibold;
+        else if ([string isEqualToString:@"700"])
+            return WX_SYS_VERSION_LESS_THAN(@"8.2")?0.4:UIFontWeightBold;
+        else if ([string isEqualToString:@"800"])
+            return WX_SYS_VERSION_LESS_THAN(@"8.2")?0.56:UIFontWeightHeavy;
+        else if ([string isEqualToString:@"900"])
+            return WX_SYS_VERSION_LESS_THAN(@"8.2")?0.62:UIFontWeightBlack;
+
     }
-    return WXTextWeightNormal;
+    return WX_SYS_VERSION_LESS_THAN(@"8.2")?0:UIFontWeightRegular;
 }
 
 + (WXTextDecoration)WXTextDecoration:(id)value
@@ -567,6 +586,20 @@ WX_NUMBER_CONVERT(NSUInteger, unsignedIntegerValue)
     return WXScrollDirectionVertical;
 }
 
++ (UITableViewRowAnimation)UITableViewRowAnimation:(id)value
+{
+    if ([value isKindOfClass:[NSString class]]) {
+        NSString *string = (NSString *)value;
+        if ([string isEqualToString:@"none"]) {
+            return UITableViewRowAnimationNone;
+        } else if ([string isEqualToString:@"default"]) {
+            return UITableViewRowAnimationFade;
+        }
+    }
+    
+    return UITableViewRowAnimationNone;
+}
+
 #pragma mark Animation
 
 + (UIViewAnimationOptions)UIViewAnimationTimingFunction:(id)value
@@ -636,4 +669,46 @@ WX_NUMBER_CONVERT(NSUInteger, unsignedIntegerValue)
     return  WXVisibilityShow;
 }
 
+#pragma mark Gradient Color
+
++ (WXGradientType)gradientType:(id)value
+{
+    WXGradientType type = WXGradientTypeToRight;
+    
+    if ([value isKindOfClass:[NSString class]]) {
+        NSString *string = (NSString *)value;
+        
+        if ([string isEqualToString:@"totop"]) {
+            type = WXGradientTypeToTop;
+        }
+        else if ([string isEqualToString:@"tobottom"]) {
+            type = WXGradientTypeToBottom;
+        }
+        else if ([string isEqualToString:@"toleft"]) {
+            type = WXGradientTypeToLeft;
+        }
+        if ([string isEqualToString:@"toright"]) {
+            type = WXGradientTypeToRight;
+        }
+        else if ([string isEqualToString:@"totopleft"]) {
+            type = WXGradientTypeToTopleft;
+        }
+        else if ([string isEqualToString:@"tobottomright"]) {
+            type = WXGradientTypeToBottomright;
+        }
+    }
+    return type;
+}
+
+@end
+
+@implementation WXConvert (Deprecated)
+
++ (WXPixelType)WXPixelType:(id)value
+{
+    CGFloat pixel = [self CGFloat:value];
+    
+    return pixel * WXScreenResizeRadio();
+}
+
 @end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/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 9d39a48..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")))
@@ -34,7 +34,7 @@
 
 #define WX_SDK_ROOT_REF     @"_root"
 
-#define WX_TEXT_FONT_SIZE   (32.0 * WXScreenResizeRadio())
+#define WX_TEXT_FONT_SIZE   (32.0 * self.weexInstance.pixelScaleFactor)
 
 #define WX_UPDATE_CONFIG(prefix, name, configs) \
 NSString *selStr = [NSString stringWithFormat:@"%@_%@", prefix, name];\
@@ -62,6 +62,10 @@ parts = [parts subarrayWithRange:(NSRange){0, parts.count - 1}];\
 
 #define WX_ERROR_DOMAIN @"WXErrorDomain"
 
+#define WX_APPLICATION_WILL_RESIGN_ACTIVE @"WXApplicationWillResignActiveEvent"
+
+#define WX_APPLICATION_DID_BECOME_ACTIVE @"WXApplicationDidBecomeActiveEvent"
+
 #define WX_INSTANCE_NOTIFICATION_UPDATE_STATE @"WXInstUpdateState"
 
 #define WX_COMPONENT_THREAD_NAME @"com.taobao.weex.component"
@@ -70,16 +74,25 @@ parts = [parts subarrayWithRange:(NSRange){0, parts.count - 1}];\
 
 #define WX_FONT_DOWNLOAD_DIR [[WXUtility cacheDirectory] stringByAppendingPathComponent:[NSString stringWithFormat:@"wxdownload"]]
 
+#define WX_EXPORT_METHOD_INTERNAL(method, token) \
++ (NSString *)WX_CONCAT_WRAPPER(token, __LINE__) { \
+    return NSStringFromSelector(method); \
+}
+
+#define WX_MODULE_EVENT_FIRE_NOTIFICATION  @"WX_MODULE_EVENT_FIRE_NOTIFICATION"
+
 /**
  *  @abstract export public method
  */
+#define WX_EXPORT_METHOD(method) WX_EXPORT_METHOD_INTERNAL(method,wx_export_method_)
 
-#define WX_EXPORT_METHOD(method) \
-+ (NSString *)WX_CONCAT_WRAPPER(wx_export_method_, __LINE__) { \
-return NSStringFromSelector(method); \
-}
+/**
+ *  @abstract export public method, support sync return value
+ *  @warning the method can only be called on js thread
+ */
+#define WX_EXPORT_METHOD_SYNC(method) WX_EXPORT_METHOD_INTERNAL(method,wx_export_method_sync_)
 
-/** extern "C" makes a function-name in C++ have 'C' linkage (compiler does not mangle the name) 
+/** extern "C" makes a function-name in C++ have 'C' linkage (compiler does not mangle the name)
  * so that client C code can link to (i.e use) your function using a 'C' compatible header file that contains just the declaration of your function.
  *  http://stackoverflow.com/questions/1041866/in-c-source-what-is-the-effect-of-extern-c
  */

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Utility/WXType.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Utility/WXType.h b/ios/sdk/WeexSDK/Sources/Utility/WXType.h
index 8043cc2..e00878d 100644
--- a/ios/sdk/WeexSDK/Sources/Utility/WXType.h
+++ b/ios/sdk/WeexSDK/Sources/Utility/WXType.h
@@ -20,11 +20,6 @@ typedef NS_ENUM(NSUInteger, WXTextStyle) {
     WXTextStyleItalic
 };
 
-typedef NS_ENUM(NSUInteger, WXTextWeight) {
-    WXTextWeightNormal = 0,
-    WXTextWeightBold,
-};
-
 typedef NS_ENUM(NSInteger, WXTextDecoration) {
     WXTextDecorationNone = 0,
     WXTextDecorationUnderline,
@@ -63,3 +58,11 @@ typedef NS_ENUM(NSInteger, WXPositionType) {
     WXPositionTypeFixed
 };
 
+typedef NS_ENUM(NSInteger, WXGradientType) {
+    WXGradientTypeToTop = 0,
+    WXGradientTypeToBottom,
+    WXGradientTypeToLeft,
+    WXGradientTypeToRight,
+    WXGradientTypeToTopleft,
+    WXGradientTypeToBottomright,
+};



[31/50] [abbrv] incubator-weex git commit: * [doc] Update gesture.md

Posted by ji...@apache.org.
* [doc] Update gesture.md

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

Branch: refs/heads/master
Commit: 54489e41c1772f08dce372185b78be8047b60242
Parents: 86c8657
Author: Yun Dong <yu...@gmail.com>
Authored: Thu Feb 16 17:54:14 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Thu Feb 16 17:54:14 2017 +0800

----------------------------------------------------------------------
 doc/source/references/gesture.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/54489e41/doc/source/references/gesture.md
----------------------------------------------------------------------
diff --git a/doc/source/references/gesture.md b/doc/source/references/gesture.md
index 147aec8..eae045a 100644
--- a/doc/source/references/gesture.md
+++ b/doc/source/references/gesture.md
@@ -23,7 +23,7 @@ For now, there are four types of gestures:
 	* `panstart`
 	* `panmove`
 	* `panend`
-* **Horizontal/Vertical Pan** <span class="weex-version">0.10</span> . Mainly used for cell swipe gestures before conflict resolving system is completed. start/move/end state of the gesture will be passed by `state` property. **Note**: These gestures are in conflict with click event on Android currently.
+* **Horizontal/Vertical Pan** <span class="api-version">v0.10+</span> . Mainly used for cell swipe gestures before conflict resolving system is completed. start/move/end state of the gesture will be passed by `state` property. **Note**: These gestures are in conflict with click event on Android currently.
   * `horizontalpan`
   * `verticalpan`
 * **Swipe**. Swipe is fired when user swipe a touch point on the screen. A serial of motion will only trigger one Swipe gesture.
@@ -53,4 +53,4 @@ The following properties can be used in gesture callback:
 * `screenY`. The Y coordinate of the touch point relative to the top edge of the screen.
 
 ## Constrain
-Currently, Weex Android do not support listening to gesture on `scroller`, `list` and `webview`, as it would lead a large amount of event conflicting.
\ No newline at end of file
+Currently, Weex Android do not support listening to gesture on `scroller`, `list` and `webview`, as it would lead a large amount of event conflicting.


[34/50] [abbrv] incubator-weex git commit: * [doc] updated guide/intro/web-dev-exp

Posted by ji...@apache.org.
* [doc] updated guide/intro/web-dev-exp


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

Branch: refs/heads/master
Commit: 0fb4fd91b70e092b38531be22606f2d77d33759c
Parents: f968607
Author: Jinjiang <zh...@me.com>
Authored: Thu Feb 16 18:16:33 2017 +0800
Committer: Jinjiang <zh...@me.com>
Committed: Thu Feb 16 18:33:11 2017 +0800

----------------------------------------------------------------------
 doc/source/cn/guide/intro/web-dev-experience.md | 20 ++++++---------
 doc/source/guide/intro/web-dev-experience.md    | 27 +++++++++++++++++++-
 2 files changed, 34 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/0fb4fd91/doc/source/cn/guide/intro/web-dev-experience.md
----------------------------------------------------------------------
diff --git a/doc/source/cn/guide/intro/web-dev-experience.md b/doc/source/cn/guide/intro/web-dev-experience.md
index 12acf86..03d33e4 100644
--- a/doc/source/cn/guide/intro/web-dev-experience.md
+++ b/doc/source/cn/guide/intro/web-dev-experience.md
@@ -9,7 +9,7 @@ version: 2.1
 
 ## \u4ec0\u4e48\u662f Web \u5f00\u53d1\u4f53\u9a8c
 
-\u57fa\u4e8e Weex \u7684\u5f00\u53d1\u4f53\u9a8c\u548c web \u7684\u5f00\u53d1\u4f53\u9a8c\u662f\u975e\u5e38\u63a5\u8fd1\u7684\uff0c\u6211\u4eec\u9009\u62e9\u901a\u8fc7 HTML \u6216\u7c7b HTML \u6a21\u677f\u7684\u65b9\u5f0f\u6765\u63cf\u8ff0\u754c\u9762\u7684\u7ed3\u6784\u548c\u5185\u5bb9\uff0c\u901a\u8fc7 CSS \u7684\u65b9\u5f0f\u63cf\u8ff0\u754c\u9762\u7684\u5c55\u73b0\u5f62\u5f0f\uff0c\u7528 JavaScript \u6765\u63cf\u8ff0\u7528\u6237\u884c\u4e3a\u548c\u4e1a\u52a1\u903b\u8f91\u3002\u5e76\u4e14\u5c06\u521b\u5efa\u3001\u5f00\u53d1\u3001\u8c03\u8bd5\u3001\u90e8\u7f72\u4e00\u4e2a\u7f51\u9875\u7684\u5de5\u7a0b\u673a\u5236\u4e5f\u5f15\u5165\u4e86 Weex \u5f00\u53d1\u5f53\u4e2d\u3002
+Weex \u7684\u5f00\u53d1\u4f53\u9a8c\u548c web \u7684\u5f00\u53d1\u4f53\u9a8c\u662f\u975e\u5e38\u63a5\u8fd1\u7684\uff0c\u5b83\u901a\u8fc7 HTML \u6216\u57fa\u4e8e HTML \u6a21\u677f\u6765\u63cf\u8ff0\u754c\u9762\u7684\u7ed3\u6784\u548c\u5185\u5bb9\uff0c\u901a\u8fc7 CSS \u7684\u65b9\u5f0f\u63cf\u8ff0\u754c\u9762\u7684\u5c55\u73b0\u5f62\u5f0f\uff0c\u7528 JavaScript \u6765\u63cf\u8ff0\u7528\u6237\u884c\u4e3a\u548c\u4e1a\u52a1\u903b\u8f91\u3002\u540c\u65f6\u6709\u5b8c\u6574\u7684\u5de5\u7a0b\u673a\u5236\uff0c\u5982\u521b\u5efa\u3001\u5f00\u53d1\u3001\u8c03\u8bd5\u3001\u90e8\u7f72\u3002
 
 ## \u4e3a\u4ec0\u4e48\u9009\u62e9 Web \u5f00\u53d1\u4f53\u9a8c
 
@@ -25,18 +25,14 @@ version: 2.1
 
 \u6211\u4eec\u4ece\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\u8fdb\u884c\u4ecb\u7ecd\u548c\u68b3\u7406\uff1a
 
-* HTML \u6807\u7b7e\uff1a\u76ee\u524d Weex \u652f\u6301\u4e86\u57fa\u672c\u7684\u5bb9\u5668 (div)\u3001\u6587\u672c (text)\u3001\u56fe\u7247 (image)\u3001\u89c6\u9891 (video) \u7b49\u7ec4\u4ef6\uff0cHTML \u4e2d\u51e0\u4e4e\u6240\u6709\u7684\u5757\u7ea7\u6807\u7b7e\u90fd\u53ef\u4ee5\u901a\u8fc7\u5bb9\u5668\u7ec4\u4ef6\u8fdb\u884c\u81ea\u5b9a\u4e49\u6a21\u62df\uff0cinline \u7684\u6807\u7b7e\u5219\u53ef\u4ee5\u901a\u8fc7\u6587\u672c\u7ec4\u4ef6\u8fdb\u884c\u81ea\u5b9a\u4e49\u6a21\u62df\uff0c\u53e6\u5916 Weex \u8fd8\u652f\u6301\u4e86 input/textarea \u8fd9\u6837\u7684\u8868\u5355\u578b\u7ec4\u4ef6
-* CSS\uff1aWeex \u652f\u6301\u4e86\u90e8\u5206\u5e38\u7528\u7684 CSS \u5c5e\u6027\u3001\u503c\u7c7b\u578b\u548c\u5355\u4f4d\uff0c\u5e76\u4e14\u4f1a\u6839\u636e\u7528\u6237\u53cd\u9988\u548c\u5728 web \u4e2d\u7684\u4f7f\u7528\u9891\u5ea6\u9646\u7eed\u652f\u6301\u66f4\u591a
-* JavaScript\uff1a\u76ee\u524d Weex \u63d0\u4f9b\u4e86\u4e00\u5957\u7b80\u5316\u7248\u7684 DOM APIs\uff0c\u7528\u6765\u64cd\u4f5c\u539f\u751f\u754c\u9762\uff0c\u540c\u65f6 Weex \u5728\u9646\u7eed\u652f\u6301\u66f4\u591a\u7684 W3C Device APIs
+* HTML \u6807\u7b7e\uff1a\u76ee\u524d Weex \u652f\u6301\u4e86\u57fa\u672c\u7684\u5bb9\u5668 (div)\u3001\u6587\u672c (text)\u3001\u56fe\u7247 (image)\u3001\u89c6\u9891 (video) \u7b49\u7ec4\u4ef6\uff0cHTML \u4e2d\u51e0\u4e4e\u6240\u6709\u7684\u5757\u7ea7\u6807\u7b7e\u90fd\u53ef\u4ee5\u901a\u8fc7\u5bb9\u5668\u7ec4\u4ef6\u8fdb\u884c\u81ea\u5b9a\u4e49\u6a21\u62df\uff0cinline \u7684\u6807\u7b7e\u5219\u53ef\u4ee5\u901a\u8fc7\u6587\u672c\u7ec4\u4ef6\u8fdb\u884c\u81ea\u5b9a\u4e49\u6a21\u62df\uff0c\u53e6\u5916 Weex \u8fd8\u652f\u6301\u4e86 input/textarea \u8fd9\u6837\u7684\u8868\u5355\u578b\u7ec4\u4ef6\u3002
+* CSS\uff1aWeex \u652f\u6301\u4e86\u90e8\u5206\u5e38\u7528\u7684 CSS \u5c5e\u6027\u3001\u503c\u7c7b\u578b\u548c\u5355\u4f4d\uff0c\u5e76\u4e14\u4f1a\u6839\u636e\u7528\u6237\u53cd\u9988\u548c\u5728 web \u4e2d\u7684\u4f7f\u7528\u9891\u5ea6\u9646\u7eed\u652f\u6301\u66f4\u591a\u3002
+* JavaScript\uff1a\u76ee\u524d Weex \u63d0\u4f9b\u4e86\u4e00\u5957\u7b80\u5316\u7248\u7684 DOM APIs\uff0c\u7528\u6765\u64cd\u4f5c\u539f\u751f\u754c\u9762\uff0c\u540c\u65f6 Weex \u5728\u9646\u7eed\u652f\u6301\u66f4\u591a\u7684 W3C Device APIs\u3002
 * \u5728\u6846\u67b6\u65b9\u9762\uff0cWeex \u5b98\u65b9\u652f\u6301\u4e86 Vue 2.0\uff0c\u4ee5\u53ca\u76f8\u5173\u7684 vuex, vue-router \u7b49\uff0c\u540c\u65f6\u5f00\u53d1\u8005\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u5404\u79cd\u7b2c\u4e09\u65b9 JavaScript \u5de5\u5177\u5e93\u3002
 * \u5728\u5de5\u7a0b\u65b9\u9762\uff0cWeex \u63a8\u8350 npm \u5305\u7ba1\u7406\u5de5\u5177\uff0c\u4e5f\u63a8\u8350\u7528 webpack \u8fdb\u884c JS bundle \u6253\u5305\uff0c\u5e76\u63d0\u4f9b\u4e86 weex-devtool \u5f00\u53d1\u5de5\u5177\uff0c\u8ba9\u5f00\u53d1\u8005\u53ef\u4ee5\u50cf\u8c03\u8bd5 Chrome \u4e00\u6837\u8c03\u8bd5 Weex \u539f\u751f\u5e94\u7528\uff0c\u540c\u65f6 Weex \u7684\u9875\u9762\u53d1\u5e03\u7cfb\u7edf\u3001\u5ba2\u6237\u7aef\u7f13\u5b58\u673a\u5236\u90fd\u5c0a\u91cd\u76ee\u524d Web \u7684\u6700\u4f73\u5b9e\u8df5\u3002
 
-<!-- html \u652f\u6301\u60c5\u51b5 -->
+**\u76f8\u5173\u94fe\u63a5**
 
-<!-- css \u652f\u6301\u60c5\u51b5 -->
-
-<!-- js apis \u652f\u6301\u60c5\u51b5 -->
-
-<!-- vue -->
-
-<!-- weex-devtool -->
\ No newline at end of file
+* [Weex \u548c web \u6807\u51c6\u7684\u5dee\u5f02](../../references/web-standards.html)
+* [\u4f7f\u7528 Vue.js](./using-vue.html)
+* [\u4f7f\u7528 Devtools](./devtools.html)

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/0fb4fd91/doc/source/guide/intro/web-dev-experience.md
----------------------------------------------------------------------
diff --git a/doc/source/guide/intro/web-dev-experience.md b/doc/source/guide/intro/web-dev-experience.md
index a94a64c..026a02a 100644
--- a/doc/source/guide/intro/web-dev-experience.md
+++ b/doc/source/guide/intro/web-dev-experience.md
@@ -7,5 +7,30 @@ version: 2.1
 
 # Web Dev Experience
 
+## What is Web Dev Experience?
 
-Work in progress.
\ No newline at end of file
+Weex dev experience is very close to web dev experience. It describes the UI structure and content with HTML or HTML-based template, describes the UI style with CSS, and describes user behavior and business logic with JavaScript. And it has completed project mechanism.
+
+## Why We Choose Web Dev Experience?
+
+1. There are a huge number of web developers in the community today. Weex can give more web developers abilities to build high-performance and great-experienced mobile apps.
+2. Web development itself has very high efficiency and flexibility. And Weex is committed to solve the dynamic requirement of mobile apps. They just match each other.
+3. Web standards and web dev experience is built by a lot of outstanding technology companies together. It has very high quality assurance.
+4. Standard itself is a force. Base on standards, respect for standards, close to the standard means that there are more possibilities.
+5. The eco-system and community of web today are very prosperous. There are many mature tools, libraries, systems, best practices to be used.
+
+## How Does Weex Support Web Standard?
+
+We have the following aspects to sort out:
+
+* HTML tags: Weex currently supports basic container (div), text, image, video and other components. And almost all of HTML block-level tags can be simulated through the custom container components. Inline-level tags can be simulated  through the custom text components. And Weex also supports some form components such as input / textarea.
+* CSS: Weex supports some commonly used CSS properties, values and units. We will continue to support more based on user feedback and the usage frequency in web.
+* JavaScript: Weex currently offers a simplified version of the DOM APIs for operating the native UI. And Weex will continue to support more W3C Device APIs.
+* About frameworks, Weex officially build Vue 2.0 in. and support its related libs such as vuex, vue-router, etc. At the same time developers can directly use all kinds of third-party JavaScript libs.
+* About engineering, we recommend using npm to pack and manage deps. And we recommend webpack for the JS bundle package. Also we provide weex-devtool, which make developers debug native app just like in Chrome devtools. Weex also is friendly to current mainstream web page publishing system, caching mechanism and other best practices.
+
+**Links**
+
+* [Differences between Weex and web standard](../../references/web-standards.html)
+* [Using Vue.js](./using-vue.html)
+* [Using Devtools](./devtools.html)


[13/50] [abbrv] incubator-weex git commit: V0.10.0 stable gitlab (#178)

Posted by ji...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Bridge/JSValue+Weex.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Bridge/JSValue+Weex.h b/ios/sdk/WeexSDK/Sources/Bridge/JSValue+Weex.h
new file mode 100644
index 0000000..3270a95
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Bridge/JSValue+Weex.h
@@ -0,0 +1,15 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+
+#import <JavaScriptCore/JavaScriptCore.h>
+
+@interface JSValue (Weex)
+
++ (JSValue *)wx_valueWithReturnValueFromInvocation:(NSInvocation *)invocation inContext:(JSContext *)context;
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Bridge/JSValue+Weex.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Bridge/JSValue+Weex.m b/ios/sdk/WeexSDK/Sources/Bridge/JSValue+Weex.m
new file mode 100644
index 0000000..3bc3dda
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Bridge/JSValue+Weex.m
@@ -0,0 +1,90 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+
+#import "JSValue+Weex.h"
+#import <objc/runtime.h>
+
+@implementation JSValue (Weex)
+
++ (JSValue *)wx_valueWithReturnValueFromInvocation:(NSInvocation *)invocation inContext:(JSContext *)context
+{
+    if (!invocation || !context) {
+        return nil;
+    }
+    
+    const char * returnType = [invocation.methodSignature methodReturnType];
+    
+    JSValue *returnValue;
+    switch (returnType[0] == _C_CONST ? returnType[1] : returnType[0]) {
+        case _C_VOID: {
+            // 1.void
+            returnValue = [JSValue valueWithUndefinedInContext:context];
+            break;
+        }
+        
+        case _C_ID: {
+            // 2.id
+            void *value;
+            [invocation getReturnValue:&value];
+            id object = (__bridge id)value;
+        
+            returnValue = [JSValue valueWithObject:[object copy] inContext:context];
+            break;
+        }
+        
+#define WX_JS_VALUE_RET_CASE(typeString, type) \
+        case typeString: {                      \
+            type value;                         \
+            [invocation getReturnValue:&value];  \
+            returnValue = [JSValue valueWithObject:@(value) inContext:context]; \
+            break; \
+        }
+        // 3.number
+        WX_JS_VALUE_RET_CASE(_C_CHR, char)
+        WX_JS_VALUE_RET_CASE(_C_UCHR, unsigned char)
+        WX_JS_VALUE_RET_CASE(_C_SHT, short)
+        WX_JS_VALUE_RET_CASE(_C_USHT, unsigned short)
+        WX_JS_VALUE_RET_CASE(_C_INT, int)
+        WX_JS_VALUE_RET_CASE(_C_UINT, unsigned int)
+        WX_JS_VALUE_RET_CASE(_C_LNG, long)
+        WX_JS_VALUE_RET_CASE(_C_ULNG, unsigned long)
+        WX_JS_VALUE_RET_CASE(_C_LNG_LNG, long long)
+        WX_JS_VALUE_RET_CASE(_C_ULNG_LNG, unsigned long long)
+        WX_JS_VALUE_RET_CASE(_C_FLT, float)
+        WX_JS_VALUE_RET_CASE(_C_DBL, double)
+        WX_JS_VALUE_RET_CASE(_C_BOOL, BOOL)
+            
+        case _C_STRUCT_B: {
+            NSString *typeString = [NSString stringWithUTF8String:returnType];
+            
+#define WX_JS_VALUE_RET_STRUCT(_type, _methodName)                             \
+            if ([typeString rangeOfString:@#_type].location != NSNotFound) {   \
+                _type value;                                                   \
+                [invocation getReturnValue:&value];                            \
+                returnValue = [JSValue _methodName:value inContext:context]; \
+                break;                                                         \
+            }
+            // 4.struct
+            WX_JS_VALUE_RET_STRUCT(CGRect, valueWithRect)
+            WX_JS_VALUE_RET_STRUCT(CGPoint, valueWithPoint)
+            WX_JS_VALUE_RET_STRUCT(CGSize, valueWithSize)
+            WX_JS_VALUE_RET_STRUCT(NSRange, valueWithRange)
+            
+        }
+        case _C_CHARPTR:
+        case _C_PTR:
+        case _C_CLASS: {
+            returnValue = [JSValue valueWithUndefinedInContext:context];
+            break;
+        }
+    }
+    
+    return returnValue;
+}
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.h b/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.h
index 4388bdf..1f4ee27 100644
--- a/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.h
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.h
@@ -8,7 +8,7 @@
 
 #import <Foundation/Foundation.h>
 
-@class WXBridgeMethod;
+@class WXCallJSMethod;
 @class WXSDKInstance;
 
 @interface WXBridgeContext : NSObject
@@ -62,7 +62,7 @@
  *  Execute JS Method
  *  @param method    :   object of bridge method
  **/
-- (void)executeJsMethod:(WXBridgeMethod *)method;
+- (void)executeJsMethod:(WXCallJSMethod *)method;
 /**
  *  Register Modules Method
  *  @param modules   :   module list
@@ -70,6 +70,13 @@
 - (void)registerModules:(NSDictionary *)modules;
 
 /**
+ *  Execute JS Service
+ *  @param method    :   JS services name
+ *  @param method    :   JS services script
+ **/
+- (void)executeJsService:(NSString *)script withName: (NSString *)name;
+
+/**
  *  Register Components Method
  *  @param components:   component list
  **/

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m b/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m
index 79e22f3..9eae7de 100644
--- a/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m
@@ -12,7 +12,6 @@
 #import "WXDebugLoggerBridge.h"
 #import "WXLog.h"
 #import "WXUtility.h"
-#import "WXBridgeMethod.h"
 #import "WXModuleFactory.h"
 #import "WXModuleProtocol.h"
 #import "WXUtility.h"
@@ -21,11 +20,14 @@
 #import "WXAssert.h"
 #import "WXSDKManager.h"
 #import "WXDebugTool.h"
-#import "WXModuleManager.h"
 #import "WXSDKInstance_private.h"
 #import "WXThreadSafeMutableArray.h"
 #import "WXAppConfiguration.h"
 #import "WXInvocationConfig.h"
+#import "WXComponentMethod.h"
+#import "WXModuleMethod.h"
+#import "WXCallJSMethod.h"
+#import "WXSDKInstance_private.h"
 
 #define SuppressPerformSelectorLeakWarning(Stuff) \
 do { \
@@ -48,6 +50,8 @@ _Pragma("clang diagnostic pop") \
 @property (nonatomic) BOOL frameworkLoadFinished;
 //store some methods temporarily before JSFramework is loaded
 @property (nonatomic, strong) NSMutableArray *methodQueue;
+// store template service
+@property (nonatomic, strong) NSMutableArray *jsServiceQueue;
 
 @end
 
@@ -59,6 +63,7 @@ _Pragma("clang diagnostic pop") \
     if (self) {
         _methodQueue = [NSMutableArray new];
         _frameworkLoadFinished = NO;
+        _jsServiceQueue = [NSMutableArray new];
     }
     return self;
 }
@@ -80,12 +85,20 @@ _Pragma("clang diagnostic pop") \
     }
     
     _jsBridge = _debugJS ? [NSClassFromString(@"WXDebugger") alloc] : [[WXJSCoreBridge alloc] init];
-     __weak typeof(self) weakSelf = self;
+    
+    [self registerGlobalFuntions];
+    
+    return _jsBridge;
+}
+
+- (void)registerGlobalFuntions
+{
+    __weak typeof(self) weakSelf = self;
     [_jsBridge registerCallNative:^NSInteger(NSString *instance, NSArray *tasks, NSString *callback) {
         return [weakSelf invokeNative:instance tasks:tasks callback:callback];
     }];
     [_jsBridge registerCallAddElement:^NSInteger(NSString *instanceId, NSString *parentRef, NSDictionary *elementData, NSInteger index) {
-
+        
         // Temporary here , in order to improve performance, will be refactored next version.
         WXSDKInstance *instance = [WXSDKManager instanceForID:instanceId];
         
@@ -106,7 +119,24 @@ _Pragma("clang diagnostic pop") \
         return 0;
     }];
     
-    return _jsBridge;
+    [_jsBridge registerCallNativeModule:^NSInvocation*(NSString *instanceId, NSString *moduleName, NSString *methodName, NSArray *arguments, NSDictionary *options) {
+        
+        WXSDKInstance *instance = [WXSDKManager instanceForID:instanceId];
+        
+        if (!instance) {
+            WXLogInfo(@"instance not found for callNativeModule:%@.%@, maybe already destroyed", moduleName, methodName);
+            return nil;
+        }
+        
+        WXModuleMethod *method = [[WXModuleMethod alloc] initWithModuleName:moduleName methodName:methodName arguments:arguments instance:instance];
+        return [method invoke];
+    }];
+    
+    [_jsBridge registerCallNativeComponent:^void(NSString *instanceId, NSString *componentRef, NSString *methodName, NSArray *args, NSDictionary *options) {
+        WXSDKInstance *instance = [WXSDKManager instanceForID:instanceId];
+        WXComponentMethod *method = [[WXComponentMethod alloc] initWithComponentRef:componentRef methodName:methodName arguments:args instance:instance];
+        [method invoke];
+    }];
 }
 
 - (NSMutableArray *)insStack
@@ -141,24 +171,33 @@ _Pragma("clang diagnostic pop") \
 
 #pragma mark JS Bridge Management
 
-- (NSInteger)invokeNative:(NSString *)instance tasks:(NSArray *)tasks callback:(NSString __unused*)callback
+- (NSInteger)invokeNative:(NSString *)instanceId tasks:(NSArray *)tasks callback:(NSString __unused*)callback
 {
     WXAssertBridgeThread();
     
-    if (!instance || !tasks) {
+    if (!instanceId || !tasks) {
         WX_MONITOR_FAIL(WXMTNativeRender, WX_ERR_JSFUNC_PARAM, @"JS call Native params error!");
         return 0;
     }
 
-    if (![WXSDKManager instanceForID:instance]) {
-        WXLogInfo(@"instance already destroyed");
+    WXSDKInstance *instance = [WXSDKManager instanceForID:instanceId];
+    if (!instance) {
+        WXLogInfo(@"instance already destroyed, task ignored");
         return -1;
     }
     
     for (NSDictionary *task in tasks) {
-        WXBridgeMethod *method = [[WXBridgeMethod alloc] initWihData:task];
-        method.instance = instance;
-        [[WXInvocationConfig sharedInstance] dispatchMethod:method];
+        NSString *methodName = task[@"method"];
+        NSArray *arguments = task[@"args"];
+        if (task[@"component"]) {
+            NSString *ref = task[@"ref"];
+            WXComponentMethod *method = [[WXComponentMethod alloc] initWithComponentRef:ref methodName:methodName arguments:arguments instance:instance];
+            [method invoke];
+        } else {
+            NSString *moduleName = task[@"module"];
+            WXModuleMethod *method = [[WXModuleMethod alloc] initWithModuleName:moduleName methodName:methodName arguments:arguments instance:instance];
+            [method invoke];
+        }
     }
     
     [self performSelector:@selector(_sendQueueLoop) withObject:nil];
@@ -255,6 +294,8 @@ _Pragma("clang diagnostic pop") \
         //the JSFramework has been load successfully.
         self.frameworkLoadFinished = YES;
         
+        [self executeAllJsService];
+        
         JSValue *frameworkVersion = [self.jsBridge callJSMethod:@"getJSFMVersion" args:nil];
         if (frameworkVersion && [frameworkVersion isString]) {
             [WXAppConfiguration setJSFrameworkVersion:[frameworkVersion toString]];
@@ -271,7 +312,7 @@ _Pragma("clang diagnostic pop") \
     };
 }
 
-- (void)executeJsMethod:(WXBridgeMethod *)method
+- (void)executeJsMethod:(WXCallJSMethod *)method
 {
     WXAssertBridgeThread();
     
@@ -280,9 +321,9 @@ _Pragma("clang diagnostic pop") \
         return;
     }
     
-    NSMutableArray *sendQueue = self.sendQueue[method.instance];
+    NSMutableArray *sendQueue = self.sendQueue[method.instance.instanceId];
     if (!sendQueue) {
-        WXLogInfo(@"No send queue for instance:%@, may it has been destroyed so method:%@ is ignored", method.instance, method.method);
+        WXLogInfo(@"No send queue for instance:%@, may it has been destroyed so method:%@ is ignored", method.instance, method.methodName);
         return;
     }
     
@@ -290,6 +331,37 @@ _Pragma("clang diagnostic pop") \
     [self performSelector:@selector(_sendQueueLoop) withObject:nil];
 }
 
+- (void)executeAllJsService
+{
+    for(NSDictionary *service in _jsServiceQueue) {
+        NSString *script = [service valueForKey:@"script"];
+        NSString *name = [service valueForKey:@"name"];
+        [self executeJsService:script withName:name];
+    }
+    
+    [_jsServiceQueue removeAllObjects];
+}
+
+- (void)executeJsService:(NSString *)script withName:(NSString *)name
+{
+    if(self.frameworkLoadFinished) {
+        WXAssert(script, @"param script required!");
+        [self.jsBridge executeJavascript:script];
+        
+        if ([self.jsBridge exception]) {
+            NSString *message = [NSString stringWithFormat:@"JSService executes error: %@", [self.jsBridge exception]];
+            WX_MONITOR_FAIL(WXMTJSService, WX_ERR_JSFRAMEWORK_EXECUTE, message);
+        } else {
+            // success
+        }
+    }else {
+        [_jsServiceQueue addObject:@{
+                                     @"name": name,
+                                     @"script": script
+                                     }];
+    }
+}
+
 - (void)registerModules:(NSDictionary *)modules
 {
     WXAssertBridgeThread();
@@ -312,8 +384,7 @@ _Pragma("clang diagnostic pop") \
 {
     if (self.frameworkLoadFinished) {
         [self.jsBridge callJSMethod:method args:args];
-    }
-    else {
+    } else {
         [_methodQueue addObject:@{@"method":method, @"args":args}];
     }
 }
@@ -349,40 +420,30 @@ _Pragma("clang diagnostic pop") \
 
 #pragma mark Private Mehtods
 
-- (WXBridgeMethod *)_methodWithCallback:(NSString *)callback
-{
-    WXAssertBridgeThread();
-    
-    if (!callback) return nil;
-    
-    NSDictionary *method = @{@"module":@"jsBridge", @"method":@"callback", @"args":@[callback]};
-    
-    return [[WXBridgeMethod alloc] initWihData:method];
-}
-
 - (void)_sendQueueLoop
 {
     WXAssertBridgeThread();
     
     BOOL hasTask = NO;
-    NSMutableArray *methods = [NSMutableArray array];
+    NSMutableArray *tasks = [NSMutableArray array];
     NSString *execIns = nil;
     
     for (NSString *instance in self.insStack) {
         NSMutableArray *sendQueue = self.sendQueue[instance];
         if(sendQueue.count > 0){
             hasTask = YES;
-            for(WXBridgeMethod *method in sendQueue){
-                [methods addObject:[method dataDesc]];
+            for(WXCallJSMethod *method in sendQueue){
+                [tasks addObject:[method callJSTask]];
             }
+            
             [sendQueue removeAllObjects];
             execIns = instance;
             break;
         }
     }
     
-    if ([methods count] > 0 && execIns) {
-        [self callJSMethod:@"callJS" args:@[execIns, methods]];
+    if ([tasks count] > 0 && execIns) {
+        [self callJSMethod:@"callJS" args:@[execIns, tasks]];
     }
     
     if (hasTask) {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Bridge/WXCallJSMethod.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXCallJSMethod.h b/ios/sdk/WeexSDK/Sources/Bridge/WXCallJSMethod.h
new file mode 100644
index 0000000..50cdc20
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXCallJSMethod.h
@@ -0,0 +1,20 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+
+#import "WXBridgeMethod.h"
+
+@interface WXCallJSMethod : WXBridgeMethod
+
+- (instancetype)initWithModuleName:(NSString *)moduleName
+                        methodName:(NSString *)methodName
+                         arguments:(NSArray *)arguments
+                          instance:(WXSDKInstance *)instance;
+
+- (NSDictionary *)callJSTask;
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Bridge/WXCallJSMethod.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXCallJSMethod.m b/ios/sdk/WeexSDK/Sources/Bridge/WXCallJSMethod.m
new file mode 100644
index 0000000..ea98885
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXCallJSMethod.m
@@ -0,0 +1,35 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+
+#import "WXCallJSMethod.h"
+
+@implementation WXCallJSMethod
+{
+    NSString *_moduleName;
+}
+
+- (instancetype)initWithModuleName:(NSString *)moduleName
+                        methodName:(NSString *)methodName
+                         arguments:(NSArray *)arguments
+                          instance:(WXSDKInstance *)instance
+{
+    if (self = [super initWithMethodName:methodName arguments:arguments instance:instance]) {
+        _moduleName = moduleName;
+    }
+    
+    return self;
+}
+
+- (NSDictionary *)callJSTask
+{
+    return @{@"module":_moduleName ?: @"",
+             @"method":self.methodName ?: @"",
+             @"args":self.arguments ?: @[]};
+}
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Bridge/WXComponentMethod.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXComponentMethod.h b/ios/sdk/WeexSDK/Sources/Bridge/WXComponentMethod.h
new file mode 100644
index 0000000..5906e09
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXComponentMethod.h
@@ -0,0 +1,21 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+
+#import "WXBridgeMethod.h"
+@class WXComponent;
+
+@interface WXComponentMethod : WXBridgeMethod
+
+- (instancetype)initWithComponentRef:(NSString *)ref
+                          methodName:(NSString *)methodName
+                           arguments:(NSArray *)arguments
+                            instance:(WXSDKInstance *)instance;
+
+- (void)invoke;
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Bridge/WXComponentMethod.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXComponentMethod.m b/ios/sdk/WeexSDK/Sources/Bridge/WXComponentMethod.m
new file mode 100644
index 0000000..e8c5225
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXComponentMethod.m
@@ -0,0 +1,51 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+
+#import "WXComponentMethod.h"
+#import "WXComponentFactory.h"
+#import "WXComponentManager.h"
+#import "WXSDKInstance.h"
+#import "WXLog.h"
+#import "WXUtility.h"
+
+@implementation WXComponentMethod
+{
+    NSString *_componentName;
+    NSString *_componentRef;
+}
+
+- (instancetype)initWithComponentRef:(NSString *)ref
+                          methodName:(NSString *)methodName
+                           arguments:(NSArray *)arguments
+                            instance:(WXSDKInstance *)instance
+{
+    if (self = [super initWithMethodName:methodName arguments:arguments instance:instance]) {
+        _componentRef = ref;
+    }
+    
+    return self;
+}
+
+- (void)invoke
+{
+    WXPerformBlockOnComponentThread(^{
+        WXComponent *component = [self.instance componentForRef:_componentRef];
+        if (!component) {
+            WXLogError(@"component not found for ref:%@, type:%@", _componentRef, _componentName);
+        }
+        SEL selector = [WXComponentFactory methodWithComponentName:component.type withMethod:self.methodName];
+        NSInvocation * invocation = [self invocationWithTarget:component selector:selector];
+        WXPerformBlockOnMainThread(^{
+            [invocation invoke];
+        });
+    });
+    
+    
+}
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Bridge/WXDebugLoggerBridge.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXDebugLoggerBridge.m b/ios/sdk/WeexSDK/Sources/Bridge/WXDebugLoggerBridge.m
index 9a966cd..f9c8702 100644
--- a/ios/sdk/WeexSDK/Sources/Bridge/WXDebugLoggerBridge.m
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXDebugLoggerBridge.m
@@ -108,6 +108,11 @@
 
 #pragma mark - WXBridgeProtocol
 
+- (void)executeJavascript:(NSString *)script
+{
+    [self callJSMethod:@"evalFramework" args:@[script]];
+}
+
 - (void)executeJSFramework:(NSString *)frameworkScript
 {
     [self callJSMethod:@"evalFramework" args:@[frameworkScript]];

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.m b/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.m
index d1c6551..cc43945 100644
--- a/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.m
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.m
@@ -20,6 +20,7 @@
 #import <sys/utsname.h>
 #import <JavaScriptCore/JavaScriptCore.h>
 #import "WXPolyfillSet.h"
+#import "JSValue+Weex.h"
 
 #import <dlfcn.h>
 
@@ -139,11 +140,16 @@
     _jsContext[@"callNative"] = callNativeBlock;
 }
 
+- (void)executeJavascript:(NSString *)script
+{
+    WXAssertParam(script);
+    [_jsContext evaluateScript:script];
+}
+
 - (void)registerCallAddElement:(WXJSCallAddElement)callAddElement
 {
     id callAddElementBlock = ^(JSValue *instanceId, JSValue *ref, JSValue *element, JSValue *index, JSValue *ifCallback) {
         
-        // Temporary here , in order to improve performance, will be refactored next version.
         NSString *instanceIdString = [instanceId toString];
         NSDictionary *componentData = [element toDictionary];
         NSString *parentRef = [ref toString];
@@ -157,6 +163,38 @@
     _jsContext[@"callAddElement"] = callAddElementBlock;
 }
 
+- (void)registerCallNativeModule:(WXJSCallNativeModule)callNativeModuleBlock
+{
+    _jsContext[@"callNativeModule"] = ^JSValue *(JSValue *instanceId, JSValue *moduleName, JSValue *methodName, JSValue *args, JSValue *options) {
+        NSString *instanceIdString = [instanceId toString];
+        NSString *moduleNameString = [moduleName toString];
+        NSString *methodNameString = [methodName toString];
+        NSArray *argsArray = [args toArray];
+        NSDictionary *optionsDic = [options toDictionary];
+        
+        WXLogDebug(@"callNativeModule...%@,%@,%@,%@", instanceIdString, moduleNameString, methodNameString, argsArray);
+        
+        NSInvocation *invocation = callNativeModuleBlock(instanceIdString, moduleNameString, methodNameString, argsArray, optionsDic);
+        JSValue *returnValue = [JSValue wx_valueWithReturnValueFromInvocation:invocation inContext:[JSContext currentContext]];
+        return returnValue;
+    };
+}
+
+- (void)registerCallNativeComponent:(WXJSCallNativeComponent)callNativeComponentBlock
+{
+    _jsContext[@"callNativeComponent"] = ^void(JSValue *instanceId, JSValue *componentName, JSValue *methodName, JSValue *args, JSValue *options) {
+        NSString *instanceIdString = [instanceId toString];
+        NSString *componentNameString = [componentName toString];
+        NSString *methodNameString = [methodName toString];
+        NSArray *argsArray = [args toArray];
+        NSDictionary *optionsDic = [options toDictionary];
+        
+        WXLogDebug(@"callNativeModule...%@,%@,%@,%@", instanceIdString, componentNameString, methodNameString, argsArray);
+        
+        callNativeComponentBlock(instanceIdString, componentNameString, methodNameString, argsArray, optionsDic);
+    };
+}
+
 - (JSValue*)exception
 {
     return _jsContext.exception;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Bridge/WXModuleMethod.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXModuleMethod.h b/ios/sdk/WeexSDK/Sources/Bridge/WXModuleMethod.h
new file mode 100644
index 0000000..1a4107d
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXModuleMethod.h
@@ -0,0 +1,28 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+
+#import "WXBridgeMethod.h"
+
+typedef enum : NSUInteger {
+    WXModuleMethodTypeSync,
+    WXModuleMethodTypeAsync,
+} WXModuleMethodType;
+
+@interface WXModuleMethod : WXBridgeMethod
+
+@property (nonatomic, assign) WXModuleMethodType methodType;
+@property (nonatomic, strong, readonly) NSString *moduleName;
+
+- (instancetype)initWithModuleName:(NSString *)moduleName
+                        methodName:(NSString *)methodName
+                         arguments:(NSArray *)arguments
+                          instance:(WXSDKInstance *)instance;
+
+- (NSInvocation *)invoke;
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/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
new file mode 100644
index 0000000..de07eca
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXModuleMethod.m
@@ -0,0 +1,99 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+
+#import "WXModuleMethod.h"
+#import "WXModuleFactory.h"
+#import "WXMonitor.h"
+#import "WXModuleProtocol.h"
+#import "WXAssert.h"
+#import "WXUtility.h"
+#import "WXSDKInstance_private.h"
+
+@implementation WXModuleMethod
+
+- (instancetype)initWithModuleName:(NSString *)moduleName
+                        methodName:(NSString *)methodName
+                         arguments:(NSArray *)arguments
+                          instance:(WXSDKInstance *)instance
+{
+    if (self = [super initWithMethodName:methodName arguments:arguments instance:instance]) {
+        _moduleName = moduleName;
+    }
+    
+    return self;
+}
+
+- (NSInvocation *)invoke
+{
+    Class moduleClass =  [WXModuleFactory classWithModuleName:_moduleName];
+    if (!moduleClass) {
+        NSString *errorMessage = [NSString stringWithFormat:@"Module\uff1a%@ doesn't exist, maybe it has not been registered", _moduleName];
+        WX_MONITOR_FAIL(WXMTJSBridge, WX_ERR_INVOKE_NATIVE, errorMessage);
+        return nil;
+    }
+    
+    id<WXModuleProtocol> moduleInstance = [self.instance moduleForClass:moduleClass];
+    WXAssert(moduleInstance, @"No instance found for module name:%@, class:%@", _moduleName, moduleClass);
+    BOOL isSync = NO;
+    SEL selector = [WXModuleFactory selectorWithModuleName:self.moduleName methodName:self.methodName isSync:&isSync];
+    if (!selector) {
+        NSString *errorMessage = [NSString stringWithFormat:@"method\uff1a%@ for module:%@ doesn't exist, maybe it has not been registered", self.methodName, _moduleName];
+        WX_MONITOR_FAIL(WXMTJSBridge, WX_ERR_INVOKE_NATIVE, errorMessage);
+        return nil;;
+    }
+    if (![moduleInstance respondsToSelector:selector]) {
+        // if not implement the selector, then dispatch default module method
+        if ([self.methodName isEqualToString:@"addEventListener"]) {
+            [self.instance _addModuleEventObserversWithModuleMethod:self];
+        }
+        if ([self.methodName isEqualToString:@"removeAllEventListeners"]) {
+            [self.instance _removeModuleEventObserverWithModuleMethod:self];
+        }
+        return nil;
+    }
+    
+    NSInvocation *invocation = [self invocationWithTarget:moduleInstance selector:selector];
+    
+    if (isSync) {
+        [invocation invoke];
+        return invocation;
+    } else {
+        [self _dispatchInvovation:invocation moduleInstance:moduleInstance];
+        return nil;
+    }
+}
+
+- (void)_dispatchInvovation:(NSInvocation *)invocation moduleInstance:(id<WXModuleProtocol>)moduleInstance
+{
+    // dispatch to user specified queue or thread, default is main thread
+    dispatch_block_t dipatchBlock = ^ (){
+        [invocation invoke];
+    };
+    
+    NSThread *targetThread = nil;
+    dispatch_queue_t targetQueue = nil;
+    if([moduleInstance respondsToSelector:@selector(targetExecuteQueue)]){
+        targetQueue = [moduleInstance targetExecuteQueue] ?: dispatch_get_main_queue();
+    } else if([moduleInstance respondsToSelector:@selector(targetExecuteThread)]){
+        targetThread = [moduleInstance targetExecuteThread] ?: [NSThread mainThread];
+    } else {
+        targetThread = [NSThread mainThread];
+    }
+    
+    WXAssert(targetQueue || targetThread, @"No queue or thread found for module:%@", moduleInstance);
+    
+    if (targetQueue) {
+        dispatch_async(targetQueue, dipatchBlock);
+    } else {
+        WXPerformBlockOnThread(^{
+            dipatchBlock();
+        }, targetThread);
+    }
+}
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Component/WXCanvasComponent.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXCanvasComponent.m b/ios/sdk/WeexSDK/Sources/Component/WXCanvasComponent.m
index f83f1c9..8dbba33 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXCanvasComponent.m
+++ b/ios/sdk/WeexSDK/Sources/Component/WXCanvasComponent.m
@@ -165,7 +165,7 @@
 
 
 // OpenGL ES methods map
-#define WX_CANVAS_PIXEL(name, index) WXPixelType name = [WXConvert WXPixelType:params[index]];
+#define WX_CANVAS_PIXEL(name, index) WXPixelType name = [WXConvert WXPixelType:params[index] scaleFactor:self.weexInstance.pixelScaleFactor];
 #define WX_CANVAS_CGFLOAT(name, index) CGFloat name = [WXConvert CGFloat:params[index]];
 #define WX_CANVAS_PARAMS_CHECK(num) if ([params count] < num) return;
 
@@ -196,10 +196,10 @@
         CGFloat sy = [WXConvert CGFloat:curParams[1]];
         CGFloat sw = [WXConvert CGFloat:curParams[2]];
         CGFloat sh = [WXConvert CGFloat:curParams[3]];
-        CGFloat dx = [WXConvert WXPixelType:curParams[4]];
-        CGFloat dy = [WXConvert WXPixelType:curParams[5]];
-        CGFloat dw = [WXConvert WXPixelType:curParams[6]];
-        CGFloat dh = [WXConvert WXPixelType:curParams[7]];
+        CGFloat dx = [WXConvert WXPixelType:curParams[4] scaleFactor:self.weexInstance.pixelScaleFactor];
+        CGFloat dy = [WXConvert WXPixelType:curParams[5] scaleFactor:self.weexInstance.pixelScaleFactor];
+        CGFloat dw = [WXConvert WXPixelType:curParams[6] scaleFactor:self.weexInstance.pixelScaleFactor];
+        CGFloat dh = [WXConvert WXPixelType:curParams[7] scaleFactor:self.weexInstance.pixelScaleFactor];
 
         geometrys[i * 4] = GLKVector3Make(dx, dh + dy, 1);
         geometrys[i * 4 + 1] = GLKVector3Make(dw + dx, dh + dy, 1);
@@ -221,7 +221,7 @@
                                                [WXConvert CGFloat:curParams[16]]
             );
             // Because the params are base on 750, so we should make scale for the transform matrix
-            matrix = GLKMatrix3Scale(matrix, 1, 1, WXScreenResizeRadio());
+            matrix = GLKMatrix3Scale(matrix, 1, 1, self.weexInstance.pixelScaleFactor);
             geometrys[i * 4] = GLKMatrix3MultiplyVector3(matrix, geometrys[i * 4]);
             geometrys[i * 4 + 1] = GLKMatrix3MultiplyVector3(matrix, geometrys[i * 4 + 1]);
             geometrys[i * 4 + 2] = GLKMatrix3MultiplyVector3(matrix, geometrys[i * 4 + 2]);
@@ -311,7 +311,7 @@
 - (void) setLineWidth:(NSArray *)params
 {
     WX_CANVAS_PARAMS_CHECK(1);
-    _curLineWidth = [WXConvert WXPixelType:params[0]];
+    _curLineWidth = [WXConvert WXPixelType:params[0] scaleFactor:self.weexInstance.pixelScaleFactor];
 }
 
 // ["M", 0, 0, "L", 100, 100, "L", 0, 100, "L", 0, 0] it made a triangle
@@ -327,7 +327,7 @@
 
     for (GLint i = 0; i < params.count; i += 3) {
         NSString *type = [WXConvert NSString:params[i]];
-        points[pointIndex] = GLKVector2Make([WXConvert WXPixelType:params[i + 1]], [WXConvert WXPixelType:params[i + 2]]);
+        points[pointIndex] = GLKVector2Make([WXConvert WXPixelType:params[i + 1] scaleFactor:self.weexInstance.pixelScaleFactor], [WXConvert WXPixelType:params[i + 2] scaleFactor:self.weexInstance.pixelScaleFactor]);
 
         if ([type isEqualToString:@"L"]) {
             if (isLastMove) {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Component/WXCellComponent.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXCellComponent.h b/ios/sdk/WeexSDK/Sources/Component/WXCellComponent.h
index a0656dd..544fbfe 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXCellComponent.h
+++ b/ios/sdk/WeexSDK/Sources/Component/WXCellComponent.h
@@ -12,6 +12,8 @@
 @interface WXCellComponent : WXComponent
 
 @property (nonatomic, strong) NSString *scope;
+@property (nonatomic, assign) UITableViewRowAnimation insertAnimation;
+@property (nonatomic, assign) UITableViewRowAnimation deleteAnimation;
 @property (nonatomic, weak) WXListComponent *list;
 
-@end
\ No newline at end of file
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Component/WXCellComponent.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXCellComponent.m b/ios/sdk/WeexSDK/Sources/Component/WXCellComponent.m
index 5a11065..0483ec0 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXCellComponent.m
+++ b/ios/sdk/WeexSDK/Sources/Component/WXCellComponent.m
@@ -23,6 +23,8 @@
     
     if (self) {
         _async = attributes[@"async"] ? [WXConvert BOOL:attributes[@"async"]] : YES;
+        _insertAnimation = [WXConvert UITableViewRowAnimation:attributes[@"insertAnimation"]];
+        _deleteAnimation = [WXConvert UITableViewRowAnimation:attributes[@"deleteAnimation"]];
         _lazyCreateView = YES;
         _isNeedJoinLayoutSystem = NO;
     }
@@ -60,6 +62,14 @@
     if (attributes[@"async"]) {
         _async = [WXConvert BOOL:attributes[@"async"]];
     }
+    
+    if (attributes[@"insertAnimation"]) {
+        _insertAnimation = [WXConvert UITableViewRowAnimation:attributes[@"insertAnimation"]];
+    }
+    
+    if (attributes[@"deleteAnimation"]) {
+        _deleteAnimation = [WXConvert UITableViewRowAnimation:attributes[@"deleteAnimation"]];
+    }
 }
 
 - (void)_moveToSupercomponent:(WXComponent *)newSupercomponent atIndex:(NSUInteger)index

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Component/WXComponent+GradientColor.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXComponent+GradientColor.h b/ios/sdk/WeexSDK/Sources/Component/WXComponent+GradientColor.h
new file mode 100644
index 0000000..0706eed
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Component/WXComponent+GradientColor.h
@@ -0,0 +1,20 @@
+//
+//  WXComponent+GradientColor.h
+//  Pods
+//
+//  Created by bobning on 16/12/23.
+//
+//
+
+#import <Foundation/Foundation.h>
+#import <UIKit/UIKit.h>
+#import "WXComponent.h"
+#import "WXType.h"
+
+@interface WXComponent (GradientColor)
+
+- (void)setGradientLayer;
+
+- (UIImage *)gradientColorImageFromColors:(NSArray*)colors gradientType:(WXGradientType)gradientType imgSize:(CGSize)imgSize;
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Component/WXComponent+GradientColor.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXComponent+GradientColor.m b/ios/sdk/WeexSDK/Sources/Component/WXComponent+GradientColor.m
new file mode 100644
index 0000000..e710ed0
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Component/WXComponent+GradientColor.m
@@ -0,0 +1,116 @@
+//
+//  WXComponent+GradientColor.m
+//  Pods
+//
+//  Created by bobning on 16/12/23.
+//
+//
+
+#import "WXComponent+GradientColor.h"
+#import "WXComponent_internal.h"
+#import "WXConvert.h"
+
+@implementation  WXComponent (GradientColor)
+
+- (void)setGradientLayer {
+    //parse gradient-color, linear-gradient(to right, #a80077,rgba(200, 54, 54, 0.5))
+    if ([_backgroundImage hasPrefix:@"linear-gradient"] && [_backgroundImage hasSuffix:@")"] ) {
+        NSRange range = NSMakeRange(16, _backgroundImage.length - 17);
+        NSString *str = [_backgroundImage substringWithRange:range];
+        NSArray *array = [str componentsSeparatedByString:@","];
+        WXGradientType gradientType;
+        UIColor *startColor, *endColor;
+        
+        if ([array count] == 3) {
+            gradientType = [WXConvert gradientType:array[0]];
+            startColor = [WXConvert UIColor:array[1]];
+            endColor = [WXConvert UIColor:array[2]];
+        }
+        else if ([array count] > 3){
+            NSString *gradientTypeStr = array[0];
+            NSString *subStr = [str substringFromIndex:gradientTypeStr.length + 1];
+            
+            if ([subStr hasPrefix:@"rgb"]) {
+                gradientType = [WXConvert gradientType:gradientTypeStr];
+                
+                range = [subStr rangeOfString:@")"];
+                NSString *startColorStr = [subStr substringToIndex:range.location + 1];
+                NSString *endColorStr = [subStr substringFromIndex:range.location + 2];
+                startColor = [WXConvert UIColor:startColorStr];
+                endColor = [WXConvert UIColor:endColorStr];
+            }
+            else {
+                gradientType = [WXConvert gradientType:gradientTypeStr];
+                
+                startColor = [WXConvert UIColor:array[1]];
+                
+                NSString *startColorStr = array[1];
+                NSString *endColorStr = [subStr substringFromIndex:startColorStr.length + 1];
+                endColor = [WXConvert UIColor:endColorStr];
+            }
+        }
+        else {
+            return;
+        }
+    
+        __weak typeof(self) weakSelf = self;
+        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+            UIImage *bgImg = [weakSelf gradientColorImageFromColors:@[startColor, endColor] gradientType:gradientType imgSize:weakSelf.view.frame.size];
+            dispatch_async(dispatch_get_main_queue(), ^{
+                weakSelf.view.backgroundColor = [UIColor colorWithPatternImage:bgImg];
+            });
+        });
+    }
+}
+
+- (UIImage *)gradientColorImageFromColors:(NSArray*)colors gradientType:(WXGradientType)gradientType imgSize:(CGSize)imgSize;{
+    NSMutableArray *array = [NSMutableArray array];
+    for(UIColor *color in colors) {
+        [array addObject:(id)color.CGColor];
+    }
+    
+    UIGraphicsBeginImageContextWithOptions(imgSize, YES, 1);
+    CGContextRef context = UIGraphicsGetCurrentContext();
+    CGContextSaveGState(context);
+    CGColorSpaceRef colorSpace = CGColorGetColorSpace([[colors lastObject] CGColor]);
+    CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (CFArrayRef)array, NULL);
+    CGPoint start;
+    CGPoint end;
+    switch (gradientType) {
+        case WXGradientTypeToTop:
+            start = CGPointMake(0.0, imgSize.height);
+            end = CGPointMake(0.0, 0.0);
+            break;
+        case WXGradientTypeToBottom:
+            start = CGPointMake(0.0, 0.0);
+            end = CGPointMake(0.0, imgSize.height);
+            break;
+        case WXGradientTypeToLeft:
+            start = CGPointMake(imgSize.width, 0.0);
+            end = CGPointMake(0.0, 0.0);
+            break;
+        case WXGradientTypeToRight:
+            start = CGPointMake(0.0, 0.0);
+            end = CGPointMake(imgSize.width, 0.0);
+            break;
+        case WXGradientTypeToTopleft:
+            start = CGPointMake(imgSize.width, imgSize.height);
+            end = CGPointMake(0.0, 0.0f);
+            break;
+        case WXGradientTypeToBottomright:
+            start = CGPointMake(0.0, 0.0);
+            end = CGPointMake(imgSize.width, imgSize.height);
+            break;
+        default:
+            break;
+    }
+    CGContextDrawLinearGradient(context, gradient, start, end, kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation);
+    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
+    CGGradientRelease(gradient);
+    CGContextRestoreGState(context);
+    CGColorSpaceRelease(colorSpace);
+    UIGraphicsEndImageContext();
+    return image;
+}
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Component/WXComponent_internal.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXComponent_internal.h b/ios/sdk/WeexSDK/Sources/Component/WXComponent_internal.h
index d09ce42..04f5440 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXComponent_internal.h
+++ b/ios/sdk/WeexSDK/Sources/Component/WXComponent_internal.h
@@ -34,12 +34,20 @@
      *  View
      */
     UIColor *_backgroundColor;
+    NSString *_backgroundImage;
     WXClipType _clipToBounds;
     UIView *_view;
     CGFloat _opacity;
     WXVisibility  _visibility;
     
     /**
+     *  PseudoClass
+     */
+    NSMutableDictionary *_pseudoClassStyles;
+    NSMutableDictionary *_updatedPseudoClassStyles;
+    BOOL _isListenPseudoTouch;
+    
+    /**
      *  Events
      */
     BOOL _appearEvent;
@@ -48,9 +56,14 @@
     NSMutableArray *_swipeGestures;
     UILongPressGestureRecognizer *_longPressGesture;
     UIPanGestureRecognizer *_panGesture;
+    
     BOOL _listenPanStart;
     BOOL _listenPanMove;
     BOOL _listenPanEnd;
+    
+    BOOL _listenHorizontalPan;
+    BOOL _listenVerticalPan;
+    
     WXTouchGestureRecognizer* _touchGesture;
     
     /**
@@ -110,7 +123,7 @@
 - (void)_removeFromSupercomponent;
 - (void)_moveToSupercomponent:(WXComponent *)newSupercomponent atIndex:(NSUInteger)index;
 
-- (void)_updateStylesOnComponentThread:(NSDictionary *)styles resetStyles:(NSMutableArray *)resetStyles;
+- (void)_updateStylesOnComponentThread:(NSDictionary *)styles resetStyles:(NSMutableArray *)resetStyles isUpdateStyles:(BOOL)isUpdateStyles;
 - (void)_updateAttributesOnComponentThread:(NSDictionary *)attributes;
 - (void)_updateStylesOnMainThread:(NSDictionary *)styles resetStyles:(NSMutableArray *)resetStyles;
 - (void)_updateAttributesOnMainThread:(NSDictionary *)attributes;
@@ -156,6 +169,8 @@
 
 - (void)_initEvents:(NSArray *)events;
 
+- (void)_initPseudoEvents:(BOOL)isListenPseudoTouch;
+
 - (void)_removeAllEvents;
 
 - (void)_setupNavBarWithStyles:(NSMutableDictionary *)styles attributes:(NSMutableDictionary *)attributes;
@@ -166,4 +181,7 @@
 
 - (void)_resetNativeBorderRadius;
 
+- (void)_updatePseudoClassStyles:(NSString *)key;
+
+- (void)_restoreViewStyles;
 @end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Component/WXEmbedComponent.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXEmbedComponent.m b/ios/sdk/WeexSDK/Sources/Component/WXEmbedComponent.m
index 1d47b4d..3b1df98 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXEmbedComponent.m
+++ b/ios/sdk/WeexSDK/Sources/Component/WXEmbedComponent.m
@@ -151,16 +151,18 @@
     };
     
     _embedInstance.onFailed = ^(NSError *error) {
-        if (weakSelf.errorView) {
-            return ;
-        }
-        
-        WXErrorView *errorView = [[WXErrorView alloc]initWithFrame:CGRectMake(0.0f, 0.0f, 135.0f, 130.0f)];
-        errorView.center = CGPointMake(weakSelf.view.bounds.size.width / 2.0f, weakSelf.view.bounds.size.height / 2.0f);
-        errorView.delegate = weakSelf;
-        [weakSelf.view addSubview:errorView];
-        
-        weakSelf.errorView = errorView;
+        dispatch_async(dispatch_get_main_queue(), ^{
+            if (weakSelf.errorView) {
+                return ;
+            }
+            
+            WXErrorView *errorView = [[WXErrorView alloc]initWithFrame:CGRectMake(0.0f, 0.0f, 135.0f, 130.0f)];
+            errorView.center = CGPointMake(weakSelf.view.bounds.size.width / 2.0f, weakSelf.view.bounds.size.height / 2.0f);
+            errorView.delegate = weakSelf;
+            [weakSelf.view addSubview:errorView];
+            
+            weakSelf.errorView = errorView;
+        });
     };
     
     _embedInstance.renderFinish = ^(UIView *view) {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/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 6baac1d..20b80aa 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXImageComponent.m
+++ b/ios/sdk/WeexSDK/Sources/Component/WXImageComponent.m
@@ -34,6 +34,7 @@ static dispatch_queue_t WXImageUpdateQueue;
 
 @property (nonatomic, strong) NSString *imageSrc;
 @property (nonatomic, strong) NSString *placeholdSrc;
+@property (nonatomic, assign) CGFloat blurRadius;
 @property (nonatomic, assign) UIViewContentMode resizeMode;
 @property (nonatomic, assign) WXImageQuality imageQuality;
 @property (nonatomic, assign) WXImageSharp imageSharp;
@@ -41,6 +42,7 @@ static dispatch_queue_t WXImageUpdateQueue;
 @property (nonatomic, strong) id<WXImageOperationProtocol> imageOperation;
 @property (nonatomic, strong) id<WXImageOperationProtocol> placeholderOperation;
 @property (nonatomic) BOOL imageLoadEvent;
+@property (nonatomic) BOOL imageDownloadFinish;
 
 @end
 
@@ -60,9 +62,11 @@ static dispatch_queue_t WXImageUpdateQueue;
         }
         [self configPlaceHolder:attributes];
         _resizeMode = [WXConvert UIViewContentMode:attributes[@"resize"]];
+        [self configFilter:styles];
         _imageQuality = [WXConvert WXImageQuality:styles[@"quality"]];
         _imageSharp = [WXConvert WXImageSharp:styles[@"sharpen"]];
         _imageLoadEvent = NO;
+        _imageDownloadFinish = NO;
     }
     
     return self;
@@ -74,6 +78,27 @@ static dispatch_queue_t WXImageUpdateQueue;
     }
 }
 
+- (void)configFilter:(NSDictionary *)styles {
+    if (styles[@"filter"]) {
+        NSString *filter = styles[@"filter"];
+        
+        NSString *pattern = @"blur\\((\\d+)(px)?\\)";
+        NSError *error = nil;
+        NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern
+                                                                               options:NSRegularExpressionCaseInsensitive
+                                                                                 error:&error];
+        NSArray *matches = [regex matchesInString:filter options:0 range:NSMakeRange(0, filter.length)];
+        if (matches && matches.count > 0) {
+            NSTextCheckingResult *match = matches[matches.count - 1];
+            NSRange matchRange = [match rangeAtIndex:1];
+            NSString *matchString = [filter substringWithRange:matchRange];
+            if (matchString && matchString.length > 0) {
+                _blurRadius = [matchString doubleValue];
+            }
+        }
+    }
+}
+
 - (UIView *)loadView
 {
     return [[WXImageView alloc] init];
@@ -102,6 +127,7 @@ static dispatch_queue_t WXImageUpdateQueue;
         _imageSharp = [WXConvert WXImageSharp:styles[@"sharpen"]];
         [self updateImage];
     }
+    [self configFilter:styles];
 }
 
 - (void)updateAttributes:(NSDictionary *)attributes
@@ -176,6 +202,7 @@ static dispatch_queue_t WXImageUpdateQueue;
 {
     if (![src isEqualToString:_imageSrc]) {
         _imageSrc = src;
+        _imageDownloadFinish = NO;
         [self updateImage];
     }
 }
@@ -187,6 +214,7 @@ static dispatch_queue_t WXImageUpdateQueue;
         [self cancelImage];
         
         void(^downloadFailed)(NSString *, NSError *) = ^void(NSString *url, NSError *error){
+            weakSelf.imageDownloadFinish = YES;
             WXLogError(@"Error downloading image:%@, detail:%@", url, [error localizedDescription]);
         };
         
@@ -196,6 +224,8 @@ static dispatch_queue_t WXImageUpdateQueue;
         if (!weakSelf.imageSrc && !weakSelf.placeholdSrc) {
             dispatch_async(dispatch_get_main_queue(), ^{
                 self.layer.contents = nil;
+                weakSelf.imageDownloadFinish = YES;
+                [weakSelf readyToRender];
             });
         }
     });
@@ -208,7 +238,7 @@ static dispatch_queue_t WXImageUpdateQueue;
     if (placeholderSrc) {
         WXLogDebug(@"Updating image, component:%@, placeholder:%@ ", self.ref, placeholderSrc);
         NSMutableString *newURL = [_placeholdSrc mutableCopy];
-        WX_REWRITE_URL(_placeholdSrc, WXResourceTypeLink, self.weexInstance, &newURL)
+        WX_REWRITE_URL(_placeholdSrc, WXResourceTypeImage, self.weexInstance, &newURL)
         
         __weak typeof(self) weakSelf = self;
         self.placeholderOperation = [[self imageLoader] downloadImageWithURL:newURL imageFrame:self.calculatedFrame userInfo:nil completed:^(UIImage *image, NSError *error, BOOL finished) {
@@ -219,6 +249,7 @@ static dispatch_queue_t WXImageUpdateQueue;
                     downloadFailedBlock(placeholderSrc,error);
                     if ([strongSelf isViewLoaded] && !viewImage) {
                         ((UIImageView *)(strongSelf.view)).image = nil;
+                        [self readyToRender];
                     }
                     return;
                 }
@@ -228,6 +259,8 @@ static dispatch_queue_t WXImageUpdateQueue;
                 
                 if ([strongSelf isViewLoaded] && !viewImage) {
                     ((UIImageView *)strongSelf.view).image = image;
+                    weakSelf.imageDownloadFinish = YES;
+                    [self readyToRender];
                 }
             });
         }];
@@ -236,13 +269,12 @@ static dispatch_queue_t WXImageUpdateQueue;
 
 - (void)updateContentImageWithFailedBlock:(void(^)(NSString *, NSError *))downloadFailedBlock
 {
-    
     NSString *imageSrc = self.imageSrc;
     if (imageSrc) {
         WXLogDebug(@"Updating image:%@, component:%@", self.imageSrc, self.ref);
-        NSDictionary *userInfo = @{@"imageQuality":@(self.imageQuality), @"imageSharp":@(self.imageSharp)};
+        NSDictionary *userInfo = @{@"imageQuality":@(self.imageQuality), @"imageSharp":@(self.imageSharp), @"blurRadius":@(self.blurRadius)};
         NSMutableString * newURL = [imageSrc mutableCopy];
-        WX_REWRITE_URL(imageSrc, WXResourceTypeLink, self.weexInstance, &newURL)
+        WX_REWRITE_URL(imageSrc, WXResourceTypeImage, self.weexInstance, &newURL)
         __weak typeof(self) weakSelf = self;
         dispatch_async(dispatch_get_main_queue(), ^{
             weakSelf.imageOperation = [[weakSelf imageLoader] downloadImageWithURL:newURL imageFrame:weakSelf.calculatedFrame userInfo:userInfo completed:^(UIImage *image, NSError *error, BOOL finished) {
@@ -250,10 +282,14 @@ static dispatch_queue_t WXImageUpdateQueue;
                     __strong typeof(self) strongSelf = weakSelf;
                     
                     if (weakSelf.imageLoadEvent) {
-                        [strongSelf fireEvent:@"load" params:@{ @"success": error? @"false" : @"true"}];
+                        NSMutableDictionary *sizeDict = [NSMutableDictionary new];
+                        sizeDict[@"naturalWidth"] = @(image.size.width * image.scale);
+                        sizeDict[@"naturalHeight"] = @(image.size.height * image.scale);
+                        [strongSelf fireEvent:@"load" params:@{ @"success": error? @false : @true,@"size":sizeDict}];
                     }
                     if (error) {
                         downloadFailedBlock(imageSrc, error);
+                        [strongSelf readyToRender];
                         return ;
                     }
                     
@@ -262,7 +298,9 @@ static dispatch_queue_t WXImageUpdateQueue;
                     }
                     
                     if ([strongSelf isViewLoaded]) {
+                        strongSelf.imageDownloadFinish = YES;
                         ((UIImageView *)strongSelf.view).image = image;
+                        [strongSelf readyToRender];
                     }
                 });
             }];
@@ -270,6 +308,14 @@ static dispatch_queue_t WXImageUpdateQueue;
     }
 }
 
+- (void)readyToRender
+{
+    // when image download completely (success or failed)
+    if (self.weexInstance.trackComponent && _imageDownloadFinish) {
+        [super readyToRender];
+    }
+}
+
 - (void)cancelImage
 {
     [_imageOperation cancel];

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Component/WXIndicatorComponent.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXIndicatorComponent.m b/ios/sdk/WeexSDK/Sources/Component/WXIndicatorComponent.m
index 00fc7e1..5b2b858 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXIndicatorComponent.m
+++ b/ios/sdk/WeexSDK/Sources/Component/WXIndicatorComponent.m
@@ -10,6 +10,7 @@
 #import "WXSliderComponent.h"
 #import "WXConvert.h"
 #import "WXSliderNeighborComponent.h"
+#import "WXSDKInstance.h"
 
 @implementation WXIndicatorView
 
@@ -136,7 +137,7 @@
     if (self = [super initWithRef:ref type:type styles:styles attributes:attributes events:events weexInstance:weexInstance]) {
         _itemColor = styles[@"itemColor"] ? [WXConvert UIColor:styles[@"itemColor"]]:[UIColor colorWithRed:0xff/255.0f green:0xff/255.0f blue:0xff/255.0f alpha:0.5f];
         _itemSelectedColor = styles[@"itemSelectedColor"] ? [WXConvert UIColor:styles[@"itemSelectedColor"]]:[UIColor colorWithRed:0xff/255.0f green:0xd5/255.0f blue:0x45/255.0f alpha:1.0f];
-        _itemSize = styles[@"itemSize"] ? [WXConvert WXPixelType:styles[@"itemSize"]] : 5.0f;
+        _itemSize = styles[@"itemSize"] ? [WXConvert WXPixelType:styles[@"itemSize"] scaleFactor:self.weexInstance.pixelScaleFactor] : 5.0f;
     }
     return self;
 }
@@ -185,7 +186,7 @@
     
     if (styles[@"itemSize"]) {
         styleChange = YES;
-        _itemSize = [WXConvert WXPixelType:styles[@"itemSize"]];
+        _itemSize = [WXConvert WXPixelType:styles[@"itemSize"] scaleFactor:self.weexInstance.pixelScaleFactor];
         [_indicatorView setPointSize:_itemSize];
     }
     

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Component/WXListComponent.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXListComponent.m b/ios/sdk/WeexSDK/Sources/Component/WXListComponent.m
index 8e6a611..bea72d0 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXListComponent.m
+++ b/ios/sdk/WeexSDK/Sources/Component/WXListComponent.m
@@ -36,6 +36,20 @@
     [self.wx_component layoutDidFinish];
 }
 
+- (void)setContentOffset:(CGPoint)contentOffset
+{
+    // FIXME: side effect caused by hooking _adjustContentOffsetIfNecessary.
+    // When UITableView is pulled down and finger releases\uff0ccontentOffset will be set from -xxxx to about -0.5(greater than -0.5), then contentOffset will be reset to zero by calling _adjustContentOffsetIfNecessary.
+    // So hooking _adjustContentOffsetIfNecessary will always cause remaining 1px space between list's top and navigator.
+    // Demo: http://dotwe.org/895630945793a9a044e49abe39cbb77f
+    // Have to reset contentOffset to zero manually here.
+    if (fabs(contentOffset.y) < 0.5) {
+        contentOffset.y = 0;
+    }
+    
+    [super setContentOffset:contentOffset];
+}
+
 @end
 
 @interface WXHeaderComponent : WXComponent
@@ -209,7 +223,7 @@
     NSIndexPath *toIndexPath = [self indexPathForCell:(WXCellComponent*)cellComponent sections:_completedSections];
     CGRect cellRect = [_tableView rectForRowAtIndexPath:toIndexPath];
     contentOffsetY += cellRect.origin.y;
-    contentOffsetY += offset * WXScreenResizeRadio();
+    contentOffsetY += offset * self.weexInstance.pixelScaleFactor;
     
     if (contentOffsetY > _tableView.contentSize.height - _tableView.frame.size.height) {
         contentOffset.y = _tableView.contentSize.height - _tableView.frame.size.height;
@@ -297,9 +311,15 @@
         [self removeCellForIndexPath:indexPath withSections:_completedSections];
         
         WXLogDebug(@"Delete cell:%@ at indexPath:%@", cell.ref, indexPath);
-        [UIView performWithoutAnimation:^{
-            [_tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
-        }];
+        if (cell.deleteAnimation == UITableViewRowAnimationNone) {
+            [UIView performWithoutAnimation:^{
+                [_tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
+                [self handleAppear];
+            }];
+        } else {
+            [_tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:cell.deleteAnimation];
+            [self handleAppear];
+        }
     }];
 }
 
@@ -327,13 +347,20 @@
         if (!isReload) {
             WXLogDebug(@"Insert cell:%@ at indexPath:%@", cell.ref, indexPath);
             _completedSections = completedSections;
-            [UIView performWithoutAnimation:^{
-                [_tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
-            }];
+            if (cell.insertAnimation == UITableViewRowAnimationNone) {
+                [UIView performWithoutAnimation:^{
+                    [_tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
+                    [self handleAppear];
+                }];
+            } else {
+                [_tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:cell.insertAnimation];
+                [self handleAppear];
+            }
         } else {
             WXLogInfo(@"Reload cell:%@ at indexPath:%@", cell.ref, indexPath);
             [UIView performWithoutAnimation:^{
                 [_tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
+                [self handleAppear];
             }];
         }
     }];
@@ -381,6 +408,7 @@
         [self insertCell:cell forIndexPath:toIndexPath withSections:_completedSections];
         [UIView performWithoutAnimation:^{
             [_tableView moveRowAtIndexPath:fromIndexPath toIndexPath:toIndexPath];
+            [self handleAppear];
         }];
     }];
 }
@@ -603,7 +631,11 @@
 {
     static dispatch_once_t onceToken;
     dispatch_once(&onceToken, ^{
-        //(\u0e07 \u2022\u0300_\u2022\u0301)\u0e07\u253b\u2501\u253b Stupid scoll view, always reset content offset to zero after insert cells, any other more elegant way?
+        // FIXME:(\u0e07 \u2022\u0300_\u2022\u0301)\u0e07\u253b\u2501\u253b Stupid scoll view, always reset content offset to zero by calling _adjustContentOffsetIfNecessary after insert cells.
+        // So if you pull down list while list is rendering, the list will be flickering.
+        // Demo:    
+        // Have to hook _adjustContentOffsetIfNecessary here.
+        // Any other more elegant way?
         NSString *a = @"ntOffsetIfNe";
         NSString *b = @"adjustConte";
         

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Component/WXScrollerComponent.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXScrollerComponent.h b/ios/sdk/WeexSDK/Sources/Component/WXScrollerComponent.h
index d256567..248d03a 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXScrollerComponent.h
+++ b/ios/sdk/WeexSDK/Sources/Component/WXScrollerComponent.h
@@ -21,5 +21,7 @@
 
 - (NSUInteger)childrenCountForScrollerLayout;
 
+- (void)handleAppear;
+
 @end
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/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 7a72883..fa91d3e 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXScrollerComponent.m
+++ b/ios/sdk/WeexSDK/Sources/Component/WXScrollerComponent.m
@@ -44,6 +44,7 @@
     CGFloat _loadMoreOffset;
     CGFloat _previousLoadMoreContentHeight;
     CGPoint _lastContentOffset;
+    BOOL _scrollable;
     
     // vertical & horizontal
     WXScrollDirection _scrollDirection;
@@ -91,6 +92,7 @@ WX_EXPORT_METHOD(@selector(resetLoadmore))
         _loadMoreOffset = attributes[@"loadmoreoffset"] ? [WXConvert CGFloat:attributes[@"loadmoreoffset"]] : 0;
         _loadmoreretry = attributes[@"loadmoreretry"] ? [WXConvert NSUInteger:attributes[@"loadmoreretry"]] : 0;
         _listenLoadMore = [events containsObject:@"loadmore"];
+        _scrollable = attributes[@"scrollable"] ? [WXConvert BOOL:attributes[@"scrollable"]] : YES;
 
         _scrollerCSSNode = new_css_node();
         
@@ -123,6 +125,7 @@ WX_EXPORT_METHOD(@selector(resetLoadmore))
     scrollView.clipsToBounds = YES;
     scrollView.showsVerticalScrollIndicator = _showScrollBar;
     scrollView.showsHorizontalScrollIndicator = _showScrollBar;
+    scrollView.scrollEnabled = _scrollable;
     
     if (self.ancestorScroller) {
         scrollView.scrollsToTop = NO;
@@ -174,6 +177,10 @@ WX_EXPORT_METHOD(@selector(resetLoadmore))
         }
         self.loadmoreretry = loadmoreretry;
     }
+    if (attributes[@"scrollable"]) {
+        _scrollable = attributes[@"scrollable"] ? [WXConvert BOOL:attributes[@"scrollable"]] : YES;
+        ((UIScrollView *)self.view).scrollEnabled = _scrollable;
+    }
 }
 
 - (void)addEvent:(NSString *)eventName
@@ -215,7 +222,7 @@ WX_EXPORT_METHOD(@selector(resetLoadmore))
     }
     CGFloat scrollOffsetY = ((UIScrollView *)self.view).contentOffset.y;
     for(WXComponent *component in self.stickyArray) {
-        if (CGPointEqualToPoint(component->_absolutePosition, CGPointZero)) {
+        if (isnan(component->_absolutePosition.x) && isnan(component->_absolutePosition.y)) {
             component->_absolutePosition = [component.supercomponent.view convertPoint:component.view.frame.origin toView:self.view];
         }
         CGPoint relativePosition = component->_absolutePosition;
@@ -299,10 +306,11 @@ WX_EXPORT_METHOD(@selector(resetLoadmore))
 {
     UIScrollView *scrollView = (UIScrollView *)self.view;
     CGPoint contentOffset = scrollView.contentOffset;
+    CGFloat scaleFactor = self.weexInstance.pixelScaleFactor;
     
     if (_scrollDirection == WXScrollDirectionHorizontal) {
         CGFloat contentOffetX = [component.supercomponent.view convertPoint:component.view.frame.origin toView:self.view].x;
-        contentOffetX += offset * WXScreenResizeRadio();
+        contentOffetX += offset * scaleFactor;
         
         if (contentOffetX > scrollView.contentSize.width - scrollView.frame.size.width) {
             contentOffset.x = scrollView.contentSize.width - scrollView.frame.size.width;
@@ -311,7 +319,7 @@ WX_EXPORT_METHOD(@selector(resetLoadmore))
         }
     } else {
         CGFloat contentOffetY = [component.supercomponent.view convertPoint:component.view.frame.origin toView:self.view].y;
-        contentOffetY += offset * WXScreenResizeRadio();
+        contentOffetY += offset * scaleFactor;
         
         if (contentOffetY > scrollView.contentSize.height - scrollView.frame.size.height) {
             contentOffset.y = scrollView.contentSize.height - scrollView.frame.size.height;
@@ -325,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;
     }
     
@@ -461,8 +469,6 @@ WX_EXPORT_METHOD(@selector(resetLoadmore))
     }
 }
 
-#pragma mark  Private Methods
-
 - (void)handleAppear
 {
     if (![self isViewLoaded]) {
@@ -481,6 +487,8 @@ WX_EXPORT_METHOD(@selector(resetLoadmore))
     }
 }
 
+#pragma mark  Private Methods
+
 - (void)scrollToTarget:(WXScrollToTarget *)target scrollRect:(CGRect)rect
 {
     WXComponent *component = target.target;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Component/WXSliderComponent.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXSliderComponent.m b/ios/sdk/WeexSDK/Sources/Component/WXSliderComponent.m
index 99a4c6f..6ad82ff 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXSliderComponent.m
+++ b/ios/sdk/WeexSDK/Sources/Component/WXSliderComponent.m
@@ -18,6 +18,7 @@
 
 @protocol WXSliderViewDelegate <UIScrollViewDelegate>
 
+- (void)sliderView:(WXSliderView *)sliderView sliderViewDidScroll:(UIScrollView *)scrollView;
 - (void)sliderView:(WXSliderView *)sliderView didScrollToItemAtIndex:(NSInteger)index;
 
 @end
@@ -284,6 +285,9 @@
     if (itemView) {
         self.currentIndex = itemView.tag;
     }
+    if (self.delegate && [self.delegate respondsToSelector:@selector(sliderView:sliderViewDidScroll:)]) {
+        [self.delegate sliderView:self sliderViewDidScroll:self.scrollView];
+    }
 }
 
 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
@@ -310,8 +314,12 @@
 @property (nonatomic, assign) BOOL  autoPlay;
 @property (nonatomic, assign) NSUInteger interval;
 @property (nonatomic, assign) NSInteger index;
+@property (nonatomic, assign) CGFloat lastOffsetXRatio;
+@property (nonatomic, assign) CGFloat offsetXAccuracy;
 @property (nonatomic, assign) BOOL  sliderChangeEvent;
+@property (nonatomic, assign) BOOL  sliderScrollEvent;
 @property (nonatomic, strong) NSMutableArray *childrenView;
+@property (nonatomic, assign) BOOL scrollable;
 
 @end
 
@@ -326,8 +334,10 @@
 {
     if (self = [super initWithRef:ref type:type styles:styles attributes:attributes events:events weexInstance:weexInstance]) {
         _sliderChangeEvent = NO;
+        _sliderScrollEvent = NO;
         _interval = 3000;
         _childrenView = [NSMutableArray new];
+        _lastOffsetXRatio = 0;
         
         if (attributes[@"autoPlay"]) {
             _autoPlay = [attributes[@"autoPlay"] boolValue];
@@ -341,6 +351,12 @@
             _index = [attributes[@"index"] integerValue];
         }
         
+        _scrollable = attributes[@"scrollable"] ? [WXConvert BOOL:attributes[@"scrollable"]] : YES;
+
+        if (attributes[@"offsetXAccuracy"]) {
+            _offsetXAccuracy = [WXConvert CGFloat:attributes[@"offsetXAccuracy"]];
+        }
+        
         self.cssNode->style.flex_direction = CSS_FLEX_DIRECTION_ROW;
     }
     return self;
@@ -359,6 +375,7 @@
     _sliderView.delegate = self;
     _sliderView.scrollView.pagingEnabled = YES;
     _sliderView.exclusiveTouch = YES;
+    _sliderView.scrollView.scrollEnabled = _scrollable;
     
     if (_autoPlay) {
         [self _startAutoPlayTimer];
@@ -465,6 +482,15 @@
         self.currentIndex = _index;
         [_sliderView scroll2ItemView:self.currentIndex animated:YES];
     }
+    
+    if (attributes[@"scrollable"]) {
+        _scrollable = attributes[@"scrollable"] ? [WXConvert BOOL:attributes[@"scrollable"]] : YES;
+        ((WXSliderView *)self.view).scrollView.scrollEnabled = _scrollable;
+    }
+    
+    if (attributes[@"offsetXAccuracy"]) {
+        _offsetXAccuracy = [WXConvert CGFloat:attributes[@"offsetXAccuracy"]];
+    }
 }
 
 - (void)addEvent:(NSString *)eventName
@@ -472,6 +498,9 @@
     if ([eventName isEqualToString:@"change"]) {
         _sliderChangeEvent = YES;
     }
+    if ([eventName isEqualToString:@"scroll"]) {
+        _sliderScrollEvent = YES;
+    }
 }
 
 - (void)removeEvent:(NSString *)eventName
@@ -479,6 +508,9 @@
     if ([eventName isEqualToString:@"change"]) {
         _sliderChangeEvent = NO;
     }
+    if ([eventName isEqualToString:@"scroll"]) {
+        _sliderScrollEvent = NO;
+    }
 }
 
 #pragma mark Public Methods
@@ -530,10 +562,24 @@
     }
 }
 
+#pragma mark ScrollView Delegate
+
+- (void)sliderView:(WXSliderView *)sliderView sliderViewDidScroll:(UIScrollView *)scrollView
+{
+    if (_sliderScrollEvent) {
+        CGFloat width = scrollView.frame.size.width;
+        CGFloat XDeviation = scrollView.frame.origin.x - (scrollView.contentOffset.x - width);
+        CGFloat offsetXRatio = (XDeviation / width);
+        if (ABS(offsetXRatio - _lastOffsetXRatio) >= _offsetXAccuracy) {
+            _lastOffsetXRatio = offsetXRatio;
+            [self fireEvent:@"scroll" params:@{@"offsetXRatio":[NSNumber numberWithFloat:offsetXRatio]} domChanges:nil];
+        }
+    }
+}
+
 - (void)sliderView:(WXSliderView *)sliderView didScrollToItemAtIndex:(NSInteger)index
 {
     self.currentIndex = index;
-    
     if (_sliderChangeEvent) {
         [self fireEvent:@"change" params:@{@"index":@(index)} domChanges:@{@"attrs": @{@"index": @(index)}}];
     }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Sources/Component/WXSliderNeighborComponent.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXSliderNeighborComponent.m b/ios/sdk/WeexSDK/Sources/Component/WXSliderNeighborComponent.m
index b3ec0de..d7b3203 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXSliderNeighborComponent.m
+++ b/ios/sdk/WeexSDK/Sources/Component/WXSliderNeighborComponent.m
@@ -114,7 +114,7 @@
     self.isAccessibilityElement = YES;
     
     [self addSubview:_contentView];
-     
+    
     if (_dataSource) {
         [self reloadData];
     }
@@ -514,6 +514,23 @@ NSComparisonResult sliderNeighorCompareViewDepth(UIView *view1, UIView *view2, W
     return YES;
 }
 
+- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
+   //if the view which the otherGestureRecognizer works on is a scrollview and also it is scrollEnabled vertically ,at this time,we should not block the guesture from being recognized by the otherGestureRecognize
+    if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && [otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
+        if ([otherGestureRecognizer.view isKindOfClass:[UIScrollView class]]) {
+            UIScrollView* scrollview = (UIScrollView *)otherGestureRecognizer.view;
+            if (scrollview.scrollEnabled) {
+                UIPanGestureRecognizer* panRcgn= (UIPanGestureRecognizer *)gestureRecognizer;
+                //check offset for confirming vertival movement
+                if (fabs([panRcgn translationInView:panRcgn.view].y) > fabs([panRcgn translationInView:panRcgn.view].x)*16) {
+                    return YES;
+                }
+            }
+        }
+    }
+    return NO;
+}
+
 
 - (void)didPan:(UIPanGestureRecognizer *)panGesture
 {
@@ -1364,7 +1381,9 @@ NSComparisonResult sliderNeighorCompareViewDepth(UIView *view1, UIView *view2, W
     WXPixelType neighborSpace;
     CGFloat neighborAlpha;
     CGFloat neighborScale;
+    CGFloat currentItemScale;
 }
+
 @property (nonatomic, strong) WXSliderNeighborView *sliderView;
 @property (nonatomic, assign) BOOL  autoPlay;
 @property (nonatomic, assign) NSUInteger interval;
@@ -1374,43 +1393,33 @@ NSComparisonResult sliderNeighorCompareViewDepth(UIView *view1, UIView *view2, W
 @property (nonatomic, assign) BOOL  sliderChangeEvent;
 @property (nonatomic, assign) NSInteger currentIndex;
 @property (nonatomic) CGRect itemRect;
+@property (nonatomic, assign) BOOL scrollable;
+
 @end
 
+#define DEFAULT_NEIGHBOR_ITEM_SCALE 0.8
+#define DEFAULT_CURRENT_ITEM_SCALE 0.9
+#define DEFAULT_NEIGHBOR_ALPHA 0.6
+#define DEFAULT_ANIMATION_DURATION 0.3
+#define DEFAULT_NEIGHBOR_SPACE 25
+
+
 @implementation WXSliderNeighborComponent
 
 - (instancetype)initWithRef:(NSString *)ref type:(NSString *)type styles:(NSDictionary *)styles attributes:(NSDictionary *)attributes events:(NSArray *)events weexInstance:(WXSDKInstance *)weexInstance {
     if (self = [super initWithRef:ref type:type styles:styles attributes:attributes events:events weexInstance:weexInstance]) {
         _sliderChangeEvent = NO;
-        _sliderView = [[WXSliderNeighborView alloc] init];
-        _sliderView.delegate = self;
-        _sliderView.dataSource = self;
         _interval = 3000;
-        [self setNeighborSpace:attributes];
-        [self setNeighborAlpha:attributes];
-        [self setNeighborScale:attributes];
         _items = [NSMutableArray array];
         _itemRect = CGRectNull;
-        
-        if (attributes[@"autoPlay"]) {
-            _autoPlay = [attributes[@"autoPlay"] boolValue];
-        }
-
-        if (attributes[@"interval"]) {
-            _interval = [attributes[@"interval"] integerValue];
-        }
-
-        if (attributes[@"index"]) {
-            _index = [attributes[@"index"] integerValue];
-            _currentIndex = _index;
-        }
-        if (attributes[@"autoPlay"]) {
-            _autoPlay = [attributes[@"autoPlay"] boolValue];
-        }
-
-        if (attributes[@"interval"]) {
-            _interval = [attributes[@"interval"] integerValue];
-        }
+        self->neighborAlpha = DEFAULT_NEIGHBOR_ALPHA;
+        self->neighborScale = DEFAULT_NEIGHBOR_ITEM_SCALE;
+        self->currentItemScale = DEFAULT_CURRENT_ITEM_SCALE;
+        self->neighborSpace = [WXConvert WXPixelType:@(DEFAULT_NEIGHBOR_SPACE) scaleFactor:self.weexInstance.pixelScaleFactor];
+        _scrollable = YES;
+        [self setAttributes:attributes];
     
+        _scrollable = attributes[@"scrollable"] ? [WXConvert BOOL:attributes[@"scrollable"]] : YES;
     }
     self.cssNode->style.flex_direction = CSS_FLEX_DIRECTION_ROW;
     
@@ -1422,15 +1431,33 @@ NSComparisonResult sliderNeighorCompareViewDepth(UIView *view1, UIView *view2, W
 
 - (UIView *)loadView
 {
+    _sliderView = [[WXSliderNeighborView alloc] init];
     return _sliderView;
 }
 
+- (void)dealloc
+{
+    _sliderView.delegate = nil;
+    _sliderView.dataSource = nil;
+    if (_autoPlay) {
+        [self _stopAutoPlayTimer];
+    }
+    _sliderView = nil;
+    [self.items removeAllObjects];
+}
+
+- (void)viewDidUnload
+{
+    [self.items removeAllObjects];
+}
+
 - (void)viewDidLoad
 {
     _sliderView = (WXSliderNeighborView *)self.view;
     _sliderView.delegate = self;
     _sliderView.dataSource = self;
     _sliderView.contentView.clipsToBounds = YES;
+    _sliderView.scrollEnabled = _scrollable;
     if (_autoPlay) {
         [self _startAutoPlayTimer];
     } else {
@@ -1491,7 +1518,7 @@ NSComparisonResult sliderNeighorCompareViewDepth(UIView *view1, UIView *view2, W
 }
 
 #pragma mark attributes update
-- (void)updateAttributes:(NSDictionary *)attributes
+- (void)setAttributes:(NSDictionary *)attributes
 {
     if (attributes[@"index"]) {
         _index = [attributes[@"index"] integerValue];
@@ -1505,7 +1532,6 @@ NSComparisonResult sliderNeighorCompareViewDepth(UIView *view1, UIView *view2, W
             [self _stopAutoPlayTimer];
         }
     }
-    
     if (attributes[@"interval"]) {
         _interval = [attributes[@"interval"] integerValue];
         
@@ -1518,14 +1544,24 @@ NSComparisonResult sliderNeighorCompareViewDepth(UIView *view1, UIView *view2, W
     if (attributes[@"neighborScale"]) {
         [self setNeighborScale:attributes];
     }
+    if (attributes[@"currentItemScale"]) {
+        [self setCurrentItemScale:attributes];
+    }
     if (attributes[@"neighborAlpha"]) {
         [self setNeighborAlpha:attributes];
     }
-    
     if (attributes[@"neighborSpace"]) {
         [self setNeighborSpace:attributes];
     }
-    
+    if (attributes[@"scrollable"]) {
+        _scrollable = attributes[@"scrollable"] ? [WXConvert BOOL:attributes[@"scrollable"]] : YES;
+        ((WXSliderNeighborView *)self.view).scrollEnabled = _scrollable;
+    }
+}
+
+- (void)updateAttributes:(NSDictionary *)attributes
+{
+    [self setAttributes:attributes];
     [self.sliderView setCurrentItemIndex:_index];
     [self updateSliderPage:YES];
 }
@@ -1558,9 +1594,7 @@ NSComparisonResult sliderNeighorCompareViewDepth(UIView *view1, UIView *view2, W
 
 - (void)setNeighborSpace:(NSDictionary *)attributes{
     if(attributes[@"neighborSpace"]) {
-        self->neighborSpace = [WXConvert WXPixelType:attributes[@"neighborSpace"]];
-    } else {
-        self->neighborSpace = [WXConvert WXPixelType:@(25)];
+        self->neighborSpace = [WXConvert WXPixelType:attributes[@"neighborSpace"] scaleFactor:self.weexInstance.pixelScaleFactor];
     }
 }
 
@@ -1569,8 +1603,14 @@ NSComparisonResult sliderNeighorCompareViewDepth(UIView *view1, UIView *view2, W
         self->neighborAlpha = [WXConvert CGFloat:attributes[@"neighborAlpha"]];
         self->neighborAlpha = self->neighborAlpha >= 0 ? self->neighborAlpha : 0;
         self->neighborAlpha = self->neighborAlpha <= 1 ? self->neighborAlpha: 1;
-    } else {
-        self->neighborAlpha = 0.6;
+    }
+}
+
+- (void)setCurrentItemScale:(NSDictionary *)attributes {
+    if (attributes[@"currentItemScale"]) {
+        self->currentItemScale = [WXConvert CGFloat:attributes[@"currentItemScale"]];
+        self->currentItemScale = self->currentItemScale >= 0 ? self->currentItemScale : 0;
+        self->currentItemScale = self->currentItemScale <= 1 ? self->currentItemScale: 1;
     }
 }
 
@@ -1580,9 +1620,6 @@ NSComparisonResult sliderNeighorCompareViewDepth(UIView *view1, UIView *view2, W
         self->neighborScale = [WXConvert CGFloat:attributes[@"neighborScale"]];
         self->neighborScale = self->neighborScale >= 0? self->neighborScale : 0;
         self->neighborScale = self->neighborScale <= 1? self->neighborScale :1;
-        
-    } else {
-        self->neighborScale = 0.8;
     }
 }
 
@@ -1639,7 +1676,11 @@ NSComparisonResult sliderNeighorCompareViewDepth(UIView *view1, UIView *view2, W
 - (UIView *)sliderNeighbor:(WXSliderNeighborView *)sliderNeighbor viewForItemAtIndex:(NSInteger)index reusingView:(UIView *)view {
     
     if (!view) {
-        view = self.items[index];
+        if (index < [self.items count]) {
+            view = self.items[index];
+        }else {
+            return nil;
+        }
     } else {
         view.tag = 1;
     }
@@ -1700,7 +1741,7 @@ NSComparisonResult sliderNeighorCompareViewDepth(UIView *view1, UIView *view2, W
     float duration = 0;
     __weak typeof(self) weakSelf = self;
     if (animate) {
-        duration = 0.3;
+        duration = DEFAULT_ANIMATION_DURATION;
     }
     
     [UIView animateWithDuration:duration animations:^{
@@ -1708,14 +1749,13 @@ NSComparisonResult sliderNeighorCompareViewDepth(UIView *view1, UIView *view2, W
         if (strongSelf) {
             currentView.alpha = 1.0;
             
-            if (fabs(strongSelf->neighborScale - 0) > CGFLOAT_MIN) {
-                transfrom = CGAffineTransformConcat(transfrom,CGAffineTransformMakeScale(0.9, 0.9));
+            if (fabs(strongSelf->currentItemScale) > CGFLOAT_MIN) {
+                transfrom = CGAffineTransformConcat(transfrom,CGAffineTransformMakeScale(strongSelf->currentItemScale, strongSelf->currentItemScale));
             }
             currentView.transform = transfrom;
             transfrom = CGAffineTransformIdentity;
-            
-            if (fabs(strongSelf->neighborScale - 0) <= CGFLOAT_MIN) {
-                strongSelf->neighborScale = 0.8;
+            if (fabs(strongSelf->neighborScale) <= CGFLOAT_MIN) {
+                strongSelf->neighborScale = DEFAULT_NEIGHBOR_ITEM_SCALE;
             }
             
             CGFloat tx = 0.5*_itemRect.size.width*((1-self->neighborScale)+(1-0.9))-self->neighborSpace;


[15/50] [abbrv] incubator-weex git commit: V0.10.0 stable gitlab (#178)

Posted by ji...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/playground/WeexDemo.xcodeproj/project.pbxproj
----------------------------------------------------------------------
diff --git a/ios/playground/WeexDemo.xcodeproj/project.pbxproj b/ios/playground/WeexDemo.xcodeproj/project.pbxproj
index 31a50f4..b579510 100644
--- a/ios/playground/WeexDemo.xcodeproj/project.pbxproj
+++ b/ios/playground/WeexDemo.xcodeproj/project.pbxproj
@@ -11,6 +11,7 @@
 		564B94671DD9C65000441C8D /* WeexUITestDemo-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 564B94661DD9C65000441C8D /* WeexUITestDemo-Info.plist */; };
 		59EA0DA71D2E7D19004F904A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 59EA0DA61D2E7D19004F904A /* Images.xcassets */; };
 		741DFE091DDDD519009B020F /* libstdc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 741DFE081DDDD519009B020F /* libstdc++.tbd */; };
+		7478481E1E0CD4910044500D /* WXSyncTestModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 7478481D1E0CD4910044500D /* WXSyncTestModule.m */; };
 		74CC79EB1C2B9E4700829368 /* UIViewController+WXDemoNaviBar.m in Sources */ = {isa = PBXBuildFile; fileRef = 74CC79EA1C2B9E4700829368 /* UIViewController+WXDemoNaviBar.m */; };
 		775BEE801C1E8ECC008D1629 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 775BEE7F1C1E8ECC008D1629 /* main.m */; };
 		775BEE831C1E8ECC008D1629 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 775BEE821C1E8ECC008D1629 /* AppDelegate.m */; };
@@ -24,6 +25,8 @@
 		84361D3B1CA10F8E00F43825 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 775BEE7F1C1E8ECC008D1629 /* main.m */; };
 		84361D421CA10F8E00F43825 /* libPods-WeexDemo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7601607D735D7F8D88971230 /* libPods-WeexDemo.a */; };
 		84361D5B1CA10F8E00F43825 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 775BEE8A1C1E8ECC008D1629 /* Assets.xcassets */; };
+		846FC8DA1E1B853100949E7D /* WXSyncTestModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 7478481D1E0CD4910044500D /* WXSyncTestModule.m */; };
+		846FC8DB1E1B853600949E7D /* WXATViewHierarchyPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = DCABAFF21D029685001C8592 /* WXATViewHierarchyPlugin.m */; };
 		84D7CAC71CE3266C00D48D46 /* libsqlite3.0.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7475ACA01CD8444A0044E96C /* libsqlite3.0.tbd */; };
 		8A0B5EFFF75BF82EA481983D /* libPods-WeexUITestDemo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E48C20F443AA337D1FE97622 /* libPods-WeexUITestDemo.a */; };
 		DC5E503E1D0D97130059F0EB /* weex.png in Resources */ = {isa = PBXBuildFile; fileRef = DC5E503C1D0D97130059F0EB /* weex.png */; };
@@ -63,6 +66,8 @@
 		741DFE081DDDD519009B020F /* libstdc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libstdc++.tbd"; path = "usr/lib/libstdc++.tbd"; sourceTree = SDKROOT; };
 		7453E3641C9FA971001EB427 /* DemoDefine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoDefine.h; sourceTree = "<group>"; };
 		7475ACA01CD8444A0044E96C /* libsqlite3.0.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.0.tbd; path = usr/lib/libsqlite3.0.tbd; sourceTree = SDKROOT; };
+		7478481C1E0CD4910044500D /* WXSyncTestModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXSyncTestModule.h; sourceTree = "<group>"; };
+		7478481D1E0CD4910044500D /* WXSyncTestModule.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXSyncTestModule.m; sourceTree = "<group>"; };
 		74CC79E91C2B9E4700829368 /* UIViewController+WXDemoNaviBar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIViewController+WXDemoNaviBar.h"; sourceTree = "<group>"; };
 		74CC79EA1C2B9E4700829368 /* UIViewController+WXDemoNaviBar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIViewController+WXDemoNaviBar.m"; sourceTree = "<group>"; };
 		7601607D735D7F8D88971230 /* libPods-WeexDemo.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-WeexDemo.a"; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -273,6 +278,8 @@
 			children = (
 				DCABAFFF1D02975E001C8592 /* WXEventModule.h */,
 				DCABB0001D02975E001C8592 /* WXEventModule.m */,
+				7478481C1E0CD4910044500D /* WXSyncTestModule.h */,
+				7478481D1E0CD4910044500D /* WXSyncTestModule.m */,
 			);
 			name = module;
 			sourceTree = "<group>";
@@ -302,13 +309,13 @@
 			isa = PBXNativeTarget;
 			buildConfigurationList = 775BEEA81C1E8ECC008D1629 /* Build configuration list for PBXNativeTarget "WeexDemo" */;
 			buildPhases = (
-				359BEE13DD78032A2CB791E8 /* Check Pods Manifest.lock */,
+				B5825066F03BDD65A25F2701 /* \U0001f4e6 Check Pods Manifest.lock */,
 				74CC7A221C2C13BF00829368 /* Start Samples */,
 				775BEE771C1E8ECC008D1629 /* Sources */,
 				775BEE781C1E8ECC008D1629 /* Frameworks */,
 				775BEE791C1E8ECC008D1629 /* Resources */,
-				0B3B6C05EE2F8A3B30DE551F /* Copy Pods Resources */,
-				5ED24D6A09B32268BB031206 /* Embed Pods Frameworks */,
+				685399B3421CD1410375A2AD /* \U0001f4e6 Embed Pods Frameworks */,
+				C715566148067A7FFAB7797D /* \U0001f4e6 Copy Pods Resources */,
 			);
 			buildRules = (
 			);
@@ -341,12 +348,12 @@
 			isa = PBXNativeTarget;
 			buildConfigurationList = 84361D711CA10F8E00F43825 /* Build configuration list for PBXNativeTarget "WeexUITestDemo" */;
 			buildPhases = (
-				84361D271CA10F8E00F43825 /* Check Pods Manifest.lock */,
+				84361D271CA10F8E00F43825 /* \U0001f4e6 Check Pods Manifest.lock */,
 				84361D291CA10F8E00F43825 /* Sources */,
 				84361D3C1CA10F8E00F43825 /* Frameworks */,
 				84361D431CA10F8E00F43825 /* Resources */,
-				84361D6F1CA10F8E00F43825 /* Copy Pods Resources */,
-				84361D701CA10F8E00F43825 /* Embed Pods Frameworks */,
+				84361D6F1CA10F8E00F43825 /* \U0001f4e6 Copy Pods Resources */,
+				84361D701CA10F8E00F43825 /* \U0001f4e6 Embed Pods Frameworks */,
 				567369891CE436EB000A646C /* ShellScript */,
 			);
 			buildRules = (
@@ -430,122 +437,121 @@
 /* End PBXResourcesBuildPhase section */
 
 /* Begin PBXShellScriptBuildPhase section */
-		0B3B6C05EE2F8A3B30DE551F /* Copy Pods Resources */ = {
+		567369891CE436EB000A646C /* ShellScript */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 			);
 			inputPaths = (
 			);
-			name = "Copy Pods Resources";
 			outputPaths = (
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-WeexDemo/Pods-WeexDemo-resources.sh\"\n";
-			showEnvVarsInLog = 0;
+			shellScript = "myFile=\"XcodeCoverage/exportenv.sh\"\n\nif [ -f \"$myFile\" ]; then\nXcodeCoverage/exportenv.sh\nfi";
 		};
-		359BEE13DD78032A2CB791E8 /* Check Pods Manifest.lock */ = {
+		685399B3421CD1410375A2AD /* \U0001f4e6 Embed Pods Frameworks */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 			);
 			inputPaths = (
 			);
-			name = "Check Pods Manifest.lock";
+			name = "\U0001f4e6 Embed Pods Frameworks";
 			outputPaths = (
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n    cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n    exit 1\nfi\n";
+			shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-WeexDemo/Pods-WeexDemo-frameworks.sh\"\n";
 			showEnvVarsInLog = 0;
 		};
-		567369891CE436EB000A646C /* ShellScript */ = {
+		74CC7A221C2C13BF00829368 /* Start Samples */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 			);
 			inputPaths = (
 			);
+			name = "Start Samples";
 			outputPaths = (
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "myFile=\"XcodeCoverage/exportenv.sh\"\n\nif [ -f \"$myFile\" ]; then\nXcodeCoverage/exportenv.sh\nfi";
+			shellScript = "set -x\n\nif nc -w 5 -z localhost 12580 ; then\n    echo \"Port 12580 already in use, server is running\"\nelse\n    open \"$SRCROOT/../../start\"\nfi\n\n";
 		};
-		5ED24D6A09B32268BB031206 /* Embed Pods Frameworks */ = {
+		84361D271CA10F8E00F43825 /* \U0001f4e6 Check Pods Manifest.lock */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 			);
 			inputPaths = (
 			);
-			name = "Embed Pods Frameworks";
+			name = "\U0001f4e6 Check Pods Manifest.lock";
 			outputPaths = (
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "
-";
+			shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n    cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n    exit 1\nfi\n";
 			showEnvVarsInLog = 0;
 		};
-		74CC7A221C2C13BF00829368 /* Start Samples */ = {
+		84361D6F1CA10F8E00F43825 /* \U0001f4e6 Copy Pods Resources */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 			);
 			inputPaths = (
 			);
-			name = "Start Samples";
+			name = "\U0001f4e6 Copy Pods Resources";
 			outputPaths = (
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "set -x\n\nif nc -w 5 -z localhost 12580 ; then\n    echo \"Port 12580 already in use, server is running\"\nelse\n    open \"$SRCROOT/../../start\"\nfi\n\n";
+			shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-WeexUITestDemo/Pods-WeexUITestDemo-resources.sh\"\n";
+			showEnvVarsInLog = 0;
 		};
-		84361D271CA10F8E00F43825 /* Check Pods Manifest.lock */ = {
+		84361D701CA10F8E00F43825 /* \U0001f4e6 Embed Pods Frameworks */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 			);
 			inputPaths = (
 			);
-			name = "Check Pods Manifest.lock";
+			name = "\U0001f4e6 Embed Pods Frameworks";
 			outputPaths = (
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n    cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n    exit 1\nfi\n";
+			shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-WeexUITestDemo/Pods-WeexUITestDemo-frameworks.sh\"\n";
 			showEnvVarsInLog = 0;
 		};
-		84361D6F1CA10F8E00F43825 /* Copy Pods Resources */ = {
+		B5825066F03BDD65A25F2701 /* \U0001f4e6 Check Pods Manifest.lock */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 			);
 			inputPaths = (
 			);
-			name = "Copy Pods Resources";
+			name = "\U0001f4e6 Check Pods Manifest.lock";
 			outputPaths = (
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-WeexUITestDemo/Pods-WeexUITestDemo-resources.sh\"\n";
+			shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n    cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n    exit 1\nfi\n";
 			showEnvVarsInLog = 0;
 		};
-		84361D701CA10F8E00F43825 /* Embed Pods Frameworks */ = {
+		C715566148067A7FFAB7797D /* \U0001f4e6 Copy Pods Resources */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 			);
 			inputPaths = (
 			);
-			name = "Embed Pods Frameworks";
+			name = "\U0001f4e6 Copy Pods Resources";
 			outputPaths = (
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-WeexUITestDemo/Pods-WeexUITestDemo-frameworks.sh\"\n";
+			shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-WeexDemo/Pods-WeexDemo-resources.sh\"\n";
 			showEnvVarsInLog = 0;
 		};
 /* End PBXShellScriptBuildPhase section */
@@ -560,6 +566,7 @@
 				775BEE861C1E8ECC008D1629 /* WXDemoViewController.m in Sources */,
 				74CC79EB1C2B9E4700829368 /* UIViewController+WXDemoNaviBar.m in Sources */,
 				DCABB0011D02975E001C8592 /* WXEventModule.m in Sources */,
+				7478481E1E0CD4910044500D /* WXSyncTestModule.m in Sources */,
 				775BEE831C1E8ECC008D1629 /* AppDelegate.m in Sources */,
 				DCABAFF41D029685001C8592 /* WXATViewHierarchyPlugin.m in Sources */,
 				775BEE801C1E8ECC008D1629 /* main.m in Sources */,
@@ -579,6 +586,8 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				846FC8DB1E1B853600949E7D /* WXATViewHierarchyPlugin.m in Sources */,
+				846FC8DA1E1B853100949E7D /* WXSyncTestModule.m in Sources */,
 				DCA812FB1D0401570029BF62 /* WXImgLoaderDefaultImpl.m in Sources */,
 				DCA812FA1D0401500029BF62 /* WXEventModule.m in Sources */,
 				DCA812F91D0401420029BF62 /* WXSelectComponent.m in Sources */,
@@ -695,6 +704,7 @@
 				ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				DEVELOPMENT_TEAM = "";
 				ENABLE_BITCODE = NO;
 				FRAMEWORK_SEARCH_PATHS = (
 					"$(inherited)",
@@ -724,6 +734,7 @@
 				ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
 				CODE_SIGN_IDENTITY = "iPhone Distribution";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
+				DEVELOPMENT_TEAM = "";
 				ENABLE_BITCODE = NO;
 				FRAMEWORK_SEARCH_PATHS = (
 					"$(inherited)",

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/playground/WeexDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata
----------------------------------------------------------------------
diff --git a/ios/playground/WeexDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/playground/WeexDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..919434a
--- /dev/null
+++ b/ios/playground/WeexDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "self:">
+   </FileRef>
+</Workspace>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/playground/WeexDemo.xcodeproj/xcshareddata/xcschemes/WeexDemo.xcscheme
----------------------------------------------------------------------
diff --git a/ios/playground/WeexDemo.xcodeproj/xcshareddata/xcschemes/WeexDemo.xcscheme b/ios/playground/WeexDemo.xcodeproj/xcshareddata/xcschemes/WeexDemo.xcscheme
index c718bd8..a33c31d 100644
--- a/ios/playground/WeexDemo.xcodeproj/xcshareddata/xcschemes/WeexDemo.xcscheme
+++ b/ios/playground/WeexDemo.xcodeproj/xcshareddata/xcschemes/WeexDemo.xcscheme
@@ -86,7 +86,7 @@
          <EnvironmentVariable
             key = "OS_ACTIVITY_MODE"
             value = "disable"
-            isEnabled = "YES">
+            isEnabled = "NO">
          </EnvironmentVariable>
          <EnvironmentVariable
             key = "JSC_logGC"

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/playground/WeexDemo/AppDelegate.m
----------------------------------------------------------------------
diff --git a/ios/playground/WeexDemo/AppDelegate.m b/ios/playground/WeexDemo/AppDelegate.m
index 4f9c958..76b34e4 100644
--- a/ios/playground/WeexDemo/AppDelegate.m
+++ b/ios/playground/WeexDemo/AppDelegate.m
@@ -15,6 +15,7 @@
 #import "WXImgLoaderDefaultImpl.h"
 #import "DemoDefine.h"
 #import "WXScannerVC.h"
+#import "WXSyncTestModule.h"
 #import <WeexSDK/WeexSDK.h>
 #import <AVFoundation/AVFoundation.h>
 #import <ATSDK/ATManager.h>
@@ -72,13 +73,14 @@
     [WXAppConfiguration setAppName:@"WeexDemo"];
     [WXAppConfiguration setExternalUserAgent:@"ExternalUA"];
     
-    [WXSDKEngine initSDKEnviroment];
+    [WXSDKEngine initSDKEnvironment];
     
     [WXSDKEngine registerHandler:[WXImgLoaderDefaultImpl new] withProtocol:@protocol(WXImgLoaderProtocol)];
     [WXSDKEngine registerHandler:[WXEventModule new] withProtocol:@protocol(WXEventModuleProtocol)];
     
     [WXSDKEngine registerComponent:@"select" withClass:NSClassFromString(@"WXSelectComponent")];
     [WXSDKEngine registerModule:@"event" withClass:[WXEventModule class]];
+    [WXSDKEngine registerModule:@"syncTest" withClass:[WXSyncTestModule class]];
     
 #if !(TARGET_IPHONE_SIMULATOR)
     [self checkUpdate];

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/playground/WeexDemo/Scanner/WXScannerVC.m
----------------------------------------------------------------------
diff --git a/ios/playground/WeexDemo/Scanner/WXScannerVC.m b/ios/playground/WeexDemo/Scanner/WXScannerVC.m
index 6bb5a34..52f415a 100644
--- a/ios/playground/WeexDemo/Scanner/WXScannerVC.m
+++ b/ios/playground/WeexDemo/Scanner/WXScannerVC.m
@@ -177,7 +177,7 @@
 {
     if ([url.scheme isEqualToString:@"ws"]) {
         [WXSDKEngine connectDebugServer:url.absoluteString];
-        [WXSDKEngine initSDKEnviroment];
+        [WXSDKEngine initSDKEnvironment];
         
         return YES;
     }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/playground/WeexDemo/WXDemoViewController.m
----------------------------------------------------------------------
diff --git a/ios/playground/WeexDemo/WXDemoViewController.m b/ios/playground/WeexDemo/WXDemoViewController.m
index ce0315a..5ddf3c7 100644
--- a/ios/playground/WeexDemo/WXDemoViewController.m
+++ b/ios/playground/WeexDemo/WXDemoViewController.m
@@ -58,6 +58,7 @@
 - (void)viewDidAppear:(BOOL)animated
 {
     [super viewDidAppear:animated];
+    [_instance fireGlobalEvent:WX_APPLICATION_DID_BECOME_ACTIVE params:nil];
     [self updateInstanceState:WeexInstanceAppear];
 }
 
@@ -73,6 +74,11 @@
     self.navigationController.navigationBarHidden = NO;
 }
 
+- (void)viewWillDisappear:(BOOL)animated
+{
+    [_instance fireGlobalEvent:WX_APPLICATION_WILL_RESIGN_ACTIVE params:nil];
+}
+
 //TODO get height
 - (void)viewDidLayoutSubviews
 {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/playground/WeexDemo/WXSyncTestModule.h
----------------------------------------------------------------------
diff --git a/ios/playground/WeexDemo/WXSyncTestModule.h b/ios/playground/WeexDemo/WXSyncTestModule.h
new file mode 100644
index 0000000..8901436
--- /dev/null
+++ b/ios/playground/WeexDemo/WXSyncTestModule.h
@@ -0,0 +1,14 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+
+#import <Foundation/Foundation.h>
+#import <WeexSDK/WXModuleProtocol.h>
+
+@interface WXSyncTestModule : NSObject <WXModuleProtocol>
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/playground/WeexDemo/WXSyncTestModule.m
----------------------------------------------------------------------
diff --git a/ios/playground/WeexDemo/WXSyncTestModule.m b/ios/playground/WeexDemo/WXSyncTestModule.m
new file mode 100644
index 0000000..99dda0f
--- /dev/null
+++ b/ios/playground/WeexDemo/WXSyncTestModule.m
@@ -0,0 +1,38 @@
+/**
+ * Created by Weex.
+ * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
+ *
+ * This source code is licensed under the Apache Licence 2.0.
+ * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
+ */
+
+#import "WXSyncTestModule.h"
+
+@implementation WXSyncTestModule
+
+WX_EXPORT_METHOD_SYNC(@selector(getString))
+WX_EXPORT_METHOD_SYNC(@selector(getNumber))
+WX_EXPORT_METHOD_SYNC(@selector(getArray))
+WX_EXPORT_METHOD_SYNC(@selector(getObject))
+
+- (NSString *)getString
+{
+    return @"testString";
+}
+
+- (NSUInteger)getNumber
+{
+    return 111111;
+}
+
+- (NSArray *)getArray
+{
+    return @[@(111111),@"testString",@"testString2"];
+}
+
+- (NSDictionary *)getObject
+{
+    return @{@"number":@(111111), @"string1":@"testString",@"string2":@"testString2"};
+}
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK.podspec
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK.podspec b/ios/sdk/WeexSDK.podspec
index ec2b810..17ec318 100644
--- a/ios/sdk/WeexSDK.podspec
+++ b/ios/sdk/WeexSDK.podspec
@@ -2,7 +2,9 @@
 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
@@ -16,9 +18,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/b5123119/ios/sdk/WeexSDK.xcodeproj/project.pbxproj
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK.xcodeproj/project.pbxproj b/ios/sdk/WeexSDK.xcodeproj/project.pbxproj
index 3047af0..9728356 100644
--- a/ios/sdk/WeexSDK.xcodeproj/project.pbxproj
+++ b/ios/sdk/WeexSDK.xcodeproj/project.pbxproj
@@ -47,15 +47,14 @@
 		597334B31D4DE1A600988789 /* WXBridgeMethodTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 597334B21D4DE1A600988789 /* WXBridgeMethodTests.m */; };
 		598805AD1D52D8C800EDED2C /* WXStorageTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 598805AC1D52D8C800EDED2C /* WXStorageTests.m */; };
 		5996BD701D49EC0600C0FEA6 /* WXInstanceWrapTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5996BD6F1D49EC0600C0FEA6 /* WXInstanceWrapTests.m */; };
-		5996BD721D4A219300C0FEA6 /* WXNetworkTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5996BD711D4A219300C0FEA6 /* WXNetworkTests.m */; };
 		5996BD751D4D8A0E00C0FEA6 /* WXSDKEngineTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5996BD741D4D8A0E00C0FEA6 /* WXSDKEngineTests.m */; };
+		59970D2E1E0D228D0049F535 /* WXComponent+GradientColor.h in Headers */ = {isa = PBXBuildFile; fileRef = 59970D2C1E0D228D0049F535 /* WXComponent+GradientColor.h */; };
+		59970D2F1E0D228D0049F535 /* WXComponent+GradientColor.m in Sources */ = {isa = PBXBuildFile; fileRef = 59970D2D1E0D228D0049F535 /* WXComponent+GradientColor.m */; };
 		59A582D41CF481110081FD3E /* WXAppMonitorProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 59A582D31CF481110081FD3E /* WXAppMonitorProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		59A582FC1CF5B17B0081FD3E /* WXBridgeContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 59A582FA1CF5B17B0081FD3E /* WXBridgeContext.h */; };
 		59A582FD1CF5B17B0081FD3E /* WXBridgeContext.m in Sources */ = {isa = PBXBuildFile; fileRef = 59A582FB1CF5B17B0081FD3E /* WXBridgeContext.m */; };
 		59A583081CF5B2FD0081FD3E /* WXNavigationDefaultImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = 59A583041CF5B2FD0081FD3E /* WXNavigationDefaultImpl.h */; };
 		59A583091CF5B2FD0081FD3E /* WXNavigationDefaultImpl.m in Sources */ = {isa = PBXBuildFile; fileRef = 59A583051CF5B2FD0081FD3E /* WXNavigationDefaultImpl.m */; };
-		59A5830A1CF5B2FD0081FD3E /* WXNetworkDefaultImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = 59A583061CF5B2FD0081FD3E /* WXNetworkDefaultImpl.h */; };
-		59A5830B1CF5B2FD0081FD3E /* WXNetworkDefaultImpl.m in Sources */ = {isa = PBXBuildFile; fileRef = 59A583071CF5B2FD0081FD3E /* WXNetworkDefaultImpl.m */; };
 		59A596191CB630E50012CD52 /* WXNavigationProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 59A596171CB630E50012CD52 /* WXNavigationProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		59A5961C1CB630F10012CD52 /* WXComponent+Navigation.h in Headers */ = {isa = PBXBuildFile; fileRef = 59A5961A1CB630F10012CD52 /* WXComponent+Navigation.h */; };
 		59A5961D1CB630F10012CD52 /* WXComponent+Navigation.m in Sources */ = {isa = PBXBuildFile; fileRef = 59A5961B1CB630F10012CD52 /* WXComponent+Navigation.m */; };
@@ -75,6 +74,8 @@
 		59D3CA471CFC3CC0008835DC /* WXSliderComponent.m in Sources */ = {isa = PBXBuildFile; fileRef = 59D3CA461CFC3CC0008835DC /* WXSliderComponent.m */; };
 		59D3CA4A1CFC3CE1008835DC /* NSTimer+Weex.h in Headers */ = {isa = PBXBuildFile; fileRef = 59D3CA481CFC3CE1008835DC /* NSTimer+Weex.h */; };
 		59D3CA4B1CFC3CE1008835DC /* NSTimer+Weex.m in Sources */ = {isa = PBXBuildFile; fileRef = 59D3CA491CFC3CE1008835DC /* NSTimer+Weex.m */; };
+		740451EA1E14BB26004157CB /* WXServiceFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = 740451E81E14BB26004157CB /* WXServiceFactory.h */; };
+		740451EB1E14BB26004157CB /* WXServiceFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 740451E91E14BB26004157CB /* WXServiceFactory.m */; };
 		7408C48E1CFB345D000BCCD0 /* WXComponent+Events.h in Headers */ = {isa = PBXBuildFile; fileRef = 7408C48C1CFB345D000BCCD0 /* WXComponent+Events.h */; };
 		7408C48F1CFB345D000BCCD0 /* WXComponent+Events.m in Sources */ = {isa = PBXBuildFile; fileRef = 7408C48D1CFB345D000BCCD0 /* WXComponent+Events.m */; };
 		740938EC1D3D075700DBB801 /* SRWebSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A27E7D81C3E360B00D7A552 /* SRWebSocket.m */; };
@@ -97,6 +98,15 @@
 		7423899B1C3174EB00D748CA /* WXWeakObjectWrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = 742389991C3174EB00D748CA /* WXWeakObjectWrapper.h */; };
 		7423899C1C3174EB00D748CA /* WXWeakObjectWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = 7423899A1C3174EB00D748CA /* WXWeakObjectWrapper.m */; };
 		7423899F1C32733800D748CA /* WXType.h in Headers */ = {isa = PBXBuildFile; fileRef = 7423899D1C32733800D748CA /* WXType.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		742AD72E1DF98C45007DC46C /* WXResourceRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 742AD7251DF98C45007DC46C /* WXResourceRequest.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		742AD72F1DF98C45007DC46C /* WXResourceRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 742AD7261DF98C45007DC46C /* WXResourceRequest.m */; };
+		742AD7301DF98C45007DC46C /* WXResourceRequestHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 742AD7271DF98C45007DC46C /* WXResourceRequestHandler.h */; };
+		742AD7311DF98C45007DC46C /* WXResourceRequestHandlerDefaultImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = 742AD7281DF98C45007DC46C /* WXResourceRequestHandlerDefaultImpl.h */; };
+		742AD7321DF98C45007DC46C /* WXResourceRequestHandlerDefaultImpl.m in Sources */ = {isa = PBXBuildFile; fileRef = 742AD7291DF98C45007DC46C /* WXResourceRequestHandlerDefaultImpl.m */; };
+		742AD7331DF98C45007DC46C /* WXResourceResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 742AD72A1DF98C45007DC46C /* WXResourceResponse.h */; };
+		742AD7341DF98C45007DC46C /* WXResourceResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 742AD72B1DF98C45007DC46C /* WXResourceResponse.m */; };
+		742AD73A1DF98C8B007DC46C /* WXResourceLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 742AD7381DF98C8B007DC46C /* WXResourceLoader.h */; };
+		742AD73B1DF98C8B007DC46C /* WXResourceLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = 742AD7391DF98C8B007DC46C /* WXResourceLoader.m */; };
 		743933B41C7ED9AA00773BB7 /* WXSimulatorShortcutMananger.h in Headers */ = {isa = PBXBuildFile; fileRef = 743933B21C7ED9AA00773BB7 /* WXSimulatorShortcutMananger.h */; };
 		743933B51C7ED9AA00773BB7 /* WXSimulatorShortcutMananger.m in Sources */ = {isa = PBXBuildFile; fileRef = 743933B31C7ED9AA00773BB7 /* WXSimulatorShortcutMananger.m */; };
 		744BEA551D05178F00452B5D /* WXComponent+Display.h in Headers */ = {isa = PBXBuildFile; fileRef = 744BEA531D05178F00452B5D /* WXComponent+Display.h */; };
@@ -119,6 +129,12 @@
 		746986A01C4E2C010054A57E /* NSArray+Weex.m in Sources */ = {isa = PBXBuildFile; fileRef = 7469869E1C4E2C000054A57E /* NSArray+Weex.m */; };
 		747A787C1D1BAAC900DED9D0 /* WXComponent+ViewManagement.h in Headers */ = {isa = PBXBuildFile; fileRef = 747A787A1D1BAAC900DED9D0 /* WXComponent+ViewManagement.h */; };
 		747A787D1D1BAAC900DED9D0 /* WXComponent+ViewManagement.m in Sources */ = {isa = PBXBuildFile; fileRef = 747A787B1D1BAAC900DED9D0 /* WXComponent+ViewManagement.m */; };
+		74862F791E02B88D00B7A041 /* JSValue+Weex.h in Headers */ = {isa = PBXBuildFile; fileRef = 74862F771E02B88D00B7A041 /* JSValue+Weex.h */; };
+		74862F7A1E02B88D00B7A041 /* JSValue+Weex.m in Sources */ = {isa = PBXBuildFile; fileRef = 74862F781E02B88D00B7A041 /* JSValue+Weex.m */; };
+		74862F7D1E03A0F300B7A041 /* WXModuleMethod.h in Headers */ = {isa = PBXBuildFile; fileRef = 74862F7B1E03A0F300B7A041 /* WXModuleMethod.h */; };
+		74862F7E1E03A0F300B7A041 /* WXModuleMethod.m in Sources */ = {isa = PBXBuildFile; fileRef = 74862F7C1E03A0F300B7A041 /* WXModuleMethod.m */; };
+		74862F811E03A24500B7A041 /* WXComponentMethod.h in Headers */ = {isa = PBXBuildFile; fileRef = 74862F7F1E03A24500B7A041 /* WXComponentMethod.h */; };
+		74862F821E03A24500B7A041 /* WXComponentMethod.m in Sources */ = {isa = PBXBuildFile; fileRef = 74862F801E03A24500B7A041 /* WXComponentMethod.m */; };
 		74896F301D1AC79400D1D593 /* NSObject+WXSwizzle.h in Headers */ = {isa = PBXBuildFile; fileRef = 74896F2E1D1AC79400D1D593 /* NSObject+WXSwizzle.h */; };
 		74896F311D1AC79400D1D593 /* NSObject+WXSwizzle.m in Sources */ = {isa = PBXBuildFile; fileRef = 74896F2F1D1AC79400D1D593 /* NSObject+WXSwizzle.m */; };
 		748B25181C44A6F9005D491E /* WXSDKInstance_private.h in Headers */ = {isa = PBXBuildFile; fileRef = 748B25161C44A6F9005D491E /* WXSDKInstance_private.h */; };
@@ -144,12 +160,16 @@
 		74B8BEFE1DC47B72004A6027 /* WXRootView.h in Headers */ = {isa = PBXBuildFile; fileRef = 74B8BEFC1DC47B72004A6027 /* WXRootView.h */; };
 		74B8BEFF1DC47B72004A6027 /* WXRootView.m in Sources */ = {isa = PBXBuildFile; fileRef = 74B8BEFD1DC47B72004A6027 /* WXRootView.m */; };
 		74B8BF011DC49AFE004A6027 /* WXRootViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 74B8BF001DC49AFE004A6027 /* WXRootViewTests.m */; };
+		74BB5FB91DFEE81A004FC3DF /* WXMetaModule.h in Headers */ = {isa = PBXBuildFile; fileRef = 74BB5FB71DFEE81A004FC3DF /* WXMetaModule.h */; };
+		74BB5FBA1DFEE81A004FC3DF /* WXMetaModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 74BB5FB81DFEE81A004FC3DF /* WXMetaModule.m */; };
 		74C896401D2AC2210043B82A /* WeexSDKTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 74C8963F1D2AC2210043B82A /* WeexSDKTests.m */; };
 		74C896421D2AC2210043B82A /* WeexSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 77D160FD1C02DBE70010B15B /* WeexSDK.framework */; };
 		74CC7A1C1C2BC5F800829368 /* WXCellComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 74CC7A1A1C2BC5F800829368 /* WXCellComponent.h */; };
 		74CC7A1D1C2BC5F800829368 /* WXCellComponent.m in Sources */ = {isa = PBXBuildFile; fileRef = 74CC7A1B1C2BC5F800829368 /* WXCellComponent.m */; };
 		74CC7A201C2BF9DC00829368 /* WXListComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 74CC7A1E1C2BF9DC00829368 /* WXListComponent.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		74CC7A211C2BF9DC00829368 /* WXListComponent.m in Sources */ = {isa = PBXBuildFile; fileRef = 74CC7A1F1C2BF9DC00829368 /* WXListComponent.m */; };
+		74D205201E091B8000128F44 /* WXCallJSMethod.h in Headers */ = {isa = PBXBuildFile; fileRef = 74D2051E1E091B8000128F44 /* WXCallJSMethod.h */; };
+		74D205211E091B8000128F44 /* WXCallJSMethod.m in Sources */ = {isa = PBXBuildFile; fileRef = 74D2051F1E091B8000128F44 /* WXCallJSMethod.m */; };
 		74EF31AA1DE58AE600667A07 /* WXURLRewriteProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 74EF31A91DE58AE600667A07 /* WXURLRewriteProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		74EF31AD1DE58BE200667A07 /* WXURLRewriteDefaultImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = 74EF31AB1DE58BE200667A07 /* WXURLRewriteDefaultImpl.h */; };
 		74EF31AE1DE58BE200667A07 /* WXURLRewriteDefaultImpl.m in Sources */ = {isa = PBXBuildFile; fileRef = 74EF31AC1DE58BE200667A07 /* WXURLRewriteDefaultImpl.m */; };
@@ -186,8 +206,6 @@
 		77E659F21C0C3612008B8775 /* WXModuleFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 77E659F01C0C3612008B8775 /* WXModuleFactory.m */; };
 		77E659FA1C0EE579008B8775 /* WXBridgeMethod.h in Headers */ = {isa = PBXBuildFile; fileRef = 77E659F81C0EE579008B8775 /* WXBridgeMethod.h */; };
 		77E659FB1C0EE579008B8775 /* WXBridgeMethod.m in Sources */ = {isa = PBXBuildFile; fileRef = 77E659F91C0EE579008B8775 /* WXBridgeMethod.m */; };
-		77E65A061C10507B008B8775 /* WXModuleManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 77E65A041C10507B008B8775 /* WXModuleManager.h */; };
-		77E65A071C10507B008B8775 /* WXModuleManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 77E65A051C10507B008B8775 /* WXModuleManager.m */; };
 		77E65A0D1C155E99008B8775 /* WXDivComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 77E65A0B1C155E99008B8775 /* WXDivComponent.h */; };
 		77E65A0E1C155E99008B8775 /* WXDivComponent.m in Sources */ = {isa = PBXBuildFile; fileRef = 77E65A0C1C155E99008B8775 /* WXDivComponent.m */; };
 		77E65A111C155EA8008B8775 /* WXImageComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 77E65A0F1C155EA8008B8775 /* WXImageComponent.h */; };
@@ -200,6 +218,17 @@
 		C41E1A981DC1FD15009C7F90 /* WXDatePickerManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C41E1A961DC1FD15009C7F90 /* WXDatePickerManager.m */; };
 		C4B834271DE69B09007AD27E /* WXPickerModule.m in Sources */ = {isa = PBXBuildFile; fileRef = C4B834251DE69B09007AD27E /* WXPickerModule.m */; };
 		C4B834281DE69B09007AD27E /* WXPickerModule.h in Headers */ = {isa = PBXBuildFile; fileRef = C4B834261DE69B09007AD27E /* WXPickerModule.h */; };
+		C4C30DE81E1B833D00786B6C /* WXComponent+PseudoClassManagement.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C30DE61E1B833D00786B6C /* WXComponent+PseudoClassManagement.m */; };
+		C4C30DE91E1B833D00786B6C /* WXComponent+PseudoClassManagement.h in Headers */ = {isa = PBXBuildFile; fileRef = C4C30DE71E1B833D00786B6C /* WXComponent+PseudoClassManagement.h */; };
+		C4F012791E1502A6003378D0 /* SRWebSocket+Weex.h in Headers */ = {isa = PBXBuildFile; fileRef = C4F012721E1502A6003378D0 /* SRWebSocket+Weex.h */; };
+		C4F0127A1E1502A6003378D0 /* SRWebSocket+Weex.m in Sources */ = {isa = PBXBuildFile; fileRef = C4F012731E1502A6003378D0 /* SRWebSocket+Weex.m */; };
+		C4F0127B1E1502A6003378D0 /* WXWebSocketDefaultImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = C4F012741E1502A6003378D0 /* WXWebSocketDefaultImpl.h */; };
+		C4F0127C1E1502A6003378D0 /* WXWebSocketDefaultImpl.m in Sources */ = {isa = PBXBuildFile; fileRef = C4F012751E1502A6003378D0 /* WXWebSocketDefaultImpl.m */; };
+		C4F0127D1E1502A6003378D0 /* WXWebSocketHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = C4F012761E1502A6003378D0 /* WXWebSocketHandler.h */; };
+		C4F012821E1502E9003378D0 /* WXWebSocketModule.h in Headers */ = {isa = PBXBuildFile; fileRef = C4F012801E1502E9003378D0 /* WXWebSocketModule.h */; };
+		C4F012831E1502E9003378D0 /* WXWebSocketModule.m in Sources */ = {isa = PBXBuildFile; fileRef = C4F012811E1502E9003378D0 /* WXWebSocketModule.m */; };
+		C4F012861E150307003378D0 /* WXWebSocketLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = C4F012841E150307003378D0 /* WXWebSocketLoader.h */; };
+		C4F012871E150307003378D0 /* WXWebSocketLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = C4F012851E150307003378D0 /* WXWebSocketLoader.m */; };
 		D312CE3B1C730DEB00046D68 /* WXWebComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = D312CE391C730DEB00046D68 /* WXWebComponent.h */; };
 		D312CE3C1C730DEB00046D68 /* WXWebComponent.m in Sources */ = {isa = PBXBuildFile; fileRef = D312CE3A1C730DEB00046D68 /* WXWebComponent.m */; };
 		D317338C1C57257000BB7539 /* WXTransform.h in Headers */ = {isa = PBXBuildFile; fileRef = D317338A1C57257000BB7539 /* WXTransform.h */; };
@@ -298,15 +327,14 @@
 		597334B21D4DE1A600988789 /* WXBridgeMethodTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXBridgeMethodTests.m; sourceTree = "<group>"; };
 		598805AC1D52D8C800EDED2C /* WXStorageTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXStorageTests.m; sourceTree = "<group>"; };
 		5996BD6F1D49EC0600C0FEA6 /* WXInstanceWrapTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXInstanceWrapTests.m; sourceTree = "<group>"; };
-		5996BD711D4A219300C0FEA6 /* WXNetworkTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXNetworkTests.m; sourceTree = "<group>"; };
 		5996BD741D4D8A0E00C0FEA6 /* WXSDKEngineTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXSDKEngineTests.m; sourceTree = "<group>"; };
+		59970D2C1E0D228D0049F535 /* WXComponent+GradientColor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "WXComponent+GradientColor.h"; sourceTree = "<group>"; };
+		59970D2D1E0D228D0049F535 /* WXComponent+GradientColor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "WXComponent+GradientColor.m"; sourceTree = "<group>"; };
 		59A582D31CF481110081FD3E /* WXAppMonitorProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXAppMonitorProtocol.h; sourceTree = "<group>"; };
 		59A582FA1CF5B17B0081FD3E /* WXBridgeContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXBridgeContext.h; sourceTree = "<group>"; };
 		59A582FB1CF5B17B0081FD3E /* WXBridgeContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXBridgeContext.m; sourceTree = "<group>"; };
 		59A583041CF5B2FD0081FD3E /* WXNavigationDefaultImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXNavigationDefaultImpl.h; sourceTree = "<group>"; };
 		59A583051CF5B2FD0081FD3E /* WXNavigationDefaultImpl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXNavigationDefaultImpl.m; sourceTree = "<group>"; };
-		59A583061CF5B2FD0081FD3E /* WXNetworkDefaultImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXNetworkDefaultImpl.h; sourceTree = "<group>"; };
-		59A583071CF5B2FD0081FD3E /* WXNetworkDefaultImpl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXNetworkDefaultImpl.m; sourceTree = "<group>"; };
 		59A596171CB630E50012CD52 /* WXNavigationProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXNavigationProtocol.h; sourceTree = "<group>"; };
 		59A5961A1CB630F10012CD52 /* WXComponent+Navigation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "WXComponent+Navigation.h"; sourceTree = "<group>"; };
 		59A5961B1CB630F10012CD52 /* WXComponent+Navigation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "WXComponent+Navigation.m"; sourceTree = "<group>"; };
@@ -326,6 +354,8 @@
 		59D3CA461CFC3CC0008835DC /* WXSliderComponent.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXSliderComponent.m; sourceTree = "<group>"; };
 		59D3CA481CFC3CE1008835DC /* NSTimer+Weex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSTimer+Weex.h"; sourceTree = "<group>"; };
 		59D3CA491CFC3CE1008835DC /* NSTimer+Weex.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSTimer+Weex.m"; sourceTree = "<group>"; };
+		740451E81E14BB26004157CB /* WXServiceFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXServiceFactory.h; sourceTree = "<group>"; };
+		740451E91E14BB26004157CB /* WXServiceFactory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXServiceFactory.m; sourceTree = "<group>"; };
 		7408C48C1CFB345D000BCCD0 /* WXComponent+Events.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "WXComponent+Events.h"; sourceTree = "<group>"; };
 		7408C48D1CFB345D000BCCD0 /* WXComponent+Events.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "WXComponent+Events.m"; sourceTree = "<group>"; };
 		740938EA1D3D026600DBB801 /* WXComponentTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXComponentTests.m; sourceTree = "<group>"; };
@@ -346,6 +376,15 @@
 		742389991C3174EB00D748CA /* WXWeakObjectWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXWeakObjectWrapper.h; sourceTree = "<group>"; };
 		7423899A1C3174EB00D748CA /* WXWeakObjectWrapper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXWeakObjectWrapper.m; sourceTree = "<group>"; };
 		7423899D1C32733800D748CA /* WXType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXType.h; sourceTree = "<group>"; };
+		742AD7251DF98C45007DC46C /* WXResourceRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WXResourceRequest.h; path = Network/WXResourceRequest.h; sourceTree = "<group>"; };
+		742AD7261DF98C45007DC46C /* WXResourceRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WXResourceRequest.m; path = Network/WXResourceRequest.m; sourceTree = "<group>"; };
+		742AD7271DF98C45007DC46C /* WXResourceRequestHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WXResourceRequestHandler.h; path = Network/WXResourceRequestHandler.h; sourceTree = "<group>"; };
+		742AD7281DF98C45007DC46C /* WXResourceRequestHandlerDefaultImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WXResourceRequestHandlerDefaultImpl.h; path = Network/WXResourceRequestHandlerDefaultImpl.h; sourceTree = "<group>"; };
+		742AD7291DF98C45007DC46C /* WXResourceRequestHandlerDefaultImpl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WXResourceRequestHandlerDefaultImpl.m; path = Network/WXResourceRequestHandlerDefaultImpl.m; sourceTree = "<group>"; };
+		742AD72A1DF98C45007DC46C /* WXResourceResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WXResourceResponse.h; path = Network/WXResourceResponse.h; sourceTree = "<group>"; };
+		742AD72B1DF98C45007DC46C /* WXResourceResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WXResourceResponse.m; path = Network/WXResourceResponse.m; sourceTree = "<group>"; };
+		742AD7381DF98C8B007DC46C /* WXResourceLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WXResourceLoader.h; path = Loader/WXResourceLoader.h; sourceTree = "<group>"; };
+		742AD7391DF98C8B007DC46C /* WXResourceLoader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WXResourceLoader.m; path = Loader/WXResourceLoader.m; sourceTree = "<group>"; };
 		743933B21C7ED9AA00773BB7 /* WXSimulatorShortcutMananger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXSimulatorShortcutMananger.h; sourceTree = "<group>"; };
 		743933B31C7ED9AA00773BB7 /* WXSimulatorShortcutMananger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXSimulatorShortcutMananger.m; sourceTree = "<group>"; };
 		744BEA531D05178F00452B5D /* WXComponent+Display.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "WXComponent+Display.h"; sourceTree = "<group>"; };
@@ -369,6 +408,12 @@
 		7469869E1C4E2C000054A57E /* NSArray+Weex.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSArray+Weex.m"; sourceTree = "<group>"; };
 		747A787A1D1BAAC900DED9D0 /* WXComponent+ViewManagement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "WXComponent+ViewManagement.h"; sourceTree = "<group>"; };
 		747A787B1D1BAAC900DED9D0 /* WXComponent+ViewManagement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "WXComponent+ViewManagement.m"; sourceTree = "<group>"; };
+		74862F771E02B88D00B7A041 /* JSValue+Weex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "JSValue+Weex.h"; sourceTree = "<group>"; };
+		74862F781E02B88D00B7A041 /* JSValue+Weex.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "JSValue+Weex.m"; sourceTree = "<group>"; };
+		74862F7B1E03A0F300B7A041 /* WXModuleMethod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXModuleMethod.h; sourceTree = "<group>"; };
+		74862F7C1E03A0F300B7A041 /* WXModuleMethod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXModuleMethod.m; sourceTree = "<group>"; };
+		74862F7F1E03A24500B7A041 /* WXComponentMethod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXComponentMethod.h; sourceTree = "<group>"; };
+		74862F801E03A24500B7A041 /* WXComponentMethod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXComponentMethod.m; sourceTree = "<group>"; };
 		74896F2E1D1AC79400D1D593 /* NSObject+WXSwizzle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+WXSwizzle.h"; sourceTree = "<group>"; };
 		74896F2F1D1AC79400D1D593 /* NSObject+WXSwizzle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+WXSwizzle.m"; sourceTree = "<group>"; };
 		748B25161C44A6F9005D491E /* WXSDKInstance_private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXSDKInstance_private.h; sourceTree = "<group>"; };
@@ -394,6 +439,8 @@
 		74B8BEFC1DC47B72004A6027 /* WXRootView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXRootView.h; sourceTree = "<group>"; };
 		74B8BEFD1DC47B72004A6027 /* WXRootView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXRootView.m; sourceTree = "<group>"; };
 		74B8BF001DC49AFE004A6027 /* WXRootViewTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXRootViewTests.m; sourceTree = "<group>"; };
+		74BB5FB71DFEE81A004FC3DF /* WXMetaModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXMetaModule.h; sourceTree = "<group>"; };
+		74BB5FB81DFEE81A004FC3DF /* WXMetaModule.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXMetaModule.m; sourceTree = "<group>"; };
 		74C27A011CEC441D004E488E /* WeexSDK-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "WeexSDK-Prefix.pch"; sourceTree = "<group>"; };
 		74C8963D1D2AC2210043B82A /* WeexSDKTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WeexSDKTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
 		74C8963F1D2AC2210043B82A /* WeexSDKTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WeexSDKTests.m; sourceTree = "<group>"; };
@@ -402,6 +449,8 @@
 		74CC7A1B1C2BC5F800829368 /* WXCellComponent.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXCellComponent.m; sourceTree = "<group>"; };
 		74CC7A1E1C2BF9DC00829368 /* WXListComponent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXListComponent.h; sourceTree = "<group>"; };
 		74CC7A1F1C2BF9DC00829368 /* WXListComponent.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXListComponent.m; sourceTree = "<group>"; };
+		74D2051E1E091B8000128F44 /* WXCallJSMethod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXCallJSMethod.h; sourceTree = "<group>"; };
+		74D2051F1E091B8000128F44 /* WXCallJSMethod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXCallJSMethod.m; sourceTree = "<group>"; };
 		74EF31A91DE58AE600667A07 /* WXURLRewriteProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXURLRewriteProtocol.h; sourceTree = "<group>"; };
 		74EF31AB1DE58BE200667A07 /* WXURLRewriteDefaultImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXURLRewriteDefaultImpl.h; sourceTree = "<group>"; };
 		74EF31AC1DE58BE200667A07 /* WXURLRewriteDefaultImpl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXURLRewriteDefaultImpl.m; sourceTree = "<group>"; };
@@ -438,10 +487,8 @@
 		77E659D91C07F594008B8775 /* WXDomModule.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXDomModule.m; sourceTree = "<group>"; };
 		77E659EF1C0C3612008B8775 /* WXModuleFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXModuleFactory.h; sourceTree = "<group>"; };
 		77E659F01C0C3612008B8775 /* WXModuleFactory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXModuleFactory.m; sourceTree = "<group>"; };
-		77E659F81C0EE579008B8775 /* WXBridgeMethod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXBridgeMethod.h; sourceTree = "<group>"; };
-		77E659F91C0EE579008B8775 /* WXBridgeMethod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXBridgeMethod.m; sourceTree = "<group>"; };
-		77E65A041C10507B008B8775 /* WXModuleManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXModuleManager.h; sourceTree = "<group>"; };
-		77E65A051C10507B008B8775 /* WXModuleManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXModuleManager.m; sourceTree = "<group>"; };
+		77E659F81C0EE579008B8775 /* WXBridgeMethod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WXBridgeMethod.h; path = ../Model/WXBridgeMethod.h; sourceTree = "<group>"; };
+		77E659F91C0EE579008B8775 /* WXBridgeMethod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WXBridgeMethod.m; path = ../Model/WXBridgeMethod.m; sourceTree = "<group>"; };
 		77E65A0B1C155E99008B8775 /* WXDivComponent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXDivComponent.h; sourceTree = "<group>"; };
 		77E65A0C1C155E99008B8775 /* WXDivComponent.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXDivComponent.m; sourceTree = "<group>"; };
 		77E65A0F1C155EA8008B8775 /* WXImageComponent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXImageComponent.h; sourceTree = "<group>"; };
@@ -454,6 +501,17 @@
 		C41E1A961DC1FD15009C7F90 /* WXDatePickerManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXDatePickerManager.m; sourceTree = "<group>"; };
 		C4B834251DE69B09007AD27E /* WXPickerModule.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXPickerModule.m; sourceTree = "<group>"; };
 		C4B834261DE69B09007AD27E /* WXPickerModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXPickerModule.h; sourceTree = "<group>"; };
+		C4C30DE61E1B833D00786B6C /* WXComponent+PseudoClassManagement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "WXComponent+PseudoClassManagement.m"; sourceTree = "<group>"; };
+		C4C30DE71E1B833D00786B6C /* WXComponent+PseudoClassManagement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "WXComponent+PseudoClassManagement.h"; sourceTree = "<group>"; };
+		C4F012721E1502A6003378D0 /* SRWebSocket+Weex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "SRWebSocket+Weex.h"; sourceTree = "<group>"; };
+		C4F012731E1502A6003378D0 /* SRWebSocket+Weex.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "SRWebSocket+Weex.m"; sourceTree = "<group>"; };
+		C4F012741E1502A6003378D0 /* WXWebSocketDefaultImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXWebSocketDefaultImpl.h; sourceTree = "<group>"; };
+		C4F012751E1502A6003378D0 /* WXWebSocketDefaultImpl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXWebSocketDefaultImpl.m; sourceTree = "<group>"; };
+		C4F012761E1502A6003378D0 /* WXWebSocketHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXWebSocketHandler.h; sourceTree = "<group>"; };
+		C4F012801E1502E9003378D0 /* WXWebSocketModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXWebSocketModule.h; sourceTree = "<group>"; };
+		C4F012811E1502E9003378D0 /* WXWebSocketModule.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXWebSocketModule.m; sourceTree = "<group>"; };
+		C4F012841E150307003378D0 /* WXWebSocketLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WXWebSocketLoader.h; path = Loader/WXWebSocketLoader.h; sourceTree = "<group>"; };
+		C4F012851E150307003378D0 /* WXWebSocketLoader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WXWebSocketLoader.m; path = Loader/WXWebSocketLoader.m; sourceTree = "<group>"; };
 		D312CE391C730DEB00046D68 /* WXWebComponent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXWebComponent.h; sourceTree = "<group>"; };
 		D312CE3A1C730DEB00046D68 /* WXWebComponent.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXWebComponent.m; sourceTree = "<group>"; };
 		D317338A1C57257000BB7539 /* WXTransform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXTransform.h; sourceTree = "<group>"; };
@@ -552,8 +610,6 @@
 			children = (
 				59A583041CF5B2FD0081FD3E /* WXNavigationDefaultImpl.h */,
 				59A583051CF5B2FD0081FD3E /* WXNavigationDefaultImpl.m */,
-				59A583061CF5B2FD0081FD3E /* WXNetworkDefaultImpl.h */,
-				59A583071CF5B2FD0081FD3E /* WXNetworkDefaultImpl.m */,
 				74EF31AB1DE58BE200667A07 /* WXURLRewriteDefaultImpl.h */,
 				74EF31AC1DE58BE200667A07 /* WXURLRewriteDefaultImpl.m */,
 			);
@@ -580,9 +636,22 @@
 			path = Events;
 			sourceTree = "<group>";
 		};
+		742AD7371DF98C72007DC46C /* Loader */ = {
+			isa = PBXGroup;
+			children = (
+				C4F012841E150307003378D0 /* WXWebSocketLoader.h */,
+				C4F012851E150307003378D0 /* WXWebSocketLoader.m */,
+				742AD7381DF98C8B007DC46C /* WXResourceLoader.h */,
+				742AD7391DF98C8B007DC46C /* WXResourceLoader.m */,
+			);
+			name = Loader;
+			sourceTree = "<group>";
+		};
 		745ED2D31C5F2C7E002DB5A8 /* View */ = {
 			isa = PBXGroup;
 			children = (
+				C4C30DE61E1B833D00786B6C /* WXComponent+PseudoClassManagement.m */,
+				C4C30DE71E1B833D00786B6C /* WXComponent+PseudoClassManagement.h */,
 				745ED2D61C5F2C7E002DB5A8 /* WXView.h */,
 				745ED2D71C5F2C7E002DB5A8 /* WXView.m */,
 				591DD3301D23AD5800BE8709 /* WXErrorView.h */,
@@ -612,6 +681,20 @@
 			path = Display;
 			sourceTree = "<group>";
 		};
+		746A2F431DF82607004719D0 /* Network */ = {
+			isa = PBXGroup;
+			children = (
+				742AD7251DF98C45007DC46C /* WXResourceRequest.h */,
+				742AD7261DF98C45007DC46C /* WXResourceRequest.m */,
+				742AD7271DF98C45007DC46C /* WXResourceRequestHandler.h */,
+				742AD7281DF98C45007DC46C /* WXResourceRequestHandlerDefaultImpl.h */,
+				742AD7291DF98C45007DC46C /* WXResourceRequestHandlerDefaultImpl.m */,
+				742AD72A1DF98C45007DC46C /* WXResourceResponse.h */,
+				742AD72B1DF98C45007DC46C /* WXResourceResponse.m */,
+			);
+			name = Network;
+			sourceTree = "<group>";
+		};
 		749DC2781D408265009E1C91 /* Monitor */ = {
 			isa = PBXGroup;
 			children = (
@@ -665,7 +748,6 @@
 		74EF31C11DE6932900667A07 /* handler */ = {
 			isa = PBXGroup;
 			children = (
-				5996BD711D4A219300C0FEA6 /* WXNetworkTests.m */,
 				74EF31C21DE6935600667A07 /* WXURLRewriteTests.m */,
 			);
 			name = handler;
@@ -722,8 +804,10 @@
 		77D161181C02DCB90010B15B /* Sources */ = {
 			isa = PBXGroup;
 			children = (
+				C4F012711E1502A6003378D0 /* WebSocket */,
 				DC0F99301D48E5320087C6AF /* WeexSDK.h */,
 				2AF626C61C191E2200E71A38 /* Layout */,
+				742AD7371DF98C72007DC46C /* Loader */,
 				7408C48B1CFB345D000BCCD0 /* Events */,
 				7461F88B1CFB373100F62D44 /* Display */,
 				74A4BA581CABBBA300195969 /* Debug */,
@@ -738,6 +822,7 @@
 				77D1611A1C02DD3C0010B15B /* Manager */,
 				749DC2781D408265009E1C91 /* Monitor */,
 				77D1611B1C02DD3C0010B15B /* Model */,
+				746A2F431DF82607004719D0 /* Network */,
 				77D1611C1C02DD3C0010B15B /* Protocol */,
 				74C27A001CEC4371004E488E /* Supporting Files */,
 			);
@@ -747,6 +832,14 @@
 		77D161191C02DD3C0010B15B /* Bridge */ = {
 			isa = PBXGroup;
 			children = (
+				77E659F81C0EE579008B8775 /* WXBridgeMethod.h */,
+				77E659F91C0EE579008B8775 /* WXBridgeMethod.m */,
+				74862F7B1E03A0F300B7A041 /* WXModuleMethod.h */,
+				74862F7C1E03A0F300B7A041 /* WXModuleMethod.m */,
+				74862F7F1E03A24500B7A041 /* WXComponentMethod.h */,
+				74862F801E03A24500B7A041 /* WXComponentMethod.m */,
+				74D2051E1E091B8000128F44 /* WXCallJSMethod.h */,
+				74D2051F1E091B8000128F44 /* WXCallJSMethod.m */,
 				59597F961D2A041700EE9317 /* WXDebugLoggerBridge.h */,
 				59597F971D2A041700EE9317 /* WXDebugLoggerBridge.m */,
 				59A582FA1CF5B17B0081FD3E /* WXBridgeContext.h */,
@@ -755,6 +848,8 @@
 				77D1613B1C02DEA60010B15B /* WXJSCoreBridge.m */,
 				74AD99821D5B0E59008F0336 /* WXPolyfillSet.h */,
 				74AD99831D5B0E59008F0336 /* WXPolyfillSet.m */,
+				74862F771E02B88D00B7A041 /* JSValue+Weex.h */,
+				74862F781E02B88D00B7A041 /* JSValue+Weex.m */,
 			);
 			path = Bridge;
 			sourceTree = "<group>";
@@ -762,6 +857,8 @@
 		77D1611A1C02DD3C0010B15B /* Manager */ = {
 			isa = PBXGroup;
 			children = (
+				740451E81E14BB26004157CB /* WXServiceFactory.h */,
+				740451E91E14BB26004157CB /* WXServiceFactory.m */,
 				DCF0875F1DCAE161005CD6EB /* WXInvocationConfig.h */,
 				DCF087601DCAE161005CD6EB /* WXInvocationConfig.m */,
 				C41E1A951DC1FD15009C7F90 /* WXDatePickerManager.h */,
@@ -770,8 +867,6 @@
 				77D161271C02DE1A0010B15B /* WXSDKManager.m */,
 				77D161361C02DE940010B15B /* WXBridgeManager.h */,
 				77D161371C02DE940010B15B /* WXBridgeManager.m */,
-				77E65A041C10507B008B8775 /* WXModuleManager.h */,
-				77E65A051C10507B008B8775 /* WXModuleManager.m */,
 				77E659EF1C0C3612008B8775 /* WXModuleFactory.h */,
 				77E659F01C0C3612008B8775 /* WXModuleFactory.m */,
 				74A4BA9C1CB3C0A100195969 /* WXHandlerFactory.h */,
@@ -794,8 +889,6 @@
 				748B25161C44A6F9005D491E /* WXSDKInstance_private.h */,
 				77D161221C02DDD10010B15B /* WXSDKInstance.h */,
 				77D161231C02DDD10010B15B /* WXSDKInstance.m */,
-				77E659F81C0EE579008B8775 /* WXBridgeMethod.h */,
-				77E659F91C0EE579008B8775 /* WXBridgeMethod.m */,
 			);
 			path = Model;
 			sourceTree = "<group>";
@@ -864,6 +957,8 @@
 		77E659D71C07F585008B8775 /* Module */ = {
 			isa = PBXGroup;
 			children = (
+				C4F012801E1502E9003378D0 /* WXWebSocketModule.h */,
+				C4F012811E1502E9003378D0 /* WXWebSocketModule.m */,
 				C4B834251DE69B09007AD27E /* WXPickerModule.m */,
 				C4B834261DE69B09007AD27E /* WXPickerModule.h */,
 				DCA0EF621D6EED6F00CB18B9 /* WXGlobalEventModule.h */,
@@ -890,6 +985,8 @@
 				D362F94E1C83EDA20003F546 /* WXWebViewModule.m */,
 				D334510A1D3E19B80083598A /* WXCanvasModule.h */,
 				D334510B1D3E19B80083598A /* WXCanvasModule.m */,
+				74BB5FB71DFEE81A004FC3DF /* WXMetaModule.h */,
+				74BB5FB81DFEE81A004FC3DF /* WXMetaModule.m */,
 			);
 			path = Module;
 			sourceTree = "<group>";
@@ -942,6 +1039,8 @@
 				741081251CEDB4EC001BC6E5 /* WXComponent_internal.h */,
 				D33451061D3E19480083598A /* WXCanvasComponent.h */,
 				D33451071D3E19480083598A /* WXCanvasComponent.m */,
+				59970D2C1E0D228D0049F535 /* WXComponent+GradientColor.h */,
+				59970D2D1E0D228D0049F535 /* WXComponent+GradientColor.m */,
 			);
 			path = Component;
 			sourceTree = "<group>";
@@ -963,6 +1062,18 @@
 			name = Frameworks;
 			sourceTree = "<group>";
 		};
+		C4F012711E1502A6003378D0 /* WebSocket */ = {
+			isa = PBXGroup;
+			children = (
+				C4F012721E1502A6003378D0 /* SRWebSocket+Weex.h */,
+				C4F012731E1502A6003378D0 /* SRWebSocket+Weex.m */,
+				C4F012741E1502A6003378D0 /* WXWebSocketDefaultImpl.h */,
+				C4F012751E1502A6003378D0 /* WXWebSocketDefaultImpl.m */,
+				C4F012761E1502A6003378D0 /* WXWebSocketHandler.h */,
+			);
+			path = WebSocket;
+			sourceTree = "<group>";
+		};
 		DC9F46841D61AC9100A88239 /* module */ = {
 			isa = PBXGroup;
 			children = (
@@ -992,6 +1103,7 @@
 				2AE5B7521CAB7DBD0082FDDB /* WXAComponent.h in Headers */,
 				77D1614F1C02E3880010B15B /* WXUtility.h in Headers */,
 				743933B41C7ED9AA00773BB7 /* WXSimulatorShortcutMananger.h in Headers */,
+				74862F811E03A24500B7A041 /* WXComponentMethod.h in Headers */,
 				74915F471C8EB02B00BEBCC0 /* WXAssert.h in Headers */,
 				2A8E658A1C7C7AA20025C7B7 /* WXVideoComponent.h in Headers */,
 				59A5961C1CB630F10012CD52 /* WXComponent+Navigation.h in Headers */,
@@ -1003,19 +1115,22 @@
 				59597F981D2A041700EE9317 /* WXDebugLoggerBridge.h in Headers */,
 				77D161241C02DDD10010B15B /* WXSDKInstance.h in Headers */,
 				74A4BAA61CB4F98300195969 /* WXStreamModule.h in Headers */,
+				740451EA1E14BB26004157CB /* WXServiceFactory.h in Headers */,
 				744BEA591D0520F300452B5D /* WXComponent+Layout.h in Headers */,
 				74A4BA5B1CABBBD000195969 /* WXDebugTool.h in Headers */,
 				2A837AB41CD9DE9200AEDF03 /* WXLoadingIndicator.h in Headers */,
 				747A787C1D1BAAC900DED9D0 /* WXComponent+ViewManagement.h in Headers */,
-				77E65A061C10507B008B8775 /* WXModuleManager.h in Headers */,
 				DC0F99311D48E5320087C6AF /* WeexSDK.h in Headers */,
 				77E659FA1C0EE579008B8775 /* WXBridgeMethod.h in Headers */,
 				2AE5B7561CABA04E0082FDDB /* WXEventModuleProtocol.h in Headers */,
+				C4C30DE91E1B833D00786B6C /* WXComponent+PseudoClassManagement.h in Headers */,
 				591DD3321D23AD5800BE8709 /* WXErrorView.h in Headers */,
 				D362F94F1C83EDA20003F546 /* WXWebViewModule.h in Headers */,
+				C4F012861E150307003378D0 /* WXWebSocketLoader.h in Headers */,
 				77D161381C02DE940010B15B /* WXBridgeManager.h in Headers */,
 				77D161281C02DE1A0010B15B /* WXSDKManager.h in Headers */,
 				59CE27E81CC387DB000BE37A /* WXEmbedComponent.h in Headers */,
+				74BB5FB91DFEE81A004FC3DF /* WXMetaModule.h in Headers */,
 				DCA0EF641D6EED6F00CB18B9 /* WXGlobalEventModule.h in Headers */,
 				2A837AB21CD9DE9200AEDF03 /* WXLoadingComponent.h in Headers */,
 				7423899F1C32733800D748CA /* WXType.h in Headers */,
@@ -1026,7 +1141,9 @@
 				749DC27B1D40827B009E1C91 /* WXMonitor.h in Headers */,
 				77E659DA1C07F594008B8775 /* WXDomModule.h in Headers */,
 				74EF31AD1DE58BE200667A07 /* WXURLRewriteDefaultImpl.h in Headers */,
+				74862F791E02B88D00B7A041 /* JSValue+Weex.h in Headers */,
 				2A1F57B71C75C6A600B58017 /* WXTextInputComponent.h in Headers */,
+				C4F012791E1502A6003378D0 /* SRWebSocket+Weex.h in Headers */,
 				74A4BA9A1CB3BAA100195969 /* WXThreadSafeMutableDictionary.h in Headers */,
 				74A4BA9E1CB3C0A100195969 /* WXHandlerFactory.h in Headers */,
 				741DFE021DDD7D18009B020F /* WXRoundedRect.h in Headers */,
@@ -1041,12 +1158,17 @@
 				D312CE3B1C730DEB00046D68 /* WXWebComponent.h in Headers */,
 				741081261CEDB4EC001BC6E5 /* WXComponent_internal.h in Headers */,
 				77E65A191C155F25008B8775 /* WXScrollerComponent.h in Headers */,
+				742AD7311DF98C45007DC46C /* WXResourceRequestHandlerDefaultImpl.h in Headers */,
+				C4F0127D1E1502A6003378D0 /* WXWebSocketHandler.h in Headers */,
 				DC03ADBA1D508719003F76E7 /* WXTextAreaComponent.h in Headers */,
 				2AC750241C7565690041D390 /* WXIndicatorComponent.h in Headers */,
 				DCAB35FE1D658EB700C0EA70 /* WXRuleManager.h in Headers */,
 				748B25181C44A6F9005D491E /* WXSDKInstance_private.h in Headers */,
+				74862F7D1E03A0F300B7A041 /* WXModuleMethod.h in Headers */,
+				742AD7331DF98C45007DC46C /* WXResourceResponse.h in Headers */,
 				77E65A0D1C155E99008B8775 /* WXDivComponent.h in Headers */,
 				C41E1A971DC1FD15009C7F90 /* WXDatePickerManager.h in Headers */,
+				C4F0127B1E1502A6003378D0 /* WXWebSocketDefaultImpl.h in Headers */,
 				7461F8901CFB373100F62D44 /* WXDisplayQueue.h in Headers */,
 				DCC77C141D770AE300CE7288 /* WXSliderNeighborComponent.h in Headers */,
 				77E659F11C0C3612008B8775 /* WXModuleFactory.h in Headers */,
@@ -1058,9 +1180,11 @@
 				C4B834281DE69B09007AD27E /* WXPickerModule.h in Headers */,
 				59A596311CB632050012CD52 /* WXRootViewController.h in Headers */,
 				DCF087611DCAE161005CD6EB /* WXInvocationConfig.h in Headers */,
+				742AD7301DF98C45007DC46C /* WXResourceRequestHandler.h in Headers */,
 				77E65A151C155EB5008B8775 /* WXTextComponent.h in Headers */,
 				74CC7A1C1C2BC5F800829368 /* WXCellComponent.h in Headers */,
 				74896F301D1AC79400D1D593 /* NSObject+WXSwizzle.h in Headers */,
+				C4F012821E1502E9003378D0 /* WXWebSocketModule.h in Headers */,
 				74EF31AA1DE58AE600667A07 /* WXURLRewriteProtocol.h in Headers */,
 				59A596241CB6311F0012CD52 /* WXStorageModule.h in Headers */,
 				74A4BA851CAD453400195969 /* WXNetworkProtocol.h in Headers */,
@@ -1072,16 +1196,19 @@
 				2A4445BF1CA8FD56009E7C6D /* WXTextComponentProtocol.h in Headers */,
 				746319021C60AFC100EFEBD4 /* WXThreadSafeCounter.h in Headers */,
 				77D1613C1C02DEA60010B15B /* WXJSCoreBridge.h in Headers */,
+				74D205201E091B8000128F44 /* WXCallJSMethod.h in Headers */,
 				741DFE061DDD9B30009B020F /* UIBezierPath+Weex.h in Headers */,
-				59A5830A1CF5B2FD0081FD3E /* WXNetworkDefaultImpl.h in Headers */,
 				2AAFC1B61C48DFF70026D2FE /* WXSDKError.h in Headers */,
+				742AD72E1DF98C45007DC46C /* WXResourceRequest.h in Headers */,
 				D317338C1C57257000BB7539 /* WXTransform.h in Headers */,
 				77D161301C02DE4E0010B15B /* WXComponent.h in Headers */,
 				2AFEB17B1C747139000507FA /* WXInstanceWrap.h in Headers */,
+				59970D2E1E0D228D0049F535 /* WXComponent+GradientColor.h in Headers */,
 				744BEA551D05178F00452B5D /* WXComponent+Display.h in Headers */,
 				741081231CED6756001BC6E5 /* WXComponentFactory.h in Headers */,
 				59D3CA4A1CFC3CE1008835DC /* NSTimer+Weex.h in Headers */,
 				D334510C1D3E19B80083598A /* WXCanvasModule.h in Headers */,
+				742AD73A1DF98C8B007DC46C /* WXResourceLoader.h in Headers */,
 				746319291C71B92600EFEBD4 /* WXModalUIModule.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
@@ -1159,9 +1286,8 @@
 					};
 					74C8963C1D2AC2210043B82A = {
 						CreatedOnToolsVersion = 8.0;
-						DevelopmentTeam = "Xing Zhang";
 						DevelopmentTeamName = "Nanjing Taobao Software Co., Ltd.";
-						ProvisioningStyle = Automatic;
+						ProvisioningStyle = Manual;
 					};
 					77D160FC1C02DBE70010B15B = {
 						CreatedOnToolsVersion = 7.1.1;
@@ -1267,7 +1393,6 @@
 				597334B11D4D9E7F00988789 /* WXSDKManagerTests.m in Sources */,
 				74C896401D2AC2210043B82A /* WeexSDKTests.m in Sources */,
 				598805AD1D52D8C800EDED2C /* WXStorageTests.m in Sources */,
-				5996BD721D4A219300C0FEA6 /* WXNetworkTests.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -1275,12 +1400,13 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				77E65A071C10507B008B8775 /* WXModuleManager.m in Sources */,
 				77D161291C02DE1A0010B15B /* WXSDKManager.m in Sources */,
 				7461F8911CFB373100F62D44 /* WXDisplayQueue.m in Sources */,
 				74896F311D1AC79400D1D593 /* NSObject+WXSwizzle.m in Sources */,
 				746986A01C4E2C010054A57E /* NSArray+Weex.m in Sources */,
 				74B8BEFF1DC47B72004A6027 /* WXRootView.m in Sources */,
+				742AD7321DF98C45007DC46C /* WXResourceRequestHandlerDefaultImpl.m in Sources */,
+				C4F0127C1E1502A6003378D0 /* WXWebSocketDefaultImpl.m in Sources */,
 				77E65A0E1C155E99008B8775 /* WXDivComponent.m in Sources */,
 				2A60CE9D1C91733E00857B9F /* WXSwitchComponent.m in Sources */,
 				2A837AB71CD9DE9200AEDF03 /* WXRefreshComponent.m in Sources */,
@@ -1288,10 +1414,12 @@
 				77E65A1A1C155F25008B8775 /* WXScrollerComponent.m in Sources */,
 				747A787D1D1BAAC900DED9D0 /* WXComponent+ViewManagement.m in Sources */,
 				2A837AB51CD9DE9200AEDF03 /* WXLoadingIndicator.m in Sources */,
+				C4F012831E1502E9003378D0 /* WXWebSocketModule.m in Sources */,
 				59D3CA401CF9ED57008835DC /* Layout.c in Sources */,
-				59A5830B1CF5B2FD0081FD3E /* WXNetworkDefaultImpl.m in Sources */,
 				DCF087621DCAE161005CD6EB /* WXInvocationConfig.m in Sources */,
 				77D161311C02DE4E0010B15B /* WXComponent.m in Sources */,
+				74862F7A1E02B88D00B7A041 /* JSValue+Weex.m in Sources */,
+				740451EB1E14BB26004157CB /* WXServiceFactory.m in Sources */,
 				77E659DB1C07F594008B8775 /* WXDomModule.m in Sources */,
 				D3FC0DF81C508B2A002B9E31 /* WXTimerModule.m in Sources */,
 				594C28921CF9E61A009793A4 /* WXAnimationModule.m in Sources */,
@@ -1300,6 +1428,7 @@
 				744BEA5A1D0520F300452B5D /* WXComponent+Layout.m in Sources */,
 				59A582FD1CF5B17B0081FD3E /* WXBridgeContext.m in Sources */,
 				743933B51C7ED9AA00773BB7 /* WXSimulatorShortcutMananger.m in Sources */,
+				74BB5FBA1DFEE81A004FC3DF /* WXMetaModule.m in Sources */,
 				741081201CED585A001BC6E5 /* WXComponentManager.m in Sources */,
 				1D3000F21D40B9AC004F3B4F /* WXClipboardModule.m in Sources */,
 				741DFE071DDD9B30009B020F /* UIBezierPath+Weex.m in Sources */,
@@ -1313,6 +1442,8 @@
 				59A596321CB632050012CD52 /* WXRootViewController.m in Sources */,
 				DCC77C131D770AE300CE7288 /* WXSliderNeighborComponent.m in Sources */,
 				2A8E658B1C7C7AA20025C7B7 /* WXVideoComponent.m in Sources */,
+				74862F7E1E03A0F300B7A041 /* WXModuleMethod.m in Sources */,
+				742AD7341DF98C45007DC46C /* WXResourceResponse.m in Sources */,
 				77E65A161C155EB5008B8775 /* WXTextComponent.m in Sources */,
 				746319031C60AFC100EFEBD4 /* WXThreadSafeCounter.m in Sources */,
 				74A4BAA71CB4F98300195969 /* WXStreamModule.m in Sources */,
@@ -1323,15 +1454,18 @@
 				DCAB35FF1D658EB700C0EA70 /* WXRuleManager.m in Sources */,
 				77D161251C02DDD10010B15B /* WXSDKInstance.m in Sources */,
 				74EF31AE1DE58BE200667A07 /* WXURLRewriteDefaultImpl.m in Sources */,
+				C4C30DE81E1B833D00786B6C /* WXComponent+PseudoClassManagement.m in Sources */,
 				74915F481C8EB02B00BEBCC0 /* WXAssert.m in Sources */,
 				59A596251CB6311F0012CD52 /* WXStorageModule.m in Sources */,
 				2AFEB17C1C747139000507FA /* WXInstanceWrap.m in Sources */,
 				74A4BA5C1CABBBD000195969 /* WXDebugTool.m in Sources */,
+				742AD73B1DF98C8B007DC46C /* WXResourceLoader.m in Sources */,
 				D334510D1D3E19B80083598A /* WXCanvasModule.m in Sources */,
 				741081241CED6756001BC6E5 /* WXComponentFactory.m in Sources */,
 				D362F9501C83EDA20003F546 /* WXWebViewModule.m in Sources */,
 				2A1F57B81C75C6A600B58017 /* WXTextInputComponent.m in Sources */,
 				74CC7A1D1C2BC5F800829368 /* WXCellComponent.m in Sources */,
+				74862F821E03A24500B7A041 /* WXComponentMethod.m in Sources */,
 				77E65A121C155EA8008B8775 /* WXImageComponent.m in Sources */,
 				2A837AB31CD9DE9200AEDF03 /* WXLoadingComponent.m in Sources */,
 				2AE5B7531CAB7DBD0082FDDB /* WXAComponent.m in Sources */,
@@ -1341,6 +1475,7 @@
 				7423899C1C3174EB00D748CA /* WXWeakObjectWrapper.m in Sources */,
 				744BEA561D05178F00452B5D /* WXComponent+Display.m in Sources */,
 				7408C48F1CFB345D000BCCD0 /* WXComponent+Events.m in Sources */,
+				C4F012871E150307003378D0 /* WXWebSocketLoader.m in Sources */,
 				745ED2DB1C5F2C7E002DB5A8 /* WXView.m in Sources */,
 				DC03ADB91D508719003F76E7 /* WXTextAreaComponent.m in Sources */,
 				59A596231CB6311F0012CD52 /* WXNavigatorModule.m in Sources */,
@@ -1351,7 +1486,9 @@
 				7463192A1C71B92600EFEBD4 /* WXModalUIModule.m in Sources */,
 				77D161501C02E3880010B15B /* WXUtility.m in Sources */,
 				74A4BA9F1CB3C0A100195969 /* WXHandlerFactory.m in Sources */,
+				742AD72F1DF98C45007DC46C /* WXResourceRequest.m in Sources */,
 				7461F8931CFB373100F62D44 /* WXLayer.m in Sources */,
+				74D205211E091B8000128F44 /* WXCallJSMethod.m in Sources */,
 				59D3CA471CFC3CC0008835DC /* WXSliderComponent.m in Sources */,
 				77D1613D1C02DEA60010B15B /* WXJSCoreBridge.m in Sources */,
 				C41E1A981DC1FD15009C7F90 /* WXDatePickerManager.m in Sources */,
@@ -1359,6 +1496,8 @@
 				749DC27C1D40827B009E1C91 /* WXMonitor.m in Sources */,
 				77E659FB1C0EE579008B8775 /* WXBridgeMethod.m in Sources */,
 				C4B834271DE69B09007AD27E /* WXPickerModule.m in Sources */,
+				C4F0127A1E1502A6003378D0 /* SRWebSocket+Weex.m in Sources */,
+				59970D2F1E0D228D0049F535 /* WXComponent+GradientColor.m in Sources */,
 				77D161391C02DE940010B15B /* WXBridgeManager.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
@@ -1402,8 +1541,10 @@
 		74C896461D2AC2210043B82A /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
+				CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = NO;
 				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+				DEVELOPMENT_TEAM = "";
 				HEADER_SEARCH_PATHS = (
 					"$(inherited)",
 					"$(PROJECT_DIR)/WeexSDK/Dependency",
@@ -1425,8 +1566,10 @@
 		74C896471D2AC2210043B82A /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
+				CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = NO;
 				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+				DEVELOPMENT_TEAM = "";
 				HEADER_SEARCH_PATHS = (
 					"$(inherited)",
 					"$(PROJECT_DIR)/WeexSDK/Dependency",
@@ -1546,6 +1689,7 @@
 		77D161121C02DBE70010B15B /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
+				CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = NO;
 				CLANG_ENABLE_MODULES = NO;
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
@@ -1589,6 +1733,7 @@
 		77D161131C02DBE70010B15B /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
+				CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = NO;
 				CLANG_ENABLE_MODULES = NO;
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				DEFINES_MODULE = YES;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK.xcodeproj/xcshareddata/xcschemes/WeexSDKTests.xcscheme
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK.xcodeproj/xcshareddata/xcschemes/WeexSDKTests.xcscheme b/ios/sdk/WeexSDK.xcodeproj/xcshareddata/xcschemes/WeexSDKTests.xcscheme
new file mode 100644
index 0000000..36ea8e3
--- /dev/null
+++ b/ios/sdk/WeexSDK.xcodeproj/xcshareddata/xcschemes/WeexSDKTests.xcscheme
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "0800"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "NO"
+            buildForArchiving = "NO"
+            buildForAnalyzing = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "74C8963C1D2AC2210043B82A"
+               BuildableName = "WeexSDKTests.xctest"
+               BlueprintName = "WeexSDKTests"
+               ReferencedContainer = "container:WeexSDK.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES">
+      <Testables>
+         <TestableReference
+            skipped = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "74C8963C1D2AC2210043B82A"
+               BuildableName = "WeexSDKTests.xctest"
+               BlueprintName = "WeexSDKTests"
+               ReferencedContainer = "container:WeexSDK.xcodeproj">
+            </BuildableReference>
+         </TestableReference>
+      </Testables>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
+      allowLocationSimulation = "YES">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "74C8963C1D2AC2210043B82A"
+            BuildableName = "WeexSDKTests.xctest"
+            BlueprintName = "WeexSDKTests"
+            ReferencedContainer = "container:WeexSDK.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "74C8963C1D2AC2210043B82A"
+            BuildableName = "WeexSDKTests.xctest"
+            BlueprintName = "WeexSDKTests"
+            ReferencedContainer = "container:WeexSDK.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>
\ No newline at end of file


[28/50] [abbrv] incubator-weex git commit: * [doc] updated guide/intro/how-it-works

Posted by ji...@apache.org.
* [doc] updated guide/intro/how-it-works


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

Branch: refs/heads/master
Commit: f9686073c92143fbe6ee473609632b686128766b
Parents: 0d244c7
Author: Jinjiang <zh...@me.com>
Authored: Thu Feb 16 17:23:28 2017 +0800
Committer: Jinjiang <zh...@me.com>
Committed: Thu Feb 16 17:23:28 2017 +0800

----------------------------------------------------------------------
 doc/source/cn/guide/intro/how-it-works.md | 38 +++++++---------
 doc/source/guide/intro/how-it-works.md    | 62 +++++++++++++++++++++++++-
 2 files changed, 78 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/f9686073/doc/source/cn/guide/intro/how-it-works.md
----------------------------------------------------------------------
diff --git a/doc/source/cn/guide/intro/how-it-works.md b/doc/source/cn/guide/intro/how-it-works.md
index 19818a2..4480005 100644
--- a/doc/source/cn/guide/intro/how-it-works.md
+++ b/doc/source/cn/guide/intro/how-it-works.md
@@ -11,27 +11,24 @@ version: 2.1
 
 ## \u6574\u4f53\u67b6\u6784
 
-Weex \u8868\u9762\u4e0a\u662f\u4e00\u4e2a\u5ba2\u6237\u7aef\u6280\u672f\uff0c\u4f46\u5b9e\u9645\u4e0a\u5b83\u4e32\u8054\u8d77\u4e86\u4ece\u672c\u5730\u5f00\u53d1\u73af\u5883\u5230\u4e91\u7aef\u90e8\u7f72\u548c\u5206\u53d1\u7684\u6574\u4e2a\u94fe\u8def\u3002\u5f00\u53d1\u8005\u9996\u5148\u53ef\u4ee5\u5728\u672c\u5730\u60f3\u64b0\u5199 web \u9875\u9762\u4e00\u6837\u64b0\u5199\u4e00\u4e2a app \u7684\u9875\u9762\uff0c\u7136\u540e\u7f16\u8bd1\u6210\u4e00\u6bb5 JavaScript \u4ee3\u7801\uff0c\u5f62\u6210 Weex \u7684\u4e00\u4e2a JS bundle\uff1b\u5728\u4e91\u7aef\uff0c\u5f00\u53d1\u8005\u53ef\u4ee5\u628a\u751f\u6210\u7684 JS bundle \u90e8\u7f72\u4e0a\u53bb\uff0c\u7136\u540e\u901a\u8fc7\u7f51\u7edc\u8bf7\u6c42\u6216\u9884\u4e0b\u53d1\u7684\u65b9\u5f0f\u4f20\u9012\u5230\u7528\u6237\u7684\u79fb\u52a8\u5e94\u7528\u5ba2\u6237\u7aef\uff1b\u5728\u79fb\u52a8\u5e94\u7528\u5ba2\u6237\u7aef\u91cc\uff0cWeexSDK \u4f1a\u51c6\u5907\u597d\u4e00\u4e2a JavaScript \u5f15\u64ce\uff0c\u5e76\u4e14\u5728\u7528\u6237\u6253\u5f00\u4e00\u4e2a Weex \u9875\u9762\u65f6\u6267\u884c\u76f8\u5e94\u7684 JS bundle\uff0c\u5e76\u5728\u6267\u884c\u8fc7\u7a0b\u4e2d\u4ea7\u751f\u5404\u79cd\u547d\u4ee4\u53d1\u9001\u5230 native \u7aef\u8fdb\u884c\u7684\u754c\u9762\u6e32\u67d3\u6216\u6570\u636e\u5b58\u50a8\u3001\u7f51\u7edc\u901a\u4fe1\u3001\u8c03\u7528\u8bbe\u5907\u529f\u80fd\u3001\u7528\u6237\u4ea4\u4e92\u54cd\u5e94\u7b49\u79fb\u52a8\u5e94\u7528\u7684\u573a\u666f\u5b9e\u8df5\uff1b\u540c\u65f6\uff0c\u5982\u679c\u7528\u6237\u6ca1\u6709\u5b89\u88c5\u79fb\u52a8\u5e94\u7528\uff0c\u4ed6\u4ecd\u7136\u53ef\u4ee5\u5728\u6d4f\u89c8\u5668\u91cc\u6253\u5f00\u4e00\u4e2a\u76f8\u540c\u7684 web \u9875\u9762\uff0c\u8fd9\u4e2a\u9875\u9762\u662f\u4f7f\u7528\u76f8\u540c\u7684\u9875\u9762\u6e90\u4ee3\u7801\uff0c\u901a\u8fc7\u6d4f\u89c8\u5668\u91cc\u7684 JavaScript \u5f15\u64ce\u8fd0\u884c\u8d77\u6765\u7684\u3002
+Weex \u8868\u9762\u4e0a\u662f\u4e00\u4e2a\u5ba2\u6237\u7aef\u6280\u672f\uff0c\u4f46\u5b9e\u9645\u4e0a\u5b83\u4e32\u8054\u8d77\u4e86\u4ece\u672c\u5730\u5f00\u53d1\u73af\u5883\u5230\u4e91\u7aef\u90e8\u7f72\u548c\u5206\u53d1\u7684\u6574\u4e2a\u94fe\u8def\u3002\u5f00\u53d1\u8005\u9996\u5148\u53ef\u4ee5\u5728\u672c\u5730\u50cf\u64b0\u5199 web \u9875\u9762\u4e00\u6837\u64b0\u5199\u4e00\u4e2a app \u7684\u9875\u9762\uff0c\u7136\u540e\u7f16\u8bd1\u6210\u4e00\u6bb5 JavaScript \u4ee3\u7801\uff0c\u5f62\u6210 Weex \u7684\u4e00\u4e2a JS bundle\uff1b\u5728\u4e91\u7aef\uff0c\u5f00\u53d1\u8005\u53ef\u4ee5\u628a\u751f\u6210\u7684 JS bundle \u90e8\u7f72\u4e0a\u53bb\uff0c\u7136\u540e\u901a\u8fc7\u7f51\u7edc\u8bf7\u6c42\u6216\u9884\u4e0b\u53d1\u7684\u65b9\u5f0f\u4f20\u9012\u5230\u7528\u6237\u7684\u79fb\u52a8\u5e94\u7528\u5ba2\u6237\u7aef\uff1b\u5728\u79fb\u52a8\u5e94\u7528\u5ba2\u6237\u7aef\u91cc\uff0cWeexSDK \u4f1a\u51c6\u5907\u597d\u4e00\u4e2a JavaScript \u5f15\u64ce\uff0c\u5e76\u4e14\u5728\u7528\u6237\u6253\u5f00\u4e00\u4e2a Weex \u9875\u9762\u65f6\u6267\u884c\u76f8\u5e94\u7684 JS bundle\uff0c\u5e76\u5728\u6267\u884c\u8fc7\u7a0b\u4e2d\u4ea7\u751f\u5404\u79cd\u547d\u4ee4\u53d1\u9001\u5230 native \u7aef\u8fdb\u884c\u7684\u754c\u9762\u6e32\u67d3\u6216\u6570\u636e\u5b58\u50a8\u3001\u7f51\u7edc\u901a\u4fe1\u3001\u8c03\u7528\u8bbe\u5907\u529f\u80fd\u3001\u7528\u6237\u4ea4\u4e92\u54cd\u5e94\u7b49\u79fb\u52a8\u5e94\u7528\u7684\u573a\u666f\u5b9e\u8df5\uff1b\u540c\u65f6\uff0c\u5982\u679c\u7528\u6237\u6ca1\u6709\u5b89\u88c5\u79fb\u52a8\u5e94\u7528\uff0c\u4ed6\u4ecd\u7136\u53ef\u4ee5\u5728\u6d4f\u89c8\u5668\u91cc\u6253\u5f00\u4e00\u4e2a\u76f8\u540c\u7684 web \u9875\u9762\uff0c\u8fd9\u4e2a\u9875\u9762\u662f\u4f7f\u7528\u76f8\u540c\u7684\u9875\u9762\u6e90\u4ee3\u7801\uff0c\u901a\u8fc7\u6d4f\u89c8\u5668\u91cc\u7684 JavaScript \u5f15\u64ce\u8fd0\u884c\u8d77\u6765\u7684\u3002
 
 ![How it works](../images/flow.png)
 
 ## \u672c\u5730\u5f00\u53d1\u73af\u5883
 
-Weex \u7684\u672c\u5730\u5f00\u53d1\u73af\u5883\u57fa\u4e8e web \u5f00\u53d1\u4f53\u9a8c\u800c\u8bbe\u8ba1\uff0cweb \u5f00\u53d1\u8005\u53ef\u4ee5\u901a\u8fc7\u81ea\u5df1\u719f\u6089\u7684 HTML/CSS/JavaScript \u6280\u672f\u548c\u8bed\u6cd5\u5b9e\u73b0\u79fb\u52a8\u5e94\u7528\u7684\u754c\u9762\u3002\u540c\u65f6 Weex \u4e5f\u5bf9 Vue.js \u8fd9\u4e00\u975e\u5e38\u4f18\u79c0\u7684\u524d\u7aef\u6846\u67b6\u505a\u4e86\u5b98\u65b9\u7684\u652f\u6301\u3002
+Weex \u7684\u672c\u5730\u5f00\u53d1\u73af\u5883\u57fa\u4e8e web \u5f00\u53d1\u4f53\u9a8c\u800c\u8bbe\u8ba1\uff0cweb \u5f00\u53d1\u8005\u53ef\u4ee5\u901a\u8fc7\u81ea\u5df1\u719f\u6089\u7684 HTML/CSS/JavaScript \u6280\u672f\u548c\u8bed\u6cd5\u5b9e\u73b0\u79fb\u52a8\u5e94\u7528\u7684\u754c\u9762\u3002\u540c\u65f6 Weex \u4e5f\u5bf9 [Vue.js](https://vuejs.org/) \u8fd9\u4e00\u975e\u5e38\u4f18\u79c0\u7684\u524d\u7aef\u6846\u67b6\u505a\u4e86\u5b98\u65b9\u7684\u652f\u6301\u3002
 
 \u9664\u6b64\u4e4b\u5916\uff0cWeex \u7684\u5de5\u7a0b\u8bbe\u8ba1\u4e5f\u662f web \u5f00\u53d1\u8005\u975e\u5e38\u719f\u6089\u7684\uff0c\u9996\u5148 web \u5f00\u53d1\u8005\u53ef\u4ee5\u4f7f\u7528\u81ea\u5df1\u719f\u6089\u7684 npm \u8fdb\u884c\u4f9d\u8d56\u7ba1\u7406\uff1b\u5176\u6b21 web \u5f00\u53d1\u8005\u5728\u901a\u8fc7\u9879\u76ee\u811a\u624b\u67b6\u521d\u59cb\u5316\u5de5\u7a0b\u3001\u5f00\u53d1\u3001\u8c03\u8bd5\u3001\u8d28\u91cf\u63a7\u5236\u7b49\u5404\u4e2a\u73af\u8282\uff0c\u90fd\u53ef\u4ee5\u53c2\u8003 web \u5f00\u53d1\u5df2\u6709\u7684\u6700\u4f73\u5b9e\u8df5\u3002
 
 \u548c\u5982\u4eca web \u5f00\u53d1\u7684\u6700\u4f73\u5b9e\u8df5\u4e00\u6837\uff0cWeex \u4f1a\u628a\u4e00\u4e2a\u9875\u9762\u7684\u6e90\u4ee3\u7801\u5168\u90e8\u7f16\u8bd1\u6253\u5305\u6210\u4e00\u4e2a JS bundle\uff0c\u5728\u6d4f\u89c8\u5668\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u628a\u8fd9\u4e2a JS bundle \u4f5c\u4e3a\u4e00\u6bb5 `<script>` \u8f7d\u5165\u7f51\u9875\uff0c\u5728\u5ba2\u6237\u7aef\u91cc\uff0c\u6211\u4eec\u628a\u8fd9\u6bb5 JS bundle \u8f7d\u5165\u672c\u5730\uff0c\u5e76\u901a\u8fc7 WeexSDK \u76f4\u63a5\u6267\u884c\u3002
 
-<!-- \u548c web \u5f00\u53d1\u7684\u5f02\u540c -->
+**\u76f8\u5173\u9605\u8bfb**
 
-<!-- \u548c vue \u5f00\u53d1\u7684\u5f02\u540c -->
-
-<!-- \u5982\u4f55\u521b\u5efa\u4e00\u4e2a\u65b0\u9879\u76ee -->
-
-<!-- \u5982\u4f55\u5728 native \u91cc debug -->
-
-<!-- \u5982\u4f55\u5728 html5 \u91cc debug -->
+* [Weex \u548c web \u5e73\u53f0\u7684\u5dee\u5f02](../../references/platform-difference.html)
+* [Vue 2.x \u5728 Weex \u548c web \u4e2d\u7684\u5dee\u5f02](../../references/vue/difference-with-web.html)
+* [\u5feb\u901f\u4e0a\u624b](../index.html)
+* [\u4f7f\u7528 Devtools](./devtools.html)
 
 ## \u4e91\u7aef\u90e8\u7f72\u548c\u5206\u53d1
 
@@ -45,22 +42,21 @@ Weex \u7684 iOS \u548c Android \u5ba2\u6237\u7aef\u4e2d\u90fd\u4f1a\u8fd0\u884c\u4e00\u4e2a JavaScript \u5f15\u64ce\uff0c\u6765
 
 ## \u5ba2\u6237\u7aef\u6e32\u67d3\u5c42
 
-Weex \u76ee\u524d\u63d0\u4f9b\u4e86 iOS \u548c Android \u4e24\u4e2a\u5ba2\u6237\u7aef\u7684 native \u6e32\u67d3\u5c42\u3002\u6bcf\u4e2a\u7aef\u90fd\u57fa\u4e8e DOM \u6a21\u578b\u8bbe\u8ba1\u5e76\u5b9e\u73b0\u4e86\u6807\u51c6\u7684\u754c\u9762\u6e32\u67d3\u63a5\u53e3\u4f9b JavaScript \u5f15\u64ce\u8c03\u7528\u3002\u5e76\u4e14\u7ed3\u5408 web \u6807\u51c6\u548c native \u7684\u7279\u70b9\u548c\u4f18\u52bf\u5b9e\u73b0\u4e86\u4e00\u5957\u7edf\u4e00\u7684\u7ec4\u4ef6\u548c\u6a21\u5757\u3002\u5c24\u5176\u662f\u5728\u754c\u9762\u9996\u5c4f\u52a0\u8f7d\u65f6\u95f4\u3001native \u4e0b\u957f\u5217\u8868\u7684\u8d44\u6e90\u5f00\u9500\u548c\u590d\u7528\u60c5\u51b5\u3001CPU\u3001\u5185\u5b58\u3001\u5e27\u7387 \u7b49\u5173\u952e\u6307\u6807\u4e0a\uff0c\u90fd\u6709\u975e\u5e38\u4f18\u79c0\u7684\u8868\u73b0\u3002Weex \u5b98\u65b9\u5df2\u7ecf\u63d0\u4f9b\u4e86\u4e00\u7ec4\u5f00\u53d1\u8005\u6700\u5e38\u7528\u7684\u7ec4\u4ef6\u548c\u6a21\u5757\uff0c\u4f46\u9762\u5bf9\u4e30\u5bcc\u591a\u6837\u7684\u79fb\u52a8\u5e94\u7528\u7814\u53d1\u9700\u6c42\uff0c\u56e2\u961f\u4e5f\u96be\u514d\u4f1a\u529b\u4e0d\u4ece\u5fc3\uff0c\u4e3a\u6b64\u6211\u4eec\u63d0\u4f9b\u4e86\u7075\u6d3b\u81ea\u7531\u7684\u6a2a\u5411\u6269\u5c55\u80fd\u529b\uff0c\u5f00\u53d1\u8005\u53ef\u4ee5\u6839\u636e\u81ea\u8eab\u7684\u60c5\u51b5\u5b9a\u5236\u5c5e\u4e8e\u81ea\u5df1\u7684\u5ba2\u6237\u7aef\u7ec4\u4ef6\u548c\u6a21\u5757\uff0c\u8fdb\u4e00\u6b65\u4e30\u5bcc Weex \u5728\u5ba2\u6237\u7aef\u4e0a\u7684\u80fd\u529b\u3002
-
-<!-- \u7ec4\u4ef6\u548c\u6a21\u5757\u548c web \u6807\u51c6\u7684\u533a\u522b -->
-
-<!-- \u5982\u4f55\u63a5\u5165 iOS -->
-
-<!-- \u5982\u4f55\u63a5\u5165 Android -->
+Weex \u76ee\u524d\u63d0\u4f9b\u4e86 iOS \u548c Android \u4e24\u4e2a\u5ba2\u6237\u7aef\u7684 native \u6e32\u67d3\u5c42\u3002\u6bcf\u4e2a\u7aef\u90fd\u57fa\u4e8e DOM \u6a21\u578b\u8bbe\u8ba1\u5e76\u5b9e\u73b0\u4e86\u6807\u51c6\u7684\u754c\u9762\u6e32\u67d3\u63a5\u53e3\u4f9b JavaScript \u5f15\u64ce\u8c03\u7528\u3002\u5e76\u4e14\u7ed3\u5408 web \u6807\u51c6\u548c native \u7684\u7279\u70b9\u548c\u4f18\u52bf\u5b9e\u73b0\u4e86\u4e00\u5957\u7edf\u4e00\u7684\u7ec4\u4ef6\u548c\u6a21\u5757\u3002Weex \u5728\u6027\u80fd\u65b9\u9762\u7684\u8868\u73b0\u4e5f\u662f\u975e\u5e38\u4f18\u5f02\u7684\uff0c\u5c24\u5176\u662f\u754c\u9762\u9996\u5c4f\u52a0\u8f7d\u65f6\u95f4\u3001native \u4e0b\u957f\u5217\u8868\u7684\u8d44\u6e90\u5f00\u9500\u548c\u590d\u7528\u60c5\u51b5\u3001CPU\u3001\u5185\u5b58\u3001\u5e27\u7387 \u7b49\u5173\u952e\u6307\u6807\u3002\u5f53\u7136\uff0c\u5c3d\u7ba1 Weex \u5b98\u65b9\u5df2\u7ecf\u63d0\u4f9b\u4e86\u4e00\u7ec4\u5f00\u53d1\u8005\u6700\u5e38\u7528\u7684\u7ec4\u4ef6\u548c\u6a21\u5757\uff0c\u4f46\u9762\u5bf9\u4e30\u5bcc\u591a\u6837\u7684\u79fb\u52a8\u5e94\u7528\u7814\u53d1\u9700\u6c42\uff0c\u56e2\u961f\u4e5f\u96be\u514d\u4f1a\u529b\u4e0d\u4ece\u5fc3\uff0c\u4e3a\u6b64\u6211\u4eec\u63d0\u4f9b\u4e86\u7075\u6d3b\u81ea\u7531\u7684\u6a2a\u5411\u6269\u5c55\u80fd\u529b\uff0c\u5f00\u53d1\u8005\u53ef\u4ee5\u6839\u636e\u81ea\u8eab\u7684\u60c5\u51b5\u5b9a\u5236\u5c5e\u4e8e\u81ea\u5df1\u7684\u5ba2\u6237\u7aef\u7ec4\u4ef6\u548c\u6a21\u5757\uff0c\u8fdb\u4e00\u6b65\u4e30\u5bcc Weex \u5728\u5ba2\u6237\u7aef\u4e0a\u7684\u80fd\u529b\u3002
 
-<!-- \u5982\u4f55\u6269\u5c55 iOS -->
+**\u76f8\u5173\u94fe\u63a5**
 
-<!-- \u5982\u4f55\u6269\u5c55 Android -->
+* [Weex \u7684\u7ec4\u4ef6\u548c\u6a21\u5757\u8ddf web \u6807\u51c6\u7684\u533a\u522b](../../references/web-standards.html)
+* [\u5982\u4f55\u4f7f\u7528 iOS](../../references/ios-apis.html)
+* [\u5982\u4f55\u4f7f\u7528 Android](../../references/android-apis.html)
+* [\u5982\u4f55\u6269\u5c55 iOS](../../references/advanced/extend-to-ios.html)
+* [\u5982\u4f55\u6269\u5c55 Android](../../references/advanced/extend-to-android.html)
 
 ## \u6d4f\u89c8\u5668\u6e32\u67d3
 
 Weex \u9664\u4e86\u63d0\u4f9b iOS \u548c Android \u7684\u5ba2\u6237\u7aef\u6e32\u67d3\u5c42\u4e4b\u5916\uff0c\u8fd8\u57fa\u4e8e Vue 2.0 \u5bf9\u5b98\u65b9\u7684\u6240\u6709\u7ec4\u4ef6\u548c\u6a21\u5757\u8fdb\u884c\u4e86\u5c01\u88c5\uff0c\u5f00\u53d1\u8005\u53ef\u4ee5\u57fa\u4e8e Vue 2.0 \u7528\u540c\u4e00\u5957\u6e90\u4ee3\u7801\u6784\u5efa\u51fa\u5728\u6d4f\u89c8\u5668\u4e2d\u76f8\u540c\u6548\u679c\u7684\u9875\u9762\u3002\u5e76\u4e14\u540c\u6837\u53ef\u4ee5\u6a2a\u5411\u6269\u5c55\u3002
 
-<!-- \u5982\u4f55\u4f7f\u7528 HTML5 \u7248\u672c -->
+**\u76f8\u5173\u94fe\u63a5**
 
-<!-- \u5982\u4f55\u6269\u5c55 HTML5 -->
\ No newline at end of file
+* [\u5982\u4f55\u4f7f\u7528 HTML5](../../references/html5-apis.html)
+* [\u5982\u4f55\u6269\u5c55 HTML5](../../references/advanced/extend-to-html5.html)

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/f9686073/doc/source/guide/intro/how-it-works.md
----------------------------------------------------------------------
diff --git a/doc/source/guide/intro/how-it-works.md b/doc/source/guide/intro/how-it-works.md
index 5ccf72e..f67f8b4 100644
--- a/doc/source/guide/intro/how-it-works.md
+++ b/doc/source/guide/intro/how-it-works.md
@@ -9,4 +9,64 @@ version: 2.1
 
 # How it works
 
-Work in progress.
\ No newline at end of file
+## Overall Structure
+
+Weex is a client-side technology on the surface, but in fact it connects the whole way from the local development environment to the cloud deployment and distribution.
+
+Developers can first write an app page just like writing a web page, and then compile the app page into a piece of JavaScript which is called Weex JS bundle.
+
+In the cloud, developers can deploy the generated JS bundle. And then it can be requested or pre-fetched from a mobile app with WeexSDK.
+
+The WeexSDK would prepare a JavaScript engine to run corresponding JS bundle when user opens a Weex page anytime. Usually the JS bundle will make some calls to native-side through Weex JS bridge. They let native-side render the user interface or handle user interactions, storage data, make network communications, call device powers and so on.
+
+Even if a user does not install the App, he can still open a same web page in the browser, using the same source code.
+
+![How it works](../images/flow.png)
+
+## Local Development Environment
+
+The design of local development environment of Weex is based on the web development experience. It help web developers writing mobile app UI with their familiar HTML / CSS / JavaScript. At the same time Weex also do the official support to [Vue.js](https://vuejs.org/), a very great front-end framework.
+
+In addition, the management of a Weex project is also very familiar with a web project. First, web developers can use npm packages to manage dependencies. Second, web developers can refer to all best practices from every process of a web project such as scaffolding, development, preview, debugging, test etc.
+
+Also same as the best practice of web development, each Weex page will be built into a JS bundle. In the browser, we put JS bundle into the web page as a `<script>` tag. In the client, we put JS bundle into the local, and execute it in WeexSDK.
+
+**Links**
+
+* [Platform differences between Weex and web](../../references/platform-difference.html)
+* [Differences of using Vue between Weex with web](../../references/vue/difference-with-web.html)
+* [Get Started](../index.html)
+* [Using Devtools](./devtools.html)
+
+## Cloud Deployment & Distribution
+
+Weex JS bundle can be deployed and distributed as a static resource. Almost all current web development system and best practice can be applied to Weex directly such as generating JS bundle through CMS system or deploying JS bundle to static CDN, monitoring JS bundle traffic through server log, caching or pre-fetching JS bundle to reduce networking cost etc.
+
+## Client-side JavaScript Engine
+
+Both iOS and Android client-side of Weex run a JavaScript engine to execute JS bundles and send well defined instructions to the native render layers. We choose JavaScriptCore in iOS and v8 in Android which provide strong performance and stability.
+
+In order to make the mobile resources better utilized, we just run only one instance of JavaScript for all Weex pages. That is, all JS bundles share the same JavaScript instance, but each JS bundle context also isolated well by default in the runtime. We also put Vue 2.0 as a built-in JS Framework, developers do not have to pack it in each JS bundle, which save the size and time of networking.
+
+## Client Rendering Layer
+
+Weex offers both iOS and Android native rendering layers. Each of them are based on the Native DOM model and exposed to JavaScript APIs. At the same time we provide a set of native components and modules to use. Also Weex has high performance especially on first-screen loading time, memory cost and re-reuse of long list, etc.
+
+Although Weex has provided a group of most commonly used components and modules officially. But we definitely know they couldn't satisfy everyone. So we design our native render as extendable as possible. You can extend more components and modules on your own. We can build and share an Weex eco-system together.
+
+**Links**
+
+* [Differences between Weex and web standard](../../references/web-standards.html)
+* [Using Weex in iOS](../../references/ios-apis.html)
+* [Using Weex in Android](../../references/android-apis.html)
+* [Extend to iOS](../../references/advanced/extend-to-ios.html)
+* [Extend to Android](../../references/advanced/extend-to-android.html)
+
+## In the Browser
+
+Besides iOS and Android client, Weex also has a web version based on Vue 2.0. Developers can just use Vue 2.0 to build the same page in browsers.
+
+**Links**
+
+* [Using Weex in HTML5](../../references/html5-apis.html)
+* [Extend to HTML5](../../references/advanced/extend-to-html5.html)


[24/50] [abbrv] incubator-weex git commit: * [ios] add doc for component method

Posted by ji...@apache.org.
* [ios] add doc for component 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/9b69a04b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/9b69a04b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/9b69a04b

Branch: refs/heads/master
Commit: 9b69a04be60dae610cf36462880505917d3034cf
Parents: 0e37541
Author: acton393 <zh...@gmail.com>
Authored: Thu Feb 16 14:30:33 2017 +0800
Committer: acton393 <zh...@gmail.com>
Committed: Thu Feb 16 14:30:33 2017 +0800

----------------------------------------------------------------------
 .../cn/v-0.10/advanced/extend-to-android.md     |  27 +++-
 doc/source/cn/v-0.10/advanced/extend-to-ios.md  | 154 ++++++++++++++++++-
 doc/source/v-0.10/advanced/extend-to-android.md |  57 +++++--
 doc/source/v-0.10/advanced/extend-to-ios.md     |  39 +++++
 4 files changed, 259 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/9b69a04b/doc/source/cn/v-0.10/advanced/extend-to-android.md
----------------------------------------------------------------------
diff --git a/doc/source/cn/v-0.10/advanced/extend-to-android.md b/doc/source/cn/v-0.10/advanced/extend-to-android.md
index a1d760a..f794f73 100644
--- a/doc/source/cn/v-0.10/advanced/extend-to-android.md
+++ b/doc/source/cn/v-0.10/advanced/extend-to-android.md
@@ -141,5 +141,30 @@ public class ImageAdapter implements IWXImgLoaderAdapter {
   }
 }
 ```
-
+#### \u7ec4\u4ef6\u65b9\u6cd5\u652f\u6301
+\u4eceWeexSDK 0.9.5\u5f00\u59cb\uff0c\u4f60\u53ef\u4ee5\u5b9a\u4e49\u7ec4\u4ef6\u65b9\u6cd5
+
+- \u5728\u7ec4\u4ef6\u4e2d\u5982\u4e0b\u58f0\u660e\u4e00\u4e2a\u7ec4\u4ef6\u65b9\u6cd5
+
+ ```java
+ @JSMethod
+ public void focus(){
+ 	//method implementation
+ }
+ ```
+- \u6ce8\u518c\u7ec4\u4e4b\u540e\uff0c\u4f60\u53ef\u4ee5\u5728weex \u6587\u4ef6\u4e2d\u8c03\u7528
+  
+  ```html
+	<template>
+ 		<mycomponent id='mycomponent'></mycomponent>
+	</template>
+	<script>
+   		module.exports = {
+    		created: function() {
+    			this.$el('mycomponent').focus();
+    		}
+   		}
+	</script>
+	```
+	
 \u6ce8:\u5de5\u7a0b\u8981\u6dfb\u52a0\u4f9d\u8d56 `compile 'com.squareup.picasso:picasso:2.5.2'`

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/9b69a04b/doc/source/cn/v-0.10/advanced/extend-to-ios.md
----------------------------------------------------------------------
diff --git a/doc/source/cn/v-0.10/advanced/extend-to-ios.md b/doc/source/cn/v-0.10/advanced/extend-to-ios.md
index 3562035..54b855b 100644
--- a/doc/source/cn/v-0.10/advanced/extend-to-ios.md
+++ b/doc/source/cn/v-0.10/advanced/extend-to-ios.md
@@ -69,9 +69,10 @@ Weex SDK \u53ea\u63d0\u4f9b\u6e32\u67d3\uff0c\u800c\u4e0d\u662f\u5176\u4ed6\u7684\u80fd\u529b\uff0c\u5982\u679c\u4f60\u9700\u8981 \u50cf\u7f51\u7edc
    
    Weex SDK\u6ca1\u6709 \u56fe\u7247\u4e0b\u8f7d\uff0cnavigation \u64cd\u4f5c\u7684\u80fd\u529b\uff0c\u8bf7\u5927\u5bb6\u81ea\u5df1\u5b9e\u73b0\u8fd9\u4e9b protocol
 
-4. **WXImgLoaderProtocol**  
+### handler \u6269\u5c55
+   **WXImgLoaderProtocol**  
 
-   weexSDK \u6ca1\u6709\u56fe\u7247\u4e0b\u8f7d\u7684\u80fd\u529b\uff0c\u9700\u8981\u5b9e\u73b0 WXImgLoaderProtocol,\u53c2\u8003\u4e0b\u9762\u7684\u4f8b\u5b50
+   weexSDK \u6ca1\u6709\u63d0\u4f9b\u56fe\u7247\u4e0b\u8f7d\u7684\u80fd\u529b\uff0c\u9700\u8981\u5b9e\u73b0 WXImgLoaderProtocol,\u53c2\u8003\u4e0b\u9762\u7684\u4f8b\u5b50
    
    ```object-c
    WXImageLoaderProtocol.h
@@ -127,3 +128,152 @@ Weex SDK \u53ea\u63d0\u4f9b\u6e32\u67d3\uff0c\u800c\u4e0d\u662f\u5176\u4ed6\u7684\u80fd\u529b\uff0c\u5982\u679c\u4f60\u9700\u8981 \u50cf\u7f51\u7edc
    
    [WXSDKEngine registerHandler:[WXImgLoaderDefaultImpl new] withProtocol:@protocol(WXImgLoaderProtocol)]
    ```
+
+#### Component \u6269\u5c55
+   \u867d\u7136WeexSDK\u4e2d\u6709\u63d0\u4f9b\u5185\u7f6e\u7684\u4e00\u4e9bComponent\uff0c\u4f46\u8fd9\u6709\u53ef\u80fd\u5e76\u4e0d\u80fd\u6ee1\u8db3\u4f60\u7684\u9700\u6c42\u3002\u5728\u4e4b\u524d\u4f60\u53ef\u80fd\u5df2\u7ecf\u5199\u4e86\u4e00\u4e9b\u5f88\u9177\u70abnative\u7684\u7ec4\u4ef6\uff0c\u60f3\u5305\u88c5\u4e00\u4e0b\uff0c\u5bfc\u5165\u5230Weex\u4e2d\uff0c\u56e0\u6b64\u6211\u4eec\u63d0\u4f9b\u4e86\u8ba9\u5f00\u53d1\u8005\u5b9e\u73b0\u81ea\u5df1\u7684native Component   
+   \u4e0b\u9762\u5c06\u4ee5WeexSDK \u4e2d\u5df2\u7ecf\u5b58\u5728\u7684 Component\uff1a`image`\u4e3a\u4f8b\u5b50\uff0c\u4ecb\u7ecd\u4e00\u4e0b\u5982\u4f55\u6784\u5efa\u4e00\u4e2anative Component.
+   \u5047\u8bbe\u4f60\u5df2\u7ecf\u4e86\u89e3IOS\u5f00\u53d1  
+   1. \u6ce8\u518c Component  
+      \u6ce8\u518c\u4e00\u4e2acomponent\u6bd4\u8f83\u7b80\u5355\uff0c\u8c03\u7528 `WXSDKEngine` \u4e2d\u7684 `registerComponent:withClass:`\u65b9\u6cd5\uff0c\u4f20\u5165\u7ec4\u4ef6\u7684\u6807\u7b7e\u540d\u79f0\uff0c\u8fd8\u6709\u5bf9\u5e94\u7684class  
+      \u7136\u540e\u4f60\u53ef\u4ee5\u521b\u5efa\u4e00\u4e2a `WXImageComponent` \u8868\u793a`image`\u7ec4\u4ef6\u7684\u5b9e\u73b0     \u5728.we \u6587\u4ef6\u4e2d\uff0c\u53ea\u9700\u8981\u5199 
+          <image></image>  
+   2. \u6dfb\u52a0\u5c5e\u6027   
+      \u73b0\u5728\u6211\u4eec\u8981\u505a\u4e00\u4e9b\u8ba9image component\u66f4\u52a0\u5f3a\u5927\u7684\u4e8b\u60c5\u3002\u65e2\u7136\u4f5c\u4e3a\u4e00\u4e2a\u56fe\u7247\u7684component\uff0c\u90a3\u5b83\u5e94\u8be5\u8981\u6709\u6e90\uff0c\u7ed9\u4ed6\u52a0\u4e0a\u4e00\u4e2a `src`\u7684\u5c5e\u6027\uff0c\u540c\u65f6\u7ed9\u5b83\u52a0\u4e0a\u4e00\u4e2a`resize`\u7684\u5c5e\u6027\uff08\u53ef\u4ee5\u914d\u7f6e\u7684\u6709`contain/cover/stretch`\uff09
+      
+  ```
+  @interface WXImageComponent ()
+  
+  @property (nonatomic, strong) NSString *imageSrc;
+  @property (nonatomic, assign) UIViewContentMode resizeMode;
+  
+  @end
+  ```
+   component\u4e2d\u6240\u6709\u7684style\uff0cattribute\uff0cevents\u90fd\u4f1a\u88ab\u4f20\u9012\u5230 Component\u7684\u521d\u59cb\u5316\u65b9\u6cd5\u4e2d\uff0c\u6240\u4ee5\uff0c\u4f60\u53ef\u4ee5\u5728\u521d\u59cb\u5316\u65b9\u6cd5\u4e2d\u5b58\u50a8\u4f60\u611f\u5174\u8da3\u7684\u4e00\u4e9b\u5c5e\u6027\u503c
+      
+  ```
+  @implementation WXImageComponent
+  
+  - (instancetype)initWithRef:(NSString *)ref type:(NSString *)type styles:(NSDictionary *)styles attributes:(NSDictionary *)attributes events:(NSArray *)events weexInstance:(WXSDKInstance *)weexInstance
+  {
+      if (self = [super initWithRef:ref type:type styles:styles attributes:attributes events:events weexInstance:weexInstance]) {
+          _imageSrc = [WXConvert NSString:attributes[@"src"]];
+          _resizeMode = [WXConvert UIViewContentMode:attributes[@"resize"]];
+  }
+  
+      return self;
+  }
+  
+  @end
+  ```
+      
+   attribute\u4e2d\u62ff\u5230\u7684\u503c\u7684\u7c7b\u578b\u90fd\u662f`id`,\u6211\u4eec\u53ef\u4ee5\u7528\u8f6c\u6362\u65b9\u6cd5\u628a\u5b83\u8f6c\u6362\u5230\u4efb\u4f55\u503c\u3002Weex SDK\u63d0\u4f9b\u4e86\u4e00\u4e9b\u57fa\u7840\u7684\u8f6c\u6362\u65b9\u6cd5\uff0c\u53ef\u4ee5\u53c2\u8003 `WXConvert`\u7c7b\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u6dfb\u52a0\u81ea\u5df1\u7684\u8f6c\u6362\u51fd\u6570
+   
+   1. Hooking \u6e32\u67d3\u751f\u547d\u5468\u671f  
+         native \u7684component \u662f\u7531Weex\u7ba1\u7406\u7684\uff0cweex \u521b\u5efa\uff0c\u5e03\u5c40\uff0c\u6e32\u67d3\uff0c\u9500\u6bc1\u3002weex\u7684component\u751f\u547d\u5468\u671f\u90fd\u662f\u53ef\u4ee5hook\u7684\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u751f\u547d\u5468\u671f\u4e2d\u53bb\u505a\u81ea\u5df1\u7684\u4e8b\u60c5
+      
+  | \u65b9\u6cd5 | \u63cf\u8ff0 |
+  | :-: | --- |
+  | initWithRef:type:... | \u7528\u7ed9\u5b9a\u7684\u5c5e\u6027\u521d\u59cb\u5316\u4e00\u4e2acomponent. |
+  | layoutDidFinish | \u5728component\u5b8c\u6210\u5e03\u5c40\u65f6\u5019\u4f1a\u8c03\u7528. |
+  | loadView | \u521b\u5efacomponent\u7ba1\u7406\u7684view. |
+  | viewWillLoad | \u5728component\u7684view\u52a0\u8f7d\u4e4b\u524d\u4f1a\u8c03\u7528. |
+  | viewDidLoad | \u5728component\u7684view\u52a0\u8f7d\u5b8c\u4e4b\u540e\u8c03\u7528. |
+  | viewWillUnload | \u5728component\u7684view\u88ab\u91ca\u653e\u4e4b\u524d\u8c03\u7528. |
+  | viewDidUnload | \u5728component\u7684view\u88ab\u91ca\u653e\u4e4b\u540e\u8c03\u7528. |
+  | updateStyles: | \u5728component\u7684style\u66f4\u65b0\u65f6\u5019\u8c03\u7528. |
+  | updateAttributes: | \u5728component\u7684attribute\u66f4\u65b0\u65f6\u5019\u8c03\u7528. |
+  | addEvent: | \u7ed9component\u6dfb\u52a0event\u7684\u65f6\u5019\u8c03\u7528. |
+  | removeEvent: | \u5728event\u79fb\u9664\u7684\u65f6\u5019\u8c03\u7528. |
+      
+   \u5728image component\u7684\u4f8b\u5b50\u91cc\u9762\uff0c\u5982\u679c\u6211\u4eec\u9700\u8981\u6211\u4eec\u81ea\u5df1\u7684image view \u7684\u8bdd\uff0c\u53ef\u4ee5\u590d\u5199 `loadView`\u8fd9\u4e2a\u65b9\u6cd5.
+   
+   ```
+   - (UIView *)loadView
+   {
+       return [[WXImageView alloc] init];
+   }
+   ```
+   
+   \u73b0\u5728\u6211\u4eec\u4f7f\u7528 `WXImageView` \u6e32\u67d3 `image` component\u3002  
+   1. \u4f5c\u4e3a\u4e00\u4e2aimage component\uff0c\u6211\u4eec\u9700\u8981\u62ff\u5230\u670d\u52a1\u5668\u56fe\u7247\uff0c\u800c\u4e14\u628a\u5b83\u8bbe\u7f6e\u8fdbimage view \u91cc. \u8fd9\u4e2a\u64cd\u4f5c\u53ef\u4ee5\u5728 `viewDidLoad` \u65b9\u6cd5\u4e2d\u505a\uff0c\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5728view\u5df2\u7ecf\u88ab\u521b\u5efa\u800c\u4e14\u52a0\u8f7d\u4e86\u65f6\u5019weex SDK\u4f1a\u8c03\u7528\u5230\uff0c\u800c\u4e14`viewDidLoad`\u8fd9\u4e2a\u65b9\u6cd5\u662f\u4f60\u505a\u989d\u5916\u521d\u59cb\u5316\u5de5\u4f5c\u6bd4\u5982\u6539\u53d8content mode(\u4e5f\u5c31\u662f\u8bbe\u7f6eresize) \u7684\u6700\u597d\u65f6\u95f4.
+   
+   ```
+   - (void)viewDidLoad
+   {
+       UIImageView *imageView = (UIImageView *)self.view;
+       imageView.contentMode = _resizeMode;
+       imageView.userInteractionEnabled = YES;
+       imageView.clipsToBounds = YES;
+       imageView.exclusiveTouch = YES;
+   
+       // Do your image fetching and updating logic
+   }
+   ```
+   
+ 1. \u5982\u679c\u53ef\u4ee5\u6539\u53d8image\u7684src,\u4e5f\u53ef\u4ee5hook `updateAttributes:`\u65b9\u6cd5\u6765\u505a\u5c5e\u6027\u66f4\u65b0\u64cd\u4f5c\uff0c\u5f53`updateAttributes:`\u6216\u8005 `updateStyles:`\u88ab\u8c03\u7528\u7684\u65f6\u5019\uff0c component\u7684view \u5df2\u7ecf\u52a0\u8f7d\u5b8c\u6210
+   
+   ```
+   - (void)updateAttributes:(NSDictionary *)attributes
+   {
+       if (attributes[@"src"]) {
+           _imageSrc = [WXConvert NSString:attributes[@"src"]];
+           // Do your image updating logic
+       }
+   
+       if (attributes[@"resize"]) {
+           _resizeMode = [WXConvert UIViewContentMode:attributes[@"resize"]];
+           self.view.contentMode = _resizeMode;
+       }
+   }
+   ```
+   
+   \u6216\u8bb8\u4f60\u9700\u8981\u8003\u8651\u66f4\u591a\u7684\u751f\u547d\u5468\u671f\u65b9\u6cd5\u53bbHook\uff0c\u5f53\u5e03\u5c40\u5b8c\u6210\u65f6\u5019\uff0c\u50cf`layoutDidFinish`\uff0c\u5982\u679c\u4f60\u60f3\u4e86\u89e3\u66f4\u591a\uff0c\u53ef\u4ee5\u53c2\u8003\u4e00\u4e0b`WXComponent.h` \u58f0\u660e\u7684\u65b9\u6cd5
+   \u73b0\u5728\u4f60\u53ef\u4ee5\u7528\u5728\u4efb\u4f55 .we\u6587\u4ef6\u91cc\u9762\u4f7f\u7528 `<image>`\uff0c\u800c\u4e14\u53ef\u4ee5\u52a0\u4e0a image\u7684\u5c5e\u6027
+   
+   ```
+   <image style="your-custom-style" src="image-remote-source" resize="contain/cover/stretch"></image>
+   ```
+##### component \u65b9\u6cd5
+  WeexSDK 0.9.5 \u4e4b\u540e\u652f\u6301\u4e86\u5728js\u4e2d\u76f4\u63a5\u8c03\u7528component\u7684\u65b9\u6cd5\uff0c\u8fd9\u91cc\u63d0\u4f9b\u4e00\u4e2a\u4f8b\u5b50\uff0c
+  
+  - \u81ea\u5b9a\u4e49\u4e00\u4e2aWXMyCompoenent \u7684\u7ec4\u4ef6
+  
+	 ```
+	 @implementation WXMyComponent
+	 	WX_EXPORT_METHOD(@selector(focus)) // \u66b4\u9732\u8be5\u65b9\u6cd5\u7ed9js
+	 - (instancetype)initWithRef:(NSString *)ref type:(NSString *)type styles:(NSDictionary *)styles attributes:(NSDictionary *)attributes events:(NSArray *)events weexInstance:(WXSDKInstance *)weexInstance
+	 {
+	     if (self = [super initWithRef:ref type:type styles:styles attributes:attributes events:events weexInstance:weexInstance]) {
+	         // handle your attributes
+	         // handle your styles
+	     }
+	     
+	     return self;
+	 }
+	 
+	 - (void)focus
+	   {
+	   		NSLog(@"you got it");
+	   }
+	 @end
+	 ```
+	
+	- \u6ce8\u518c\u7ec4\u4ef6 `[WXSDKEngine registerComponent:@"mycomponent" withClass:[WXMyComponent class]] `
+	- \u5728weex \u6587\u4ef6\u4e2d\u8c03\u7528
+
+		```
+		<template>
+	     		<mycomponent id='mycomponent'></mycomponent>
+	 	</template>
+		<script>
+		   module.exports = {
+		    	created: function() {
+		    		this.$el('mycomponent').focus();
+		    		}
+		   }
+		</script>
+ 		``` 
+ 
+ 
+ 
+ 
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/9b69a04b/doc/source/v-0.10/advanced/extend-to-android.md
----------------------------------------------------------------------
diff --git a/doc/source/v-0.10/advanced/extend-to-android.md b/doc/source/v-0.10/advanced/extend-to-android.md
index dec6758..4816578 100644
--- a/doc/source/v-0.10/advanced/extend-to-android.md
+++ b/doc/source/v-0.10/advanced/extend-to-android.md
@@ -31,7 +31,7 @@ public class WXEventModule extends WXModule{
 
   private static final String WEEX_CATEGORY="com.taobao.android.intent.category.WEEX";
 
-    @WXModuleAnno
+    @JSMethod
     public void openURL(String url){
       //implement your module logic here
     }
@@ -58,7 +58,7 @@ event.openURL("http://www.github.com");
 If the module need implement a callback to javascript, you just add `JSCallback` argument to the method you want expose to javascript:
 
 ```java
-  @WXModuleAnno
+  @JSMethod
   public void openURL(String url,JSCallback callback){
     //implement your module logic here
     Map<String,Object> resp = new HashMap();
@@ -95,19 +95,19 @@ public class MyViewComponent extends WXComponent{
   public MyViewComponent(WXSDKInstance instance, WXDomObject dom,
                      WXVContainer parent, String instanceId, boolean isLazy)
    {
-   public MyViewComponent(WXSDKInstance instance, WXDomObject dom,
-     WXVContainer parent, String instanceId, boolean isLazy) {
-    super(instance, dom, parent, instanceId, isLazy);
-   }
-
-   @Override
-   protected void initView() {
-      mHost = new TextView(mContext);
-   }
-   @WXComponentProp(name=WXDomPropConstant.WX_ATTR_VALUE)
-   public void setMyViewValue(String value) {
-      ((TextView)mHost).setText(value);
-   }
+	   public MyViewComponent(WXSDKInstance instance, WXDomObject dom,
+	     WXVContainer parent, String instanceId, boolean isLazy) {
+	    super(instance, dom, parent, instanceId, isLazy);
+	   }
+
+	   @Override
+	   protected void initView() {
+	      mHost = new TextView(mContext);
+	   }
+	   @WXComponentProp(name=WXDomPropConstant.WX_ATTR_VALUE)
+	   public void setMyViewValue(String value) {
+	      ((TextView)mHost).setText(value);
+	   }
 }
 ```
 
@@ -160,3 +160,30 @@ public class ImageAdapter implements IWXImgLoaderAdapter {
   }
 }
 ```
+#### Component Method
+ from WeexSDK `0.9.5`, you can define your component method
+
+ for example, define a method in component:
+ 
+ ```java
+ 
+ @JSMethod
+ public void focus(){
+ 	//method implementation
+ }
+ 
+ ```
+ after your registration for your own custom component, now you can call it in your js file.
+ 
+ ```html
+<template>
+ 		<mycomponent id='mycomponent'></mycomponent>
+</template>
+<script>
+   module.exports = {
+    	created: function() {
+    		this.$el('mycomponent').focus();
+    		}
+   }
+</script>
+``` 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/9b69a04b/doc/source/v-0.10/advanced/extend-to-ios.md
----------------------------------------------------------------------
diff --git a/doc/source/v-0.10/advanced/extend-to-ios.md b/doc/source/v-0.10/advanced/extend-to-ios.md
index 1ef0a38..cfc69cd 100644
--- a/doc/source/v-0.10/advanced/extend-to-ios.md
+++ b/doc/source/v-0.10/advanced/extend-to-ios.md
@@ -261,6 +261,45 @@ Now you can use `<image>` and its attributes wherever you want in the template.
 ```html
 <image style="your-custom-style" src="image-remote-source" resize="contain/cover/stretch"></image>
 ```
+#### Component Method
+from WeexSDK `0.9.5`, you can define your component method by macro `WX_EXPORT_METHOD`
+for example:
+
+```
+@implementation WXMyComponent
+ +WX_EXPORT_METHOD(@selector(focus))
+ +- (instancetype)initWithRef:(NSString *)ref type:(NSString *)type styles:(NSDictionary *)styles attributes:(NSDictionary *)attributes events:(NSArray *)events weexInstance:(WXSDKInstance *)weexInstance
+ {
+     if (self = [super initWithRef:ref type:type styles:styles attributes:attributes events:events weexInstance:weexInstance]) {
+         // handle your attributes
+         // handle your styles
+     }
+     
+     return self;
+ }
+
+ 
+ - (void)focus
+   {
+   		NSLog(@"you got it");
+   }
+@end
+```
+   
+ after your registration for your own custom component, now you can call it in your js file.
+ 
+```
+<template>
+ 		<mycomponent id='mycomponent'></mycomponent>
+</template>
+<script>
+   module.exports = {
+    	created: function() {
+    		this.$el('mycomponent').focus();
+    		}
+   }
+</script>
+``` 
 
 
 


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

Posted by ji...@apache.org.
Merge pull request #2617 from boboning/ios

iOS updates JS Framework Version to support strcit mode.

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

Branch: refs/heads/master
Commit: 85f9fe29613f90f72aee90e0df2bba0899f4cc81
Parents: e37ebc3 bcba010
Author: \u9690\u5c0f\u98ce <cx...@gmail.com>
Authored: Fri Feb 17 11:55:43 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Fri Feb 17 11:55:43 2017 +0800

----------------------------------------------------------------------
 examples/component/slider-neighbor/index.we     |   28 +-
 examples/component/text-demo.we                 |   17 +-
 examples/index.we                               |    4 +-
 examples/linear-gradient.we                     |   70 +
 examples/showcase/pseudo-class.we               |  102 +
 .../WeexDemo.xcodeproj/project.pbxproj          |   51 +-
 ios/playground/WeexDemo/AppDelegate.m           |   12 +
 .../AppIcon.appiconset/Icon-29.png              |  Bin 1682 -> 1614 bytes
 .../AppIcon.appiconset/Icon-29@2x-1.png         |  Bin 2709 -> 2421 bytes
 .../AppIcon.appiconset/Icon-29@2x.png           |  Bin 2709 -> 2421 bytes
 .../AppIcon.appiconset/Icon-29@3x.png           |  Bin 3724 -> 3236 bytes
 .../AppIcon.appiconset/Icon-40.png              |  Bin 2018 -> 1946 bytes
 .../AppIcon.appiconset/Icon-40@2x-1.png         |  Bin 3368 -> 3016 bytes
 .../AppIcon.appiconset/Icon-40@2x.png           |  Bin 3368 -> 3016 bytes
 .../AppIcon.appiconset/Icon-40@3x.png           |  Bin 4715 -> 4172 bytes
 .../AppIcon.appiconset/Icon-60@2x.png           |  Bin 4715 -> 4172 bytes
 .../AppIcon.appiconset/Icon-60@3x.png           |  Bin 6892 -> 6017 bytes
 .../AppIcon.appiconset/Icon-76.png              |  Bin 3324 -> 2918 bytes
 .../AppIcon.appiconset/Icon-76@2x.png           |  Bin 5937 -> 5088 bytes
 .../AppIcon.appiconset/Icon-83.5@2x.png         |  Bin 6942 -> 5537 bytes
 ios/playground/WeexDemo/Info.plist              |   11 +-
 ios/playground/bundlejs/animation.js            |    3 +-
 ios/playground/bundlejs/component/a-demo.js     |    3 +-
 .../bundlejs/component/countdown-demo.js        |    3 +-
 ios/playground/bundlejs/component/image-demo.js |    3 +-
 ios/playground/bundlejs/component/input-demo.js |    3 +-
 .../bundlejs/component/list/list-demo.js        |    3 +-
 .../bundlejs/component/marquee-demo.js          |    3 +-
 .../bundlejs/component/navigator-demo.js        |    8 +-
 .../bundlejs/component/process-bar-demo.js      |    3 +-
 .../bundlejs/component/scroller-demo.js         |    3 +-
 .../bundlejs/component/slider-neighbor/index.js |  264 ++
 .../slider-neighbor/silder-neighbor.js          |  287 --
 .../bundlejs/component/slider/index.js          |   36 +-
 .../bundlejs/component/tabbar/tabbar-demo.js    |    5 +-
 ios/playground/bundlejs/component/text-demo.js  |  111 +-
 ios/playground/bundlejs/component/video-demo.js |    3 +-
 ios/playground/bundlejs/component/web-demo.js   |   11 +-
 ios/playground/bundlejs/error.js                |    3 +-
 ios/playground/bundlejs/index.js                |    7 +-
 ios/playground/bundlejs/linear-gradient.js      |  367 ++
 ios/playground/bundlejs/module/clipboard.js     |   20 +-
 ios/playground/bundlejs/module/componentRect.js |  563 +++
 ios/playground/bundlejs/module/instance-api.js  |   18 +-
 ios/playground/bundlejs/module/modal.js         |   22 +-
 ios/playground/bundlejs/module/picker-demo.js   |   22 +-
 ios/playground/bundlejs/module/storage-demo.js  |   18 +-
 ios/playground/bundlejs/module/stream-demo.js   |   22 +-
 .../bundlejs/module/websocket-demo.js           | 2409 +++++++++++++
 ios/playground/bundlejs/showcase/calculator.js  |   25 +-
 .../bundlejs/showcase/dropdown/dropdown-demo.js |   30 +-
 .../bundlejs/showcase/dropdown/we-dropdown.js   |   12 +-
 ios/playground/bundlejs/showcase/minesweeper.js |   18 +-
 .../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/image-demo.js |    3 +-
 .../bundlejs/showcase/new-fashion/index.js      |   27 +-
 .../bundlejs/showcase/new-fashion/link.js       |    8 +-
 .../showcase/new-fashion/list/list-demo.js      |    3 +-
 .../bundlejs/showcase/new-fashion/main.js       |  213 +-
 .../bundlejs/showcase/new-fashion/match.js      |   24 +-
 .../bundlejs/showcase/new-fashion/resource.js   |   38 +-
 .../bundlejs/showcase/new-fashion/scene.js      |   24 +-
 .../bundlejs/showcase/pseudo-class.js           | 2422 +++++++++++++
 ios/playground/bundlejs/showcase/ui.js          |   28 +-
 ios/playground/bundlejs/style/index.js          |   80 +-
 ios/playground/bundlejs/style/style-box.js      |   44 +-
 ios/playground/bundlejs/style/style-flex.js     |   52 +-
 ios/playground/bundlejs/style/style-item.js     |   12 +-
 ios/playground/bundlejs/syntax/hello-world-1.js |    4 +-
 ios/playground/bundlejs/syntax/hello-world-2.js |    6 +-
 ios/playground/bundlejs/syntax/hello-world-3.js |   10 +-
 ios/playground/bundlejs/syntax/hello-world-4.js |   14 +-
 ios/playground/bundlejs/syntax/hello-world-5.js |   14 +-
 ios/playground/bundlejs/syntax/hello-world.js   |   14 +-
 ios/playground/bundlejs/syntax/index.js         |   28 +-
 .../bundlejs/syntax/script-component.js         |   24 +-
 ios/playground/bundlejs/syntax/script-data.js   |   12 +-
 ios/playground/bundlejs/syntax/script-events.js |   12 +-
 .../bundlejs/syntax/script-instance.js          |   12 +-
 .../bundlejs/syntax/script-lifecycle.js         |   12 +-
 ios/playground/bundlejs/syntax/script-module.js |   12 +-
 .../bundlejs/syntax/script-options.js           |   12 +-
 .../bundlejs/syntax/template-class.js           |   12 +-
 .../bundlejs/syntax/template-content.js         |   20 +-
 .../bundlejs/syntax/template-event.js           |   12 +-
 ios/playground/bundlejs/syntax/template-if.js   |   12 +-
 .../bundlejs/syntax/template-repeat-update.js   |   12 +-
 .../bundlejs/syntax/template-repeat.js          |   12 +-
 .../bundlejs/syntax/template-style.js           |    8 +-
 ios/playground/bundlejs/template.js             |   15 +-
 ios/playground/bundlejs/test.js                 |  128 +
 ios/playground/bundlejs/vue/animation.js        |  709 ++++
 ios/playground/bundlejs/vue/components/a.js     |  438 +++
 .../bundlejs/vue/components/countdown.js        |  640 ++++
 ios/playground/bundlejs/vue/components/image.js |  641 ++++
 ios/playground/bundlejs/vue/components/input.js |  364 ++
 ios/playground/bundlejs/vue/components/list.js  |  246 ++
 .../bundlejs/vue/components/marquee.js          |  534 +++
 .../bundlejs/vue/components/navigator.js        | 1059 ++++++
 .../bundlejs/vue/components/scroller.js         |  304 ++
 .../bundlejs/vue/components/slider.js           |  898 +++++
 .../bundlejs/vue/components/tabbar.js           |  599 ++++
 ios/playground/bundlejs/vue/components/text.js  |  513 +++
 ios/playground/bundlejs/vue/components/video.js |  396 +++
 ios/playground/bundlejs/vue/components/web.js   |  459 +++
 ios/playground/bundlejs/vue/hello.js            |   99 +
 ios/playground/bundlejs/vue/iconfont.js         |  204 ++
 ios/playground/bundlejs/vue/index.js            |  496 +++
 .../bundlejs/vue/modules/clipboard.js           |  691 ++++
 .../bundlejs/vue/modules/instance-api.js        |  304 ++
 ios/playground/bundlejs/vue/modules/modal.js    |  581 +++
 ios/playground/bundlejs/vue/modules/storage.js  |  381 ++
 ios/playground/bundlejs/vue/modules/stream.js   |  477 +++
 .../bundlejs/vue/showcase/calculator.js         |  340 ++
 .../bundlejs/vue/showcase/itemlist.js           | 1062 ++++++
 .../bundlejs/vue/showcase/new-fashion.js        | 3302 ++++++++++++++++++
 .../bundlejs/vue/showcase/progress.js           |  336 ++
 ios/playground/bundlejs/vue/style/index.js      | 1566 +++++++++
 ios/playground/bundlejs/vue/style/style-box.js  |  780 +++++
 ios/playground/bundlejs/vue/style/style-flex.js |  919 +++++
 ios/playground/bundlejs/vue/style/style-item.js |  155 +
 .../bundlejs/vue/syntax/hello-world-1.js        |   95 +
 .../bundlejs/vue/syntax/hello-world-2.js        |  112 +
 .../bundlejs/vue/syntax/hello-world-3.js        |  127 +
 .../bundlejs/vue/syntax/hello-world-4.js        |  167 +
 .../bundlejs/vue/syntax/hello-world-5.js        |  173 +
 .../bundlejs/vue/syntax/hello-world.js          |  183 +
 .../bundlejs/vue/syntax/script-component.js     |  224 ++
 .../bundlejs/vue/syntax/script-data.js          |  214 ++
 .../bundlejs/vue/syntax/script-events.js        |  161 +
 .../bundlejs/vue/syntax/script-instance.js      |  196 ++
 .../bundlejs/vue/syntax/script-lifecycle.js     |  155 +
 .../bundlejs/vue/syntax/script-module.js        |  156 +
 .../bundlejs/vue/syntax/script-options.js       |  182 +
 .../bundlejs/vue/syntax/template-class.js       |  161 +
 .../bundlejs/vue/syntax/template-content.js     |  189 +
 .../bundlejs/vue/syntax/template-event.js       |  197 ++
 .../bundlejs/vue/syntax/template-if.js          |  165 +
 .../vue/syntax/template-repeat-update.js        |  195 ++
 .../bundlejs/vue/syntax/template-repeat.js      |  170 +
 .../bundlejs/vue/syntax/template-style.js       |  144 +
 ios/playground/bundlejs/vue/template.js         |  796 +++++
 ios/sdk/WeexSDK.podspec                         |    2 +-
 ios/sdk/WeexSDK/Resources/main.js               |   14 +-
 ios/sdk/WeexSDK/Sources/Bridge/WXModuleMethod.m |   12 +-
 .../Sources/Component/WXLoadingIndicator.h      |    1 -
 .../Sources/Component/WXLoadingIndicator.m      |   81 +-
 .../Sources/Component/WXSliderComponent.m       |    7 +-
 .../WeexSDK/Sources/Component/WXTextComponent.m |   13 -
 ios/sdk/WeexSDK/Sources/Component/WXTransform.m |    5 +-
 .../Sources/Handler/WXNavigationDefaultImpl.m   |    6 +-
 ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m   |    2 +-
 .../WeexSDK/Sources/Module/WXAnimationModule.m  |   13 +-
 .../WeexSDK/Sources/Module/WXNavigatorModule.m  |   10 +-
 ios/sdk/WeexSDK/Sources/Utility/WXDefine.h      |    2 +-
 .../Utility/WXSimulatorShortcutManager.m        |   12 +-
 ios/sdk/WeexSDK/Sources/Utility/WXUtility.h     |    4 +-
 ios/sdk/WeexSDK/Sources/Utility/WXUtility.m     |   10 +-
 165 files changed, 31003 insertions(+), 1054 deletions(-)
----------------------------------------------------------------------



[23/50] [abbrv] incubator-weex git commit: Merge pull request #2560 from DoranYun/website

Posted by ji...@apache.org.
Merge pull request #2560 from DoranYun/website

* [doc] New doc: Using devtools.

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

Branch: refs/heads/master
Commit: 0d244c714241128d2d9f6cde73fca3577b03661a
Parents: 01a4a60 2428186
Author: \u52fe\u4e09\u80a1\u56db <zh...@me.com>
Authored: Thu Feb 16 14:17:03 2017 +0800
Committer: GitHub <no...@github.com>
Committed: Thu Feb 16 14:17:03 2017 +0800

----------------------------------------------------------------------
 doc/source/cn/guide/intro/devtools.md           |  99 ++++++++++++
 doc/source/cn/references/common-style.md        | 157 ++++++++++++++++++
 doc/source/cn/references/components/image.md    |   4 +-
 doc/source/cn/references/components/input.md    |  11 +-
 doc/source/cn/references/components/textarea.md |   7 +
 doc/source/guide/intro/devtools.md              | 100 ++++++++++++
 doc/source/references/common-style.md           | 159 +++++++++++++++++++
 doc/source/references/components/image.md       |   3 +-
 doc/source/references/components/input.md       |   7 +
 doc/source/references/components/textarea.md    |   7 +
 10 files changed, 551 insertions(+), 3 deletions(-)
----------------------------------------------------------------------



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

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


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

Branch: refs/heads/master
Commit: 91389e02f30c833795b67c52085829a8716dd2c3
Parents: f8e9e11 0d244c7
Author: boboning <ni...@163.com>
Authored: Thu Feb 16 17:16:21 2017 +0800
Committer: boboning <ni...@163.com>
Committed: Thu Feb 16 17:16:21 2017 +0800

----------------------------------------------------------------------
 .eslintignore                                   |   2 +
 .github/ISSUE_TEMPLATE.md                       |  30 +-
 .github/PULL_REQUEST_TEMPLATE.md                |  26 +-
 .gitignore                                      |   9 +-
 README.md                                       |  37 +-
 doc/.gitignore                                  |   5 -
 doc/INSTALL.md                                  |  38 -
 doc/LICENSE                                     | 202 ----
 doc/NOTICE                                      |   5 -
 doc/README.md                                   |   9 -
 doc/SUMMARY.md                                  |  95 --
 doc/_config.yml                                 | 323 +++++++
 doc/_layouts/header.html                        | 269 ------
 doc/_legacy/core-concepts/animation.md          |  34 -
 doc/_legacy/integrating.md                      |   3 -
 doc/_legacy/syntax/javascript.md                |  53 --
 doc/advanced/extend-to-android.md               | 160 ----
 doc/advanced/extend-to-html5.md                 | 252 -----
 doc/advanced/extend-to-ios.md                   | 262 ------
 doc/advanced/how-data-binding-works.md          |  32 -
 doc/advanced/how-it-works.md                    | 140 ---
 doc/advanced/integrate-to-android.md            | 197 ----
 doc/advanced/integrate-to-html5.md              |  70 --
 doc/advanced/integrate-to-ios.md                | 109 ---
 doc/advanced/main.md                            |   3 -
 doc/ali_addition/weex_doc.css                   | 146 ---
 doc/ali_addition/weex_doc.js                    |  78 --
 doc/book.json                                   |  19 -
 doc/components/a.md                             |  25 -
 doc/components/cell.md                          |  36 -
 doc/components/div.md                           |  42 -
 doc/components/image.md                         |  49 -
 doc/components/indicator.md                     |  92 --
 doc/components/input.md                         |  79 --
 doc/components/list.md                          |  57 --
 doc/components/main.md                          |   3 -
 doc/components/refresh-loading.md               |  27 -
 doc/components/scroller.md                      |  70 --
 doc/components/slider.md                        |  65 --
 doc/components/special-element.md               |  29 -
 doc/components/switch.md                        |  55 --
 doc/components/text.md                          |  60 --
 doc/components/textarea.md                      |  74 --
 doc/components/video.md                         |  49 -
 doc/components/web.md                           |  49 -
 doc/components/wxc-navpage.md                   |  68 --
 doc/components/wxc-tabbar.md                    |  91 --
 doc/demo/animation.md                           |  10 -
 doc/demo/clipboard.md                           |   9 -
 doc/demo/hello-world.md                         |  16 -
 doc/demo/list.md                                |   9 -
 doc/demo/main.md                                |   3 -
 doc/demo/modal.md                               |   9 -
 doc/demo/slider.md                              |   9 -
 doc/faq.md                                      | 127 ---
 doc/guide.md                                    |   3 -
 doc/how-to/customize-a-native-component.md      |  49 -
 doc/how-to/cuszomize-native-apis.md             |  73 --
 doc/how-to/debug-with-html5.md                  |  40 -
 doc/how-to/debug-with-remote-tools.md           |  34 -
 doc/how-to/main.md                              |   3 -
 doc/how-to/preview-in-browser.md                |  31 -
 doc/how-to/preview-in-playground-app.md         |  13 -
 doc/how-to/require-3rd-party-libs.md            |  50 -
 doc/how-to/transform-code-into-js-bundle.md     |  98 --
 doc/images/css-boxmodel.png                     | Bin 12581 -> 0 bytes
 doc/images/css-flexbox-align.jpg                | Bin 35005 -> 0 bytes
 doc/images/css-flexbox-justify.svg              |  59 --
 doc/images/css-flexbox-sample.png               | Bin 3210 -> 0 bytes
 doc/images/how-arch.png                         | Bin 62303 -> 0 bytes
 doc/images/how-render.png                       | Bin 42957 -> 0 bytes
 doc/images/snapshot-animation.gif               | Bin 521431 -> 0 bytes
 doc/images/snapshot-calculator.jpg              | Bin 28504 -> 0 bytes
 doc/images/snapshot-helloworld.png              | Bin 6092 -> 0 bytes
 doc/images/snapshot-minesweeper.jpg             | Bin 53257 -> 0 bytes
 doc/images/snapshot-modals.jpg                  | Bin 27458 -> 0 bytes
 doc/images/snapshot-skeletons.gif               | Bin 518271 -> 0 bytes
 doc/images/tut-cli-qrcode.png                   | Bin 45480 -> 0 bytes
 doc/images/tut-first.png                        | Bin 51434 -> 0 bytes
 doc/images/tut-second.png                       | Bin 78519 -> 0 bytes
 doc/images/tut1.jpg                             | Bin 47442 -> 0 bytes
 doc/images/tut2.jpg                             | Bin 52428 -> 0 bytes
 doc/images/tut3.png                             | Bin 52198 -> 0 bytes
 doc/images/tut4.gif                             | Bin 218245 -> 0 bytes
 doc/modules/animation.md                        |  64 --
 doc/modules/clipboard.md                        |  48 -
 doc/modules/dom.md                              | 109 ---
 doc/modules/globalevent.md                      |  76 --
 doc/modules/main.md                             |  13 -
 doc/modules/modal.md                            | 114 ---
 doc/modules/navigator.md                        |  52 --
 doc/modules/storage.md                          | 104 ---
 doc/modules/stream.md                           |  52 --
 doc/modules/timer.md                            |  66 --
 doc/modules/webview.md                          |  62 --
 doc/package.json                                |  27 +
 doc/references/api.md                           |  78 --
 doc/references/bootstrap.md                     |  41 -
 doc/references/cheatsheet.md                    | 102 --
 doc/references/color-names.md                   | 175 ----
 doc/references/common-attrs.md                  |  80 --
 doc/references/common-event.md                  | 121 ---
 doc/references/common-style.md                  | 202 ----
 doc/references/component-defs.md                | 125 ---
 doc/references/events/appear.md                 |  28 -
 doc/references/events/blur.md                   |  42 -
 doc/references/events/change.md                 |  47 -
 doc/references/events/click.md                  |  43 -
 doc/references/events/disappear.md              |  28 -
 doc/references/events/focus.md                  |  42 -
 doc/references/events/input.md                  |  45 -
 doc/references/gesture.md                       |  66 --
 doc/references/main.md                          |   3 -
 doc/references/replace.md                       |  57 --
 doc/references/styles/background-color.md       |  25 -
 doc/references/styles/color.md                  |  26 -
 doc/references/styles/font-family.md            |  27 -
 doc/references/styles/font-size.md              |  31 -
 doc/references/styles/font-style.md             |  25 -
 doc/references/styles/font-weight.md            |  26 -
 doc/references/styles/line-height.md            |  27 -
 doc/references/styles/lines.md                  |  27 -
 doc/references/styles/main.md                   |  42 -
 doc/references/styles/opacity.md                |  22 -
 doc/references/styles/position.md               |  26 -
 doc/references/styles/text-align.md             |  26 -
 doc/references/styles/text-decoration.md        |  26 -
 doc/references/styles/text-overflow.md          |  32 -
 doc/references/styles/units/color.md            |  30 -
 doc/references/styles/units/length.md           |  12 -
 doc/references/styles/units/number.md           |   7 -
 doc/references/styles/units/percentage.md       |   5 -
 doc/references/text-style.md                    |  36 -
 doc/scaffolds/draft.md                          |   4 +
 doc/scaffolds/page.md                           |   4 +
 doc/scaffolds/post.md                           |   5 +
 doc/source/_posts/cn/hello.md                   |   6 +
 doc/source/_posts/hello_world.md                |   6 +
 doc/source/blog/index.md                        |   4 +
 doc/source/cn/blog/index.md                     |   4 +
 doc/source/cn/download.ejs                      |   3 +
 doc/source/cn/faq.md                            | 227 +++++
 doc/source/cn/guide/.gitkeep                    |   0
 doc/source/cn/guide/dev-with-weexpack.md        |  11 +
 doc/source/cn/guide/images/flow.png             | Bin 0 -> 57741 bytes
 doc/source/cn/guide/images/tut-cli-qrcode.png   | Bin 0 -> 45480 bytes
 doc/source/cn/guide/images/tut-first.png        | Bin 0 -> 51434 bytes
 doc/source/cn/guide/images/tut-second.png       | Bin 0 -> 78519 bytes
 doc/source/cn/guide/images/tut1.jpg             | Bin 0 -> 47442 bytes
 doc/source/cn/guide/images/tut2.jpg             | Bin 0 -> 52428 bytes
 doc/source/cn/guide/images/tut3.png             | Bin 0 -> 52198 bytes
 doc/source/cn/guide/images/tut4.gif             | Bin 0 -> 218245 bytes
 doc/source/cn/guide/index.md                    | 125 +++
 doc/source/cn/guide/integrate-to-your-app.md    | 321 +++++++
 doc/source/cn/guide/intro/app-architecture.md   |  77 ++
 doc/source/cn/guide/intro/devtools.md           |  99 ++
 doc/source/cn/guide/intro/how-it-works.md       |  66 ++
 doc/source/cn/guide/intro/index.md              |  15 +
 doc/source/cn/guide/intro/page-architecture.md  |  48 +
 doc/source/cn/guide/intro/using-vue.md          | 101 ++
 doc/source/cn/guide/intro/web-dev-experience.md |  42 +
 doc/source/cn/guide/intro/write-once.md         |  25 +
 doc/source/cn/index.md                          |   4 +
 doc/source/cn/playground.ejs                    |   3 +
 .../cn/references/advanced/extend-jsfm.md       | 172 ++++
 .../cn/references/advanced/extend-to-android.md | 144 +++
 .../cn/references/advanced/extend-to-html5.md   | 103 +++
 .../cn/references/advanced/extend-to-ios.md     | 235 +++++
 doc/source/cn/references/advanced/index.md      |  15 +
 .../advanced/integrate-devtool-to-android.md    | 271 ++++++
 .../advanced/integrate-devtool-to-ios.md        | 229 +++++
 doc/source/cn/references/android-apis.md        | 214 +++++
 doc/source/cn/references/color-names.md         | 180 ++++
 doc/source/cn/references/common-event.md        | 138 +++
 doc/source/cn/references/common-style.md        | 469 ++++++++++
 doc/source/cn/references/components/a.md        | 104 +++
 doc/source/cn/references/components/cell.md     | 105 +++
 doc/source/cn/references/components/div.md      | 116 +++
 doc/source/cn/references/components/image.md    | 161 ++++
 doc/source/cn/references/components/index.md    |  24 +
 .../cn/references/components/indicator.md       | 135 +++
 doc/source/cn/references/components/input.md    | 181 ++++
 doc/source/cn/references/components/list.md     | 158 ++++
 doc/source/cn/references/components/loading.md  | 125 +++
 doc/source/cn/references/components/refresh.md  | 125 +++
 doc/source/cn/references/components/scroller.md | 174 ++++
 doc/source/cn/references/components/slider.md   | 105 +++
 doc/source/cn/references/components/switch.md   | 133 +++
 doc/source/cn/references/components/text.md     | 101 ++
 doc/source/cn/references/components/textarea.md | 162 ++++
 doc/source/cn/references/components/video.md    |  94 ++
 doc/source/cn/references/components/web.md      | 154 ++++
 doc/source/cn/references/gesture.md             |  59 ++
 doc/source/cn/references/html5-apis.md          |  10 +
 doc/source/cn/references/images/Artboard.jpg    | Bin 0 -> 36223 bytes
 .../cn/references/images/coding_weex_1.jpg      | Bin 0 -> 56225 bytes
 .../cn/references/images/css-boxmodel.png       | Bin 0 -> 12581 bytes
 .../cn/references/images/css-flexbox-align.jpg  | Bin 0 -> 35005 bytes
 .../references/images/css-flexbox-justify.svg   |  59 ++
 .../cn/references/images/css-flexbox-sample.png | Bin 0 -> 3210 bytes
 doc/source/cn/references/images/div_1.jpg       | Bin 0 -> 59561 bytes
 doc/source/cn/references/images/div_2.jpg       | Bin 0 -> 62574 bytes
 doc/source/cn/references/images/div_3.jpg       | Bin 0 -> 82345 bytes
 doc/source/cn/references/images/div_4.jpg       | Bin 0 -> 200642 bytes
 doc/source/cn/references/images/image_1.jpg     | Bin 0 -> 163705 bytes
 doc/source/cn/references/images/image_2.jpg     | Bin 0 -> 255560 bytes
 doc/source/cn/references/images/list_2.jpg      | Bin 0 -> 56635 bytes
 doc/source/cn/references/images/list_3.jpg      | Bin 0 -> 128082 bytes
 doc/source/cn/references/images/list_4.jpg      | Bin 0 -> 339799 bytes
 doc/source/cn/references/images/nav.jpg         | Bin 0 -> 124441 bytes
 doc/source/cn/references/images/nav.png         | Bin 0 -> 83497 bytes
 doc/source/cn/references/images/scroller_1.jpg  | Bin 0 -> 344783 bytes
 doc/source/cn/references/images/style_1.jpg     | Bin 0 -> 59366 bytes
 doc/source/cn/references/images/style_2.jpg     | Bin 0 -> 59696 bytes
 doc/source/cn/references/index.md               |  17 +
 doc/source/cn/references/ios-apis.md            |  91 ++
 doc/source/cn/references/jsfm-apis.md           |  66 ++
 .../cn/references/migration/difference.md       | 249 +++++
 doc/source/cn/references/migration/index.md     |  11 +
 .../references/migration/migration-from-weex.md | 116 +++
 doc/source/cn/references/modules/animation.md   |  96 ++
 doc/source/cn/references/modules/clipboard.md   | 101 ++
 doc/source/cn/references/modules/dom.md         | 210 +++++
 doc/source/cn/references/modules/globalevent.md |  88 ++
 doc/source/cn/references/modules/index.md       |  30 +
 doc/source/cn/references/modules/modal.md       | 139 +++
 doc/source/cn/references/modules/navigator.md   |  90 ++
 doc/source/cn/references/modules/picker.md      | 129 +++
 doc/source/cn/references/modules/storage.md     | 184 ++++
 doc/source/cn/references/modules/stream.md      | 124 +++
 doc/source/cn/references/modules/webview.md     | 137 +++
 doc/source/cn/references/native-dom-api.md      | 223 +++++
 doc/source/cn/references/path.md                |  37 +
 doc/source/cn/references/platform-difference.md |  70 ++
 doc/source/cn/references/text-style.md          |  46 +
 doc/source/cn/references/unit.md                |  64 ++
 .../cn/references/vue/difference-of-vuex.md     |  87 ++
 .../cn/references/vue/difference-with-web.md    | 138 +++
 doc/source/cn/references/vue/index.md           |  12 +
 doc/source/cn/references/web-standards.md       | 584 ++++++++++++
 doc/source/cn/references/weex-variable.md       |  47 +
 .../cn/v-0.10/advanced/create-a-weex-project.md | 271 ++++++
 .../advanced/customize-a-native-component.md    | 168 ++++
 .../cn/v-0.10/advanced/cuszomize-native-apis.md |  85 ++
 .../cn/v-0.10/advanced/extend-to-android.md     | 145 +++
 .../cn/v-0.10/advanced/extend-to-html5.md       | 253 +++++
 doc/source/cn/v-0.10/advanced/extend-to-ios.md  | 129 +++
 .../v-0.10/advanced/how-data-binding-works.md   |  39 +
 .../cn/v-0.10/advanced/images/how-arch.png      | Bin 0 -> 62303 bytes
 .../cn/v-0.10/advanced/images/how-render.png    | Bin 0 -> 42957 bytes
 doc/source/cn/v-0.10/advanced/index.md          | 146 +++
 .../advanced/integrate-devtools-to-android.md   | 272 ++++++
 .../advanced/integrate-devtools-to-ios.md       | 230 +++++
 .../cn/v-0.10/advanced/integrate-to-android.md  | 201 ++++
 .../cn/v-0.10/advanced/integrate-to-html5.md    |  69 ++
 .../cn/v-0.10/advanced/integrate-to-ios.md      | 110 +++
 doc/source/cn/v-0.10/blog/index.md              |   4 +
 .../guide/develop-on-your-local-machine.md      | 175 ++++
 .../cn/v-0.10/guide/how-to/debug-with-html5.md  |  47 +
 doc/source/cn/v-0.10/guide/how-to/index.md      | 185 ++++
 .../guide/how-to/require-3rd-party-libs.md      |  57 ++
 .../how-to/transform-code-into-js-bundle.md     | 112 +++
 doc/source/cn/v-0.10/guide/index.md             |  60 ++
 doc/source/cn/v-0.10/guide/syntax/comm.md       | 134 +++
 .../v-0.10/guide/syntax/composed-component.md   | 158 ++++
 .../cn/v-0.10/guide/syntax/config-n-data.md     |  72 ++
 .../cn/v-0.10/guide/syntax/data-binding.md      | 332 +++++++
 .../cn/v-0.10/guide/syntax/display-logic.md     | 252 +++++
 doc/source/cn/v-0.10/guide/syntax/events.md     | 103 +++
 doc/source/cn/v-0.10/guide/syntax/id.md         | 124 +++
 doc/source/cn/v-0.10/guide/syntax/index.md      | 134 +++
 .../cn/v-0.10/guide/syntax/render-logic.md      |  44 +
 .../cn/v-0.10/guide/syntax/style-n-class.md     | 117 +++
 doc/source/cn/v-0.10/index.md                   |   5 +
 doc/source/cn/v-0.10/references/api.md          |  67 ++
 doc/source/cn/v-0.10/references/cheatsheet.md   | 114 +++
 doc/source/cn/v-0.10/references/color-names.md  | 180 ++++
 doc/source/cn/v-0.10/references/common-attrs.md | 166 ++++
 doc/source/cn/v-0.10/references/common-event.md | 492 ++++++++++
 doc/source/cn/v-0.10/references/common-style.md | 322 +++++++
 .../cn/v-0.10/references/component-defs.md      | 126 +++
 doc/source/cn/v-0.10/references/components/a.md | 273 ++++++
 .../cn/v-0.10/references/components/cell.md     | 191 ++++
 .../cn/v-0.10/references/components/div.md      | 245 +++++
 .../cn/v-0.10/references/components/image.md    | 161 ++++
 .../cn/v-0.10/references/components/index.md    |  24 +
 .../v-0.10/references/components/indicator.md   | 124 +++
 .../cn/v-0.10/references/components/input.md    | 143 +++
 .../cn/v-0.10/references/components/list.md     | 375 ++++++++
 .../cn/v-0.10/references/components/loading.md  | 118 +++
 .../cn/v-0.10/references/components/refresh.md  | 204 ++++
 .../cn/v-0.10/references/components/scroller.md | 324 +++++++
 .../cn/v-0.10/references/components/slider.md   | 121 +++
 .../cn/v-0.10/references/components/switch.md   |  98 ++
 .../cn/v-0.10/references/components/text.md     | 116 +++
 .../cn/v-0.10/references/components/textarea.md | 115 +++
 .../cn/v-0.10/references/components/video.md    |  82 ++
 .../cn/v-0.10/references/components/web.md      | 143 +++
 doc/source/cn/v-0.10/references/gesture.md      |  79 ++
 .../cn/v-0.10/references/images/Artboard.jpg    | Bin 0 -> 36223 bytes
 .../v-0.10/references/images/coding_weex_1.jpg  | Bin 0 -> 56225 bytes
 .../v-0.10/references/images/css-boxmodel.png   | Bin 0 -> 12581 bytes
 .../references/images/css-flexbox-align.jpg     | Bin 0 -> 35005 bytes
 .../references/images/css-flexbox-justify.svg   |  59 ++
 .../cn/v-0.10/references/images/div_1.jpg       | Bin 0 -> 59561 bytes
 .../cn/v-0.10/references/images/div_2.jpg       | Bin 0 -> 62574 bytes
 .../cn/v-0.10/references/images/div_3.jpg       | Bin 0 -> 82345 bytes
 .../cn/v-0.10/references/images/div_4.jpg       | Bin 0 -> 200642 bytes
 .../cn/v-0.10/references/images/image_1.jpg     | Bin 0 -> 163705 bytes
 .../cn/v-0.10/references/images/image_2.jpg     | Bin 0 -> 255560 bytes
 .../cn/v-0.10/references/images/list_2.jpg      | Bin 0 -> 56635 bytes
 .../cn/v-0.10/references/images/list_3.jpg      | Bin 0 -> 128082 bytes
 .../cn/v-0.10/references/images/list_4.jpg      | Bin 0 -> 339799 bytes
 doc/source/cn/v-0.10/references/images/nav.jpg  | Bin 0 -> 124441 bytes
 .../cn/v-0.10/references/images/scroller_1.jpg  | Bin 0 -> 344783 bytes
 .../cn/v-0.10/references/images/style_1.jpg     | Bin 0 -> 59366 bytes
 .../cn/v-0.10/references/images/style_2.jpg     | Bin 0 -> 59696 bytes
 doc/source/cn/v-0.10/references/index.md        |  46 +
 .../cn/v-0.10/references/modules/animation.md   |  90 ++
 .../cn/v-0.10/references/modules/clipboard.md   | 112 +++
 doc/source/cn/v-0.10/references/modules/dom.md  |  79 ++
 .../cn/v-0.10/references/modules/globalevent.md |  87 ++
 .../cn/v-0.10/references/modules/index.md       |  20 +
 .../cn/v-0.10/references/modules/modal.md       | 196 ++++
 .../cn/v-0.10/references/modules/navigator.md   | 110 +++
 .../cn/v-0.10/references/modules/storage.md     | 224 +++++
 .../cn/v-0.10/references/modules/stream.md      | 220 +++++
 .../cn/v-0.10/references/modules/webview.md     |  66 ++
 doc/source/cn/v-0.10/references/replace.md      |  57 ++
 .../cn/v-0.10/references/special-element.md     |  38 +
 doc/source/cn/v-0.10/references/specs/index.md  | 309 +++++++
 .../references/specs/js-framework-apis.md       | 190 ++++
 .../v-0.10/references/specs/virtual-dom-apis.md | 148 +++
 doc/source/cn/v-0.10/references/text-style.md   |  40 +
 doc/source/cn/v-0.10/references/units.md        |  66 ++
 doc/source/cn/v-0.10/references/wxc/index.md    |  44 +
 .../cn/v-0.10/references/wxc/wxc-navpage.md     | 192 ++++
 .../cn/v-0.10/references/wxc/wxc-tabbar.md      | 176 ++++
 doc/source/cn/v-0.10/tools/devtools-android.md  | 123 +++
 doc/source/cn/v-0.10/tools/devtools-ios.md      |  65 ++
 doc/source/cn/v-0.10/tools/devtools.md          |  99 ++
 doc/source/cn/v-0.10/tools/index.md             |  96 ++
 doc/source/cn/v-0.10/tools/playground.md        |  22 +
 doc/source/cn/v-0.10/tools/transformer.md       |  38 +
 doc/source/download.ejs                         |   3 +
 doc/source/examples/a.md                        |  39 +
 doc/source/examples/animation.md                |  47 +
 doc/source/examples/clipboard.md                |  64 ++
 doc/source/examples/div.md                      |  27 +
 doc/source/examples/dom-rect.md                 |  67 ++
 doc/source/examples/dom-scroll.md               |  93 ++
 doc/source/examples/image.md                    |  58 ++
 doc/source/examples/indicator.md                |  80 ++
 doc/source/examples/input.md                    |  68 ++
 doc/source/examples/list.md                     |  64 ++
 doc/source/examples/modal.md                    |  81 ++
 doc/source/examples/navigator.md                |  54 ++
 doc/source/examples/refresh.md                  |  74 ++
 doc/source/examples/scroller.md                 |  92 ++
 doc/source/examples/slider.md                   |  53 ++
 doc/source/examples/storage.md                  | 103 +++
 doc/source/examples/stream.md                   |  74 ++
 doc/source/examples/switch.md                   |  69 ++
 doc/source/examples/text.md                     |  44 +
 doc/source/examples/textarea.md                 |  68 ++
 doc/source/examples/video.md                    |  55 ++
 doc/source/examples/web.md                      |  97 ++
 doc/source/faq.md                               | 210 +++++
 doc/source/guide/.gitkeep                       |   0
 doc/source/guide/dev-with-weexpack.md           |  12 +
 doc/source/guide/images/flow.png                | Bin 0 -> 57741 bytes
 doc/source/guide/images/tut-cli-qrcode.png      | Bin 0 -> 45480 bytes
 doc/source/guide/images/tut-first.png           | Bin 0 -> 51434 bytes
 doc/source/guide/images/tut-second.png          | Bin 0 -> 78519 bytes
 doc/source/guide/images/tut1.jpg                | Bin 0 -> 47442 bytes
 doc/source/guide/images/tut2.jpg                | Bin 0 -> 52428 bytes
 doc/source/guide/images/tut3.png                | Bin 0 -> 52198 bytes
 doc/source/guide/images/tut4.gif                | Bin 0 -> 218245 bytes
 doc/source/guide/index.md                       |  11 +
 doc/source/guide/integrate-to-your-app.md       |  11 +
 doc/source/guide/intro/app-architecture.md      |  10 +
 doc/source/guide/intro/devtools.md              | 100 ++
 doc/source/guide/intro/how-it-works.md          |  12 +
 doc/source/guide/intro/index.md                 |  17 +
 doc/source/guide/intro/page-architecture.md     |  10 +
 doc/source/guide/intro/using-vue.md             |  10 +
 doc/source/guide/intro/web-dev-experience.md    |  11 +
 doc/source/guide/intro/write-once.md            |  10 +
 doc/source/index.md                             |   4 +
 doc/source/playground.ejs                       |   3 +
 doc/source/references/advanced/extend-jsfm.md   |  10 +
 .../references/advanced/extend-to-android.md    | 160 ++++
 .../references/advanced/extend-to-html5.md      |  10 +
 doc/source/references/advanced/extend-to-ios.md | 262 ++++++
 doc/source/references/advanced/index.md         |  15 +
 .../advanced/integrate-devtool-to-android.md    |  11 +
 .../advanced/integrate-devtool-to-ios.md        |  10 +
 doc/source/references/android-apis.md           |  10 +
 doc/source/references/color-names.md            | 182 ++++
 doc/source/references/common-event.md           | 129 +++
 doc/source/references/common-style.md           | 367 ++++++++
 doc/source/references/components/a.md           |  71 ++
 doc/source/references/components/cell.md        |  42 +
 doc/source/references/components/div.md         |  64 ++
 doc/source/references/components/image.md       | 107 +++
 doc/source/references/components/index.md       |  24 +
 doc/source/references/components/indicator.md   | 121 +++
 doc/source/references/components/input.md       | 156 ++++
 doc/source/references/components/list.md        | 175 ++++
 doc/source/references/components/refresh.md     | 216 +++++
 doc/source/references/components/scroller.md    | 152 +++
 doc/source/references/components/slider.md      |  93 ++
 doc/source/references/components/switch.md      | 117 +++
 doc/source/references/components/text.md        |  98 ++
 doc/source/references/components/textarea.md    | 142 +++
 doc/source/references/components/video.md       |  89 ++
 doc/source/references/components/web.md         | 149 +++
 doc/source/references/gesture.md                |  53 ++
 doc/source/references/html5-apis.md             |  10 +
 doc/source/references/images/css-boxmodel.png   | Bin 0 -> 12581 bytes
 .../references/images/css-flexbox-align.jpg     | Bin 0 -> 35005 bytes
 .../references/images/css-flexbox-justify.svg   |  59 ++
 .../references/images/css-flexbox-sample.png    | Bin 0 -> 3210 bytes
 doc/source/references/images/nav.png            | Bin 0 -> 83497 bytes
 doc/source/references/index.md                  |  17 +
 doc/source/references/ios-apis.md               |  12 +
 doc/source/references/js-service/index.md       | 114 +++
 doc/source/references/jsfm-apis.md              |  66 ++
 doc/source/references/migration/difference.md   |  10 +
 doc/source/references/migration/index.md        |  11 +
 .../references/migration/migration-from-weex.md |  10 +
 doc/source/references/modules/animation.md      | 106 +++
 doc/source/references/modules/clipboard.md      |  98 ++
 doc/source/references/modules/dom.md            | 204 ++++
 doc/source/references/modules/globalevent.md    |  89 ++
 doc/source/references/modules/index.md          |  29 +
 doc/source/references/modules/modal.md          | 144 +++
 doc/source/references/modules/navigator.md      |  89 ++
 doc/source/references/modules/picker.md         | 129 +++
 doc/source/references/modules/storage.md        | 172 ++++
 doc/source/references/modules/stream.md         | 131 +++
 doc/source/references/modules/webview.md        | 155 ++++
 doc/source/references/native-dom-api.md         |  11 +
 doc/source/references/path.md                   |  37 +
 doc/source/references/text-style.md             |  50 +
 doc/source/references/unit.md                   |  11 +
 doc/source/references/vue/difference-of-vuex.md |  10 +
 .../references/vue/difference-with-web.md       |  10 +
 doc/source/references/vue/index.md              |  11 +
 doc/source/references/web-standards.md          | 584 ++++++++++++
 doc/source/references/weex-variable.md          |  10 +
 doc/source/v-0.10/advanced/extend-to-android.md | 162 ++++
 doc/source/v-0.10/advanced/extend-to-html5.md   | 258 ++++++
 doc/source/v-0.10/advanced/extend-to-ios.md     | 272 ++++++
 .../v-0.10/advanced/how-data-binding-works.md   |  39 +
 doc/source/v-0.10/advanced/images/how-arch.png  | Bin 0 -> 62303 bytes
 .../v-0.10/advanced/images/how-render.png       | Bin 0 -> 42957 bytes
 doc/source/v-0.10/advanced/index.md             | 148 +++
 .../v-0.10/advanced/integrate-to-android.md     | 204 ++++
 .../v-0.10/advanced/integrate-to-html5.md       |  77 ++
 doc/source/v-0.10/advanced/integrate-to-ios.md  | 118 +++
 doc/source/v-0.10/guide/.gitkeep                |   0
 .../how-to/customize-a-native-component.md      |  58 ++
 .../guide/how-to/cuszomize-native-apis.md       |  80 ++
 .../v-0.10/guide/how-to/debug-with-html5.md     |  47 +
 doc/source/v-0.10/guide/how-to/index.md         |  40 +
 .../guide/how-to/preview-in-playground-app.md   |  20 +
 .../guide/how-to/require-3rd-party-libs.md      |  56 ++
 .../how-to/transform-code-into-js-bundle.md     | 110 +++
 .../v-0.10/guide/images/tut-cli-qrcode.png      | Bin 0 -> 45480 bytes
 doc/source/v-0.10/guide/images/tut-first.png    | Bin 0 -> 51434 bytes
 doc/source/v-0.10/guide/images/tut-second.png   | Bin 0 -> 78519 bytes
 doc/source/v-0.10/guide/images/tut1.jpg         | Bin 0 -> 47442 bytes
 doc/source/v-0.10/guide/images/tut2.jpg         | Bin 0 -> 52428 bytes
 doc/source/v-0.10/guide/images/tut3.png         | Bin 0 -> 52198 bytes
 doc/source/v-0.10/guide/images/tut4.gif         | Bin 0 -> 218245 bytes
 doc/source/v-0.10/guide/index.md                | 211 +++++
 doc/source/v-0.10/guide/syntax/comm.md          | 228 +++++
 .../v-0.10/guide/syntax/composed-component.md   | 114 +++
 doc/source/v-0.10/guide/syntax/config-n-data.md |  61 ++
 doc/source/v-0.10/guide/syntax/data-binding.md  | 248 +++++
 doc/source/v-0.10/guide/syntax/display-logic.md | 173 ++++
 doc/source/v-0.10/guide/syntax/events.md        |  59 ++
 doc/source/v-0.10/guide/syntax/id.md            |  65 ++
 doc/source/v-0.10/guide/syntax/index.md         | 122 +++
 doc/source/v-0.10/guide/syntax/render-logic.md  |  35 +
 doc/source/v-0.10/guide/syntax/style-n-class.md | 118 +++
 doc/source/v-0.10/references/api.md             |  84 ++
 doc/source/v-0.10/references/cheatsheet.md      | 102 ++
 doc/source/v-0.10/references/color-names.md     | 182 ++++
 doc/source/v-0.10/references/common-attrs.md    |  78 ++
 doc/source/v-0.10/references/common-event.md    | 120 +++
 doc/source/v-0.10/references/common-style.md    | 208 +++++
 doc/source/v-0.10/references/component-defs.md  | 131 +++
 doc/source/v-0.10/references/components/a.md    |  50 +
 doc/source/v-0.10/references/components/cell.md |  42 +
 doc/source/v-0.10/references/components/div.md  |  48 +
 .../v-0.10/references/components/image.md       |  55 ++
 .../v-0.10/references/components/index.md       |  24 +
 .../v-0.10/references/components/indicator.md   |  98 ++
 .../v-0.10/references/components/input.md       | 124 +++
 doc/source/v-0.10/references/components/list.md | 293 ++++++
 .../references/components/refresh-loading.md    | 298 ++++++
 .../v-0.10/references/components/scroller.md    | 136 +++
 .../v-0.10/references/components/slider.md      | 107 +++
 .../v-0.10/references/components/switch.md      |  81 ++
 doc/source/v-0.10/references/components/text.md |  94 ++
 .../v-0.10/references/components/textarea.md    |  81 ++
 .../v-0.10/references/components/video.md       |  75 ++
 doc/source/v-0.10/references/components/web.md  | 152 +++
 .../v-0.10/references/components/wxc-navpage.md |  74 ++
 .../v-0.10/references/components/wxc-tabbar.md  |  94 ++
 doc/source/v-0.10/references/gesture.md         |  74 ++
 .../v-0.10/references/images/css-boxmodel.png   | Bin 0 -> 12581 bytes
 .../references/images/css-flexbox-align.jpg     | Bin 0 -> 35005 bytes
 .../references/images/css-flexbox-justify.svg   |  59 ++
 .../references/images/css-flexbox-sample.png    | Bin 0 -> 3210 bytes
 doc/source/v-0.10/references/images/nav.png     | Bin 0 -> 83497 bytes
 doc/source/v-0.10/references/index.md           |  49 +
 .../v-0.10/references/modules/animation.md      |  63 ++
 .../v-0.10/references/modules/clipboard.md      |  53 ++
 doc/source/v-0.10/references/modules/dom.md     | 114 +++
 .../v-0.10/references/modules/globalevent.md    |  89 ++
 doc/source/v-0.10/references/modules/index.md   |  28 +
 doc/source/v-0.10/references/modules/modal.md   | 192 ++++
 .../v-0.10/references/modules/navigator.md      | 198 ++++
 doc/source/v-0.10/references/modules/storage.md | 111 +++
 doc/source/v-0.10/references/modules/stream.md  |  86 ++
 doc/source/v-0.10/references/modules/timer.md   |  60 ++
 doc/source/v-0.10/references/modules/webview.md | 160 ++++
 doc/source/v-0.10/references/special-element.md |  36 +
 doc/source/v-0.10/references/specs/index.md     | 309 +++++++
 .../v-0.10/references/specs/js-bundle-format.md | 307 ++++++
 .../references/specs/js-framework-apis.md       | 191 ++++
 .../v-0.10/references/specs/virtual-dom-apis.md | 147 +++
 doc/source/v-0.10/references/text-style.md      |  43 +
 doc/source/v-0.10/tools/devtools-android.md     | 123 +++
 doc/source/v-0.10/tools/devtools-ios.md         |  76 ++
 doc/source/v-0.10/tools/devtools.md             | 102 ++
 doc/source/v-0.10/tools/index.md                |  97 ++
 doc/source/v-0.10/tools/playground.md           |  24 +
 doc/source/v-0.10/tools/transformer.md          |  38 +
 doc/specs/js-bundle-format.md                   | 300 ------
 doc/specs/js-framework-apis.md                  | 184 ----
 doc/specs/virtual-dom-apis.md                   | 140 ---
 doc/syntax/comm.md                              | 222 -----
 doc/syntax/composed-component.md                | 108 ---
 doc/syntax/config-n-data.md                     |  55 --
 doc/syntax/data-binding.md                      | 241 -----
 doc/syntax/display-logic.md                     | 169 ----
 doc/syntax/events.md                            |  54 --
 doc/syntax/id.md                                |  59 --
 doc/syntax/main.md                              | 116 ---
 doc/syntax/render-logic.md                      |  29 -
 doc/syntax/style-n-class.md                     | 106 ---
 doc/themes/weex/_config.yml                     |  42 +
 doc/themes/weex/languages/cn.yml                | 103 +++
 doc/themes/weex/languages/en.yml                | 104 +++
 .../weex/layout/_partial/after-footer.ejs       |   3 +
 .../weex/layout/_partial/archive-post.ejs       |  11 +
 doc/themes/weex/layout/_partial/archive.ejs     |  19 +
 doc/themes/weex/layout/_partial/article.ejs     |  11 +
 doc/themes/weex/layout/_partial/footer.ejs      |  28 +
 doc/themes/weex/layout/_partial/head.ejs        |  36 +
 doc/themes/weex/layout/_partial/header.ejs      |  49 +
 .../weex/layout/_partial/post/category.ejs      |  10 +
 doc/themes/weex/layout/_partial/post/nav.ejs    |   8 +
 .../weex/layout/_partial/post/summary.ejs       |  43 +
 doc/themes/weex/layout/_partial/post/title.ejs  |  18 +
 doc/themes/weex/layout/_partial/search-form.ejs |   8 +
 doc/themes/weex/layout/_partial/sidebar.ejs     |  56 ++
 doc/themes/weex/layout/_partial/slider.ejs      |  17 +
 doc/themes/weex/layout/archive.ejs              |   3 +
 doc/themes/weex/layout/blog.ejs                 |   3 +
 doc/themes/weex/layout/category.ejs             |   1 +
 doc/themes/weex/layout/download.ejs             |  20 +
 doc/themes/weex/layout/example.ejs              |  40 +
 doc/themes/weex/layout/index.ejs                | 211 +++++
 doc/themes/weex/layout/layout.ejs               |  17 +
 doc/themes/weex/layout/page.ejs                 |   6 +
 doc/themes/weex/layout/playground.ejs           |  30 +
 doc/themes/weex/layout/post.ejs                 |   3 +
 doc/themes/weex/layout/tag.ejs                  |   1 +
 doc/themes/weex/scripts/helper.js               |  38 +
 doc/themes/weex/source/css/animation.scss       | 250 +++++
 doc/themes/weex/source/css/atom-one-dark.scss   |  96 ++
 doc/themes/weex/source/css/blog.scss            |  36 +
 doc/themes/weex/source/css/common.scss          | 250 +++++
 doc/themes/weex/source/css/example.scss         | 103 +++
 doc/themes/weex/source/css/index.scss           | 540 +++++++++++
 doc/themes/weex/source/css/media-queries.scss   | 190 ++++
 .../weex/source/css/partial/article-title.scss  |  28 +
 doc/themes/weex/source/css/partial/article.scss |  68 ++
 doc/themes/weex/source/css/partial/footer.scss  |  62 ++
 doc/themes/weex/source/css/partial/header.scss  | 104 +++
 .../weex/source/css/partial/highlight.scss      | 108 +++
 .../weex/source/css/partial/search-form.scss    |  74 ++
 doc/themes/weex/source/css/partial/sidebar.scss |  74 ++
 doc/themes/weex/source/css/partial/summary.scss |  48 +
 doc/themes/weex/source/css/playground.scss      |  50 +
 doc/themes/weex/source/css/post.scss            |  66 ++
 doc/themes/weex/source/css/style.scss           |  28 +
 doc/themes/weex/source/css/swiper.min.css       |  15 +
 doc/themes/weex/source/css/variable.scss        |  40 +
 doc/themes/weex/source/images/_slide1.png       | Bin 0 -> 381001 bytes
 .../weex/source/images/ali-open-source.png      | Bin 0 -> 2193 bytes
 doc/themes/weex/source/images/alibaba.png       | Bin 0 -> 2107 bytes
 doc/themes/weex/source/images/aliyun.png        | Bin 0 -> 1292 bytes
 doc/themes/weex/source/images/android.png       | Bin 0 -> 5973 bytes
 doc/themes/weex/source/images/avatar.png        | Bin 0 -> 32736 bytes
 doc/themes/weex/source/images/cainiao.png       | Bin 0 -> 3353 bytes
 doc/themes/weex/source/images/ding.png          | Bin 0 -> 5929 bytes
 doc/themes/weex/source/images/extendable.svg    |  51 +
 doc/themes/weex/source/images/feature.png       | Bin 0 -> 1090905 bytes
 doc/themes/weex/source/images/feizhu.jpg        | Bin 0 -> 5988 bytes
 doc/themes/weex/source/images/flow.png          | Bin 0 -> 14440 bytes
 doc/themes/weex/source/images/galaxy_1.svg      |  53 ++
 doc/themes/weex/source/images/galaxy_2.svg      |  53 ++
 doc/themes/weex/source/images/ios.png           | Bin 0 -> 6272 bytes
 doc/themes/weex/source/images/level1.png        | Bin 0 -> 14951 bytes
 doc/themes/weex/source/images/level2.png        | Bin 0 -> 101449 bytes
 doc/themes/weex/source/images/level3.png        | Bin 0 -> 101212 bytes
 doc/themes/weex/source/images/level4.png        | Bin 0 -> 339831 bytes
 doc/themes/weex/source/images/lightweight.svg   |  31 +
 doc/themes/weex/source/images/logo.png          | Bin 0 -> 5398 bytes
 doc/themes/weex/source/images/logo.svg          |  29 +
 doc/themes/weex/source/images/performance.svg   |  29 +
 doc/themes/weex/source/images/playground.png    | Bin 0 -> 12659 bytes
 doc/themes/weex/source/images/qr.png            | Bin 0 -> 1801 bytes
 doc/themes/weex/source/images/slide1.png        | Bin 0 -> 226303 bytes
 doc/themes/weex/source/images/taobao.png        | Bin 0 -> 3074 bytes
 doc/themes/weex/source/images/tmall.png         | Bin 0 -> 8562 bytes
 doc/themes/weex/source/images/vue-logo.png      | Bin 0 -> 5346 bytes
 doc/themes/weex/source/images/vue.png           | Bin 0 -> 16582 bytes
 doc/themes/weex/source/images/web.png           | Bin 0 -> 9297 bytes
 doc/themes/weex/source/images/xiami.png         | Bin 0 -> 2615 bytes
 doc/themes/weex/source/images/youku.png         | Bin 0 -> 2178 bytes
 doc/themes/weex/source/js/common.js             | 522 +++++++++++
 doc/themes/weex/source/js/example.js            |  37 +
 doc/themes/weex/source/js/examples/a.web.js     | 528 +++++++++++
 doc/themes/weex/source/js/examples/a.weex.js    | 198 ++++
 .../weex/source/js/examples/animation.web.js    | 569 ++++++++++++
 .../weex/source/js/examples/animation.weex.js   | 224 +++++
 .../weex/source/js/examples/clipboard.web.js    | 583 ++++++++++++
 .../weex/source/js/examples/clipboard.weex.js   | 249 +++++
 doc/themes/weex/source/js/examples/div.web.js   | 523 +++++++++++
 doc/themes/weex/source/js/examples/div.weex.js  | 183 ++++
 .../weex/source/js/examples/dom-rect.web.js     | 589 ++++++++++++
 .../weex/source/js/examples/dom-rect.weex.js    | 254 +++++
 .../weex/source/js/examples/dom-scroll.web.js   | 598 ++++++++++++
 .../weex/source/js/examples/dom-scroll.weex.js  | 288 ++++++
 doc/themes/weex/source/js/examples/image.web.js | 542 +++++++++++
 .../weex/source/js/examples/image.weex.js       | 225 +++++
 .../weex/source/js/examples/indicator.web.js    | 618 +++++++++++++
 .../weex/source/js/examples/indicator.weex.js   | 307 ++++++
 doc/themes/weex/source/js/examples/input.web.js | 586 ++++++++++++
 .../weex/source/js/examples/input.weex.js       | 251 +++++
 doc/themes/weex/source/js/examples/list.web.js  | 584 ++++++++++++
 doc/themes/weex/source/js/examples/list.weex.js | 252 +++++
 doc/themes/weex/source/js/examples/modal.web.js | 604 ++++++++++++
 .../weex/source/js/examples/modal.weex.js       | 272 ++++++
 .../weex/source/js/examples/navigator.web.js    | 562 +++++++++++
 .../weex/source/js/examples/navigator.weex.js   | 230 +++++
 .../weex/source/js/examples/refresh.web.js      | 594 ++++++++++++
 .../weex/source/js/examples/refresh.weex.js     | 267 ++++++
 .../weex/source/js/examples/scroller.web.js     | 598 ++++++++++++
 .../weex/source/js/examples/scroller.weex.js    | 288 ++++++
 .../weex/source/js/examples/slider.web.js       | 587 ++++++++++++
 .../weex/source/js/examples/slider.weex.js      | 255 +++++
 .../weex/source/js/examples/storage.web.js      | 634 +++++++++++++
 .../weex/source/js/examples/storage.weex.js     | 317 +++++++
 .../weex/source/js/examples/stream.web.js       | 590 ++++++++++++
 .../weex/source/js/examples/stream.weex.js      | 259 ++++++
 .../weex/source/js/examples/switch.web.js       | 605 ++++++++++++
 .../weex/source/js/examples/switch.weex.js      | 280 ++++++
 doc/themes/weex/source/js/examples/text.web.js  | 535 +++++++++++
 doc/themes/weex/source/js/examples/text.weex.js | 208 +++++
 .../weex/source/js/examples/textarea.web.js     | 582 ++++++++++++
 .../weex/source/js/examples/textarea.weex.js    | 247 +++++
 doc/themes/weex/source/js/examples/video.web.js | 593 ++++++++++++
 .../weex/source/js/examples/video.weex.js       | 254 +++++
 doc/themes/weex/source/js/examples/web.web.js   | 923 +++++++++++++++++++
 doc/themes/weex/source/js/examples/web.weex.js  | 600 ++++++++++++
 doc/themes/weex/source/js/highlight.pack.js     |   2 +
 doc/themes/weex/source/js/mobile-detect.js      |   3 +
 doc/themes/weex/source/js/qrcode.min.js         |   1 +
 doc/themes/weex/source/js/reqwest.js            |   7 +
 doc/themes/weex/source/js/swiper.min.js         |  18 +
 doc/themes/weex/source/js/velocity.js           |   5 +
 doc/tools/README.md                             |   6 -
 doc/tools/cli.md                                |  90 --
 doc/tools/devtools-android.md                   | 116 ---
 doc/tools/devtools-ios.md                       |  69 --
 doc/tools/devtools.md                           |  94 --
 doc/tools/how-to-debug.md                       |  45 -
 doc/tools/main.md                               |  10 -
 doc/tools/playground-app.md                     |  17 -
 doc/tools/transformer.md                        |  30 -
 doc/tutorial.md                                 | 206 -----
 doc/tutorial_source/tech_list.we                |  22 -
 doc/tutorial_source/tech_list_0.we              |  15 -
 doc/tutorial_source/tech_list_1.we              |  24 -
 doc/tutorial_source/tech_list_2.we              |  62 --
 examples/component/scroller-demo.we             |   2 +-
 .../Sources/Manager/WXComponentFactory.m        |   1 +
 705 files changed, 60078 insertions(+), 9023 deletions(-)
----------------------------------------------------------------------




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

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

# Conflicts:
#	doc/advanced/extend-to-android.md


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

Branch: refs/heads/master
Commit: f1062d87b9c38d188c8a329649e851c3de6a8f0b
Parents: 0d244c7 3bab145
Author: sospartan <so...@gmail.com>
Authored: Fri Feb 17 10:25:59 2017 +0800
Committer: sospartan <so...@gmail.com>
Committed: Fri Feb 17 10:25:59 2017 +0800

----------------------------------------------------------------------
 .../commons/adapter/JSExceptionAdapter.java     |   222 +
 .../java/com/alibaba/weex/WXApplication.java    |     2 +
 .../weex/extend/module/WXEventModule.java       |     8 +-
 android/run-ci.sh                               |     4 +
 android/sdk/assets/main.js                      | 19932 +----------------
 android/sdk/build.gradle                        |     3 +-
 android/sdk/libs/armeabi/libweexv8.so           |   Bin 3583820 -> 3583820 bytes
 android/sdk/libs/x86/libweexv8.so               |   Bin 4340864 -> 4340864 bytes
 .../main/java/com/taobao/weex/InitConfig.java   |    13 +
 .../main/java/com/taobao/weex/WXSDKEngine.java  |     5 +
 .../java/com/taobao/weex/WXSDKInstance.java     |    14 +-
 .../main/java/com/taobao/weex/WXSDKManager.java |    14 +
 .../weex/adapter/IWXJSExceptionAdapter.java     |   218 +
 .../appfram/navigator/WXNavigatorModule.java    |    88 +-
 .../com/taobao/weex/bridge/WXBridgeManager.java |    18 +-
 .../com/taobao/weex/bridge/WXModuleManager.java |    31 +-
 .../java/com/taobao/weex/common/Constants.java  |     1 +
 .../taobao/weex/common/WXJSExceptionInfo.java   |   331 +
 .../java/com/taobao/weex/common/WXModule.java   |    12 +-
 .../com/taobao/weex/http/WXStreamModule.java    |     2 +-
 .../taobao/weex/ui/component/Scrollable.java    |     8 +
 .../java/com/taobao/weex/ui/component/WXA.java  |    10 +-
 .../taobao/weex/ui/component/WXComponent.java   |    42 +-
 .../com/taobao/weex/ui/component/WXImage.java   |    14 +-
 .../com/taobao/weex/ui/component/WXRefresh.java |     8 +-
 .../taobao/weex/ui/component/WXScroller.java    |    14 +
 .../weex/ui/component/WXSliderNeighbor.java     |    93 +-
 .../ui/component/list/BasicListComponent.java   |    26 +-
 .../component/list/HorizontalListComponent.java |     2 +-
 .../com/taobao/weex/ui/view/WXScrollView.java   |     3 +
 .../taobao/weex/ui/view/gesture/WXGesture.java  |    39 +
 .../adapter/WXRecyclerViewOnScrollListener.java |     6 +-
 .../refresh/wrapper/BounceRecyclerView.java     |    46 +-
 .../java/com/taobao/weex/utils/WXUtils.java     |   200 +-
 .../java/com/taobao/weex/utils/WXViewUtils.java |     8 +-
 .../java/com/taobao/weex/utils/WXUtilsTest.java |   125 +-
 android/sdk/unittest.sh                         |     3 +-
 circle.yml                                      |     6 +-
 doc/advanced/extend-to-android.md               |   175 +
 html5/frameworks/legacy/app/ctrl/init.js        |     2 -
 html5/frameworks/legacy/app/ctrl/misc.js        |    55 +-
 html5/frameworks/legacy/app/instance.js         |    14 +-
 html5/frameworks/legacy/static/create.js        |     6 +-
 html5/runtime/config.js                         |     4 +-
 html5/runtime/init.js                           |     4 -
 html5/runtime/task-center.js                    |    57 +
 html5/services/amd/index.js                     |    18 +-
 html5/test/case/prepare.js                      |     6 +-
 html5/test/case/tester.js                       |    48 +-
 html5/test/unit/default/app/ctrl.js             |    14 +-
 html5/test/unit/default/app/index.js            |    28 +-
 51 files changed, 1715 insertions(+), 20287 deletions(-)
----------------------------------------------------------------------



[45/50] [abbrv] incubator-weex git commit: * [doc] updated guide/intro/using-vue

Posted by ji...@apache.org.
* [doc] updated guide/intro/using-vue


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

Branch: refs/heads/master
Commit: 7737d9f445df7d011d18654abf56a5681527c5ac
Parents: 3ffffe3
Author: Jinjiang <zh...@me.com>
Authored: Fri Feb 17 13:19:23 2017 +0800
Committer: Jinjiang <zh...@me.com>
Committed: Fri Feb 17 13:19:23 2017 +0800

----------------------------------------------------------------------
 doc/source/cn/guide/intro/using-vue.md | 79 ++++++++---------------------
 doc/source/guide/intro/using-vue.md    | 50 +++++++++++++++++-
 2 files changed, 69 insertions(+), 60 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7737d9f4/doc/source/cn/guide/intro/using-vue.md
----------------------------------------------------------------------
diff --git a/doc/source/cn/guide/intro/using-vue.md b/doc/source/cn/guide/intro/using-vue.md
index 1399a42..60fbd56 100644
--- a/doc/source/cn/guide/intro/using-vue.md
+++ b/doc/source/cn/guide/intro/using-vue.md
@@ -7,7 +7,7 @@ version: 2.1
 
 # \u4f7f\u7528 Vue \u5f00\u53d1 Weex \u9875\u9762
 
-## Vue & Weex \u4ecb\u7ecd
+## Vue in Weex
 
 [Vue.js](https://vuejs.org/) \u662f Evan You \u5f00\u53d1\u7684\u6e10\u8fdb\u5f0f JavaScript \u6846\u67b6\uff0c\u5728\u6613\u7528\u6027\u3001\u7075\u6d3b\u6027\u548c\u6027\u80fd\u7b49\u65b9\u9762\u90fd\u975e\u5e38\u4f18\u79c0\u3002\u5f00\u53d1\u8005\u80fd\u591f\u901a\u8fc7\u64b0\u5199 `*.vue` \u6587\u4ef6\uff0c\u57fa\u4e8e `<template>`, `<style>`, `<script>` \u5feb\u901f\u6784\u5efa\u7ec4\u4ef6\u5316\u7684 web \u5e94\u7528\u3002
 
@@ -15,69 +15,16 @@ version: 2.1
 
 Vue.js \u5728 2016 \u5e74 10 \u6708\u6b63\u5f0f\u53d1\u5e03\u4e86 2.0 \u7248\u672c\uff0c\u8be5\u7248\u672c\u52a0\u5165\u4e86 Virtual-DOM \u548c\u9884\u7f16\u8bd1\u5668\u7684\u8bbe\u8ba1\uff0c\u4f7f\u5f97\u8be5\u6846\u67b6\u5728\u8fd0\u884c\u65f6\u80fd\u591f\u8131\u79bb HTML \u548c CSS \u89e3\u6790\uff0c\u53ea\u4f9d\u8d56 JavaScript\uff1b\u540c\u65f6 Virtual-DOM \u4e5f\u4f7f\u5f97 Vue 2.x \u6e32\u67d3\u6210\u539f\u751f UI \u6210\u4e3a\u4e86\u53ef\u80fd\u3002
 
-[Weex](https://weex-project.io/) \u662f\u4e00\u5957\u7b80\u5355\u6613\u7528\u7684\u8de8\u5e73\u53f0\u5f00\u53d1\u65b9\u6848\uff0c\u80fd\u4ee5 Web \u7684\u5f00\u53d1\u4f53\u9a8c\u6784\u5efa\u9ad8\u6027\u80fd\u3001\u53ef\u6269\u5c55\u7684\u539f\u751f\u5e94\u7528\u3002 Weex \u4e0e Vue \u6709\u5b98\u65b9\u5408\u4f5c\uff0c\u652f\u6301\u5c06 Vue 2.x \u4f5c\u4e3a\u5185\u7f6e\u7684\u524d\u7aef\u6846\u67b6\uff0cVue \u4e5f\u501f\u6b64\u5177\u5907\u4e86\u5f00\u53d1\u539f\u751f\u5e94\u7528\u7684\u80fd\u529b\u3002
+\u76ee\u524d Weex \u4e0e Vue \u6b63\u5728\u5c55\u5f00\u5b98\u65b9\u5408\u4f5c\uff0c\u5e76\u5c06 Vue 2.x \u4f5c\u4e3a\u5185\u7f6e\u7684\u524d\u7aef\u6846\u67b6\uff0cVue \u4e5f\u56e0\u6b64\u5177\u5907\u4e86\u5f00\u53d1\u539f\u751f\u5e94\u7528\u7684\u80fd\u529b\u3002
 
-## \u5c1d\u9c9c\u4f53\u9a8c
+**\u76f8\u5173\u94fe\u63a5**
 
- > \u5f00\u59cb\u4e4b\u524d\uff0c\u5e0c\u671b\u4f60\u80fd\u5bf9 Weex \u548c Vue \u6709\u57fa\u672c\u7684\u4e86\u89e3\uff0c\u63a8\u8350\u9605\u8bfb [Weex Tutorial](../index.html) \u548c [Vue Introduction](https://vuejs.org/v2/guide/) \u4e86\u89e3\u66f4\u591a\u4fe1\u606f\u3002
-
-### \u5feb\u901f\u521b\u5efa\u9879\u76ee
-
-Weex \u5b98\u65b9\u63d0\u4f9b\u4e86 [weex-toolkit](https://github.com/weexteam/weex-toolkit) \u7684\u811a\u624b\u67b6\u5de5\u5177\u6765\u8f85\u52a9\u5f00\u53d1\u548c\u8c03\u8bd5\u3002
-
-\u9996\u5148\u5b89\u88c5 `weex-toolkit` \u5de5\u5177\uff1a
-
-```bash
-npm install weex-toolkit@beta -g
-```
-
-> \u6ce8\uff1a\u76ee\u524d weex-toolkit \u4ec5\u5728 beta \u7248\u4e2d\u624d\u652f\u6301\u521d\u59cb\u5316 Vue \u9879\u76ee\uff0c\u4f7f\u7528\u524d\u8bf7\u786e\u8ba4\u7248\u672c\u662f\u5426\u6b63\u786e\u3002
-
-\u7136\u540e\u521d\u59cb\u5316 Weex \u9879\u76ee\uff1a
-
-```bash
-weex init awesome-project
-```
-
-\u6267\u884c\u5b8c\u547d\u4ee4\u540e\uff0c\u5728 `awesome-project` \u76ee\u5f55\u4e2d\u5c31\u521b\u5efa\u4e86\u4e00\u4e2a\u4f7f\u7528 Weex \u548c Vue \u7684\u6a21\u677f\u9879\u76ee\uff0c\u751f\u6210\u7684\u9879\u76ee\u529f\u80fd\u548c\u7528\u6cd5\u53ef\u4ee5\u53c2\u8003\u5176 package.json \u548c README \u3002
-
-## \u7f16\u5199\u4ee3\u7801
-
-\u5728\u521b\u5efa\u4e86\u9879\u76ee\u5e76\u4e14\u914d\u7f6e\u597d\u4e86\u5f00\u53d1\u73af\u5883\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5f00\u59cb\u5199\u4ee3\u7801\u4e86\u3002
-
-\u867d\u7136\u5f00\u53d1\u7684\u662f\u539f\u751f\u5e94\u7528\uff0c\u4f46\u662f\u4ee3\u7801\u5199\u8d77\u6765\u548c Web \u4e2d\u5e76\u6ca1\u4ec0\u4e48\u4e0d\u4e00\u6837\u3002\u4f60\u53ef\u4ee5\u9009\u62e9\u81ea\u5df1\u559c\u6b22\u7684\u524d\u7aef\u5f00\u53d1\u73af\u5883\u3001\u53ef\u4ee5\u5199 `.vue` \u6587\u4ef6\u3001\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5199 javascript \u6587\u4ef6\u3001\u53ef\u4ee5\u4f7f\u7528 ES6+ \u3001\u53ef\u4ee5\u4f7f\u7528\u53d1\u5e03\u5728 npm \u4e0a\u7684\u6a21\u5757\u3001\u53ef\u4ee5\u6269\u5c55 Weex \u7684\u7ec4\u4ef6\u6216\u8005\u6a21\u5757\u3002
-
-### \u6ce8\u610f\u4e8b\u9879
-
-Vue.js \u6700\u521d\u662f\u4e3a Web \u8bbe\u8ba1\u7684\uff0c\u867d\u7136\u53ef\u4ee5\u57fa\u4e8e Weex \u5f00\u53d1\u79fb\u52a8\u5e94\u7528\uff0c\u4f46\u662f Web \u5f00\u53d1\u548c\u539f\u751f\u5f00\u53d1\u6bd5\u7adf\u4e0d\u540c\uff0c\u5728\u529f\u80fd\u548c\u5f00\u53d1\u4f53\u9a8c\u4e0a\u90fd\u6709\u4e00\u4e9b\u5dee\u5f02\uff0c\u8fd9\u4e9b\u5dee\u5f02\u4ece\u672c\u8d28\u4e0a\u8bb2\u662f\u539f\u751f\u5f00\u53d1\u5e73\u53f0\u548c Web \u5e73\u53f0\u4e4b\u95f4\u7684\u5dee\u5f02\uff0cWeex \u6b63\u5728\u52aa\u529b\u7f29\u5c0f\u8fd9\u4e2a\u5dee\u5f02\u7684\u8303\u56f4\u3002
-
-\u53c2\u8003\u6587\u7ae0[\u300aVue 2.x \u5728 Weex \u548c Web \u4e2d\u7684\u5dee\u5f02\u300b](../../references/vue/index.html)\u4e86\u89e3\u5b58\u5728\u5dee\u5f02\u7684\u539f\u56e0\u548c\u7ec6\u8282\u3002
-
-### \u4f7f\u7528\u5176\u4ed6\u5de5\u5177\u5e93
-
-Vue.js \u4e5f\u6709\u8f83\u591a\u5468\u8fb9\u6280\u672f\u4ea7\u54c1\uff0c\u5982 [Vuex](https://github.com/vuejs/vuex) \u548c [vue-router](https://github.com/vuejs/vue-router) \u7b49\uff0c\u8fd9\u4e9b\u5e93\u4e5f\u53ef\u4ee5\u5728 Weex \u4e2d\u5f88\u597d\u7684\u5de5\u4f5c\u3002
-
-\u5173\u4e8e Vuex \u548c vue-louter \u7684\u4f7f\u7528\u65b9\u6cd5\uff0c\u53ef\u4ee5\u53c2\u8003[\u300a\u5728 Weex \u9879\u76ee\u4e2d\u4f7f\u7528 Vuex \u548c vue-router\u300b](../../references/vue/difference-of-vuex.html)\u3002
-
-> \u6211\u4eec\u57fa\u4e8e Weex \u548c Vue \u5f00\u53d1\u4e86\u4e00\u4e2a\u7684\u5b8c\u6574\u9879\u76ee [weex-hackernews](https://github.com/weexteam/weex-hackernews) \uff0c\u5f15\u5165\u4e86\u5305\u542b Vue 2.x \u7684 WeexSDK\uff0c\u521b\u5efa\u4e86\u4e09\u7aef\u7684\u9879\u76ee\u548c\u57fa\u672c\u7684\u7f16\u8bd1\u914d\u7f6e\u3002\u5728\u9879\u76ee\u4e2d\u4f7f\u7528\u4e86 Vuex \u548c vue-router \uff0c\u80fd\u591f\u5b9e\u73b0\u540c\u4e00\u4efd\u4ee3\u7801\uff0c\u5728 iOS\u3001Android\u3001Web \u4e0b\u90fd\u80fd\u5b8c\u6574\u5730\u5de5\u4f5c\u3002
-
-### \u6269\u5c55 Weex
-
-Weex \u5185\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u7ec4\u4ef6\u548c\u6a21\u5757\uff0c\u53ef\u4ee5\u6ee1\u8db3\u57fa\u672c\u4e0a\u4f7f\u7528\u9700\u6c42\u3002\u4e3a\u4e86\u63a7\u5236 SDK \u7684\u4f53\u79ef\u548c\u4fdd\u6301\u6846\u67b6\u7684\u901a\u7528\u6027\uff0c\u6211\u4eec\u4f1a\u8c28\u614e\u5730\u9009\u62e9\u5185\u7f6e\u7684\u7ec4\u4ef6\u548c\u6a21\u5757\uff0c\u5e76\u4e0d\u4f1a\u5305\u7f57\u4e07\u8c61\u5c06\u6240\u6709\u529f\u80fd\u90fd\u5c01\u88c5\u8fdb SDK\u3002\u4e0d\u8fc7\u6211\u4eec\u63d0\u4f9b\u4e86\u989d\u5916\u7684\u7ec4\u4ef6\u5e02\u573a\uff0c\u5728\u5176\u4e2d\u5c06\u80fd\u627e\u5230\u6ee1\u8db3\u4e0d\u540c\u9700\u6c42\u3001\u5404\u5f0f\u5404\u6837\u7684\u7ec4\u4ef6\u548c\u6a21\u5757\uff0c\u6b64\u5916 Weex \u4e5f\u5177\u5907\u6a2a\u5411\u6269\u5c55\u7684\u80fd\u529b\uff0c\u5f00\u53d1\u8005\u53ef\u4ee5\u81ea\u884c\u5b9a\u5236\u548c\u6269\u5c55 Weex \u7ec4\u4ef6\u548c\u6a21\u5757\u3002
-
-Weex \u7684\u5e95\u5c42\u8bbe\u8ba1\u6bd4\u8f83\u7075\u6d3b\uff0c\u9664\u4e86\u7ec4\u4ef6\u548c\u6a21\u5757\u4ee5\u5916\uff0c\u5f00\u53d1\u8005\u751a\u81f3\u53ef\u4ee5\u5b9a\u5236 Weex \u5185\u7f6e\u7684\u524d\u7aef\u6846\u67b6\uff0cVue 2.x \u5c31\u662f\u4e00\u4e2a\u6210\u529f\u7684\u4f8b\u5b50\u3002
-
-\u53ef\u4ee5\u9605\u8bfb\u4ee5\u4e0b\u6587\u6863\u4e86\u89e3\u66f4\u591a\u4fe1\u606f\uff1a
-
-+ [\u300aiOS \u6269\u5c55\u300b](../../references/advanced/index.html)
-+ [\u300aAndroid \u6269\u5c55\u300b](../../references/advanced/extend-to-android.html)
-+ [\u300aHTML5 \u6269\u5c55\u300b](../../references/advanced/extend-to-html5.html)
-+ [\u300a\u5b9a\u5236\u81ea\u5df1\u7684 JS Framework\u300b](../../references/advanced/extend-to-jsfm.html)
+* [Weex \u5feb\u901f\u4e0a\u624b](../index.html)
+* [Vue \u4ecb\u7ecd](https://cn.vuejs.org/v2/guide/)
+* [Weex \u5de5\u4f5c\u539f\u7406](./index.html)
 
 ## Vue 2.x \u5728 Weex \u4e2d\u7684\u7279\u8272\u529f\u80fd
 
-\u6211\u60f3\uff0c\u4f60\u4e00\u5b9a\u5bf9 **Vue \u4e3a\u4ec0\u4e48\u80fd\u6e32\u67d3\u6210\u539f\u751f\u9875\u9762** \u3001**Weex \u4e3a\u4ec0\u4e48\u80fd\u5c06\u5185\u6838\u5207\u6362\u6210 Vue** \u5fc3\u5b58\u597d\u5947\u3002\u5982\u679c\u4f60\u5bf9\u8fd9\u4e9b\u7ec6\u8282\u611f\u5174\u8da3\uff0c\u53ef\u4ee5\u9605\u8bfb\u8fd9\u7bc7\u6587\u7ae0 [\u300ahow it works\u300b](./index.html)\u3002
-
 ### \u6d41\u5f0f\u6e32\u67d3
 
 \u5728 Weex \u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7 `<foo append="tree|node">` \u7684\u65b9\u5f0f\u5b9a\u4e49\u9875\u9762\u9996\u6b21\u6e32\u67d3\u65f6\u7684\u6e32\u67d3\u9897\u7c92\u5ea6\uff0c\u8fd9\u8ba9\u5f00\u53d1\u8005\u6709\u673a\u4f1a\u6839\u636e\u754c\u9762\u7684\u590d\u6742\u5ea6\u548c\u4e1a\u52a1\u9700\u6c42\u5bf9\u9996\u6b21\u6e32\u67d3\u8fc7\u7a0b\u8fdb\u884c\u5b9a\u5236\u3002`append="tree"` \u8868\u793a\u6574\u4e2a\u7ed3\u70b9\u5305\u62ec\u5176\u6240\u6709\u5b50\u7ed3\u70b9\u5168\u90e8\u751f\u6210\u5b8c\u6bd5\u4e4b\u540e\uff0c\u624d\u4f1a\u4e00\u6b21\u6027\u6e32\u67d3\u5230\u754c\u9762\u4e0a\uff1b\u800c `append="node"` \u5219\u8868\u793a\u8be5\u7ed3\u70b9\u4f1a\u5148\u6e32\u67d3\u5728\u754c\u9762\u4e0a\u4f5c\u4e3a\u4e00\u4e2a\u5bb9\u5668\uff0c\u5176\u5b50\u7ed3\u70b9\u4f1a\u7a0d\u540e\u505a\u8fdb\u4e00\u6b65\u6e32\u67d3\u3002
@@ -99,3 +46,17 @@ Weex \u7684\u5e95\u5c42\u8bbe\u8ba1\u6bd4\u8f83\u7075\u6d3b\uff0c\u9664\u4e86\u7ec4\u4ef6\u548c\u6a21\u5757\u4ee5\u5916\uff0c\u5f00\u53d1\u8005\u751a\u81f3
 ### `<transition>` \u8fc7\u6e21\u72b6\u6001
 
 Weex \u652f\u6301\u4e86 Vue 2.x \u4e2d\u7ecf\u5178\u7684 `<transition>` \u5199\u6cd5\uff0c\u5f00\u53d1\u8005\u53ef\u4ee5\u901a\u8fc7 `<transition>` \u8f7b\u677e\u5b9a\u4e49\u4e00\u4e2a\u754c\u9762\u5728\u4e24\u79cd\u72b6\u6001\u4e2d\u7684\u8fc7\u6e21\u65b9\u5f0f\u3002
+
+## \u6ce8\u610f\u4e8b\u9879
+
+Vue.js \u6700\u521d\u662f\u4e3a Web \u8bbe\u8ba1\u7684\uff0c\u867d\u7136\u53ef\u4ee5\u57fa\u4e8e Weex \u5f00\u53d1\u79fb\u52a8\u5e94\u7528\uff0c\u4f46\u662f Web \u5f00\u53d1\u548c\u539f\u751f\u5f00\u53d1\u6bd5\u7adf\u4e0d\u540c\uff0c\u5728\u529f\u80fd\u548c\u5f00\u53d1\u4f53\u9a8c\u4e0a\u90fd\u6709\u4e00\u4e9b\u5dee\u5f02\uff0c\u8fd9\u4e9b\u5dee\u5f02\u4ece\u672c\u8d28\u4e0a\u8bb2\u662f\u539f\u751f\u5f00\u53d1\u5e73\u53f0\u548c Web \u5e73\u53f0\u4e4b\u95f4\u7684\u5dee\u5f02\uff0cWeex \u6b63\u5728\u52aa\u529b\u7f29\u5c0f\u8fd9\u4e2a\u5dee\u5f02\u7684\u8303\u56f4\u3002
+
+\u53c2\u8003\u6587\u7ae0[\u300aVue 2.x \u5728 Weex \u548c Web \u4e2d\u7684\u5dee\u5f02\u300b](../../references/vue/index.html)\u4e86\u89e3\u5b58\u5728\u5dee\u5f02\u7684\u539f\u56e0\u548c\u7ec6\u8282\u3002
+
+## \u4f7f\u7528\u5176\u4ed6 Vue \u7684\u5de5\u5177\u5e93
+
+Vue.js \u4e5f\u6709\u8f83\u591a\u5468\u8fb9\u6280\u672f\u4ea7\u54c1\uff0c\u5982 [Vuex](https://github.com/vuejs/vuex) \u548c [vue-router](https://github.com/vuejs/vue-router) \u7b49\uff0c\u8fd9\u4e9b\u5e93\u4e5f\u53ef\u4ee5\u5728 Weex \u4e2d\u5f88\u597d\u7684\u5de5\u4f5c\u3002
+
+\u5173\u4e8e Vuex \u548c vue-louter \u7684\u4f7f\u7528\u65b9\u6cd5\uff0c\u53ef\u4ee5\u53c2\u8003[\u300a\u5728 Weex \u9879\u76ee\u4e2d\u4f7f\u7528 Vuex \u548c vue-router\u300b](../../references/vue/difference-of-vuex.html)\u3002
+
+> \u6211\u4eec\u57fa\u4e8e Weex \u548c Vue \u5f00\u53d1\u4e86\u4e00\u4e2a\u7684\u5b8c\u6574\u9879\u76ee [weex-hackernews](https://github.com/weexteam/weex-hackernews) \uff0c\u5f15\u5165\u4e86\u5305\u542b Vue 2.x \u7684 WeexSDK\uff0c\u521b\u5efa\u4e86\u4e09\u7aef\u7684\u9879\u76ee\u548c\u57fa\u672c\u7684\u7f16\u8bd1\u914d\u7f6e\u3002\u5728\u9879\u76ee\u4e2d\u4f7f\u7528\u4e86 Vuex \u548c vue-router \uff0c\u80fd\u591f\u5b9e\u73b0\u540c\u4e00\u4efd\u4ee3\u7801\uff0c\u5728 iOS\u3001Android\u3001Web \u4e0b\u90fd\u80fd\u5b8c\u6574\u5730\u5de5\u4f5c\u3002

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7737d9f4/doc/source/guide/intro/using-vue.md
----------------------------------------------------------------------
diff --git a/doc/source/guide/intro/using-vue.md b/doc/source/guide/intro/using-vue.md
index 5e5b3cc..bc043ae 100644
--- a/doc/source/guide/intro/using-vue.md
+++ b/doc/source/guide/intro/using-vue.md
@@ -7,4 +7,52 @@ version: 2.1
 
 # Using Vue
 
-Work in progress.
\ No newline at end of file
+## Vue in Weex
+
+[Vue.js](https://vuejs.org/) is an excellent progressive JavaScript framework written by [Evan You](https://twitter.com/youyuxi) which is very ease and flexible to use. Developers can write `*.vue` files with friendly `<template>`, `<style>`, `<script>` tags to build componentized web app.
+
+![a vue file](//cn.vuejs.org/images/vue-component.png)
+
+In Oct 2016 Vue.js has launched 2.0. It brings virtual-DOM and pre-compiler for HTML template. So it makes Vue.js possible to run in JS-only environment without HTML / CSS parser. And also the virtual-DOM layer makes Vue 2.x possible to render native UI through JavaScript.
+
+Now Weex and Vue has supported each other officially. Weex put Vue 2.x as its built-in JS Framework, and Vue has already been able to develop native mobile app.
+
+**Links**
+
+* [Weex tutorial](../index.html)
+* [Vue Introduction](https://vuejs.org/v2/guide/)
+* [How Weex works](./index.html)
+
+## New Features of Vue 2.x in Weex
+
+### Stream Rendering
+
+In Weex, developers can use `<foo append="tree|node">` to customize the rendering granularity to balance different UI complexity and business logic in order to get the best first-paint performance. `append=tree` means that the entire node, including all its child nodes, will be one-time rendered to native UI after all of the nodes generated completely. And `append=node` means just render the current node itself first and its child nodes will be futher rendered later.
+
+<!-- dotwe demo -->
+
+### Two-way Data Binding in Form Controls
+
+In Weex, we provide the same `v-model` directive as web dev exprience for both `<input>` and `<textarea>` components. Developers can write `<input v-model="message">` or `<textarea v-model="message">` to bind data `message` and show it on the text box automatically. When user modifies the text box, the value of data `message` will be automatically updated.
+
+<!-- dotwe demo -->
+
+### Isolate Each Page Contexts
+
+As described in [how Weex works](./index.html), all Weex's JS bundles share a JavaScript instance. So how can we make Vue 2.x used in multiple JS bundles completely isolated, and that one page which extends or rewrites Vue does not affect other pages becomes a problem. Through the collaboration between Weex and Vue. The problem has been solved.
+
+<!-- html5 apis -->
+
+### `<transition>`
+
+Weex supports the awesome `<transition>` syntax in Vue 2.x. Developers can easily define the transition of an interface in both states with `<transition>` tag.
+
+## Notice
+
+Web development and native development, after all, there are some differences in functionality and development experience, which are essentially the differences between the native development platform and the Web platform, and Weex is trying to narrow the scope of this difference. See [differences of Vue 2.x between Weex and web](../../references/vue/index.html)
+
+## Using Vue-related Libs
+
+Vue.js also has more cool related libs. For example [Vuex](https://github.com/vuejs/vuex) and [vue-router](https://github.com/vuejs/vue-router). They all work well in Weex. For using Vuex and vue-louter, see [Using Vuex and vue-router in Weex\u300b](../../references/vue/difference-of-vuex.html)\u3002
+
+> We developed a complete project based on Weex and Vue 2.x which named [weex-hackernews](https://github.com/weepteam/web-ehackernews). It includes WeexSDK with Vue 2.x in iOS, Android and web. Also we use Vuex and vue-router. The whole project uses the same source code for three different platforms.


[41/50] [abbrv] incubator-weex git commit: * [doc] updated guide/intro/write-once

Posted by ji...@apache.org.
* [doc] updated guide/intro/write-once


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

Branch: refs/heads/master
Commit: 3ffffe3c2569ecb86223367058e784d6fcd3126d
Parents: 0fb4fd9
Author: Jinjiang <zh...@me.com>
Authored: Fri Feb 17 10:59:20 2017 +0800
Committer: Jinjiang <zh...@me.com>
Committed: Fri Feb 17 10:59:20 2017 +0800

----------------------------------------------------------------------
 doc/source/guide/intro/write-once.md | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/3ffffe3c/doc/source/guide/intro/write-once.md
----------------------------------------------------------------------
diff --git a/doc/source/guide/intro/write-once.md b/doc/source/guide/intro/write-once.md
index 6a431f7..282c992 100644
--- a/doc/source/guide/intro/write-once.md
+++ b/doc/source/guide/intro/write-once.md
@@ -5,6 +5,19 @@ order: 4.4
 version: 2.1
 ---
 
-# Write once, Run Everywhere
+# Write Once, Run Everywhere
 
-Work in progress.
\ No newline at end of file
+Weex is a "Write Once, Run Everywhere" solution.
+
+* First, Weex is based on web dev experience, which including syntax and project management.
+* Second, all components & modules in Weex is discussed by iOS, Android, web developers together to ensure it's common enough to satisfy every platforms.
+* You only need write the same Weex code for each platforms.
+
+We think about it in these aspects below:
+
+1. Today for almost mobile apps, one app solves the same problem in different platforms. Weex hope to supply a lightweight way to describe your business logic which works well in all platforms you need.
+2. For the differences of all mobile platforms, we are willing to fill the gap in 2 points:
+    1. Design the same APIs for all platforms to ensure different platforms the same business logic description.
+    2. Implement the APIs with different style or behaviors to ensure the implementation and user experience matching different platforms.
+    3. If there are definitely some different features in different platforms. We also have some environment variables to help developers in certain detail situations.
+3. We trust (web) standard is the best for all features in all platforms.


[14/50] [abbrv] incubator-weex git commit: V0.10.0 stable gitlab (#178)

Posted by ji...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b5123119/ios/sdk/WeexSDK/Resources/main.js
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Resources/main.js b/ios/sdk/WeexSDK/Resources/main.js
index 0374b41..d2aa93e 100644
--- a/ios/sdk/WeexSDK/Resources/main.js
+++ b/ios/sdk/WeexSDK/Resources/main.js
@@ -1,7 +1,7 @@
-(this.nativeLog||function(s){console.log(s)})("START JS FRAMEWORK: 0.16.18 Build 20161103");this.getJSFMVersion=function(){return"0.16.18"};(function(modules){var installedModules={};function __webpack_require__(moduleId){if(installedModules[moduleId])return installedModules[moduleId].exports;var module=installedModules[moduleId]={exports:{},id:moduleId,loaded:false};modules[moduleId].call(module.exports,module,module.exports,__webpack_require__);module.loaded=true;return module.exports}__webpack_require__.m=modules;__webpack_require__.c=installedModules;__webpack_require__.p="";return __webpack_require__(0)})([function(module,exports,__webpack_require__){(function(global){"use strict";__webpack_require__(1);var methods=__webpack_require__(121);var _global=global,registerMethods=_global.registerMethods;registerMethods(methods)}).call(exports,function(){return this}())},function(module,exports,__webpack_require__){"use strict";__webpack_require__(2)},function(module,exports,__webpack
 _require__){(function(global){"use strict";__webpack_require__(3);var _runtime=__webpack_require__(79);var _runtime2=_interopRequireDefault(_runtime);var _package=__webpack_require__(119);var _methods=__webpack_require__(120);var methods=_interopRequireWildcard(_methods);function _interopRequireWildcard(obj){if(obj&&obj.__esModule){return obj}else{var newObj={};if(obj!=null){for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key))newObj[key]=obj[key]}}newObj.default=obj;return newObj}}function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var native=_package.subversion.native,transformer=_package.subversion.transformer;var _loop=function _loop(methodName){global[methodName]=function(){var ret=_runtime2.default[methodName].apply(_runtime2.default,arguments);if(ret instanceof Error){console.error(ret.toString())}return ret}};for(var methodName in _runtime2.default){_loop(methodName)}global.frameworkVersion=native;global.transformerVersion=transf
 ormer;global.registerMethods(methods)}).call(exports,function(){return this}())},function(module,exports,__webpack_require__){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.isPlainObject=exports.isObject=exports.toArray=exports.bind=exports.hasOwn=exports.remove=exports.def=exports.extend=undefined;var _utils=__webpack_require__(4);Object.defineProperty(exports,"extend",{enumerable:true,get:function get(){return _utils.extend}});Object.defineProperty(exports,"def",{enumerable:true,get:function get(){return _utils.def}});Object.defineProperty(exports,"remove",{enumerable:true,get:function get(){return _utils.remove}});Object.defineProperty(exports,"hasOwn",{enumerable:true,get:function get(){return _utils.hasOwn}});Object.defineProperty(exports,"bind",{enumerable:true,get:function get(){return _utils.bind}});Object.defineProperty(exports,"toArray",{enumerable:true,get:function get(){return _utils.toArray}});Object.defineProperty(exports,"isObject",{enum
 erable:true,get:function get(){return _utils.isObject}});Object.defineProperty(exports,"isPlainObject",{enumerable:true,get:function get(){return _utils.isPlainObject}});__webpack_require__(5);__webpack_require__(6);__webpack_require__(70);__webpack_require__(71);__webpack_require__(77);__webpack_require__(78)},function(module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});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.extend=extend;exports.def=def;exports.remove=remove;exports.hasOwn=hasOwn;exports.bind=bind;exports.toArray=toArray;exports.isObject=isObject;exports.isPlainObject=isPlainObject;function extend(target){for(var _len=arguments.length,src=Array(_len>1?_len-1:0),_key=1;_key<_len;_key++){src[_key-1]=arguments[_key]}if(typeof Object.assign==="function"){
 Object.assign.apply(Object,[target].concat(src))}else{var first=src.shift();for(var key in first){target[key]=first[key]}if(src.length){extend.apply(undefined,[target].concat(src))}}return target}function def(obj,key,val,enumerable){Object.defineProperty(obj,key,{value:val,enumerable:!!enumerable,writable:true,configurable:true})}function remove(arr,item){if(arr.length){var index=arr.indexOf(item);if(index>-1){return arr.splice(index,1)}}}var hasOwnProperty=Object.prototype.hasOwnProperty;function hasOwn(obj,key){return hasOwnProperty.call(obj,key)}function bind(fn,ctx){return function(a){var l=arguments.length;return l?l>1?fn.apply(ctx,arguments):fn.call(ctx,a):fn.call(ctx)}}function toArray(list,start){start=start||0;var i=list.length-start;var ret=new Array(i);while(i--){ret[i]=list[i+start]}return ret}function isObject(obj){return obj!==null&&(typeof obj==="undefined"?"undefined":_typeof(obj))==="object"}var toString=Object.prototype.toString;var OBJECT_STRING="[object Object]";
 function isPlainObject(obj){return toString.call(obj)===OBJECT_STRING}},function(module,exports){(function(global){"use strict";var _global=global,setTimeout=_global.setTimeout,setTimeoutNative=_global.setTimeoutNative;if(typeof setTimeout==="undefined"&&typeof setTimeoutNative==="function"){(function(){var timeoutMap={};var timeoutId=0;global.setTimeout=function(cb,time){timeoutMap[++timeoutId]=cb;setTimeoutNative(timeoutId.toString(),time)};global.setTimeoutCallback=function(id){if(typeof timeoutMap[id]==="function"){timeoutMap[id]();delete timeoutMap[id]}}})()}}).call(exports,function(){return this}())},function(module,exports,__webpack_require__){(function(global){"use strict";var _global=global,WXEnvironment=_global.WXEnvironment;if(WXEnvironment&&WXEnvironment.platform==="iOS"){global.Promise=null}__webpack_require__(7);__webpack_require__(27);__webpack_require__(53);__webpack_require__(57)}).call(exports,function(){return this}())},function(module,exports,__webpack_require__)
 {"use strict";var classof=__webpack_require__(8),test={};test[__webpack_require__(10)("toStringTag")]="z";if(test+""!="[object z]"){__webpack_require__(14)(Object.prototype,"toString",function toString(){return"[object "+classof(this)+"]"},true)}},function(module,exports,__webpack_require__){"use strict";var cof=__webpack_require__(9),TAG=__webpack_require__(10)("toStringTag"),ARG=cof(function(){return arguments}())=="Arguments";var tryGet=function tryGet(it,key){try{return it[key]}catch(e){}};module.exports=function(it){var O,T,B;return it===undefined?"Undefined":it===null?"Null":typeof(T=tryGet(O=Object(it),TAG))=="string"?T:ARG?cof(O):(B=cof(O))=="Object"&&typeof O.callee=="function"?"Arguments":B}},function(module,exports){"use strict";var toString={}.toString;module.exports=function(it){return toString.call(it).slice(8,-1)}},function(module,exports,__webpack_require__){"use strict";var store=__webpack_require__(11)("wks"),uid=__webpack_require__(13),_Symbol=__webpack_require__(
 12).Symbol,USE_SYMBOL=typeof _Symbol=="function";var $exports=module.exports=function(name){return store[name]||(store[name]=USE_SYMBOL&&_Symbol[name]||(USE_SYMBOL?_Symbol:uid)("Symbol."+name))};$exports.store=store},function(module,exports,__webpack_require__){"use strict";var global=__webpack_require__(12),SHARED="__core-js_shared__",store=global[SHARED]||(global[SHARED]={});module.exports=function(key){return store[key]||(store[key]={})}},function(module,exports){"use strict";var global=module.exports=typeof window!="undefined"&&window.Math==Math?window:typeof self!="undefined"&&self.Math==Math?self:Function("return this")();if(typeof __g=="number")__g=global},function(module,exports){"use strict";var id=0,px=Math.random();module.exports=function(key){return"Symbol(".concat(key===undefined?"":key,")_",(++id+px).toString(36))}},function(module,exports,__webpack_require__){"use strict";var global=__webpack_require__(12),hide=__webpack_require__(15),has=__webpack_require__(25),SRC=_
 _webpack_require__(13)("src"),TO_STRING="toString",$toString=Function[TO_STRING],TPL=(""+$toString).split(TO_STRING);__webpack_require__(26).inspectSource=function(it){return $toString.call(it)};(module.exports=function(O,key,val,safe){var isFunction=typeof val=="function";if(isFunction)has(val,"name")||hide(val,"name",key);if(O[key]===val)return;if(isFunction)has(val,SRC)||hide(val,SRC,O[key]?""+O[key]:TPL.join(String(key)));if(O===global){O[key]=val}else{if(!safe){delete O[key];hide(O,key,val)}else{if(O[key])O[key]=val;else hide(O,key,val)}}})(Function.prototype,TO_STRING,function toString(){return typeof this=="function"&&this[SRC]||$toString.call(this)})},function(module,exports,__webpack_require__){"use strict";var dP=__webpack_require__(16),createDesc=__webpack_require__(24);module.exports=__webpack_require__(20)?function(object,key,value){return dP.f(object,key,createDesc(1,value))}:function(object,key,value){object[key]=value;return object}},function(module,exports,__webpack
 _require__){"use strict";var anObject=__webpack_require__(17),IE8_DOM_DEFINE=__webpack_require__(19),toPrimitive=__webpack_require__(23),dP=Object.defineProperty;exports.f=__webpack_require__(20)?Object.defineProperty:function defineProperty(O,P,Attributes){anObject(O);P=toPrimitive(P,true);anObject(Attributes);if(IE8_DOM_DEFINE)try{return dP(O,P,Attributes)}catch(e){}if("get"in Attributes||"set"in Attributes)throw TypeError("Accessors not supported!");if("value"in Attributes)O[P]=Attributes.value;return O}},function(module,exports,__webpack_require__){"use strict";var isObject=__webpack_require__(18);module.exports=function(it){if(!isObject(it))throw TypeError(it+" is not an object!");return it}},function(module,exports){"use strict";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};module.exports=functi
 on(it){return(typeof it==="undefined"?"undefined":_typeof(it))==="object"?it!==null:typeof it==="function"}},function(module,exports,__webpack_require__){"use strict";module.exports=!__webpack_require__(20)&&!__webpack_require__(21)(function(){return Object.defineProperty(__webpack_require__(22)("div"),"a",{get:function get(){return 7}}).a!=7})},function(module,exports,__webpack_require__){"use strict";module.exports=!__webpack_require__(21)(function(){return Object.defineProperty({},"a",{get:function get(){return 7}}).a!=7})},function(module,exports){"use strict";module.exports=function(exec){try{return!!exec()}catch(e){return true}}},function(module,exports,__webpack_require__){"use strict";var isObject=__webpack_require__(18),document=__webpack_require__(12).document,is=isObject(document)&&isObject(document.createElement);module.exports=function(it){return is?document.createElement(it):{}}},function(module,exports,__webpack_require__){"use strict";var isObject=__webpack_require__
 (18);module.exports=function(it,S){if(!isObject(it))return it;var fn,val;if(S&&typeof(fn=it.toString)=="function"&&!isObject(val=fn.call(it)))return val;if(typeof(fn=it.valueOf)=="function"&&!isObject(val=fn.call(it)))return val;if(!S&&typeof(fn=it.toString)=="function"&&!isObject(val=fn.call(it)))return val;throw TypeError("Can't convert object to primitive value")}},function(module,exports){"use strict";module.exports=function(bitmap,value){return{enumerable:!(bitmap&1),configurable:!(bitmap&2),writable:!(bitmap&4),value:value}}},function(module,exports){"use strict";var hasOwnProperty={}.hasOwnProperty;module.exports=function(it,key){return hasOwnProperty.call(it,key)}},function(module,exports){"use strict";var core=module.exports={version:"2.4.0"};if(typeof __e=="number")__e=core},function(module,exports,__webpack_require__){"use strict";var $at=__webpack_require__(28)(true);__webpack_require__(31)(String,"String",function(iterated){this._t=String(iterated);this._i=0},function()
 {var O=this._t,index=this._i,point;if(index>=O.length)return{value:undefined,done:true};point=$at(O,index);this._i+=point.length;return{value:point,done:false}})},function(module,exports,__webpack_require__){"use strict";var toInteger=__webpack_require__(29),defined=__webpack_require__(30);module.exports=function(TO_STRING){return function(that,pos){var s=String(defined(that)),i=toInteger(pos),l=s.length,a,b;if(i<0||i>=l)return TO_STRING?"":undefined;a=s.charCodeAt(i);return a<55296||a>56319||i+1===l||(b=s.charCodeAt(i+1))<56320||b>57343?TO_STRING?s.charAt(i):a:TO_STRING?s.slice(i,i+2):(a-55296<<10)+(b-56320)+65536}}},function(module,exports){"use strict";var ceil=Math.ceil,floor=Math.floor;module.exports=function(it){return isNaN(it=+it)?0:(it>0?floor:ceil)(it)}},function(module,exports){"use strict";module.exports=function(it){if(it==undefined)throw TypeError("Can't call method on  "+it);return it}},function(module,exports,__webpack_require__){"use strict";var LIBRARY=__webpack_re
 quire__(32),$export=__webpack_require__(33),redefine=__webpack_require__(14),hide=__webpack_require__(15),has=__webpack_require__(25),Iterators=__webpack_require__(36),$iterCreate=__webpack_require__(37),setToStringTag=__webpack_require__(50),getPrototypeOf=__webpack_require__(51),ITERATOR=__webpack_require__(10)("iterator"),BUGGY=!([].keys&&"next"in[].keys()),FF_ITERATOR="@@iterator",KEYS="keys",VALUES="values";var returnThis=function returnThis(){return this};module.exports=function(Base,NAME,Constructor,next,DEFAULT,IS_SET,FORCED){$iterCreate(Constructor,NAME,next);var getMethod=function getMethod(kind){if(!BUGGY&&kind in proto)return proto[kind];switch(kind){case KEYS:return function keys(){return new Constructor(this,kind)};case VALUES:return function values(){return new Constructor(this,kind)}}return function entries(){return new Constructor(this,kind)}};var TAG=NAME+" Iterator",DEF_VALUES=DEFAULT==VALUES,VALUES_BUG=false,proto=Base.prototype,$native=proto[ITERATOR]||proto[FF_
 ITERATOR]||DEFAULT&&proto[DEFAULT],$default=$native||getMethod(DEFAULT),$entries=DEFAULT?!DEF_VALUES?$default:getMethod("entries"):undefined,$anyNative=NAME=="Array"?proto.entries||$native:$native,methods,key,IteratorPrototype;if($anyNative){IteratorPrototype=getPrototypeOf($anyNative.call(new Base));if(IteratorPrototype!==Object.prototype){setToStringTag(IteratorPrototype,TAG,true);if(!LIBRARY&&!has(IteratorPrototype,ITERATOR))hide(IteratorPrototype,ITERATOR,returnThis)}}if(DEF_VALUES&&$native&&$native.name!==VALUES){VALUES_BUG=true;$default=function values(){return $native.call(this)}}if((!LIBRARY||FORCED)&&(BUGGY||VALUES_BUG||!proto[ITERATOR])){hide(proto,ITERATOR,$default)}Iterators[NAME]=$default;Iterators[TAG]=returnThis;if(DEFAULT){methods={values:DEF_VALUES?$default:getMethod(VALUES),keys:IS_SET?$default:getMethod(KEYS),entries:$entries};if(FORCED)for(key in methods){if(!(key in proto))redefine(proto,key,methods[key])}else $export($export.P+$export.F*(BUGGY||VALUES_BUG),NAME
 ,methods)}return methods}},function(module,exports){"use strict";module.exports=false},function(module,exports,__webpack_require__){"use strict";var global=__webpack_require__(12),core=__webpack_require__(26),hide=__webpack_require__(15),redefine=__webpack_require__(14),ctx=__webpack_require__(34),PROTOTYPE="prototype";var $export=function $export(type,name,source){var IS_FORCED=type&$export.F,IS_GLOBAL=type&$export.G,IS_STATIC=type&$export.S,IS_PROTO=type&$export.P,IS_BIND=type&$export.B,target=IS_GLOBAL?global:IS_STATIC?global[name]||(global[name]={}):(global[name]||{})[PROTOTYPE],exports=IS_GLOBAL?core:core[name]||(core[name]={}),expProto=exports[PROTOTYPE]||(exports[PROTOTYPE]={}),key,own,out,exp;if(IS_GLOBAL)source=name;for(key in source){own=!IS_FORCED&&target&&target[key]!==undefined;out=(own?target:source)[key];exp=IS_BIND&&own?ctx(out,global):IS_PROTO&&typeof out=="function"?ctx(Function.call,out):out;if(target)redefine(target,key,out,type&$export.U);if(exports[key]!=out)hi
 de(exports,key,exp);if(IS_PROTO&&expProto[key]!=out)expProto[key]=out}};global.core=core;$export.F=1;$export.G=2;$export.S=4;$export.P=8;$export.B=16;$export.W=32;$export.U=64;$export.R=128;module.exports=$export},function(module,exports,__webpack_require__){"use strict";var aFunction=__webpack_require__(35);module.exports=function(fn,that,length){aFunction(fn);if(that===undefined)return fn;switch(length){case 1:return function(a){return fn.call(that,a)};case 2:return function(a,b){return fn.call(that,a,b)};case 3:return function(a,b,c){return fn.call(that,a,b,c)}}return function(){return fn.apply(that,arguments)}}},function(module,exports){"use strict";module.exports=function(it){if(typeof it!="function")throw TypeError(it+" is not a function!");return it}},function(module,exports){"use strict";module.exports={}},function(module,exports,__webpack_require__){"use strict";var create=__webpack_require__(38),descriptor=__webpack_require__(24),setToStringTag=__webpack_require__(50),Iter
 atorPrototype={};__webpack_require__(15)(IteratorPrototype,__webpack_require__(10)("iterator"),function(){return this});module.exports=function(Constructor,NAME,next){Constructor.prototype=create(IteratorPrototype,{next:descriptor(1,next)});setToStringTag(Constructor,NAME+" Iterator")}},function(module,exports,__webpack_require__){"use strict";var anObject=__webpack_require__(17),dPs=__webpack_require__(39),enumBugKeys=__webpack_require__(48),IE_PROTO=__webpack_require__(47)("IE_PROTO"),Empty=function Empty(){},PROTOTYPE="prototype";var _createDict=function createDict(){var iframe=__webpack_require__(22)("iframe"),i=enumBugKeys.length,lt="<",gt=">",iframeDocument;iframe.style.display="none";__webpack_require__(49).appendChild(iframe);iframe.src="javascript:";iframeDocument=iframe.contentWindow.document;iframeDocument.open();iframeDocument.write(lt+"script"+gt+"document.F=Object"+lt+"/script"+gt);iframeDocument.close();_createDict=iframeDocument.F;while(i--){delete _createDict[PROTOT
 YPE][enumBugKeys[i]]}return _createDict()};module.exports=Object.create||function create(O,Properties){var result;if(O!==null){Empty[PROTOTYPE]=anObject(O);result=new Empty;Empty[PROTOTYPE]=null;result[IE_PROTO]=O}else result=_createDict();return Properties===undefined?result:dPs(result,Properties)}},function(module,exports,__webpack_require__){"use strict";var dP=__webpack_require__(16),anObject=__webpack_require__(17),getKeys=__webpack_require__(40);module.exports=__webpack_require__(20)?Object.defineProperties:function defineProperties(O,Properties){anObject(O);var keys=getKeys(Properties),length=keys.length,i=0,P;while(length>i){dP.f(O,P=keys[i++],Properties[P])}return O}},function(module,exports,__webpack_require__){"use strict";var $keys=__webpack_require__(41),enumBugKeys=__webpack_require__(48);module.exports=Object.keys||function keys(O){return $keys(O,enumBugKeys)}},function(module,exports,__webpack_require__){"use strict";var has=__webpack_require__(25),toIObject=__webpac
 k_require__(42),arrayIndexOf=__webpack_require__(44)(false),IE_PROTO=__webpack_require__(47)("IE_PROTO");module.exports=function(object,names){var O=toIObject(object),i=0,result=[],key;for(key in O){if(key!=IE_PROTO)has(O,key)&&result.push(key)}while(names.length>i){if(has(O,key=names[i++])){~arrayIndexOf(result,key)||result.push(key)}}return result}},function(module,exports,__webpack_require__){"use strict";var IObject=__webpack_require__(43),defined=__webpack_require__(30);module.exports=function(it){return IObject(defined(it))}},function(module,exports,__webpack_require__){"use strict";var cof=__webpack_require__(9);module.exports=Object("z").propertyIsEnumerable(0)?Object:function(it){return cof(it)=="String"?it.split(""):Object(it)}},function(module,exports,__webpack_require__){"use strict";var toIObject=__webpack_require__(42),toLength=__webpack_require__(45),toIndex=__webpack_require__(46);module.exports=function(IS_INCLUDES){return function($this,el,fromIndex){var O=toIObjec
 t($this),length=toLength(O.length),index=toIndex(fromIndex,length),value;if(IS_INCLUDES&&el!=el)while(length>index){value=O[index++];if(value!=value)return true}else for(;length>index;index++){if(IS_INCLUDES||index in O){if(O[index]===el)return IS_INCLUDES||index||0}}return!IS_INCLUDES&&-1}}},function(module,exports,__webpack_require__){"use strict";var toInteger=__webpack_require__(29),min=Math.min;module.exports=function(it){return it>0?min(toInteger(it),9007199254740991):0}},function(module,exports,__webpack_require__){"use strict";var toInteger=__webpack_require__(29),max=Math.max,min=Math.min;module.exports=function(index,length){index=toInteger(index);return index<0?max(index+length,0):min(index,length)}},function(module,exports,__webpack_require__){"use strict";var shared=__webpack_require__(11)("keys"),uid=__webpack_require__(13);module.exports=function(key){return shared[key]||(shared[key]=uid(key))}},function(module,exports){"use strict";module.exports="constructor,hasOwnP
 roperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(module,exports,__webpack_require__){"use strict";module.exports=__webpack_require__(12).document&&document.documentElement},function(module,exports,__webpack_require__){"use strict";var def=__webpack_require__(16).f,has=__webpack_require__(25),TAG=__webpack_require__(10)("toStringTag");module.exports=function(it,tag,stat){if(it&&!has(it=stat?it:it.prototype,TAG))def(it,TAG,{configurable:true,value:tag})}},function(module,exports,__webpack_require__){"use strict";var has=__webpack_require__(25),toObject=__webpack_require__(52),IE_PROTO=__webpack_require__(47)("IE_PROTO"),ObjectProto=Object.prototype;module.exports=Object.getPrototypeOf||function(O){O=toObject(O);if(has(O,IE_PROTO))return O[IE_PROTO];if(typeof O.constructor=="function"&&O instanceof O.constructor){return O.constructor.prototype}return O instanceof Object?ObjectProto:null}},function(module,exports,__webpack_require__){"use 
 strict";var defined=__webpack_require__(30);module.exports=function(it){return Object(defined(it))}},function(module,exports,__webpack_require__){"use strict";var $iterators=__webpack_require__(54),redefine=__webpack_require__(14),global=__webpack_require__(12),hide=__webpack_require__(15),Iterators=__webpack_require__(36),wks=__webpack_require__(10),ITERATOR=wks("iterator"),TO_STRING_TAG=wks("toStringTag"),ArrayValues=Iterators.Array;for(var collections=["NodeList","DOMTokenList","MediaList","StyleSheetList","CSSRuleList"],i=0;i<5;i++){var NAME=collections[i],Collection=global[NAME],proto=Collection&&Collection.prototype,key;if(proto){if(!proto[ITERATOR])hide(proto,ITERATOR,ArrayValues);if(!proto[TO_STRING_TAG])hide(proto,TO_STRING_TAG,NAME);Iterators[NAME]=ArrayValues;for(key in $iterators){if(!proto[key])redefine(proto,key,$iterators[key],true)}}}},function(module,exports,__webpack_require__){"use strict";var addToUnscopables=__webpack_require__(55),step=__webpack_require__(56),I
 terators=__webpack_require__(36),toIObject=__webpack_require__(42);module.exports=__webpack_require__(31)(Array,"Array",function(iterated,kind){this._t=toIObject(iterated);this._i=0;this._k=kind},function(){var O=this._t,kind=this._k,index=this._i++;if(!O||index>=O.length){this._t=undefined;return step(1)}if(kind=="keys")return step(0,index);if(kind=="values")return step(0,O[index]);return step(0,[index,O[index]])},"values");Iterators.Arguments=Iterators.Array;addToUnscopables("keys");addToUnscopables("values");addToUnscopables("entries")},function(module,exports,__webpack_require__){"use strict";var UNSCOPABLES=__webpack_require__(10)("unscopables"),ArrayProto=Array.prototype;if(ArrayProto[UNSCOPABLES]==undefined)__webpack_require__(15)(ArrayProto,UNSCOPABLES,{});module.exports=function(key){ArrayProto[UNSCOPABLES][key]=true}},function(module,exports){"use strict";module.exports=function(done,value){return{value:value,done:!!done}}},function(module,exports,__webpack_require__){"use
  strict";var LIBRARY=__webpack_require__(32),global=__webpack_require__(12),ctx=__webpack_require__(34),classof=__webpack_require__(8),$export=__webpack_require__(33),isObject=__webpack_require__(18),aFunction=__webpack_require__(35),anInstance=__webpack_require__(58),forOf=__webpack_require__(59),speciesConstructor=__webpack_require__(63),task=__webpack_require__(64).set,microtask=__webpack_require__(66)(),PROMISE="Promise",TypeError=global.TypeError,process=global.process,$Promise=global[PROMISE],process=global.process,isNode=classof(process)=="process",empty=function empty(){},Internal,GenericPromiseCapability,Wrapper;var USE_NATIVE=!!function(){try{var promise=$Promise.resolve(1),FakePromise=(promise.constructor={})[__webpack_require__(10)("species")]=function(exec){exec(empty,empty)};return(isNode||typeof PromiseRejectionEvent=="function")&&promise.then(empty)instanceof FakePromise}catch(e){}}();var sameConstructor=function sameConstructor(a,b){return a===b||a===$Promise&&b===W
 rapper};var isThenable=function isThenable(it){var then;return isObject(it)&&typeof(then=it.then)=="function"?then:false};var newPromiseCapability=function newPromiseCapability(C){return sameConstructor($Promise,C)?new PromiseCapability(C):new GenericPromiseCapability(C)};var PromiseCapability=GenericPromiseCapability=function GenericPromiseCapability(C){var resolve,reject;this.promise=new C(function($$resolve,$$reject){if(resolve!==undefined||reject!==undefined)throw TypeError("Bad Promise constructor");resolve=$$resolve;reject=$$reject});this.resolve=aFunction(resolve);this.reject=aFunction(reject)};var perform=function perform(exec){try{exec()}catch(e){return{error:e}}};var notify=function notify(promise,isReject){if(promise._n)return;promise._n=true;var chain=promise._c;microtask(function(){var value=promise._v,ok=promise._s==1,i=0;var run=function run(reaction){var handler=ok?reaction.ok:reaction.fail,resolve=reaction.resolve,reject=reaction.reject,domain=reaction.domain,result
 ,then;try{if(handler){if(!ok){if(promise._h==2)onHandleUnhandled(promise);promise._h=1}if(handler===true)result=value;else{if(domain)domain.enter();result=handler(value);if(domain)domain.exit()}if(result===reaction.promise){reject(TypeError("Promise-chain cycle"))}else if(then=isThenable(result)){then.call(result,resolve,reject)}else resolve(result)}else reject(value)}catch(e){reject(e)}};while(chain.length>i){run(chain[i++])}promise._c=[];promise._n=false;if(isReject&&!promise._h)onUnhandled(promise)})};var onUnhandled=function onUnhandled(promise){task.call(global,function(){var value=promise._v,abrupt,handler,console;if(isUnhandled(promise)){abrupt=perform(function(){if(isNode){process.emit("unhandledRejection",value,promise)}else if(handler=global.onunhandledrejection){handler({promise:promise,reason:value})}else if((console=global.console)&&console.error){console.error("Unhandled promise rejection",value)}});promise._h=isNode||isUnhandled(promise)?2:1}promise._a=undefined;if(ab
 rupt)throw abrupt.error})};var isUnhandled=function isUnhandled(promise){if(promise._h==1)return false;var chain=promise._a||promise._c,i=0,reaction;while(chain.length>i){reaction=chain[i++];if(reaction.fail||!isUnhandled(reaction.promise))return false}return true};var onHandleUnhandled=function onHandleUnhandled(promise){task.call(global,function(){var handler;if(isNode){process.emit("rejectionHandled",promise)}else if(handler=global.onrejectionhandled){handler({promise:promise,reason:promise._v})}})};var $reject=function $reject(value){var promise=this;if(promise._d)return;promise._d=true;promise=promise._w||promise;promise._v=value;promise._s=2;if(!promise._a)promise._a=promise._c.slice();notify(promise,true)};var $resolve=function $resolve(value){var promise=this,then;if(promise._d)return;promise._d=true;promise=promise._w||promise;try{if(promise===value)throw TypeError("Promise can't be resolved itself");if(then=isThenable(value)){microtask(function(){var wrapper={_w:promise,_d
 :false};try{then.call(value,ctx($resolve,wrapper,1),ctx($reject,wrapper,1))}catch(e){$reject.call(wrapper,e)}})}else{promise._v=value;promise._s=1;notify(promise,false)}}catch(e){$reject.call({_w:promise,_d:false},e)}};if(!USE_NATIVE){$Promise=function Promise(executor){anInstance(this,$Promise,PROMISE,"_h");aFunction(executor);Internal.call(this);try{executor(ctx($resolve,this,1),ctx($reject,this,1))}catch(err){$reject.call(this,err)}};Internal=function Promise(executor){this._c=[];this._a=undefined;this._s=0;this._d=false;this._v=undefined;this._h=0;this._n=false};Internal.prototype=__webpack_require__(67)($Promise.prototype,{then:function then(onFulfilled,onRejected){var reaction=newPromiseCapability(speciesConstructor(this,$Promise));reaction.ok=typeof onFulfilled=="function"?onFulfilled:true;reaction.fail=typeof onRejected=="function"&&onRejected;reaction.domain=isNode?process.domain:undefined;this._c.push(reaction);if(this._a)this._a.push(reaction);if(this._s)notify(this,false
 );return reaction.promise},catch:function _catch(onRejected){return this.then(undefined,onRejected)}});PromiseCapability=function PromiseCapability(){var promise=new Internal;this.promise=promise;this.resolve=ctx($resolve,promise,1);this.reject=ctx($reject,promise,1)}}$export($export.G+$export.W+$export.F*!USE_NATIVE,{Promise:$Promise});__webpack_require__(50)($Promise,PROMISE);__webpack_require__(68)(PROMISE);Wrapper=__webpack_require__(26)[PROMISE];$export($export.S+$export.F*!USE_NATIVE,PROMISE,{reject:function reject(r){var capability=newPromiseCapability(this),$$reject=capability.reject;$$reject(r);return capability.promise}});$export($export.S+$export.F*(LIBRARY||!USE_NATIVE),PROMISE,{resolve:function resolve(x){if(x instanceof $Promise&&sameConstructor(x.constructor,this))return x;var capability=newPromiseCapability(this),$$resolve=capability.resolve;$$resolve(x);return capability.promise}});$export($export.S+$export.F*!(USE_NATIVE&&__webpack_require__(69)(function(iter){$Pro
 mise.all(iter)["catch"](empty)})),PROMISE,{all:function all(iterable){var C=this,capability=newPromiseCapability(C),resolve=capability.resolve,reject=capability.reject;var abrupt=perform(function(){var values=[],index=0,remaining=1;forOf(iterable,false,function(promise){var $index=index++,alreadyCalled=false;values.push(undefined);remaining++;C.resolve(promise).then(function(value){if(alreadyCalled)return;alreadyCalled=true;values[$index]=value;--remaining||resolve(values)},reject)});--remaining||resolve(values)});if(abrupt)reject(abrupt.error);return capability.promise},race:function race(iterable){var C=this,capability=newPromiseCapability(C),reject=capability.reject;var abrupt=perform(function(){forOf(iterable,false,function(promise){C.resolve(promise).then(capability.resolve,reject)})});if(abrupt)reject(abrupt.error);return capability.promise}})},function(module,exports){"use strict";module.exports=function(it,Constructor,name,forbiddenField){if(!(it instanceof Constructor)||for
 biddenField!==undefined&&forbiddenField in it){throw TypeError(name+": incorrect invocation!")}return it}},function(module,exports,__webpack_require__){"use strict";var ctx=__webpack_require__(34),call=__webpack_require__(60),isArrayIter=__webpack_require__(61),anObject=__webpack_require__(17),toLength=__webpack_require__(45),getIterFn=__webpack_require__(62),BREAK={},RETURN={};var _exports=module.exports=function(iterable,entries,fn,that,ITERATOR){var iterFn=ITERATOR?function(){return iterable}:getIterFn(iterable),f=ctx(fn,that,entries?2:1),index=0,length,step,iterator,result;if(typeof iterFn!="function")throw TypeError(iterable+" is not iterable!");if(isArrayIter(iterFn))for(length=toLength(iterable.length);length>index;index++){result=entries?f(anObject(step=iterable[index])[0],step[1]):f(iterable[index]);if(result===BREAK||result===RETURN)return result}else for(iterator=iterFn.call(iterable);!(step=iterator.next()).done;){result=call(iterator,f,step.value,entries);if(result===BR
 EAK||result===RETURN)return result}};_exports.BREAK=BREAK;_exports.RETURN=RETURN},function(module,exports,__webpack_require__){
-"use strict";var anObject=__webpack_require__(17);module.exports=function(iterator,fn,value,entries){try{return entries?fn(anObject(value)[0],value[1]):fn(value)}catch(e){var ret=iterator["return"];if(ret!==undefined)anObject(ret.call(iterator));throw e}}},function(module,exports,__webpack_require__){"use strict";var Iterators=__webpack_require__(36),ITERATOR=__webpack_require__(10)("iterator"),ArrayProto=Array.prototype;module.exports=function(it){return it!==undefined&&(Iterators.Array===it||ArrayProto[ITERATOR]===it)}},function(module,exports,__webpack_require__){"use strict";var classof=__webpack_require__(8),ITERATOR=__webpack_require__(10)("iterator"),Iterators=__webpack_require__(36);module.exports=__webpack_require__(26).getIteratorMethod=function(it){if(it!=undefined)return it[ITERATOR]||it["@@iterator"]||Iterators[classof(it)]}},function(module,exports,__webpack_require__){"use strict";var anObject=__webpack_require__(17),aFunction=__webpack_require__(35),SPECIES=__webpack
 _require__(10)("species");module.exports=function(O,D){var C=anObject(O).constructor,S;return C===undefined||(S=anObject(C)[SPECIES])==undefined?D:aFunction(S)}},function(module,exports,__webpack_require__){"use strict";var ctx=__webpack_require__(34),invoke=__webpack_require__(65),html=__webpack_require__(49),cel=__webpack_require__(22),global=__webpack_require__(12),process=global.process,setTask=global.setImmediate,clearTask=global.clearImmediate,MessageChannel=global.MessageChannel,counter=0,queue={},ONREADYSTATECHANGE="onreadystatechange",defer,channel,port;var run=function run(){var id=+this;if(queue.hasOwnProperty(id)){var fn=queue[id];delete queue[id];fn()}};var listener=function listener(event){run.call(event.data)};if(!setTask||!clearTask){setTask=function setImmediate(fn){var args=[],i=1;while(arguments.length>i){args.push(arguments[i++])}queue[++counter]=function(){invoke(typeof fn=="function"?fn:Function(fn),args)};defer(counter);return counter};clearTask=function clear
 Immediate(id){delete queue[id]};if(__webpack_require__(9)(process)=="process"){defer=function defer(id){process.nextTick(ctx(run,id,1))}}else if(MessageChannel){channel=new MessageChannel;port=channel.port2;channel.port1.onmessage=listener;defer=ctx(port.postMessage,port,1)}else if(global.addEventListener&&typeof postMessage=="function"&&!global.importScripts){defer=function defer(id){global.postMessage(id+"","*")};global.addEventListener("message",listener,false)}else if(ONREADYSTATECHANGE in cel("script")){defer=function defer(id){html.appendChild(cel("script"))[ONREADYSTATECHANGE]=function(){html.removeChild(this);run.call(id)}}}else{defer=function defer(id){setTimeout(ctx(run,id,1),0)}}}module.exports={set:setTask,clear:clearTask}},function(module,exports){"use strict";module.exports=function(fn,args,that){var un=that===undefined;switch(args.length){case 0:return un?fn():fn.call(that);case 1:return un?fn(args[0]):fn.call(that,args[0]);case 2:return un?fn(args[0],args[1]):fn.call
 (that,args[0],args[1]);case 3:return un?fn(args[0],args[1],args[2]):fn.call(that,args[0],args[1],args[2]);case 4:return un?fn(args[0],args[1],args[2],args[3]):fn.call(that,args[0],args[1],args[2],args[3])}return fn.apply(that,args)}},function(module,exports,__webpack_require__){"use strict";var global=__webpack_require__(12),macrotask=__webpack_require__(64).set,Observer=global.MutationObserver||global.WebKitMutationObserver,process=global.process,Promise=global.Promise,isNode=__webpack_require__(9)(process)=="process";module.exports=function(){var head,last,notify;var flush=function flush(){var parent,fn;if(isNode&&(parent=process.domain))parent.exit();while(head){fn=head.fn;head=head.next;try{fn()}catch(e){if(head)notify();else last=undefined;throw e}}last=undefined;if(parent)parent.enter()};if(isNode){notify=function notify(){process.nextTick(flush)}}else if(Observer){var toggle=true,node=document.createTextNode("");new Observer(flush).observe(node,{characterData:true});notify=fu
 nction notify(){node.data=toggle=!toggle}}else if(Promise&&Promise.resolve){var promise=Promise.resolve();notify=function notify(){promise.then(flush)}}else{notify=function notify(){macrotask.call(global,flush)}}return function(fn){var task={fn:fn,next:undefined};if(last)last.next=task;if(!head){head=task;notify()}last=task}}},function(module,exports,__webpack_require__){"use strict";var redefine=__webpack_require__(14);module.exports=function(target,src,safe){for(var key in src){redefine(target,key,src[key],safe)}return target}},function(module,exports,__webpack_require__){"use strict";var global=__webpack_require__(12),dP=__webpack_require__(16),DESCRIPTORS=__webpack_require__(20),SPECIES=__webpack_require__(10)("species");module.exports=function(KEY){var C=global[KEY];if(DESCRIPTORS&&C&&!C[SPECIES])dP.f(C,SPECIES,{configurable:true,get:function get(){return this}})}},function(module,exports,__webpack_require__){"use strict";var ITERATOR=__webpack_require__(10)("iterator"),SAFE_CL
 OSING=false;try{var riter=[7][ITERATOR]();riter["return"]=function(){SAFE_CLOSING=true};Array.from(riter,function(){throw 2})}catch(e){}module.exports=function(exec,skipClosing){if(!skipClosing&&!SAFE_CLOSING)return false;var safe=false;try{var arr=[7],iter=arr[ITERATOR]();iter.next=function(){return{done:safe=true}};arr[ITERATOR]=function(){return iter};exec(arr)}catch(e){}return safe}},function(module,exports){(function(global){"use strict";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 _global=global,console=_global.console,nativeLog=_global.nativeLog;var LEVELS=["off","error","warn","info","log","debug"];var levelMap={};generateLevelMap();if(typeof console==="undefined"||global.WXEnvironment&&global.WXEnvironment.platform==="iOS"){global.console={debug:function debug(){for(var _len=arguments.length,args=Array(_len),_key=0;_key<_len;_key++){args[_key]=argument
 s[_key]}if(checkLevel("debug")){nativeLog.apply(undefined,_toConsumableArray(format(args)).concat(["__DEBUG"]))}},log:function log(){for(var _len2=arguments.length,args=Array(_len2),_key2=0;_key2<_len2;_key2++){args[_key2]=arguments[_key2]}if(checkLevel("log")){nativeLog.apply(undefined,_toConsumableArray(format(args)).concat(["__LOG"]))}},info:function info(){for(var _len3=arguments.length,args=Array(_len3),_key3=0;_key3<_len3;_key3++){args[_key3]=arguments[_key3]}if(checkLevel("info")){nativeLog.apply(undefined,_toConsumableArray(format(args)).concat(["__INFO"]))}},warn:function warn(){for(var _len4=arguments.length,args=Array(_len4),_key4=0;_key4<_len4;_key4++){args[_key4]=arguments[_key4]}if(checkLevel("warn")){nativeLog.apply(undefined,_toConsumableArray(format(args)).concat(["__WARN"]))}},error:function error(){for(var _len5=arguments.length,args=Array(_len5),_key5=0;_key5<_len5;_key5++){args[_key5]=arguments[_key5]}if(checkLevel("error")){nativeLog.apply(undefined,_toConsumab
 leArray(format(args)).concat(["__ERROR"]))}}}}else{var debug=console.debug,log=console.log,info=console.info,warn=console.warn,error=console.error;console.__ori__={debug:debug,log:log,info:info,warn:warn,error:error};console.debug=function(){for(var _len6=arguments.length,args=Array(_len6),_key6=0;_key6<_len6;_key6++){args[_key6]=arguments[_key6]}if(checkLevel("debug")){console.__ori__.debug.apply(console,args)}};console.log=function(){for(var _len7=arguments.length,args=Array(_len7),_key7=0;_key7<_len7;_key7++){args[_key7]=arguments[_key7]}if(checkLevel("log")){console.__ori__.log.apply(console,args)}};console.info=function(){for(var _len8=arguments.length,args=Array(_len8),_key8=0;_key8<_len8;_key8++){args[_key8]=arguments[_key8]}if(checkLevel("info")){console.__ori__.info.apply(console,args)}};console.warn=function(){for(var _len9=arguments.length,args=Array(_len9),_key9=0;_key9<_len9;_key9++){args[_key9]=arguments[_key9]}if(checkLevel("warn")){console.__ori__.warn.apply(console,
 args)}};console.error=function(){for(var _len10=arguments.length,args=Array(_len10),_key10=0;_key10<_len10;_key10++){args[_key10]=arguments[_key10]}if(checkLevel("error")){console.__ori__.error.apply(console,args)}}}function generateLevelMap(){LEVELS.forEach(function(level){var levelIndex=LEVELS.indexOf(level);levelMap[level]={};LEVELS.forEach(function(type){var typeIndex=LEVELS.indexOf(type);if(typeIndex<=levelIndex){levelMap[level][type]=true}})})}function checkLevel(type){var logLevel=global.WXEnvironment&&global.WXEnvironment.logLevel||"log";return levelMap[logLevel]&&levelMap[logLevel][type]}function format(args){return args.map(function(v){var type=Object.prototype.toString.call(v);if(type.toLowerCase()==="[object object]"){v=JSON.stringify(v)}else{v=String(v)}return v})}}).call(exports,function(){return this}())},function(module,exports,__webpack_require__){"use strict";__webpack_require__(72)},function(module,exports,__webpack_require__){"use strict";__webpack_require__(73);
 module.exports=__webpack_require__(26).Object.assign},function(module,exports,__webpack_require__){"use strict";var $export=__webpack_require__(33);$export($export.S+$export.F,"Object",{assign:__webpack_require__(74)})},function(module,exports,__webpack_require__){"use strict";var getKeys=__webpack_require__(40),gOPS=__webpack_require__(75),pIE=__webpack_require__(76),toObject=__webpack_require__(52),IObject=__webpack_require__(43),$assign=Object.assign;module.exports=!$assign||__webpack_require__(21)(function(){var A={},B={},S=Symbol(),K="abcdefghijklmnopqrst";A[S]=7;K.split("").forEach(function(k){B[k]=k});return $assign({},A)[S]!=7||Object.keys($assign({},B)).join("")!=K})?function assign(target,source){var T=toObject(target),aLen=arguments.length,index=1,getSymbols=gOPS.f,isEnum=pIE.f;while(aLen>index){var S=IObject(arguments[index++]),keys=getSymbols?getKeys(S).concat(getSymbols(S)):getKeys(S),length=keys.length,j=0,key;while(length>j){if(isEnum.call(S,key=keys[j++]))T[key]=S[k
 ey]}}return T}:$assign},function(module,exports){"use strict";exports.f=Object.getOwnPropertySymbols},function(module,exports){"use strict";exports.f={}.propertyIsEnumerable},function(module,exports){"use strict";if(!Object.setPrototypeOf){Object.setPrototypeOf=function(Object,magic){var set;function setPrototypeOf(O,proto){set.call(O,proto);return O}try{set=Object.getOwnPropertyDescriptor(Object.prototype,magic).set;set.call({},null)}catch(e){if(Object.prototype!=={}[magic]||{__proto__:null}.__proto__===void 0){return}set=function set(proto){this[magic]=proto};setPrototypeOf.polyfill=setPrototypeOf(setPrototypeOf({},null),Object.prototype)instanceof Object}return setPrototypeOf}(Object,"__proto__")}},function(module,exports){"use strict";if(!Array.from){console.log("make polyfill");Array.from=function(){var toStr=Object.prototype.toString;var isCallable=function isCallable(fn){return typeof fn==="function"||toStr.call(fn)==="[object Function]"};var toInteger=function toInteger(valu
 e){var number=Number(value);if(isNaN(number)){return 0}if(number===0||!isFinite(number)){return number}return(number>0?1:-1)*Math.floor(Math.abs(number))};var maxSafeInteger=Math.pow(2,53)-1;var toLength=function toLength(value){var len=toInteger(value);return Math.min(Math.max(len,0),maxSafeInteger)};return function from(arrayLike){var C=this;var items=Object(arrayLike);if(arrayLike==null){throw new TypeError("Array.from requires an array-like object - not null or undefined")}var mapFn=arguments.length>1?arguments[1]:void undefined;var T;if(typeof mapFn!=="undefined"){if(!isCallable(mapFn)){throw new TypeError("Array.from: when provided, the second argument must be a function")}if(arguments.length>2){T=arguments[2]}}var len=toLength(items.length);var A=isCallable(C)?Object(new C(len)):new Array(len);var k=0;var kValue;while(k<len){kValue=items[k];if(mapFn){A[k]=typeof T==="undefined"?mapFn(kValue,k):mapFn.call(T,kValue,k)}else{A[k]=kValue}k+=1}A.length=len;return A}}()}},function(m
 odule,exports,__webpack_require__){(function(global){"use strict";Object.defineProperty(exports,"__esModule",{value:true});var _vdom=__webpack_require__(80);var _listener=__webpack_require__(81);var _listener2=_interopRequireDefault(_listener);var _config=__webpack_require__(82);var _config2=_interopRequireDefault(_config);var _init=__webpack_require__(118);var _init2=_interopRequireDefault(_init);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var config={Document:_vdom.Document,Element:_vdom.Element,Comment:_vdom.Comment,Listener:_listener2.default,frameworks:_config2.default,sendTasks:function sendTasks(){var _global;return(_global=global).callNative.apply(_global,arguments)}};var methods=(0,_init2.default)(config);exports.default=methods}).call(exports,function(){return this}())},function(module,exports,__webpack_require__){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.instanceMap=undefined;var _slicedToArray=func
 tion(){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")}}}();exports.Document=Document;exports.Node=Node;exports.Element=Element;exports.Comment=Comment;var _utils=__webpack_require__(4);var DEFAULT_TAG_NAME="div";var instanceMap=exports.instanceMap={};var nextNodeRef=1;function Document(id,url,handler,Listener){id=id?id.toString():"";this.id=id;this.URL=url;instanceMap[id]=this;this.nodeMap={};Listener&&(this.listener=new Listener(id,handler||genCallTasks(id)));this.createDocumentElement()}function genCallTasks(id)
 {return function(tasks){if(!Array.isArray(tasks)){tasks=[tasks]}for(var i=0;i<tasks.length;i++){var task=tasks[i];var returnValue=void 0;if(task.module==="dom"&&task.method==="addElement"){var _task$args=_slicedToArray(task.args,3),ref=_task$args[0],json=_task$args[1],index=_task$args[2];returnValue=callAddElement(id,ref,json,index,"-1")}else{returnValue=callNative(id,[task],"-1")}if(returnValue===-1){return returnValue}}}}Document.prototype.destroy=function(){delete this.listener;delete this.nodeMap;delete instanceMap[this.id]};Document.prototype.open=function(){this.listener.batched=false};Document.prototype.close=function(){this.listener.batched=true};Document.prototype.createDocumentElement=function(){var _this=this;if(!this.documentElement){var el=new Element("document");el.docId=this.id;el.ownerDocument=this;el.role="documentElement";el.depth=0;el.ref="_documentElement";this.nodeMap._documentElement=el;this.documentElement=el;el.appendChild=function(node){appendBody(_this,node
 )};el.insertBefore=function(node,before){appendBody(_this,node,before)}}return this.documentElement};function appendBody(doc,node,before){var documentElement=doc.documentElement;if(documentElement.pureChildren.length>0||node.parentNode){return}var children=documentElement.children;var beforeIndex=children.indexOf(before);if(beforeIndex<0){children.push(node)}else{children.splice(beforeIndex,0,node)}if(node.nodeType===1){if(node.role==="body"){node.docId=doc.id;node.ownerDocument=doc;node.parentNode=documentElement;linkParent(node,documentElement)}else{node.children.forEach(function(child){child.parentNode=node});setBody(doc,node);node.docId=doc.id;node.ownerDocument=doc;linkParent(node,documentElement);delete doc.nodeMap[node.nodeId]}documentElement.pureChildren.push(node);doc.listener.createBody(node)}else{node.parentNode=documentElement;doc.nodeMap[node.ref]=node}}function setBody(doc,el){el.role="body";el.depth=1;delete doc.nodeMap[el.nodeId];el.ref="_root";doc.nodeMap._root=el;d
 oc.body=el}Document.prototype.createBody=function(type,props){if(!this.body){var el=new Element(type,props);setBody(this,el)}return this.body};Document.prototype.createElement=function(tagName,props){return new Element(tagName,props)};Document.prototype.createComment=function(text){return new Comment(text)};Document.prototype.fireEvent=function(el,type,e,domChanges){if(!el){return}e=e||{};e.type=type;e.target=el;e.timestamp=Date.now();if(domChanges){updateElement(el,domChanges)}return el.fireEvent(type,e)};Document.prototype.getRef=function(ref){return this.nodeMap[ref]};function updateElement(el,changes){var attrs=changes.attrs||{};for(var name in attrs){el.setAttr(name,attrs[name],true)}var style=changes.style||{};for(var _name in style){el.setStyle(_name,style[_name],true)}}function Node(){this.nodeId=(nextNodeRef++).toString();this.ref=this.nodeId;this.children=[];this.pureChildren=[];this.parentNode=null;this.nextSibling=null;this.previousSibling=null}Node.prototype.destroy=fun
 ction(){var doc=instanceMap[this.docId];if(doc){delete this.docId;delete doc.nodeMap[this.nodeId]}this.children.forEach(function(child){child.destroy()})};function Element(){var type=arguments.length>0&&arguments[0]!==undefined?arguments[0]:DEFAULT_TAG_NAME;var props=arguments[1];props=props||{};this.nodeType=1;this.nodeId=(nextNodeRef++).toString();this.ref=this.nodeId;this.type=type;this.attr=props.attr||{};this.classStyle=props.classStyle||{};this.style=props.style||{};this.event={};this.children=[];this.pureChildren=[]}Element.prototype=new Node;Element.prototype.appendChild=function(node){if(node.parentNode&&node.parentNode!==this){return}if(!node.parentNode){linkParent(node,this);insertIndex(node,this.children,this.children.length,true);if(this.docId){registerNode(this.docId,node)}if(node.nodeType===1){insertIndex(node,this.pureChildren,this.pureChildren.length);if(this.docId){var listener=instanceMap[this.docId].listener;return listener.addElement(node,this.ref,-1)}}}else{mov
 eIndex(node,this.children,this.children.length,true);if(node.nodeType===1){var index=moveIndex(node,this.pureChildren,this.pureChildren.length);if(this.docId&&index>=0){var _listener=instanceMap[this.docId].listener;return _listener.moveElement(node.ref,this.ref,index)}}}};Element.prototype.insertBefore=function(node,before){if(node.parentNode&&node.parentNode!==this){return}if(node===before||node.nextSibling===before){return}if(!node.parentNode){linkParent(node,this);insertIndex(node,this.children,this.children.indexOf(before),true);if(this.docId){registerNode(this.docId,node)}if(node.nodeType===1){var pureBefore=nextElement(before);var index=insertIndex(node,this.pureChildren,pureBefore?this.pureChildren.indexOf(pureBefore):this.pureChildren.length);if(this.docId){var listener=instanceMap[this.docId].listener;return listener.addElement(node,this.ref,index)}}}else{moveIndex(node,this.children,this.children.indexOf(before),true);if(node.nodeType===1){var _pureBefore=nextElement(befo
 re);var _index=moveIndex(node,this.pureChildren,_pureBefore?this.pureChildren.indexOf(_pureBefore):this.pureChildren.length);if(this.docId&&_index>=0){var _listener2=instanceMap[this.docId].listener;return _listener2.moveElement(node.ref,this.ref,_index)}}}};Element.prototype.insertAfter=function(node,after){if(node.parentNode&&node.parentNode!==this){return}if(node===after||node.previousSibling===after){return}if(!node.parentNode){linkParent(node,this);insertIndex(node,this.children,this.children.indexOf(after)+1,true);if(this.docId){registerNode(this.docId,node)}if(node.nodeType===1){var index=insertIndex(node,this.pureChildren,this.pureChildren.indexOf(previousElement(after))+1);if(this.docId){var listener=instanceMap[this.docId].listener;return listener.addElement(node,this.ref,index)}}}else{moveIndex(node,this.children,this.children.indexOf(after)+1,true);if(node.nodeType===1){var _index2=moveIndex(node,this.pureChildren,this.pureChildren.indexOf(previousElement(after))+1);if(t
 his.docId&&_index2>=0){var _listener3=instanceMap[this.docId].listener;return _listener3.moveElement(node.ref,this.ref,_index2)}}}};Element.prototype.removeChild=function(node,preserved){if(node.parentNode){removeIndex(node,this.children,true);if(node.nodeType===1){removeIndex(node,this.pureChildren);if(this.docId){var listener=instanceMap[this.docId].listener;listener.removeElement(node.ref)}}}if(!preserved){node.destroy()}};Element.prototype.clear=function(){var _this2=this;if(this.docId){(function(){var listener=instanceMap[_this2.docId].listener;_this2.pureChildren.forEach(function(node){listener.removeElement(node.ref)})})()}this.children.forEach(function(node){node.destroy()});this.children.length=0;this.pureChildren.length=0};function nextElement(node){while(node){if(node.nodeType===1){return node}node=node.nextSibling}}function previousElement(node){while(node){if(node.nodeType===1){return node}node=node.previousSibling}}function linkParent(node,parent){node.parentNode=paren
 t;if(parent.docId){node.docId=parent.docId;node.ownerDocument=parent.ownerDocument;node.ownerDocument.nodeMap[node.nodeId]=node;node.depth=parent.depth+1}node.children.forEach(function(child){linkParent(child,node)})}function registerNode(docId,node){var doc=instanceMap[docId];doc.nodeMap[node.nodeId]=node}function insertIndex(target,list,newIndex,changeSibling){if(newIndex<0){newIndex=0}var before=list[newIndex-1];var after=list[newIndex];list.splice(newIndex,0,target);if(changeSibling){before&&(before.nextSibling=target);target.previousSibling=before;target.nextSibling=after;after&&(after.previousSibling=target)}return newIndex}function moveIndex(target,list,newIndex,changeSibling){var index=list.indexOf(target);if(index<0){return-1}if(changeSibling){var before=list[index-1];var after=list[index+1];before&&(before.nextSibling=after);after&&(after.previousSibling=before)}list.splice(index,1);var newIndexAfter=newIndex;if(index<=newIndex){newIndexAfter=newIndex-1}var beforeNew=list[
 newIndexAfter-1];var afterNew=list[newIndexAfter];list.splice(newIndexAfter,0,target);if(changeSibling){beforeNew&&(beforeNew.nextSibling=target);target.previousSibling=beforeNew;target.nextSibling=afterNew;afterNew&&(afterNew.previousSibling=target)}if(index===newIndexAfter){return-1}return newIndex}function removeIndex(target,list,changeSibling){var index=list.indexOf(target);if(index<0){return}if(changeSibling){var before=list[index-1];var after=list[index+1];before&&(before.nextSibling=after);after&&(after.previousSibling=before)}list.splice(index,1)}Element.prototype.setAttr=function(key,value,silent){if(this.attr[key]===value&&silent!==false){return}this.attr[key]=value;if(!silent&&this.docId){var listener=instanceMap[this.docId].listener;listener.setAttr(this.ref,key,value)}};Element.prototype.setStyle=function(key,value,silent){if(this.style[key]===value&&silent!==false){return}this.style[key]=value;if(!silent&&this.docId){var listener=instanceMap[this.docId].listener;listen
 er.setStyle(this.ref,key,value)}};Element.prototype.resetClassStyle=function(){for(var key in this.classStyle){this.classStyle[key]=""}};Element.prototype.setClassStyle=function(classStyle){this.resetClassStyle();(0,_utils.extend)(this.classStyle,classStyle);if(this.docId){var listener=instanceMap[this.docId].listener;listener.setStyles(this.ref,this.toStyle())}};Element.prototype.addEvent=function(type,handler){if(!this.event[type]){this.event[type]=handler;if(this.docId){var listener=instanceMap[this.docId].listener;listener.addEvent(this.ref,type)}}};Element.prototype.removeEvent=function(type){if(this.event[type]){delete this.event[type];if(this.docId){var listener=instanceMap[this.docId].listener;listener.removeEvent(this.ref,type)}}};Element.prototype.fireEvent=function(type,e){var handler=this.event[type];if(handler){return handler.call(this,e)}};Element.prototype.toStyle=function(){return(0,_utils.extend)({},this.classStyle,this.style)};Element.prototype.toJSON=function(){va
 r result={ref:this.ref.toString(),type:this.type,attr:this.attr,style:this.toStyle()};var event=Object.keys(this.event);if(event.length){result.event=event}if(this.pureChildren.length){result.children=this.pureChildren.map(function(child){return child.toJSON()})}return result};Element.prototype.toString=function(){return"<"+this.type+" attr="+JSON.stringify(this.attr)+" style="+JSON.stringify(this.toStyle())+">"+this.pureChildren.map(function(child){return child.toString()}).join("")+"</"+this.type+">"};function Comment(value){this.nodeType=8;this.nodeId=(nextNodeRef++).toString();this.ref=this.nodeId;this.type="comment";this.value=value;this.children=[];this.pureChildren=[]}Comment.prototype=new Node;Comment.prototype.toString=function(){return"<!-- "+this.value+" -->"}},function(module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=Listener;exports.createAction=createAction;function Listener(id,handler){this.id=id;this.batched=false;
 this.updates=[];if(typeof handler==="function"){this.handler=handler}}Listener.prototype.createFinish=function(callback){var handler=this.handler;return handler([createAction("createFinish",[])],callback)};Listener.prototype.updateFinish=function(callback){var handler=this.handler;return handler([createAction("updateFinish",[])],callback)};Listener.prototype.refreshFinish=function(callback){var handler=this.handler;return handler([createAction("refreshFinish",[])],callback)};Listener.prototype.createBody=function(element){var body=element.toJSON();var children=body.children;delete body.children;var actions=[createAction("createBody",[body])];if(children){actions.push.apply(actions,children.map(function(child){return createAction("addElement",[body.ref,child,-1])}))}return this.addActions(actions)};Listener.prototype.addElement=function(element,ref,index){if(!(index>=0)){index=-1}return this.addActions(createAction("addElement",[ref,element.toJSON(),index]))};Listener.prototype.remov
 eElement=function(ref){if(Array.isArray(ref)){var actions=ref.map(function(r){return createAction("removeElement",[r])});return this.addActions(actions)}return this.addActions(createAction("removeElement",[ref]))};Listener.prototype.moveElement=function(targetRef,parentRef,index){return this.addActions(createAction("moveElement",[targetRef,parentRef,index]))};Listener.prototype.setAttr=function(ref,key,value){var result={};result[key]=value;return this.addActions(createAction("updateAttrs",[ref,result]))};Listener.prototype.setStyle=function(ref,key,value){var result={};result[key]=value;return this.addActions(createAction("updateStyle",[ref,result]))};Listener.prototype.setStyles=function(ref,style){return this.addActions(createAction("updateStyle",[ref,style]))};Listener.prototype.addEvent=function(ref,type){return this.addActions(createAction("addEvent",[ref,type]))};Listener.prototype.removeEvent=function(ref,type){return this.addActions(createAction("removeEvent",[ref,type]))};
 Listener.prototype.handler=function(actions,cb){return cb&&cb()};Listener.prototype.addActions=function(actions){var updates=this.updates;var handler=this.handler;if(!Array.isArray(actions)){actions=[actions]}if(this.batched){updates.push.apply(updates,actions)}else{return handler(actions)}};function createAction(name,args){return{module:"dom",method:name,args:args}}},function(module,exports,__webpack_require__){"use strict";Object.defineProperty(exports,"__esModule",{value:true});var _weexRxFramework=__webpack_require__(83);var Rx=_interopRequireWildcard(_weexRxFramework);var _vanilla=__webpack_require__(85);var Vanilla=_interopRequireWildcard(_vanilla);var _default=__webpack_require__(86);var Weex=_interopRequireWildcard(_default);function _interopRequireWildcard(obj){if(obj&&obj.__esModule){return obj}else{var newObj={};if(obj!=null){for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key))newObj[key]=obj[key]}}newObj.default=obj;return newObj}}exports.default={Rx:Rx,
 Vanilla:Vanilla,Weex:Weex}},function(module,exports,__webpack_require__){(function(global){"use strict";var _typeof2=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};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 _typeof=typeof Symbol==="function"&&_typ
 eof2(Symbol.iterator)==="symbol"?function(obj){return typeof obj==="undefined"?"undefined":_typeof2(obj)}:function(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol?"symbol":typeof obj==="undefined"?"undefined":_typeof2(obj)};exports.getInstance=getInstance;exports.init=init;exports.registerComponents=registerComponents;exports.registerMethods=registerMethods;exports.registerModules=registerModules;exports.createInstance=createInstance;exports.refreshInstance=refreshInstance;exports.destroyInstance=destroyInstance;exports.getRoot=getRoot;exports.receiveTasks=receiveTasks;var _builtinModulesCode=__webpack_require__(84);var _builtinModulesCode2=_interopRequireDefault(_builtinModulesCode);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 NativeM
 odules={};var Document=void 0;var Element=void 0;var Comment=void 0;var Listener=void 0;var sendTasks=void 0;var instances={};var _global=global;var WXEnvironment=_global.WXEnvironment;function getInstance(instanceId){var instance=instances[instanceId];if(!instance){throw new Error('Invalid instance id "'+instanceId+'"')}return instance}function init(cfg){Document=cfg.Document;Element=cfg.Element;Comment=cfg.Comment;Listener=cfg.Listener;sendTasks=cfg.sendTasks}function registerComponents(components){if(Array.isArray(components)){components.forEach(function register(name){if(!name){return}if(typeof name==="string"){NativeComponents[name]=true}else if((typeof name==="undefined"?"undefined":_typeof(name))==="object"&&typeof name.type==="string"){NativeComponents[name.type]=name}})}}function registerMethods(apis){if((typeof apis==="undefined"?"undefined":_typeof(apis))==="object"){}}function registerModules(newModules){if((typeof newModules==="undefined"?"undefined":_typeof(newModules)
 )==="object"){for(var name in newModules){if(Object.prototype.hasOwnProperty.call(newModules,name)){NativeModules[name]=newModules[name]}}}}function genNativeModules(instanceId){var prefix="@weex-module/";var modules={};if((typeof NativeModules==="undefined"?"undefined":_typeof(NativeModules))==="object"){var _loop=function _loop(name){var moduleName=prefix+name;modules[moduleName]={module:{exports:{}},isInitialized:true};NativeModules[name].forEach(function(method){if(typeof method==="string"){method={name:method}}var methodName=method.name;modules[moduleName].module.exports[methodName]=function(){for(var _len=arguments.length,args=Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}var finalArgs=[];args.forEach(function(arg,index){var value=args[index];finalArgs[index]=normalize(value,getInstance(instanceId))});sendTasks(String(instanceId),[{module:name,method:methodName,args:finalArgs}])}})};for(var name in NativeModules){_loop(name)}}return modules}function createIns
 tance(instanceId,code,options,data){var instance=instances[instanceId];if(instance==undefined){(function(){
-var def=function def(id,deps,factory){if(deps instanceof Function){factory=deps;deps=[]}modules[id]={factory:factory,deps:deps,module:{exports:{}},isInitialized:false,hasError:false}};var req=function req(id){var mod=modules[id];if(mod&&mod.isInitialized){return mod.module.exports}if(!mod){throw new Error('Requiring unknown module "'+id+'"')}if(mod.hasError){throw new Error('Requiring module "'+id+'" which threw an exception')}try{mod.isInitialized=true;mod.factory(req,mod.module.exports,mod.module)}catch(e){mod.hasError=true;mod.isInitialized=false;throw e}return mod.module.exports};var document=new Document(instanceId,options.bundleUrl,null,Listener);var modules=genNativeModules(instanceId);instance=instances[instanceId]={document:document,instanceId:instanceId,modules:modules,callbacks:[],uid:0};var timerAPIs=void 0;if(WXEnvironment&&WXEnvironment.platform!=="Web"){(function(){var timer=req("@weex-module/timer");timerAPIs={setTimeout:function setTimeout(){for(var _len2=arguments.
 length,args=Array(_len2),_key2=0;_key2<_len2;_key2++){args[_key2]=arguments[_key2]}var handler=function handler(){args[0].apply(args,_toConsumableArray(args.slice(2)))};timer.setTimeout(handler,args[1]);return instance.uid.toString()},setInterval:function setInterval(){for(var _len3=arguments.length,args=Array(_len3),_key3=0;_key3<_len3;_key3++){args[_key3]=arguments[_key3]}var handler=function handler(){args[0].apply(args,_toConsumableArray(args.slice(2)))};timer.setInterval(handler,args[1]);return instance.uid.toString()},clearTimeout:function clearTimeout(n){timer.clearTimeout(n)},clearInterval:function clearInterval(n){timer.clearInterval(n)}}})()}else{timerAPIs={setTimeout:setTimeout,setInterval:setInterval,clearTimeout:clearTimeout,clearInterval:clearInterval}}var init=new Function("define","require","__d","__r","__DEV__","__weex_options__","__weex_data__","__weex_document__","document","setTimeout","clearTimeout","setInterval","clearInterval","global",'"use strict";'+_builtin
 ModulesCode2.default+code);init(def,req,def,req,options.debug,options,data,document,document,timerAPIs.setTimeout,timerAPIs.clearTimeout,timerAPIs.setInterval,timerAPIs.clearInterval,global)})()}else{throw new Error('Instance id "'+instanceId+'" existed when create instance')}}function refreshInstance(instanceId,data){var instance=getInstance(instanceId);var document=instance.document;document.documentElement.fireEvent("refresh",{timestamp:Date.now(),data:data});document.listener.refreshFinish()}function destroyInstance(instanceId){var instance=getInstance(instanceId);var document=instance.document;document.documentElement.fireEvent("destory",{timestamp:Date.now()});if(document.destroy){document.destroy()}delete instances[instanceId]}function getRoot(instanceId){var instance=getInstance(instanceId);var document=instance.document;return document.toJSON?document.toJSON():{}}function fireEvent(doc,ref,type,e,domChanges){if(Array.isArray(ref)){ref.some(function(ref){return fireEvent(doc
 ,ref,type,e)!==false});return}var el=doc.getRef(ref);if(el){var result=doc.fireEvent(el,type,e,domChanges);doc.listener.updateFinish();return result}return new Error('Invalid element reference "'+ref+'"')}function handleCallback(doc,callbacks,callbackId,data,ifKeepAlive){var callback=callbacks[callbackId];if(typeof callback==="function"){callback(data);if(typeof ifKeepAlive==="undefined"||ifKeepAlive===false){callbacks[callbackId]=null}doc.listener.updateFinish();return}return new Error('Invalid callback id "'+callbackId+'"')}function receiveTasks(instanceId,tasks){var instance=getInstance(instanceId);if(Array.isArray(tasks)){var _ret4=function(){var callbacks=instance.callbacks;var document=instance.document;var results=[];tasks.forEach(function(task){var result=void 0;if(task.method==="fireEvent"){var _task$args=_slicedToArray(task.args,4);var nodeId=_task$args[0];var type=_task$args[1];var data=_task$args[2];var domChanges=_task$args[3];result=fireEvent(document,nodeId,type,data,
 domChanges)}else if(task.method==="callback"){var _task$args2=_slicedToArray(task.args,3);var uid=_task$args2[0];var _data=_task$args2[1];var ifKeepAlive=_task$args2[2];result=handleCallback(document,callbacks,uid,_data,ifKeepAlive)}results.push(result)});return{v:results}}();if((typeof _ret4==="undefined"?"undefined":_typeof(_ret4))==="object")return _ret4.v}}function normalize(v,instance){var type=typof(v);switch(type){case"undefined":case"null":return"";case"regexp":return v.toString();case"date":return v.toISOString();case"number":case"string":case"boolean":case"array":case"object":if(v instanceof Element){return v.ref}return v;case"function":instance.callbacks[++instance.uid]=v;return instance.uid.toString();default:return JSON.stringify(v)}}function typof(v){var s=Object.prototype.toString.call(v);return s.substring(8,s.length-1).toLowerCase()}}).call(exports,function(){return this}())},function(module,exports){"use strict";module.exports='define("kg/rx/index",[],function(e,t,
 n){var r,o,u,i,l,a,f,d,c,s,p,v,y,h,m,_,b,g,C,w,O,x,E,j,N,P,k,S,M,A,I,T,R;r=function(e){e={},Object.defineProperty(e,"__esModule",{value:!0});var t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e};return e["default"]={component:null,driver:null,document:"object"===("undefined"==typeof document?"undefined":t(document))?document:{},mountID:1,scheduler:function(e){return e()},roots:{}},e=e["default"]}(),o=function(e){e={},Object.defineProperty(e,"__esModule",{value:!0});var t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e};e.isWeex="function"==typeof callNative,e.isWeb="object"===("undefined"==typeof window?"undefined":t(window))&&"object"===t(window.document)&&"object"===("undefined"==typeof navigator?"undefined":t(navigator))&
 &"string"==typeof navigator.userAgent;return e}(),u=function(e){"use strict";return Array.from||(Array.from=function(){var e=Object.prototype.toString,t=function(t){return"function"==typeof t||"[object Function]"===e.call(t)},n=function(e){var t=Number(e);return isNaN(t)?0:0!==t&&isFinite(t)?(t>0?1:-1)*Math.floor(Math.abs(t)):t},r=Math.pow(2,53)-1,o=function(e){var t=n(e);return Math.min(Math.max(t,0),r)};return function(e){var n=this,r=Object(e);if(null==e)throw new TypeError("Array.from requires an array-like object - not null or undefined");var u,i=arguments.length>1?arguments[1]:void 0;if("undefined"!=typeof i){if(!t(i))throw new TypeError("Array.from: when provided, the second argument must be a function");arguments.length>2&&(u=arguments[2])}for(var l,a=o(r.length),f=t(n)?Object(new n(a)):new Array(a),d=0;d<a;)l=r[d],i?f[d]="undefined"==typeof u?i(l,d):i.call(u,l,d):f[d]=l,d+=1;return f.length=a,f}}()),e}(),i=function(e){"use strict";Object.assign||(Object.assign=function(e,t)
 {for(var n=1;n<arguments.length;n++){var r=arguments[n];if(null!=r)for(var o in r)e[o]=r[o]}return e});var t=Object.prototype.hasOwnProperty;return Object.entries||(Object.entries=function(e){if(null==e)throw new TypeError("Object.entries called on non-object");var n=[];for(var r in e)t.call(e,r)&&n.push([r,e[r]]);return n}),Object.values||(Object.values=function(e){if(null==e)throw new TypeError("Object.values called on non-object");var n=[];for(var r in e)t.call(e,r)&&n.push(e[r]);return n}),Object.defineProperties||(Object.defineProperties=function(e,t){for(var n in t)Object.defineProperty(e,n,t[n]);return e}),Object.setPrototypeOf||(Object.setPrototypeOf=function(e,t){function n(e,t){return r.call(e,t),e}var r;try{r=e.getOwnPropertyDescriptor(e.prototype,t).set,r.call({},null)}catch(o){if(e.prototype!=={}[t]||void 0==={__proto__:null}.__proto__)return;r=function(e){this[t]=e},n.polyfill=n(n({},null),e.prototype)instanceof e}return n}(Object,"__proto__")),Object.is||(Object.is=fu
 nction(e,t){return e===t?0!==e||1/e===1/t:e!==e&&t!==t}),e}(),l=function(e){function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}e={},Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),r=function(){function e(n,r,o){t(this,e),this.props=n,this.context=r,this.refs={},this.updater=o}return n(e,[{key:"isComponentClass",value:function(){}},{key:"setState",value:function(e,t){this.updater.setState(this,e,t)}},{key:"forceUpdate",value:function(e){this.updater.forceUpdate(this,e)}}]),e}();return e["default"]=r,e=e["default"]}(),a=function(e){function t(e){return e&&e.__esModule?e:{"default":e}}function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e
 )throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}e={},Object.defineProperty(e,"__esModule",{value:!0});var u=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=l,a=t(i),f=function(e){function t(e,o){return n(this,t),r(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,o))}return o(t,e),u(t,[{key:"isPureComponentClass",value:function(){}}]),t}(a["default"]);return e["default"]=f,e=e["d
 efault"]}(),f=function(e){function t(e){function t(e,t,n,r,o,u){}var n=t.bind(null,!1);return n.isRequired=t.bind(null,!0),n}function n(e){function n(e,t,n,r,o){}return t(n)}e={},Object.defineProperty(e,"__esModule",{value:!0});var r=n();return e["default"]={array:r,bool:r,func:r,number:r,object:r,string:r,symbol:r,element:r,node:r,any:r,arrayOf:r,instanceOf:r,objectOf:r,oneOf:r,oneOfType:r,shape:r},e=e["default"]}(),d=function(e){function t(e){return e&&e.__esModule?e:{"default":e}}function n(e){var t=void 0;if(void 0===e||null===e||e===!1||e===!0)t=new i["default"].EmptyComponent;else if("object"===("undefined"==typeof e?"undefined":o(e))&&e.type)t="string"==typeof e.type?new i["default"].NativeComponent(e):new i["default"].CompositeComponent(e);else{if("string"!=typeof e&&"number"!=typeof e)throw Error("Invalid element type "+JSON.stringify(e));t=new i["default"].TextComponent(e)}return t._mountIndex=0,t}e={},Object.defineProperty(e,"__esModule",{value:!0});var o="function"==type
 of Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e},u=r,i=t(u);return e["default"]=n,e=e["default"]}(),c=function(e){function t(e,t){var r=null===e,o=null===t;if(r||o)return r===o;var u="undefined"==typeof e?"undefined":n(e),i="undefined"==typeof t?"undefined":n(t);return"string"===u||"number"===u?"string"===i||"number"===i:"object"===u&&"object"===i&&e.type===t.type&&e.key===t.key}e={},Object.defineProperty(e,"__esModule",{value:!0});var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e};return e["default"]=t,e=e["default"]}(),s=function(e){function t(e){return e&&e.__esModule?e:{"default":e}}function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}e={},Object.defineProperty(e,"__esModule",{value:!0});var o
 =function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=r,i=t(u),l=function(){function e(){n(this,e),this._currentElement=null}return o(e,[{key:"mountComponent",value:function(e,t,n){this._parent=e,this._context=t;var r={_internal:this},o=this.getNativeNode();return n?n(o,e):i["default"].driver.appendChild(o,e),r}},{key:"unmountComponent",value:function(e){this._nativeNode&&!e&&i["default"].driver.removeChild(this._nativeNode,this._parent),this._nativeNode=null,this._parent=null,this._context=null}},{key:"updateComponent",value:function(){}},{key:"getNativeNode",value:function(){return null==this._nativeNode&&(this._nativeNode=i["default"].driver.createEmpty()),this._nativeNode}}]),e}();return e["default"]=l,e=e["default"]}(),p=function(e){return e={},Object.defineProperty(e,"__esModule",{value:!
 0}),e["default"]={update:function(e,t,n){var r=null!=e&&e.ref,o=null!=t&&t.ref;r!==o&&(null!=r&&this.detach(e._owner,r,n),null!=o&&this.attach(t._owner,o,n))},attach:function(e,t,n){if(!e)throw new Error("You might be adding a ref to a component that was not created inside a component\'s `render` method, or you have multiple copies of Rx loaded.");var r=n.getPublicInstance();"function"==typeof t?t(r):e._instance.refs[t]=r},detach:function(e,t,n){if("function"==typeof t)t(null);else{var r=n.getPublicInstance();e._instance.refs[t]===r&&delete e._instance.refs[t]}}},e=e["default"]}(),v=function(e){function t(e){return e&&e.__esModule?e:{"default":e}}e={},Object.defineProperty(e,"__esModule",{value:!0});var n=r,o=t(n),u="$$instance";return e["default"]={set:function(e,t){e[u]||(e[u]=t,t.rootID&&(o["default"].roots[t.rootID]=t))},get:function(e){return e[u]},remove:function(e){var t=this.get(e);t&&(e[u]=null,t.rootID&&delete o["default"].roots[t.rootID])}},e=e["default"]}(),y=function(e)
 {function t(e){return e&&e.__esModule?e:{"default":e}}function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}e={},Object.defineProperty(e,"__esModule",{value:!0});var o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=r,i=t(u),l=function(){function e(t){n(this,e),this._currentElement=t,this._text=""+t}return o(e,[{key:"mountComponent",value:function(e,t,n){this._parent=e,this._context=t,this._mountID=i["default"].mountID++;var r=this.getNativeNode();n?n(r,e):i["default"].driver.appendChild(r,e);var o={_internal:this};return o}},{key:"unmountComponent",value:function(e){this._nativeNode&&!e&&i["default"].driver.removeChild(this._nativeNode,this._parent),this._currentElement=null,this._nativeNode=null,this._parent=null,this._context=null,this._text=null}
 },{key:"updateComponent",value:function(e,t,n){this._currentElement=t,i["default"].driver.updateText(this.getNativeNode(),t)}},{key:"getNativeNode",value:function(){return null==this._nativeNode&&(this._nativeNode=i["default"].driver.createText(this._text)),this._nativeNode}}]),e}();return e["default"]=l,e=e["default"]}(),h=function(e){function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}e={},Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),r=function(){function e(n){t(this,e),this.pureRender=n}return n(e,[{key:"render",value:function(){return this.pureRender(this.props,this.context)}}]),e}();return e["default"]=r,e=e["default"]}(),m=function(e){function t(e){return e&&e.__esModule?e:{"default":e}}
 function n(e,t){if(t){var n=e._pendingCallbacks||(e._pendingCallbacks=[]);n.push(t)}}function o(e,t){if(t){var n=e._pendingStateQueue||(e._pendingStateQueue=[]);n.push(t)}}e={},Object.defineProperty(e,"__esModule",{value:!0});var u=r,i=t(u),l=[],a={setState:function(e,t,r){var u=e._internal;u&&(o(u,t),n(u,r),l.push(e),i["default"].scheduler(this.runUpdates))},forceUpdate:function(e,t){var r=e._internal;r&&(r._pendingForceUpdate=!0,n(r,t),l.push(e),i["default"].scheduler(this.runUpdates))},runUpdates:function(){l.sort(function(e,t){return e._mountID-t._mountID});for(var e=void 0;e=l.shift();){var t=e._internal;if(t&&t._renderedComponent){var n=t._pendingCallbacks;t._pendingCallbacks=null;var r=t._currentElement,o=t._context;(t._pendingStateQueue||t._pendingForceUpdate)&&t.updateComponent(r,r,o,o),n&&n.forEach(function(e){return e()})}}}};return e["default"]=a,e=e["default"]}(),_=function(e){function t(e,t){return e===t?0!==e||1/e===1/t:e!==e&&t!==t}function n(e,n){if(t(e,n))return!0;
 if("object"!==("undefined"==typeof e?"undefined":r(e))||null===e||"object"!==("undefined"==typeof n?"undefined":r(n))||null===n)return!1;var u=Object.keys(e),i=Object.keys(n);if(u.length!==i.length)return!1;for(var l=0;l<u.length;l++)if(!o.call(n,u[l])||!t(e[u[l]],n[u[l]]))return!1;return!0}e={},Object.defineProperty(e,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e},o=Object.prototype.hasOwnProperty;return e["default"]=n,e=e["default"]}(),b=function(e){function t(e){return e&&e.__esModule?e:{"default":e}}function n(e){var t=o["default"].get(e);return!!t&&(o["default"].remove(e),t._internal.unmountComponent(),!0)}e={},Object.defineProperty(e,"__esModule",{value:!0}),e["default"]=n;var r=v,o=t(r);return e=e["default"]}(),g=function(e){function t(e){return e&&e.__esModule?e:{"default":e}}function n(e,t){if(!(e instanceof t))t
 hrow new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}e={},Object.defineProperty(e,"__esModule",{value:!0});var u=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=l,a=t(i),f=1,d=function(e){function t(){var e,o,u,i;n(this,t);for(var l=arguments.length,a=Array(l),d=0;d<l;d++)a[d]=arguments[d];return o=u=r(this,(e=t.__p
 roto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(a))),u.rootID=f++,i=o,r(u,i)}return o(t,e),u(t,[{key:"isRootComponent",value:function(){}},{key:"render",value:function(){return this.props.children}},{key:"getPublicInstance",value:function(){return this.getRenderedComponent().getPublicInstance()}},{key:"getRenderedComponent",value:function(){return this._internal._renderedComponent}}]),t}(a["default"]);return e["default"]=d,e=e["default"]}(),C=function(e){function t(e){return e&&e.__esModule?e:{"default":e}}function n(e){if(null==e)return null;if(e.ownerDocument||e.nodeType)return e;if(e._nativeNode)return e._nativeNode;if("string"==typeof e)return u["default"].driver.getElementById(e);if("function"!=typeof e.render)throw new Error("Appears to be neither Component nor DOMNode.");var t=e._internal;if(t){for(;!t._nativeNode;)if(t=t._renderedComponent,null==t)return null;return t._nativeNode}throw new Error("findDOMNode was called on an unmounted component.")}e={},Object.de
 fineProperty(e,"__esModule",{value:!0});var o=r,u=t(o);return e["default"]=n,e=e["default"]}(),w=function(e){function t(e){return"string"==typeof e&&e.indexOf(a)!==-1}function n(e){var t=arguments.length<=1||void 0===arguments[1]?d:arguments[1];return e.replace(f,function(e){return parseFloat(e)*t+"px"})}function r(){return d}function o(e){d=e}function u(e,t){return"number"==typeof e&&!l[t]}function i(e,r){return r&&u(e,r)?e*d+"px":t(e)?n(e):e}e={},Object.defineProperty(e,"__esModule",{value:!0}),e.isRem=t,e.calcRem=n,e.getRem=r,e.setRem=o,e.isUnitNumber=u,e.convertUnit=i;var l={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridRow:!0,gridColumn:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,lines:!0},a="rem",f=/[-+]?\\d*\\.?\\d+rem/g,d=v
 oid 0;return e}(),O=function(e){e={},Object.defineProperty(e,"__esModule",{value:!0});var t={stretch:"stretch","flex-start":"start","flex-end":"end",center:"center"},n={row:"horizontal",column:"vertical"},r={"flex-start":"start","flex-end":"end",center:"center","space-between":"justify","space-around":"justify"},o={display:!0,flex:!0,alignItems:!0,alignSelf:!0,flexDirection:!0,justifyContent:!0,flexWrap:!0},u={isFlexProp:function(e){return o[e]},display:function(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];return"flex"===e?(t.display="-webkit-box",t.display="-webkit-flex",t.display="flex"):t.display=e,t},flex:function(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];return t.webkitBoxFlex=e,t.webkitFlex=e,t.flex=e,t},flexWrap:function(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];return t.flexWrap=e,t},alignItems:function(e){var n=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];return n.webkitBoxAlign=t[e],n.
 webkitAlignItems=e,n.alignItems=e,n},alignSelf:function(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];return t.webkitAlignSelf=e,t.alignSelf=e,t},flexDirection:function(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];return t.webkitBoxOrient=n[e],t.webkitFlexDirection=e,t.flexDirection=e,t},justifyContent:function(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];return t.webkitBoxPack=r[e],t.webkitJustifyContent=e,t.justifyContent=e,t}};return e["default"]=u,e=e["default"]}(),x=function(e){function t(e){return e&&e.__esModule?e:{"default":e}}function n(e){return null==e?null:o["default"].get(e)}e={},Object.defineProperty(e,"__esModule",{value:!0});var r=v,o=t(r);return e["default"]=n,e=e["default"]}(),E=function(e){return e={},Object.defineProperty(e,"__esModule",{value:!0}),e["default"]="0.1.21",e=e["default"]}(),j=function(e){function t(e){return e&&e.__esModule?e:{"default":e}}function n(e,t){if(Array.isArray(e))for(var
  r=0,o=e.length;r<o;r++)n(e[r],t);else t.push(e)}function u(e){if(null==e)return e;var t=[];return n(e,t),1===t.length&&(t=t[0]),t}function i(e){if(e){if(Array.isArray(e)){for(var t={},n=0;n<e.length;++n){var r=i(e[n]);if(r)for(var o in r)t[o]=r[o]}return t}return e}}function l(e,t){if(y.isWeex&&"text"===e){var n=t.children;n&&(Array.isArray(n)&&(n=n.join("")),t.children=null,t.value=n)}return t}function a(e,t){if(null==e)throw Error("Component type is null");var n={},r=void 0,o=null,l=null;if(null!=t){l=void 0===t.ref?null:t.ref,o=void 0===t.key?null:String(t.key);for(r in t)t.hasOwnProperty(r)&&!h.hasOwnProperty(r)&&(n[r]=t[r])}for(var a=arguments.length,f=Array(a>2?a-2:0),d=2;d<a;d++)f[d-2]=arguments[d];if(f.length&&(n.children=u(f)),e&&e.defaultProps){var c=e.defaultProps;for(r in c)void 0===n[r]&&(n[r]=c[r])}return n.style&&(Array.isArray(n.style)||"object"===s(n.style))&&(n.style=i(n.style)),new m(e,o,l,n,v["default"].component)}function f(e){var t=a.bind(null,e);return t.type
 =e,t}function d(e,t){var n=Object.assign({},e.props),r=e.key,o=e.ref,i=e._owner;if(t){void 0!==t.ref&&(o=t.ref,i=v["default"].component),void 0!==t.key&&(r=String(t.key));var l=void 0;e.type&&e.type.defaultProps&&(l=e.type.defaultProps);var a=void 0;for(a in t)t.hasOwnProperty(a)&&!h.hasOwnProperty(a)&&(void 0===t[a]&&void 0!==l?n[a]=l[a]:n[a]=t[a])}for(var f=arguments.length,d=Array(f>2?f-2:0),c=2;c<f;c++)d[c-2]=arguments[c];return d.length&&(n.children=u(d)),new m(e.type,r,o,n,i)}function c(e){return"object"===("undefined"==typeof e?"undefined":s(e))&&null!==e&&e.type&&e.props}e={},Object.defineProperty(e,"__esModule",{value:!0});var s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e};e.createElement=a,e.createFactory=f,e.cloneElement=d,e.isValidElement=c;var p=r,v=t(p),y=o,h={key:!0,ref:!0},m=function(e,t,n,r,o){return r=l(e,r),{type:e,key:t,ref:n,prop
 s:r,_owner:o}};return e["default"]=m,e}(),N=function(e){function t(e){return e&&e.__esModule?e:{"default":e}}function n(e,t){if(!(e in

<TRUNCATED>