You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by ac...@apache.org on 2017/08/10 05:58:59 UTC

[02/14] incubator-weex git commit: + [ios] extmodule for coverage

+ [ios] extmodule for coverage


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

Branch: refs/heads/0.16-dev
Commit: 2ac30d5a49f9be46bb76e410ca36dd55d3b767cf
Parents: 027f8a1
Author: gurisxie <27...@qq.com>
Authored: Tue Aug 8 20:56:16 2017 +0800
Committer: gurisxie <27...@qq.com>
Committed: Tue Aug 8 20:56:16 2017 +0800

----------------------------------------------------------------------
 .../WeexDemo.xcodeproj/project.pbxproj          |   6 +
 ios/playground/WeexDemo/AppDelegate.m           |   8 +-
 ios/playground/WeexDemo/WXExtModule.h           |  15 ++
 ios/playground/WeexDemo/WXExtModule.m           |  32 ++++
 package.json                                    |   7 +-
 test/pages/include/button.vue                   | 162 +++++++++++++++++++
 test/pages/include/h1.vue                       |  13 ++
 test/pages/include/h2.vue                       |  13 ++
 test/pages/include/h3.vue                       |  13 ++
 test/pages/include/hn.vue                       |  47 ++++++
 test/pages/include/panel.vue                    | 141 ++++++++++++++++
 test/pages/include/wxc-desc.vue                 |  66 ++++++++
 test/pages/modules/cover-generate.vue           |  53 ++++++
 13 files changed, 568 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2ac30d5a/ios/playground/WeexDemo.xcodeproj/project.pbxproj
----------------------------------------------------------------------
diff --git a/ios/playground/WeexDemo.xcodeproj/project.pbxproj b/ios/playground/WeexDemo.xcodeproj/project.pbxproj
index 6791723..1943c69 100644
--- a/ios/playground/WeexDemo.xcodeproj/project.pbxproj
+++ b/ios/playground/WeexDemo.xcodeproj/project.pbxproj
@@ -32,6 +32,7 @@
 		847CAF2C1F39BB8A00551725 /* WXATLoggerPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = DCABAFF01D029685001C8592 /* WXATLoggerPlugin.m */; };
 		847CAF2D1F39BBB900551725 /* WXScannerHistoryVC.m in Sources */ = {isa = PBXBuildFile; fileRef = DC5B53681E8CED9400E02125 /* WXScannerHistoryVC.m */; };
 		847CAF2E1F39BBFB00551725 /* WXConfigCenterDefaultImpl.m in Sources */ = {isa = PBXBuildFile; fileRef = DC20B8E51ECADA2500845F39 /* WXConfigCenterDefaultImpl.m */; };
+		847CAF311F39E3F100551725 /* WXExtModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 847CAF301F39E3F100551725 /* WXExtModule.m */; };
 		84D7CAC71CE3266C00D48D46 /* libsqlite3.0.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7475ACA01CD8444A0044E96C /* libsqlite3.0.tbd */; };
 		8A0B5EFFF75BF82EA481983D /* libPods-WeexUITestDemo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E48C20F443AA337D1FE97622 /* libPods-WeexUITestDemo.a */; };
 		C43CDA031F1C6E01005A6B03 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = C43CDA021F1C6E01005A6B03 /* libz.tbd */; };
@@ -92,6 +93,8 @@
 		775BEE981C1E8ECC008D1629 /* WeexDemoTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WeexDemoTests.m; sourceTree = "<group>"; };
 		775BEE9A1C1E8ECC008D1629 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		84361D751CA10F8E00F43825 /* WeexUITestDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WeexUITestDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };
+		847CAF2F1F39E3F100551725 /* WXExtModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXExtModule.h; sourceTree = "<group>"; };
+		847CAF301F39E3F100551725 /* WXExtModule.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXExtModule.m; sourceTree = "<group>"; };
 		9420131417A731ED089B0814 /* Pods-WeexDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WeexDemo.release.xcconfig"; path = "Pods/Target Support Files/Pods-WeexDemo/Pods-WeexDemo.release.xcconfig"; sourceTree = "<group>"; };
 		C43CDA021F1C6E01005A6B03 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };
 		DC20B8E41ECADA2500845F39 /* WXConfigCenterDefaultImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXConfigCenterDefaultImpl.h; sourceTree = "<group>"; };
@@ -300,6 +303,8 @@
 				DCABB0001D02975E001C8592 /* WXEventModule.m */,
 				7478481C1E0CD4910044500D /* WXSyncTestModule.h */,
 				7478481D1E0CD4910044500D /* WXSyncTestModule.m */,
