提交 61fdb819 编写于 作者: J jiyong_sd

modified FA-JS

Signed-off-by: Njiyong_sd <jiyong@huawei.com>
Change-Id: I526bfe2fe40ebd23472c1c7a6127a7e3bde87150
上级 1c217309
...@@ -23,7 +23,9 @@ ohos_js_hap_suite("ActsAceStandardVideoTest") { ...@@ -23,7 +23,9 @@ ohos_js_hap_suite("ActsAceStandardVideoTest") {
hap_name = "ActsAceStandardVideoTest" hap_name = "ActsAceStandardVideoTest"
} }
ohos_js_assets("ace_js_assets") { ohos_js_assets("ace_js_assets") {
source_dir = "./src/main/js/default" js2abc = true
hap_profile = "./src/main/config.json"
source_dir = "./src/main/js"
} }
ohos_resources("ace_resources") { ohos_resources("ace_resources") {
sources = [ "./src/main/resources" ] sources = [ "./src/main/resources" ]
......
{ {
"description": "Configuration for acevideo Tests", "description": "Configuration for acevideo Tests",
"driver": { "driver": {
"type": "JSUnitTest", "type": "OHJSUnitTest",
"test-timeout": "1000000", "test-timeout": "1000000",
"package": "com.example.acevideo", "shell-timeout": "1000000",
"shell-timeout": "30000" "bundle-name": "com.example.acevideo",
}, "package-name": "com.example.acevideo"
"kits": [ },
{ "kits": [
"test-file-name": [ {
"ActsAceStandardVideoTest.hap" "test-file-name": [
], "ActsAceStandardVideoTest.hap"
"type": "AppInstallKit", ],
"cleanup-apps": true "type": "AppInstallKit",
} "cleanup-apps": true
] }
} ]
}
\ No newline at end of file
{ {
"app": { "app": {
"bundleName": "com.example.acevideo", "bundleName": "com.example.acevideo",
"vendor": "example", "vendor": "example",
"version": { "version": {
"code": 1000000, "code": 1000000,
"name": "1.0.0" "name": "1.0.0"
}, },
"apiVersion": { "apiVersion": {
"compatible": 4, "compatible": 4,
"target": 8 "target": 8
} }
}, },
"deviceConfig": {}, "deviceConfig": {},
"module": { "module": {
"package": "com.example.acevideo", "package": "com.example.acevideo",
"name": ".MyApplication", "name": ".entry",
"mainAbility": "com.example.acevideo.MainAbility", "mainAbility": ".MainAbility",
"deviceType": [ "deviceType": [
"phone" "phone"
], ],
"distro": { "distro": {
"deliveryWithInstall": true, "deliveryWithInstall": true,
"moduleName": "entry", "moduleName": "entry",
"moduleType": "entry", "moduleType": "entry",
"installationFree": false "installationFree": false
}, },
"abilities": [ "abilities": [
{ {
"skills": [ "skills": [
{ {
"entities": [ "entities": [
"entity.system.home" "entity.system.home"
], ],
"actions": [ "actions": [
"action.system.home" "action.system.home"
] ]
} }
], ],
"name": "com.example.acevideo.MainAbility", "orientation": "unspecified",
"icon": "$media:icon", "formsEnabled": false,
"description": "$string:mainability_description", "name": ".MainAbility",
"label": "$string:entry_MainAbility", "srcLanguage": "js",
"type": "page", "srcPath": "MainAbility",
"launchType": "standard", "icon": "$media:icon",
"visible": true, "description": "$string:MainAbility_desc",
"configChanges": ["orientation"] "label": "$string:MainAbility_label",
} "type": "page",
], "visible": true,
"js": [ "launchType": "standard"
{ },
"pages": [ {
"pages/index/index", "orientation": "unspecified",
"pages/routerPush/index", "formsEnabled": false,
"pages/routerReplace/index", "name": ".TestAbility",
"pages/video/router/index" "srcLanguage": "js",
], "srcPath": "TestAbility",
"name": "default", "icon": "$media:icon",
"window": { "description": "$string:TestAbility_desc",
"designWidth": 720, "label": "$string:TestAbility_label",
"autoDesignWidth": true "type": "page",
} "visible": true,
} "launchType": "standard"
] }
} ],
"js": [
{
"pages": [
"pages/index/index",
"pages/routerPush/index",
"pages/routerReplace/index",
"pages/video/router/index"
],
"name": "default",
"window": {
"designWidth": 720,
"autoDesignWidth": true
}
},
{
"pages": [
"pages/index/index"
],
"name": ".TestAbility",
"window": {
"designWidth": 720,
"autoDesignWidth": false
}
}
],
"testRunner": {
"name": "OpenHarmonyTestRunner",
"srcPath": "TestRunner"
},
"srcPath": ""
}
} }
\ No newline at end of file
/*
* Copyright (C) 2021 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import AbilityDelegatorRegistry from '@ohos.application.abilityDelegatorRegistry'
import { Hypium } from '@ohos/hypium'
import testsuite from '../test/List.test'
export default {
onCreate() {
console.info('TestApplication onCreate')
var abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator()
var abilityDelegatorArguments = AbilityDelegatorRegistry.getArguments()
console.info('start run testcase!!!')
Hypium.hypiumTest(abilityDelegator, abilityDelegatorArguments, testsuite)
},
onDestroy() {
console.info("TestApplication onDestroy");
}
};
/** /**
* Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
import {Core, ExpectExtend} from 'deccjsunit/index'
const injectRef = Object.getPrototypeOf(global) || global
const injectRef = Object.getPrototypeOf(global) || global injectRef.regeneratorRuntime = require('@babel/runtime/regenerator')
injectRef.regeneratorRuntime = require('@babel/runtime/regenerator')
export default {
export default { data: {
data: { title: ""
title: "" },
}, onInit() {
onInit() { console.info('[test page log] index onInit')
console.info('[test page log] index onInit') this.title = this.$t('strings.world');
this.title = this.$t('strings.world'); },
const core = Core.getInstance() onShow() {
const expectExtend = new ExpectExtend({ console.info('[test page log] index onShow')
'id': 'extend' },
}) onHide() {
core.addService('expect', expectExtend) console.info('[test page log] index onHide')
core.init() },
require('../../test/List.test') }
core.execute()
},
onShow() {
console.info('[test page log] index onShow')
},
onHide() {
console.info('[test page log] index onHide')
},
}
/** /**
* Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
export default { export default {
data: { data: {
title: "router push test" title: "router push test"
}, },
onShow() { onShow() {
console.info('[test page log] routerPush onShow'); console.info('[test page log] routerPush onShow');
}, },
onHide() { onHide() {
console.info('[test page log] routerPush ohHide'); console.info('[test page log] routerPush ohHide');
}, },
} }
/** /**
* Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
export default { export default {
data: { data: {
title: "router replace test" title: "router replace test"
}, },
onShow() { onShow() {
console.info('[test page log] routerReplace onShow'); console.info('[test page log] routerReplace onShow');
}, },
onHide() { onHide() {
console.info('[test page log] routerReplace ohHide'); console.info('[test page log] routerReplace ohHide');
}, },
} }
/** /**
* Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
export default { export default {
data: { data: {
event:'', event:'',
seekingtime:'', seekingtime:'',
timeupdatetime:'', timeupdatetime:'',
seekedtime:'', seekedtime:'',
isStart: true, isStart: true,
isfullscreenchange: false, isfullscreenchange: false,
duration: '', duration: '',
}, },
preparedCallback:function(e){this.event = '视频连接成功'; this.duration = e.duration;}, preparedCallback:function(e){this.event = '视频连接成功'; this.duration = e.duration;},
startCallback:function(){this.event = '视频开始播放';}, startCallback:function(){this.event = '视频开始播放';},
pauseCallback:function(){this.event = '视频暂停播放';}, pauseCallback:function(){this.event = '视频暂停播放';},
finishCallback:function(){this.event = '视频播放结束';}, finishCallback:function(){this.event = '视频播放结束';},
errorCallback:function(){this.event = '视频播放错误';}, errorCallback:function(){this.event = '视频播放错误';},
seekingCallback:function(e){this.seekingtime = e.currenttime;}, seekingCallback:function(e){this.seekingtime = e.currenttime;},
timeupdateCallback:function(e){this.timeupdatetime = e.currenttime;}, timeupdateCallback:function(e){this.timeupdatetime = e.currenttime;},
changeStartPause: function() { changeStartPause: function() {
if(this.isStart) { if(this.isStart) {
this.$element('videoId').pause(); this.$element('videoId').pause();
this.isStart = false; this.isStart = false;
} else { } else {
this.$element('videoId').start(); this.$element('videoId').start();
this.isStart = true; this.isStart = true;
} }
}, },
changeFullScreenChange: function() {//全屏 changeFullScreenChange: function() {//全屏
if(!this.isfullscreenchange) { if(!this.isfullscreenchange) {
this.$element('videoId').requestFullscreen({ screenOrientation : 'default' }); this.$element('videoId').requestFullscreen({ screenOrientation : 'default' });
this.isfullscreenchange = true; this.isfullscreenchange = true;
} else { } else {
this.$element('videoId').exitFullscreen(); this.$element('videoId').exitFullscreen();
this.isfullscreenchange = false; this.isfullscreenchange = false;
} }
} }
} }
/* /*
* Copyright (C) 2021 Huawei Device Co., Ltd. * Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
export default {
export default { onCreate() {
onCreate() { console.info('AceApplication onCreate');
console.info('AceApplication onCreate'); },
}, onDestroy() {
onDestroy() { console.info('AceApplication onDestroy');
console.info('AceApplication onDestroy'); }
} };
};
{
"strings": {
"hello": "Hello",
"world": "World"
},
"Files": {
}
}
\ No newline at end of file
{
"strings": {
"hello": "您好",
"world": "世界"
},
"Files": {
}
}
\ No newline at end of file
.container {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
left: 0px;
top: 0px;
width: 100%;
height: 100%;
}
.title {
font-size: 60px;
text-align: center;
width: 100%;
height: 40%;
margin: 10px;
}
@media screen and (device-type: phone) and (orientation: landscape) {
.title {
font-size: 60px;
}
}
@media screen and (device-type: tablet) and (orientation: landscape) {
.title {
font-size: 100px;
}
}
\ No newline at end of file
<div class="container">
<text class="title">
{{ $t('strings.hello') }} {{ title }}
</text>
</div>
/* /*
* Copyright (C) 2022 Huawei Device Co., Ltd. * Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
require('./basicabilityapi.test.js') export default {
require('./mediaquery.test.js') data: {
require('./commonComponentJsApi.test.js') title: ""
},
onInit() {
this.title = this.$t('strings.world');
}
}
/*
* Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import AbilityDelegatorRegistry from '@ohos.application.abilityDelegatorRegistry'
function translateParamsToString(parameters) {
const keySet = new Set([
'-s class', '-s notClass', '-s suite', '-s itName',
'-s level', '-s testType', '-s size', '-s timeout',
'-s package', '-s dryRun'
])
let targetParams = '';
for (const key in parameters) {
if (keySet.has(key)) {
targetParams += ' ' + key + ' ' + parameters[key]
}
}
return targetParams.trim()
}
export default {
onPrepare() {
console.info('OpenHarmonyTestRunner OnPrepare')
},
onRun() {
console.log('OpenHarmonyTestRunner onRun run')
var abilityDelegatorArguments = AbilityDelegatorRegistry.getArguments()
var abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator()
var testAbilityName = abilityDelegatorArguments.parameters['-p'] + '.MainAbility'
var cmd = 'aa start -d 0 -a ' + testAbilityName + ' -b ' + abilityDelegatorArguments.bundleName
cmd += ' ' + translateParamsToString(abilityDelegatorArguments.parameters)
var debug = abilityDelegatorArguments.parameters["-D"]
console.info('debug value : '+debug)
if (debug == 'true')
{
cmd += ' -D'
}
console.info('cmd : '+cmd)
abilityDelegator.executeShellCommand(cmd, (err, data) => {
console.info('executeShellCommand : err : ' + JSON.stringify(err));
console.info('executeShellCommand : data : ' + data.stdResult);
console.info('executeShellCommand : data : ' + data.exitCode);
})
}
};
/*
* Copyright (C) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import basicabilityapi from './basicabilityapi.test.js'
import mediaquery_vioTest from './mediaquery.test.js'
import aceJsTest from './commonComponentJsApi.test.js'
export default function testsuite() {
basicabilityapi()
mediaquery_vioTest()
aceJsTest()
}
/* /*
* Copyright (C) 2022 Huawei Device Co., Ltd. * Copyright (C) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
import router from '@system.router'; import router from '@system.router';
import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index'; import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from '@ohos/hypium';
describe('aceJsTest', function () { export default function aceJsTest() {
describe('aceJsTest', function () {
async function sleep(time) {
return new Promise((resolve, reject) => { async function sleep(time) {
setTimeout(() => { return new Promise((resolve, reject) => {
resolve() setTimeout(() => {
}, time) resolve()
}).then(() => { }, time)
console.info(`sleep ${time} over...`) }).then(() => {
}) console.info(`sleep ${time} over...`)
} })
async function backToIndex() { }
let backToIndexPromise = new Promise((resolve, reject) => { async function backToIndex() {
setTimeout(() => { let backToIndexPromise = new Promise((resolve, reject) => {
router.back({ setTimeout(() => {
uri: 'pages/index/index' router.back({
}); uri: 'pages/index/index'
resolve(); });
}, 500); resolve();
}); }, 500);
let clearPromise = new Promise((resolve, reject) => { });
setTimeout(() => { let clearPromise = new Promise((resolve, reject) => {
router.clear(); setTimeout(() => {
resolve(); router.clear();
}, 500); resolve();
}); }, 500);
await backToIndexPromise.then(() => { });
return clearPromise; await backToIndexPromise.then(() => {
}); return clearPromise;
} });
}
/**
* run after testcase /**
*/ * run after testcase
afterEach(async function () { */
console.info('[aceJsTest] after each called') afterEach(async function () {
await backToIndex(); console.info('[aceJsTest] after each called')
await sleep(5000) await backToIndex();
}); await sleep(5000)
});
/**
* @tc.number SUB_ACE_BASIC_COMPONENT_JS_API_0100 /**
* @tc.name testVideoComponent * @tc.number SUB_ACE_BASIC_COMPONENT_JS_API_0100
* @tc.desc ACE * @tc.name testVideoComponent
*/ * @tc.desc ACE
it('testVideoComponent', 0, async function (done) { */
let result; it('testVideoComponent', 0, async function (done) {
let options = { let result;
uri: 'pages/video/router/index' let options = {
} uri: 'pages/video/router/index'
try { }
result = router.push(options) try {
console.info("push video page success " + JSON.stringify(result)); result = router.push(options)
} catch (err) { console.info("push video page success " + JSON.stringify(result));
console.error("push video page error " + JSON.stringify(result)); } catch (err) {
} console.error("push video page error " + JSON.stringify(result));
await sleep(5000) }
let pages = router.getState(); await sleep(5000)
console.info("[router.video] getState" + JSON.stringify(pages)); let pages = router.getState();
expect("pages/video/router/").assertEqual(pages.path); console.info("[router.video] getState" + JSON.stringify(pages));
done(); expect("pages/video/router/").assertEqual(pages.path);
}); done();
}); });
});
}
{ {
"string": [ "string": [
{ {
"name": "entry_MainAbility", "name": "entry_MainAbility",
"value": "entry_MainAbility" "value": "entry_MainAbility"
}, },
{ {
"name": "mainability_description", "name": "mainability_description",
"value": "JS_Empty Ability" "value": "JS_Empty Ability"
} },
] {
} "name": "MainAbility_desc",
"value": "description"
},
{
"name": "MainAbility_label",
"value": "label"
},
{
"name": "TestAbility_desc",
"value": "description"
},
{
"name": "TestAbility_label",
"value": "label"
}
]
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册