You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by so...@apache.org on 2017/04/13 02:31:55 UTC

[01/23] incubator-weex git commit: * [html5] change viewport adapter, add unit tests for new adapting methods.

Repository: incubator-weex
Updated Branches:
  refs/heads/0.12-dev 3806842c0 -> 8c90235c2


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/test/render/vue/utils/style.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/utils/style.js b/html5/test/render/vue/utils/style.js
new file mode 100644
index 0000000..af0d71a
--- /dev/null
+++ b/html5/test/render/vue/utils/style.js
@@ -0,0 +1,68 @@
+import {
+  autoPrefix,
+  normalizeStyle,
+  normalizeString,
+  normalizeNumber,
+  normalizeUnitsNum
+} from '../../../../render/vue/utils/style'
+import { init, resetViewport } from '../../../../render/vue/env/viewport'
+
+describe('style', function () {
+  const rect = document.documentElement.getBoundingClientRect()
+  const info = {}
+  const { scale, dpr } = init()
+
+  it('should normalize units numbers', function () {
+    expect(normalizeUnitsNum('100px')).to.equal(100 * scale + 'px')
+    expect(normalizeUnitsNum('100')).to.equal(100 * scale + 'px')
+    expect(normalizeUnitsNum('100wx')).to.equal(100 * scale * dpr + 'px')
+    expect(normalizeUnitsNum('20wm')).to.equal('')
+  })
+
+  it('should normalize number style vals', function () {
+    expect(normalizeNumber('width', 10)).to.equal(10 * scale + 'px')
+    expect(normalizeNumber('width', 1.2)).to.equal(1.2 * scale + 'px')
+  })
+
+  it('should normalize string style vals', function () {
+    expect(normalizeString('width', '100%')).to.equal('100%')
+    expect(normalizeString('transform', 'translate3d(10px, 10px, 10px)'))
+      .to.equal(`translate3d(${10 * scale}px, ${10 * scale}px, ${10 * scale}px)`)
+    expect(normalizeString('border-bottom', '4px solid #112233'))
+      .to.equal(`${4 * scale}px solid #112233`)
+    expect(normalizeString('border-left', '4wx dotted red'))
+      .to.equal(`${4 * scale * dpr}px dotted red`)
+  })
+
+  it('should normalize style object', function () {
+    //
+  })
+})
+
+describe('autoPrefix', function () {
+  const style = {
+    width: '200px',
+    flexDirection: 'row',
+    transform: 'translate3d(100px, 100px, 0)'
+  }
+
+  it('should add prefix for styles.', function () {
+    const res = autoPrefix(style)
+    const {
+      WebkitBoxDirection,
+      WebkitBoxOrient,
+      WebkitFlexDirection,
+      flexDirection,
+      WebkitTransform,
+      transform,
+      width
+    } = res
+    expect(WebkitBoxDirection).to.equal('normal')
+    expect(WebkitBoxOrient).to.equal('horizontal')
+    expect(WebkitFlexDirection).to.equal('row')
+    expect(flexDirection).to.equal('row')
+    expect(WebkitTransform).to.equal('translate3d(100px, 100px, 0)')
+    expect(transform).to.equal('translate3d(100px, 100px, 0)')
+    expect(width).to.equal('200px')
+  })
+})
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/package.json
----------------------------------------------------------------------
diff --git a/package.json b/package.json
index 10a720e..c60d18b 100644
--- a/package.json
+++ b/package.json
@@ -62,7 +62,7 @@
     "lint": "eslint html5",
     "flow": "flow check",
     "test:case": "mocha --require reify html5/test/case/tester.js",
-    "test:vue": "karma start build/karma.vue.conf.js",
+    "test:vue": "webpack --config build/webpack.test.web.config.js && karma start build/karma.vue.conf.js",
     "test:unit": "mocha --require reify html5/test/unit/*/*.js html5/test/unit/*/*/*.js",
     "test": "npm run lint && npm run test:unit && npm run test:case && npm run test:vue",
     "test:cover-html": "babel-istanbul cover --report html node_modules/mocha/bin/_mocha -- --require reify --reporter dot html5/test/unit/*/*.js html5/test/unit/*/*/*.js && open coverage/index.html",

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/vue.html
----------------------------------------------------------------------
diff --git a/vue.html b/vue.html
index bb68764..5e931dd 100644
--- a/vue.html
+++ b/vue.html
@@ -45,12 +45,13 @@
     }
   </style>
 
-  <script src="./node_modules/vue/dist/vue.runtime.min.js"></script>
+  <!-- <script src="./node_modules/vue/dist/vue.runtime.min.js"></script> -->
   <!-- <script src="./node_modules/vue/dist/vue.runtime.js"></script> -->
-  <!-- <script src="dist/vue.runtime.js"></script> -->
+  <script src="dist/vue.runtime.js"></script>
   <!-- <script src="./node_modules/weex-vue-render/index.min.js"></script> -->
-  <!-- <script src="./packages/weex-vue-render/dist/index.js"></script> -->
-  <script src="./packages/weex-vue-render/dist/index.min.js"></script>
+  <script src="./packages/weex-vue-render/dist/index.js"></script>
+  <!-- <script src="//unpkg.com/weex-vue-render@0.11.2/dist/index.js"></script> -->
+  <!-- <script src="./packages/weex-vue-render/dist/index.min.js"></script> -->
 </head>
 <body>
   <div id="root"></div>


[21/23] incubator-weex git commit: Merge branch 'android-feature-picker-improvement' of github.com:misakuo/incubator-weex into 0.12-dev

Posted by so...@apache.org.
Merge branch 'android-feature-picker-improvement' of github.com:misakuo/incubator-weex into 0.12-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/102e37dc
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/102e37dc
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/102e37dc

Branch: refs/heads/0.12-dev
Commit: 102e37dcde3dbed5cf101dea6db4b618edd6b981
Parents: f5fa773 e0a0c72
Author: sospartan <so...@apache.org>
Authored: Thu Apr 13 10:19:03 2017 +0800
Committer: sospartan <so...@apache.org>
Committed: Thu Apr 13 10:19:03 2017 +0800

----------------------------------------------------------------------
 .../main/java/com/taobao/weex/appfram/pickers/WXPickersModule.java | 2 ++
 1 file changed, 2 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/102e37dc/android/sdk/src/main/java/com/taobao/weex/appfram/pickers/WXPickersModule.java
----------------------------------------------------------------------


[08/23] incubator-weex git commit: * [html5] bugfix.

Posted by so...@apache.org.
* [html5] bugfix.


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

Branch: refs/heads/0.12-dev
Commit: e8ab26991893f1dc0c212176737fdda434466491
Parents: 40f600e
Author: MrRaindrop <te...@gmail.com>
Authored: Thu Apr 6 18:45:08 2017 +0800
Committer: MrRaindrop <te...@gmail.com>
Committed: Thu Apr 6 18:45:08 2017 +0800

----------------------------------------------------------------------
 NOTICE                                | 6 ++++--
 html5/render/vue/core/style.js        | 7 +++++--
 package.json                          | 2 +-
 packages/weex-vue-render/package.json | 2 +-
 4 files changed, 11 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/e8ab2699/NOTICE
----------------------------------------------------------------------
diff --git a/NOTICE b/NOTICE
index c4d3e93..147a854 100644
--- a/NOTICE
+++ b/NOTICE
@@ -12,5 +12,7 @@ by Denis Pushkarev , licensed under the MIT License.
 This product contains software vuejs(https://github.com/vuejs/vue) developed
 by Yuxi Evan You , licensed under the MIT License.
 
-This product contains software (https://github.com/component/scroll-to) developed
-by TooTallNate , licensed under the MIT License.
\ No newline at end of file
+This product contains software scroll-to (https://github.com/component/scroll-to) developed
+by TooTallNate , licensed under the MIT License.
+
+This product contains software inline-style-prefixer (https://github.com/rofrischmann/inline-style-prefixer) developed by rofrischmann , licensed under the MIT License.

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/e8ab2699/html5/render/vue/core/style.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/core/style.js b/html5/render/vue/core/style.js
index 45a4103..09357cf 100644
--- a/html5/render/vue/core/style.js
+++ b/html5/render/vue/core/style.js
@@ -16,6 +16,7 @@ export function getHeadStyleMap () {
   if (process.env.NODE_ENV === 'development') {
     tagBegin('getHeadStyleMap')
   }
+  const needToRemoveStyleSheetNodes = []
   const res = Array.from(document.styleSheets || [])
     .reduce((pre, styleSheet) => {
       // why not using styleSheet.rules || styleSheet.cssRules to get css rules ?
@@ -73,10 +74,12 @@ export function getHeadStyleMap () {
        * should only be fetched and used from styleMap to generate the final combined
        * component style, not from the stylesheet itself.
        */
-      const node = styleSheet.ownerNode
-      node.parentNode.removeChild(node)
+      needToRemoveStyleSheetNodes.push(styleSheet.ownerNode)
       return pre
     }, {})
+  needToRemoveStyleSheetNodes.forEach(function (node) {
+    node.parentNode.removeChild(node)
+  })
   if (process.env.NODE_ENV === 'development') {
     tagEnd('getHeadStyleMap')
   }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/e8ab2699/package.json
----------------------------------------------------------------------
diff --git a/package.json b/package.json
index 69aecaf..d5736c7 100644
--- a/package.json
+++ b/package.json
@@ -4,7 +4,7 @@
   "subversion": {
     "browser": "0.5.0",
     "framework": "0.19.17",
-    "vue-render": "0.11.3",
+    "vue-render": "0.11.4",
     "transformer": ">=0.1.5 <0.5"
   },
   "description": "A framework for building Mobile cross-platform UI",

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/e8ab2699/packages/weex-vue-render/package.json
----------------------------------------------------------------------
diff --git a/packages/weex-vue-render/package.json b/packages/weex-vue-render/package.json
index 48f8d95..81ddff0 100644
--- a/packages/weex-vue-render/package.json
+++ b/packages/weex-vue-render/package.json
@@ -1,6 +1,6 @@
 {
   "name": "weex-vue-render",
-  "version": "0.11.3",
+  "version": "0.11.4",
   "description": "Weex built-in components for Vue 2.x.",
   "license": "Apache-2.0",
   "main": "src/render/vue/index.js",


[18/23] incubator-weex git commit: Merge branch '0.11-dev' of https://github.com/MrRaindrop/incubator-weex into 0.11-dev

Posted by so...@apache.org.
Merge branch '0.11-dev' of https://github.com/MrRaindrop/incubator-weex into 0.11-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/bbb120d8
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/bbb120d8
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/bbb120d8

Branch: refs/heads/0.12-dev
Commit: bbb120d83a795e0f22735bc38b9d59152ae0bd35
Parents: 8174a3f d442601
Author: matianyi <za...@zaoxian.local>
Authored: Wed Apr 12 16:27:07 2017 +0800
Committer: matianyi <za...@zaoxian.local>
Committed: Wed Apr 12 16:27:07 2017 +0800

----------------------------------------------------------------------
 .eslintignore                                   |   1 +
 .gitignore                                      |   2 +-
 NOTICE                                          |   8 +-
 build/karma.vue.conf.js                         |   7 +-
 build/webpack.examples.web.config.js            |  31 +-
 build/webpack.test.web.config.js                |  81 +++
 examples/vue/showcase/itemlist.vue              |  11 +-
 examples/vue/style/index.vue                    |   2 +-
 .../npm/karma-rollup-preprocessor_vx.x.x.js     |  53 ++
 flow-typed/npm/karma-sinon-chai_vx.x.x.js       |  38 ++
 html5/render/vue/README.md                      |  24 +-
 html5/render/vue/components/a.js                |  17 +-
 html5/render/vue/components/div.js              |  17 +-
 html5/render/vue/components/image.js            |  25 +-
 html5/render/vue/components/input.js            |  18 +-
 .../render/vue/components/scrollable/header.js  |   6 +-
 .../vue/components/scrollable/list/cell.js      |   6 +-
 .../vue/components/scrollable/list/index.js     |   6 +-
 .../vue/components/scrollable/list/style.js     |  16 +
 .../components/scrollable/loading-indicator.js  |  43 +-
 .../render/vue/components/scrollable/loading.js |   6 +-
 .../render/vue/components/scrollable/refresh.js |   6 +-
 .../vue/components/scrollable/scroller.js       |   8 +-
 html5/render/vue/components/slider/index.js     |  36 +-
 html5/render/vue/components/slider/indicator.js |  58 +-
 html5/render/vue/components/switch.js           |  66 ++-
 html5/render/vue/components/text.js             |  27 +-
 html5/render/vue/components/textarea.js         |  19 +-
 html5/render/vue/components/video.js            |   6 +-
 html5/render/vue/components/web.js              |  19 +-
 html5/render/vue/core/index.js                  |   2 +
 html5/render/vue/core/node.js                   |  28 +
 html5/render/vue/core/style.js                  | 212 ++++++++
 html5/render/vue/env/global.js                  |  11 +
 html5/render/vue/env/index.js                   |  11 +-
 html5/render/vue/env/viewport.js                | 162 ++++--
 html5/render/vue/env/weex.js                    |   9 +-
 html5/render/vue/env/wx-env.js                  |  80 +--
 html5/render/vue/index.js                       |  13 +-
 html5/render/vue/mixins/base.js                 |  43 --
 html5/render/vue/mixins/style.js                | 142 +----
 html5/render/vue/modules/animation.js           |   7 +-
 html5/render/vue/modules/dom.js                 |   5 +-
 html5/render/vue/modules/index.js               |   2 +-
 html5/render/vue/modules/modal/index.js         |  10 +-
 html5/render/vue/modules/modal/style.js         | 146 ++++++
 html5/render/vue/styles/base.css                | 194 +++++++
 html5/render/vue/styles/components.css          | 513 ------------------
 html5/render/vue/utils/index.js                 |  36 +-
 html5/render/vue/utils/style.js                 | 110 ++++
 html5/test/render/vue/components/image.js       |   4 +-
 html5/test/render/vue/components/switch.js      |   4 -
 html5/test/render/vue/components/text.js        |   4 -
 html5/test/render/vue/components/web.js         |   4 -
 html5/test/render/vue/core/scope-style-map.js   |  76 +++
 html5/test/render/vue/core/style.js             |  65 +++
 .../vue/data/build/dotvue/scoped-style.js       | 525 +++++++++++++++++++
 html5/test/render/vue/data/css/head1.css        |  38 ++
 html5/test/render/vue/data/css/head10.css       |  14 +
 html5/test/render/vue/data/css/head11.css       |   2 +
 html5/test/render/vue/data/css/head12.css       |   2 +
 html5/test/render/vue/data/css/head13.css       |  25 +
 html5/test/render/vue/data/css/head2.css        |  11 +
 html5/test/render/vue/data/css/head3.css        |  25 +
 html5/test/render/vue/data/css/head4.css        |  56 ++
 html5/test/render/vue/data/css/head5.css        | 153 ++++++
 html5/test/render/vue/data/css/head6.css        |   4 +
 html5/test/render/vue/data/css/head7.css        |  61 +++
 html5/test/render/vue/data/css/head8.css        | 507 ++++++++++++++++++
 html5/test/render/vue/data/css/head9.css        | 173 ++++++
 .../render/vue/data/dotvue/scoped-style.vue     |  13 +
 html5/test/render/vue/data/head-css.js          |  13 +
 html5/test/render/vue/data/head-map.js          | 275 ++++++++++
 html5/test/render/vue/helper.js                 | 140 -----
 html5/test/render/vue/helper/env.js             |  20 +
 html5/test/render/vue/helper/index.js           |  73 +++
 html5/test/render/vue/helper/runtime.js         |  74 +++
 html5/test/render/vue/helper/utils.js           |   8 +
 html5/test/render/vue/utils.js                  |  47 --
 html5/test/render/vue/utils/func.js             |  49 ++
 html5/test/render/vue/utils/style.js            |  68 +++
 package.json                                    |   4 +-
 packages/weex-vue-render/README.md              |  24 +-
 packages/weex-vue-render/package.json           |   2 +-
 84 files changed, 3818 insertions(+), 1144 deletions(-)
----------------------------------------------------------------------



[05/23] incubator-weex git commit: * [html5] use single run for karma test.

Posted by so...@apache.org.
* [html5] use single run for karma test.


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

Branch: refs/heads/0.12-dev
Commit: 747b70c8d41688910fab78cb91c4f1aaba50f3b2
Parents: 501cde2
Author: MrRaindrop <te...@gmail.com>
Authored: Thu Apr 6 15:47:48 2017 +0800
Committer: MrRaindrop <te...@gmail.com>
Committed: Thu Apr 6 15:47:48 2017 +0800

----------------------------------------------------------------------
 build/karma.vue.conf.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/747b70c8/build/karma.vue.conf.js
----------------------------------------------------------------------
diff --git a/build/karma.vue.conf.js b/build/karma.vue.conf.js
index c78b10a..e404212 100644
--- a/build/karma.vue.conf.js
+++ b/build/karma.vue.conf.js
@@ -55,8 +55,8 @@ module.exports = function (config) {
       '../html5/test/render/vue/data/**/*.js'
     ],
 
-    singleRun: false,
-    // singleRun: true,
+    // singleRun: false,
+    singleRun: true,
 
     reporters: ['mocha', 'coverage'],
     coverageReporter: {


[10/23] incubator-weex git commit: Merge branch '0.11-dev' into dev-web-scale

Posted by so...@apache.org.
Merge branch '0.11-dev' into dev-web-scale


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

Branch: refs/heads/0.12-dev
Commit: e49dad6b6b2511bddc86efd6390d252919e8f898
Parents: 501c85f 9afe27b
Author: MrRaindrop <te...@gmail.com>
Authored: Sun Apr 9 17:58:20 2017 +0800
Committer: MrRaindrop <te...@gmail.com>
Committed: Sun Apr 9 17:58:20 2017 +0800

----------------------------------------------------------------------
 .../com/taobao/weex/ui/component/WXImage.java   |  6 +++
 examples/vue/components/sliderinfinite.vue      | 46 ++++++++++++++++++++
 html5/render/vue/components/slider/index.js     |  6 ++-
 .../render/vue/components/slider/slideMixin.js  | 24 +++++++++-
 html5/render/vue/modules/dom.js                 |  4 ++
 package.json                                    |  1 +
 vue.html                                        | 11 +++--
 7 files changed, 89 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/e49dad6b/html5/render/vue/components/slider/index.js
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/e49dad6b/html5/render/vue/modules/dom.js
----------------------------------------------------------------------

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


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

Posted by so...@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/b7b81f3e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/b7b81f3e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/b7b81f3e

Branch: refs/heads/0.12-dev
Commit: b7b81f3e52822036f64ca6b27c6b0bbc0c64925f
Parents: 747b70c
Author: MrRaindrop <te...@gmail.com>
Authored: Thu Apr 6 15:50:15 2017 +0800
Committer: MrRaindrop <te...@gmail.com>
Committed: Thu Apr 6 15:50:15 2017 +0800

----------------------------------------------------------------------
 vue.html | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b7b81f3e/vue.html
----------------------------------------------------------------------
diff --git a/vue.html b/vue.html
index 5e931dd..c33af50 100644
--- a/vue.html
+++ b/vue.html
@@ -45,13 +45,13 @@
     }
   </style>
 
-  <!-- <script src="./node_modules/vue/dist/vue.runtime.min.js"></script> -->
+  <script src="./node_modules/vue/dist/vue.runtime.min.js"></script>
   <!-- <script src="./node_modules/vue/dist/vue.runtime.js"></script> -->
-  <script src="dist/vue.runtime.js"></script>
+  <!-- <script src="dist/vue.runtime.js"></script> -->
   <!-- <script src="./node_modules/weex-vue-render/index.min.js"></script> -->
-  <script src="./packages/weex-vue-render/dist/index.js"></script>
+  <!-- <script src="./packages/weex-vue-render/dist/index.js"></script> -->
   <!-- <script src="//unpkg.com/weex-vue-render@0.11.2/dist/index.js"></script> -->
-  <!-- <script src="./packages/weex-vue-render/dist/index.min.js"></script> -->
+  <script src="./packages/weex-vue-render/dist/index.min.js"></script>
 </head>
 <body>
   <div id="root"></div>


[14/23] incubator-weex git commit: * [html5] format NOTE.

Posted by so...@apache.org.
* [html5] format NOTE.


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

Branch: refs/heads/0.12-dev
Commit: 9bf25f4901667b3af40fe2c9ae8cb5663bead3ae
Parents: 8170283
Author: MrRaindrop <te...@gmail.com>
Authored: Mon Apr 10 17:01:59 2017 +0800
Committer: MrRaindrop <te...@gmail.com>
Committed: Mon Apr 10 17:01:59 2017 +0800

----------------------------------------------------------------------
 NOTICE | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/9bf25f49/NOTICE
----------------------------------------------------------------------
diff --git a/NOTICE b/NOTICE
index 147a854..c76972a 100644
--- a/NOTICE
+++ b/NOTICE
@@ -15,4 +15,6 @@ by Yuxi Evan You , licensed under the MIT License.
 This product contains software scroll-to (https://github.com/component/scroll-to) developed
 by TooTallNate , licensed under the MIT License.
 
-This product contains software inline-style-prefixer (https://github.com/rofrischmann/inline-style-prefixer) developed by rofrischmann , licensed under the MIT License.
+This product contains software inline-style-prefixer
+(https://github.com/rofrischmann/inline-style-prefixer) developed by
+rofrischmann , licensed under the MIT License.


[16/23] incubator-weex git commit: * [html5] fix vue example slider.

Posted by so...@apache.org.
* [html5] fix vue example slider.


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

Branch: refs/heads/0.12-dev
Commit: d442601b8f5935df9d128aa330df3d032a09175f
Parents: 66e69b3
Author: MrRaindrop <te...@gmail.com>
Authored: Tue Apr 11 12:29:24 2017 +0800
Committer: MrRaindrop <te...@gmail.com>
Committed: Tue Apr 11 12:29:24 2017 +0800

----------------------------------------------------------------------
 examples/vue/components/slider.vue | 1 -
 1 file changed, 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/d442601b/examples/vue/components/slider.vue
----------------------------------------------------------------------
diff --git a/examples/vue/components/slider.vue b/examples/vue/components/slider.vue
index fac0d26..5985b68 100644
--- a/examples/vue/components/slider.vue
+++ b/examples/vue/components/slider.vue
@@ -18,7 +18,6 @@
         </slider>
       </panel>
     </panel>
-    <panel style="height:1000px;"></panel>
     <panel :title="'Event, ' + eventCnt + ' change'" type="primary">
       <slider class="slider" append="tree"
         :interval="sliders[0].interval"


[13/23] incubator-weex git commit: * [html5] fix hello.vue

Posted by so...@apache.org.
* [html5] fix hello.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/8170283e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/8170283e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/8170283e

Branch: refs/heads/0.12-dev
Commit: 8170283e78f85b4969a71518418a4220276f1005
Parents: 8e6d31d
Author: MrRaindrop <te...@gmail.com>
Authored: Mon Apr 10 16:43:05 2017 +0800
Committer: MrRaindrop <te...@gmail.com>
Committed: Mon Apr 10 16:43:05 2017 +0800

----------------------------------------------------------------------
 examples/vue/hello.vue | 20 +-------------------
 1 file changed, 1 insertion(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/8170283e/examples/vue/hello.vue
----------------------------------------------------------------------
diff --git a/examples/vue/hello.vue b/examples/vue/hello.vue
index 0004900..462ccd9 100644
--- a/examples/vue/hello.vue
+++ b/examples/vue/hello.vue
@@ -1,23 +1,5 @@
 <template>
   <div>
-    <div ref="foo" :style="{height: '200px'}" class="ct"></div>
+    <text style="font-size: 100px;">Hello World.</text>
   </div>
 </template>
-
-<style scoped>
-.ct {
-  width: 200px;
-  flex: 1;
-  flex-direction: row;
-  transform: translate3d(100px, 100px, 0);
-  background-color: red;
-}
-</style>
-
-<script>
-  module.exports = {
-    mounted () {
-      console.log(this.$refs.foo.$el)
-    }
-  }
-</script>


[03/23] incubator-weex git commit: * [html5] change viewport adapter, add unit tests for new adapting methods.

Posted by so...@apache.org.
* [html5] change viewport adapter, add unit tests for new adapting methods.


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

Branch: refs/heads/0.12-dev
Commit: 38f1a971def5fcc0d471be36777f4719a6019dd1
Parents: 8309bf6
Author: MrRaindrop <te...@gmail.com>
Authored: Thu Apr 6 15:36:08 2017 +0800
Committer: MrRaindrop <te...@gmail.com>
Committed: Thu Apr 6 15:36:08 2017 +0800

----------------------------------------------------------------------
 .gitignore                                      |   2 +-
 build/karma.vue.conf.js                         |  11 +-
 build/webpack.examples.web.config.js            |  31 +-
 build/webpack.test.web.config.js                |  81 +++
 examples/vue/components/slider.vue              |   1 +
 examples/vue/hello.vue                          |  20 +-
 examples/vue/showcase/itemlist.vue              |  11 +-
 examples/vue/style/index.vue                    |   2 +-
 .../npm/karma-rollup-preprocessor_vx.x.x.js     |  53 ++
 flow-typed/npm/karma-sinon-chai_vx.x.x.js       |  38 ++
 html5/render/vue/components/a.js                |  13 +-
 html5/render/vue/components/div.js              |   4 +-
 html5/render/vue/components/image.js            |  13 +-
 html5/render/vue/components/input.js            |   4 +-
 .../render/vue/components/scrollable/header.js  |   4 +-
 .../vue/components/scrollable/list/cell.js      |   4 +-
 .../vue/components/scrollable/list/index.js     |   4 +-
 .../components/scrollable/loading-indicator.js  |   5 +-
 .../render/vue/components/scrollable/loading.js |   6 +-
 .../render/vue/components/scrollable/refresh.js |   6 +-
 .../vue/components/scrollable/scroller.js       |   6 +-
 html5/render/vue/components/slider/index.js     |   4 +-
 html5/render/vue/components/slider/indicator.js |  26 +-
 html5/render/vue/components/switch.js           |   6 +-
 html5/render/vue/components/text.js             |  10 +-
 html5/render/vue/components/textarea.js         |   4 +-
 html5/render/vue/components/video.js            |   4 +-
 html5/render/vue/components/web.js              |   4 +-
 html5/render/vue/core/index.js                  |   1 +
 html5/render/vue/core/style.js                  | 186 +++++++
 html5/render/vue/env/index.js                   |   4 +-
 html5/render/vue/env/viewport.js                | 162 ++++--
 html5/render/vue/env/weex.js                    |   2 +-
 html5/render/vue/env/wx-env.js                  |  80 +--
 html5/render/vue/mixins/base.js                 |  13 -
 html5/render/vue/mixins/style.js                |  14 +
 html5/render/vue/styles/base.css                | 513 ++++++++++++++++++
 html5/render/vue/styles/components.css          | 513 ------------------
 html5/render/vue/utils/style.js                 | 110 ++++
 html5/test/render/vue/components/image.js       |   4 +-
 html5/test/render/vue/core/scope-style-map.js   |  16 +
 html5/test/render/vue/core/style.js             |  59 +++
 .../vue/data/build/dotvue/scoped-style.js       | 525 +++++++++++++++++++
 html5/test/render/vue/data/css/head1.css        |  38 ++
 html5/test/render/vue/data/css/head10.css       |  14 +
 html5/test/render/vue/data/css/head11.css       |   2 +
 html5/test/render/vue/data/css/head12.css       |   2 +
 html5/test/render/vue/data/css/head2.css        |  11 +
 html5/test/render/vue/data/css/head3.css        |  25 +
 html5/test/render/vue/data/css/head4.css        |  56 ++
 html5/test/render/vue/data/css/head5.css        | 153 ++++++
 html5/test/render/vue/data/css/head6.css        |   4 +
 html5/test/render/vue/data/css/head7.css        |  61 +++
 html5/test/render/vue/data/css/head8.css        | 507 ++++++++++++++++++
 html5/test/render/vue/data/css/head9.css        | 173 ++++++
 .../render/vue/data/dotvue/scoped-style.vue     |  13 +
 html5/test/render/vue/data/head-css.js          |  12 +
 html5/test/render/vue/data/head-map.js          | 247 +++++++++
 html5/test/render/vue/helper.js                 | 140 -----
 html5/test/render/vue/helper/env.js             |  20 +
 html5/test/render/vue/helper/index.js           | 113 ++++
 html5/test/render/vue/helper/runtime.js         |  80 +++
 html5/test/render/vue/helper/utils.js           |   8 +
 html5/test/render/vue/utils.js                  |  47 --
 html5/test/render/vue/utils/func.js             |  50 ++
 html5/test/render/vue/utils/style.js            |  68 +++
 package.json                                    |   2 +-
 vue.html                                        |   9 +-
 68 files changed, 3572 insertions(+), 862 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/.gitignore
----------------------------------------------------------------------
diff --git a/.gitignore b/.gitignore
index dc96cc2..50e9ce3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,7 +7,7 @@
 
 # Created by Builder
 examples/build
-examples/web-entry
+web-entry
 test/build
 weex_tmp
 coverage

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/build/karma.vue.conf.js
----------------------------------------------------------------------
diff --git a/build/karma.vue.conf.js b/build/karma.vue.conf.js
index 50c22fd..c78b10a 100644
--- a/build/karma.vue.conf.js
+++ b/build/karma.vue.conf.js
@@ -44,16 +44,19 @@ module.exports = function (config) {
     frameworks: ['mocha', 'sinon-chai'],
     browsers: ['PhantomJS'],
     files: [
+      // '../html5/test/render/vue/components/*.js'
       '../html5/test/render/vue/**/*.js'
     ],
 
     exclude: [
       '../html5/test/render/vue/helper.js',
-      '../html5/test/render/vue/vender/**/*.js'
+      '../html5/test/render/vue/helper/*.js',
+      '../html5/test/render/vue/vender/**/*.js',
+      '../html5/test/render/vue/data/**/*.js'
     ],
 
-    // singleRun: false,
-    singleRun: true,
+    singleRun: false,
+    // singleRun: true,
 
     reporters: ['mocha', 'coverage'],
     coverageReporter: {
@@ -65,7 +68,7 @@ module.exports = function (config) {
 
     preprocessors: {
       '../html5/test/**/*.js': ['rollup'],
-      '../html5/test/**/!(components|examples)/*.js': ['rollup', 'coverage']
+      '../html5/test/**/!(components|examples|core)/*.js': ['rollup', 'coverage']
     },
     rollupPreprocessor: rollupConfig,
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/build/webpack.examples.web.config.js
----------------------------------------------------------------------
diff --git a/build/webpack.examples.web.config.js b/build/webpack.examples.web.config.js
index 5aa04c7..fdf2f6f 100644
--- a/build/webpack.examples.web.config.js
+++ b/build/webpack.examples.web.config.js
@@ -48,7 +48,6 @@ var bannerPlugin = new webpack.BannerPlugin(banner, {
   exclude: bannerExcludeFiles
 })
 
-
 module.exports = {
   entry: entry,
   output: {
@@ -67,20 +66,20 @@ module.exports = {
       }
     ]
   },
-  vue: {
-    /**
-     * important! should use postTransformNode to add $processStyle for
-     * inline style prefixing.
-     */
-    compilerModules: [
-      {
-        postTransformNode: el => {
-          el.staticStyle = `$processStyle(${el.staticStyle})`
-          el.styleBinding = `$processStyle(${el.styleBinding})`
-        }
-      }
-    ],
-    postcss: [require('autoprefixer')()]
-  },
+  // vue: {
+  //   /**
+  //    * important! should use postTransformNode to add $processStyle for
+  //    * inline style prefixing.
+  //    */
+  //   compilerModules: [
+  //     {
+  //       postTransformNode: el => {
+  //         el.staticStyle = `$processStyle(${el.staticStyle})`
+  //         el.styleBinding = `$processStyle(${el.styleBinding})`
+  //       }
+  //     }
+  //   ],
+  //   postcss: [require('autoprefixer')()]
+  // },
   plugins: [bannerPlugin]
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/build/webpack.test.web.config.js
----------------------------------------------------------------------
diff --git a/build/webpack.test.web.config.js b/build/webpack.test.web.config.js
new file mode 100644
index 0000000..6b55480
--- /dev/null
+++ b/build/webpack.test.web.config.js
@@ -0,0 +1,81 @@
+var path = require('path');
+var fs = require('fs-extra');
+var webpack = require('webpack');
+
+var entry = {};
+// var bannerExcludeFiles = [];
+var webSrcDirectory = path.join(__dirname, '../html5/test/render/vue/data/dotvue');
+
+// function getEntryFileContent (entryPath, vueFilePath) {
+//   const relativePath = path.relative(path.join(entryPath, '../'), vueFilePath);
+//   return 'var App = require(\'' + relativePath + '\')\n'
+//     + 'App.el = \'#root\'\n'
+//     + 'new Vue(App)\n'
+// }
+
+function walk(dir) {
+  dir = dir || '.';
+  var directory = path.join(__dirname, '../html5/test/render/vue/data', dir);
+  var entryDirectory = path.join(webSrcDirectory, dir);
+  fs.readdirSync(directory)
+    .forEach(function(file) {
+      var fullpath = path.join(directory, file);
+      var stat = fs.statSync(fullpath);
+      var extname = path.extname(fullpath);
+      if (stat.isFile() && extname === '.vue') {
+        // var entryFile = path.join(entryDirectory, path.basename(file, extname) + '.js');
+        // fs.outputFileSync(entryFile, getEntryFileContent(entryFile, fullpath));
+        var name = path.join('html5/test/render/vue/data', 'build', dir, path.basename(file, extname));
+        entry[name] = fullpath
+      } else if (stat.isDirectory() && file !== 'build' && file !== 'include') {
+        var subdir = path.join(dir, file);
+        walk(subdir);
+      }
+    });
+}
+
+walk();
+
+// var banner = '// NOTE: for vue2.0 and platform:web only.\n'
+// var bannerPlugin = new webpack.BannerPlugin({
+//   banner,
+//   raw: true,
+//   exclude: bannerExcludeFiles
+// })
+
+module.exports = {
+  entry: entry,
+  output: {
+    path: path.resolve(__dirname, '../'),
+    libraryTarget: 'umd',
+    filename: '[name].js'
+  },
+  module: {
+    loaders: [
+      {
+        test: /\.js$/,
+        loaders: ['babel-loader'],
+        exclude: /node_modules/
+      }, {
+        test: /\.vue(\?[^?]+)?$/,
+        loaders: ['vue-loader']
+      }
+    ]
+  },
+  // vue: {
+    /**
+     * important! should use postTransformNode to add $processStyle for
+     * inline style prefixing.
+     */
+    // compilerModules: [
+    //   {
+    //     postTransformNode: el => {
+    //       el.staticStyle = `$processStyle(${el.staticStyle})`
+    //       el.styleBinding = `$processStyle(${el.styleBinding})`
+    //     }
+    //   }
+    // ],
+    // postcss: [require('autoprefixer')()]
+  // }
+  // plugins: [bannerPlugin]
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/examples/vue/components/slider.vue
----------------------------------------------------------------------
diff --git a/examples/vue/components/slider.vue b/examples/vue/components/slider.vue
index 5985b68..fac0d26 100644
--- a/examples/vue/components/slider.vue
+++ b/examples/vue/components/slider.vue
@@ -18,6 +18,7 @@
         </slider>
       </panel>
     </panel>
+    <panel style="height:1000px;"></panel>
     <panel :title="'Event, ' + eventCnt + ' change'" type="primary">
       <slider class="slider" append="tree"
         :interval="sliders[0].interval"

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/examples/vue/hello.vue
----------------------------------------------------------------------
diff --git a/examples/vue/hello.vue b/examples/vue/hello.vue
index 462ccd9..0004900 100644
--- a/examples/vue/hello.vue
+++ b/examples/vue/hello.vue
@@ -1,5 +1,23 @@
 <template>
   <div>
-    <text style="font-size: 100px;">Hello World.</text>
+    <div ref="foo" :style="{height: '200px'}" class="ct"></div>
   </div>
 </template>
+
+<style scoped>
+.ct {
+  width: 200px;
+  flex: 1;
+  flex-direction: row;
+  transform: translate3d(100px, 100px, 0);
+  background-color: red;
+}
+</style>
+
+<script>
+  module.exports = {
+    mounted () {
+      console.log(this.$refs.foo.$el)
+    }
+  }
+</script>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/examples/vue/showcase/itemlist.vue
----------------------------------------------------------------------
diff --git a/examples/vue/showcase/itemlist.vue b/examples/vue/showcase/itemlist.vue
index eced86e..02fb33a 100644
--- a/examples/vue/showcase/itemlist.vue
+++ b/examples/vue/showcase/itemlist.vue
@@ -1,11 +1,11 @@
 <template>
   <list class="list" @loadmore="loadmore" loadmoreoffset=2000>
-    <cell class="cell" v-for="(item,i) in shopList" :key="i" :scope="item.scopeValue" @click="oncellclick(item.id)">
+    <cell class="cell" v-for="item in shopList" :scope="item.scopeValue" @click="oncellclick(item.id)">
       <div class="shopDiv">
         <div class="shopHeader" style="flex-direction:row;">
           <div style="flex:2;flex-direction:row;">
             <div>
-              <image style="width:60px;height:60px;" :src="item.PersonPhoto"></image>
+              <image class="test" :src="item.PersonPhoto"></image>
             </div>
             <div style="flex-direction:column;margin-left:5px;">
               <div style="margin-top:5px;">
@@ -78,7 +78,7 @@
             <text class="shopDesc" style="font-size:25px;">{{item.shopDesc}}</text>
           </div>
           <div style="flex-direction:row;">
-            <div class="imgDiv" style="flex:1;flex-direction:column;margin:10px;" v-for="img in item.shopImgList">
+            <div class="imgDiv" style="flex:1;height:300px;flex-direction:column;margin:10px;" v-for="img in item.shopImgList">
               <div>
                 <image class="shopImg" :style="{ width: img.shopImgWidth, height: img.shopImgHeight }" :src="img.shopImg"></image>
               </div>
@@ -180,6 +180,11 @@
     width: 750px;
   }
 
+  .test {
+    width:60px;
+    height:60px;
+  }
+
   .shopDiv {
     flex-direction: column;
     background-color: #ffffff;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/examples/vue/style/index.vue
----------------------------------------------------------------------
diff --git a/examples/vue/style/index.vue b/examples/vue/style/index.vue
index 99ce7bc..abee8e7 100644
--- a/examples/vue/style/index.vue
+++ b/examples/vue/style/index.vue
@@ -1,5 +1,5 @@
 <template>
-  <scroller>
+  <scroller style="overflow-x:hidden;">
     <style-box></style-box>
     <style-flex></style-flex>
     <panel title="opacity" type="primary">

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/flow-typed/npm/karma-rollup-preprocessor_vx.x.x.js
----------------------------------------------------------------------
diff --git a/flow-typed/npm/karma-rollup-preprocessor_vx.x.x.js b/flow-typed/npm/karma-rollup-preprocessor_vx.x.x.js
new file mode 100644
index 0000000..3dc7ce2
--- /dev/null
+++ b/flow-typed/npm/karma-rollup-preprocessor_vx.x.x.js
@@ -0,0 +1,53 @@
+// flow-typed signature: 9b5b1885bf45d4adf8ce0d3ca9ab51b1
+// flow-typed version: <<STUB>>/karma-rollup-preprocessor_v^3.0.3/flow_v0.42.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ *   'karma-rollup-preprocessor'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the 
+ * community by sending a pull request to: 
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'karma-rollup-preprocessor' {
+  declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'karma-rollup-preprocessor/karma.conf' {
+  declare module.exports: any;
+}
+
+declare module 'karma-rollup-preprocessor/lib/index' {
+  declare module.exports: any;
+}
+
+declare module 'karma-rollup-preprocessor/test/helper' {
+  declare module.exports: any;
+}
+
+declare module 'karma-rollup-preprocessor/test/main' {
+  declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'karma-rollup-preprocessor/karma.conf.js' {
+  declare module.exports: $Exports<'karma-rollup-preprocessor/karma.conf'>;
+}
+declare module 'karma-rollup-preprocessor/lib/index.js' {
+  declare module.exports: $Exports<'karma-rollup-preprocessor/lib/index'>;
+}
+declare module 'karma-rollup-preprocessor/test/helper.js' {
+  declare module.exports: $Exports<'karma-rollup-preprocessor/test/helper'>;
+}
+declare module 'karma-rollup-preprocessor/test/main.js' {
+  declare module.exports: $Exports<'karma-rollup-preprocessor/test/main'>;
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/flow-typed/npm/karma-sinon-chai_vx.x.x.js
----------------------------------------------------------------------
diff --git a/flow-typed/npm/karma-sinon-chai_vx.x.x.js b/flow-typed/npm/karma-sinon-chai_vx.x.x.js
new file mode 100644
index 0000000..9c0219e
--- /dev/null
+++ b/flow-typed/npm/karma-sinon-chai_vx.x.x.js
@@ -0,0 +1,38 @@
+// flow-typed signature: 0953d9baac8251cc38f40d1011955980
+// flow-typed version: <<STUB>>/karma-sinon-chai_v^1.2.4/flow_v0.42.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ *   'karma-sinon-chai'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the 
+ * community by sending a pull request to: 
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'karma-sinon-chai' {
+  declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'karma-sinon-chai/chai-adapter' {
+  declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'karma-sinon-chai/chai-adapter.js' {
+  declare module.exports: $Exports<'karma-sinon-chai/chai-adapter'>;
+}
+declare module 'karma-sinon-chai/index' {
+  declare module.exports: $Exports<'karma-sinon-chai'>;
+}
+declare module 'karma-sinon-chai/index.js' {
+  declare module.exports: $Exports<'karma-sinon-chai'>;
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/render/vue/components/a.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/a.js b/html5/render/vue/components/a.js
index aa973fd..f0a28e5 100644
--- a/html5/render/vue/components/a.js
+++ b/html5/render/vue/components/a.js
@@ -1,5 +1,12 @@
+import { extractComponentStyle } from '../core'
 // import { validateStyles } from '../validator'
 
+const defaultStyle = `
+.weex-a {
+  text-decoration: none;
+}
+`
+
 export default {
   name: 'weex-a',
   props: {
@@ -16,7 +23,9 @@ export default {
         href: this.href
       },
       on: this._createEventMap(),
-      staticClass: 'weex-a weex-ct'
+      staticClass: 'weex-a weex-ct',
+      staticStyle: extractComponentStyle(this)
     }, this._trimTextNodeChildren(this.$slots.default))
-  }
+  },
+  _d_style: defaultStyle
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/render/vue/components/div.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/div.js b/html5/render/vue/components/div.js
index 033ba9d..fd8ed3c 100644
--- a/html5/render/vue/components/div.js
+++ b/html5/render/vue/components/div.js
@@ -1,4 +1,5 @@
 // import { validateStyles } from '../validator'
+import { extractComponentStyle } from '../core'
 
 export default {
   name: 'weex-div',
@@ -10,7 +11,8 @@ export default {
     return createElement('html:div', {
       attrs: { 'weex-type': 'div' },
       on: this._createEventMap(),
-      staticClass: 'weex-div weex-ct'
+      staticClass: 'weex-div weex-ct',
+      staticStyle: extractComponentStyle(this)
     }, this._trimTextNodeChildren(this.$slots.default))
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/render/vue/components/image.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/image.js b/html5/render/vue/components/image.js
index 5f4a786..f4980d6 100644
--- a/html5/render/vue/components/image.js
+++ b/html5/render/vue/components/image.js
@@ -1,8 +1,10 @@
+import { extractComponentStyle } from '../core/style'
+import { extend } from '../utils'
 /**
  * get resize (stetch|cover|contain) related styles.
  */
 function getResizeStyle (context) {
-  const stretch = '100%'
+  const stretch = '100% 100%'
   const resize = context.resize || stretch
   const bgSize = ['cover', 'contain', stretch].indexOf(resize) > -1 ? resize : stretch
   // compatibility: http://caniuse.com/#search=background-size
@@ -49,16 +51,17 @@ export default {
     //   validateStyles('image', this.$vnode.data && this.$vnode.data.staticStyle)
     // }
     // const style = this._normalizeInlineStyles(this.$vnode.data)
-    const wh = this._getSize(this.$vnode.data)
+    const resizeStyle = getResizeStyle(this)
+    const style = extractComponentStyle(this)
     return createElement('figure', {
       attrs: {
         'weex-type': 'image',
-        'img-src': preProcessSrc(this, this.src, wh),
-        'img-placeholder': preProcessSrc(this, this.placeholder, wh)
+        'img-src': preProcessSrc(this, this.src, style),
+        'img-placeholder': preProcessSrc(this, this.placeholder, style)
       },
       on: this._createEventMap(['load', 'error']),
       staticClass: 'weex-image weex-el',
-      staticStyle: getResizeStyle(this)
+      staticStyle: extend(style, resizeStyle)
     })
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/render/vue/components/input.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/input.js b/html5/render/vue/components/input.js
index 22a600c..d65ce79 100644
--- a/html5/render/vue/components/input.js
+++ b/html5/render/vue/components/input.js
@@ -2,6 +2,7 @@
  * @fileOverview Input component.
  * Support v-model only if vue version is large than 2.2.0
  */
+import { extractComponentStyle } from '../core'
 import { inputCommon } from '../mixins'
 import { extend, mapFormEvents } from '../utils'
 // import { validateStyles } from '../validator'
@@ -56,7 +57,8 @@ export default {
         value: this.value
       },
       on: this.createKeyboardEvent(events),
-      staticClass: 'weex-input weex-el'
+      staticClass: 'weex-input weex-el',
+      staticStyle: extractComponentStyle(this)
     })
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/render/vue/components/scrollable/header.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/scrollable/header.js b/html5/render/vue/components/scrollable/header.js
index f8d206c..64ebd77 100644
--- a/html5/render/vue/components/scrollable/header.js
+++ b/html5/render/vue/components/scrollable/header.js
@@ -1,5 +1,6 @@
 // import { validateStyles } from '../../validator'
 import { supportSticky } from '../../utils/style'
+import { extractComponentStyle } from '../../core'
 
 export default {
   data () {
@@ -51,7 +52,8 @@ export default {
       on: this._createEventMap(),
       ref: 'header',
       staticClass: 'weex-header weex-ct',
-      class: { sticky: this.sticky, iossticky: this.supportSticky }
+      class: { sticky: this.sticky, iossticky: this.supportSticky },
+      staticStyle: extractComponentStyle(this)
     }, this.$slots.default)
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/render/vue/components/scrollable/list/cell.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/scrollable/list/cell.js b/html5/render/vue/components/scrollable/list/cell.js
index 3650aec..32ec1f9 100644
--- a/html5/render/vue/components/scrollable/list/cell.js
+++ b/html5/render/vue/components/scrollable/list/cell.js
@@ -1,4 +1,5 @@
 // import { validateStyles } from '../../../validator'
+import { extractComponentStyle } from '../../../core'
 
 export default {
   render (createElement) {
@@ -9,7 +10,8 @@ export default {
     return createElement('section', {
       attrs: { 'weex-type': 'cell' },
       on: this._createEventMap(),
-      staticClass: 'weex-cell weex-ct'
+      staticClass: 'weex-cell weex-ct',
+      staticStyle: extractComponentStyle(this)
     }, this.$slots.default)
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/render/vue/components/scrollable/list/index.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/scrollable/list/index.js b/html5/render/vue/components/scrollable/list/index.js
index f48a6c8..2db5239 100644
--- a/html5/render/vue/components/scrollable/list/index.js
+++ b/html5/render/vue/components/scrollable/list/index.js
@@ -1,3 +1,4 @@
+import { extractComponentStyle } from '../../../core'
 import { scrollable } from '../../../mixins'
 // import { validateStyles } from '../../../validator'
 import { extend } from '../../../utils'
@@ -61,7 +62,8 @@ export default {
         touchstart: this.handleTouchStart,
         touchmove: this.handleTouchMove,
         touchend: this.handleTouchEnd
-      })
+      }),
+      staticStyle: extractComponentStyle(this)
     }, this.createChildren(createElement))
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/render/vue/components/scrollable/loading-indicator.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/scrollable/loading-indicator.js b/html5/render/vue/components/scrollable/loading-indicator.js
index 28ee909..e1f9854 100644
--- a/html5/render/vue/components/scrollable/loading-indicator.js
+++ b/html5/render/vue/components/scrollable/loading-indicator.js
@@ -1,9 +1,12 @@
+import { extractComponentStyle } from '../../core'
+
 export default {
   render (createElement) {
     this.weexType = 'loading-indicator'
     return createElement('mark', {
       attrs: { 'weex-type': 'loading-indicator' },
-      staticClass: 'weex-loading-indicator weex-ct'
+      staticClass: 'weex-loading-indicator weex-ct',
+      staticStyle: extractComponentStyle(this)
     })
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/render/vue/components/scrollable/loading.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/scrollable/loading.js b/html5/render/vue/components/scrollable/loading.js
index ebf99d3..8f01fde 100644
--- a/html5/render/vue/components/scrollable/loading.js
+++ b/html5/render/vue/components/scrollable/loading.js
@@ -1,3 +1,4 @@
+import { extractComponentStyle } from '../../core'
 import LoadingIndicator from './loading-indicator'
 
 export default {
@@ -30,7 +31,7 @@ export default {
   },
   watch: {
     height (val) {
-      this.$el.style.height = val + 'px'
+      this.$el.style.height = val * weex.config.env.scale + 'px'
     },
     display (val) {
       if (val === 'hide') {
@@ -75,7 +76,8 @@ export default {
     return createElement('aside', {
       ref: 'loading',
       attrs: { 'weex-type': 'loading' },
-      staticClass: 'weex-loading weex-ct'
+      staticClass: 'weex-loading weex-ct',
+      staticStyle: extractComponentStyle(this)
     }, this.getChildren())
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/render/vue/components/scrollable/refresh.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/scrollable/refresh.js b/html5/render/vue/components/scrollable/refresh.js
index 884f2ee..1d941d4 100644
--- a/html5/render/vue/components/scrollable/refresh.js
+++ b/html5/render/vue/components/scrollable/refresh.js
@@ -1,3 +1,4 @@
+import { extractComponentStyle } from '../../core'
 import LoadingIndicator from './loading-indicator'
 import { createEvent } from '../../utils'
 
@@ -32,7 +33,7 @@ export default {
   },
   watch: {
     height (val) {
-      this.$el.style.height = val + 'px'
+      this.$el.style.height = val * weex.config.env.scale + 'px'
     },
     display (val) {
       if (val === 'hide') {
@@ -83,7 +84,8 @@ export default {
     return createElement('aside', {
       ref: 'refresh',
       attrs: { 'weex-type': 'refresh' },
-      staticClass: 'weex-refresh weex-ct'
+      staticClass: 'weex-refresh weex-ct',
+      staticStyle: extractComponentStyle(this)
     }, this.getChildren())
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/render/vue/components/scrollable/scroller.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/scrollable/scroller.js b/html5/render/vue/components/scrollable/scroller.js
index 1636270..ee117e2 100644
--- a/html5/render/vue/components/scrollable/scroller.js
+++ b/html5/render/vue/components/scrollable/scroller.js
@@ -1,3 +1,4 @@
+import { extractComponentStyle } from '../../core'
 import { scrollable } from '../../mixins'
 // import { validateStyles } from '../../validator'
 import { extend } from '../../utils'
@@ -75,13 +76,14 @@ export default {
     return createElement('main', {
       ref: 'wrapper',
       attrs: { 'weex-type': 'scroller' },
-      staticClass: this.wrapperClass,
       on: extend(this._createEventMap(), {
         scroll: this.handleScroll,
         touchstart: this.handleTouchStart,
         touchmove: this.handleTouchMove,
         touchend: this.handleTouchEnd
-      })
+      }),
+      staticClass: this.wrapperClass,
+      staticStyle: extractComponentStyle(this)
     }, this.createChildren(createElement))
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/render/vue/components/slider/index.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/slider/index.js b/html5/render/vue/components/slider/index.js
index cb82b86..b2f4a90 100644
--- a/html5/render/vue/components/slider/index.js
+++ b/html5/render/vue/components/slider/index.js
@@ -1,4 +1,5 @@
 // import { validateStyles } from '../../validator'
+import { extractComponentStyle } from '../../core'
 import { throttle, bind, extend, fireLazyload } from '../../utils'
 import indicator from './indicator'
 import slideMixin from './slideMixin'
@@ -127,7 +128,8 @@ export default {
           touchstart: this.handleTouchStart,
           touchmove: throttle(bind(this.handleTouchMove, this), 25),
           touchend: this.handleTouchEnd
-        })
+        }),
+        staticStyle: extractComponentStyle(this)
       },
       [
         createElement('ul', {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/render/vue/components/slider/indicator.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/slider/indicator.js b/html5/render/vue/components/slider/indicator.js
index 65d3700..3340cfd 100644
--- a/html5/render/vue/components/slider/indicator.js
+++ b/html5/render/vue/components/slider/indicator.js
@@ -1,21 +1,23 @@
+import { extractComponentStyle } from '../../core'
 import { extend, extendKeys } from '../../utils'
 
 function getIndicatorItemStyle (spec, isActive) {
   const style = {}
-  style['background-color'] = spec[isActive ? 'item-selected-color' : 'item-color']
-  style['width'] = style['height'] = spec['item-size']
+  style['background-color'] = spec[isActive ? 'itemSelectedColor' : 'itemColor']
+  style['width'] = style['height'] = spec['itemSize']
   return style
 }
 
 function _render (context, h) {
   const children = []
-  const mergedStyle = context._getComponentStyle(context.$vnode.data)
-  context.$vnode.data.cached = {}
-  extendKeys(context.$vnode.data.cached, mergedStyle, ['width', 'height'])
+  const mergedStyle = extractComponentStyle(context)
+  // const mergedStyle = context._getComponentStyle(context.$vnode.data)
+  // context.$vnode.data.cached = {}
+  // extendKeys(context.$vnode.data.cached, mergedStyle, ['width', 'height'])
   const indicatorSpecStyle = extendKeys(
       {},
       mergedStyle,
-      ['item-color', 'item-selected-color', 'item-size']
+      ['itemColor', 'itemSelectedColor', 'itemSize']
     )
   for (let i = 0; i < Number(context.count); ++i) {
     const classNames = ['weex-indicator-item weex-el']
@@ -29,11 +31,9 @@ function _render (context, h) {
       staticStyle: getIndicatorItemStyle(indicatorSpecStyle, isActive)
     }))
   }
-  if (!context.$vnode.context._isMounted) {
-    context.$nextTick(function () {
-      _reLayout(this, _getVirtualRect(this, mergedStyle), _getLtbr(this, mergedStyle))
-    })
-  }
+  context.$nextTick(function () {
+    _reLayout(this, _getVirtualRect(this, mergedStyle), _getLtbr(this, mergedStyle))
+  })
   return h('nav', {
     attrs: { 'weex-type': 'indicator' },
     staticClass: 'weex-indicator weex-ct',
@@ -117,10 +117,6 @@ export default {
     count: [Number, String],
     active: [Number, String]
   },
-  updated () {
-    const mergedStyle = this._getComponentStyle(this.$vnode.data)
-    _reLayout(this, _getVirtualRect(this, mergedStyle), _getLtbr(this, mergedStyle))
-  },
   render (createElement) {
     return _render(this, createElement)
   }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/render/vue/components/switch.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/switch.js b/html5/render/vue/components/switch.js
index 63ff8f9..b04bf90 100644
--- a/html5/render/vue/components/switch.js
+++ b/html5/render/vue/components/switch.js
@@ -1,4 +1,5 @@
 // import { validateStyles } from '../validator'
+import { extractComponentStyle } from '../core'
 
 export default {
   props: {
@@ -42,13 +43,14 @@ export default {
     // }
     return createElement('span', {
       attrs: { 'weex-type': 'switch' },
-      staticClass: this.wrapperClass,
       on: {
         click: event => {
           this.$emit('click', event)
           this.toggle()
         }
-      }
+      },
+      staticClass: this.wrapperClass,
+      staticStyle: extractComponentStyle(this)
     }, [createElement('small', { staticClass: 'weex-switch-inner' })])
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/render/vue/components/text.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/text.js b/html5/render/vue/components/text.js
index 3d8a129..5ecdffa 100644
--- a/html5/render/vue/components/text.js
+++ b/html5/render/vue/components/text.js
@@ -6,10 +6,13 @@
  * be clipped according to the 'lines'. Otherwise, it'll be the 'height'.
  */
 
+import { extractComponentStyle } from '../core'
+import { extend } from '../utils'
+
 /**
  * Get text special styles (lines and text-overflow).
  */
-function getTextSpecStyle (context = {}, ms = {}) {
+function getTextSpecStyle (ms = {}) {
   const lines = parseInt(ms.lines) || 0
   const overflow = ms['text-overflow'] || 'ellipsis'
   if (lines > 0) {
@@ -32,12 +35,13 @@ export default {
     // if (process.env.NODE_ENV === 'development') {
     //   validateStyles('text', this.$vnode.data && this.$vnode.data.staticStyle)
     // }
-    const ms = this._getComponentStyle(this.$vnode.data)
+    const style = extractComponentStyle(this)
+    const textSpecStyle = getTextSpecStyle(style)
     return createElement('p', {
       attrs: { 'weex-type': 'text' },
       on: this._createEventMap(),
       staticClass: 'weex-text weex-el',
-      staticStyle: getTextSpecStyle(this, ms)
+      staticStyle: extend(style, textSpecStyle)
     }, this.$slots.default || [this.value])
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/render/vue/components/textarea.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/textarea.js b/html5/render/vue/components/textarea.js
index c419642..d170051 100644
--- a/html5/render/vue/components/textarea.js
+++ b/html5/render/vue/components/textarea.js
@@ -1,3 +1,4 @@
+import { extractComponentStyle } from '../core'
 import { inputCommon } from '../mixins'
 import { extend, mapFormEvents } from '../utils'
 // import { validateStyles } from '../validator'
@@ -42,7 +43,8 @@ export default {
         value: this.value
       },
       on: this.createKeyboardEvent(events),
-      staticClass: 'weex-textarea weex-el'
+      staticClass: 'weex-textarea weex-el',
+      staticStyle: extractComponentStyle(this)
     })
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/render/vue/components/video.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/video.js b/html5/render/vue/components/video.js
index a256aad..5d8c312 100644
--- a/html5/render/vue/components/video.js
+++ b/html5/render/vue/components/video.js
@@ -1,4 +1,5 @@
 // import { validateStyles } from '../validator'
+import { extractComponentStyle } from '../core'
 
 export default {
   props: {
@@ -46,7 +47,8 @@ export default {
         src: this.src
       },
       on: this._createEventMap(['start', 'pause', 'finish', 'fail']),
-      staticClass: 'weex-video weex-el'
+      staticClass: 'weex-video weex-el',
+      staticStyle: extractComponentStyle(this)
     })
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/render/vue/components/web.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/web.js b/html5/render/vue/components/web.js
index 06da79a..cccda37 100644
--- a/html5/render/vue/components/web.js
+++ b/html5/render/vue/components/web.js
@@ -1,3 +1,4 @@
+import { extractComponentStyle } from '../core'
 import { createEvent } from '../utils'
 // import { validateStyles } from '../validator'
 
@@ -45,7 +46,8 @@ export default {
         src: this.src
       },
       on: this._createEventMap(['error']),
-      staticClass: 'weex-web weex-el'
+      staticClass: 'weex-web weex-el',
+      staticStyle: extractComponentStyle(this)
     })
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/render/vue/core/index.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/core/index.js b/html5/render/vue/core/index.js
new file mode 100644
index 0000000..57fe34e
--- /dev/null
+++ b/html5/render/vue/core/index.js
@@ -0,0 +1 @@
+export * from './style'

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/render/vue/core/style.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/core/style.js b/html5/render/vue/core/style.js
new file mode 100644
index 0000000..0f3a814
--- /dev/null
+++ b/html5/render/vue/core/style.js
@@ -0,0 +1,186 @@
+import {
+  camelizeKeys,
+  // hyphenateKeys,
+  extend,
+  trimComment,
+  normalizeStyle
+} from '../utils'
+import { tagBegin, tagEnd } from '../utils/perf'
+/* istanbul ignore next */
+import addPrefix from 'inline-style-prefixer/static'
+
+/**
+ * get scoped class style map from stylesheets in <head>.
+ */
+export function getHeadStyleMap () {
+  if (process.env.NODE_ENV === 'development') {
+    tagBegin('getHeadStyleMap')
+  }
+  const res = Array.from(document.styleSheets || [])
+    .reduce((pre, styleSheet) => {
+      // why not using styleSheet.rules || styleSheet.cssRules to get css rules ?
+      // because weex's components defined non-standard style attributes, which is
+      // auto ignored when access rule.cssText.
+      const strArr = trimComment(styleSheet.ownerNode.textContent.trim()).split(/}/)
+      const len = strArr.length
+      const rules = []
+      for (let i = 0; i < len; i++) {
+        const str = strArr[i]
+        if (!str || str.match(/^\s*$/)) {
+          continue
+        }
+        /**
+         * should match these cases:
+         * .a[data-v-xxx] { color: red }
+         * .a[data-v-xxx], .b[data-v-xxx] { color: red; }
+         *
+         * should not match these cases:
+         * .a { color: red; }
+         * etc.
+         */
+        const match = str.match(/((?:,?\s*\.[\w-]+\[data-v-\w+\])+)\s*({[^}]+)/)
+        if (!match) {
+          // not the vue static class styles map. so acquire no rules for this styleSheet.
+          // just jump through this styleSheet and go to analyzing next.
+          return pre
+        }
+        const clsNms = match[1].split(',').map(n => n.trim())
+        const cssText = match[2].replace(/[{}]/g, '').trim()
+        let clsNmsIdx = 0
+        const clsNmsLen = clsNms.length
+        while (clsNmsIdx < clsNmsLen) {
+          rules.push({
+            selectorText: clsNms[clsNmsIdx],
+            cssText
+          })
+          clsNmsIdx++
+        }
+      }
+      Array.from(rules).forEach(rule => {
+        const selector = rule.selectorText || ''
+        pre[selector] = trimComment(rule.cssText).split(';')
+          .reduce((styleObj, statement) => {
+            statement = statement.trim()
+            if (statement && statement.indexOf('/*') <= -1) {
+              const resArr = statement.split(':').map((part) => part.trim())
+              styleObj[resArr[0]] = resArr[1]
+            }
+            return styleObj
+          }, {})
+      })
+      return pre
+    }, {})
+  if (process.env.NODE_ENV === 'development') {
+    tagEnd('getHeadStyleMap')
+  }
+  return res
+}
+
+export function getScopeIds (context) {
+  const arr = []
+  let ctx = context
+  let scopeId
+  while (ctx) {
+    scopeId = ctx.$options._scopeId
+    scopeId && arr.push(scopeId)
+    ctx = ctx.$options.parent
+  }
+  return arr
+}
+
+export function setDefaultStyle () {
+  
+}
+
+/**
+ * get style in <style scoped> tags for this component.
+ */
+export function getScopeStyle (context, classNames) {
+  const scopeIds = getScopeIds(context)
+  const style = {}
+  const styleMap = weex.styleMap
+  let map
+  let cls
+  let clsNmsIdx
+  let scpIdsIdx
+  const clsNmsLen = classNames.length
+  const scpIdsLen = scopeIds.length
+  if (clsNmsLen <= 0) {
+    return {}
+  }
+  clsNmsIdx = 0
+  while (clsNmsIdx < clsNmsLen) {
+    scpIdsIdx = 0
+    while (scpIdsIdx < scpIdsLen) {
+      cls = `.${classNames[clsNmsIdx]}[${scopeIds[scpIdsIdx]}]`
+      map = styleMap[cls]
+      if (!map) {
+        scpIdsIdx++
+        continue
+      }
+      for (const k in map) {
+        style[k] = map[k]
+      }
+      scpIdsIdx++
+    }
+    clsNmsIdx++
+  }
+  return style
+}
+
+/**
+ * get style merged with static styles, binding styles, and scoped class styles,
+ * with keys in camelcase.
+ */
+export function getComponentStyle (context) {
+  if (!context.$vnode) {
+    if (process.env.NODE_ENV === 'development') {
+      return console.error('[vue-render] getComponentStyle failed: no $vnode in context.')
+    }
+    return {}
+  }
+  const cached = context.$vnode.data.cached
+  const data = context.$vnode.data
+  const staticClassNames = (typeof data.staticClass === 'string') ? data.staticClass.split(' ') : (data.staticClass || [])
+  const classNames = (typeof data.class === 'string') ? data.class.split(' ') : (data.class || [])
+  const clsNms = staticClassNames.concat(classNames)
+  const style = getScopeStyle(context, clsNms)
+  const res = extend(style, cached, data.staticStyle, data.style)
+  context.$vnode.data.cached = res
+  return addPrefix(normalizeStyle(camelizeKeys(res)))
+}
+
+export function extractComponentStyle (context) {
+  const style = getComponentStyle(context)
+  if (style) {
+    delete context.$vnode.data.staticStyle
+    delete context.$vnode.data.style
+  }
+  return style
+}
+
+/**
+ * get { width, height } (size) of current component from components' styles.
+ */
+export function getSize (context) {
+  if (!context.$vnode) {
+    if (process.env.NODE_ENV === 'development') {
+      return console.error('[vue-render] getComponentStyle failed: no $vnode in context.')
+    }
+    return {}
+  }
+  const data = context.$vnode.data
+  const wh = {}
+  const classes = typeof data.class === 'string' ? data.class.split(' ') : (data.class || [])
+  const staticClass = typeof data.staticClass === 'string' ? data.staticClass.split(' ') : (data.class || [])
+  const clsNms = staticClass.concat(classes)
+  function extendWHFrom (to, from) {
+    if (!from) { return }
+    from.width && (to.width = from.width)
+    from.height && (to.height = from.height)
+  }
+  extendWHFrom(wh, this._getScopeStyle(clsNms))
+  extendWHFrom(wh, data.staticStyle)
+  extendWHFrom(wh, data.style)
+  return wh
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/render/vue/env/index.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/env/index.js b/html5/render/vue/env/index.js
index d273ee1..1eb3d21 100644
--- a/html5/render/vue/env/index.js
+++ b/html5/render/vue/env/index.js
@@ -1,5 +1,5 @@
-import '../styles/reset.css'
-import '../styles/components.css'
+import css from '../styles/reset.css'
+import '../styles/base.css'
 
 // import 'lazyimg'
 import '../../browser/render/gesture'

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/render/vue/env/viewport.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/env/viewport.js b/html5/render/vue/env/viewport.js
index db68c82..5a80893 100644
--- a/html5/render/vue/env/viewport.js
+++ b/html5/render/vue/env/viewport.js
@@ -1,3 +1,7 @@
+// @flow
+
+import { extend } from '../utils/func'
+
 /**
  * viewport priority:
  *
@@ -6,65 +10,159 @@
  * 3. process.env.VIEWPORT_WIDTH (buid time)
  *
  */
-let viewportWidth = process.env.VIEWPORT_WIDTH
+let isInited = false
+const DEFAULT_VIEWPORT_WIDTH = 750
+
+/**
+ * get viewport width from weex-viewport meta.
+ */
+const envViewportWidth = parseInt(process.env.VIEWPORT_WIDTH)
+let width: number = !isNaN(envViewportWidth) && envViewportWidth > 0
+  ? envViewportWidth
+  : DEFAULT_VIEWPORT_WIDTH
 
-const wxViewportMeta = document.querySelector('meta[name="weex-viewport"]')
+let wxViewportMeta = document.querySelector('meta[name="weex-viewport"]')
 const metaWidth = wxViewportMeta && parseInt(wxViewportMeta.getAttribute('content'))
-if (metaWidth && !isNaN(metaWidth) && metaWidth > 0) { viewportWidth = metaWidth }
+if (metaWidth && !isNaN(metaWidth) && metaWidth > 0) {
+  width = metaWidth
+}
+
+let dpr: number = 0
+let deRect: mixed = null
+let screenWidth: number = 0
+let screenHeight: number = 0
+
+const info: {
+  dpr: number,
+  scale: number,
+  rem: number,
+  deviceWidth: number,
+  deviceHeight: number
+} = {
+  dpr,
+  scale: 0,
+  rem: 0,
+  deviceWidth: 0,
+  deviceHeight: 0
+}
 
 /**
  * set root font-size for rem units. If already been set, just skip this.
  */
-function setRootFont (doc, width) {
+function setRootFont (width: number): void {
+  const doc = window.document
+  const rem = width / 10
+  if (!doc.documentElement) { return }
   const rootFontSize = doc.documentElement.style.fontSize
   if (!rootFontSize) {
-    doc.documentElement.style.fontSize = width / 10 + 'px'
+    doc.documentElement.style.fontSize = rem + 'px'
+    info.rem = rem
   }
 }
 
-export function setViewport (config = {}) {
-  const doc = window.document
+function setMetaViewport (width: number): void {
+  if (!wxViewportMeta) {
+    wxViewportMeta = document.createElement('meta')
+    wxViewportMeta.setAttribute('name', 'weex-viewport')
+  }
+  else {
+    const metaWidth = parseInt(wxViewportMeta.getAttribute('content'))
+    if (metaWidth === width) {
+      return
+    }
+  }
+  wxViewportMeta.setAttribute('content', width + '')
+}
+
+/**
+ * export viewport info.
+ */
+export function init (viewportWidth: number = width): ?{
+  dpr: number,
+  scale: number,
+  rem: number,
+  deviceWidth: number,
+  deviceHeight: number
+} {
+  if (!isInited) {
+    isInited = true
+
+    const doc = window.document
+    if (!doc) {
+      console.error('[vue-render] window.document is undfined.')
+      return
+    }
+    if (!doc.documentElement) {
+      console.error('[vue-render] document.documentElement is undfined.')
+      return
+    }
+
+    dpr = info.dpr = window.devicePixelRatio
+    deRect = doc.documentElement.getBoundingClientRect()
+    screenWidth = deRect.width
+    screenHeight = deRect.height
 
-  if (doc) {
     // set root font for rem.
-    setRootFont(doc, viewportWidth)
+    setRootFont(screenWidth)
+    setMetaViewport(viewportWidth)
 
     /**
      * why not to use window.screen.width to get screenWidth ? Because in some
      * old webkit browser on android system it get the device pixel width, which
      * is the screenWidth multiply by the device pixel ratio.
+     * e.g. ip6 -> get 375 for virtual screen width.
      */
-    const deRect = document.documentElement.getBoundingClientRect()
-    const screenWidth = deRect.width
-    const screenHeight = deRect.height
     const scale = screenWidth / viewportWidth
-
     /**
-     * if set initial/maximum/mimimum-scale some how the page will have a bounce
+     * 1. if set initial/maximum/mimimum-scale some how the page will have a bounce
      * effect when user drag the page towards horizontal axis.
+     * 2. Due to compatibility reasons, not to use viewport meta anymore. Just bring
+     * a parameter scale into the style value processing.
      */
-    const contents = [
-      `width=${viewportWidth}`,
-      // `initial-scale=${scale}`,
-      // `maximum-scale=${scale}`,
-      // `minimum-scale=${scale}`,
-      `user-scalable=no`
-    ]
-
-    let meta = doc.querySelector('meta[name="viewport"]')
-    if (!meta) {
-      meta = doc.createElement('meta')
-      meta.setAttribute('name', 'viewport')
-      document.querySelector('head').appendChild(meta)
-    }
-    meta.setAttribute('content', contents.join(','))
 
-    const dpr = window.devicePixelRatio
+    // const contents = [
+    //   `width=${viewportWidth}`,
+    //   `initial-scale=${scale}`,
+    //   `maximum-scale=${scale}`,
+    //   `minimum-scale=${scale}`,
+    //   `user-scalable=no`
+    // ]
+
+    // let meta = doc.querySelector('meta[name="viewport"]')
+    // if (!meta) {
+    //   meta = doc.createElement('meta')
+    //   meta.setAttribute('name', 'viewport')
+    //   document.querySelector('head').appendChild(meta)
+    // }
+    // meta.setAttribute('content', contents.join(','))
 
-    return {
+    extend(info, {
       scale,
       deviceWidth: screenWidth * dpr,
       deviceHeight: screenHeight * dpr
-    }
+    })
   }
+
+  return info
+}
+
+/**
+ * reset viewport width and scale.
+ * @return new scale.
+ */
+export function resetViewport (viewportWidth: number): number {
+  setMetaViewport(viewportWidth)
+  const newScale = screenWidth / viewportWidth
+  info.scale = newScale
+  return newScale
+}
+
+export function getViewportInfo (): {
+  dpr: number,
+  scale: number,
+  rem: number,
+  deviceWidth: number,
+  deviceHeight: number
+} {
+  return info
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/render/vue/env/weex.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/env/weex.js b/html5/render/vue/env/weex.js
index 685e5b3..8b2c7d5 100644
--- a/html5/render/vue/env/weex.js
+++ b/html5/render/vue/env/weex.js
@@ -8,7 +8,7 @@ const weexModules = {}
 const weex = {
   __vue__: null,
   utils,
-  units: window.CSS_UNIT,
+  // units: window.CSS_UNIT,
   config: {
     env: window.WXEnvironment,
     bundleUrl: location.href

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/render/vue/env/wx-env.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/env/wx-env.js b/html5/render/vue/env/wx-env.js
index 4c5f8e4..011b412 100644
--- a/html5/render/vue/env/wx-env.js
+++ b/html5/render/vue/env/wx-env.js
@@ -1,48 +1,52 @@
 import 'envd'
 
-import { setViewport } from './viewport'
+import { init as initViewport } from './viewport'
 import { extend } from '../utils'
 
-const scaleInfo = setViewport()
-
-const lib = window.lib
-const env = {
-  platform: 'Web',
-  // weexVersion: '0.10.0', // TODO: get version from package.json (not sure)
-  weexVersion: 'process.env.WEEX_VERSION',
-  userAgent: navigator.userAgent,
-  appName: lib.env.aliapp ? lib.env.aliapp.appname : navigator.appName,
-  appVersion: lib.env.aliapp ? lib.env.aliapp.version.val : null,
-  osName: lib.env.browser ? lib.env.browser.name : null,
-  osVersion: lib.env.browser ? lib.env.browser.version.val : null,
-  deviceModel: lib.env.os.name || null
-}
-
 /**
- * scaleInfo: scale, deviceWidth, deviceHeight.
+ * get WXEnvironment info.
+ * @param  {object} viewportInfo: info about viewport.
+ * @param  {object} envInfo: info parsed from lib.env.
  */
-extend(env, scaleInfo)
-
-// 750 by default currently
-const scale = env.scale
-
-const units = {
-  REM: 12 * scale,
-  VW: env.deviceWidth / 100,
-  VH: env.deviceHeight / 100,
-  VMIN: Math.min(env.deviceWidth, env.deviceHeight) / 100,
-  VMAX: Math.max(env.deviceWidth, env.deviceHeight) / 100,
-  CM: 96 / 2.54 * scale,
-  MM: 96 / 25.4 * scale,
-  Q: 96 / 25.4 / 4 * scale,
-  IN: 96 * scale,
-  PT: 96 / 72 * scale,
-  PC: 96 / 6 * scale,
-  PX: scale
+export function initEnv (viewportInfo, envInfo) {
+  const env = {
+    platform: 'Web',
+    weexVersion: 'process.env.WEEX_VERSION',
+    userAgent: navigator.userAgent,
+    appName: envInfo.aliapp ? envInfo.aliapp.appname : navigator.appName,
+    appVersion: envInfo.aliapp ? envInfo.aliapp.version.val : null,
+    osName: envInfo.browser ? envInfo.browser.name : null,
+    osVersion: envInfo.browser ? envInfo.browser.version.val : null,
+    deviceModel: envInfo.os.name || null
+  }
+  /**
+   * viewportInfo: scale, deviceWidth, deviceHeight. dpr
+   */
+  return extend(env, viewportInfo)
 }
 
-Object.freeze(units)
+// const viewportInfo = initViewport()
+
+// 750 by default currently
+// const scale = viewportInfo.scale
+
+// const units = {
+//   REM: 12 * scale,
+//   VW: viewportInfo.deviceWidth / 100,
+//   VH: viewportInfo.deviceHeight / 100,
+//   VMIN: Math.min(viewportInfo.deviceWidth, viewportInfo.deviceHeight) / 100,
+//   VMAX: Math.max(viewportInfo.deviceWidth, viewportInfo.deviceHeight) / 100,
+//   CM: 96 / 2.54 * scale,
+//   MM: 96 / 25.4 * scale,
+//   Q: 96 / 25.4 / 4 * scale,
+//   IN: 96 * scale,
+//   PT: 96 / 72 * scale,
+//   PC: 96 / 6 * scale,
+//   PX: scale
+// }
+
+// Object.freeze(units)
 // Object.freeze(env)
 
-window.CSS_UNIT = units
-window.WXEnvironment = env
+// window.CSS_UNIT = units
+window.WXEnvironment = initEnv(initViewport(), window.lib.env)

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/render/vue/mixins/base.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/mixins/base.js b/html5/render/vue/mixins/base.js
index dba7688..ca30e0c 100644
--- a/html5/render/vue/mixins/base.js
+++ b/html5/render/vue/mixins/base.js
@@ -23,16 +23,6 @@ function watchLazyload () {
   })
 }
 
-let warned = false
-const notePage = 'https://github.com/MrRaindrop/weex/issues/14'
-function warnProcessStyle () {
-  if (!warned) {
-    warned = true
-    console.warn(`[vue-render] warn: should add loader config using $processStyle to enable`
-      + ` inline styles's auto-prefixing. see ${notePage}. If already did it, please ignore this.`)
-  }
-}
-
 export default {
   beforeCreate () {
     if (!lazyloadWatched) {
@@ -48,9 +38,6 @@ export default {
       weex._root = this.$root.$el
       weex._root.classList.add('weex-root')
     }
-    if (!warned && !window._style_processing_added) {
-      warnProcessStyle()
-    }
     watchAppear(this)
     if (process.env.NODE_ENV === 'development') {
       tagMounted()

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/render/vue/mixins/style.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/mixins/style.js b/html5/render/vue/mixins/style.js
index 5d841f2..051e6e3 100644
--- a/html5/render/vue/mixins/style.js
+++ b/html5/render/vue/mixins/style.js
@@ -3,6 +3,7 @@ import {
   hyphenateKeys,
   extend,
   trimComment
+  // normalizeStyle
 } from '../utils'
 import { tagBegin, tagEnd } from '../utils/perf'
 import addPrefix from 'inline-style-prefixer/static'
@@ -90,6 +91,19 @@ export default {
       return hyphenateKeys(addPrefix(camelizeKeys(style)))
     },
 
+    _mergeStyle (data) {
+      const res = {}
+      const style = data.style
+      const staticStyle = data.staticStyle
+      const classes = typeof data.class === 'string' ? data.class.split(' ') : (data.class || [])
+      const staticClass = typeof data.staticClass === 'string' ? data.staticClass.split(' ') : (data.class || [])
+      const clsNms = staticClass.concat(classes)
+      extend(res, this._getScopeStyle(clsNms))
+      extend(res, staticStyle)
+      extend(res, style)
+      return hyphenateKeys(addPrefix(camelizeKeys(res)))
+    },
+
     _getScopeStyle (classNames) {
       const scopeIds = this._getScopeIds()
       const style = {}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/render/vue/styles/base.css
----------------------------------------------------------------------
diff --git a/html5/render/vue/styles/base.css b/html5/render/vue/styles/base.css
new file mode 100644
index 0000000..656f3b3
--- /dev/null
+++ b/html5/render/vue/styles/base.css
@@ -0,0 +1,513 @@
+.weex-root * {
+  border-width: 0;
+  border-color: inherit;
+  border-style: solid;
+}
+
+.weex-flex-ct {
+  display: -webkit-box;
+  display: -webkit-flex;
+  display: flex;
+}
+
+.weex-ct {
+  box-sizing: border-box;
+  display: -webkit-box;
+  display: -webkit-flex;
+  display: flex;
+  position: relative;
+  -webkit-box-orient: vertical;
+  -webkit-flex-direction: column;
+  flex-direction: column;
+  -webkit-flex-shrink: 0;
+  -ms-flex-negative: 0;
+  flex-shrink: 0;
+  -webkit-flex-grow: 0;
+  -ms-flex-grow: 0;
+  flex-grow: 0;
+  -webkit-flex-basis: auto;
+  flex-basis: auto;
+  -webkit-box-align: stretch;
+  -webkit-align-items: stretch;
+  -ms-flex-align: stretch;
+  align-items: stretch;
+  -webkit-align-content: flex-start;
+  -ms-flex-line-pack: start;
+  align-content: flex-start;
+  border: 0 solid black;
+  margin: 0;
+  padding: 0;
+  min-width: 0;
+}
+
+.weex-ct.horizontal {
+  -webkit-box-orient: horizontal;
+  -webkit-flex-direction: row;
+  flex-direction: row;
+}
+
+.weex-el {
+  display: block;
+  box-sizing: border-box;
+  position: relative;
+  -webkit-flex-shrink: 0;
+  -ms-flex-negative: 0;
+  flex-shrink: 0;
+  -webkit-flex-grow: 0;
+  -ms-flex-grow: 0;
+  flex-grow: 0;
+  -webkit-flex-basis: auto;
+  flex-basis: auto;
+  border: 0 solid black;
+  margin: 0;
+  padding: 0;
+  min-width: 0;
+}
+
+
+
+body > .weex-div {
+  min-height: 100%;
+}
+
+.weex-input, .weex-textarea {
+  font-size: 0.426667rem;
+}
+.weex-input:focus, .weex-textarea:focus {
+  outline: none;
+}
+
+.weex-image, .weex-img {
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+
+.weex-toast {
+  font-size: 0.426667rem;
+  line-height: 0.426667rem;
+  position: fixed;
+  z-index: 1999999999;
+  box-sizing: border-box;
+  max-width: 80%;
+  bottom: 50%;
+  left: 50%;
+  padding: 0.213333rem;
+  background-color: #000;
+  color: #fff;
+  text-align: center;
+  opacity: 0.6;
+  -webkit-transition: all 0.4s ease-in-out;
+          transition: all 0.4s ease-in-out;
+  border-radius: 0.066667rem;
+  -webkit-transform: translateX(-50%);
+  -ms-transform: translateX(-50%);
+      transform: translateX(-50%);
+}
+
+.weex-toast.hide {
+  opacity: 0;
+}
+
+.weex-alert .weex-alert-ok {
+  width: 100%;
+}
+
+.weex-confirm .btn-group .btn {
+  float: left;
+  width: 50%;
+}
+
+.weex-confirm .btn-group .btn.btn-ok {
+  border-right: 0.013333rem solid #ddd;
+}
+
+.weex-modal-wrap {
+  display: none;
+  position: fixed;
+  z-index: 999999999;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background-color: #000;
+  opacity: 0.5;
+}
+
+.weex-modal-node {
+  position: fixed;
+  z-index: 9999999999;
+  top: 50%;
+  left: 50%;
+  width: 6.666667rem;
+  min-height: 2.666667rem;
+  border-radius: 0.066667rem;
+  -webkit-transform: translate(-50%, -50%);
+  -ms-transform: translate(-50%, -50%);
+      transform: translate(-50%, -50%);
+  background-color: #fff;
+}
+
+.weex-modal-node.hide {
+  display: none;
+}
+
+.weex-modal-node .content {
+  display: -webkit-box;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-box-orient: vertical;
+  -webkit-flex-direction: column;
+  -ms-flex-direction: column;
+      flex-direction: column;
+  -webkit-box-align: center;
+  -webkit-align-items: center;
+  -ms-flex-align: center;
+      align-items: center;
+  -webkit-box-pack: center;
+  -webkit-justify-content: center;
+  -ms-flex-pack: center;
+      justify-content: center;
+  width: 100%;
+  min-height: 1.866667rem;
+  box-sizing: border-box;
+  font-size: 0.426667rem;
+  line-height: 0.426667rem;
+  padding: 0.213333rem;
+  border-bottom: 0.013333rem solid #ddd;
+}
+
+.weex-modal-node .btn-group {
+  width: 100%;
+  height: 0.8rem;
+  font-size: 0.373333rem;
+  text-align: center;
+  margin: 0;
+  padding: 0;
+  border: none;
+}
+
+.amfe-modal-node .btn-group .btn {
+  text-align: center;
+}
+
+.weex-modal-node .btn-group .btn {
+  box-sizing: border-box;
+  height: 0.8rem;
+  line-height: 0.8rem;
+  margin: 0;
+  padding: 0;
+  border: none;
+  background: none;
+  text-align: center;
+}
+
+.weex-prompt .input-wrap {
+  box-sizing: border-box;
+  width: 100%;
+  margin-top: 0.133333rem;
+  height: 0.96rem;
+}
+
+.weex-prompt .input-wrap .input {
+  box-sizing: border-box;
+  width: 100%;
+  height: 0.56rem;
+  line-height: 0.56rem;
+  font-size: 0.426667rem;
+  border: 0.013333rem solid #999;
+}
+
+.weex-prompt .btn-group .btn {
+  float: left;
+  width: 50%;
+}
+
+.weex-prompt .btn-group .btn.btn-ok {
+  border-right: 0.013333rem solid #ddd;
+}
+
+body > .weex-list,
+body > .weex-scroller {
+  max-height: 100%;
+}
+
+.weex-list-wrapper,
+.weex-scroller-wrapper {
+  -webkit-overflow-scrolling: touch;
+}
+
+.weex-list-wrapper {
+  overflow-y: scroll !important;
+}
+
+.weex-list-inner,
+.weex-scroller-inner {
+  -webkit-overflow-scrolling: touch;
+  width: 100%;
+}
+
+.weex-scroller-inner::-webkit-scrollbar {
+    width: 0;
+}
+
+.weex-scroller-wrapper.weex-scroller-vertical {
+  overflow-x: hidden;
+  overflow-y: scroll;
+}
+
+.weex-scroller-wrapper.weex-scroller-horizontal {
+  overflow-x: scroll;
+  overflow-y: hidden;
+}
+
+.weex-scroller-horizontal .weex-scroller-inner {
+  -webkit-flex-direction: row;
+      -ms-flex-direction: row;
+          flex-direction: row;
+  -webkit-box-orient: horizontal;
+  height: 100%;
+}
+
+.iossticky {
+  position: -webkit-sticky !important;
+  position: sticky !important;
+  z-index: 9999;
+  top: 0;
+}
+
+.sticky {
+  position: fixed;
+  top: 0;
+  z-index: 9999;
+}
+
+.weex-cell {
+  width: 100%;
+}
+
+.weex-refresh,
+.weex-loading {
+  -webkit-box-align: center;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+  -webkit-box-pack: center;
+  -webkit-justify-content: center;
+      -ms-flex-pack: center;
+          justify-content: center;
+  width: 100%;
+  overflow: hidden;
+}
+
+.weex-slider-wrapper {
+  overflow: hidden;
+}
+
+.weex-slider-inner {
+  position: absolute;
+  height: 100%;
+  top: 0;
+  left: 0;
+}
+
+.weex-slider-cell {
+  display: block;
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  margin: 0;
+  padding: 0;
+  height: 100%;
+  overflow: hidden;
+}
+
+.weex-indicator {
+  position: absolute;
+  z-index: 10;
+  -webkit-flex-direction: row;
+  -ms-flex-direction: row;
+  flex-direction: row;
+  -webkit-box-orient: horizontal;
+  margin: 0;
+  padding: 0;
+}
+
+.weex-indicator-item {
+  display: inline-block;
+  position: relative;
+  border-radius: 50%;
+  width: 0.266667rem;
+  height: 0.266667rem;
+  background-color: #BBBBBB;
+}
+.weex-indicator-item + .weex-indicator-item {
+  margin-left: 0.133333rem;
+}
+
+.weex-indicator-item-active {
+  background-color: blue;
+}
+
+.weex-refresh-indicator,
+.weex-loading-indicator {
+  width: 1.0rem;
+  height: 1.0rem;
+  -webkit-box-align: center;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+  -webkit-box-pack: center;
+  -webkit-justify-content: center;
+      -ms-flex-pack: center;
+          justify-content: center;
+  overflow: visible;
+  background: none;
+}
+.weex-refresh-indicator:before,
+.weex-loading-indicator:before {
+  display: block;
+  content: '';
+  font-size: 0.16rem;
+  width: 1em;
+  height: 1em;
+  left: -60%;
+  top: 40%;
+  border-radius: 50%;
+  position: relative;
+  text-indent: -9999em;
+  -webkit-animation: weex-spinner 1.1s infinite ease;
+          animation: weex-spinner 1.1s infinite ease;
+  -webkit-transform: translate3d(1.0rem, 0, 0);
+          transform: translate3d(1.0rem, 0, 0);
+}
+
+@-webkit-keyframes weex-spinner {
+  0%,
+  100% {
+    box-shadow: 0em -2.6em 0em 0em #ffffff, 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.5), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.7);
+  }
+  12.5% {
+    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.7), 1.8em -1.8em 0 0em #ffffff, 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.5);
+  }
+  25% {
+    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.5), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.7), 2.5em 0em 0 0em #ffffff, 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
+  }
+  37.5% {
+    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.5), 2.5em 0em 0 0em rgba(255, 255, 255, 0.7), 1.75em 1.75em 0 0em #ffffff, 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
+  }
+  50% {
+    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.5), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.7), 0em 2.5em 0 0em #ffffff, -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
+  }
+  62.5% {
+    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.5), 0em 2.5em 0 0em rgba(255, 255, 255, 0.7), -1.8em 1.8em 0 0em #ffffff, -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
+  }
+  75% {
+    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.5), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.7), -2.6em 0em 0 0em #ffffff, -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
+  }
+  87.5% {
+    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.5), -2.6em 0em 0 0em rgba(255, 255, 255, 0.7), -1.8em -1.8em 0 0em #ffffff;
+  }
+}
+
+@keyframes weex-spinner {
+  0%,
+  100% {
+    box-shadow: 0em -2.6em 0em 0em #ffffff, 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.5), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.7);
+  }
+  12.5% {
+    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.7), 1.8em -1.8em 0 0em #ffffff, 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.5);
+  }
+  25% {
+    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.5), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.7), 2.5em 0em 0 0em #ffffff, 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
+  }
+  37.5% {
+    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.5), 2.5em 0em 0 0em rgba(255, 255, 255, 0.7), 1.75em 1.75em 0 0em #ffffff, 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
+  }
+  50% {
+    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.5), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.7), 0em 2.5em 0 0em #ffffff, -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
+  }
+  62.5% {
+    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.5), 0em 2.5em 0 0em rgba(255, 255, 255, 0.7), -1.8em 1.8em 0 0em #ffffff, -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
+  }
+  75% {
+    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.5), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.7), -2.6em 0em 0 0em #ffffff, -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
+  }
+  87.5% {
+    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.5), -2.6em 0em 0 0em rgba(255, 255, 255, 0.7), -1.8em -1.8em 0 0em #ffffff;
+  }
+}
+.weex-switch {
+  border: 0.013333rem solid #dfdfdf;
+  cursor: pointer;
+  display: inline-block;
+  position: relative;
+  vertical-align: middle;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  box-sizing: content-box;
+  background-clip: content-box;
+  color: #64bd63;
+  width: 1.333333rem;
+  height: 0.8rem;
+  background-color: white;
+  border-color: #dfdfdf;
+  box-shadow: #dfdfdf 0 0 0 0 inset;
+  border-radius: 0.8rem;
+  -webkit-transition: border 0.4s, box-shadow 0.4s, background-color 1.2s;
+          transition: border 0.4s, box-shadow 0.4s, background-color 1.2s;
+}
+
+.weex-switch-checked {
+  background-color: #64bd63;
+  border-color: #64bd63;
+  box-shadow: #64bd63 0 0 0 0.533333rem inset;
+}
+
+.weex-switch-checked.weex-switch-disabled {
+  background-color: #A0CCA0;
+  box-shadow: #A0CCA0 0 0 0 0.533333rem inset;
+}
+
+.weex-switch-disabled {
+  background-color: #EEEEEE;
+}
+
+.weex-switch-inner {
+  width: 0.8rem;
+  height: 0.8rem;
+  background: #fff;
+  border-radius: 100%;
+  box-shadow: 0 0.013333rem 0.04rem rgba(0, 0, 0, 0.4);
+  position: absolute;
+  top: 0;
+  left: 0;
+  -webkit-transition: background-color 0.4s, left 0.2s;
+          transition: background-color 0.4s, left 0.2s;
+}
+
+.weex-switch-checked > .weex-switch-inner {
+  left: 0.533333rem;
+}
+
+.weex-text {
+  display: -webkit-box;
+  -webkit-box-orient: vertical;
+  position: relative;
+  white-space: pre-wrap;  /* not using 'pre': support auto line feed. */
+  font-size: 0.426667rem;
+  word-wrap: break-word;
+  overflow: hidden; /* it'll be clipped if the height is not high enough. */
+}
+
+.weex-web {
+  position: relative;
+  width: 100%;
+  height: 100%;
+  border: none;
+  box-sizing: border-box;
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/render/vue/styles/components.css
----------------------------------------------------------------------
diff --git a/html5/render/vue/styles/components.css b/html5/render/vue/styles/components.css
deleted file mode 100644
index 47d2f2a..0000000
--- a/html5/render/vue/styles/components.css
+++ /dev/null
@@ -1,513 +0,0 @@
-.weex-root * {
-  border-width: 0;
-  border-color: inherit;
-  border-style: solid;
-}
-
-.weex-flex-ct {
-  display: -webkit-box;
-  display: -webkit-flex;
-  display: flex;
-}
-
-.weex-ct {
-  box-sizing: border-box;
-  display: -webkit-box;
-  display: -webkit-flex;
-  display: flex;
-  position: relative;
-  -webkit-box-orient: vertical;
-  -webkit-flex-direction: column;
-  flex-direction: column;
-  -webkit-flex-shrink: 0;
-  -ms-flex-negative: 0;
-  flex-shrink: 0;
-  -webkit-flex-grow: 0;
-  -ms-flex-grow: 0;
-  flex-grow: 0;
-  -webkit-flex-basis: auto;
-  flex-basis: auto;
-  -webkit-box-align: stretch;
-  -webkit-align-items: stretch;
-  -ms-flex-align: stretch;
-  align-items: stretch;
-  -webkit-align-content: flex-start;
-  -ms-flex-line-pack: start;
-  align-content: flex-start;
-  border: 0 solid black;
-  margin: 0;
-  padding: 0;
-  min-width: 0;
-}
-
-.weex-ct.horizontal {
-  -webkit-box-orient: horizontal;
-  -webkit-flex-direction: row;
-  flex-direction: row;
-}
-
-.weex-el {
-  display: block;
-  box-sizing: border-box;
-  position: relative;
-  -webkit-flex-shrink: 0;
-  -ms-flex-negative: 0;
-  flex-shrink: 0;
-  -webkit-flex-grow: 0;
-  -ms-flex-grow: 0;
-  flex-grow: 0;
-  -webkit-flex-basis: auto;
-  flex-basis: auto;
-  border: 0 solid black;
-  margin: 0;
-  padding: 0;
-  min-width: 0;
-}
-
-.weex-a {
-  text-decoration: none;
-}
-
-body > .weex-div {
-  min-height: 100%;
-}
-
-.weex-input, .weex-textarea {
-  font-size: 0.426667rem;
-}
-.weex-input:focus, .weex-textarea:focus {
-  outline: none;
-}
-
-.weex-image, .weex-img {
-  background-repeat: no-repeat;
-  background-position: 50% 50%;
-}
-
-.weex-toast {
-  font-size: 0.426667rem;
-  line-height: 0.426667rem;
-  position: fixed;
-  z-index: 1999999999;
-  box-sizing: border-box;
-  max-width: 80%;
-  bottom: 50%;
-  left: 50%;
-  padding: 0.213333rem;
-  background-color: #000;
-  color: #fff;
-  text-align: center;
-  opacity: 0.6;
-  -webkit-transition: all 0.4s ease-in-out;
-          transition: all 0.4s ease-in-out;
-  border-radius: 0.066667rem;
-  -webkit-transform: translateX(-50%);
-  -ms-transform: translateX(-50%);
-      transform: translateX(-50%);
-}
-
-.weex-toast.hide {
-  opacity: 0;
-}
-
-.weex-alert .weex-alert-ok {
-  width: 100%;
-}
-
-.weex-confirm .btn-group .btn {
-  float: left;
-  width: 50%;
-}
-
-.weex-confirm .btn-group .btn.btn-ok {
-  border-right: 0.013333rem solid #ddd;
-}
-
-.weex-modal-wrap {
-  display: none;
-  position: fixed;
-  z-index: 999999999;
-  top: 0;
-  left: 0;
-  width: 100%;
-  height: 100%;
-  background-color: #000;
-  opacity: 0.5;
-}
-
-.weex-modal-node {
-  position: fixed;
-  z-index: 9999999999;
-  top: 50%;
-  left: 50%;
-  width: 6.666667rem;
-  min-height: 2.666667rem;
-  border-radius: 0.066667rem;
-  -webkit-transform: translate(-50%, -50%);
-  -ms-transform: translate(-50%, -50%);
-      transform: translate(-50%, -50%);
-  background-color: #fff;
-}
-
-.weex-modal-node.hide {
-  display: none;
-}
-
-.weex-modal-node .content {
-  display: -webkit-box;
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-orient: vertical;
-  -webkit-flex-direction: column;
-  -ms-flex-direction: column;
-      flex-direction: column;
-  -webkit-box-align: center;
-  -webkit-align-items: center;
-  -ms-flex-align: center;
-      align-items: center;
-  -webkit-box-pack: center;
-  -webkit-justify-content: center;
-  -ms-flex-pack: center;
-      justify-content: center;
-  width: 100%;
-  min-height: 1.866667rem;
-  box-sizing: border-box;
-  font-size: 0.426667rem;
-  line-height: 0.426667rem;
-  padding: 0.213333rem;
-  border-bottom: 0.013333rem solid #ddd;
-}
-
-.weex-modal-node .btn-group {
-  width: 100%;
-  height: 0.8rem;
-  font-size: 0.373333rem;
-  text-align: center;
-  margin: 0;
-  padding: 0;
-  border: none;
-}
-
-.amfe-modal-node .btn-group .btn {
-  text-align: center;
-}
-
-.weex-modal-node .btn-group .btn {
-  box-sizing: border-box;
-  height: 0.8rem;
-  line-height: 0.8rem;
-  margin: 0;
-  padding: 0;
-  border: none;
-  background: none;
-  text-align: center;
-}
-
-.weex-prompt .input-wrap {
-  box-sizing: border-box;
-  width: 100%;
-  margin-top: 0.133333rem;
-  height: 0.96rem;
-}
-
-.weex-prompt .input-wrap .input {
-  box-sizing: border-box;
-  width: 100%;
-  height: 0.56rem;
-  line-height: 0.56rem;
-  font-size: 0.426667rem;
-  border: 0.013333rem solid #999;
-}
-
-.weex-prompt .btn-group .btn {
-  float: left;
-  width: 50%;
-}
-
-.weex-prompt .btn-group .btn.btn-ok {
-  border-right: 0.013333rem solid #ddd;
-}
-
-body > .weex-list,
-body > .weex-scroller {
-  max-height: 100%;
-}
-
-.weex-list-wrapper,
-.weex-scroller-wrapper {
-  -webkit-overflow-scrolling: touch;
-}
-
-.weex-list-wrapper {
-  overflow-y: scroll !important;
-}
-
-.weex-list-inner,
-.weex-scroller-inner {
-  -webkit-overflow-scrolling: touch;
-  width: 100%;
-}
-
-.weex-scroller-inner::-webkit-scrollbar {
-    width: 0;
-}
-
-.weex-scroller-wrapper.weex-scroller-vertical {
-  overflow-y: scroll;
-}
-
-.weex-scroller-wrapper.weex-scroller-horizontal {
-  overflow-x: scroll;
-}
-
-.weex-scroller-horizontal .weex-scroller-inner {
-  -webkit-flex-direction: row;
-      -ms-flex-direction: row;
-          flex-direction: row;
-  -webkit-box-orient: horizontal;
-  height: 100%;
-}
-
-.iossticky {
-  position: -webkit-sticky !important;
-  position: sticky !important;
-  z-index: 9999;
-  top: 0;
-}
-
-.sticky {
-  position: fixed;
-  top: 0;
-  z-index: 9999;
-}
-
-.weex-cell {
-  width: 100%;
-}
-
-.weex-refresh,
-.weex-loading {
-  -webkit-box-align: center;
-  -webkit-align-items: center;
-      -ms-flex-align: center;
-          align-items: center;
-  -webkit-box-pack: center;
-  -webkit-justify-content: center;
-      -ms-flex-pack: center;
-          justify-content: center;
-  width: 100%;
-  overflow: hidden;
-}
-
-.weex-slider-wrapper {
-  overflow: hidden;
-}
-
-.weex-slider-inner {
-  position: absolute;
-  height: 100%;
-  top: 0;
-  left: 0;
-}
-
-.weex-slider-cell {
-  display: block;
-  position: absolute;
-  top: 0;
-  left: 0;
-  right: 0;
-  bottom: 0;
-  margin: 0;
-  padding: 0;
-  height: 100%;
-  overflow: hidden;
-}
-
-.weex-indicator {
-  position: absolute;
-  z-index: 10;
-  -webkit-flex-direction: row;
-  -ms-flex-direction: row;
-  flex-direction: row;
-  -webkit-box-orient: horizontal;
-  margin: 0;
-  padding: 0;
-}
-
-.weex-indicator-item {
-  display: inline-block;
-  position: relative;
-  border-radius: 50%;
-  width: 0.266667rem;
-  height: 0.266667rem;
-  background-color: #BBBBBB;
-}
-.weex-indicator-item + .weex-indicator-item {
-  margin-left: 0.133333rem;
-}
-
-.weex-indicator-item-active {
-  background-color: blue;
-}
-
-.weex-refresh-indicator,
-.weex-loading-indicator {
-  width: 1.0rem;
-  height: 1.0rem;
-  -webkit-box-align: center;
-  -webkit-align-items: center;
-      -ms-flex-align: center;
-          align-items: center;
-  -webkit-box-pack: center;
-  -webkit-justify-content: center;
-      -ms-flex-pack: center;
-          justify-content: center;
-  overflow: visible;
-  background: none;
-}
-.weex-refresh-indicator:before,
-.weex-loading-indicator:before {
-  display: block;
-  content: '';
-  font-size: 0.16rem;
-  width: 1em;
-  height: 1em;
-  left: -60%;
-  top: 40%;
-  border-radius: 50%;
-  position: relative;
-  text-indent: -9999em;
-  -webkit-animation: weex-spinner 1.1s infinite ease;
-          animation: weex-spinner 1.1s infinite ease;
-  -webkit-transform: translate3d(1.0rem, 0, 0);
-          transform: translate3d(1.0rem, 0, 0);
-}
-
-@-webkit-keyframes weex-spinner {
-  0%,
-  100% {
-    box-shadow: 0em -2.6em 0em 0em #ffffff, 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.5), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.7);
-  }
-  12.5% {
-    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.7), 1.8em -1.8em 0 0em #ffffff, 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.5);
-  }
-  25% {
-    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.5), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.7), 2.5em 0em 0 0em #ffffff, 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
-  }
-  37.5% {
-    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.5), 2.5em 0em 0 0em rgba(255, 255, 255, 0.7), 1.75em 1.75em 0 0em #ffffff, 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
-  }
-  50% {
-    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.5), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.7), 0em 2.5em 0 0em #ffffff, -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
-  }
-  62.5% {
-    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.5), 0em 2.5em 0 0em rgba(255, 255, 255, 0.7), -1.8em 1.8em 0 0em #ffffff, -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
-  }
-  75% {
-    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.5), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.7), -2.6em 0em 0 0em #ffffff, -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
-  }
-  87.5% {
-    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.5), -2.6em 0em 0 0em rgba(255, 255, 255, 0.7), -1.8em -1.8em 0 0em #ffffff;
-  }
-}
-
-@keyframes weex-spinner {
-  0%,
-  100% {
-    box-shadow: 0em -2.6em 0em 0em #ffffff, 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.5), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.7);
-  }
-  12.5% {
-    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.7), 1.8em -1.8em 0 0em #ffffff, 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.5);
-  }
-  25% {
-    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.5), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.7), 2.5em 0em 0 0em #ffffff, 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
-  }
-  37.5% {
-    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.5), 2.5em 0em 0 0em rgba(255, 255, 255, 0.7), 1.75em 1.75em 0 0em #ffffff, 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
-  }
-  50% {
-    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.5), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.7), 0em 2.5em 0 0em #ffffff, -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
-  }
-  62.5% {
-    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.5), 0em 2.5em 0 0em rgba(255, 255, 255, 0.7), -1.8em 1.8em 0 0em #ffffff, -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
-  }
-  75% {
-    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.5), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.7), -2.6em 0em 0 0em #ffffff, -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
-  }
-  87.5% {
-    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.5), -2.6em 0em 0 0em rgba(255, 255, 255, 0.7), -1.8em -1.8em 0 0em #ffffff;
-  }
-}
-.weex-switch {
-  border: 0.013333rem solid #dfdfdf;
-  cursor: pointer;
-  display: inline-block;
-  position: relative;
-  vertical-align: middle;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  box-sizing: content-box;
-  background-clip: content-box;
-  color: #64bd63;
-  width: 1.333333rem;
-  height: 0.8rem;
-  background-color: white;
-  border-color: #dfdfdf;
-  box-shadow: #dfdfdf 0 0 0 0 inset;
-  border-radius: 0.8rem;
-  -webkit-transition: border 0.4s, box-shadow 0.4s, background-color 1.2s;
-          transition: border 0.4s, box-shadow 0.4s, background-color 1.2s;
-}
-
-.weex-switch-checked {
-  background-color: #64bd63;
-  border-color: #64bd63;
-  box-shadow: #64bd63 0 0 0 0.533333rem inset;
-}
-
-.weex-switch-checked.weex-switch-disabled {
-  background-color: #A0CCA0;
-  box-shadow: #A0CCA0 0 0 0 0.533333rem inset;
-}
-
-.weex-switch-disabled {
-  background-color: #EEEEEE;
-}
-
-.weex-switch-inner {
-  width: 0.8rem;
-  height: 0.8rem;
-  background: #fff;
-  border-radius: 100%;
-  box-shadow: 0 0.013333rem 0.04rem rgba(0, 0, 0, 0.4);
-  position: absolute;
-  top: 0;
-  left: 0;
-  -webkit-transition: background-color 0.4s, left 0.2s;
-          transition: background-color 0.4s, left 0.2s;
-}
-
-.weex-switch-checked > .weex-switch-inner {
-  left: 0.533333rem;
-}
-
-.weex-text {
-  display: -webkit-box;
-  -webkit-box-orient: vertical;
-  position: relative;
-  white-space: pre-wrap;  /* not using 'pre': support auto line feed. */
-  font-size: 0.426667rem;
-  word-wrap: break-word;
-  overflow: hidden; /* it'll be clipped if the height is not high enough. */
-}
-
-.weex-web {
-  position: relative;
-  width: 100%;
-  height: 100%;
-  border: none;
-  box-sizing: border-box;
-}



[23/23] incubator-weex git commit: Merge branch '0.12-dev' of https://git-wip-us.apache.org/repos/asf/incubator-weex into 0.12-dev

Posted by so...@apache.org.
Merge branch '0.12-dev' of https://git-wip-us.apache.org/repos/asf/incubator-weex into 0.12-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/8c90235c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/8c90235c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/8c90235c

Branch: refs/heads/0.12-dev
Commit: 8c90235c2b464ad224d09c984b699220c00a920e
Parents: b932600 3806842
Author: sospartan <so...@apache.org>
Authored: Thu Apr 13 10:31:45 2017 +0800
Committer: sospartan <so...@apache.org>
Committed: Thu Apr 13 10:31:45 2017 +0800

----------------------------------------------------------------------
 android/sdk/assets/main.js        | 15 ++++++++-------
 ios/sdk/WeexSDK/Resources/main.js | 15 ++++++++-------
 2 files changed, 16 insertions(+), 14 deletions(-)
----------------------------------------------------------------------



[02/23] incubator-weex git commit: * [html5] change viewport adapter, add unit tests for new adapting methods.

Posted by so...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/render/vue/utils/style.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/utils/style.js b/html5/render/vue/utils/style.js
index c7b5fe6..0dc1879 100644
--- a/html5/render/vue/utils/style.js
+++ b/html5/render/vue/utils/style.js
@@ -1,5 +1,16 @@
 // @flow
 
+import { getViewportInfo } from '../env/viewport'
+import addPrefix from 'inline-style-prefixer/static/index'
+
+const noUnitsNumberKeys = [
+  'flex',
+  'opacity',
+  'zIndex',
+  'fontWeight',
+  'lines'
+]
+
 /**
  * remove comments from a cssText.
  */
@@ -19,3 +30,102 @@ export function supportSticky (): boolean {
   support = elementStyle.position.indexOf('sticky') !== -1
   return support
 }
+
+const regPercentage = /^[+-]?\d+(\.\d+)?%$/
+export function isPercentage (val: string) {
+  return regPercentage.test(val)
+}
+
+const regUnitsNum = /^([+-]?\d+(?:\.\d+)?)([p,w]x)?$/ // support units: px, wx.
+export function normalizeUnitsNum (val: string): string {
+  const match = val.match(regUnitsNum)
+  if (!match) { return '' }
+  let unit = 'px' // px by default.
+  if (match[2]) {
+    unit = match[2]
+  }
+  return parseScale(parseFloat(match[1]), unit)
+}
+
+function parseScale (val: number, unit: string): string {
+  const { scale, dpr } = getViewportInfo()
+  const unitScaleMap = {
+    px: scale,
+    wx: scale * dpr
+  }
+  return val * unitScaleMap[unit] + 'px'
+}
+
+export function normalizeString (styleKey: string, styleVal: string): string {
+  if (isPercentage(styleVal)) {
+    return styleVal
+  }
+
+  // 1. test if is a regular scale css. e.g. `width: 100px;`
+  const unitsNum = normalizeUnitsNum(styleVal)
+  if (unitsNum) { return unitsNum }
+
+  // 2. test if is a translate scale. e.g. `transform: translate2d(1px, 2px);`
+  const regTranslateString = /translate[^(]*\([\d ,.pwx]+\)/i // unit support: wx, px.
+  if (styleKey.match(/transform/i) && regTranslateString.test(styleVal)) {
+    const val = styleVal.replace(regTranslateString, function (translate) {
+      const reg = /([+-]?\d+(?:\.\d+)?)([p,w]x)?(?![dD])/g
+      return translate.replace(reg, function (m, $1, $2) {
+        const unit = $2 || 'px'
+        return parseScale($1, unit)
+      })
+    })
+    return val
+  }
+
+  // 3. test if is a border style. e.g. `border: 1px solid red;`
+  const regBorderKey = /^border(?:-(?:top|bottom|left|right))?$/
+  const regBorderVal = /^([+-]?\d+(?:\.\d+)?)([p ,w]x)?\s+/
+  if (regBorderKey.test(styleKey) && regBorderVal.test(styleVal)) {
+    const reg = /^([+-]?\d+(?:\.\d+)?)([p,w]x)?/
+    const val = styleVal.replace(reg, function (m, $1, $2) {
+      const unit = $2 || 'px'
+      return parseScale($1, unit)
+    })
+    return val
+  }
+
+  // otherwise
+  return styleVal
+}
+
+export function autoPrefix (style: {}): {} {
+  return addPrefix(style)
+}
+
+export function normalizeNumber (styleKey: string, styleVal: number): string {
+  const { scale } = getViewportInfo()
+  return styleVal * scale + 'px'
+}
+
+/**
+ * normalize style to adapte to current viewport by multiply current scale.
+ * @param  {object} style: should be camelCase.
+ */
+export function normalizeStyle (style: {}) {
+  const res = {}
+  for (const key in style) {
+    const val = style[key]
+    if (noUnitsNumberKeys.indexOf(key) > -1) {
+      res[key] = val
+      continue
+    }
+    switch (typeof val) {
+      case 'string':
+        res[key] = normalizeString(key, val)
+        break
+      case 'number':
+        res[key] = normalizeNumber(key, val)
+        break
+      default:
+        res[key] = val
+        break
+    }
+  }
+  return res
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/test/render/vue/components/image.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/components/image.js b/html5/test/render/vue/components/image.js
index 241696a..cfe10e3 100644
--- a/html5/test/render/vue/components/image.js
+++ b/html5/test/render/vue/components/image.js
@@ -41,11 +41,11 @@ init('<image> component', (Vue, helper) => {
 
   it('<image> resize="stretch"', () => {
     const vm = compile(`<image resize="stretch"></image>`)
-    expect(vm.$el.style.backgroundSize).to.be.equal('100%')
+    expect(vm.$el.style.backgroundSize).to.contain('100%')
   })
 
   it('<image> unknown resize', () => {
     const vm = compile(`<image resize="unknown"></image>`)
-    expect(vm.$el.style.backgroundSize).to.be.equal('100%')
+    expect(vm.$el.style.backgroundSize).to.be.contain('100%')
   })
 })

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/test/render/vue/core/scope-style-map.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/core/scope-style-map.js b/html5/test/render/vue/core/scope-style-map.js
new file mode 100644
index 0000000..2ead7e8
--- /dev/null
+++ b/html5/test/render/vue/core/scope-style-map.js
@@ -0,0 +1,16 @@
+import {
+  getHeadStyleMap
+} from '../../../../render/vue/core/style'
+import '../data/head-css'
+import headMap from '../data/head-map'
+
+describe('style map', (Vue, helper) => {
+  it('should get head style map.', () => {
+    const styleMap = getHeadStyleMap()
+    for (const key in headMap) {
+      const expected = headMap[key]
+      const result = styleMap[key]
+      expect(expected).be.deep.equal(result)
+    }
+  })
+})

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/test/render/vue/core/style.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/core/style.js b/html5/test/render/vue/core/style.js
new file mode 100644
index 0000000..4b6b88f
--- /dev/null
+++ b/html5/test/render/vue/core/style.js
@@ -0,0 +1,59 @@
+import { init } from '../helper/runtime'
+import {
+  getScopeIds,
+  getScopeStyle,
+  getComponentStyle,
+  getSize
+} from '../../../../render/vue/core/style'
+import div from '../../../../render/vue/components/div'
+import image from '../../../../render/vue/components/image'
+import { init as initViewport, resetViewport } from '../../../../render/vue/env/viewport'
+
+import scopedStyleBundle from '../data/build/dotvue/scoped-style'
+
+init('core style', (Vue, helper) => {
+  const { compile, utils } = helper
+  const { scale } = initViewport()
+
+  before(() => {
+    helper.register('div', div)
+    helper.register('image', image)
+  })
+
+  it('should get normalized merged styles.', function () {
+    const vm = helper.createVm(scopedStyleBundle)
+    const el = vm.$refs.foo.$el
+    expect(el).to.be.ok
+
+    const expectedMap = {
+      width: 200 * scale + 'px',
+      height: 200 * scale + 'px',
+      backgroundColor: 'red'
+    }
+    const expectedDirection = {
+      WebkitBoxDirection: 'normal',
+      WebkitBoxOrient: 'horizontal',
+      WebkitFlexDirection: 'row',
+      flexDirection: 'row'
+    }
+    const expectedTransform = {
+      WebkitTransform: `translate3d(${100 * scale + 'px'}, ${100 * scale + 'px'}, 0px)`,
+      transform: `translate3d(${100 * scale + 'px'}, ${100 * scale + 'px'}, 0px)`
+    }
+
+   for (const k in expectedMap) {
+    expect(el.style[k]).to.equal(expectedMap[k])
+   }
+   const directionRes = []
+   for (const k in expectedDirection) {
+    directionRes.push(el.style[k] === expectedDirection[k])
+   }
+   expect(directionRes).to.include(true)
+
+   const transformRes = []
+   for (const k in expectedTransform) {
+    transformRes.push(el.style[k] === expectedTransform[k])
+   }
+   expect(transformRes).to.include(true)
+  })
+})

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/test/render/vue/data/build/dotvue/scoped-style.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/data/build/dotvue/scoped-style.js b/html5/test/render/vue/data/build/dotvue/scoped-style.js
new file mode 100644
index 0000000..b87ba8a
--- /dev/null
+++ b/html5/test/render/vue/data/build/dotvue/scoped-style.js
@@ -0,0 +1,525 @@
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(this, function() {
+return /******/ (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, __webpack_require__) {
+
+	
+	/* styles */
+	__webpack_require__(1)
+
+	var Component = __webpack_require__(6)(
+	  /* script */
+	  null,
+	  /* template */
+	  __webpack_require__(7),
+	  /* scopeId */
+	  "data-v-0776c87b",
+	  /* cssModules */
+	  null
+	)
+	Component.options.__file = "/Users/rdp/www/rdp/github/MrRaindrop/weex/html5/test/render/vue/data/dotvue/scoped-style.vue"
+	if (Component.esModule && Object.keys(Component.esModule).some(function (key) {return key !== "default" && key !== "__esModule"})) {console.error("named exports are not supported in *.vue files.")}
+	if (Component.options.functional) {console.error("[vue-loader] scoped-style.vue: functional components are not supported with templates, they should use render functions.")}
+
+	/* hot reload */
+	if (false) {(function () {
+	  var hotAPI = require("vue-loader/node_modules/vue-hot-reload-api")
+	  hotAPI.install(require("vue"), false)
+	  if (!hotAPI.compatible) return
+	  module.hot.accept()
+	  if (!module.hot.data) {
+	    hotAPI.createRecord("data-v-0776c87b", Component.options)
+	  } else {
+	    hotAPI.reload("data-v-0776c87b", Component.options)
+	  }
+	})()}
+
+	module.exports = Component.exports
+
+
+/***/ },
+/* 1 */
+/***/ function(module, exports, __webpack_require__) {
+
+	// style-loader: Adds some css to the DOM by adding a <style> tag
+
+	// load the styles
+	var content = __webpack_require__(2);
+	if(typeof content === 'string') content = [[module.id, content, '']];
+	if(content.locals) module.exports = content.locals;
+	// add the styles to the DOM
+	var update = __webpack_require__(4)("27230129", content, false);
+	// Hot Module Replacement
+	if(false) {
+	 // When the styles change, update the <style> tags
+	 if(!content.locals) {
+	   module.hot.accept("!!../../../../../../node_modules/.0.26.1@css-loader/index.js!../../../../../../node_modules/vue-loader/lib/style-compiler/index.js?{\"id\":\"data-v-0776c87b\",\"scoped\":true,\"hasInlineConfig\":false}!../../../../../../node_modules/vue-loader/lib/selector.js?type=styles&index=0!./scoped-style.vue", function() {
+	     var newContent = require("!!../../../../../../node_modules/.0.26.1@css-loader/index.js!../../../../../../node_modules/vue-loader/lib/style-compiler/index.js?{\"id\":\"data-v-0776c87b\",\"scoped\":true,\"hasInlineConfig\":false}!../../../../../../node_modules/vue-loader/lib/selector.js?type=styles&index=0!./scoped-style.vue");
+	     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
+	     update(newContent);
+	   });
+	 }
+	 // When the module is disposed, remove the <style> tags
+	 module.hot.dispose(function() { update(); });
+	}
+
+/***/ },
+/* 2 */
+/***/ function(module, exports, __webpack_require__) {
+
+	exports = module.exports = __webpack_require__(3)();
+	// imports
+
+
+	// module
+	exports.push([module.id, "\n.ct[data-v-0776c87b] {\n  width: 200px;\n  flex-direction: row;\n  transform: translate3d(100px, 100px, 0);\n}\n", ""]);
+
+	// exports
+
+
+/***/ },
+/* 3 */
+/***/ function(module, exports) {
+
+	/*
+		MIT License http://www.opensource.org/licenses/mit-license.php
+		Author Tobias Koppers @sokra
+	*/
+	// css base code, injected by the css-loader
+	module.exports = function() {
+		var list = [];
+
+		// return the list of modules as css string
+		list.toString = function toString() {
+			var result = [];
+			for(var i = 0; i < this.length; i++) {
+				var item = this[i];
+				if(item[2]) {
+					result.push("@media " + item[2] + "{" + item[1] + "}");
+				} else {
+					result.push(item[1]);
+				}
+			}
+			return result.join("");
+		};
+
+		// import a list of modules into the list
+		list.i = function(modules, mediaQuery) {
+			if(typeof modules === "string")
+				modules = [[null, modules, ""]];
+			var alreadyImportedModules = {};
+			for(var i = 0; i < this.length; i++) {
+				var id = this[i][0];
+				if(typeof id === "number")
+					alreadyImportedModules[id] = true;
+			}
+			for(i = 0; i < modules.length; i++) {
+				var item = modules[i];
+				// skip already imported module
+				// this implementation is not 100% perfect for weird media query combinations
+				//  when a module is imported multiple times with different media queries.
+				//  I hope this will never occur (Hey this way we have smaller bundles)
+				if(typeof item[0] !== "number" || !alreadyImportedModules[item[0]]) {
+					if(mediaQuery && !item[2]) {
+						item[2] = mediaQuery;
+					} else if(mediaQuery) {
+						item[2] = "(" + item[2] + ") and (" + mediaQuery + ")";
+					}
+					list.push(item);
+				}
+			}
+		};
+		return list;
+	};
+
+
+/***/ },
+/* 4 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/*
+	  MIT License http://www.opensource.org/licenses/mit-license.php
+	  Author Tobias Koppers @sokra
+	  Modified by Evan You @yyx990803
+	*/
+
+	var hasDocument = typeof document !== 'undefined'
+
+	if (false) {
+	  if (!hasDocument) {
+	    throw new Error(
+	    'vue-style-loader cannot be used in a non-browser environment. ' +
+	    "Use { target: 'node' } in your Webpack config to indicate a server-rendering environment."
+	  ) }
+	}
+
+	var listToStyles = __webpack_require__(5)
+
+	/*
+	type StyleObject = {
+	  id: number;
+	  parts: Array<StyleObjectPart>
+	}
+
+	type StyleObjectPart = {
+	  css: string;
+	  media: string;
+	  sourceMap: ?string
+	}
+	*/
+
+	var stylesInDom = {/*
+	  [id: number]: {
+	    id: number,
+	    refs: number,
+	    parts: Array<(obj?: StyleObjectPart) => void>
+	  }
+	*/}
+
+	var head = hasDocument && (document.head || document.getElementsByTagName('head')[0])
+	var singletonElement = null
+	var singletonCounter = 0
+	var isProduction = false
+	var noop = function () {}
+
+	// Force single-tag solution on IE6-9, which has a hard limit on the # of <style>
+	// tags it will allow on a page
+	var isOldIE = typeof navigator !== 'undefined' && /msie [6-9]\b/.test(navigator.userAgent.toLowerCase())
+
+	module.exports = function (parentId, list, _isProduction) {
+	  isProduction = _isProduction
+
+	  var styles = listToStyles(parentId, list)
+	  addStylesToDom(styles)
+
+	  return function update (newList) {
+	    var mayRemove = []
+	    for (var i = 0; i < styles.length; i++) {
+	      var item = styles[i]
+	      var domStyle = stylesInDom[item.id]
+	      domStyle.refs--
+	      mayRemove.push(domStyle)
+	    }
+	    if (newList) {
+	      styles = listToStyles(parentId, newList)
+	      addStylesToDom(styles)
+	    } else {
+	      styles = []
+	    }
+	    for (var i = 0; i < mayRemove.length; i++) {
+	      var domStyle = mayRemove[i]
+	      if (domStyle.refs === 0) {
+	        for (var j = 0; j < domStyle.parts.length; j++) {
+	          domStyle.parts[j]()
+	        }
+	        delete stylesInDom[domStyle.id]
+	      }
+	    }
+	  }
+	}
+
+	function addStylesToDom (styles /* Array<StyleObject> */) {
+	  for (var i = 0; i < styles.length; i++) {
+	    var item = styles[i]
+	    var domStyle = stylesInDom[item.id]
+	    if (domStyle) {
+	      domStyle.refs++
+	      for (var j = 0; j < domStyle.parts.length; j++) {
+	        domStyle.parts[j](item.parts[j])
+	      }
+	      for (; j < item.parts.length; j++) {
+	        domStyle.parts.push(addStyle(item.parts[j]))
+	      }
+	      if (domStyle.parts.length > item.parts.length) {
+	        domStyle.parts.length = item.parts.length
+	      }
+	    } else {
+	      var parts = []
+	      for (var j = 0; j < item.parts.length; j++) {
+	        parts.push(addStyle(item.parts[j]))
+	      }
+	      stylesInDom[item.id] = { id: item.id, refs: 1, parts: parts }
+	    }
+	  }
+	}
+
+	function createStyleElement () {
+	  var styleElement = document.createElement('style')
+	  styleElement.type = 'text/css'
+	  head.appendChild(styleElement)
+	  return styleElement
+	}
+
+	function addStyle (obj /* StyleObjectPart */) {
+	  var update, remove
+	  var styleElement = document.querySelector('style[data-vue-ssr-id~="' + obj.id + '"]')
+
+	  if (styleElement) {
+	    if (isProduction) {
+	      // has SSR styles and in production mode.
+	      // simply do nothing.
+	      return noop
+	    } else {
+	      // has SSR styles but in dev mode.
+	      // for some reason Chrome can't handle source map in server-rendered
+	      // style tags - source maps in <style> only works if the style tag is
+	      // created and inserted dynamically. So we remove the server rendered
+	      // styles and inject new ones.
+	      styleElement.parentNode.removeChild(styleElement)
+	    }
+	  }
+
+	  if (isOldIE) {
+	    // use singleton mode for IE9.
+	    var styleIndex = singletonCounter++
+	    styleElement = singletonElement || (singletonElement = createStyleElement())
+	    update = applyToSingletonTag.bind(null, styleElement, styleIndex, false)
+	    remove = applyToSingletonTag.bind(null, styleElement, styleIndex, true)
+	  } else {
+	    // use multi-style-tag mode in all other cases
+	    styleElement = createStyleElement()
+	    update = applyToTag.bind(null, styleElement)
+	    remove = function () {
+	      styleElement.parentNode.removeChild(styleElement)
+	    }
+	  }
+
+	  update(obj)
+
+	  return function updateStyle (newObj /* StyleObjectPart */) {
+	    if (newObj) {
+	      if (newObj.css === obj.css &&
+	          newObj.media === obj.media &&
+	          newObj.sourceMap === obj.sourceMap) {
+	        return
+	      }
+	      update(obj = newObj)
+	    } else {
+	      remove()
+	    }
+	  }
+	}
+
+	var replaceText = (function () {
+	  var textStore = []
+
+	  return function (index, replacement) {
+	    textStore[index] = replacement
+	    return textStore.filter(Boolean).join('\n')
+	  }
+	})()
+
+	function applyToSingletonTag (styleElement, index, remove, obj) {
+	  var css = remove ? '' : obj.css
+
+	  if (styleElement.styleSheet) {
+	    styleElement.styleSheet.cssText = replaceText(index, css)
+	  } else {
+	    var cssNode = document.createTextNode(css)
+	    var childNodes = styleElement.childNodes
+	    if (childNodes[index]) styleElement.removeChild(childNodes[index])
+	    if (childNodes.length) {
+	      styleElement.insertBefore(cssNode, childNodes[index])
+	    } else {
+	      styleElement.appendChild(cssNode)
+	    }
+	  }
+	}
+
+	function applyToTag (styleElement, obj) {
+	  var css = obj.css
+	  var media = obj.media
+	  var sourceMap = obj.sourceMap
+
+	  if (media) {
+	    styleElement.setAttribute('media', media)
+	  }
+
+	  if (sourceMap) {
+	    // https://developer.chrome.com/devtools/docs/javascript-debugging
+	    // this makes source maps inside style tags work properly in Chrome
+	    css += '\n/*# sourceURL=' + sourceMap.sources[0] + ' */'
+	    // http://stackoverflow.com/a/26603875
+	    css += '\n/*# sourceMappingURL=data:application/json;base64,' + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + ' */'
+	  }
+
+	  if (styleElement.styleSheet) {
+	    styleElement.styleSheet.cssText = css
+	  } else {
+	    while (styleElement.firstChild) {
+	      styleElement.removeChild(styleElement.firstChild)
+	    }
+	    styleElement.appendChild(document.createTextNode(css))
+	  }
+	}
+
+
+/***/ },
+/* 5 */
+/***/ function(module, exports) {
+
+	/**
+	 * Translates the list format produced by css-loader into something
+	 * easier to manipulate.
+	 */
+	module.exports = function listToStyles (parentId, list) {
+	  var styles = []
+	  var newStyles = {}
+	  for (var i = 0; i < list.length; i++) {
+	    var item = list[i]
+	    var id = item[0]
+	    var css = item[1]
+	    var media = item[2]
+	    var sourceMap = item[3]
+	    var part = {
+	      id: parentId + ':' + i,
+	      css: css,
+	      media: media,
+	      sourceMap: sourceMap
+	    }
+	    if (!newStyles[id]) {
+	      styles.push(newStyles[id] = { id: id, parts: [part] })
+	    } else {
+	      newStyles[id].parts.push(part)
+	    }
+	  }
+	  return styles
+	}
+
+
+/***/ },
+/* 6 */
+/***/ function(module, exports) {
+
+	// this module is a runtime utility for cleaner component module output and will
+	// be included in the final webpack user bundle
+
+	module.exports = function normalizeComponent (
+	  rawScriptExports,
+	  compiledTemplate,
+	  scopeId,
+	  cssModules
+	) {
+	  var esModule
+	  var scriptExports = rawScriptExports = rawScriptExports || {}
+
+	  // ES6 modules interop
+	  var type = typeof rawScriptExports.default
+	  if (type === 'object' || type === 'function') {
+	    esModule = rawScriptExports
+	    scriptExports = rawScriptExports.default
+	  }
+
+	  // Vue.extend constructor export interop
+	  var options = typeof scriptExports === 'function'
+	    ? scriptExports.options
+	    : scriptExports
+
+	  // render functions
+	  if (compiledTemplate) {
+	    options.render = compiledTemplate.render
+	    options.staticRenderFns = compiledTemplate.staticRenderFns
+	  }
+
+	  // scopedId
+	  if (scopeId) {
+	    options._scopeId = scopeId
+	  }
+
+	  // inject cssModules
+	  if (cssModules) {
+	    var computed = Object.create(options.computed || null)
+	    Object.keys(cssModules).forEach(function (key) {
+	      var module = cssModules[key]
+	      computed[key] = function () { return module }
+	    })
+	    options.computed = computed
+	  }
+
+	  return {
+	    esModule: esModule,
+	    exports: scriptExports,
+	    options: options
+	  }
+	}
+
+
+/***/ },
+/* 7 */
+/***/ function(module, exports, __webpack_require__) {
+
+	module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+	  return _c('div', [_c('div', {
+	    ref: "foo",
+	    staticClass: "ct",
+	    staticStyle: {
+	      "height": "200px"
+	    },
+	    style: ({
+	      backgroundColor: 'red'
+	    })
+	  })])
+	},staticRenderFns: []}
+	module.exports.render._withStripped = true
+	if (false) {
+	  module.hot.accept()
+	  if (module.hot.data) {
+	     require("vue-loader/node_modules/vue-hot-reload-api").rerender("data-v-0776c87b", module.exports)
+	  }
+	}
+
+/***/ }
+/******/ ])
+});
+;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/test/render/vue/data/css/head1.css
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/data/css/head1.css b/html5/test/render/vue/data/css/head1.css
new file mode 100644
index 0000000..f6a818a
--- /dev/null
+++ b/html5/test/render/vue/data/css/head1.css
@@ -0,0 +1,38 @@
+/*/////////////////////////////////////////////////////////////*/
+
+/* \u9ed8\u8ba4\u80cc\u666f\u8272\u4e3a #FFFFFF */
+.wrapper[data-v-67763bae] {
+    width: 375px;
+    /*background-color: #586C5D;*/
+    overflow: hidden;
+}
+.module-warning[data-v-67763bae]{
+    text-align: center;
+    font-size: 25px;
+    color: red;
+    font-weight: bold;
+}
+.video[data-v-67763bae]{
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 375px;
+}
+.first-frame[data-v-67763bae]{
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 375px;
+}
+.final-image[data-v-67763bae]{
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 375px;
+}
+.deco-img[data-v-67763bae]{
+    width: 375px;
+    position: absolute;
+    left: 0;
+    bottom: 0;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/test/render/vue/data/css/head10.css
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/data/css/head10.css b/html5/test/render/vue/data/css/head10.css
new file mode 100644
index 0000000..06dce95
--- /dev/null
+++ b/html5/test/render/vue/data/css/head10.css
@@ -0,0 +1,14 @@
+/*/////////////////////////////////////////////////////////////*/
+/* Copyright 2014 Evernote Corporation. All rights reserved. */
+.en-markup-crop-options {
+    top: 18px !important;
+    left: 50% !important;
+    margin-left: -100px !important;
+    width: 200px !important;
+    border: 2px rgba(255,255,255,.38) solid !important;
+    border-radius: 4px !important;
+}
+
+.en-markup-crop-options div div:first-of-type {
+    margin-left: 0px !important;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/test/render/vue/data/css/head11.css
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/data/css/head11.css b/html5/test/render/vue/data/css/head11.css
new file mode 100644
index 0000000..dbefea4
--- /dev/null
+++ b/html5/test/render/vue/data/css/head11.css
@@ -0,0 +1,2 @@
+/*/////////////////////////////////////////////////////////////*/
+#J_6820099468 .act-module-title-m {padding-bottom:0;background-color:#34110b}#J_6820099468 .act-module-title-m h3{margin:0 auto 0}#J_6820099468 .act-module-title-m .item-title{color:#333}#J_6820099468 .act-module-title-m .item-title:before,#J_6820099468 .act-module-title-m .item-title:after{background:#333}#J_6820099468 .act-module-title-m .is-img{padding-top:28.26666667%}#J_6820099468 .act-module-title-m .banner-img{height:212}#J_3487624305 .act-module-title-m{padding-bottom:0;background-color:#34110b}#J_3487624305 .act-module-title-m h3{margin:0 auto 0}#J_3487624305 .act-module-title-m .item-title{color:#333}#J_3487624305 .act-module-title-m .item-title:before,#J_3487624305 .act-module-title-m .item-title:after{background:#333}#J_3487624305 .act-module-title-m .is-img{padding-top:28.26666667%}#J_3487624305 .act-module-title-m .banner-img{height:212}#J_1043444990 .zebra-basis-slider{background-color:#4e351f;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-
 box;-o-box-sizing:border-box;-ms-box-sizing:border-box;padding-left:0;padding-right:0}#J_1043444990 .zebra-basis-slider .icons i{background-color:#e6e6e6}#J_1043444990 .zebra-basis-slider .icons i.current{background-color:#DF3434}#J_1043444990 .zebra-basis-slider .slider{min-height:136.17021277px}#J_5774361206 .act-module-title-m{padding-bottom:0;background-color:#34110b}#J_5774361206 .act-module-title-m h3{margin:0 auto 0}#J_5774361206 .act-module-title-m .item-title{color:#333}#J_5774361206 .act-module-title-m .item-title:before,#J_5774361206 .act-module-title-m .item-title:after{background:#333}#J_5774361206 .act-module-title-m .is-img{padding-top:28.26666667%}#J_5774361206 .act-module-title-m .banner-img{height:212}#J_4710936714 .act-module-title-m{padding-bottom:0;background-color:#34110b}#J_4710936714 .act-module-title-m h3{margin:0 auto 0}#J_4710936714 .act-module-title-m .item-title{color:#333}#J_4710936714 .act-module-title-m .item-title:before,#J_4710936714 .act-module-tit
 le-m .item-title:after{background:#333}#J_4710936714 .act-module-title-m .is-img{padding-top:28.26666667%}#J_4710936714 .act-module-title-m .banner-img{height:212}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/test/render/vue/data/css/head12.css
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/data/css/head12.css b/html5/test/render/vue/data/css/head12.css
new file mode 100644
index 0000000..8cc067b
--- /dev/null
+++ b/html5/test/render/vue/data/css/head12.css
@@ -0,0 +1,2 @@
+/*/////////////////////////////////////////////////////////////*/
+.inner-feedback-m{        width: 40px;        height: 40px;        background-size: 50px;        background-image: url(//img.alicdn.com/tps/i3/T1JDlEFg4cXXcu8V6l-64-64.png);        display: block;        position: fixed;        left: 10px;        bottom: 100px;        overflow: hidden;        text-indent: -9999em;        z-index: 9999;        background-color: rgba(0, 0, 0, 0.2);        border-radius: 20px;        background-position: center;    }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/test/render/vue/data/css/head2.css
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/data/css/head2.css b/html5/test/render/vue/data/css/head2.css
new file mode 100644
index 0000000..50c718f
--- /dev/null
+++ b/html5/test/render/vue/data/css/head2.css
@@ -0,0 +1,11 @@
+/*/////////////////////////////////////////////////////////////*/
+
+.wrapper[data-v-16194ed9] {
+    color: #353535;
+}
+.point[data-v-16194ed9] {
+  position: absolute;
+}
+.banner[data-v-16194ed9]{
+  width: 375px;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/test/render/vue/data/css/head3.css
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/data/css/head3.css b/html5/test/render/vue/data/css/head3.css
new file mode 100644
index 0000000..f8bf724
--- /dev/null
+++ b/html5/test/render/vue/data/css/head3.css
@@ -0,0 +1,25 @@
+/*/////////////////////////////////////////////////////////////*/
+
+/* \u9ed8\u8ba4\u80cc\u666f\u8272\u4e3a #FFFFFF */
+.wrapper[data-v-6acf469e] {
+    background-color: transparent;
+    -webkit-box-pack: center;
+    -webkit-justify-content: center;
+        -ms-flex-pack: center;
+            justify-content: center;
+    -webkit-box-align: center;
+    -webkit-align-items: center;
+        -ms-flex-align: center;
+            align-items: center;
+    padding-bottom: 9px;
+}
+.items-wrapper[data-v-6acf469e] {
+    width: 357.5px;
+}
+.row[data-v-6acf469e] {
+    -webkit-box-orient: horizontal;
+    -webkit-box-direction: normal;
+    -webkit-flex-direction: row;
+        -ms-flex-direction: row;
+            flex-direction: row;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/test/render/vue/data/css/head4.css
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/data/css/head4.css b/html5/test/render/vue/data/css/head4.css
new file mode 100644
index 0000000..dfde2dc
--- /dev/null
+++ b/html5/test/render/vue/data/css/head4.css
@@ -0,0 +1,56 @@
+/*/////////////////////////////////////////////////////////////*/
+
+.item[data-v-553d6ea0] {
+    width: 178px;
+    height: 118px;
+    background-color: #ffffff;
+    margin-bottom: 1px;
+}
+.bgImage[data-v-553d6ea0] {
+    position: absolute;
+    width: 178px;
+    height: 118px;
+}
+.img[data-v-553d6ea0] {
+    position: absolute;
+    width: 90px;
+    height: 90px;
+    top: 14px;
+    left: 3px;
+}
+.right-panel[data-v-553d6ea0] {
+    position: absolute;
+    left: 98px;
+    width: 75px;
+    lines: 1;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+    display: inline-block;
+    overflow: hidden;
+}
+.title[data-v-553d6ea0] {
+    font-weight: bold;
+    font-size: 12px;
+}
+.title-goods[data-v-553d6ea0] {
+    top: 22px;
+}
+.title-shop[data-v-553d6ea0] {
+    top: 40px;
+}
+.subtitle[data-v-553d6ea0] {
+    font-weight: lighter;
+    font-size: 12px;
+    color: #4A4A4A;
+}
+.subtitle-goods[data-v-553d6ea0] {
+    top: 43px;
+}
+.subtitle-shop[data-v-553d6ea0] {
+    top: 61px;
+}
+.price[data-v-553d6ea0] {
+    font-weight: lighter;
+    font-size: 14px;
+    top: 76px;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/test/render/vue/data/css/head5.css
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/data/css/head5.css b/html5/test/render/vue/data/css/head5.css
new file mode 100644
index 0000000..a0adb55
--- /dev/null
+++ b/html5/test/render/vue/data/css/head5.css
@@ -0,0 +1,153 @@
+/*/////////////////////////////////////////////////////////////*/
+
+/* \u9ed8\u8ba4\u80cc\u666f\u8272\u4e3a #FFFFFF */
+.wrapper[data-v-2c9fb3eb] {
+    background-color: transparent;
+}
+.cell-wrap[data-v-2c9fb3eb]{
+}
+.like-row[data-v-2c9fb3eb]{
+    width: 375px;
+    padding-left: 9px;
+    padding-right: 9px;
+    margin-bottom: 9px;
+    box-sizing: border-box;
+    -webkit-box-orient: horizontal;
+    -webkit-box-direction: normal;
+    -webkit-flex-direction: row;
+        -ms-flex-direction: row;
+            flex-direction: row;
+    -webkit-box-pack: justify;
+    -webkit-justify-content: space-between;
+        -ms-flex-pack: justify;
+            justify-content: space-between;
+        }
+.like-item[data-v-2c9fb3eb]{
+    box-sizing: border-box;
+    width: 174px;
+    height: 250px;
+    /*margin-bottom: 18;*/
+    padding-left: 7px;
+    padding-right: 7px;
+    /*padding-top: 348px;*/
+    background-color: #ffffff;
+}
+.item-img[data-v-2c9fb3eb]{
+    /*position: absolute;*/
+    /*top: 0;*/
+    /*left: 0;*/
+    margin-left: -7px;
+    width: 174px;
+    height: 174px;
+}
+.title-ctn[data-v-2c9fb3eb]{
+    margin-top: 12px;
+    /* 348 - 14 * 2 */
+    width: 162px;
+    /*background-color: #eee;*/
+}
+.badge[data-v-2c9fb3eb]{
+    position: absolute;
+    top: 2px;
+    left: 0px;
+    width: 26px;
+    height: 13px;
+    margin-right: 4px;
+}
+.title[data-v-2c9fb3eb]{
+    width: 162px;
+    font-size: 12px;
+    line-height: 15px;
+    /*padding-top: 3;*/
+    color: #333333;
+    /*background-color: #ccc;*/
+
+    overflow: hidden;
+    text-overflow: ellipsis;
+    lines: 2;
+}
+.sub-title[data-v-2c9fb3eb]{
+    position: absolute;
+    /* 348 - 40(own-height)*/
+    bottom: 11px;
+    right: 6px;
+    /*width: 312;*/
+
+    /* totally hack, do not change */
+    font-size: 10px;
+    line-height: 9px;
+    height: 14px;
+    padding-top: 1.5px;
+
+    padding-left: 3px;
+    padding-right: 3px;
+    text-align: center;
+
+    color: #F70E50;
+    text-align: center;
+    border-radius: 3px;
+    border-width: 1px;
+
+    overflow: hidden;
+    text-overflow: ellipsis;
+    lines: 1;
+}
+.sub-title-bg[data-v-2c9fb3eb]{
+    position: absolute;
+    bottom: 11px;
+    right: 6px;
+
+    /* totally hack, do not change */
+    font-size: 10px;
+    line-height: 9px;
+    height: 14px;
+    padding-left: 3px;
+    padding-right: 3px;
+    text-align: center;
+
+    text-align: center;
+    border-radius: 3px;
+    border-width: 1px;
+
+    overflow: hidden;
+    text-overflow: ellipsis;
+    lines: 1;
+
+    border-color: transparent;
+    color: transparent;
+    opacity: 0.15;
+}
+.price-ctn[data-v-2c9fb3eb]{
+    position: absolute;
+    bottom: 11px;
+    left: 6px;
+    -webkit-box-orient: horizontal;
+    -webkit-box-direction: normal;
+    -webkit-flex-direction: row;
+        -ms-flex-direction: row;
+            flex-direction: row;
+    -webkit-box-align: center;
+    -webkit-align-items: center;
+        -ms-flex-align: center;
+            align-items: center;
+    /*background-color: #ccc;*/
+}
+.price-title[data-v-2c9fb3eb]{
+    font-size: 12px;
+    /*margin-top: 4px;*/
+}
+.price-unit[data-v-2c9fb3eb]{
+    /*margin-top: 5px;*/
+    font-size: 12px;
+    /*line-height: 26px;*/
+    color: #E71A17;
+    /*background-color: #ccc;*/
+}
+.price-num[data-v-2c9fb3eb]{
+    margin-left: -1px;
+    color: #E71A17;
+    font-size: 15px;
+    /*line-height: 36px;*/
+    font-weight: bold;
+    /*background-color: #ccc;*/
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/test/render/vue/data/css/head6.css
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/data/css/head6.css b/html5/test/render/vue/data/css/head6.css
new file mode 100644
index 0000000..38eb47d
--- /dev/null
+++ b/html5/test/render/vue/data/css/head6.css
@@ -0,0 +1,4 @@
+/*/////////////////////////////////////////////////////////////*/
+.mui-zebra-page{
+  background:#192905
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/test/render/vue/data/css/head7.css
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/data/css/head7.css b/html5/test/render/vue/data/css/head7.css
new file mode 100644
index 0000000..aab323b
--- /dev/null
+++ b/html5/test/render/vue/data/css/head7.css
@@ -0,0 +1,61 @@
+/*/////////////////////////////////////////////////////////////*/
+.weex-root,
+.weex-root * {
+  color: initial;
+  cursor: initial;
+  direction: initial;
+  font: initial;
+  font-family: initial;
+  font-size: initial;
+  font-style: initial;
+  font-variant: initial;
+  font-weight: initial;
+  line-height: initial;
+  text-align: initial;
+  text-indent: initial;
+  visibility: initial;
+  white-space: initial;
+  word-spacing: initial;
+  font-family: BlinkMacSystemFont, 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif;
+}
+
+.weex-root,
+.weex-root *,
+.weex-root *::before,
+.weex-root *::after {
+  box-sizing: border-box;
+  -webkit-text-size-adjust: none;
+      -ms-text-size-adjust: none;
+          text-size-adjust: none;
+      }
+
+.weex-root a,
+.weex-root button,
+.weex-root [role="button"],
+.weex-root input,
+.weex-root label,
+.weex-root select,
+.weex-root textarea {
+  -ms-touch-action: manipulation;
+      touch-action: manipulation;
+  }
+
+.weex-root p,
+.weex-root ol,
+.weex-root ul,
+.weex-root dl {
+  margin: 0;
+  padding: 0;
+}
+
+.weex-root li {
+  list-style: none;
+}
+
+.weex-root figure {
+  margin: 0;
+}
+
+.weex-root textarea {
+  resize: none;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/test/render/vue/data/css/head8.css
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/data/css/head8.css b/html5/test/render/vue/data/css/head8.css
new file mode 100644
index 0000000..8f25208
--- /dev/null
+++ b/html5/test/render/vue/data/css/head8.css
@@ -0,0 +1,507 @@
+/*/////////////////////////////////////////////////////////////*/
+.weex-root * {
+  border-width: 0;
+  border-color: inherit;
+  border-style: solid;
+}
+
+.weex-ct {
+  box-sizing: border-box;
+  display: -webkit-box;
+  display: -webkit-flex;
+  display: flex;
+  position: relative;
+  -webkit-box-orient: vertical;
+  -webkit-flex-direction: column;
+  flex-direction: column;
+  -webkit-flex-shrink: 0;
+  -ms-flex-negative: 0;
+  flex-shrink: 0;
+  -webkit-flex-grow: 0;
+  -ms-flex-grow: 0;
+  flex-grow: 0;
+  -webkit-flex-basis: auto;
+  flex-basis: auto;
+  -webkit-box-align: stretch;
+  -webkit-align-items: stretch;
+  -ms-flex-align: stretch;
+  align-items: stretch;
+  -webkit-align-content: flex-start;
+  -ms-flex-line-pack: start;
+  align-content: flex-start;
+  border: 0 solid black;
+  margin: 0;
+  padding: 0;
+  min-width: 0;
+}
+
+.weex-ct.horizontal {
+  -webkit-box-orient: horizontal;
+  -webkit-flex-direction: row;
+  flex-direction: row;
+}
+
+.weex-el {
+  display: block;
+  box-sizing: border-box;
+  position: relative;
+  -webkit-flex-shrink: 0;
+  -ms-flex-negative: 0;
+  flex-shrink: 0;
+  -webkit-flex-grow: 0;
+  -ms-flex-grow: 0;
+  flex-grow: 0;
+  -webkit-flex-basis: auto;
+  flex-basis: auto;
+  border: 0 solid black;
+  margin: 0;
+  padding: 0;
+  min-width: 0;
+}
+
+.weex-a {
+  text-decoration: none;
+}
+
+body > .weex-div {
+  min-height: 100%;
+}
+
+.weex-input, .weex-textarea {
+  font-size: 0.426667rem;
+}
+.weex-input:focus, .weex-textarea:focus {
+  outline: none;
+}
+
+.weex-image, .weex-img {
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+
+.weex-toast {
+  font-size: 0.426667rem;
+  line-height: 0.426667rem;
+  position: fixed;
+  z-index: 1999999999;
+  box-sizing: border-box;
+  max-width: 80%;
+  bottom: 50%;
+  left: 50%;
+  padding: 0.213333rem;
+  background-color: #000;
+  color: #fff;
+  text-align: center;
+  opacity: 0.6;
+  -webkit-transition: all 0.4s ease-in-out;
+          transition: all 0.4s ease-in-out;
+  border-radius: 0.066667rem;
+  -webkit-transform: translateX(-50%);
+  -ms-transform: translateX(-50%);
+      transform: translateX(-50%);
+  }
+
+.weex-toast.hide {
+  opacity: 0;
+}
+
+.weex-alert .weex-alert-ok {
+  width: 100%;
+}
+
+.weex-confirm .btn-group .btn {
+  float: left;
+  width: 50%;
+}
+
+.weex-confirm .btn-group .btn.btn-ok {
+  border-right: 0.013333rem solid #ddd;
+}
+
+.weex-modal-wrap {
+  display: none;
+  position: fixed;
+  z-index: 999999999;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background-color: #000;
+  opacity: 0.5;
+}
+
+.weex-modal-node {
+  position: fixed;
+  z-index: 9999999999;
+  top: 50%;
+  left: 50%;
+  width: 6.666667rem;
+  min-height: 2.666667rem;
+  border-radius: 0.066667rem;
+  -webkit-transform: translate(-50%, -50%);
+  -ms-transform: translate(-50%, -50%);
+      transform: translate(-50%, -50%);
+  background-color: #fff;
+}
+
+.weex-modal-node.hide {
+  display: none;
+}
+
+.weex-modal-node .content {
+  display: -webkit-box;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-box-orient: vertical;
+  -webkit-flex-direction: column;
+  -ms-flex-direction: column;
+      flex-direction: column;
+  -webkit-box-align: center;
+  -webkit-align-items: center;
+  -ms-flex-align: center;
+      align-items: center;
+  -webkit-box-pack: center;
+  -webkit-justify-content: center;
+  -ms-flex-pack: center;
+      justify-content: center;
+  width: 100%;
+  min-height: 1.866667rem;
+  box-sizing: border-box;
+  font-size: 0.426667rem;
+  line-height: 0.426667rem;
+  padding: 0.213333rem;
+  border-bottom: 0.013333rem solid #ddd;
+}
+
+.weex-modal-node .btn-group {
+  width: 100%;
+  height: 0.8rem;
+  font-size: 0.373333rem;
+  text-align: center;
+  margin: 0;
+  padding: 0;
+  border: none;
+}
+
+.amfe-modal-node .btn-group .btn {
+  text-align: center;
+}
+
+.weex-modal-node .btn-group .btn {
+  box-sizing: border-box;
+  height: 0.8rem;
+  line-height: 0.8rem;
+  margin: 0;
+  padding: 0;
+  border: none;
+  background: none;
+  text-align: center;
+}
+
+.weex-prompt .input-wrap {
+  box-sizing: border-box;
+  width: 100%;
+  margin-top: 0.133333rem;
+  height: 0.96rem;
+}
+
+.weex-prompt .input-wrap .input {
+  box-sizing: border-box;
+  width: 100%;
+  height: 0.56rem;
+  line-height: 0.56rem;
+  font-size: 0.426667rem;
+  border: 0.013333rem solid #999;
+}
+
+.weex-prompt .btn-group .btn {
+  float: left;
+  width: 50%;
+}
+
+.weex-prompt .btn-group .btn.btn-ok {
+  border-right: 0.013333rem solid #ddd;
+}
+
+body > .weex-list,
+body > .weex-scroller {
+  max-height: 100%;
+}
+
+.weex-list-wrapper,
+.weex-scroller-wrapper {
+  -webkit-overflow-scrolling: touch;
+}
+
+.weex-list-wrapper {
+  overflow-y: scroll !important;
+}
+
+.weex-list-inner,
+.weex-scroller-inner {
+  -webkit-overflow-scrolling: touch;
+  width: 100%;
+}
+
+.weex-scroller-inner::-webkit-scrollbar {
+    width: 0;
+}
+
+.weex-scroller-wrapper.weex-scroller-vertical {
+  overflow-y: scroll;
+}
+
+.weex-scroller-wrapper.weex-scroller-horizontal {
+  overflow-x: scroll;
+}
+
+.weex-scroller-horizontal .weex-scroller-inner {
+  -webkit-flex-direction: row;
+      -ms-flex-direction: row;
+          flex-direction: row;
+  -webkit-box-orient: horizontal;
+  height: 100%;
+}
+
+.iossticky {
+  position: -webkit-sticky !important;
+  position: sticky !important;
+  z-index: 9999;
+  top: 0;
+}
+
+.sticky {
+  position: fixed;
+  top: 0;
+  z-index: 9999;
+}
+
+.weex-cell {
+  width: 100%;
+}
+
+.weex-refresh,
+.weex-loading {
+  -webkit-box-align: center;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+  -webkit-box-pack: center;
+  -webkit-justify-content: center;
+      -ms-flex-pack: center;
+          justify-content: center;
+  width: 100%;
+  overflow: hidden;
+}
+
+.weex-slider-wrapper {
+  overflow: hidden;
+}
+
+.weex-slider-inner {
+  position: absolute;
+  height: 100%;
+  top: 0;
+  left: 0;
+}
+
+.weex-slider-cell {
+  display: block;
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  margin: 0;
+  padding: 0;
+  height: 100%;
+  overflow: hidden;
+}
+
+.weex-indicator {
+  position: absolute;
+  -webkit-flex-direction: row;
+  -ms-flex-direction: row;
+  flex-direction: row;
+  -webkit-box-orient: horizontal;
+  margin: 0;
+  padding: 0;
+}
+
+.weex-indicator-item {
+  display: inline-block;
+  position: relative;
+  border-radius: 50%;
+  width: 0.266667rem;
+  height: 0.266667rem;
+  background-color: #BBBBBB;
+}
+.weex-indicator-item + .weex-indicator-item {
+  margin-left: 0.133333rem;
+}
+
+.weex-indicator-item-active {
+  background-color: blue;
+}
+
+.weex-refresh-indicator,
+.weex-loading-indicator {
+  width: 1.0rem;
+  height: 1.0rem;
+  -webkit-box-align: center;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+  -webkit-box-pack: center;
+  -webkit-justify-content: center;
+      -ms-flex-pack: center;
+          justify-content: center;
+  overflow: visible;
+  background: none;
+}
+.weex-refresh-indicator:before,
+.weex-loading-indicator:before {
+  display: block;
+  content: '';
+  font-size: 0.16rem;
+  width: 1em;
+  height: 1em;
+  left: -60%;
+  top: 40%;
+  border-radius: 50%;
+  position: relative;
+  text-indent: -9999em;
+  -webkit-animation: weex-spinner 1.1s infinite ease;
+          animation: weex-spinner 1.1s infinite ease;
+  -webkit-transform: translate3d(1.0rem, 0, 0);
+          transform: translate3d(1.0rem, 0, 0);
+}
+
+@-webkit-keyframes weex-spinner {
+  0%,
+  100% {
+    box-shadow: 0em -2.6em 0em 0em #ffffff, 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.5), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.7);
+  }
+  12.5% {
+    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.7), 1.8em -1.8em 0 0em #ffffff, 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.5);
+  }
+  25% {
+    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.5), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.7), 2.5em 0em 0 0em #ffffff, 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
+  }
+  37.5% {
+    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.5), 2.5em 0em 0 0em rgba(255, 255, 255, 0.7), 1.75em 1.75em 0 0em #ffffff, 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
+  }
+  50% {
+    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.5), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.7), 0em 2.5em 0 0em #ffffff, -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
+  }
+  62.5% {
+    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.5), 0em 2.5em 0 0em rgba(255, 255, 255, 0.7), -1.8em 1.8em 0 0em #ffffff, -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
+  }
+  75% {
+    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.5), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.7), -2.6em 0em 0 0em #ffffff, -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
+  }
+  87.5% {
+    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.5), -2.6em 0em 0 0em rgba(255, 255, 255, 0.7), -1.8em -1.8em 0 0em #ffffff;
+  }
+}
+
+@keyframes weex-spinner {
+  0%,
+  100% {
+    box-shadow: 0em -2.6em 0em 0em #ffffff, 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.5), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.7);
+  }
+  12.5% {
+    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.7), 1.8em -1.8em 0 0em #ffffff, 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.5);
+  }
+  25% {
+    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.5), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.7), 2.5em 0em 0 0em #ffffff, 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
+  }
+  37.5% {
+    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.5), 2.5em 0em 0 0em rgba(255, 255, 255, 0.7), 1.75em 1.75em 0 0em #ffffff, 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
+  }
+  50% {
+    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.5), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.7), 0em 2.5em 0 0em #ffffff, -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
+  }
+  62.5% {
+    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.5), 0em 2.5em 0 0em rgba(255, 255, 255, 0.7), -1.8em 1.8em 0 0em #ffffff, -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
+  }
+  75% {
+    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.5), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.7), -2.6em 0em 0 0em #ffffff, -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
+  }
+  87.5% {
+    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.5), -2.6em 0em 0 0em rgba(255, 255, 255, 0.7), -1.8em -1.8em 0 0em #ffffff;
+  }
+}
+.weex-switch {
+  border: 0.013333rem solid #dfdfdf;
+  cursor: pointer;
+  display: inline-block;
+  position: relative;
+  vertical-align: middle;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  box-sizing: content-box;
+  background-clip: content-box;
+  color: #64bd63;
+  width: 1.333333rem;
+  height: 0.8rem;
+  background-color: white;
+  border-color: #dfdfdf;
+  box-shadow: #dfdfdf 0 0 0 0 inset;
+  border-radius: 0.8rem;
+  -webkit-transition: border 0.4s, box-shadow 0.4s, background-color 1.2s;
+          transition: border 0.4s, box-shadow 0.4s, background-color 1.2s;
+      }
+
+.weex-switch-checked {
+  background-color: #64bd63;
+  border-color: #64bd63;
+  box-shadow: #64bd63 0 0 0 0.533333rem inset;
+}
+
+.weex-switch-checked.weex-switch-disabled {
+  background-color: #A0CCA0;
+  box-shadow: #A0CCA0 0 0 0 0.533333rem inset;
+}
+
+.weex-switch-disabled {
+  background-color: #EEEEEE;
+}
+
+.weex-switch-inner {
+  width: 0.8rem;
+  height: 0.8rem;
+  background: #fff;
+  border-radius: 100%;
+  box-shadow: 0 0.013333rem 0.04rem rgba(0, 0, 0, 0.4);
+  position: absolute;
+  top: 0;
+  left: 0;
+  -webkit-transition: background-color 0.4s, left 0.2s;
+          transition: background-color 0.4s, left 0.2s;
+      }
+
+.weex-switch-checked > .weex-switch-inner {
+  left: 0.533333rem;
+}
+
+.weex-text {
+  display: -webkit-box;
+  -webkit-box-orient: vertical;
+  position: relative;
+  white-space: pre-wrap;  /* not using 'pre': support auto line feed. */
+  font-size: 0.426667rem;
+  word-wrap: break-word;
+  overflow: hidden; /* it'll be clipped if the height is not high enough. */
+}
+
+.weex-web {
+  position: relative;
+  width: 100%;
+  height: 100%;
+  border: none;
+  box-sizing: border-box;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/test/render/vue/data/css/head9.css
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/data/css/head9.css b/html5/test/render/vue/data/css/head9.css
new file mode 100644
index 0000000..ce38a66
--- /dev/null
+++ b/html5/test/render/vue/data/css/head9.css
@@ -0,0 +1,173 @@
+/*/////////////////////////////////////////////////////////////*/
+@font-face {
+  font-family: "iconfont";
+  src: url("data:application/x-font-ttf;charset=utf-8;base64,AAEAAAAPAIAAAwBwRkZUTXBD98UAAAD8AAAAHE9TLzJXL1zIAAABGAAAAGBjbWFws6IHbgAAAXgAAAFaY3Z0IAyV/swAAApQAAAAJGZwZ20w956VAAAKdAAACZZnYXNwAAAAEAAACkgAAAAIZ2x5ZuxoPFIAAALUAAAEWGhlYWQHA5h3AAAHLAAAADZoaGVhBzIDcgAAB2QAAAAkaG10eAs2AW0AAAeIAAAAGGxvY2EDcAQeAAAHoAAAABBtYXhwASkKKwAAB7AAAAAgbmFtZQl/3hgAAAfQAAACLnBvc3Tm7f0bAAAKAAAAAEhwcmVwpbm+ZgAAFAwAAACVAAAAAQAAAADMPaLPAAAAANIDKnoAAAAA0gMqewAEA/oB9AAFAAACmQLMAAAAjwKZAswAAAHrADMBCQAAAgAGAwAAAAAAAAAAAAEQAAAAAAAAAAAAAABQZkVkAMAAeObeAyz/LABcAxgAlAAAAAEAAAAAAxgAAAAAACAAAQAAAAMAAAADAAAAHAABAAAAAABUAAMAAQAAABwABAA4AAAACgAIAAIAAgB45lDmYebe//8AAAB45lDmYebe////ixm0GaQZKAABAAAAAAAAAAAAAAAAAQYAAAEAAAAAAAAAAQIAAAACAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACACIAAAEyAqoAAwAHAClAJgAAAAMCAANXAAIBAQJLAAICAU8EAQECAUMAAAcGBQQAAwADEQUPKzMRIREnMxEjIgEQ7szMAqr9ViICZgAAAAUALP/hA7wDGAAWADAAOgBSAF4Bd0uwE1BYQEoCAQANDg0ADmYAAw4BDgNeAAEICAFcEAEJCAoGCV4RAQwGBAYMXgALBAtpDwEIAAYMCAZYAAoHBQIECwoEWRIBDg4NUQANDQoOQhtLsBdQWEBLAgEADQ4NAA5mAAMOAQ4DXgABCAgBXBABCQgKCAkKZhEBDAYEBgxeAAsEC2kPAQgABgwIBlgACgcFAgQLCgRZEgEODg1RAA0NCg5CG0uwGFBYQEwCAQANDg0ADmYAAw4BDgNeAAEICAFcEAEJCAoICQpmEQEMBgQGDARmAAsEC2kPAQgABgwIBlgACgcFAgQLCgRZEgEODg1RAA0NCg5CG0BOAgEADQ4NAA5mAAMOAQ4DAWYAAQgOAQhkEAEJCAoICQpmEQEMBgQGDARmAAsEC2kPAQgABgwIBlgACgcFAgQLCgRZEgEODg1RAA0NCg5CWVlZQChTUzs7MjEXF1NeU15bWDtSO1JLQzc1MToyOhcwFzBRETEYESgVQBMWKwEGKwEiDgIdASE1NCY1NC4CKwEVIQUVFBYUDgIjBiYrASchBysBIiciLgI9ARciBhQWMzI2NCYXBgcOAx4BOwYyNicuAScmJwE1ND4COwEyFh0BARkbGlMSJRwSA5ABChgnHoX+SgKiARUfIw4OHw4gLf5JLB0iFBkZIBMIdwwSEgwNEhKMCAYFCwQCBA8OJUNRUEAkFxYJBQkFBQb+pAUPGhW8HykCHwEMGScaTCkQHAQNIBsSYYg0Fzo6JRcJAQGAgAETGyAOpz8RGhERGhF8GhYTJA4QDQgYGg0jERMUAXfkCxgTDB0m4wAAAgCg/2wDYALsABIAG
 gAhQB4AAAADAgADWQACAQECTQACAgFRAAECAUUTFjkQBBIrACAGFRQeAxcWOwEyPwESNTQAIiY0NjIWFAKS/tzORFVvMRAJDgEOCW3b/uKEXl6EXgLszpI1lXyJNhEKC30BDIyS/s5ehF5ehAAAAAEAggBJA4QB6AAdABtAGBIRAgEAAUAFAQA+AAABAGgAAQFfEx8CECsBJgcGBwkBLgEGBwYUFwEwMxcVFjI3AT4DLgIDehEWAwP+uP60BhEQBgoKAWEBAQoaCQFeAwQCAQECBAHhEg0DAv61AUkHBAUGCRsJ/qIBAQkJAWICBwYHCAYGAAEAfwCLA4ECJwAhAB1AGhYPAgEAAUAFAQA+AAABAGgCAQEBXyQuEwMRKyUBMCcjNSYHBgcBDgEUFhceAjMyNwkBFjMyNjc+Ai4BA3f+nwEBEhUEAv6iBQUFBQMHCAQOCQFIAUwKDQYMBQMFAQEFwwFeAQERDQID/p8FDAwMBAMEAgkBS/62CQUFAwoJCgkAAAEAAAABAAALIynoXw889QALBAAAAAAA0gMqewAAAADSAyp7ACL/bAO8AxgAAAAIAAIAAAAAAAAAAQAAAxj/bABcBAAAAAAAA7wAAQAAAAAAAAAAAAAAAAAAAAUBdgAiAAAAAAFVAAAD6QAsBAAAoACCAH8AAAAoACgAKAFkAaIB5AIsAAEAAAAHAF8ABQAAAAAAAgAmADQAbAAAAIoJlgAAAAAAAAAMAJYAAQAAAAAAAQAIAAAAAQAAAAAAAgAGAAgAAQAAAAAAAwAkAA4AAQAAAAAABAAIADIAAQAAAAAABQBGADoAAQAAAAAABgAIAIAAAwABBAkAAQAQAIgAAwABBAkAAgAMAJgAAwABBAkAAwBIAKQAAwABBAkABAAQAOwAAwABBAkABQCMAPwAAwABBAkABgAQAYhpY29uZm9udE1lZGl1bUZvbnRGb3JnZSAyLjAgOiBpY29uZm9udCA6IDI2LTgtMj
 AxNWljb25mb250VmVyc2lvbiAxLjAgOyB0dGZhdXRvaGludCAodjAuOTQpIC1sIDggLXIgNTAgLUcgMjAwIC14IDE0IC13ICJHIiAtZiAtc2ljb25mb250AGkAYwBvAG4AZgBvAG4AdABNAGUAZABpAHUAbQBGAG8AbgB0AEYAbwByAGcAZQAgADIALgAwACAAOgAgAGkAYwBvAG4AZgBvAG4AdAAgADoAIAAyADYALQA4AC0AMgAwADEANQBpAGMAbwBuAGYAbwBuAHQAVgBlAHIAcwBpAG8AbgAgADEALgAwACAAOwAgAHQAdABmAGEAdQB0AG8AaABpAG4AdAAgACgAdgAwAC4AOQA0ACkAIAAtAGwAIAA4ACAALQByACAANQAwACAALQBHACAAMgAwADAAIAAtAHgAIAAxADQAIAAtAHcAIAAiAEcAIgAgAC0AZgAgAC0AcwBpAGMAbwBuAGYAbwBuAHQAAAACAAAAAAAA/4MAMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAABAAIAWwECAQMBBAd1bmlFNjUwB3VuaUU2NjEHdW5pRTZERQABAAH//wAPAAAAAAAAAAAAAAAAAAAAAAAyADIDGP/hAxj/bAMY/+EDGP9ssAAssCBgZi2wASwgZCCwwFCwBCZasARFW1ghIyEbilggsFBQWCGwQFkbILA4UFghsDhZWSCwCkVhZLAoUFghsApFILAwUFghsDBZGyCwwFBYIGYgiophILAKUFhgGyCwIFBYIbAKYBsgsDZQWCGwNmAbYFlZWRuwACtZWSOwAFBYZVlZLbACLCBFILAEJWFkILAFQ1BYsAUjQrAGI0IbISFZsAFgLbADLCMhIyEgZLEFYkIgsAYjQrIKAAIqISCwBkMgiiCKsAArsTAFJYpRWGBQG2FSWVgjWSEgsEBTWLAAKxshsEBZI7AAUFhlWS2wBCywCCNCsAcjQrAAI0KwAEOwB0NRWLAIQyuyAAE
 AQ2BCsBZlHFktsAUssABDIEUgsAJFY7ABRWJgRC2wBiywAEMgRSCwACsjsQQEJWAgRYojYSBkILAgUFghsAAbsDBQWLAgG7BAWVkjsABQWGVZsAMlI2FERC2wByyxBQVFsAFhRC2wCCywAWAgILAKQ0qwAFBYILAKI0JZsAtDSrAAUlggsAsjQlktsAksILgEAGIguAQAY4ojYbAMQ2AgimAgsAwjQiMtsAosS1RYsQcBRFkksA1lI3gtsAssS1FYS1NYsQcBRFkbIVkksBNlI3gtsAwssQANQ1VYsQ0NQ7ABYUKwCStZsABDsAIlQrIAAQBDYEKxCgIlQrELAiVCsAEWIyCwAyVQWLAAQ7AEJUKKiiCKI2GwCCohI7ABYSCKI2GwCCohG7AAQ7ACJUKwAiVhsAgqIVmwCkNHsAtDR2CwgGIgsAJFY7ABRWJgsQAAEyNEsAFDsAA+sgEBAUNgQi2wDSyxAAVFVFgAsA0jQiBgsAFhtQ4OAQAMAEJCimCxDAQrsGsrGyJZLbAOLLEADSstsA8ssQENKy2wECyxAg0rLbARLLEDDSstsBIssQQNKy2wEyyxBQ0rLbAULLEGDSstsBUssQcNKy2wFiyxCA0rLbAXLLEJDSstsBgssAcrsQAFRVRYALANI0IgYLABYbUODgEADABCQopgsQwEK7BrKxsiWS2wGSyxABgrLbAaLLEBGCstsBsssQIYKy2wHCyxAxgrLbAdLLEEGCstsB4ssQUYKy2wHyyxBhgrLbAgLLEHGCstsCEssQgYKy2wIiyxCRgrLbAjLCBgsA5gIEMjsAFgQ7ACJbACJVFYIyA8sAFgI7ASZRwbISFZLbAkLLAjK7AjKi2wJSwgIEcgILACRWOwAUViYCNhOCMgilVYIEcgILACRWOwAUViYCNhOBshWS2wJiyxAAVFVFgAsAEWsCUqsAEVMBsiWS2wJyywByuxAAVFVFgAsAEWsCUqsAEVMBsiWS2wKCwg
 NbABYC2wKSwAsANFY7ABRWKwACuwAkVjsAFFYrAAK7AAFrQAAAAAAEQ+IzixKAEVKi2wKiwgPCBHILACRWOwAUViYLAAQ2E4LbArLC4XPC2wLCwgPCBHILACRWOwAUViYLAAQ2GwAUNjOC2wLSyxAgAWJSAuIEewACNCsAIlSYqKRyNHI2EgWGIbIVmwASNCsiwBARUUKi2wLiywABawBCWwBCVHI0cjYbAGRStlii4jICA8ijgtsC8ssAAWsAQlsAQlIC5HI0cjYSCwBCNCsAZFKyCwYFBYILBAUVizAiADIBuzAiYDGllCQiMgsAlDIIojRyNHI2EjRmCwBEOwgGJgILAAKyCKimEgsAJDYGQjsANDYWRQWLACQ2EbsANDYFmwAyWwgGJhIyAgsAQmI0ZhOBsjsAlDRrACJbAJQ0cjRyNhYCCwBEOwgGJgIyCwACsjsARDYLAAK7AFJWGwBSWwgGKwBCZhILAEJWBkI7ADJWBkUFghGyMhWSMgILAEJiNGYThZLbAwLLAAFiAgILAFJiAuRyNHI2EjPDgtsDEssAAWILAJI0IgICBGI0ewACsjYTgtsDIssAAWsAMlsAIlRyNHI2GwAFRYLiA8IyEbsAIlsAIlRyNHI2EgsAUlsAQlRyNHI2GwBiWwBSVJsAIlYbABRWMjIFhiGyFZY7ABRWJgIy4jICA8ijgjIVktsDMssAAWILAJQyAuRyNHI2EgYLAgYGawgGIjICA8ijgtsDQsIyAuRrACJUZSWCA8WS6xJAEUKy2wNSwjIC5GsAIlRlBYIDxZLrEkARQrLbA2LCMgLkawAiVGUlggPFkjIC5GsAIlRlBYIDxZLrEkARQrLbA3LLAuKyMgLkawAiVGUlggPFkusSQBFCstsDgssC8riiAgPLAEI0KKOCMgLkawAiVGUlggPFkusSQBFCuwBEMusCQrLbA5LLAAFrAEJbAEJiAuRyNHI2GwBkUrIyA8IC4jOLEkARQrL
 bA6LLEJBCVCsAAWsAQlsAQlIC5HI0cjYSCwBCNCsAZFKyCwYFBYILBAUVizAiADIBuzAiYDGllCQiMgR7AEQ7CAYmAgsAArIIqKYSCwAkNgZCOwA0NhZFBYsAJDYRuwA0NgWbADJbCAYmGwAiVGYTgjIDwjOBshICBGI0ewACsjYTghWbEkARQrLbA7LLAuKy6xJAEUKy2wPCywLyshIyAgPLAEI0IjOLEkARQrsARDLrAkKy2wPSywABUgR7AAI0KyAAEBFRQTLrAqKi2wPiywABUgR7AAI0KyAAEBFRQTLrAqKi2wPyyxAAEUE7ArKi2wQCywLSotsEEssAAWRSMgLiBGiiNhOLEkARQrLbBCLLAJI0KwQSstsEMssgAAOistsEQssgABOistsEUssgEAOistsEYssgEBOistsEcssgAAOystsEgssgABOystsEkssgEAOystsEossgEBOystsEsssgAANystsEwssgABNystsE0ssgEANystsE4ssgEBNystsE8ssgAAOSstsFAssgABOSstsFEssgEAOSstsFIssgEBOSstsFMssgAAPCstsFQssgABPCstsFUssgEAPCstsFYssgEBPCstsFcssgAAOCstsFgssgABOCstsFkssgEAOCstsFossgEBOCstsFsssDArLrEkARQrLbBcLLAwK7A0Ky2wXSywMCuwNSstsF4ssAAWsDArsDYrLbBfLLAxKy6xJAEUKy2wYCywMSuwNCstsGEssDErsDUrLbBiLLAxK7A2Ky2wYyywMisusSQBFCstsGQssDIrsDQrLbBlLLAyK7A1Ky2wZiywMiuwNistsGcssDMrLrEkARQrLbBoLLAzK7A0Ky2waSywMyuwNSstsGossDMrsDYrLbBrLCuwCGWwAyRQeLABFTAtAABLuADIUlixAQGOWbkIAAgAYyCwASNEILADI3CwDkUgIEu4AA5RS7AGU1pYsDQbsChZYGYgilVYsA
 IlYbABRWMjYrACI0SzCgkFBCuzCgsFBCuzDg8FBCtZsgQoCUVSRLMKDQYEK7EGAUSxJAGIUViwQIhYsQYDRLEmAYhRWLgEAIhYsQYBRFlZWVm4Af+FsASNsQUARAAAAA==") format("truetype");
+}
+
+.iconfont {
+  font-family: iconfont !important;
+  font-size: 0.213333rem;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -webkit-text-stroke-width: 0.0.002667rem;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.weex-tabheader {
+  position: relative;
+  -webkit-box-align: center;
+  -webkit-align-items: center;
+  -ms-flex-align: center;
+  align-items: center;
+  left: 0;
+  top: 0;
+  width: 10rem;
+  height: 1.6rem;
+  color: #333;
+  overflow: hidden;
+}
+
+.weex-tabheader,
+.weex-tabheader * {
+  color: inherit;
+  cursor: inherit;
+  direction: inherit;
+  font: inherit;
+  font-family: inherit;
+  font-size: inherit;
+  font-style: inherit;
+  font-variant: inherit;
+  font-weight: inherit;
+  line-height: inherit;
+  text-align: inherit;
+  text-indent: inherit;
+  visibility: inherit;
+  white-space: inherit;
+  word-spacing: inherit;
+}
+
+.weex-tabheader .header-bar {
+  display: none;
+  position: absolute;
+  top: 0;
+  left: 0;
+  font-size: 0.373333rem;
+  height: 1.17rem;
+  line-height: 1.17rem;
+  color: #999;
+  padding-left: 0.4rem;
+}
+.weex-tabheader .header-body {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 9rem;
+  overflow-x: scroll;
+  overflow-y: hidden;
+  white-space: nowrap;
+}
+.weex-tabheader .header-body::-webkit-scrollbar {
+  width: 0;
+  height: 0;
+  overflow: hidden;
+}
+.weex-tabheader .fold-toggle {
+  position: absolute;
+  top: 0.6rem;
+  right: 0;
+  width: 1rem;
+  height: 1.17rem;
+  line-height: 1.17rem;
+  text-align: center;
+  z-index: 999;
+  font-size: 0.426667rem;
+  -webkit-transform: translateY(-50%);
+  transform: translateY(-50%);
+}
+.weex-tabheader.unfold-header {
+  position: fixed !important;
+  top: 0;
+  left: 0;
+  overflow: visible;
+}
+
+.weex-tabheader {
+  list-style: none;
+  white-space: nowrap;
+  height: 1.17rem;
+  line-height: 1.17rem;
+}
+.weex-tabheader .th-item {
+  padding-left: 0.72rem;
+  font-size: 0.373333rem;
+  position: relative;
+  display: inline-block;
+}
+.weex-tabheader .th-item.active {
+  color: #ff0000;
+}
+.weex-tabheader .hl-icon {
+  width: 0.4rem;
+  height: 0.4rem;
+  line-height: 0.4rem;
+  text-align: center;
+  position: absolute;
+  top: 50%;
+  left: 0.24rem;
+  font-size: 0.373333rem;
+  -webkit-transform: translateY(-50%);
+  transform: translateY(-50%);
+}
+
+.weex-tabheader .hl-icon.active {
+  color: #ff0000;
+}
+
+.unfold-header .header-bar {
+  display: block;
+}
+.unfold-header .fold-toggle {
+  -webkit-transform: translateY(-50%) rotate(180deg);
+  transform: translateY(-50%) rotate(180deg);
+}
+.unfold-header .header-body {
+  display: block;
+  height: auto;
+  position: relative;
+  margin-top: 1.17rem;
+  padding: 0.133333rem;
+  margin-right: 0;
+  white-space: normal;
+}
+.unfold-header.weex-tabheader {
+  display: block;
+  height: auto;
+}
+.unfold-header .th-item {
+  box-sizing: border-box;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  float: left;
+  width: 33.3333%;
+  height: 1.01rem;
+  line-height: 1.01rem;
+}
+.unfold-header .hl-icon {
+  margin-right: 0;
+  font-size: 0.373333rem;
+  position: absolute;
+}
+.unfold-header.tabheader-mask {
+  display: block;
+  width: 100%;
+  height: 100%;
+  background-color: rgba(0, 0, 0, 0.6);
+}
+
+.tabheader-mask {
+  display: none;
+  position: fixed;
+  left: 0;
+  top: 0;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/test/render/vue/data/dotvue/scoped-style.vue
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/data/dotvue/scoped-style.vue b/html5/test/render/vue/data/dotvue/scoped-style.vue
new file mode 100644
index 0000000..67c1bb8
--- /dev/null
+++ b/html5/test/render/vue/data/dotvue/scoped-style.vue
@@ -0,0 +1,13 @@
+<template>
+  <div>
+    <div ref="foo" style="height:200px;" :style="{ backgroundColor: 'red' }" class="ct"></div>
+  </div>
+</template>
+
+<style scoped>
+.ct {
+  width: 200px;
+  flex-direction: row;
+  transform: translate3d(100px, 100px, 0);
+}
+</style>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/test/render/vue/data/head-css.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/data/head-css.js b/html5/test/render/vue/data/head-css.js
new file mode 100644
index 0000000..ca4aca6
--- /dev/null
+++ b/html5/test/render/vue/data/head-css.js
@@ -0,0 +1,12 @@
+import './css/head1.css'
+import './css/head2.css'
+import './css/head3.css'
+import './css/head4.css'
+import './css/head5.css'
+import './css/head6.css'
+import './css/head7.css'
+import './css/head8.css'
+import './css/head9.css'
+import './css/head10.css'
+import './css/head11.css'
+import './css/head12.css'

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/test/render/vue/data/head-map.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/data/head-map.js b/html5/test/render/vue/data/head-map.js
new file mode 100644
index 0000000..cde66c9
--- /dev/null
+++ b/html5/test/render/vue/data/head-map.js
@@ -0,0 +1,247 @@
+export default {
+  /*// 1 /////////////////////////////////////////////////*/
+  ".wrapper[data-v-67763bae]": {
+    "width": "375px",
+    "overflow": "hidden"
+  },
+  ".module-warning[data-v-67763bae]": {
+    "text-align": "center",
+    "font-size": "25px",
+    "color": "red",
+    "font-weight": "bold"
+  },
+  ".video[data-v-67763bae]": {
+    "position": "absolute",
+    "top": "0",
+    "left": "0",
+    "width": "375px"
+  },
+  ".first-frame[data-v-67763bae]": {
+    "position": "absolute",
+    "top": "0",
+    "left": "0",
+    "width": "375px"
+  },
+  ".final-image[data-v-67763bae]": {
+    "position": "absolute",
+    "top": "0",
+    "left": "0",
+    "width": "375px"
+  },
+  ".deco-img[data-v-67763bae]": {
+    "width": "375px",
+    "position": "absolute",
+    "left": "0",
+    "bottom": "0"
+  },
+
+  /*// 2 /////////////////////////////////////////////////*/
+  ".wrapper[data-v-16194ed9]": {
+    "color": "#353535"
+  },
+  ".point[data-v-16194ed9]": {
+    "position": "absolute"
+  },
+  ".banner[data-v-16194ed9]": {
+    "width": "375px"
+  },
+
+  /*// 3 /////////////////////////////////////////////////*/
+  ".wrapper[data-v-6acf469e]": {
+    "background-color": "transparent",
+    "-webkit-box-pack": "center",
+    "-webkit-justify-content": "center",
+    "-ms-flex-pack": "center",
+    "justify-content": "center",
+    "-webkit-box-align": "center",
+    "-webkit-align-items": "center",
+    "-ms-flex-align": "center",
+    "align-items": "center",
+    "padding-bottom": "9px"
+  },
+  ".items-wrapper[data-v-6acf469e]": {
+    "width": "357.5px"
+  },
+  ".row[data-v-6acf469e]": {
+    "-webkit-box-orient": "horizontal",
+    "-webkit-box-direction": "normal",
+    "-webkit-flex-direction": "row",
+    "-ms-flex-direction": "row",
+    "flex-direction": "row"
+  },
+
+  /*// 4 /////////////////////////////////////////////////*/
+  ".item[data-v-553d6ea0]": {
+    "width": "178px",
+    "height": "118px",
+    "background-color": "#ffffff",
+    "margin-bottom": "1px"
+  },
+  ".bgImage[data-v-553d6ea0]": {
+    "position": "absolute",
+    "width": "178px",
+    "height": "118px"
+  },
+  ".img[data-v-553d6ea0]": {
+    "position": "absolute",
+    "width": "90px",
+    "height": "90px",
+    "top": "14px",
+    "left": "3px"
+  },
+  ".right-panel[data-v-553d6ea0]": {
+    "position": "absolute",
+    "left": "98px",
+    "width": "75px",
+    "lines": "1",
+    "text-overflow": "ellipsis",
+    "white-space": "nowrap",
+    "display": "inline-block",
+    "overflow": "hidden"
+  },
+  ".title[data-v-553d6ea0]": {
+    "font-weight": "bold",
+    "font-size": "12px"
+  },
+  ".title-goods[data-v-553d6ea0]": {
+    "top": "22px"
+  },
+  ".title-shop[data-v-553d6ea0]": {
+    "top": "40px"
+  },
+  ".subtitle[data-v-553d6ea0]": {
+    "font-weight": "lighter",
+    "font-size": "12px",
+    "color": "#4A4A4A"
+  },
+  ".subtitle-goods[data-v-553d6ea0]": {
+    "top": "43px"
+  },
+  ".subtitle-shop[data-v-553d6ea0]": {
+    "top": "61px"
+  },
+  ".price[data-v-553d6ea0]": {
+    "font-weight": "lighter",
+    "font-size": "14px",
+    "top": "76px"
+  },
+
+  /*// 5 /////////////////////////////////////////////////*/
+  ".wrapper[data-v-2c9fb3eb]": {
+    "background-color": "transparent"
+  },
+  ".cell-wrap[data-v-2c9fb3eb]": {},
+  ".like-row[data-v-2c9fb3eb]": {
+    "width": "375px",
+    "padding-left": "9px",
+    "padding-right": "9px",
+    "margin-bottom": "9px",
+    "box-sizing": "border-box",
+    "-webkit-box-orient": "horizontal",
+    "-webkit-box-direction": "normal",
+    "-webkit-flex-direction": "row",
+    "-ms-flex-direction": "row",
+    "flex-direction": "row",
+    "-webkit-box-pack": "justify",
+    "-webkit-justify-content": "space-between",
+    "-ms-flex-pack": "justify",
+    "justify-content": "space-between"
+  },
+  ".like-item[data-v-2c9fb3eb]": {
+    "box-sizing": "border-box",
+    "width": "174px",
+    "height": "250px",
+    "padding-left": "7px",
+    "padding-right": "7px",
+    "background-color": "#ffffff"
+  },
+  ".item-img[data-v-2c9fb3eb]": {
+    "margin-left": "-7px",
+    "width": "174px",
+    "height": "174px"
+  },
+  ".title-ctn[data-v-2c9fb3eb]": {
+    "margin-top": "12px"
+  },
+  ".badge[data-v-2c9fb3eb]": {
+    "position": "absolute",
+    "top": "2px",
+    "left": "0px",
+    "width": "26px",
+    "height": "13px",
+    "margin-right": "4px"
+  },
+  ".title[data-v-2c9fb3eb]": {
+    "width": "162px",
+    "font-size": "12px",
+    "line-height": "15px",
+    "color": "#333333",
+    "overflow": "hidden",
+    "text-overflow": "ellipsis",
+    "lines": "2"
+  },
+  ".sub-title[data-v-2c9fb3eb]": {
+    "position": "absolute",
+    "bottom": "11px",
+    "right": "6px",
+    "font-size": "10px",
+    "line-height": "9px",
+    "height": "14px",
+    "padding-top": "1.5px",
+    "padding-left": "3px",
+    "padding-right": "3px",
+    "text-align": "center",
+    "color": "#F70E50",
+    "border-radius": "3px",
+    "border-width": "1px",
+    "overflow": "hidden",
+    "text-overflow": "ellipsis",
+    "lines": "1"
+  },
+  ".sub-title-bg[data-v-2c9fb3eb]": {
+    "position": "absolute",
+    "bottom": "11px",
+    "right": "6px",
+    "font-size": "10px",
+    "line-height": "9px",
+    "height": "14px",
+    "padding-left": "3px",
+    "padding-right": "3px",
+    "text-align": "center",
+    "border-radius": "3px",
+    "border-width": "1px",
+    "overflow": "hidden",
+    "text-overflow": "ellipsis",
+    "lines": "1",
+    "border-color": "transparent",
+    "color": "transparent",
+    "opacity": "0.15"
+  },
+  ".price-ctn[data-v-2c9fb3eb]": {
+    "position": "absolute",
+    "bottom": "11px",
+    "left": "6px",
+    "-webkit-box-orient": "horizontal",
+    "-webkit-box-direction": "normal",
+    "-webkit-flex-direction": "row",
+    "-ms-flex-direction": "row",
+    "flex-direction": "row",
+    "-webkit-box-align": "center",
+    "-webkit-align-items": "center",
+    "-ms-flex-align": "center",
+    "align-items": "center"
+  },
+  ".price-title[data-v-2c9fb3eb]": {
+    "font-size": "12px"
+  },
+  ".price-unit[data-v-2c9fb3eb]": {
+    "font-size": "12px",
+    "color": "#E71A17"
+  },
+  ".price-num[data-v-2c9fb3eb]": {
+    "margin-left": "-1px",
+    "color": "#E71A17",
+    "font-size": "15px",
+    "font-weight": "bold"
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/test/render/vue/helper.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/helper.js b/html5/test/render/vue/helper.js
deleted file mode 100644
index 26daac0..0000000
--- a/html5/test/render/vue/helper.js
+++ /dev/null
@@ -1,140 +0,0 @@
-import '../../../render/vue/styles/reset.css'
-import '../../../render/vue/styles/components.css'
-
-import '../../../render/browser/render/gesture'
-
-/* istanbul ignore next */
-import '../../../shared/arrayFrom'
-/* istanbul ignore next */
-import '../../../shared/objectAssign'
-/* istanbul ignore next */
-import '../../../shared/objectSetPrototypeOf'
-
-/* istanbul ignore next */
-import 'core-js/modules/es6.object.to-string'
-/* istanbul ignore next */
-import 'core-js/modules/es6.string.iterator'
-/* istanbul ignore next */
-import 'core-js/modules/web.dom.iterable'
-/* istanbul ignore next */
-import 'core-js/modules/es6.promise'
-
-/* istanbul ignore next */
-import Vue from 'vue/dist/vue.esm.js'
-// import { base, scrollable, style, inputCommon } from '../../../render/vue/mixins'
-import { base, style } from '../../../render/vue/mixins'
-import weex from '../../../render/vue/env/weex'
-
-/**
- * functional tools exported by helper.utils.
- */
-const utils = {
-  toArray (list) {
-    if (!list) return []
-    return Array.prototype.slice.call(list)
-  }
-}
-
-/**
- * Describe tests for current versions of Vue.
- */
-export function init (title, fn) {
-  return describe(title, () => {
-    let components = {}
-
-    before(function () {
-      const htmlRegex = /^html:/i
-      Vue.config.isReservedTag = tag => htmlRegex.test(tag)
-      Vue.config.parsePlatformTagName = tag => tag.replace(htmlRegex, '')
-
-      Vue.mixin(base)
-      Vue.mixin(style)
-
-      window.global = window
-      global.weex = weex
-    })
-
-    const helper = {
-
-      utils,
-      /**
-       * register a component.
-       * @param  {string} name,
-       * @param  {object} component.
-       */
-      register (name, component) {
-        components[name] = component
-      },
-
-      /**
-       * reset registered components with empty object.
-       */
-      reset () {
-        components = {}
-      },
-
-      /**
-       * create a vm instance of Vue.
-       * @param  {Object} options.
-       * @return {Vue} vue instance.
-       */
-      createVm (options = {}) {
-        options.components = components
-        return new Vue(options).$mount()
-      },
-
-      /**
-       * [compile description]
-       * @param  {[type]} template [description]
-       * @return {[type]}          [description]
-       */
-      compile (template) {
-        return helper.createVm({ template })
-      }
-    }
-
-    /**
-     * describe a vue-render test for certain vue verson.
-     */
-    describe(`Vue ${Vue.version}`, () => {
-      after(function () {
-        helper.reset()
-      })
-
-      fn(Vue, helper)
-    })
-  })
-}
-
-// import vue200 from './vender/vue-2.0.0.js'
-// import vue210 from './vender/vue-2.1.0.js'
-// const Vues = [
-//   vue200,
-//   vue210
-// ]
-/**
- * Describe tests for multiple versions of Vue.
- */
-// export function multiDescribe (title, fn) {
-//   return describe(title, () => {
-//     Vues.forEach(Vue => {
-//       let components = {}
-//       Vue.config.isReservedTag = function () { return false }
-//       describe(`Vue ${Vue.version}`, () => fn(Vue, {
-//         register (name, component) {
-//           components[name] = component
-//         },
-//         reset () {
-//           components = {}
-//         },
-//         createVm (options = {}) {
-//           options.components = components
-//           return new Vue(options).$mount()
-//         },
-//         compile (template) {
-//           return this.createVm({ template })
-//         }
-//       }))
-//     })
-//   })
-// }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/test/render/vue/helper/env.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/helper/env.js b/html5/test/render/vue/helper/env.js
new file mode 100644
index 0000000..d972c0e
--- /dev/null
+++ b/html5/test/render/vue/helper/env.js
@@ -0,0 +1,20 @@
+import '../../../../render/vue/styles/reset.css'
+import '../../../../render/vue/styles/base.css'
+
+import '../../../../render/browser/render/gesture'
+
+/* istanbul ignore next */
+import '../../../../shared/arrayFrom'
+/* istanbul ignore next */
+import '../../../../shared/objectAssign'
+/* istanbul ignore next */
+import '../../../../shared/objectSetPrototypeOf'
+
+/* istanbul ignore next */
+import 'core-js/modules/es6.object.to-string'
+/* istanbul ignore next */
+import 'core-js/modules/es6.string.iterator'
+/* istanbul ignore next */
+import 'core-js/modules/web.dom.iterable'
+/* istanbul ignore next */
+import 'core-js/modules/es6.promise'

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/test/render/vue/helper/index.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/helper/index.js b/html5/test/render/vue/helper/index.js
new file mode 100644
index 0000000..425aa5c
--- /dev/null
+++ b/html5/test/render/vue/helper/index.js
@@ -0,0 +1,113 @@
+import './env'
+
+/* istanbul ignore next */
+import Vue from 'vue/dist/vue.esm.js'
+// import { base, scrollable, style, inputCommon } from '../../../render/vue/mixins'
+import { base, style } from '../../../../render/vue/mixins'
+import weex from '../../../../render/vue/env/weex'
+
+import * as utils from './utils'
+
+/**
+ * Describe tests for current versions of Vue.
+ */
+export function init (title, fn) {
+  return describe(title, () => {
+    let components = {}
+
+    before(function () {
+      const htmlRegex = /^html:/i
+      Vue.config.isReservedTag = tag => htmlRegex.test(tag)
+      Vue.config.parsePlatformTagName = tag => tag.replace(htmlRegex, '')
+
+      Vue.mixin(base)
+      Vue.mixin(style)
+
+      window.global = window
+      global.weex = weex
+    })
+
+    const helper = {
+
+      utils,
+      /**
+       * register a component.
+       * @param  {string} name,
+       * @param  {object} component.
+       */
+      register (name, component) {
+        components[name] = component
+      },
+
+      /**
+       * reset registered components with empty object.
+       */
+      reset () {
+        components = {}
+      },
+
+      /**
+       * create a vm instance of Vue.
+       * @param  {Object} options.
+       * @return {Vue} vue instance.
+       */
+      createVm (options = {}) {
+        options.components = components
+        return new Vue(options).$mount()
+      },
+
+      /**
+       * [compile description]
+       * @param  {[type]} template [description]
+       * @return {[type]}          [description]
+       */
+      compile (template) {
+        return helper.createVm({ template })
+      }
+    }
+
+    /**
+     * describe a vue-render test for certain vue verson.
+     */
+    describe(`Vue ${Vue.version}`, () => {
+      after(function () {
+        helper.reset()
+      })
+
+      fn(Vue, helper)
+    })
+  })
+}
+
+// import vue200 from './vender/vue-2.0.0.js'
+// import vue210 from './vender/vue-2.1.0.js'
+// const Vues = [
+//   vue200,
+//   vue210
+// ]
+/**
+ * Describe tests for multiple versions of Vue.
+ */
+// export function multiDescribe (title, fn) {
+//   return describe(title, () => {
+//     Vues.forEach(Vue => {
+//       let components = {}
+//       Vue.config.isReservedTag = function () { return false }
+//       describe(`Vue ${Vue.version}`, () => fn(Vue, {
+//         register (name, component) {
+//           components[name] = component
+//         },
+//         reset () {
+//           components = {}
+//         },
+//         createVm (options = {}) {
+//           options.components = components
+//           return new Vue(options).$mount()
+//         },
+//         compile (template) {
+//           return this.createVm({ template })
+//         }
+//       }))
+//     })
+//   })
+// }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/test/render/vue/helper/runtime.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/helper/runtime.js b/html5/test/render/vue/helper/runtime.js
new file mode 100644
index 0000000..6f5ea17
--- /dev/null
+++ b/html5/test/render/vue/helper/runtime.js
@@ -0,0 +1,80 @@
+import './env'
+
+/* istanbul ignore next */
+import Vue from 'vue/dist/vue.runtime.esm.js'
+// import { base, scrollable, style, inputCommon } from '../../../render/vue/mixins'
+import { base, style } from '../../../../render/vue/mixins'
+import weex from '../../../../render/vue/env/weex'
+
+import * as utils from './utils'
+
+/**
+ * Describe tests for current versions of Vue.
+ */
+export function init (title, fn) {
+  return describe(title, () => {
+    let components = {}
+
+    before(function () {
+      const htmlRegex = /^html:/i
+      Vue.config.isReservedTag = tag => htmlRegex.test(tag)
+      Vue.config.parsePlatformTagName = tag => tag.replace(htmlRegex, '')
+
+      Vue.mixin(base)
+      Vue.mixin(style)
+
+      window.global = window
+      global.weex = weex
+    })
+
+    const helper = {
+
+      utils,
+      /**
+       * register a component.
+       * @param  {string} name,
+       * @param  {object} component.
+       */
+      register (name, component) {
+        components[name] = component
+      },
+
+      /**
+       * reset registered components with empty object.
+       */
+      reset () {
+        components = {}
+      },
+
+      /**
+       * create a vm instance of Vue.
+       * @param  {Object} options.
+       * @return {Vue} vue instance.
+       */
+      createVm (options = {}) {
+        options.components = components
+        return new Vue(options).$mount()
+      },
+
+      /**
+       * [compile description]
+       * @param  {[type]} template [description]
+       * @return {[type]}          [description]
+       */
+      compile (template) {
+        return helper.createVm({ template })
+      }
+    }
+
+    /**
+     * describe a vue-render test for certain vue verson.
+     */
+    describe(`Vue ${Vue.version}`, () => {
+      after(function () {
+        helper.reset()
+      })
+
+      fn(Vue, helper)
+    })
+  })
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/test/render/vue/helper/utils.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/helper/utils.js b/html5/test/render/vue/helper/utils.js
new file mode 100644
index 0000000..11b2319
--- /dev/null
+++ b/html5/test/render/vue/helper/utils.js
@@ -0,0 +1,8 @@
+/**
+ * @fileOverview utils for tests.
+ */
+
+export function toArray (list) {
+  if (!list) return []
+  return Array.prototype.slice.call(list)
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/test/render/vue/utils.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/utils.js b/html5/test/render/vue/utils.js
deleted file mode 100644
index 0a38e32..0000000
--- a/html5/test/render/vue/utils.js
+++ /dev/null
@@ -1,47 +0,0 @@
-import * as utils from '../../../render/vue/utils'
-
-describe('utils', function () {
-  it('cached', () => {
-    expect(utils.cached).to.be.a('function')
-  })
-
-  it('camelize', () => {
-    const { camelize } = utils
-    expect(camelize).to.be.a('function')
-    expect(camelize('')).to.be.equal('')
-    expect(camelize('dispaly')).to.be.equal('dispaly')
-    expect(camelize('-webkit-transform')).to.be.equal('WebkitTransform')
-    expect(camelize('text-overflow')).to.be.equal('textOverflow')
-    expect(camelize('a-b-c-d')).to.be.equal('aBCD')
-  })
-
-  it('capitalize', () => {
-    const { capitalize } = utils
-    expect(capitalize).to.be.a('function')
-    expect(capitalize('')).to.be.equal('')
-    expect(capitalize('string')).to.be.equal('String')
-    expect(capitalize('string object')).to.be.equal('String object')
-    expect(capitalize('[string object]')).to.be.equal('[string object]')
-    expect(capitalize('I have an apple')).to.be.equal('I have an apple')
-  })
-
-  it('hyphenate', () => {
-    const { hyphenate } = utils
-    expect(hyphenate).to.be.a('function')
-    expect(hyphenate('')).to.be.equal('')
-    expect(hyphenate('dispaly')).to.be.equal('dispaly')
-    expect(hyphenate('WebkitTransform')).to.be.equal('webkit-transform')
-    expect(hyphenate('textOverflow')).to.be.equal('text-overflow')
-    expect(hyphenate('aBCD')).to.be.equal('a-b-c-d')
-  })
-
-  it('extend', () => {
-    const { extend } = utils
-    expect(extend).to.be.a('function')
-
-    const abc = { name: 'abc' }
-    expect(extend(abc)).to.deep.equal(abc)
-    expect(extend(abc, { name: 'x' }) === abc).to.be.true
-    expect(abc).to.deep.equal({ name: 'x' })
-  })
-})

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38f1a971/html5/test/render/vue/utils/func.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/utils/func.js b/html5/test/render/vue/utils/func.js
new file mode 100644
index 0000000..17341f6
--- /dev/null
+++ b/html5/test/render/vue/utils/func.js
@@ -0,0 +1,50 @@
+import * as utils from '../../../../render/vue/utils'
+
+describe('utils', function () {
+  describe('function', function () {
+    it('cached', function () {
+      expect(utils.cached).to.be.a('function')
+    })
+
+    it('camelize', function () {
+      const { camelize } = utils
+      expect(camelize).to.be.a('function')
+      expect(camelize('')).to.be.equal('')
+      expect(camelize('dispaly')).to.be.equal('dispaly')
+      expect(camelize('-webkit-transform')).to.be.equal('WebkitTransform')
+      expect(camelize('text-overflow')).to.be.equal('textOverflow')
+      expect(camelize('a-b-c-d')).to.be.equal('aBCD')
+    })
+
+    it('capitalize', function () {
+      const { capitalize } = utils
+      expect(capitalize).to.be.a('function')
+      expect(capitalize('')).to.be.equal('')
+      expect(capitalize('string')).to.be.equal('String')
+      expect(capitalize('string object')).to.be.equal('String object')
+      expect(capitalize('[string object]')).to.be.equal('[string object]')
+      expect(capitalize('I have an apple')).to.be.equal('I have an apple')
+    })
+
+    it('hyphenate', function () {
+      const { hyphenate } = utils
+      expect(hyphenate).to.be.a('function')
+      expect(hyphenate('')).to.be.equal('')
+      expect(hyphenate('dispaly')).to.be.equal('dispaly')
+      expect(hyphenate('WebkitTransform')).to.be.equal('webkit-transform')
+      expect(hyphenate('textOverflow')).to.be.equal('text-overflow')
+      expect(hyphenate('aBCD')).to.be.equal('a-b-c-d')
+    })
+
+    it('extend', function () {
+      const { extend } = utils
+      expect(extend).to.be.a('function')
+
+      const abc = { name: 'abc' }
+      expect(extend(abc)).to.deep.equal(abc)
+      expect(extend(abc, { name: 'x' }) === abc).to.be.true
+      expect(abc).to.deep.equal({ name: 'x' })
+    })
+  })
+
+})



[09/23] incubator-weex git commit: * [html5] add tests for removing scoped stylesheet nodes.

Posted by so...@apache.org.
* [html5] add tests for removing scoped stylesheet nodes.


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

Branch: refs/heads/0.12-dev
Commit: 501c85fa864eeb575872f46204a6f2e4d8a61eb1
Parents: e8ab269
Author: MrRaindrop <te...@gmail.com>
Authored: Thu Apr 6 23:05:44 2017 +0800
Committer: MrRaindrop <te...@gmail.com>
Committed: Thu Apr 6 23:05:44 2017 +0800

----------------------------------------------------------------------
 html5/render/vue/core/style.js                | 25 ++++++--
 html5/test/render/vue/components/switch.js    |  4 --
 html5/test/render/vue/components/text.js      |  4 --
 html5/test/render/vue/components/web.js       |  4 --
 html5/test/render/vue/core/scope-style-map.js | 70 ++++++++++++++++++++--
 html5/test/render/vue/core/style.js           | 16 ++++-
 html5/test/render/vue/helper/index.js         | 21 +++----
 html5/test/render/vue/helper/runtime.js       | 18 +++---
 package.json                                  |  2 +-
 packages/weex-vue-render/package.json         |  2 +-
 10 files changed, 120 insertions(+), 46 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501c85fa/html5/render/vue/core/style.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/core/style.js b/html5/render/vue/core/style.js
index 09357cf..d5b5d83 100644
--- a/html5/render/vue/core/style.js
+++ b/html5/render/vue/core/style.js
@@ -19,9 +19,17 @@ export function getHeadStyleMap () {
   const needToRemoveStyleSheetNodes = []
   const res = Array.from(document.styleSheets || [])
     .reduce((pre, styleSheet) => {
-      // why not using styleSheet.rules || styleSheet.cssRules to get css rules ?
-      // because weex's components defined non-standard style attributes, which is
-      // auto ignored when access rule.cssText.
+      /**
+       * why not using styleSheet.rules || styleSheet.cssRules to get css rules ?
+       * because weex's components defined non-standard style attributes, which is
+       * auto ignored when access rule.cssText.
+       */
+      if (!styleSheet.cssRules) {
+        /**
+         * no rules. just ignore this. probably a link stylesheet.
+         */
+        return pre
+      }
       const strArr = trimComment(styleSheet.ownerNode.textContent.trim()).split(/}/)
       const len = strArr.length
       const rules = []
@@ -77,9 +85,14 @@ export function getHeadStyleMap () {
       needToRemoveStyleSheetNodes.push(styleSheet.ownerNode)
       return pre
     }, {})
-  needToRemoveStyleSheetNodes.forEach(function (node) {
-    node.parentNode.removeChild(node)
-  })
+  if (!window._no_remove_style_sheets) {
+    needToRemoveStyleSheetNodes.forEach(function (node) {
+      node.parentNode.removeChild(node)
+    })
+  }
+  else if (process.env.NODE_ENV === 'development') {
+    console.warn(`[vue-render] you've defined '_no_remove_style_sheets' and the v-data-xx stylesheets will not be removed.`)
+  }
   if (process.env.NODE_ENV === 'development') {
     tagEnd('getHeadStyleMap')
   }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501c85fa/html5/test/render/vue/components/switch.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/components/switch.js b/html5/test/render/vue/components/switch.js
index 2c892f3..36d8d1c 100644
--- a/html5/test/render/vue/components/switch.js
+++ b/html5/test/render/vue/components/switch.js
@@ -8,10 +8,6 @@ init('<switch> component', (Vue, helper) => {
     helper.register('switch', _switch)
   })
 
-  after(() => {
-    helper.reset()
-  })
-
   it('simple <switch> component', () => {
     const vm = compile(`<switch></switch>`)
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501c85fa/html5/test/render/vue/components/text.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/components/text.js b/html5/test/render/vue/components/text.js
index 4f5ff94..13e661f 100644
--- a/html5/test/render/vue/components/text.js
+++ b/html5/test/render/vue/components/text.js
@@ -9,10 +9,6 @@ init('<text> component', (Vue, helper) => {
     helper.register('text', text)
   })
 
-  after(() => {
-    helper.reset()
-  })
-
   it('create simple text component', () => {
     const vm = compile(`<text>abc</text>`)
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501c85fa/html5/test/render/vue/components/web.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/components/web.js b/html5/test/render/vue/components/web.js
index 642bd4a..ca61f0a 100644
--- a/html5/test/render/vue/components/web.js
+++ b/html5/test/render/vue/components/web.js
@@ -7,10 +7,6 @@ init('<web> component', (Vue, helper) => {
     helper.register('web', web)
   })
 
-  after(() => {
-    helper.reset()
-  })
-
   it('simple <web> component', () => {
     const vm = compile(`<web></web>`)
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501c85fa/html5/test/render/vue/core/scope-style-map.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/core/scope-style-map.js b/html5/test/render/vue/core/scope-style-map.js
index 2ead7e8..8968687 100644
--- a/html5/test/render/vue/core/scope-style-map.js
+++ b/html5/test/render/vue/core/scope-style-map.js
@@ -1,16 +1,78 @@
-import {
-  getHeadStyleMap
-} from '../../../../render/vue/core/style'
+import { getHeadStyleMap } from '../../../../render/vue/core/style'
 import '../data/head-css'
 import headMap from '../data/head-map'
 
-describe('style map', (Vue, helper) => {
+function toArray (arr) {
+  return Array.prototype.slice.call(arr)
+}
+
+function getVStyleSheetNodes () {
+  const regVStyleSheets = /((?:,?\s*\.[\w-]+\[data-v-\w+\](?::\w+)?)+)\s*({[^}]+)/
+  const nodes = toArray(document.styleSheets)
+    .filter(function (styleSheet) {
+      return regVStyleSheets.test(styleSheet.ownerNode.textContent)
+    }).map(function (styleSheet) {
+      return styleSheet.ownerNode
+    })
+  return nodes
+}
+
+function getStyleSheetNodes () {
+  return toArray(document.styleSheets)
+    .map(function (styleSheet) {
+      return styleSheet.ownerNode
+    })
+}
+
+describe('style map', () => {
+
+  let styleSheetNodes
+
+  before(function () {
+    styleSheetNodes = getStyleSheetNodes()
+  })
+
   it('should get head style map.', () => {
+    /**
+     * before get style map.
+     */
+    const vStyleSheetNodes = getVStyleSheetNodes()
+    const allNodes = getStyleSheetNodes()
+    const vNodesExisted = vStyleSheetNodes.filter(function (node) {
+      return allNodes.indexOf(node) > -1
+    })
+    expect(vNodesExisted).to.have.members(vStyleSheetNodes)
+
+    /**
+     * get style map.
+     */
+    window._no_remove_style_sheets = false
     const styleMap = getHeadStyleMap()
+    window._no_remove_style_sheets = true
+
+    /**
+     * after get style map.
+     */
     for (const key in headMap) {
       const expected = headMap[key]
       const result = styleMap[key]
+      debugger;
       expect(expected).be.deep.equal(result)
     }
+
+    const nowStyleSheetNodes = getStyleSheetNodes()
+    const vNodesLeft = vStyleSheetNodes.filter(function (node) {
+      return nowStyleSheetNodes.indexOf(node) > -1
+    })
+    expect(vNodesLeft).to.have.lengthOf(0)
+  })
+
+  after(function () {
+    const nodes = getStyleSheetNodes()
+    styleSheetNodes.forEach(function (node) {
+      if (nodes.indexOf(node) === -1) {
+        document.head.appendChild(node)
+      }
+    })
   })
 })

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501c85fa/html5/test/render/vue/core/style.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/core/style.js b/html5/test/render/vue/core/style.js
index 4b6b88f..cacdd57 100644
--- a/html5/test/render/vue/core/style.js
+++ b/html5/test/render/vue/core/style.js
@@ -11,10 +11,24 @@ import { init as initViewport, resetViewport } from '../../../../render/vue/env/
 
 import scopedStyleBundle from '../data/build/dotvue/scoped-style'
 
+function toArray (arr) {
+  return Array.prototype.slice.call(arr)
+}
+
+function getVStyleSheetNodes () {
+  const regVStyleSheets = /((?:,?\s*\.[\w-]+\[data-v-\w+\](?::\w+)?)+)\s*({[^}]+)/
+  const nodes = toArray(document.styleSheets)
+    .filter(function (styleSheet) {
+      return regVStyleSheets.test(styleSheet.ownerNode.textContent)
+    }).map(function (styleSheet) {
+      return styleSheet.ownerNode
+    })
+  return nodes
+}
+
 init('core style', (Vue, helper) => {
   const { compile, utils } = helper
   const { scale } = initViewport()
-
   before(() => {
     helper.register('div', div)
     helper.register('image', image)

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501c85fa/html5/test/render/vue/helper/index.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/helper/index.js b/html5/test/render/vue/helper/index.js
index 425aa5c..e89ac86 100644
--- a/html5/test/render/vue/helper/index.js
+++ b/html5/test/render/vue/helper/index.js
@@ -5,6 +5,7 @@ import Vue from 'vue/dist/vue.esm.js'
 // import { base, scrollable, style, inputCommon } from '../../../render/vue/mixins'
 import { base, style } from '../../../../render/vue/mixins'
 import weex from '../../../../render/vue/env/weex'
+import { setVue } from '../../../../render/vue/env'
 
 import * as utils from './utils'
 
@@ -23,8 +24,12 @@ export function init (title, fn) {
       Vue.mixin(base)
       Vue.mixin(style)
 
+      setVue(Vue)
+
       window.global = window
       global.weex = weex
+
+      window._no_remove_style_sheets = true
     })
 
     const helper = {
@@ -36,14 +41,8 @@ export function init (title, fn) {
        * @param  {object} component.
        */
       register (name, component) {
-        components[name] = component
-      },
-
-      /**
-       * reset registered components with empty object.
-       */
-      reset () {
-        components = {}
+        global.weex.registerComponent(name, component)
+        // components[name] = component
       },
 
       /**
@@ -52,7 +51,7 @@ export function init (title, fn) {
        * @return {Vue} vue instance.
        */
       createVm (options = {}) {
-        options.components = components
+        // options.components = components
         return new Vue(options).$mount()
       },
 
@@ -70,10 +69,6 @@ export function init (title, fn) {
      * describe a vue-render test for certain vue verson.
      */
     describe(`Vue ${Vue.version}`, () => {
-      after(function () {
-        helper.reset()
-      })
-
       fn(Vue, helper)
     })
   })

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501c85fa/html5/test/render/vue/helper/runtime.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/helper/runtime.js b/html5/test/render/vue/helper/runtime.js
index 6f5ea17..319fd20 100644
--- a/html5/test/render/vue/helper/runtime.js
+++ b/html5/test/render/vue/helper/runtime.js
@@ -5,6 +5,7 @@ import Vue from 'vue/dist/vue.runtime.esm.js'
 // import { base, scrollable, style, inputCommon } from '../../../render/vue/mixins'
 import { base, style } from '../../../../render/vue/mixins'
 import weex from '../../../../render/vue/env/weex'
+import { setVue } from '../../../../render/vue/env'
 
 import * as utils from './utils'
 
@@ -23,8 +24,12 @@ export function init (title, fn) {
       Vue.mixin(base)
       Vue.mixin(style)
 
+      setVue(Vue)
+
       window.global = window
       global.weex = weex
+
+      window._no_remove_style_sheets = true
     })
 
     const helper = {
@@ -36,15 +41,16 @@ export function init (title, fn) {
        * @param  {object} component.
        */
       register (name, component) {
+        global.weex.registerComponent(name, component)
         components[name] = component
       },
 
       /**
        * reset registered components with empty object.
        */
-      reset () {
-        components = {}
-      },
+      // reset () {
+      //   components = {}
+      // },
 
       /**
        * create a vm instance of Vue.
@@ -52,7 +58,7 @@ export function init (title, fn) {
        * @return {Vue} vue instance.
        */
       createVm (options = {}) {
-        options.components = components
+        // options.components = components
         return new Vue(options).$mount()
       },
 
@@ -70,10 +76,6 @@ export function init (title, fn) {
      * describe a vue-render test for certain vue verson.
      */
     describe(`Vue ${Vue.version}`, () => {
-      after(function () {
-        helper.reset()
-      })
-
       fn(Vue, helper)
     })
   })

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501c85fa/package.json
----------------------------------------------------------------------
diff --git a/package.json b/package.json
index d5736c7..94d1027 100644
--- a/package.json
+++ b/package.json
@@ -4,7 +4,7 @@
   "subversion": {
     "browser": "0.5.0",
     "framework": "0.19.17",
-    "vue-render": "0.11.4",
+    "vue-render": "0.11.5",
     "transformer": ">=0.1.5 <0.5"
   },
   "description": "A framework for building Mobile cross-platform UI",

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501c85fa/packages/weex-vue-render/package.json
----------------------------------------------------------------------
diff --git a/packages/weex-vue-render/package.json b/packages/weex-vue-render/package.json
index 81ddff0..9e28dc2 100644
--- a/packages/weex-vue-render/package.json
+++ b/packages/weex-vue-render/package.json
@@ -1,6 +1,6 @@
 {
   "name": "weex-vue-render",
-  "version": "0.11.4",
+  "version": "0.11.5",
   "description": "Weex built-in components for Vue 2.x.",
   "license": "Apache-2.0",
   "main": "src/render/vue/index.js",


[22/23] incubator-weex git commit: Merge branch '0.11-dev' into 0.12-dev

Posted by so...@apache.org.
Merge branch '0.11-dev' into 0.12-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/b932600a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/b932600a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/b932600a

Branch: refs/heads/0.12-dev
Commit: b932600a8f79b3ad9a75ca9be9c94a24e8e5811d
Parents: 102e37d bbb120d
Author: sospartan <so...@apache.org>
Authored: Thu Apr 13 10:31:21 2017 +0800
Committer: sospartan <so...@apache.org>
Committed: Thu Apr 13 10:31:21 2017 +0800

----------------------------------------------------------------------
 .eslintignore                                   |   1 +
 .gitignore                                      |   2 +-
 NOTICE                                          |   8 +-
 build/karma.vue.conf.js                         |   7 +-
 build/webpack.examples.web.config.js            |  31 +-
 build/webpack.test.web.config.js                |  81 +++
 examples/vue/showcase/itemlist.vue              |  11 +-
 examples/vue/style/index.vue                    |   2 +-
 .../npm/karma-rollup-preprocessor_vx.x.x.js     |  53 ++
 flow-typed/npm/karma-sinon-chai_vx.x.x.js       |  38 ++
 html5/render/vue/README.md                      |  24 +-
 html5/render/vue/components/a.js                |  18 +-
 html5/render/vue/components/div.js              |  18 +-
 html5/render/vue/components/image.js            |  25 +-
 html5/render/vue/components/input.js            |  18 +-
 .../render/vue/components/scrollable/header.js  |   6 +-
 .../vue/components/scrollable/list/cell.js      |   7 +-
 .../vue/components/scrollable/list/index.js     |   6 +-
 .../vue/components/scrollable/list/style.js     |  16 +
 .../components/scrollable/loading-indicator.js  |  44 +-
 .../render/vue/components/scrollable/loading.js |   6 +-
 .../render/vue/components/scrollable/refresh.js |   6 +-
 .../vue/components/scrollable/scroller.js       |   8 +-
 html5/render/vue/components/slider/index.js     |  37 +-
 html5/render/vue/components/slider/indicator.js |  58 +-
 html5/render/vue/components/switch.js           |  67 ++-
 html5/render/vue/components/text.js             |  27 +-
 html5/render/vue/components/textarea.js         |  19 +-
 html5/render/vue/components/video.js            |   7 +-
 html5/render/vue/components/web.js              |  19 +-
 html5/render/vue/core/index.js                  |   2 +
 html5/render/vue/core/node.js                   |  28 +
 html5/render/vue/core/style.js                  | 212 ++++++++
 html5/render/vue/env/global.js                  |  11 +
 html5/render/vue/env/index.js                   |  11 +-
 html5/render/vue/env/viewport.js                | 163 ++++--
 html5/render/vue/env/weex.js                    |   9 +-
 html5/render/vue/env/wx-env.js                  |  76 +--
 html5/render/vue/index.js                       |  13 +-
 html5/render/vue/mixins/base.js                 |  43 --
 html5/render/vue/mixins/style.js                | 142 +----
 html5/render/vue/modules/animation.js           |   7 +-
 html5/render/vue/modules/dom.js                 |   5 +-
 html5/render/vue/modules/index.js               |   2 +-
 html5/render/vue/modules/modal/index.js         |  10 +-
 html5/render/vue/modules/modal/style.js         | 146 ++++++
 html5/render/vue/styles/base.css                | 194 +++++++
 html5/render/vue/styles/components.css          | 513 ------------------
 html5/render/vue/utils/index.js                 |  36 +-
 html5/render/vue/utils/style.js                 | 110 ++++
 html5/test/render/vue/components/image.js       |   4 +-
 html5/test/render/vue/components/switch.js      |   4 -
 html5/test/render/vue/components/text.js        |   4 -
 html5/test/render/vue/components/web.js         |   4 -
 html5/test/render/vue/core/scope-style-map.js   |  76 +++
 html5/test/render/vue/core/style.js             |  65 +++
 .../vue/data/build/dotvue/scoped-style.js       | 525 +++++++++++++++++++
 html5/test/render/vue/data/css/head1.css        |  38 ++
 html5/test/render/vue/data/css/head10.css       |  14 +
 html5/test/render/vue/data/css/head11.css       |   2 +
 html5/test/render/vue/data/css/head12.css       |   2 +
 html5/test/render/vue/data/css/head13.css       |  25 +
 html5/test/render/vue/data/css/head2.css        |  11 +
 html5/test/render/vue/data/css/head3.css        |  25 +
 html5/test/render/vue/data/css/head4.css        |  56 ++
 html5/test/render/vue/data/css/head5.css        | 153 ++++++
 html5/test/render/vue/data/css/head6.css        |   4 +
 html5/test/render/vue/data/css/head7.css        |  61 +++
 html5/test/render/vue/data/css/head8.css        | 507 ++++++++++++++++++
 html5/test/render/vue/data/css/head9.css        | 173 ++++++
 .../render/vue/data/dotvue/scoped-style.vue     |  13 +
 html5/test/render/vue/data/head-css.js          |  13 +
 html5/test/render/vue/data/head-map.js          | 275 ++++++++++
 html5/test/render/vue/helper.js                 | 140 -----
 html5/test/render/vue/helper/env.js             |  20 +
 html5/test/render/vue/helper/index.js           |  73 +++
 html5/test/render/vue/helper/runtime.js         |  74 +++
 html5/test/render/vue/helper/utils.js           |   8 +
 html5/test/render/vue/utils.js                  |  47 --
 html5/test/render/vue/utils/func.js             |  49 ++
 html5/test/render/vue/utils/style.js            |  68 +++
 package.json                                    |   7 +-
 packages/weex-vue-render/README.md              |  24 +-
 packages/weex-vue-render/package.json           |   2 +-
 84 files changed, 3829 insertions(+), 1140 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b932600a/NOTICE
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b932600a/html5/render/vue/components/a.js
----------------------------------------------------------------------
diff --cc html5/render/vue/components/a.js
index e4c953c,83851b2..bf12d21
--- a/html5/render/vue/components/a.js
+++ b/html5/render/vue/components/a.js
@@@ -1,21 -1,11 +1,29 @@@
 +/*
 + * Licensed to the Apache Software Foundation (ASF) under one
 + * or more contributor license agreements.  See the NOTICE file
 + * distributed with this work for additional information
 + * regarding copyright ownership.  The ASF licenses this file
 + * to you under the Apache License, Version 2.0 (the
 + * "License"); you may not use this file except in compliance
 + * with the License.  You may obtain a copy of the License at
 + *
 + *   http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing,
 + * software distributed under the License is distributed on an
 + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 + * KIND, either express or implied.  See the License for the
 + * specific language governing permissions and limitations
 + * under the License.
 + */
+ import { extractComponentStyle, trimTextVNodes, createEventMap } from '../core'
+ // import { validateStyles } from '../validator'
+ 
+ const _css = `
+ .weex-a {
+   text-decoration: none;
+ }
+ `
  
  export default {
    name: 'weex-a',

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b932600a/html5/render/vue/components/div.js
----------------------------------------------------------------------
diff --cc html5/render/vue/components/div.js
index 3425476,bdc90d0..9811332
--- a/html5/render/vue/components/div.js
+++ b/html5/render/vue/components/div.js
@@@ -1,21 -1,11 +1,29 @@@
 +/*
 + * Licensed to the Apache Software Foundation (ASF) under one
 + * or more contributor license agreements.  See the NOTICE file
 + * distributed with this work for additional information
 + * regarding copyright ownership.  The ASF licenses this file
 + * to you under the Apache License, Version 2.0 (the
 + * "License"); you may not use this file except in compliance
 + * with the License.  You may obtain a copy of the License at
 + *
 + *   http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing,
 + * software distributed under the License is distributed on an
 + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 + * KIND, either express or implied.  See the License for the
 + * specific language governing permissions and limitations
 + * under the License.
 + */
+ // import { validateStyles } from '../validator'
+ import { extractComponentStyle, trimTextVNodes, createEventMap } from '../core'
+ 
+ const _css = `
+ body > .weex-div {
+   min-height: 100%;
+ }
+ `
  
  export default {
    name: 'weex-div',

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b932600a/html5/render/vue/components/image.js
----------------------------------------------------------------------
diff --cc html5/render/vue/components/image.js
index 5ee785c,b245338..39caa55
--- a/html5/render/vue/components/image.js
+++ b/html5/render/vue/components/image.js
@@@ -1,22 -1,12 +1,31 @@@
 +/*
 + * Licensed to the Apache Software Foundation (ASF) under one
 + * or more contributor license agreements.  See the NOTICE file
 + * distributed with this work for additional information
 + * regarding copyright ownership.  The ASF licenses this file
 + * to you under the Apache License, Version 2.0 (the
 + * "License"); you may not use this file except in compliance
 + * with the License.  You may obtain a copy of the License at
 + *
 + *   http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing,
 + * software distributed under the License is distributed on an
 + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 + * KIND, either express or implied.  See the License for the
 + * specific language governing permissions and limitations
 + * under the License.
 + */
 +
+ import { extractComponentStyle, createEventMap } from '../core'
+ import { extend } from '../utils'
+ 
+ const _css = `
+ .weex-image, .weex-img {
+   background-repeat: no-repeat;
+   background-position: 50% 50%;
+ }
+ `
  /**
   * get resize (stetch|cover|contain) related styles.
   */

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b932600a/html5/render/vue/components/input.js
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b932600a/html5/render/vue/components/scrollable/header.js
----------------------------------------------------------------------
diff --cc html5/render/vue/components/scrollable/header.js
index f58962b,9fdeddb..9753209
--- a/html5/render/vue/components/scrollable/header.js
+++ b/html5/render/vue/components/scrollable/header.js
@@@ -1,22 -1,6 +1,23 @@@
 -// import { validateStyles } from '../../validator'
 +/*
 + * Licensed to the Apache Software Foundation (ASF) under one
 + * or more contributor license agreements.  See the NOTICE file
 + * distributed with this work for additional information
 + * regarding copyright ownership.  The ASF licenses this file
 + * to you under the Apache License, Version 2.0 (the
 + * "License"); you may not use this file except in compliance
 + * with the License.  You may obtain a copy of the License at
 + *
 + *   http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing,
 + * software distributed under the License is distributed on an
 + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 + * KIND, either express or implied.  See the License for the
 + * specific language governing permissions and limitations
 + * under the License.
 + */
  import { supportSticky } from '../../utils/style'
+ import { extractComponentStyle, createEventMap } from '../../core'
  
  export default {
    data () {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b932600a/html5/render/vue/components/scrollable/list/cell.js
----------------------------------------------------------------------
diff --cc html5/render/vue/components/scrollable/list/cell.js
index d3d6160,ab8910c..2f37f4a
--- a/html5/render/vue/components/scrollable/list/cell.js
+++ b/html5/render/vue/components/scrollable/list/cell.js
@@@ -1,21 -1,5 +1,23 @@@
 +/*
 + * Licensed to the Apache Software Foundation (ASF) under one
 + * or more contributor license agreements.  See the NOTICE file
 + * distributed with this work for additional information
 + * regarding copyright ownership.  The ASF licenses this file
 + * to you under the Apache License, Version 2.0 (the
 + * "License"); you may not use this file except in compliance
 + * with the License.  You may obtain a copy of the License at
 + *
 + *   http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing,
 + * software distributed under the License is distributed on an
 + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 + * KIND, either express or implied.  See the License for the
 + * specific language governing permissions and limitations
 + * under the License.
 + */
+ // import { validateStyles } from '../../../validator'
+ import { extractComponentStyle, createEventMap } from '../../../core'
  
  export default {
    render (createElement) {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b932600a/html5/render/vue/components/scrollable/list/index.js
----------------------------------------------------------------------
diff --cc html5/render/vue/components/scrollable/list/index.js
index b920879,fc803c6..a5fceff
--- a/html5/render/vue/components/scrollable/list/index.js
+++ b/html5/render/vue/components/scrollable/list/index.js
@@@ -1,21 -1,4 +1,22 @@@
 +/*
 + * Licensed to the Apache Software Foundation (ASF) under one
 + * or more contributor license agreements.  See the NOTICE file
 + * distributed with this work for additional information
 + * regarding copyright ownership.  The ASF licenses this file
 + * to you under the Apache License, Version 2.0 (the
 + * "License"); you may not use this file except in compliance
 + * with the License.  You may obtain a copy of the License at
 + *
 + *   http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing,
 + * software distributed under the License is distributed on an
 + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 + * KIND, either express or implied.  See the License for the
 + * specific language governing permissions and limitations
 + * under the License.
 + */
+ import { extractComponentStyle, createEventMap } from '../../../core'
  import { scrollable } from '../../../mixins'
  // import { validateStyles } from '../../../validator'
  import { extend } from '../../../utils'

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b932600a/html5/render/vue/components/scrollable/loading-indicator.js
----------------------------------------------------------------------
diff --cc html5/render/vue/components/scrollable/loading-indicator.js
index e41edf2,b184cca..8d82eed
--- a/html5/render/vue/components/scrollable/loading-indicator.js
+++ b/html5/render/vue/components/scrollable/loading-indicator.js
@@@ -1,21 -1,40 +1,59 @@@
 +/*
 + * Licensed to the Apache Software Foundation (ASF) under one
 + * or more contributor license agreements.  See the NOTICE file
 + * distributed with this work for additional information
 + * regarding copyright ownership.  The ASF licenses this file
 + * to you under the Apache License, Version 2.0 (the
 + * "License"); you may not use this file except in compliance
 + * with the License.  You may obtain a copy of the License at
 + *
 + *   http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing,
 + * software distributed under the License is distributed on an
 + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 + * KIND, either express or implied.  See the License for the
 + * specific language governing permissions and limitations
 + * under the License.
 + */
+ import { extractComponentStyle } from '../../core'
+ 
+ const _css = `
+ .weex-refresh-indicator,
+ .weex-loading-indicator {
+   width: 1.0rem;
+   height: 1.0rem;
+   -webkit-box-align: center;
+   -webkit-align-items: center;
+       -ms-flex-align: center;
+           align-items: center;
+   -webkit-box-pack: center;
+   -webkit-justify-content: center;
+       -ms-flex-pack: center;
+           justify-content: center;
+   overflow: visible;
+   background: none;
+ }
+ .weex-refresh-indicator:before,
+ .weex-loading-indicator:before {
+   display: block;
+   content: '';
+   font-size: 0.16rem;
+   width: 1em;
+   height: 1em;
+   left: -60%;
+   top: 40%;
+   border-radius: 50%;
+   position: relative;
+   text-indent: -9999em;
+   -webkit-animation: weex-spinner 1.1s infinite ease;
+           animation: weex-spinner 1.1s infinite ease;
+   -webkit-transform: translate3d(1.0rem, 0, 0);
+           transform: translate3d(1.0rem, 0, 0);
+ }
+ `
+ 
++>>>>>>> 0.11-dev
  export default {
    render (createElement) {
      this.weexType = 'loading-indicator'

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b932600a/html5/render/vue/components/scrollable/loading.js
----------------------------------------------------------------------
diff --cc html5/render/vue/components/scrollable/loading.js
index a8e07fa,8f01fde..e8bef52
--- a/html5/render/vue/components/scrollable/loading.js
+++ b/html5/render/vue/components/scrollable/loading.js
@@@ -1,21 -1,4 +1,22 @@@
 +/*
 + * Licensed to the Apache Software Foundation (ASF) under one
 + * or more contributor license agreements.  See the NOTICE file
 + * distributed with this work for additional information
 + * regarding copyright ownership.  The ASF licenses this file
 + * to you under the Apache License, Version 2.0 (the
 + * "License"); you may not use this file except in compliance
 + * with the License.  You may obtain a copy of the License at
 + *
 + *   http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing,
 + * software distributed under the License is distributed on an
 + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 + * KIND, either express or implied.  See the License for the
 + * specific language governing permissions and limitations
 + * under the License.
 + */
+ import { extractComponentStyle } from '../../core'
  import LoadingIndicator from './loading-indicator'
  
  export default {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b932600a/html5/render/vue/components/scrollable/refresh.js
----------------------------------------------------------------------
diff --cc html5/render/vue/components/scrollable/refresh.js
index 1093edf,1d941d4..a770095
--- a/html5/render/vue/components/scrollable/refresh.js
+++ b/html5/render/vue/components/scrollable/refresh.js
@@@ -1,21 -1,4 +1,22 @@@
 +/*
 + * Licensed to the Apache Software Foundation (ASF) under one
 + * or more contributor license agreements.  See the NOTICE file
 + * distributed with this work for additional information
 + * regarding copyright ownership.  The ASF licenses this file
 + * to you under the Apache License, Version 2.0 (the
 + * "License"); you may not use this file except in compliance
 + * with the License.  You may obtain a copy of the License at
 + *
 + *   http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing,
 + * software distributed under the License is distributed on an
 + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 + * KIND, either express or implied.  See the License for the
 + * specific language governing permissions and limitations
 + * under the License.
 + */
+ import { extractComponentStyle } from '../../core'
  import LoadingIndicator from './loading-indicator'
  import { createEvent } from '../../utils'
  

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b932600a/html5/render/vue/components/scrollable/scroller.js
----------------------------------------------------------------------
diff --cc html5/render/vue/components/scrollable/scroller.js
index 67fe9ca,b56ef70..96ebc10
--- a/html5/render/vue/components/scrollable/scroller.js
+++ b/html5/render/vue/components/scrollable/scroller.js
@@@ -1,21 -1,4 +1,22 @@@
 +/*
 + * Licensed to the Apache Software Foundation (ASF) under one
 + * or more contributor license agreements.  See the NOTICE file
 + * distributed with this work for additional information
 + * regarding copyright ownership.  The ASF licenses this file
 + * to you under the Apache License, Version 2.0 (the
 + * "License"); you may not use this file except in compliance
 + * with the License.  You may obtain a copy of the License at
 + *
 + *   http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing,
 + * software distributed under the License is distributed on an
 + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 + * KIND, either express or implied.  See the License for the
 + * specific language governing permissions and limitations
 + * under the License.
 + */
+ import { extractComponentStyle, createEventMap } from '../../core'
  import { scrollable } from '../../mixins'
  // import { validateStyles } from '../../validator'
  import { extend } from '../../utils'

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b932600a/html5/render/vue/components/slider/index.js
----------------------------------------------------------------------
diff --cc html5/render/vue/components/slider/index.js
index 1523edf,b37b0a2..c5a1eeb
--- a/html5/render/vue/components/slider/index.js
+++ b/html5/render/vue/components/slider/index.js
@@@ -1,21 -1,5 +1,23 @@@
 +/*
 + * Licensed to the Apache Software Foundation (ASF) under one
 + * or more contributor license agreements.  See the NOTICE file
 + * distributed with this work for additional information
 + * regarding copyright ownership.  The ASF licenses this file
 + * to you under the Apache License, Version 2.0 (the
 + * "License"); you may not use this file except in compliance
 + * with the License.  You may obtain a copy of the License at
 + *
 + *   http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing,
 + * software distributed under the License is distributed on an
 + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 + * KIND, either express or implied.  See the License for the
 + * specific language governing permissions and limitations
 + * under the License.
 + */
+ // import { validateStyles } from '../../validator'
+ import { extractComponentStyle, createEventMap } from '../../core'
  import { throttle, bind, extend, fireLazyload } from '../../utils'
  import indicator from './indicator'
  import slideMixin from './slideMixin'

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b932600a/html5/render/vue/components/slider/indicator.js
----------------------------------------------------------------------
diff --cc html5/render/vue/components/slider/indicator.js
index ce9e45b,6722041..97388bb
--- a/html5/render/vue/components/slider/indicator.js
+++ b/html5/render/vue/components/slider/indicator.js
@@@ -1,27 -1,39 +1,57 @@@
 +/*
 + * Licensed to the Apache Software Foundation (ASF) under one
 + * or more contributor license agreements.  See the NOTICE file
 + * distributed with this work for additional information
 + * regarding copyright ownership.  The ASF licenses this file
 + * to you under the Apache License, Version 2.0 (the
 + * "License"); you may not use this file except in compliance
 + * with the License.  You may obtain a copy of the License at
 + *
 + *   http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing,
 + * software distributed under the License is distributed on an
 + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 + * KIND, either express or implied.  See the License for the
 + * specific language governing permissions and limitations
 + * under the License.
 + */
+ import { extractComponentStyle } from '../../core'
  import { extend, extendKeys } from '../../utils'
  
+ const _css = `
+ .weex-indicator {
+   position: absolute;
+   z-index: 10;
+   -webkit-flex-direction: row;
+   -ms-flex-direction: row;
+   flex-direction: row;
+   -webkit-box-orient: horizontal;
+   margin: 0;
+   padding: 0;
+ }
+ 
+ .weex-indicator-item {
+   display: inline-block;
+   position: relative;
+   border-radius: 50%;
+   width: 0.266667rem;
+   height: 0.266667rem;
+   background-color: #BBBBBB;
+ }
+ .weex-indicator-item + .weex-indicator-item {
+   margin-left: 0.133333rem;
+ }
+ 
+ .weex-indicator-item-active {
+   background-color: blue;
+ }
+ `
+ 
  function getIndicatorItemStyle (spec, isActive) {
    const style = {}
-   style['background-color'] = spec[isActive ? 'item-selected-color' : 'item-color']
-   style['width'] = style['height'] = spec['item-size']
+   style['background-color'] = spec[isActive ? 'itemSelectedColor' : 'itemColor']
+   style['width'] = style['height'] = spec['itemSize']
    return style
  }
  

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b932600a/html5/render/vue/components/switch.js
----------------------------------------------------------------------
diff --cc html5/render/vue/components/switch.js
index 49b55af,cf904c3..426beb5
--- a/html5/render/vue/components/switch.js
+++ b/html5/render/vue/components/switch.js
@@@ -1,21 -1,62 +1,80 @@@
 +/*
 + * Licensed to the Apache Software Foundation (ASF) under one
 + * or more contributor license agreements.  See the NOTICE file
 + * distributed with this work for additional information
 + * regarding copyright ownership.  The ASF licenses this file
 + * to you under the Apache License, Version 2.0 (the
 + * "License"); you may not use this file except in compliance
 + * with the License.  You may obtain a copy of the License at
 + *
 + *   http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing,
 + * software distributed under the License is distributed on an
 + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 + * KIND, either express or implied.  See the License for the
 + * specific language governing permissions and limitations
 + * under the License.
 + */
+ // import { validateStyles } from '../validator'
+ import { extractComponentStyle } from '../core'
+ 
+ const _css = `
+ .weex-switch {
+   border: 0.013333rem solid #dfdfdf;
+   cursor: pointer;
+   display: inline-block;
+   position: relative;
+   vertical-align: middle;
+   -webkit-user-select: none;
+      -moz-user-select: none;
+       -ms-user-select: none;
+           user-select: none;
+   box-sizing: content-box;
+   background-clip: content-box;
+   color: #64bd63;
+   width: 1.333333rem;
+   height: 0.8rem;
+   background-color: white;
+   border-color: #dfdfdf;
+   box-shadow: #dfdfdf 0 0 0 0 inset;
+   border-radius: 0.8rem;
+   -webkit-transition: border 0.4s, box-shadow 0.4s, background-color 1.2s;
+           transition: border 0.4s, box-shadow 0.4s, background-color 1.2s;
+ }
+ 
+ .weex-switch-checked {
+   background-color: #64bd63;
+   border-color: #64bd63;
+   box-shadow: #64bd63 0 0 0 0.533333rem inset;
+ }
+ 
+ .weex-switch-checked.weex-switch-disabled {
+   background-color: #A0CCA0;
+   box-shadow: #A0CCA0 0 0 0 0.533333rem inset;
+ }
+ 
+ .weex-switch-disabled {
+   background-color: #EEEEEE;
+ }
+ 
+ .weex-switch-inner {
+   width: 0.8rem;
+   height: 0.8rem;
+   background: #fff;
+   border-radius: 100%;
+   box-shadow: 0 0.013333rem 0.04rem rgba(0, 0, 0, 0.4);
+   position: absolute;
+   top: 0;
+   left: 0;
+   -webkit-transition: background-color 0.4s, left 0.2s;
+           transition: background-color 0.4s, left 0.2s;
+ }
+ 
+ .weex-switch-checked > .weex-switch-inner {
+   left: 0.533333rem;
+ }
+ `
  
  export default {
    props: {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b932600a/html5/render/vue/components/text.js
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b932600a/html5/render/vue/components/textarea.js
----------------------------------------------------------------------
diff --cc html5/render/vue/components/textarea.js
index 65306f0,bc1ffdf..a1851ee
--- a/html5/render/vue/components/textarea.js
+++ b/html5/render/vue/components/textarea.js
@@@ -1,25 -1,18 +1,36 @@@
 +/*
 + * Licensed to the Apache Software Foundation (ASF) under one
 + * or more contributor license agreements.  See the NOTICE file
 + * distributed with this work for additional information
 + * regarding copyright ownership.  The ASF licenses this file
 + * to you under the Apache License, Version 2.0 (the
 + * "License"); you may not use this file except in compliance
 + * with the License.  You may obtain a copy of the License at
 + *
 + *   http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing,
 + * software distributed under the License is distributed on an
 + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 + * KIND, either express or implied.  See the License for the
 + * specific language governing permissions and limitations
 + * under the License.
 + */
+ import { extractComponentStyle, createEventMap } from '../core'
  import { inputCommon } from '../mixins'
  import { extend, mapFormEvents } from '../utils'
+ 
  // import { validateStyles } from '../validator'
  
+ const _css = `
+ .weex-textarea {
+   font-size: 0.426667rem
+ }
+ .weex-textarea:focus {
+   outline: none;
+ }
+ `
+ 
  export default {
    mixins: [inputCommon],
    props: {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b932600a/html5/render/vue/components/video.js
----------------------------------------------------------------------
diff --cc html5/render/vue/components/video.js
index 1031b5f,8c52672..b39bf4a
--- a/html5/render/vue/components/video.js
+++ b/html5/render/vue/components/video.js
@@@ -1,21 -1,5 +1,23 @@@
 +/*
 + * Licensed to the Apache Software Foundation (ASF) under one
 + * or more contributor license agreements.  See the NOTICE file
 + * distributed with this work for additional information
 + * regarding copyright ownership.  The ASF licenses this file
 + * to you under the Apache License, Version 2.0 (the
 + * "License"); you may not use this file except in compliance
 + * with the License.  You may obtain a copy of the License at
 + *
 + *   http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing,
 + * software distributed under the License is distributed on an
 + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 + * KIND, either express or implied.  See the License for the
 + * specific language governing permissions and limitations
 + * under the License.
 + */
+ // import { validateStyles } from '../validator'
+ import { extractComponentStyle, createEventMap } from '../core'
  
  export default {
    props: {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b932600a/html5/render/vue/components/web.js
----------------------------------------------------------------------
diff --cc html5/render/vue/components/web.js
index a17ec8a,9ae7d5f..1bf95a6
--- a/html5/render/vue/components/web.js
+++ b/html5/render/vue/components/web.js
@@@ -1,21 -1,4 +1,22 @@@
 +/*
 + * Licensed to the Apache Software Foundation (ASF) under one
 + * or more contributor license agreements.  See the NOTICE file
 + * distributed with this work for additional information
 + * regarding copyright ownership.  The ASF licenses this file
 + * to you under the Apache License, Version 2.0 (the
 + * "License"); you may not use this file except in compliance
 + * with the License.  You may obtain a copy of the License at
 + *
 + *   http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing,
 + * software distributed under the License is distributed on an
 + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 + * KIND, either express or implied.  See the License for the
 + * specific language governing permissions and limitations
 + * under the License.
 + */
+ import { extractComponentStyle, createEventMap } from '../core'
  import { createEvent } from '../utils'
  // import { validateStyles } from '../validator'
  

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b932600a/html5/render/vue/env/index.js
----------------------------------------------------------------------
diff --cc html5/render/vue/env/index.js
index 2f4f41b,73f640e..c00b251
--- a/html5/render/vue/env/index.js
+++ b/html5/render/vue/env/index.js
@@@ -1,23 -1,5 +1,23 @@@
 +/*
 + * Licensed to the Apache Software Foundation (ASF) under one
 + * or more contributor license agreements.  See the NOTICE file
 + * distributed with this work for additional information
 + * regarding copyright ownership.  The ASF licenses this file
 + * to you under the Apache License, Version 2.0 (the
 + * "License"); you may not use this file except in compliance
 + * with the License.  You may obtain a copy of the License at
 + *
 + *   http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing,
 + * software distributed under the License is distributed on an
 + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 + * KIND, either express or implied.  See the License for the
 + * specific language governing permissions and limitations
 + * under the License.
 + */
  import '../styles/reset.css'
- import '../styles/components.css'
+ import '../styles/base.css'
  
  // import 'lazyimg'
  import '../../browser/render/gesture'

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b932600a/html5/render/vue/env/viewport.js
----------------------------------------------------------------------
diff --cc html5/render/vue/env/viewport.js
index 3384b43,5a80893..dda12ca
--- a/html5/render/vue/env/viewport.js
+++ b/html5/render/vue/env/viewport.js
@@@ -1,21 -1,6 +1,24 @@@
 +/*
 + * Licensed to the Apache Software Foundation (ASF) under one
 + * or more contributor license agreements.  See the NOTICE file
 + * distributed with this work for additional information
 + * regarding copyright ownership.  The ASF licenses this file
 + * to you under the Apache License, Version 2.0 (the
 + * "License"); you may not use this file except in compliance
 + * with the License.  You may obtain a copy of the License at
 + *
 + *   http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing,
 + * software distributed under the License is distributed on an
 + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 + * KIND, either express or implied.  See the License for the
 + * specific language governing permissions and limitations
 + * under the License.
 + */
+ // @flow
+ 
+ import { extend } from '../utils/func'
  
  /**
   * viewport priority:
@@@ -25,12 -10,41 +28,46 @@@
   * 3. process.env.VIEWPORT_WIDTH (buid time)
   *
   */
++<<<<<<< HEAD
 +
 +let viewportWidth = process.env.VIEWPORT_WIDTH
++=======
+ let isInited = false
+ const DEFAULT_VIEWPORT_WIDTH = 750
+ 
+ /**
+  * get viewport width from weex-viewport meta.
+  */
+ const envViewportWidth = parseInt(process.env.VIEWPORT_WIDTH)
+ let width: number = !isNaN(envViewportWidth) && envViewportWidth > 0
+   ? envViewportWidth
+   : DEFAULT_VIEWPORT_WIDTH
++>>>>>>> 0.11-dev
  
- const wxViewportMeta = document.querySelector('meta[name="weex-viewport"]')
+ let wxViewportMeta = document.querySelector('meta[name="weex-viewport"]')
  const metaWidth = wxViewportMeta && parseInt(wxViewportMeta.getAttribute('content'))
- if (metaWidth && !isNaN(metaWidth) && metaWidth > 0) { viewportWidth = metaWidth }
+ if (metaWidth && !isNaN(metaWidth) && metaWidth > 0) {
+   width = metaWidth
+ }
+ 
+ let dpr: number = 0
+ let deRect: mixed = null
+ let screenWidth: number = 0
+ let screenHeight: number = 0
+ 
+ const info: {
+   dpr: number,
+   scale: number,
+   rem: number,
+   deviceWidth: number,
+   deviceHeight: number
+ } = {
+   dpr,
+   scale: 0,
+   rem: 0,
+   deviceWidth: 0,
+   deviceHeight: 0
+ }
  
  /**
   * set root font-size for rem units. If already been set, just skip this.

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

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b932600a/html5/render/vue/env/wx-env.js
----------------------------------------------------------------------
diff --cc html5/render/vue/env/wx-env.js
index 68cddb2,011b412..47d1706
--- a/html5/render/vue/env/wx-env.js
+++ b/html5/render/vue/env/wx-env.js
@@@ -1,66 -1,52 +1,70 @@@
 +/*
 + * Licensed to the Apache Software Foundation (ASF) under one
 + * or more contributor license agreements.  See the NOTICE file
 + * distributed with this work for additional information
 + * regarding copyright ownership.  The ASF licenses this file
 + * to you under the Apache License, Version 2.0 (the
 + * "License"); you may not use this file except in compliance
 + * with the License.  You may obtain a copy of the License at
 + *
 + *   http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing,
 + * software distributed under the License is distributed on an
 + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 + * KIND, either express or implied.  See the License for the
 + * specific language governing permissions and limitations
 + * under the License.
 + */
  import 'envd'
  
- import { setViewport } from './viewport'
+ import { init as initViewport } from './viewport'
  import { extend } from '../utils'
  
- const scaleInfo = setViewport()
- 
- const lib = window.lib
- const env = {
-   platform: 'Web',
-   // weexVersion: '0.10.0', // TODO: get version from package.json (not sure)
-   weexVersion: 'process.env.WEEX_VERSION',
-   userAgent: navigator.userAgent,
-   appName: lib.env.aliapp ? lib.env.aliapp.appname : navigator.appName,
-   appVersion: lib.env.aliapp ? lib.env.aliapp.version.val : null,
-   osName: lib.env.browser ? lib.env.browser.name : null,
-   osVersion: lib.env.browser ? lib.env.browser.version.val : null,
-   deviceModel: lib.env.os.name || null
- }
- 
  /**
-  * scaleInfo: scale, deviceWidth, deviceHeight.
+  * get WXEnvironment info.
+  * @param  {object} viewportInfo: info about viewport.
+  * @param  {object} envInfo: info parsed from lib.env.
   */
- extend(env, scaleInfo)
+ export function initEnv (viewportInfo, envInfo) {
+   const env = {
+     platform: 'Web',
+     weexVersion: 'process.env.WEEX_VERSION',
+     userAgent: navigator.userAgent,
+     appName: envInfo.aliapp ? envInfo.aliapp.appname : navigator.appName,
+     appVersion: envInfo.aliapp ? envInfo.aliapp.version.val : null,
+     osName: envInfo.browser ? envInfo.browser.name : null,
+     osVersion: envInfo.browser ? envInfo.browser.version.val : null,
+     deviceModel: envInfo.os.name || null
+   }
+   /**
+    * viewportInfo: scale, deviceWidth, deviceHeight. dpr
+    */
+   return extend(env, viewportInfo)
+ }
+ 
+ // const viewportInfo = initViewport()
  
  // 750 by default currently
- const scale = env.scale
+ // const scale = viewportInfo.scale
  
- const units = {
-   REM: 12 * scale,
-   VW: env.deviceWidth / 100,
-   VH: env.deviceHeight / 100,
-   VMIN: Math.min(env.deviceWidth, env.deviceHeight) / 100,
-   VMAX: Math.max(env.deviceWidth, env.deviceHeight) / 100,
-   CM: 96 / 2.54 * scale,
-   MM: 96 / 25.4 * scale,
-   Q: 96 / 25.4 / 4 * scale,
-   IN: 96 * scale,
-   PT: 96 / 72 * scale,
-   PC: 96 / 6 * scale,
-   PX: scale
- }
+ // const units = {
+ //   REM: 12 * scale,
+ //   VW: viewportInfo.deviceWidth / 100,
+ //   VH: viewportInfo.deviceHeight / 100,
+ //   VMIN: Math.min(viewportInfo.deviceWidth, viewportInfo.deviceHeight) / 100,
+ //   VMAX: Math.max(viewportInfo.deviceWidth, viewportInfo.deviceHeight) / 100,
+ //   CM: 96 / 2.54 * scale,
+ //   MM: 96 / 25.4 * scale,
+ //   Q: 96 / 25.4 / 4 * scale,
+ //   IN: 96 * scale,
+ //   PT: 96 / 72 * scale,
+ //   PC: 96 / 6 * scale,
+ //   PX: scale
+ // }
  
- Object.freeze(units)
+ // Object.freeze(units)
  // Object.freeze(env)
  
- window.CSS_UNIT = units
- window.WXEnvironment = env
+ // window.CSS_UNIT = units
+ window.WXEnvironment = initEnv(initViewport(), window.lib.env)

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b932600a/html5/render/vue/index.js
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b932600a/html5/render/vue/mixins/base.js
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b932600a/html5/render/vue/mixins/style.js
----------------------------------------------------------------------
diff --cc html5/render/vue/mixins/style.js
index f7dc13e,1052501..8625537
--- a/html5/render/vue/mixins/style.js
+++ b/html5/render/vue/mixins/style.js
@@@ -1,85 -1,11 +1,29 @@@
 +/*
 + * Licensed to the Apache Software Foundation (ASF) under one
 + * or more contributor license agreements.  See the NOTICE file
 + * distributed with this work for additional information
 + * regarding copyright ownership.  The ASF licenses this file
 + * to you under the Apache License, Version 2.0 (the
 + * "License"); you may not use this file except in compliance
 + * with the License.  You may obtain a copy of the License at
 + *
 + *   http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing,
 + * software distributed under the License is distributed on an
 + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 + * KIND, either express or implied.  See the License for the
 + * specific language governing permissions and limitations
 + * under the License.
 + */
  import {
-   camelizeKeys,
-   hyphenateKeys,
-   extend,
-   trimComment
- } from '../utils'
- import { tagBegin, tagEnd } from '../utils/perf'
- import addPrefix from 'inline-style-prefixer/static'
+   getHeadStyleMap,
+   getComponentStyle,
+   extractComponentStyle
+ } from '../core'
  
- function getHeadStyleMap () {
-   if (process.env.NODE_ENV === 'development') {
-     tagBegin('getHeadStyleMap')
-   }
-   const res = Array.from(document.styleSheets || [])
-     .reduce((pre, styleSheet) => {
-       // why not using styleSheet.rules || styleSheet.cssRules to get css rules ?
-       // because weex's components defined non-standard style attributes, which is
-       // auto ignored when access rule.cssText.
-       const strArr = trimComment(styleSheet.ownerNode.textContent.trim()).split(/}/)
-       const len = strArr.length
-       const rules = []
-       for (let i = 0; i < len; i++) {
-         const str = strArr[i]
-         if (!str || str.match(/^\s*$/)) {
-           continue
-         }
- 
-         const match = str.match(/((?:,?\s*\.[[\]\w-]+\s*)+)({[^}]+)/)
-         if (!match) {
-           // not the vue static class styles map. so acquire no rules for this styleSheet.
-           // just jump through this styleSheet and go to analyzing next.
-           return pre
-         }
-         const clsNms = match[1].split(',').map(n => n.trim())
-         const cssText = match[2].replace(/[{}]/g, '').trim()
-         let clsNmsIdx = 0
-         const clsNmsLen = clsNms.length
-         while (clsNmsIdx < clsNmsLen) {
-           rules.push({
-             selectorText: clsNms[clsNmsIdx],
-             cssText
-           })
-           clsNmsIdx++
-         }
-       }
-       Array.from(rules).forEach(rule => {
-         const selector = rule.selectorText || ''
-         pre[selector] = trimComment(rule.cssText).split(';')
-           .reduce((styleObj, statement) => {
-             statement = statement.trim()
-             if (statement && statement.indexOf('/*') <= -1) {
-               const resArr = statement.split(':').map((part) => part.trim())
-               styleObj[resArr[0]] = resArr[1]
-             }
-             return styleObj
-           }, {})
-       })
-       return pre
-     }, {})
-   if (process.env.NODE_ENV === 'development') {
-     tagEnd('getHeadStyleMap')
-   }
-   return res
- }
+ let warned = false
+ const warnInfo = `[vue-render] after v0.11.3 there's no need to add $processStyle in vue-loader config anymore.`
  
  export default {
    beforeCreate () {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b932600a/html5/render/vue/modules/animation.js
----------------------------------------------------------------------
diff --cc html5/render/vue/modules/animation.js
index 99bc0cb,bfcc159..9efc4ba
--- a/html5/render/vue/modules/animation.js
+++ b/html5/render/vue/modules/animation.js
@@@ -1,22 -1,4 +1,22 @@@
 +/*
 + * Licensed to the Apache Software Foundation (ASF) under one
 + * or more contributor license agreements.  See the NOTICE file
 + * distributed with this work for additional information
 + * regarding copyright ownership.  The ASF licenses this file
 + * to you under the Apache License, Version 2.0 (the
 + * "License"); you may not use this file except in compliance
 + * with the License.  You may obtain a copy of the License at
 + *
 + *   http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing,
 + * software distributed under the License is distributed on an
 + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 + * KIND, either express or implied.  See the License for the
 + * specific language governing permissions and limitations
 + * under the License.
 + */
- import { nextFrame, toCSSText } from '../utils'
+ import { nextFrame, toCSSText, autoPrefix, camelizeKeys, normalizeStyle } from '../utils'
  
  function transitionOnce (vnode, config, callback) {
    const duration = config.duration || 1000 // ms

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b932600a/html5/render/vue/modules/dom.js
----------------------------------------------------------------------
diff --cc html5/render/vue/modules/dom.js
index 4b8425a,d290d7d..61f30dd
--- a/html5/render/vue/modules/dom.js
+++ b/html5/render/vue/modules/dom.js
@@@ -1,22 -1,4 +1,22 @@@
 +/*
 + * Licensed to the Apache Software Foundation (ASF) under one
 + * or more contributor license agreements.  See the NOTICE file
 + * distributed with this work for additional information
 + * regarding copyright ownership.  The ASF licenses this file
 + * to you under the Apache License, Version 2.0 (the
 + * "License"); you may not use this file except in compliance
 + * with the License.  You may obtain a copy of the License at
 + *
 + *   http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing,
 + * software distributed under the License is distributed on an
 + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 + * KIND, either express or implied.  See the License for the
 + * specific language governing permissions and limitations
 + * under the License.
 + */
- import { camelToKebab, appendStyle } from '../utils'
+ import { camelToKebab, appendCss } from '../utils'
  
  function getParentScroller (vnode) {
    if (!vnode) return null

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b932600a/html5/render/vue/modules/index.js
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b932600a/html5/render/vue/modules/modal/index.js
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b932600a/html5/render/vue/utils/index.js
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b932600a/html5/render/vue/utils/style.js
----------------------------------------------------------------------
diff --cc html5/render/vue/utils/style.js
index 67f0e3a,0dc1879..5d565e1
--- a/html5/render/vue/utils/style.js
+++ b/html5/render/vue/utils/style.js
@@@ -1,24 -1,16 +1,35 @@@
 +/*
 + * Licensed to the Apache Software Foundation (ASF) under one
 + * or more contributor license agreements.  See the NOTICE file
 + * distributed with this work for additional information
 + * regarding copyright ownership.  The ASF licenses this file
 + * to you under the Apache License, Version 2.0 (the
 + * "License"); you may not use this file except in compliance
 + * with the License.  You may obtain a copy of the License at
 + *
 + *   http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing,
 + * software distributed under the License is distributed on an
 + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 + * KIND, either express or implied.  See the License for the
 + * specific language governing permissions and limitations
 + * under the License.
 + */
 +
  // @flow
  
+ import { getViewportInfo } from '../env/viewport'
+ import addPrefix from 'inline-style-prefixer/static/index'
+ 
+ const noUnitsNumberKeys = [
+   'flex',
+   'opacity',
+   'zIndex',
+   'fontWeight',
+   'lines'
+ ]
+ 
  /**
   * remove comments from a cssText.
   */

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b932600a/package.json
----------------------------------------------------------------------
diff --cc package.json
index b2c4fd4,4524d59..30466fd
--- a/package.json
+++ b/package.json
@@@ -3,8 -3,8 +3,13 @@@
    "version": "0.4.0",
    "subversion": {
      "browser": "0.5.0",
++<<<<<<< HEAD
 +    "vue-render": "0.11.2",
 +    "framework": "0.20.3",
++=======
+     "framework": "0.19.17",
+     "vue-render": "0.11.5",
++>>>>>>> 0.11-dev
      "transformer": ">=0.1.5 <0.5"
    },
    "description": "A framework for building Mobile cross-platform UI",


[19/23] incubator-weex git commit: * [test] change CI emulator sdk version

Posted by so...@apache.org.
* [test] change CI emulator sdk 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/2c4d6695
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/2c4d6695
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/2c4d6695

Branch: refs/heads/0.12-dev
Commit: 2c4d66954957aa56560d495f2ae48af847b850ab
Parents: b92bf6f
Author: sospartan <so...@apache.org>
Authored: Wed Apr 12 16:42:13 2017 +0800
Committer: sospartan <so...@apache.org>
Committed: Wed Apr 12 16:42:13 2017 +0800

----------------------------------------------------------------------
 .travis.yml                              | 2 +-
 test/ci-funcs.sh                         | 2 +-
 test/scripts/components/recycler.test.js | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2c4d6695/.travis.yml
----------------------------------------------------------------------
diff --git a/.travis.yml b/.travis.yml
index 51f93ee..29bcc68 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -38,7 +38,7 @@ matrix:
             - tools
             - build-tools-23.0.2
             - android-23
-            - android-19
+            - android-22
             - extra-google-m2repository
             - extra-android-m2repository
             - sys-img-armeabi-v7a-android-21

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2c4d6695/test/ci-funcs.sh
----------------------------------------------------------------------
diff --git a/test/ci-funcs.sh b/test/ci-funcs.sh
index 8db51f6..c1448dc 100644
--- a/test/ci-funcs.sh
+++ b/test/ci-funcs.sh
@@ -14,7 +14,7 @@ function installAndroidSDK {
 }
 
 function createAVD {
-    echo no | android create avd --force -n weexavd -t android-19 --abi default/armeabi-v7a
+    echo no | android create avd --force -n weexavd -t android-22 --abi default/armeabi-v7a
 }
 
 function startAVD {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2c4d6695/test/scripts/components/recycler.test.js
----------------------------------------------------------------------
diff --git a/test/scripts/components/recycler.test.js b/test/scripts/components/recycler.test.js
index c83534d..efde8e8 100644
--- a/test/scripts/components/recycler.test.js
+++ b/test/scripts/components/recycler.test.js
@@ -15,7 +15,7 @@ const isApproximate = (x, y) =>  {
   return Math.abs(x - y) <= (isAndroid ? 2 : 1.5)
 }
 
-describe('recycler @ignore_android', function () {
+describe('recycler', function () {
   this.timeout(util.getTimeoutMills())
   const driver = util.createDriver(wd)
 


[11/23] incubator-weex git commit: * [html5] add funciontal methods createEventMap & trimTextNodes.

Posted by so...@apache.org.
* [html5] add funciontal methods createEventMap & trimTextNodes.


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

Branch: refs/heads/0.12-dev
Commit: ff76bfa148cc1418f82e1b138c3449a46e8bc53e
Parents: e49dad6
Author: MrRaindrop <te...@gmail.com>
Authored: Sun Apr 9 18:38:55 2017 +0800
Committer: MrRaindrop <te...@gmail.com>
Committed: Sun Apr 9 18:38:55 2017 +0800

----------------------------------------------------------------------
 html5/render/vue/components/a.js                |  6 ++--
 html5/render/vue/components/div.js              |  6 ++--
 html5/render/vue/components/image.js            |  4 +--
 html5/render/vue/components/input.js            |  4 +--
 .../render/vue/components/scrollable/header.js  |  4 +--
 .../vue/components/scrollable/list/cell.js      |  4 +--
 .../vue/components/scrollable/list/index.js     |  4 +--
 .../vue/components/scrollable/scroller.js       |  4 +--
 html5/render/vue/components/slider/index.js     |  4 +--
 html5/render/vue/components/text.js             |  4 +--
 html5/render/vue/components/textarea.js         |  4 +--
 html5/render/vue/components/video.js            |  4 +--
 html5/render/vue/components/web.js              |  4 +--
 html5/render/vue/core/index.js                  |  1 +
 html5/render/vue/core/node.js                   | 28 +++++++++++++++++++
 html5/render/vue/env/global.js                  | 11 ++++++++
 html5/render/vue/env/index.js                   |  9 ++----
 html5/render/vue/mixins/base.js                 | 20 --------------
 html5/test/render/vue/core/style.js             | 29 ++++++++++----------
 html5/test/render/vue/helper/index.js           |  4 +--
 html5/test/render/vue/helper/runtime.js         |  3 +-
 21 files changed, 87 insertions(+), 74 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ff76bfa1/html5/render/vue/components/a.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/a.js b/html5/render/vue/components/a.js
index 18b0b16..83851b2 100644
--- a/html5/render/vue/components/a.js
+++ b/html5/render/vue/components/a.js
@@ -1,4 +1,4 @@
-import { extractComponentStyle } from '../core'
+import { extractComponentStyle, trimTextVNodes, createEventMap } from '../core'
 // import { validateStyles } from '../validator'
 
 const _css = `
@@ -22,10 +22,10 @@ export default {
         'weex-type': 'a',
         href: this.href
       },
-      on: this._createEventMap(),
+      on: createEventMap(this),
       staticClass: 'weex-a weex-ct',
       staticStyle: extractComponentStyle(this)
-    }, this._trimTextNodeChildren(this.$slots.default))
+    }, trimTextVNodes(this.$slots.default))
   },
   _css
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ff76bfa1/html5/render/vue/components/div.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/div.js b/html5/render/vue/components/div.js
index 426b678..bdc90d0 100644
--- a/html5/render/vue/components/div.js
+++ b/html5/render/vue/components/div.js
@@ -1,5 +1,5 @@
 // import { validateStyles } from '../validator'
-import { extractComponentStyle } from '../core'
+import { extractComponentStyle, trimTextVNodes, createEventMap } from '../core'
 
 const _css = `
 body > .weex-div {
@@ -16,10 +16,10 @@ export default {
     // }
     return createElement('html:div', {
       attrs: { 'weex-type': 'div' },
-      on: this._createEventMap(),
+      on: createEventMap(this),
       staticClass: 'weex-div weex-ct',
       staticStyle: extractComponentStyle(this)
-    }, this._trimTextNodeChildren(this.$slots.default))
+    }, trimTextVNodes(this.$slots.default))
   },
   _css
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ff76bfa1/html5/render/vue/components/image.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/image.js b/html5/render/vue/components/image.js
index 98ad632..b245338 100644
--- a/html5/render/vue/components/image.js
+++ b/html5/render/vue/components/image.js
@@ -1,4 +1,4 @@
-import { extractComponentStyle } from '../core/style'
+import { extractComponentStyle, createEventMap } from '../core'
 import { extend } from '../utils'
 
 const _css = `
@@ -66,7 +66,7 @@ export default {
         'img-src': preProcessSrc(this, this.src, style),
         'img-placeholder': preProcessSrc(this, this.placeholder, style)
       },
-      on: this._createEventMap(['load', 'error']),
+      on: createEventMap(this, ['load', 'error']),
       staticClass: 'weex-image weex-el',
       staticStyle: extend(style, resizeStyle)
     })

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ff76bfa1/html5/render/vue/components/input.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/input.js b/html5/render/vue/components/input.js
index 2d3590e..0f68604 100644
--- a/html5/render/vue/components/input.js
+++ b/html5/render/vue/components/input.js
@@ -2,7 +2,7 @@
  * @fileOverview Input component.
  * Support v-model only if vue version is large than 2.2.0
  */
-import { extractComponentStyle } from '../core'
+import { extractComponentStyle, createEventMap } from '../core'
 import { inputCommon } from '../mixins'
 import { extend, mapFormEvents } from '../utils'
 // import { validateStyles } from '../validator'
@@ -50,7 +50,7 @@ export default {
     // if (process.env.NODE_ENV === 'development') {
     //   validateStyles('input', this.$vnode.data && this.$vnode.data.staticStyle)
     // }
-    const events = extend(this._createEventMap(), mapFormEvents(this))
+    const events = extend(createEventMap(this), mapFormEvents(this))
     return createElement('html:input', {
       attrs: {
         'weex-type': 'input',

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ff76bfa1/html5/render/vue/components/scrollable/header.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/scrollable/header.js b/html5/render/vue/components/scrollable/header.js
index 64ebd77..9fdeddb 100644
--- a/html5/render/vue/components/scrollable/header.js
+++ b/html5/render/vue/components/scrollable/header.js
@@ -1,6 +1,6 @@
 // import { validateStyles } from '../../validator'
 import { supportSticky } from '../../utils/style'
-import { extractComponentStyle } from '../../core'
+import { extractComponentStyle, createEventMap } from '../../core'
 
 export default {
   data () {
@@ -49,7 +49,7 @@ export default {
     // }
     return createElement('html:header', {
       attrs: { 'weex-type': 'header' },
-      on: this._createEventMap(),
+      on: createEventMap(this),
       ref: 'header',
       staticClass: 'weex-header weex-ct',
       class: { sticky: this.sticky, iossticky: this.supportSticky },

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ff76bfa1/html5/render/vue/components/scrollable/list/cell.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/scrollable/list/cell.js b/html5/render/vue/components/scrollable/list/cell.js
index 32ec1f9..ab8910c 100644
--- a/html5/render/vue/components/scrollable/list/cell.js
+++ b/html5/render/vue/components/scrollable/list/cell.js
@@ -1,5 +1,5 @@
 // import { validateStyles } from '../../../validator'
-import { extractComponentStyle } from '../../../core'
+import { extractComponentStyle, createEventMap } from '../../../core'
 
 export default {
   render (createElement) {
@@ -9,7 +9,7 @@ export default {
     // }
     return createElement('section', {
       attrs: { 'weex-type': 'cell' },
-      on: this._createEventMap(),
+      on: createEventMap(this),
       staticClass: 'weex-cell weex-ct',
       staticStyle: extractComponentStyle(this)
     }, this.$slots.default)

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ff76bfa1/html5/render/vue/components/scrollable/list/index.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/scrollable/list/index.js b/html5/render/vue/components/scrollable/list/index.js
index 2db5239..fc803c6 100644
--- a/html5/render/vue/components/scrollable/list/index.js
+++ b/html5/render/vue/components/scrollable/list/index.js
@@ -1,4 +1,4 @@
-import { extractComponentStyle } from '../../../core'
+import { extractComponentStyle, createEventMap } from '../../../core'
 import { scrollable } from '../../../mixins'
 // import { validateStyles } from '../../../validator'
 import { extend } from '../../../utils'
@@ -57,7 +57,7 @@ export default {
       ref: 'wrapper',
       attrs: { 'weex-type': 'list' },
       staticClass: this.wrapperClass,
-      on: extend(this._createEventMap(), {
+      on: extend(createEventMap(this), {
         scroll: this.handleListScroll,
         touchstart: this.handleTouchStart,
         touchmove: this.handleTouchMove,

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ff76bfa1/html5/render/vue/components/scrollable/scroller.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/scrollable/scroller.js b/html5/render/vue/components/scrollable/scroller.js
index ee117e2..b56ef70 100644
--- a/html5/render/vue/components/scrollable/scroller.js
+++ b/html5/render/vue/components/scrollable/scroller.js
@@ -1,4 +1,4 @@
-import { extractComponentStyle } from '../../core'
+import { extractComponentStyle, createEventMap } from '../../core'
 import { scrollable } from '../../mixins'
 // import { validateStyles } from '../../validator'
 import { extend } from '../../utils'
@@ -76,7 +76,7 @@ export default {
     return createElement('main', {
       ref: 'wrapper',
       attrs: { 'weex-type': 'scroller' },
-      on: extend(this._createEventMap(), {
+      on: extend(createEventMap(this), {
         scroll: this.handleScroll,
         touchstart: this.handleTouchStart,
         touchmove: this.handleTouchMove,

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ff76bfa1/html5/render/vue/components/slider/index.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/slider/index.js b/html5/render/vue/components/slider/index.js
index ab7187d..b37b0a2 100644
--- a/html5/render/vue/components/slider/index.js
+++ b/html5/render/vue/components/slider/index.js
@@ -1,5 +1,5 @@
 // import { validateStyles } from '../../validator'
-import { extractComponentStyle } from '../../core'
+import { extractComponentStyle, createEventMap } from '../../core'
 import { throttle, bind, extend, fireLazyload } from '../../utils'
 import indicator from './indicator'
 import slideMixin from './slideMixin'
@@ -154,7 +154,7 @@ export default {
         ref: 'wrapper',
         attrs: { 'weex-type': 'slider' },
         staticClass: 'weex-slider weex-slider-wrapper weex-ct',
-        on: extend(this._createEventMap(['scroll', 'scrollstart', 'scrollend']), {
+        on: extend(createEventMap(this, ['scroll', 'scrollstart', 'scrollend']), {
           touchstart: this.handleTouchStart,
           touchmove: throttle(bind(this.handleTouchMove, this), 25),
           touchend: this.handleTouchEnd

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ff76bfa1/html5/render/vue/components/text.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/text.js b/html5/render/vue/components/text.js
index 6963b0b..68a6f32 100644
--- a/html5/render/vue/components/text.js
+++ b/html5/render/vue/components/text.js
@@ -6,7 +6,7 @@
  * be clipped according to the 'lines'. Otherwise, it'll be the 'height'.
  */
 
-import { extractComponentStyle } from '../core'
+import { extractComponentStyle, createEventMap } from '../core'
 import { extend } from '../utils'
 
 const _css = `
@@ -51,7 +51,7 @@ export default {
     const textSpecStyle = getTextSpecStyle(style)
     return createElement('p', {
       attrs: { 'weex-type': 'text' },
-      on: this._createEventMap(),
+      on: createEventMap(this),
       staticClass: 'weex-text weex-el',
       staticStyle: extend(style, textSpecStyle)
     }, this.$slots.default || [this.value])

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ff76bfa1/html5/render/vue/components/textarea.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/textarea.js b/html5/render/vue/components/textarea.js
index e017512..bc1ffdf 100644
--- a/html5/render/vue/components/textarea.js
+++ b/html5/render/vue/components/textarea.js
@@ -1,4 +1,4 @@
-import { extractComponentStyle } from '../core'
+import { extractComponentStyle, createEventMap } from '../core'
 import { inputCommon } from '../mixins'
 import { extend, mapFormEvents } from '../utils'
 
@@ -38,7 +38,7 @@ export default {
     // if (process.env.NODE_ENV === 'development') {
     //   validateStyles('textarea', this.$vnode.data && this.$vnode.data.staticStyle)
     // }
-    const events = extend(this._createEventMap(), mapFormEvents(this))
+    const events = extend(createEventMap(this), mapFormEvents(this))
     return createElement('html:textarea', {
       attrs: {
         'weex-type': 'textarea',

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ff76bfa1/html5/render/vue/components/video.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/video.js b/html5/render/vue/components/video.js
index 5d8c312..8c52672 100644
--- a/html5/render/vue/components/video.js
+++ b/html5/render/vue/components/video.js
@@ -1,5 +1,5 @@
 // import { validateStyles } from '../validator'
-import { extractComponentStyle } from '../core'
+import { extractComponentStyle, createEventMap } from '../core'
 
 export default {
   props: {
@@ -46,7 +46,7 @@ export default {
         controls: this.controls,
         src: this.src
       },
-      on: this._createEventMap(['start', 'pause', 'finish', 'fail']),
+      on: createEventMap(this, ['start', 'pause', 'finish', 'fail']),
       staticClass: 'weex-video weex-el',
       staticStyle: extractComponentStyle(this)
     })

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ff76bfa1/html5/render/vue/components/web.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/web.js b/html5/render/vue/components/web.js
index f810e4b..9ae7d5f 100644
--- a/html5/render/vue/components/web.js
+++ b/html5/render/vue/components/web.js
@@ -1,4 +1,4 @@
-import { extractComponentStyle } from '../core'
+import { extractComponentStyle, createEventMap } from '../core'
 import { createEvent } from '../utils'
 // import { validateStyles } from '../validator'
 
@@ -55,7 +55,7 @@ export default {
         'weex-type': 'web',
         src: this.src
       },
-      on: this._createEventMap(['error']),
+      on: createEventMap(this, ['error']),
       staticClass: 'weex-web weex-el',
       staticStyle: extractComponentStyle(this)
     })

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ff76bfa1/html5/render/vue/core/index.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/core/index.js b/html5/render/vue/core/index.js
index 57fe34e..04f56bc 100644
--- a/html5/render/vue/core/index.js
+++ b/html5/render/vue/core/index.js
@@ -1 +1,2 @@
 export * from './style'
+export * from './node'

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ff76bfa1/html5/render/vue/core/node.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/core/node.js b/html5/render/vue/core/node.js
new file mode 100644
index 0000000..905d828
--- /dev/null
+++ b/html5/render/vue/core/node.js
@@ -0,0 +1,28 @@
+/**
+ * remove text nodes in the nodes array.
+ * @param  {Array} nodes
+ * @return {Array} nodes without text nodes.
+ */
+export function trimTextVNodes (vnodes) {
+  if (Array.isArray(vnodes)) {
+    return vnodes.filter(vnode => !!vnode.tag)
+  }
+  return vnodes
+}
+
+const supportedEvents = [
+  'click', 'longpress', 'appear', 'disappear'
+  // 'touchstart', 'touchmove', 'touchend'
+]
+/**
+ * emit native events to enable v-on.
+ * @param {VComponent} context: which one to emit a event on.
+ * @param {array} extras: extra events.
+ */
+export function createEventMap (context, extras = []) {
+  const eventMap = {}
+  supportedEvents.concat(extras).forEach(name => {
+    eventMap[name] = event => context.$emit(name, event)
+  })
+  return eventMap
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ff76bfa1/html5/render/vue/env/global.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/env/global.js b/html5/render/vue/env/global.js
new file mode 100644
index 0000000..5dd375c
--- /dev/null
+++ b/html5/render/vue/env/global.js
@@ -0,0 +1,11 @@
+import weex from './weex'
+import * as core from '../core'
+
+window.global = window
+window.weex = weex
+
+; ['getComponentStyle',
+  'extractComponentStyle',
+  'trimTextVNodes'].forEach(function (method) {
+    weex[method] = core[method].bind(weex)
+  })

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ff76bfa1/html5/render/vue/env/index.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/env/index.js b/html5/render/vue/env/index.js
index 0d997ee..73f640e 100644
--- a/html5/render/vue/env/index.js
+++ b/html5/render/vue/env/index.js
@@ -14,20 +14,17 @@ import 'core-js/modules/web.dom.iterable'
 import 'core-js/modules/es6.promise'
 
 import modules from '../modules'
-import weex from './weex'
+import './global'
 
 // register built-in modules.
-weex.install(modules)
+global.weex.install(modules)
 
 export function setVue (vue) {
   if (!vue) {
     throw new Error('[Vue Render] Vue not found. Please make sure vue 2.x runtime is imported.')
   }
-  weex.__vue__ = vue
+  global.weex.__vue__ = vue
   console.log(`[Vue Render] install Vue ${vue.version}.`)
 }
 
-window.weex = weex
-window.global = window
-
 export default weex

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ff76bfa1/html5/render/vue/mixins/base.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/mixins/base.js b/html5/render/vue/mixins/base.js
index 8f0953e..d0262c9 100644
--- a/html5/render/vue/mixins/base.js
+++ b/html5/render/vue/mixins/base.js
@@ -1,11 +1,6 @@
 import { getThrottleLazyload, watchAppear } from '../utils'
 import { tagBeforeCreate, tagMounted, tagBeforeUpdate, tagUpdated, tagBegin, tagEnd } from '../utils/perf'
 
-const supportedEvents = [
-  'click', 'longpress', 'appear', 'disappear'
-  // 'touchstart', 'touchmove', 'touchend'
-]
-
 const scrollableTypes = ['scroller', 'list']
 
 let lazyloadWatched = false
@@ -77,14 +72,6 @@ export default {
       return parent
     },
 
-    _createEventMap (extras = []) {
-      const eventMap = {}
-      supportedEvents.concat(extras).forEach(name => {
-        eventMap[name] = event => this.$emit(name, event)
-      })
-      return eventMap
-    },
-
     _fireLazyload (el) {
       if (process.env.NODE_ENV === 'development') {
         tagBegin('base._fireLazyload')
@@ -93,13 +80,6 @@ export default {
       if (process.env.NODE_ENV === 'development') {
         tagEnd('base._fireLazyload')
       }
-    },
-
-    _trimTextNodeChildren (children) {
-      if (Array.isArray(children)) {
-        return children.filter(vnode => !!vnode.tag)
-      }
-      return children
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ff76bfa1/html5/test/render/vue/core/style.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/core/style.js b/html5/test/render/vue/core/style.js
index cacdd57..6b4a5ae 100644
--- a/html5/test/render/vue/core/style.js
+++ b/html5/test/render/vue/core/style.js
@@ -36,9 +36,8 @@ init('core style', (Vue, helper) => {
 
   it('should get normalized merged styles.', function () {
     const vm = helper.createVm(scopedStyleBundle)
-    const el = vm.$refs.foo.$el
+    const el = vm.$refs.foo.$el || vm.$refs.foo
     expect(el).to.be.ok
-
     const expectedMap = {
       width: 200 * scale + 'px',
       height: 200 * scale + 'px',
@@ -55,19 +54,19 @@ init('core style', (Vue, helper) => {
       transform: `translate3d(${100 * scale + 'px'}, ${100 * scale + 'px'}, 0px)`
     }
 
-   for (const k in expectedMap) {
-    expect(el.style[k]).to.equal(expectedMap[k])
-   }
-   const directionRes = []
-   for (const k in expectedDirection) {
-    directionRes.push(el.style[k] === expectedDirection[k])
-   }
-   expect(directionRes).to.include(true)
+    for (const k in expectedMap) {
+      expect(el.style[k]).to.equal(expectedMap[k])
+    }
+    const directionRes = []
+    for (const k in expectedDirection) {
+      directionRes.push(el.style[k] === expectedDirection[k])
+    }
+    expect(directionRes).to.include(true)
 
-   const transformRes = []
-   for (const k in expectedTransform) {
-    transformRes.push(el.style[k] === expectedTransform[k])
-   }
-   expect(transformRes).to.include(true)
+    const transformRes = []
+    for (const k in expectedTransform) {
+      transformRes.push(el.style[k] === expectedTransform[k])
+    }
+    expect(transformRes).to.include(true)
   })
 })

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ff76bfa1/html5/test/render/vue/helper/index.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/helper/index.js b/html5/test/render/vue/helper/index.js
index e89ac86..90e7371 100644
--- a/html5/test/render/vue/helper/index.js
+++ b/html5/test/render/vue/helper/index.js
@@ -24,10 +24,9 @@ export function init (title, fn) {
       Vue.mixin(base)
       Vue.mixin(style)
 
-      setVue(Vue)
-
       window.global = window
       global.weex = weex
+      setVue(Vue)
 
       window._no_remove_style_sheets = true
     })
@@ -42,7 +41,6 @@ export function init (title, fn) {
        */
       register (name, component) {
         global.weex.registerComponent(name, component)
-        // components[name] = component
       },
 
       /**

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ff76bfa1/html5/test/render/vue/helper/runtime.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/helper/runtime.js b/html5/test/render/vue/helper/runtime.js
index 319fd20..140405a 100644
--- a/html5/test/render/vue/helper/runtime.js
+++ b/html5/test/render/vue/helper/runtime.js
@@ -24,10 +24,9 @@ export function init (title, fn) {
       Vue.mixin(base)
       Vue.mixin(style)
 
-      setVue(Vue)
-
       window.global = window
       global.weex = weex
+      setVue(Vue)
 
       window._no_remove_style_sheets = true
     })


[07/23] incubator-weex git commit: * [html5] rm stylesheet node which is already analyzed and saved in styleMap.

Posted by so...@apache.org.
* [html5] rm stylesheet node which is already analyzed and saved in styleMap.


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

Branch: refs/heads/0.12-dev
Commit: 40f600eeeb92558c9478bc2970fa8f676c76f734
Parents: b7b81f3
Author: MrRaindrop <te...@gmail.com>
Authored: Thu Apr 6 18:21:21 2017 +0800
Committer: MrRaindrop <te...@gmail.com>
Committed: Thu Apr 6 18:21:21 2017 +0800

----------------------------------------------------------------------
 html5/render/vue/core/style.js | 7 +++++++
 1 file changed, 7 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/40f600ee/html5/render/vue/core/style.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/core/style.js b/html5/render/vue/core/style.js
index 1b5db77..45a4103 100644
--- a/html5/render/vue/core/style.js
+++ b/html5/render/vue/core/style.js
@@ -68,6 +68,13 @@ export function getHeadStyleMap () {
             return styleObj
           }, {})
       })
+      /**
+       * remove this styleSheet node since it's in the styleMap already. And this style
+       * should only be fetched and used from styleMap to generate the final combined
+       * component style, not from the stylesheet itself.
+       */
+      const node = styleSheet.ownerNode
+      node.parentNode.removeChild(node)
       return pre
     }, {})
   if (process.env.NODE_ENV === 'development') {


[04/23] incubator-weex git commit: * [html5] change viewport adapting algorithmn.

Posted by so...@apache.org.
* [html5] change viewport adapting algorithmn.


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

Branch: refs/heads/0.12-dev
Commit: 501cde2fb571b61d4c19e5180e1cab4e6e219d37
Parents: 38f1a97
Author: MrRaindrop <te...@gmail.com>
Authored: Thu Apr 6 14:56:38 2017 +0800
Committer: MrRaindrop <te...@gmail.com>
Committed: Thu Apr 6 15:38:26 2017 +0800

----------------------------------------------------------------------
 html5/render/vue/README.md                      |  24 +-
 html5/render/vue/components/a.js                |   4 +-
 html5/render/vue/components/div.js              |   9 +-
 html5/render/vue/components/image.js            |  10 +-
 html5/render/vue/components/input.js            |  12 +-
 .../vue/components/scrollable/list/style.js     |  16 +
 .../components/scrollable/loading-indicator.js  |  38 ++-
 html5/render/vue/components/slider/index.js     |  30 +-
 html5/render/vue/components/slider/indicator.js |  32 +-
 html5/render/vue/components/switch.js           |  60 +++-
 html5/render/vue/components/text.js             |  15 +-
 html5/render/vue/components/textarea.js         |  13 +-
 html5/render/vue/components/web.js              |  13 +-
 html5/render/vue/core/style.js                  |   6 +-
 html5/render/vue/env/index.js                   |   2 +-
 html5/render/vue/env/weex.js                    |   7 +
 html5/render/vue/index.js                       |  13 +-
 html5/render/vue/mixins/base.js                 |  10 -
 html5/render/vue/mixins/style.js                | 156 +--------
 html5/render/vue/modules/animation.js           |   7 +-
 html5/render/vue/modules/dom.js                 |   5 +-
 html5/render/vue/modules/index.js               |   2 +-
 html5/render/vue/modules/modal/index.js         |  10 +-
 html5/render/vue/modules/modal/style.js         | 146 +++++++++
 html5/render/vue/styles/base.css                | 319 -------------------
 html5/render/vue/utils/index.js                 |  36 +--
 package.json                                    |   2 +-
 packages/weex-vue-render/README.md              |  24 +-
 packages/weex-vue-render/package.json           |   2 +-
 29 files changed, 447 insertions(+), 576 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501cde2f/html5/render/vue/README.md
----------------------------------------------------------------------
diff --git a/html5/render/vue/README.md b/html5/render/vue/README.md
index 867b318..d41f777 100644
--- a/html5/render/vue/README.md
+++ b/html5/render/vue/README.md
@@ -6,29 +6,7 @@ It can be run on browser only based on Vue 2.x (without Weex).
 
 ## use vue-loader
 
-**NOTE: ** you should use `vue-loader` to bundle your `.vue` file, not using `weex-loader`.
-
-you should add config for `vue-loader` as below (`vue-loader` version should be `>= 11.2.0`)
-
-```javascript
-vue: {
-  /**
-   * important! should use postTransformNode to add $processStyle for
-   * inline style prefixing.
-   */
-  compilerModules: [
-    {
-      postTransformNode: el => {
-        el.staticStyle = `$processStyle(${el.staticStyle})`
-        el.styleBinding = `$processStyle(${el.styleBinding})`
-      }
-    }
-  ],
-  autoprefixer: {
-    browsers: ['last 7 versions']
-  }
-},
-```
+**NOTE: ** after `v0.11.3` there's no need to add `$processStyle` and `autoprefixer` in your vue-loader config anymore. The runtime render will take care of it once for all.
 
 ## component -> dom map
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501cde2f/html5/render/vue/components/a.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/a.js b/html5/render/vue/components/a.js
index f0a28e5..18b0b16 100644
--- a/html5/render/vue/components/a.js
+++ b/html5/render/vue/components/a.js
@@ -1,7 +1,7 @@
 import { extractComponentStyle } from '../core'
 // import { validateStyles } from '../validator'
 
-const defaultStyle = `
+const _css = `
 .weex-a {
   text-decoration: none;
 }
@@ -27,5 +27,5 @@ export default {
       staticStyle: extractComponentStyle(this)
     }, this._trimTextNodeChildren(this.$slots.default))
   },
-  _d_style: defaultStyle
+  _css
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501cde2f/html5/render/vue/components/div.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/div.js b/html5/render/vue/components/div.js
index fd8ed3c..426b678 100644
--- a/html5/render/vue/components/div.js
+++ b/html5/render/vue/components/div.js
@@ -1,6 +1,12 @@
 // import { validateStyles } from '../validator'
 import { extractComponentStyle } from '../core'
 
+const _css = `
+body > .weex-div {
+  min-height: 100%;
+}
+`
+
 export default {
   name: 'weex-div',
   render (createElement) {
@@ -14,5 +20,6 @@ export default {
       staticClass: 'weex-div weex-ct',
       staticStyle: extractComponentStyle(this)
     }, this._trimTextNodeChildren(this.$slots.default))
-  }
+  },
+  _css
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501cde2f/html5/render/vue/components/image.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/image.js b/html5/render/vue/components/image.js
index f4980d6..98ad632 100644
--- a/html5/render/vue/components/image.js
+++ b/html5/render/vue/components/image.js
@@ -1,5 +1,12 @@
 import { extractComponentStyle } from '../core/style'
 import { extend } from '../utils'
+
+const _css = `
+.weex-image, .weex-img {
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+`
 /**
  * get resize (stetch|cover|contain) related styles.
  */
@@ -63,5 +70,6 @@ export default {
       staticClass: 'weex-image weex-el',
       staticStyle: extend(style, resizeStyle)
     })
-  }
+  },
+  _css
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501cde2f/html5/render/vue/components/input.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/input.js b/html5/render/vue/components/input.js
index d65ce79..2d3590e 100644
--- a/html5/render/vue/components/input.js
+++ b/html5/render/vue/components/input.js
@@ -7,6 +7,15 @@ import { inputCommon } from '../mixins'
 import { extend, mapFormEvents } from '../utils'
 // import { validateStyles } from '../validator'
 
+const _css = `
+.weex-input, .weex-textarea {
+  font-size: 0.426667rem;
+}
+.weex-input:focus, .weex-textarea:focus {
+  outline: none;
+}
+`
+
 export default {
   mixins: [inputCommon],
   props: {
@@ -60,5 +69,6 @@ export default {
       staticClass: 'weex-input weex-el',
       staticStyle: extractComponentStyle(this)
     })
-  }
+  },
+  _css
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501cde2f/html5/render/vue/components/scrollable/list/style.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/scrollable/list/style.js b/html5/render/vue/components/scrollable/list/style.js
new file mode 100644
index 0000000..c9122af
--- /dev/null
+++ b/html5/render/vue/components/scrollable/list/style.js
@@ -0,0 +1,16 @@
+export default `
+body > .weex-list {
+  max-height: 100%;
+}
+
+.weex-list-wrapper {
+  -webkit-overflow-scrolling: touch;
+  overflow-y: scroll !important;
+  overflow-x: hidden;
+}
+
+.weex-list-inner {
+  -webkit-overflow-scrolling: touch;
+  width: 100%;
+}
+`
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501cde2f/html5/render/vue/components/scrollable/loading-indicator.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/scrollable/loading-indicator.js b/html5/render/vue/components/scrollable/loading-indicator.js
index e1f9854..b184cca 100644
--- a/html5/render/vue/components/scrollable/loading-indicator.js
+++ b/html5/render/vue/components/scrollable/loading-indicator.js
@@ -1,5 +1,40 @@
 import { extractComponentStyle } from '../../core'
 
+const _css = `
+.weex-refresh-indicator,
+.weex-loading-indicator {
+  width: 1.0rem;
+  height: 1.0rem;
+  -webkit-box-align: center;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+  -webkit-box-pack: center;
+  -webkit-justify-content: center;
+      -ms-flex-pack: center;
+          justify-content: center;
+  overflow: visible;
+  background: none;
+}
+.weex-refresh-indicator:before,
+.weex-loading-indicator:before {
+  display: block;
+  content: '';
+  font-size: 0.16rem;
+  width: 1em;
+  height: 1em;
+  left: -60%;
+  top: 40%;
+  border-radius: 50%;
+  position: relative;
+  text-indent: -9999em;
+  -webkit-animation: weex-spinner 1.1s infinite ease;
+          animation: weex-spinner 1.1s infinite ease;
+  -webkit-transform: translate3d(1.0rem, 0, 0);
+          transform: translate3d(1.0rem, 0, 0);
+}
+`
+
 export default {
   render (createElement) {
     this.weexType = 'loading-indicator'
@@ -8,5 +43,6 @@ export default {
       staticClass: 'weex-loading-indicator weex-ct',
       staticStyle: extractComponentStyle(this)
     })
-  }
+  },
+  _css
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501cde2f/html5/render/vue/components/slider/index.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/slider/index.js b/html5/render/vue/components/slider/index.js
index b2f4a90..68e4a37 100644
--- a/html5/render/vue/components/slider/index.js
+++ b/html5/render/vue/components/slider/index.js
@@ -4,6 +4,32 @@ import { throttle, bind, extend, fireLazyload } from '../../utils'
 import indicator from './indicator'
 import slideMixin from './slideMixin'
 
+const _css = `
+.weex-slider-wrapper {
+  overflow: hidden;
+}
+
+.weex-slider-inner {
+  position: absolute;
+  height: 100%;
+  top: 0;
+  left: 0;
+}
+
+.weex-slider-cell {
+  display: block;
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  margin: 0;
+  padding: 0;
+  height: 100%;
+  overflow: hidden;
+}
+`
+
 export default {
   mixins: [slideMixin],
   props: {
@@ -139,5 +165,7 @@ export default {
         this._indicator
       ]
     )
-  }
+  },
+  // export default css styles for this component.
+  _css
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501cde2f/html5/render/vue/components/slider/indicator.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/slider/indicator.js b/html5/render/vue/components/slider/indicator.js
index 3340cfd..6722041 100644
--- a/html5/render/vue/components/slider/indicator.js
+++ b/html5/render/vue/components/slider/indicator.js
@@ -1,6 +1,35 @@
 import { extractComponentStyle } from '../../core'
 import { extend, extendKeys } from '../../utils'
 
+const _css = `
+.weex-indicator {
+  position: absolute;
+  z-index: 10;
+  -webkit-flex-direction: row;
+  -ms-flex-direction: row;
+  flex-direction: row;
+  -webkit-box-orient: horizontal;
+  margin: 0;
+  padding: 0;
+}
+
+.weex-indicator-item {
+  display: inline-block;
+  position: relative;
+  border-radius: 50%;
+  width: 0.266667rem;
+  height: 0.266667rem;
+  background-color: #BBBBBB;
+}
+.weex-indicator-item + .weex-indicator-item {
+  margin-left: 0.133333rem;
+}
+
+.weex-indicator-item-active {
+  background-color: blue;
+}
+`
+
 function getIndicatorItemStyle (spec, isActive) {
   const style = {}
   style['background-color'] = spec[isActive ? 'itemSelectedColor' : 'itemColor']
@@ -119,5 +148,6 @@ export default {
   },
   render (createElement) {
     return _render(this, createElement)
-  }
+  },
+  _css
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501cde2f/html5/render/vue/components/switch.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/switch.js b/html5/render/vue/components/switch.js
index b04bf90..cf904c3 100644
--- a/html5/render/vue/components/switch.js
+++ b/html5/render/vue/components/switch.js
@@ -1,6 +1,63 @@
 // import { validateStyles } from '../validator'
 import { extractComponentStyle } from '../core'
 
+const _css = `
+.weex-switch {
+  border: 0.013333rem solid #dfdfdf;
+  cursor: pointer;
+  display: inline-block;
+  position: relative;
+  vertical-align: middle;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  box-sizing: content-box;
+  background-clip: content-box;
+  color: #64bd63;
+  width: 1.333333rem;
+  height: 0.8rem;
+  background-color: white;
+  border-color: #dfdfdf;
+  box-shadow: #dfdfdf 0 0 0 0 inset;
+  border-radius: 0.8rem;
+  -webkit-transition: border 0.4s, box-shadow 0.4s, background-color 1.2s;
+          transition: border 0.4s, box-shadow 0.4s, background-color 1.2s;
+}
+
+.weex-switch-checked {
+  background-color: #64bd63;
+  border-color: #64bd63;
+  box-shadow: #64bd63 0 0 0 0.533333rem inset;
+}
+
+.weex-switch-checked.weex-switch-disabled {
+  background-color: #A0CCA0;
+  box-shadow: #A0CCA0 0 0 0 0.533333rem inset;
+}
+
+.weex-switch-disabled {
+  background-color: #EEEEEE;
+}
+
+.weex-switch-inner {
+  width: 0.8rem;
+  height: 0.8rem;
+  background: #fff;
+  border-radius: 100%;
+  box-shadow: 0 0.013333rem 0.04rem rgba(0, 0, 0, 0.4);
+  position: absolute;
+  top: 0;
+  left: 0;
+  -webkit-transition: background-color 0.4s, left 0.2s;
+          transition: background-color 0.4s, left 0.2s;
+}
+
+.weex-switch-checked > .weex-switch-inner {
+  left: 0.533333rem;
+}
+`
+
 export default {
   props: {
     checked: {
@@ -52,5 +109,6 @@ export default {
       staticClass: this.wrapperClass,
       staticStyle: extractComponentStyle(this)
     }, [createElement('small', { staticClass: 'weex-switch-inner' })])
-  }
+  },
+  _css
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501cde2f/html5/render/vue/components/text.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/text.js b/html5/render/vue/components/text.js
index 5ecdffa..6963b0b 100644
--- a/html5/render/vue/components/text.js
+++ b/html5/render/vue/components/text.js
@@ -9,6 +9,18 @@
 import { extractComponentStyle } from '../core'
 import { extend } from '../utils'
 
+const _css = `
+.weex-text {
+  display: -webkit-box;
+  -webkit-box-orient: vertical;
+  position: relative;
+  white-space: pre-wrap;  /* not using 'pre': support auto line feed. */
+  font-size: 0.426667rem;
+  word-wrap: break-word;
+  overflow: hidden; /* it'll be clipped if the height is not high enough. */
+}
+`
+
 /**
  * Get text special styles (lines and text-overflow).
  */
@@ -43,5 +55,6 @@ export default {
       staticClass: 'weex-text weex-el',
       staticStyle: extend(style, textSpecStyle)
     }, this.$slots.default || [this.value])
-  }
+  },
+  _css
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501cde2f/html5/render/vue/components/textarea.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/textarea.js b/html5/render/vue/components/textarea.js
index d170051..e017512 100644
--- a/html5/render/vue/components/textarea.js
+++ b/html5/render/vue/components/textarea.js
@@ -1,8 +1,18 @@
 import { extractComponentStyle } from '../core'
 import { inputCommon } from '../mixins'
 import { extend, mapFormEvents } from '../utils'
+
 // import { validateStyles } from '../validator'
 
+const _css = `
+.weex-textarea {
+  font-size: 0.426667rem
+}
+.weex-textarea:focus {
+  outline: none;
+}
+`
+
 export default {
   mixins: [inputCommon],
   props: {
@@ -46,5 +56,6 @@ export default {
       staticClass: 'weex-textarea weex-el',
       staticStyle: extractComponentStyle(this)
     })
-  }
+  },
+  _css
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501cde2f/html5/render/vue/components/web.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/web.js b/html5/render/vue/components/web.js
index cccda37..f810e4b 100644
--- a/html5/render/vue/components/web.js
+++ b/html5/render/vue/components/web.js
@@ -2,6 +2,16 @@ import { extractComponentStyle } from '../core'
 import { createEvent } from '../utils'
 // import { validateStyles } from '../validator'
 
+const _css = `
+.weex-web {
+  position: relative;
+  width: 100%;
+  height: 100%;
+  border: none;
+  box-sizing: border-box;
+}
+`
+
 export default {
   props: {
     src: String
@@ -49,5 +59,6 @@ export default {
       staticClass: 'weex-web weex-el',
       staticStyle: extractComponentStyle(this)
     })
-  }
+  },
+  _css
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501cde2f/html5/render/vue/core/style.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/core/style.js b/html5/render/vue/core/style.js
index 0f3a814..1b5db77 100644
--- a/html5/render/vue/core/style.js
+++ b/html5/render/vue/core/style.js
@@ -38,7 +38,7 @@ export function getHeadStyleMap () {
          * .a { color: red; }
          * etc.
          */
-        const match = str.match(/((?:,?\s*\.[\w-]+\[data-v-\w+\])+)\s*({[^}]+)/)
+        const match = str.match(/((?:,?\s*\.[\w-]+\[data-v-\w+\](?::\w+)?)+)\s*({[^}]+)/)
         if (!match) {
           // not the vue static class styles map. so acquire no rules for this styleSheet.
           // just jump through this styleSheet and go to analyzing next.
@@ -88,10 +88,6 @@ export function getScopeIds (context) {
   return arr
 }
 
-export function setDefaultStyle () {
-  
-}
-
 /**
  * get style in <style scoped> tags for this component.
  */

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501cde2f/html5/render/vue/env/index.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/env/index.js b/html5/render/vue/env/index.js
index 1eb3d21..0d997ee 100644
--- a/html5/render/vue/env/index.js
+++ b/html5/render/vue/env/index.js
@@ -1,4 +1,4 @@
-import css from '../styles/reset.css'
+import '../styles/reset.css'
 import '../styles/base.css'
 
 // import 'lazyimg'

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501cde2f/html5/render/vue/env/weex.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/env/weex.js b/html5/render/vue/env/weex.js
index 8b2c7d5..d8b3760 100644
--- a/html5/render/vue/env/weex.js
+++ b/html5/render/vue/env/weex.js
@@ -45,6 +45,13 @@ const weex = {
     if (!this.__vue__) {
       return console.log('[Vue Render] Vue is not found. Please import Vue.js before register a component.')
     }
+    if (component._css) {
+      const css = component._css.replace(/\b[+-]?[\d.]+rem;?\b/g, function (m) {
+        return parseFloat(m) * 75 * weex.config.env.scale + 'px'
+      })
+      utils.appendCss(css, `weex-cmp-${name}`)
+      delete component._css
+    }
     this.__vue__.component(name, component)
   },
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501cde2f/html5/render/vue/index.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/index.js b/html5/render/vue/index.js
index e381d6c..c782293 100644
--- a/html5/render/vue/index.js
+++ b/html5/render/vue/index.js
@@ -26,20 +26,9 @@ function init (Vue/*, options = {}*/) {
 
   // register sdk components.
   for (const name in components) {
-    Vue.component(name, components[name])
+    weex.registerComponent(name, components[name])
   }
 
-  // // get user extended plugins.
-  // const { components: comps, modules } = options
-  // // register user extended components.
-  // for (const name in comps) {
-  //   Vue.components(name, comps[name])
-  // }
-  // // register user extended modules.
-  // for (const mod in modules) {
-  //   this.registerModule(mod, modules[mod])
-  // }
-
   /* istanbul ignore next */
   // if (process.env.NODE_ENV === 'development') {
   //   if (semver.lt(Vue.version, '2.1.5')) {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501cde2f/html5/render/vue/mixins/base.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/mixins/base.js b/html5/render/vue/mixins/base.js
index ca30e0c..8f0953e 100644
--- a/html5/render/vue/mixins/base.js
+++ b/html5/render/vue/mixins/base.js
@@ -57,16 +57,6 @@ export default {
   },
 
   methods: {
-    _getTopContext () {
-      let ctx = this
-      let vnode = ctx.$options._parentVnode
-      while (vnode) {
-        ctx = vnode.context
-        vnode = ctx.$options._parentVnode
-      }
-      return ctx
-    },
-
     _getScopeIds () {
       const arr = []
       let ctx = this

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501cde2f/html5/render/vue/mixins/style.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/mixins/style.js b/html5/render/vue/mixins/style.js
index 051e6e3..1052501 100644
--- a/html5/render/vue/mixins/style.js
+++ b/html5/render/vue/mixins/style.js
@@ -1,68 +1,11 @@
 import {
-  camelizeKeys,
-  hyphenateKeys,
-  extend,
-  trimComment
-  // normalizeStyle
-} from '../utils'
-import { tagBegin, tagEnd } from '../utils/perf'
-import addPrefix from 'inline-style-prefixer/static'
+  getHeadStyleMap,
+  getComponentStyle,
+  extractComponentStyle
+} from '../core'
 
-function getHeadStyleMap () {
-  if (process.env.NODE_ENV === 'development') {
-    tagBegin('getHeadStyleMap')
-  }
-  const res = Array.from(document.styleSheets || [])
-    .reduce((pre, styleSheet) => {
-      // why not using styleSheet.rules || styleSheet.cssRules to get css rules ?
-      // because weex's components defined non-standard style attributes, which is
-      // auto ignored when access rule.cssText.
-      const strArr = trimComment(styleSheet.ownerNode.textContent.trim()).split(/}/)
-      const len = strArr.length
-      const rules = []
-      for (let i = 0; i < len; i++) {
-        const str = strArr[i]
-        if (!str || str.match(/^\s*$/)) {
-          continue
-        }
-
-        const match = str.match(/((?:,?\s*\.[[\]\w-]+\s*)+)({[^}]+)/)
-        if (!match) {
-          // not the vue static class styles map. so acquire no rules for this styleSheet.
-          // just jump through this styleSheet and go to analyzing next.
-          return pre
-        }
-        const clsNms = match[1].split(',').map(n => n.trim())
-        const cssText = match[2].replace(/[{}]/g, '').trim()
-        let clsNmsIdx = 0
-        const clsNmsLen = clsNms.length
-        while (clsNmsIdx < clsNmsLen) {
-          rules.push({
-            selectorText: clsNms[clsNmsIdx],
-            cssText
-          })
-          clsNmsIdx++
-        }
-      }
-      Array.from(rules).forEach(rule => {
-        const selector = rule.selectorText || ''
-        pre[selector] = trimComment(rule.cssText).split(';')
-          .reduce((styleObj, statement) => {
-            statement = statement.trim()
-            if (statement && statement.indexOf('/*') <= -1) {
-              const resArr = statement.split(':').map((part) => part.trim())
-              styleObj[resArr[0]] = resArr[1]
-            }
-            return styleObj
-          }, {})
-      })
-      return pre
-    }, {})
-  if (process.env.NODE_ENV === 'development') {
-    tagEnd('getHeadStyleMap')
-  }
-  return res
-}
+let warned = false
+const warnInfo = `[vue-render] after v0.11.3 there's no need to add $processStyle in vue-loader config anymore.`
 
 export default {
   beforeCreate () {
@@ -74,85 +17,15 @@ export default {
 
   methods: {
     $processStyle (style) {
-      window._style_processing_added = true
-      if (!style) {
-        return
-      }
-      if (window._process_style) {
-        return window._process_style(style)
-      }
-      if (style.display === 'flex') {
-        this.$nextTick(() => {
-          if (this.$el) {
-            this.$el.classList.add('weex-flex-ct')
-          }
-        })
-      }
-      return hyphenateKeys(addPrefix(camelizeKeys(style)))
-    },
-
-    _mergeStyle (data) {
-      const res = {}
-      const style = data.style
-      const staticStyle = data.staticStyle
-      const classes = typeof data.class === 'string' ? data.class.split(' ') : (data.class || [])
-      const staticClass = typeof data.staticClass === 'string' ? data.staticClass.split(' ') : (data.class || [])
-      const clsNms = staticClass.concat(classes)
-      extend(res, this._getScopeStyle(clsNms))
-      extend(res, staticStyle)
-      extend(res, style)
-      return hyphenateKeys(addPrefix(camelizeKeys(res)))
-    },
-
-    _getScopeStyle (classNames) {
-      const scopeIds = this._getScopeIds()
-      const style = {}
-      const styleMap = weex.styleMap
-      let map
-      let cls
-      let clsNmsIdx
-      let scpIdsIdx
-      const clsNmsLen = classNames.length
-      const scpIdsLen = scopeIds.length
-      if (clsNmsLen <= 0) {
-        return {}
-      }
-      clsNmsIdx = 0
-      while (clsNmsIdx < clsNmsLen) {
-        scpIdsIdx = 0
-        while (scpIdsIdx < scpIdsLen) {
-          cls = `.${classNames[clsNmsIdx]}[${scopeIds[scpIdsIdx]}]`
-          map = styleMap[cls]
-          if (!map) {
-            scpIdsIdx++
-            continue
-          }
-          for (const k in map) {
-            style[k] = map[k]
-          }
-          scpIdsIdx++
-        }
-        clsNmsIdx++
+      if (!warned) {
+        warned = true
+        console.warn(warnInfo)
       }
       return style
     },
 
-    _getSize (data) {
-      const wh = {}
-      const style = data.style
-      const staticStyle = data.staticStyle
-      const classes = typeof data.class === 'string' ? data.class.split(' ') : (data.class || [])
-      const staticClass = typeof data.staticClass === 'string' ? data.staticClass.split(' ') : (data.class || [])
-      const clsNms = staticClass.concat(classes)
-      function extendWHFrom (to, from) {
-        if (!from) { return }
-        from.width && (to.width = from.width)
-        from.height && (to.height = from.height)
-      }
-      extendWHFrom(wh, this._getScopeStyle(clsNms))
-      extendWHFrom(wh, staticStyle)
-      extendWHFrom(wh, style)
-      return wh
+    _extractComponentStyle () {
+      return extractComponentStyle(this)
     },
 
     /**
@@ -164,12 +37,7 @@ export default {
      *  4. data.staticClass style (scoped styles or static classes).
      */
     _getComponentStyle (data) {
-      const staticClassNames = (typeof data.staticClass === 'string') ? data.staticClass.split(' ') : (data.staticClass || [])
-      const classNames = (typeof data.class === 'string') ? data.class.split(' ') : (data.class || [])
-      const clsNms = staticClassNames.concat(classNames)
-      const style = this._getScopeStyle(clsNms)
-      const res = extend(style, data.staticStyle, data.style)
-      return res
+      return getComponentStyle(this)
     },
 
     _getParentRect () {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501cde2f/html5/render/vue/modules/animation.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/modules/animation.js b/html5/render/vue/modules/animation.js
index 1177827..bfcc159 100644
--- a/html5/render/vue/modules/animation.js
+++ b/html5/render/vue/modules/animation.js
@@ -1,4 +1,4 @@
-import { nextFrame, toCSSText } from '../utils'
+import { nextFrame, toCSSText, autoPrefix, camelizeKeys, normalizeStyle } from '../utils'
 
 function transitionOnce (vnode, config, callback) {
   const duration = config.duration || 1000 // ms
@@ -24,7 +24,8 @@ function transitionOnce (vnode, config, callback) {
   dom.addEventListener('transitionend', transitionEndHandler)
 
   nextFrame(() => {
-    dom.style.cssText += toCSSText(config.styles || {})
+    dom.style.cssText
+      += toCSSText(autoPrefix(normalizeStyle(camelizeKeys(config.styles))) || {})
   })
 }
 
@@ -36,7 +37,7 @@ export default {
    * @param  {String} callback
    */
   transition (vnode, config, callback) {
-    // TODO: Make sure the transition is only run once
+    if (!config.styles) { return }
     return transitionOnce(vnode, config, () => {
       callback && callback()
     })

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501cde2f/html5/render/vue/modules/dom.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/modules/dom.js b/html5/render/vue/modules/dom.js
index 1dd7c0f..b66c71a 100644
--- a/html5/render/vue/modules/dom.js
+++ b/html5/render/vue/modules/dom.js
@@ -1,4 +1,4 @@
-import { camelToKebab, appendStyle } from '../utils'
+import { camelToKebab, appendCss } from '../utils'
 
 function getParentScroller (vnode) {
   if (!vnode) return null
@@ -79,6 +79,7 @@ export default {
 
       if (options) {
         offset += Number(options.offset) || 0
+        offset *= weex.config.env.scale /* adapt offset to different screen scales. */
       }
       else if (process.env.NODE_ENV === 'development') {
         console.warn('[Vue Render] The second parameter of "scrollToElement" is required, '
@@ -144,6 +145,6 @@ export default {
       }
     }
     const styleText = `@${key}{${stylesText}}`
-    appendStyle(styleText, 'dom-added-rules')
+    appendCss(styleText, 'dom-added-rules')
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501cde2f/html5/render/vue/modules/index.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/modules/index.js b/html5/render/vue/modules/index.js
index 917eea7..74fb95d 100644
--- a/html5/render/vue/modules/index.js
+++ b/html5/render/vue/modules/index.js
@@ -25,7 +25,6 @@ const legacyModules = {
 const modules = {
   animation,
   dom,
-  modal,
   navigator,
   webview
 }
@@ -35,6 +34,7 @@ export default {
     for (const k in legacyModules) {
       weex.install(legacyModules[k])
     }
+    weex.install(modal)
     for (const k in modules) {
       weex.registerModule(k, modules[k])
     }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501cde2f/html5/render/vue/modules/modal/index.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/modules/modal/index.js b/html5/render/vue/modules/modal/index.js
index 4551800..8a74d86 100644
--- a/html5/render/vue/modules/modal/index.js
+++ b/html5/render/vue/modules/modal/index.js
@@ -2,9 +2,10 @@ import toast from './toast'
 import Alert from './alert'
 import Confirm from './confirm'
 import Prompt from './prompt'
+import _css from './style'
 
 // TODO: rewrite the modal styles
-export default {
+const modal = {
 
   // duration: default is 0.8 seconds.
   toast: function (config) {
@@ -46,3 +47,10 @@ export default {
     new Prompt(config).show()
   }
 }
+
+export default {
+  init: function (Weex) {
+    Weex.utils.appendCss(_css, 'weex-mud-modal')
+    Weex.registerModule('modal', modal)
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501cde2f/html5/render/vue/modules/modal/style.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/modules/modal/style.js b/html5/render/vue/modules/modal/style.js
new file mode 100644
index 0000000..f430ff4
--- /dev/null
+++ b/html5/render/vue/modules/modal/style.js
@@ -0,0 +1,146 @@
+export default `
+.weex-toast {
+  font-size: 0.426667rem;
+  line-height: 0.426667rem;
+  position: fixed;
+  z-index: 1999999999;
+  box-sizing: border-box;
+  max-width: 80%;
+  bottom: 50%;
+  left: 50%;
+  padding: 0.213333rem;
+  background-color: #000;
+  color: #fff;
+  text-align: center;
+  opacity: 0.6;
+  -webkit-transition: all 0.4s ease-in-out;
+          transition: all 0.4s ease-in-out;
+  border-radius: 0.066667rem;
+  -webkit-transform: translateX(-50%);
+  -ms-transform: translateX(-50%);
+      transform: translateX(-50%);
+}
+
+.weex-toast.hide {
+  opacity: 0;
+}
+
+.weex-alert .weex-alert-ok {
+  width: 100%;
+}
+
+.weex-confirm .btn-group .btn {
+  float: left;
+  width: 50%;
+}
+
+.weex-confirm .btn-group .btn.btn-ok {
+  border-right: 0.013333rem solid #ddd;
+}
+
+.weex-modal-wrap {
+  display: none;
+  position: fixed;
+  z-index: 999999999;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background-color: #000;
+  opacity: 0.5;
+}
+
+.weex-modal-node {
+  position: fixed;
+  z-index: 9999999999;
+  top: 50%;
+  left: 50%;
+  width: 6.666667rem;
+  min-height: 2.666667rem;
+  border-radius: 0.066667rem;
+  -webkit-transform: translate(-50%, -50%);
+  -ms-transform: translate(-50%, -50%);
+      transform: translate(-50%, -50%);
+  background-color: #fff;
+}
+
+.weex-modal-node.hide {
+  display: none;
+}
+
+.weex-modal-node .content {
+  display: -webkit-box;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-box-orient: vertical;
+  -webkit-flex-direction: column;
+  -ms-flex-direction: column;
+      flex-direction: column;
+  -webkit-box-align: center;
+  -webkit-align-items: center;
+  -ms-flex-align: center;
+      align-items: center;
+  -webkit-box-pack: center;
+  -webkit-justify-content: center;
+  -ms-flex-pack: center;
+      justify-content: center;
+  width: 100%;
+  min-height: 1.866667rem;
+  box-sizing: border-box;
+  font-size: 0.426667rem;
+  line-height: 0.426667rem;
+  padding: 0.213333rem;
+  border-bottom: 0.013333rem solid #ddd;
+}
+
+.weex-modal-node .btn-group {
+  width: 100%;
+  height: 0.8rem;
+  font-size: 0.373333rem;
+  text-align: center;
+  margin: 0;
+  padding: 0;
+  border: none;
+}
+
+.weex-modal-node .btn-group .btn {
+  text-align: center;
+}
+
+.weex-modal-node .btn-group .btn {
+  box-sizing: border-box;
+  height: 0.8rem;
+  line-height: 0.8rem;
+  margin: 0;
+  padding: 0;
+  border: none;
+  background: none;
+  text-align: center;
+}
+
+.weex-prompt .input-wrap {
+  box-sizing: border-box;
+  width: 100%;
+  margin-top: 0.133333rem;
+  height: 0.96rem;
+}
+
+.weex-prompt .input-wrap .input {
+  box-sizing: border-box;
+  width: 100%;
+  height: 0.56rem;
+  line-height: 0.56rem;
+  font-size: 0.426667rem;
+  border: 0.013333rem solid #999;
+}
+
+.weex-prompt .btn-group .btn {
+  float: left;
+  width: 50%;
+}
+
+.weex-prompt .btn-group .btn.btn-ok {
+  border-right: 0.013333rem solid #ddd;
+}
+`

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501cde2f/html5/render/vue/styles/base.css
----------------------------------------------------------------------
diff --git a/html5/render/vue/styles/base.css b/html5/render/vue/styles/base.css
index 656f3b3..17d0738 100644
--- a/html5/render/vue/styles/base.css
+++ b/html5/render/vue/styles/base.css
@@ -64,169 +64,6 @@
   min-width: 0;
 }
 
-
-
-body > .weex-div {
-  min-height: 100%;
-}
-
-.weex-input, .weex-textarea {
-  font-size: 0.426667rem;
-}
-.weex-input:focus, .weex-textarea:focus {
-  outline: none;
-}
-
-.weex-image, .weex-img {
-  background-repeat: no-repeat;
-  background-position: 50% 50%;
-}
-
-.weex-toast {
-  font-size: 0.426667rem;
-  line-height: 0.426667rem;
-  position: fixed;
-  z-index: 1999999999;
-  box-sizing: border-box;
-  max-width: 80%;
-  bottom: 50%;
-  left: 50%;
-  padding: 0.213333rem;
-  background-color: #000;
-  color: #fff;
-  text-align: center;
-  opacity: 0.6;
-  -webkit-transition: all 0.4s ease-in-out;
-          transition: all 0.4s ease-in-out;
-  border-radius: 0.066667rem;
-  -webkit-transform: translateX(-50%);
-  -ms-transform: translateX(-50%);
-      transform: translateX(-50%);
-}
-
-.weex-toast.hide {
-  opacity: 0;
-}
-
-.weex-alert .weex-alert-ok {
-  width: 100%;
-}
-
-.weex-confirm .btn-group .btn {
-  float: left;
-  width: 50%;
-}
-
-.weex-confirm .btn-group .btn.btn-ok {
-  border-right: 0.013333rem solid #ddd;
-}
-
-.weex-modal-wrap {
-  display: none;
-  position: fixed;
-  z-index: 999999999;
-  top: 0;
-  left: 0;
-  width: 100%;
-  height: 100%;
-  background-color: #000;
-  opacity: 0.5;
-}
-
-.weex-modal-node {
-  position: fixed;
-  z-index: 9999999999;
-  top: 50%;
-  left: 50%;
-  width: 6.666667rem;
-  min-height: 2.666667rem;
-  border-radius: 0.066667rem;
-  -webkit-transform: translate(-50%, -50%);
-  -ms-transform: translate(-50%, -50%);
-      transform: translate(-50%, -50%);
-  background-color: #fff;
-}
-
-.weex-modal-node.hide {
-  display: none;
-}
-
-.weex-modal-node .content {
-  display: -webkit-box;
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-orient: vertical;
-  -webkit-flex-direction: column;
-  -ms-flex-direction: column;
-      flex-direction: column;
-  -webkit-box-align: center;
-  -webkit-align-items: center;
-  -ms-flex-align: center;
-      align-items: center;
-  -webkit-box-pack: center;
-  -webkit-justify-content: center;
-  -ms-flex-pack: center;
-      justify-content: center;
-  width: 100%;
-  min-height: 1.866667rem;
-  box-sizing: border-box;
-  font-size: 0.426667rem;
-  line-height: 0.426667rem;
-  padding: 0.213333rem;
-  border-bottom: 0.013333rem solid #ddd;
-}
-
-.weex-modal-node .btn-group {
-  width: 100%;
-  height: 0.8rem;
-  font-size: 0.373333rem;
-  text-align: center;
-  margin: 0;
-  padding: 0;
-  border: none;
-}
-
-.amfe-modal-node .btn-group .btn {
-  text-align: center;
-}
-
-.weex-modal-node .btn-group .btn {
-  box-sizing: border-box;
-  height: 0.8rem;
-  line-height: 0.8rem;
-  margin: 0;
-  padding: 0;
-  border: none;
-  background: none;
-  text-align: center;
-}
-
-.weex-prompt .input-wrap {
-  box-sizing: border-box;
-  width: 100%;
-  margin-top: 0.133333rem;
-  height: 0.96rem;
-}
-
-.weex-prompt .input-wrap .input {
-  box-sizing: border-box;
-  width: 100%;
-  height: 0.56rem;
-  line-height: 0.56rem;
-  font-size: 0.426667rem;
-  border: 0.013333rem solid #999;
-}
-
-.weex-prompt .btn-group .btn {
-  float: left;
-  width: 50%;
-}
-
-.weex-prompt .btn-group .btn.btn-ok {
-  border-right: 0.013333rem solid #ddd;
-}
-
 body > .weex-list,
 body > .weex-scroller {
   max-height: 100%;
@@ -300,90 +137,6 @@ body > .weex-scroller {
   overflow: hidden;
 }
 
-.weex-slider-wrapper {
-  overflow: hidden;
-}
-
-.weex-slider-inner {
-  position: absolute;
-  height: 100%;
-  top: 0;
-  left: 0;
-}
-
-.weex-slider-cell {
-  display: block;
-  position: absolute;
-  top: 0;
-  left: 0;
-  right: 0;
-  bottom: 0;
-  margin: 0;
-  padding: 0;
-  height: 100%;
-  overflow: hidden;
-}
-
-.weex-indicator {
-  position: absolute;
-  z-index: 10;
-  -webkit-flex-direction: row;
-  -ms-flex-direction: row;
-  flex-direction: row;
-  -webkit-box-orient: horizontal;
-  margin: 0;
-  padding: 0;
-}
-
-.weex-indicator-item {
-  display: inline-block;
-  position: relative;
-  border-radius: 50%;
-  width: 0.266667rem;
-  height: 0.266667rem;
-  background-color: #BBBBBB;
-}
-.weex-indicator-item + .weex-indicator-item {
-  margin-left: 0.133333rem;
-}
-
-.weex-indicator-item-active {
-  background-color: blue;
-}
-
-.weex-refresh-indicator,
-.weex-loading-indicator {
-  width: 1.0rem;
-  height: 1.0rem;
-  -webkit-box-align: center;
-  -webkit-align-items: center;
-      -ms-flex-align: center;
-          align-items: center;
-  -webkit-box-pack: center;
-  -webkit-justify-content: center;
-      -ms-flex-pack: center;
-          justify-content: center;
-  overflow: visible;
-  background: none;
-}
-.weex-refresh-indicator:before,
-.weex-loading-indicator:before {
-  display: block;
-  content: '';
-  font-size: 0.16rem;
-  width: 1em;
-  height: 1em;
-  left: -60%;
-  top: 40%;
-  border-radius: 50%;
-  position: relative;
-  text-indent: -9999em;
-  -webkit-animation: weex-spinner 1.1s infinite ease;
-          animation: weex-spinner 1.1s infinite ease;
-  -webkit-transform: translate3d(1.0rem, 0, 0);
-          transform: translate3d(1.0rem, 0, 0);
-}
-
 @-webkit-keyframes weex-spinner {
   0%,
   100% {
@@ -439,75 +192,3 @@ body > .weex-scroller {
     box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.5), -2.6em 0em 0 0em rgba(255, 255, 255, 0.7), -1.8em -1.8em 0 0em #ffffff;
   }
 }
-.weex-switch {
-  border: 0.013333rem solid #dfdfdf;
-  cursor: pointer;
-  display: inline-block;
-  position: relative;
-  vertical-align: middle;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  box-sizing: content-box;
-  background-clip: content-box;
-  color: #64bd63;
-  width: 1.333333rem;
-  height: 0.8rem;
-  background-color: white;
-  border-color: #dfdfdf;
-  box-shadow: #dfdfdf 0 0 0 0 inset;
-  border-radius: 0.8rem;
-  -webkit-transition: border 0.4s, box-shadow 0.4s, background-color 1.2s;
-          transition: border 0.4s, box-shadow 0.4s, background-color 1.2s;
-}
-
-.weex-switch-checked {
-  background-color: #64bd63;
-  border-color: #64bd63;
-  box-shadow: #64bd63 0 0 0 0.533333rem inset;
-}
-
-.weex-switch-checked.weex-switch-disabled {
-  background-color: #A0CCA0;
-  box-shadow: #A0CCA0 0 0 0 0.533333rem inset;
-}
-
-.weex-switch-disabled {
-  background-color: #EEEEEE;
-}
-
-.weex-switch-inner {
-  width: 0.8rem;
-  height: 0.8rem;
-  background: #fff;
-  border-radius: 100%;
-  box-shadow: 0 0.013333rem 0.04rem rgba(0, 0, 0, 0.4);
-  position: absolute;
-  top: 0;
-  left: 0;
-  -webkit-transition: background-color 0.4s, left 0.2s;
-          transition: background-color 0.4s, left 0.2s;
-}
-
-.weex-switch-checked > .weex-switch-inner {
-  left: 0.533333rem;
-}
-
-.weex-text {
-  display: -webkit-box;
-  -webkit-box-orient: vertical;
-  position: relative;
-  white-space: pre-wrap;  /* not using 'pre': support auto line feed. */
-  font-size: 0.426667rem;
-  word-wrap: break-word;
-  overflow: hidden; /* it'll be clipped if the height is not high enough. */
-}
-
-.weex-web {
-  position: relative;
-  width: 100%;
-  height: 100%;
-  border: none;
-  box-sizing: border-box;
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501cde2f/html5/render/vue/utils/index.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/utils/index.js b/html5/render/vue/utils/index.js
index 46142a8..a010f10 100644
--- a/html5/render/vue/utils/index.js
+++ b/html5/render/vue/utils/index.js
@@ -58,17 +58,17 @@ export function hyphenateKeys (obj) {
   return res
 }
 
-// const vendorsReg = /webkit-|moz-|o-|ms-/
-// export function hyphenateStyleKeys (obj) {
-//   const res = {}
-//   for (const key in obj) {
-//     const hk = hyphenate(key).replace(vendorsReg, function ($0) {
-//       return '-' + $0
-//     })
-//     res[hk] = obj[key]
-//   }
-//   return res
-// }
+const vendorsReg = /webkit-|moz-|o-|ms-/
+export function hyphenateStyleKeys (obj) {
+  const res = {}
+  for (const key in obj) {
+    const hk = hyphenate(key).replace(vendorsReg, function ($0) {
+      return '-' + $0
+    })
+    res[hk] = obj[key]
+  }
+  return res
+}
 
 export function camelToKebab (name) {
   if (!name) { return '' }
@@ -77,8 +77,8 @@ export function camelToKebab (name) {
   })
 }
 
-export function appendStyle (css, styleId, replace) {
-  let style = document.getElementById(styleId)
+export function appendCss (css, cssId, replace) {
+  let style = document.getElementById(cssId)
   if (style && replace) {
     style.parentNode.removeChild(style)
     style = null
@@ -86,7 +86,7 @@ export function appendStyle (css, styleId, replace) {
   if (!style) {
     style = document.createElement('style')
     style.type = 'text/css'
-    styleId && (style.id = styleId)
+    cssId && (style.id = cssId)
     document.getElementsByTagName('head')[0].appendChild(style)
   }
   style.appendChild(document.createTextNode(css))
@@ -100,11 +100,11 @@ export function nextFrame (callback) {
 }
 
 export function toCSSText (object) {
+  if (!object) { return }
+  const obj = hyphenateStyleKeys(object)
   let cssText = ''
-  if (object) {
-    for (const key in object) {
-      cssText += `${hyphenate(key)}:${object[key]};`
-    }
+  for (const key in obj) {
+    cssText += `${key}:${obj[key]};`
   }
   return cssText
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501cde2f/package.json
----------------------------------------------------------------------
diff --git a/package.json b/package.json
index c60d18b..69aecaf 100644
--- a/package.json
+++ b/package.json
@@ -3,8 +3,8 @@
   "version": "0.4.0",
   "subversion": {
     "browser": "0.5.0",
-    "vue-render": "0.11.2",
     "framework": "0.19.17",
+    "vue-render": "0.11.3",
     "transformer": ">=0.1.5 <0.5"
   },
   "description": "A framework for building Mobile cross-platform UI",

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501cde2f/packages/weex-vue-render/README.md
----------------------------------------------------------------------
diff --git a/packages/weex-vue-render/README.md b/packages/weex-vue-render/README.md
index 867b318..d41f777 100644
--- a/packages/weex-vue-render/README.md
+++ b/packages/weex-vue-render/README.md
@@ -6,29 +6,7 @@ It can be run on browser only based on Vue 2.x (without Weex).
 
 ## use vue-loader
 
-**NOTE: ** you should use `vue-loader` to bundle your `.vue` file, not using `weex-loader`.
-
-you should add config for `vue-loader` as below (`vue-loader` version should be `>= 11.2.0`)
-
-```javascript
-vue: {
-  /**
-   * important! should use postTransformNode to add $processStyle for
-   * inline style prefixing.
-   */
-  compilerModules: [
-    {
-      postTransformNode: el => {
-        el.staticStyle = `$processStyle(${el.staticStyle})`
-        el.styleBinding = `$processStyle(${el.styleBinding})`
-      }
-    }
-  ],
-  autoprefixer: {
-    browsers: ['last 7 versions']
-  }
-},
-```
+**NOTE: ** after `v0.11.3` there's no need to add `$processStyle` and `autoprefixer` in your vue-loader config anymore. The runtime render will take care of it once for all.
 
 ## component -> dom map
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/501cde2f/packages/weex-vue-render/package.json
----------------------------------------------------------------------
diff --git a/packages/weex-vue-render/package.json b/packages/weex-vue-render/package.json
index 286ae02..48f8d95 100644
--- a/packages/weex-vue-render/package.json
+++ b/packages/weex-vue-render/package.json
@@ -1,6 +1,6 @@
 {
   "name": "weex-vue-render",
-  "version": "0.11.2",
+  "version": "0.11.3",
   "description": "Weex built-in components for Vue 2.x.",
   "license": "Apache-2.0",
   "main": "src/render/vue/index.js",



[12/23] incubator-weex git commit: * [html5] fix lint.

Posted by so...@apache.org.
* [html5] fix lint.


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

Branch: refs/heads/0.12-dev
Commit: 8e6d31d9d9c51cb6bfa81347bf0a8f3436dd4263
Parents: ff76bfa
Author: MrRaindrop <te...@gmail.com>
Authored: Mon Apr 10 16:12:20 2017 +0800
Committer: MrRaindrop <te...@gmail.com>
Committed: Mon Apr 10 16:12:20 2017 +0800

----------------------------------------------------------------------
 .eslintignore                                   |  1 +
 .../vue/components/scrollable/list/style.js     |  2 +-
 html5/test/render/vue/core/scope-style-map.js   |  2 --
 html5/test/render/vue/core/style.js             | 35 ++++++++------------
 html5/test/render/vue/helper/index.js           | 35 +-------------------
 html5/test/render/vue/helper/runtime.js         | 11 ++----
 html5/test/render/vue/utils/func.js             |  1 -
 html5/test/render/vue/utils/style.js            | 10 +++---
 8 files changed, 24 insertions(+), 73 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/8e6d31d9/.eslintignore
----------------------------------------------------------------------
diff --git a/.eslintignore b/.eslintignore
index ebc4e43..60ec529 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -2,6 +2,7 @@
 html5/test/case/*/*.source.js
 html5/test/case/*/*.output.js
 html5/test/render/vue/vender/*
+html5/test/render/vue/data/*
 *.css
 doc/themes/weex/source/*/*.js
 doc/themes/weex/source/*/*/*.js

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/8e6d31d9/html5/render/vue/components/scrollable/list/style.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/scrollable/list/style.js b/html5/render/vue/components/scrollable/list/style.js
index c9122af..8db6b4c 100644
--- a/html5/render/vue/components/scrollable/list/style.js
+++ b/html5/render/vue/components/scrollable/list/style.js
@@ -13,4 +13,4 @@ body > .weex-list {
   -webkit-overflow-scrolling: touch;
   width: 100%;
 }
-`
\ No newline at end of file
+`

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/8e6d31d9/html5/test/render/vue/core/scope-style-map.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/core/scope-style-map.js b/html5/test/render/vue/core/scope-style-map.js
index 8968687..af3002c 100644
--- a/html5/test/render/vue/core/scope-style-map.js
+++ b/html5/test/render/vue/core/scope-style-map.js
@@ -25,7 +25,6 @@ function getStyleSheetNodes () {
 }
 
 describe('style map', () => {
-
   let styleSheetNodes
 
   before(function () {
@@ -56,7 +55,6 @@ describe('style map', () => {
     for (const key in headMap) {
       const expected = headMap[key]
       const result = styleMap[key]
-      debugger;
       expect(expected).be.deep.equal(result)
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/8e6d31d9/html5/test/render/vue/core/style.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/core/style.js b/html5/test/render/vue/core/style.js
index 6b4a5ae..e0cdc65 100644
--- a/html5/test/render/vue/core/style.js
+++ b/html5/test/render/vue/core/style.js
@@ -1,33 +1,26 @@
 import { init } from '../helper/runtime'
-import {
-  getScopeIds,
-  getScopeStyle,
-  getComponentStyle,
-  getSize
-} from '../../../../render/vue/core/style'
 import div from '../../../../render/vue/components/div'
 import image from '../../../../render/vue/components/image'
-import { init as initViewport, resetViewport } from '../../../../render/vue/env/viewport'
+import { init as initViewport } from '../../../../render/vue/env/viewport'
 
 import scopedStyleBundle from '../data/build/dotvue/scoped-style'
 
-function toArray (arr) {
-  return Array.prototype.slice.call(arr)
-}
+// function toArray (arr) {
+//   return Array.prototype.slice.call(arr)
+// }
 
-function getVStyleSheetNodes () {
-  const regVStyleSheets = /((?:,?\s*\.[\w-]+\[data-v-\w+\](?::\w+)?)+)\s*({[^}]+)/
-  const nodes = toArray(document.styleSheets)
-    .filter(function (styleSheet) {
-      return regVStyleSheets.test(styleSheet.ownerNode.textContent)
-    }).map(function (styleSheet) {
-      return styleSheet.ownerNode
-    })
-  return nodes
-}
+// function getVStyleSheetNodes () {
+//   const regVStyleSheets = /((?:,?\s*\.[\w-]+\[data-v-\w+\](?::\w+)?)+)\s*({[^}]+)/
+//   const nodes = toArray(document.styleSheets)
+//     .filter(function (styleSheet) {
+//       return regVStyleSheets.test(styleSheet.ownerNode.textContent)
+//     }).map(function (styleSheet) {
+//       return styleSheet.ownerNode
+//     })
+//   return nodes
+// }
 
 init('core style', (Vue, helper) => {
-  const { compile, utils } = helper
   const { scale } = initViewport()
   before(() => {
     helper.register('div', div)

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/8e6d31d9/html5/test/render/vue/helper/index.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/helper/index.js b/html5/test/render/vue/helper/index.js
index 90e7371..75a1976 100644
--- a/html5/test/render/vue/helper/index.js
+++ b/html5/test/render/vue/helper/index.js
@@ -14,7 +14,7 @@ import * as utils from './utils'
  */
 export function init (title, fn) {
   return describe(title, () => {
-    let components = {}
+    // let components = {}
 
     before(function () {
       const htmlRegex = /^html:/i
@@ -71,36 +71,3 @@ export function init (title, fn) {
     })
   })
 }
-
-// import vue200 from './vender/vue-2.0.0.js'
-// import vue210 from './vender/vue-2.1.0.js'
-// const Vues = [
-//   vue200,
-//   vue210
-// ]
-/**
- * Describe tests for multiple versions of Vue.
- */
-// export function multiDescribe (title, fn) {
-//   return describe(title, () => {
-//     Vues.forEach(Vue => {
-//       let components = {}
-//       Vue.config.isReservedTag = function () { return false }
-//       describe(`Vue ${Vue.version}`, () => fn(Vue, {
-//         register (name, component) {
-//           components[name] = component
-//         },
-//         reset () {
-//           components = {}
-//         },
-//         createVm (options = {}) {
-//           options.components = components
-//           return new Vue(options).$mount()
-//         },
-//         compile (template) {
-//           return this.createVm({ template })
-//         }
-//       }))
-//     })
-//   })
-// }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/8e6d31d9/html5/test/render/vue/helper/runtime.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/helper/runtime.js b/html5/test/render/vue/helper/runtime.js
index 140405a..522b132 100644
--- a/html5/test/render/vue/helper/runtime.js
+++ b/html5/test/render/vue/helper/runtime.js
@@ -14,7 +14,7 @@ import * as utils from './utils'
  */
 export function init (title, fn) {
   return describe(title, () => {
-    let components = {}
+    // let components = {}
 
     before(function () {
       const htmlRegex = /^html:/i
@@ -41,17 +41,10 @@ export function init (title, fn) {
        */
       register (name, component) {
         global.weex.registerComponent(name, component)
-        components[name] = component
+        // components[name] = component
       },
 
       /**
-       * reset registered components with empty object.
-       */
-      // reset () {
-      //   components = {}
-      // },
-
-      /**
        * create a vm instance of Vue.
        * @param  {Object} options.
        * @return {Vue} vue instance.

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/8e6d31d9/html5/test/render/vue/utils/func.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/utils/func.js b/html5/test/render/vue/utils/func.js
index 17341f6..0aaa151 100644
--- a/html5/test/render/vue/utils/func.js
+++ b/html5/test/render/vue/utils/func.js
@@ -46,5 +46,4 @@ describe('utils', function () {
       expect(abc).to.deep.equal({ name: 'x' })
     })
   })
-
 })

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/8e6d31d9/html5/test/render/vue/utils/style.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/utils/style.js b/html5/test/render/vue/utils/style.js
index af0d71a..77b85ac 100644
--- a/html5/test/render/vue/utils/style.js
+++ b/html5/test/render/vue/utils/style.js
@@ -1,15 +1,15 @@
 import {
   autoPrefix,
-  normalizeStyle,
+  // normalizeStyle,
   normalizeString,
   normalizeNumber,
   normalizeUnitsNum
 } from '../../../../render/vue/utils/style'
-import { init, resetViewport } from '../../../../render/vue/env/viewport'
+import { init } from '../../../../render/vue/env/viewport'
 
 describe('style', function () {
-  const rect = document.documentElement.getBoundingClientRect()
-  const info = {}
+  // const rect = document.documentElement.getBoundingClientRect()
+  // const info = {}
   const { scale, dpr } = init()
 
   it('should normalize units numbers', function () {
@@ -65,4 +65,4 @@ describe('autoPrefix', function () {
     expect(transform).to.equal('translate3d(100px, 100px, 0)')
     expect(width).to.equal('200px')
   })
-})
\ No newline at end of file
+})


[20/23] incubator-weex git commit: Merge branch '0.12-dev' of https://git-wip-us.apache.org/repos/asf/incubator-weex into 0.12-dev

Posted by so...@apache.org.
Merge branch '0.12-dev' of https://git-wip-us.apache.org/repos/asf/incubator-weex into 0.12-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/f5fa7737
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/f5fa7737
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/f5fa7737

Branch: refs/heads/0.12-dev
Commit: f5fa7737dc668be25d8c68f29252f2937d0bb4a6
Parents: 2c4d669 68acd19
Author: sospartan <so...@apache.org>
Authored: Thu Apr 13 10:18:48 2017 +0800
Committer: sospartan <so...@apache.org>
Committed: Thu Apr 13 10:18:48 2017 +0800

----------------------------------------------------------------------
 ios/sdk/WeexSDK/Sources/Module/WXPickerModule.m | 32 +++++++++++++-------
 1 file changed, 21 insertions(+), 11 deletions(-)
----------------------------------------------------------------------



[15/23] incubator-weex git commit: * [html5] fix merging mutiple css declaration for same classes.

Posted by so...@apache.org.
* [html5] fix merging mutiple css declaration for same classes.


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

Branch: refs/heads/0.12-dev
Commit: 66e69b35c88407b2d9ef7d760ebc845dbf203dca
Parents: 9bf25f4
Author: MrRaindrop <te...@gmail.com>
Authored: Tue Apr 11 12:22:46 2017 +0800
Committer: MrRaindrop <te...@gmail.com>
Committed: Tue Apr 11 12:22:46 2017 +0800

----------------------------------------------------------------------
 html5/render/vue/core/style.js            |  9 +++++-
 html5/test/render/vue/data/css/head13.css | 25 ++++++++++++++++
 html5/test/render/vue/data/head-css.js    |  1 +
 html5/test/render/vue/data/head-map.js    | 40 ++++++++++++++++++++++----
 4 files changed, 68 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/66e69b35/html5/render/vue/core/style.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/core/style.js b/html5/render/vue/core/style.js
index d5b5d83..341a5f6 100644
--- a/html5/render/vue/core/style.js
+++ b/html5/render/vue/core/style.js
@@ -67,7 +67,7 @@ export function getHeadStyleMap () {
       }
       Array.from(rules).forEach(rule => {
         const selector = rule.selectorText || ''
-        pre[selector] = trimComment(rule.cssText).split(';')
+        const styleObj = trimComment(rule.cssText).split(';')
           .reduce((styleObj, statement) => {
             statement = statement.trim()
             if (statement && statement.indexOf('/*') <= -1) {
@@ -76,6 +76,13 @@ export function getHeadStyleMap () {
             }
             return styleObj
           }, {})
+        const res = pre[selector]
+        if (!res) {
+          pre[selector] = styleObj
+        }
+        else {
+          extend(pre[selector], styleObj)
+        }
       })
       /**
        * remove this styleSheet node since it's in the styleMap already. And this style

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/66e69b35/html5/test/render/vue/data/css/head13.css
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/data/css/head13.css b/html5/test/render/vue/data/css/head13.css
new file mode 100644
index 0000000..6cf748c
--- /dev/null
+++ b/html5/test/render/vue/data/css/head13.css
@@ -0,0 +1,25 @@
+.row[data-v-0dad7305] {
+  flex-direction: row;
+}
+.result[data-v-0dad7305] {
+  text-align: right;
+  background-color: #666;
+  font-size: 40px;
+  color: white;
+}
+.btn[data-v-0dad7305] {
+  flex: 1;
+  text-align: center;
+  background-color: #eee;
+  font-size: 36px;
+}
+.btn[data-v-0dad7305], .result[data-v-0dad7305] {
+  height: 100px;
+  padding: 30px;
+  margin: 5px;
+}
+.btn-operator[data-v-0dad7305] {
+  background-color: #669;
+  font-size: 40px;
+  color: white;
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/66e69b35/html5/test/render/vue/data/head-css.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/data/head-css.js b/html5/test/render/vue/data/head-css.js
index ca4aca6..28231b0 100644
--- a/html5/test/render/vue/data/head-css.js
+++ b/html5/test/render/vue/data/head-css.js
@@ -10,3 +10,4 @@ import './css/head9.css'
 import './css/head10.css'
 import './css/head11.css'
 import './css/head12.css'
+import './css/head13.css'

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/66e69b35/html5/test/render/vue/data/head-map.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/data/head-map.js b/html5/test/render/vue/data/head-map.js
index cde66c9..238d18d 100644
--- a/html5/test/render/vue/data/head-map.js
+++ b/html5/test/render/vue/data/head-map.js
@@ -1,5 +1,5 @@
 export default {
-  /*// 1 /////////////////////////////////////////////////*/
+  /*// head1.css /////////////////////////////////////////////////*/
   ".wrapper[data-v-67763bae]": {
     "width": "375px",
     "overflow": "hidden"
@@ -35,7 +35,7 @@ export default {
     "bottom": "0"
   },
 
-  /*// 2 /////////////////////////////////////////////////*/
+  /*// head2.css /////////////////////////////////////////////////*/
   ".wrapper[data-v-16194ed9]": {
     "color": "#353535"
   },
@@ -46,7 +46,7 @@ export default {
     "width": "375px"
   },
 
-  /*// 3 /////////////////////////////////////////////////*/
+  /*// head3.css /////////////////////////////////////////////////*/
   ".wrapper[data-v-6acf469e]": {
     "background-color": "transparent",
     "-webkit-box-pack": "center",
@@ -70,7 +70,7 @@ export default {
     "flex-direction": "row"
   },
 
-  /*// 4 /////////////////////////////////////////////////*/
+  /*// head4.css /////////////////////////////////////////////////*/
   ".item[data-v-553d6ea0]": {
     "width": "178px",
     "height": "118px",
@@ -126,7 +126,7 @@ export default {
     "top": "76px"
   },
 
-  /*// 5 /////////////////////////////////////////////////*/
+  /*// head5.css /////////////////////////////////////////////////*/
   ".wrapper[data-v-2c9fb3eb]": {
     "background-color": "transparent"
   },
@@ -243,5 +243,33 @@ export default {
     "color": "#E71A17",
     "font-size": "15px",
     "font-weight": "bold"
+  },
+
+  /*// head13.css /////////////////////////////////////////////////*/
+  ".row[data-v-0dad7305]": {
+    "flex-direction": "row"
+  },
+  ".result[data-v-0dad7305]": {
+    "text-align": "right",
+    "background-color": "#666",
+    "font-size": "40px",
+    "color": "white",
+    "height": "100px",
+    "padding": "30px",
+    "margin": "5px"
+  },
+  ".btn[data-v-0dad7305]": {
+    "flex": "1",
+    "text-align": "center",
+    "background-color": "#eee",
+    "font-size": "36px",
+    "height": "100px",
+    "padding": "30px",
+    "margin": "5px"
+  },
+  ".btn-operator[data-v-0dad7305]": {
+    "background-color": "#669",
+    "font-size": "40px",
+    "color": "white"
   }
-}
\ No newline at end of file
+}


[17/23] incubator-weex git commit: * [android] ignore caps on dialog button

Posted by so...@apache.org.
* [android] ignore caps on dialog button


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

Branch: refs/heads/0.12-dev
Commit: e0a0c72e8c6b5f8507caf1d3b2102ecddbf66927
Parents: 094ade0
Author: moxun.ljf <fu...@foxmail.com>
Authored: Wed Apr 12 10:05:24 2017 +0800
Committer: moxun.ljf <fu...@foxmail.com>
Committed: Wed Apr 12 10:05:24 2017 +0800

----------------------------------------------------------------------
 .../main/java/com/taobao/weex/appfram/pickers/WXPickersModule.java | 2 ++
 1 file changed, 2 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/e0a0c72e/android/sdk/src/main/java/com/taobao/weex/appfram/pickers/WXPickersModule.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/appfram/pickers/WXPickersModule.java b/android/sdk/src/main/java/com/taobao/weex/appfram/pickers/WXPickersModule.java
index 292fba0..8e1b72c 100644
--- a/android/sdk/src/main/java/com/taobao/weex/appfram/pickers/WXPickersModule.java
+++ b/android/sdk/src/main/java/com/taobao/weex/appfram/pickers/WXPickersModule.java
@@ -466,10 +466,12 @@ public class WXPickersModule extends WXModule {
 
                     if (confirmTitle != null) {
                         confirm.setText(confirmTitle);
+                        confirm.setAllCaps(false);
                     }
 
                     if (confirmColor != Color.TRANSPARENT) {
                         confirm.setTextColor(confirmColor);
+                        confirm.setAllCaps(false);
                     }
                 }