+				847CAF2F1F39E3F100551725 /* WXExtModule.h */,
+				847CAF301F39E3F100551725 /* WXExtModule.m */,
 			);
 			name = module;
 			sourceTree = "<group>";
@@ -576,6 +581,7 @@
 				DCABB0011D02975E001C8592 /* WXEventModule.m in Sources */,
 				7478481E1E0CD4910044500D /* WXSyncTestModule.m in Sources */,
 				775BEE831C1E8ECC008D1629 /* AppDelegate.m in Sources */,
+				847CAF311F39E3F100551725 /* WXExtModule.m in Sources */,
 				DC20B8E61ECADA2500845F39 /* WXConfigCenterDefaultImpl.m in Sources */,
 				DCABAFF41D029685001C8592 /* WXATViewHierarchyPlugin.m in Sources */,
 				775BEE801C1E8ECC008D1629 /* main.m in Sources */,

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2ac30d5a/ios/playground/WeexDemo/AppDelegate.m
----------------------------------------------------------------------
diff --git a/ios/playground/WeexDemo/AppDelegate.m b/ios/playground/WeexDemo/AppDelegate.m
index 4d9b9cd..19c702e 100644
--- a/ios/playground/WeexDemo/AppDelegate.m
+++ b/ios/playground/WeexDemo/AppDelegate.m
@@ -28,6 +28,7 @@
 #import "WXScannerVC.h"
 #import "WXScannerHistoryVC.h"
 #import "WXSyncTestModule.h"
+#import "WXExtModule.h"
 #import "UIView+UIThreadCheck.h"
 #import <WeexSDK/WeexSDK.h>
 #import <AVFoundation/AVFoundation.h>
@@ -119,6 +120,8 @@
     [WXSDKEngine registerComponent:@"select" withClass:NSClassFromString(@"WXSelectComponent")];
     [WXSDKEngine registerModule:@"event" withClass:[WXEventModule class]];
     [WXSDKEngine registerModule:@"syncTest" withClass:[WXSyncTestModule class]];
+    [WXSDKEngine registerModule:@"ext" withClass:[WXExtModule class]];
+    
     
 #if !(TARGET_IPHONE_SIMULATOR)
     [self checkUpdate];
@@ -148,11 +151,6 @@
 #else
     ((WXDemoViewController *)demo).url = [NSURL URLWithString:BUNDLE_URL];
 #endif
-    
-#ifdef UITEST
-    ((WXDemoViewController *)demo).url = [NSURL URLWithString:UITEST_HOME_URL];
-#endif
-    
     return demo;
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2ac30d5a/ios/playground/WeexDemo/WXExtModule.h
----------------------------------------------------------------------
diff --git a/ios/playground/WeexDemo/WXExtModule.h b/ios/playground/WeexDemo/WXExtModule.h
new file mode 100644
index 0000000..3c92ead
--- /dev/null
+++ b/ios/playground/WeexDemo/WXExtModule.h
@@ -0,0 +1,15 @@
+//
+//  WXExtModule.h
+//  WeexDemo
+//
+//  Created by admin on 2017/8/8.
+//  Copyright © 2017年 taobao. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#import <WeexSDK/WXModuleProtocol.h>
+
+@interface WXExtModule : NSObject <WXModuleProtocol>
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2ac30d5a/ios/playground/WeexDemo/WXExtModule.m
----------------------------------------------------------------------
diff --git a/ios/playground/WeexDemo/WXExtModule.m b/ios/playground/WeexDemo/WXExtModule.m
new file mode 100644
index 0000000..2bde6cd
--- /dev/null
+++ b/ios/playground/WeexDemo/WXExtModule.m
@@ -0,0 +1,32 @@
+//
+//  WXExtModule.m
+//  WeexDemo
+//
+//  Created by admin on 2017/8/8.
+//  Copyright © 2017年 taobao. All rights reserved.
+//
+
+#import "WXExtModule.h"
+
+@implementation WXExtModule
+
+WX_EXPORT_METHOD(@selector(generateCover:))
+
+- (void)generateCover:(WXModuleCallback)callback
+{
+#if !TARGET_IPHONE_SIMULATOR
+    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
+    NSString *documentsDirectory = [paths objectAtIndex:0];
+    setenv("GCOV_PREFIX", [documentsDirectory cStringUsingEncoding:NSUTF8StringEncoding], 1);
+    setenv("GCOV_PREFIX_STRIP", "6", 1);
+#endif
+    extern void __gcov_flush(void);
+    __gcov_flush();
+    
+    if (callback) {
+        NSDictionary * result = @{@"ok": @true};
+        callback(result);
+    }
+}
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2ac30d5a/package.json
----------------------------------------------------------------------
diff --git a/package.json b/package.json
index 270267e..46ab3a6 100644
--- a/package.json
+++ b/package.json
@@ -89,8 +89,9 @@
     "danger": "danger"
   },
   "dependencies": {
-    "autoprefixer": "^6.7.7",
+    "@weex-project/downgrade": "^1.0.3",
     "animationjs": "^0.1.5",
+    "autoprefixer": "^6.7.7",
     "blink-diff": "~1.0.12",
     "core-js": "^2.4.0",
     "cubicbezier": "^0.1.1",
@@ -104,8 +105,8 @@
     "semver": "^5.1.0",
     "weex-picker": "^0.1.0",
     "weex-rax-framework": "0.4.7",
-    "weex-vue-framework": "2.4.2-weex.3",
-    "weex-styler": "0.1.9"
+    "weex-styler": "0.1.9",
+    "weex-vue-framework": "2.4.2-weex.3"
   },
   "devDependencies": {
     "@weex-project/weex-picker": "^0.2.4",

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

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2ac30d5a/test/pages/include/h1.vue
----------------------------------------------------------------------
diff --git a/test/pages/include/h1.vue b/test/pages/include/h1.vue
new file mode 100644
index 0000000..78c0191
--- /dev/null
+++ b/test/pages/include/h1.vue
@@ -0,0 +1,13 @@
+<template>
+  <text class="h1">{{value}}</text>
+</template>
+
+<style scoped>
+  .h1 {font-size: 64px; font-weight: bold;
+    padding: 20px; margin-top: 20px; margin-bottom: 20px;
+    background-color: #eee;}
+</style>
+
+<script>
+  exports.props = ['value']
+</script>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2ac30d5a/test/pages/include/h2.vue
----------------------------------------------------------------------
diff --git a/test/pages/include/h2.vue b/test/pages/include/h2.vue
new file mode 100644
index 0000000..6362093
--- /dev/null
+++ b/test/pages/include/h2.vue
@@ -0,0 +1,13 @@
+<template>
+  <text class="h2">{{value}}</text>
+</template>
+
+<style scoped>
+  .h2 {font-size: 48px; font-weight: bold;
+    padding: 20px; margin-top: 20px; margin-bottom: 20px;
+    background-color: #eee;}
+</style>
+
+<script>
+  exports.props = ['value']
+</script>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2ac30d5a/test/pages/include/h3.vue
----------------------------------------------------------------------
diff --git a/test/pages/include/h3.vue b/test/pages/include/h3.vue
new file mode 100644
index 0000000..338b340
--- /dev/null
+++ b/test/pages/include/h3.vue
@@ -0,0 +1,13 @@
+<template>
+  <text class="h3">{{value}}</text>
+</template>
+
+<style scoped>
+  .h3 {font-size: 36px; font-weight: bold;
+    padding: 20px; margin-top: 20px; margin-bottom: 20px;
+    background-color: #eee;}
+</style>
+
+<script>
+  exports.props = ['value']
+</script>

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

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

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2ac30d5a/test/pages/include/wxc-desc.vue
----------------------------------------------------------------------
diff --git a/test/pages/include/wxc-desc.vue b/test/pages/include/wxc-desc.vue
new file mode 100644
index 0000000..ccb4593
--- /dev/null
+++ b/test/pages/include/wxc-desc.vue
@@ -0,0 +1,66 @@
+<template>
+  <div class='absolute'>
+    <div class='desc'>
+      <button type="info" size="middle" value="测试描述" @click.native="show"></button>
+    </div>
+    <mask class="mask" v-if="shown"  @click="hide">
+      <div class="content" @click="divclick">
+        <text class='h3'>测试描述:</text>
+        <text class='tips'>点击遮罩层可关闭!</text>
+        <slot></slot>
+      </div>
+    </mask>
+  </div>
+</template>
+
+<script>
+  module.exports = {
+    components: {
+      button: require('./button.vue')
+    },
+    data : {
+      shown:false
+    },
+    methods : {
+      show : function(e) {
+        this.shown = true
+        this.$forceUpdate()
+      },
+      hide: function(e) {
+        this.shown = false
+        this.$forceUpdate()
+      },
+    }
+  }
+</script>
+
+<style scoped>
+  .mask{
+    background-color: #cccccc;
+    position:absolute;
+    left:20;
+    top:20;
+    width:710;
+  }
+  .content{
+    margin:20;
+  }
+  .h3 {font-size: 36px; font-weight: bold;
+    margin-top: 20px; margin-bottom: 20px;
+  }
+  .desc{
+    margin:20;
+  }
+  .tips{
+    font-size: 13px;
+    position: absolute;
+    right:10px;
+    top:10px;
+  }
+  .absolute{
+    position:absolute;
+    right:20;
+    bottom:20;
+  }
+</style>
+

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2ac30d5a/test/pages/modules/cover-generate.vue
----------------------------------------------------------------------
diff --git a/test/pages/modules/cover-generate.vue b/test/pages/modules/cover-generate.vue
new file mode 100644
index 0000000..30c6a4a
--- /dev/null
+++ b/test/pages/modules/cover-generate.vue
@@ -0,0 +1,53 @@
+<template>
+  <div>
+    <panel title = 'cover-generate' :padding-body='0'>
+      <div style='flex-direction:row'> 
+        <button class='mr-base' type="info" size="middle" value="generate" @click.native="generate"></button>
+      </div>
+      <panel title='校验结果:'>
+        <text style="font-size:30px">{{resultTxt}}</text>
+      </panel>
+    </panel>
+    <wxc-desc>
+      <text class='desc'>
+测试点:
+  * 
+
+测试方式:
+  * 
+  * 
+      </text>
+    </wxc-desc>
+  </div>
+</template>
+<script>
+  var ext = weex.requireModule("ext");
+  module.exports = {
+    data : {
+      resultTxt:'',
+    },
+    components: {
+      "wxc-desc":require('../include/wxc-desc.vue'),
+      panel: require('../include/panel.vue'),
+      button: require('../include/button.vue'),
+    },
+    methods : {
+      generate:function() {
+        ext.generateCover((ret)=>{
+        	this.resultTxt = 'coverage success'
+        });
+      }
+    }
+  }
+</script>
+
+<style scoped>
+  .origin{background-color: #FFFFDF;width: 200;height: 50;}
+  .mr-base{
+    margin: 10px;
+  }
+  .desc{
+    color:#aa0000;
+    font-size: 30px;
+  }
+</style>
\ No newline at end of file