--- /dev/null
+Copyright (C) 2014 Intel Corporation. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Intel Corporation nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--- /dev/null
+jenny.q.cao@intel.com
+belem.zhang@intel.com
+cici.x.li@intel.com
+yugang.fan@intel.com
+zhiqiang.zhang@intel.com
--- /dev/null
+## Introduction
+
+This is a test suite for Tizen 3.0 Behavior, which includes:
+
+* `behavior/`: behavior test tool
+* `doc/`: see [documentaion](#Documentation) below
+* `tools/`: tools for this test suite
+
+## Documentation
+
+Check out our documents at `doc/`.
+
+For test suite and test case development, please go through the following
+documents firstly:
+
+* `doc/Behavior_Test_Tool_Developer_Guide`
+* `doc/Coding_Style_Guide_CheatSheet`
+
+## Contributing
+
+Move the Web, Write Some Tests!
+
+Absolutely everyone is welcome (and even encouraged) to contribute to test
+development and bug report. No test is too small or too simple, especially
+if it corresponds to something for which you've noted an bug in Crosswalk
+project.
+
+The way to contribute is just as usual.
+
+## License
+
+Except as noted in `COPYING` and/or `NOTICE` files, or as headed with license
+info, test suite source code uses a BSD-style license that can be found in the
+`LICENSE` file.
--- /dev/null
+{
+ "main-version": "9.37.1.5",
+ "release-version": "1"
+}
--- /dev/null
+# Behavior Test Tool Developer Guide\r
+\r
+Version 1.0\r
+\r
+Copyright © 2014 Intel Corporation. All rights reserved. No portions of this document may be reproduced without the written permission of Intel Corporation.\r
+\r
+Intel is a trademark of Intel Corporation in the U.S. and/or other countries.\r
+\r
+Linux is a registered trademark of Linus Torvalds.\r
+\r
+Tizen® is a registered trademark of The Linux Foundation.\r
+\r
+ARM is a registered trademark of ARM Holdings Plc.\r
+\r
+\*Other names and brands may be claimed as the property of others.\r
+\r
+Any software source code reprinted in this document is furnished under a software license and may only be used or copied in accordance with the terms of that license.\r
+\r
+#1. Introduction\r
+\r
+This document provides development information about Behavior Test Tool, including: Overview, UI and Source Code Structure Introduction, How to Add New Test etc.\r
+\r
+#2. Overview\r
+\r
+This document guides you as you contribute test cases to the Behavior Test Tool. The tool itself is developed using the jQuery Mobile framework, so the test case development should follow general principles of the jQuery Mobile guidelines. See [http://jquerymobile.com/](http://jquerymobile.com/). Also, to seamlessly integrate tests into the tool's framework, a test case should follow the behavior test tool's rules. Finally, the whole tool will be packaged as one widget file and will run on a target device.\r
+\r
+##2.1 User Interface\r
+\r
+The Behavior Test Tool UI is shown below:\r
+\r
+**Home UI**\r
+\r
+\r
+\r
+Figure 2‑1-1. Behavior Test Tool Home Page\r
+\r
+- Header Bar: Show behavior test tool title and version.\r
+- Test List: Show on tests components, test list and test result status. \r
+- Footer Bar: \r
+\r
+ - Export Button: Save the test result XML file to the Tizen file system. This is full path that includes both location and file name: /opt/usr/media/Documents/tct-behavior-tests\_{timestamp}.result.xml.\r
+ - Reset Button: Reset test result.\r
+ - Exit Button: Quit.\r
+\r
+**Test Case UI**\r
+\r
+\r
+\r
+Figure 2‑2-2. Behavior Test Tool Test Case Page\r
+\r
+- Header Bar: Show test case name in the title.\r
+- Main Content: test UI\r
+- Footer Bar: has 4 buttons\r
+\r
+ - **Pass**: Save "Pass" result and exit test\r
+ - **Fail**: Save "Fail" result and exit test\r
+ - **Info**: Show test description information\r
+ - **Exit**: Exit test and back to home page.\r
+\r
+##2.2 Source code structure\r
+\r
+Figure 2-2 shows the source code structure.\r
+\r
+\r
+\r
+Figure 2‑2. The source code structure\r
+\r
+Key files, folders, and images are:\r
+\r
+- **config.xml**: Behavior test tool's web app's configuration file. \r
+- **index.html**: Behavior test tool's web app's main page entry. \r
+- **icon.png**: Behavior test tool's web app's icon, should be shown on Tizen home screen. \r
+- **tests.xml**: Behavior test tool's subtest list information file.\r
+- **pack.sh**: Behavior test tool's packing shell script.\r
+- **inst.sh.apk**: The shell script for installing APK package on Android.\r
+- **inst.sh.ivi**: The shell script for installing XPK package on Tizen IVI.\r
+- **inst.sh.wgt**: The shell script for installing WGT package on Tizen Mobile.\r
+- **inst.sh.xpk**: The shell script for installing XPK package on Tizen Mobile.\r
+- **css/**: Tool's main CSS file tests: common CSS file, third party CSS files, and images folder. \r
+- **js/**: Tool's main JS file tests: common JS file and third party JS files. \r
+- **tests/**: Folder of subtests files. \r
+- **res/**: Folder of common resources. \r
+- **tests/template/**: Test developing template for case developer reference.\r
+\r
+#3 Test development\r
+\r
+##3.1 Coding Style\r
+\r
+Test case developers shall follow the following rules:\r
+\r
+- Comment each code block in a uniform way\r
+- Return a clear pass/fail result \r
+- Clean environment before exiting tests\r
+- Automate test under condition of stability \r
+- Keep test cases independent from each other \r
+- Keep case independent from UX or vertical specific applications \r
+- Avoid complicated code logic (comment it if unavoidable) \r
+- Avoid duplicated code \r
+- Remove redundant code \r
+\r
+Please refer to the `Coding_Style_Guide_CheatSheet.md` to get a quick start.\r
+\r
+You can find detailed coding style instructions for specific languages from:\r
+\r
+1) CSS & HTML: [http://google-styleguide.googlecode.com/svn/trunk/htmlcssguide.xml](http://google-styleguide.googlecode.com/svn/trunk/htmlcssguide.xml)\r
+\r
+2) JavaScript: [http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml](http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml)\r
+\r
+3) Python: [http://google-styleguide.googlecode.com/svn/trunk/pyguide.html](http://google-styleguide.googlecode.com/svn/trunk/pyguide.html)\r
+\r
+4) Shell: [http://google-styleguide.googlecode.com/svn/trunk/shell.xml](http://google-styleguide.googlecode.com/svn/trunk/shell.xml)\r
+\r
+5) XML: 'xmllint --format' with default indent 2 spaces. See [http://xmlsoft.org/xmllint.html](http://xmlsoft.org/xmllint.html)\r
+\r
+ - Test ID: Should be the same as test folder name.\r
+ - Capability: This tag will help to check the Tizen device HW capability.\r
+\r
+##3.2 Adding a test entry in the Home UI\r
+\r
+In the latest behavior tests framework, we start using tests.xml to record test information. You can add a new test case to the tests.xml file and the behavior framework will automatically load the tests.xml file to create a test list view in the main UI.\r
+\r
+The tests.xml format is just like the XML scheme of Tizen WebAPI/WRT tests. For example, the test case ID needs to be unique and the test's folder name should be the same as the test case ID. The test folder name (test ID) and the XML can have some special rules. Currently there is a rule for avoiding use of some special characters (such as space). You can use tools/schema/test\_definition.xsd to verify your tests.xml after modifications.\r
+\r
+As stated earlier, the "capability" tag be added for Tizen device HW capability checking. If a tests need capability checking, you need add a sub tag "<capability name="your_capability_name" /\>" to this "testcase" tag of tests.xml file. If a mandatory feature is not present, this tests entry of home UI will be marked as black background.\r
+\r
+##3.3 Adding test code resources to the test folder\r
+\r
+Take test "2D3DAnimation" as an example:\r
+\r
+\r
+\r
+Figure 3‑1. Test code and resources structure\r
+\r
+- Create test sub folder such as "2D3DAnimation" under "tests" folder, should be the same with test case id in tests.xml file.\r
+- **index.html**: the test main page html file.\r
+\r
+ - Test developer always need use the template tests for test developing so that you can have a unified style and can use common JS libraries.\r
+\r
+Example:\r
+\r
+ <html>\r
+ <head>\r
+ <meta charset="utf-8" />\r
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width">\r
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />\r
+ <script src="../../js/thirdparty/jquery.js"></script>\r
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>\r
+ <script src="../../js/tests.js"></script>\r
+ </head>\r
+ <body>\r
+ <div data-role="header">\r
+ <h1 id="main_page_title"></h1>\r
+ </div>\r
+ <div id="content">\r
+ Hello World !\r
+ </div>\r
+ <div data-role="footer" data-position="fixed">\r
+ </div>\r
+ <div data-role="popup" id="popup_info" data-theme="a">\r
+ <p>Test Info</p>\r
+ </div>\r
+ </body>\r
+ </html>\r
+\r
+- Test developer always need import following css and js files to you test:\r
+- Do not need add header title as test.js will add title to header automatically.\r
+- Do not need add footer bar as test.js will insert the footer for each tests page.\r
+\r
+Example:\r
+\r
+ <link rel="stylesheet" href="../../css/jquery.mobile.css" />\r
+ <script src="../../js/thirdparty/jquery.js"></script>\r
+\r
+- "../../js/tests.js" and "../../js/tests.css": Provide JS APIs and CSS style need by test footer Bar, your need import it in your test page html file always. The JS provide following APIs:\r
+\r
+ - Update header title automatically.\r
+ - Insert the footer bar automatically.\r
+ - getAppName API to return your tests APP name.\r
+ - EnablePassButton/DisablePassButton to indicate the testing process based on tests needs.\r
+\r
+- Test Info: Case developer can add the test info to the popup div in test home page.\r
+\r
+Example:\r
+\r
+ <div data-role="popup" id="popup_info">\r
+ <p>Your test description/test steps/PASS&FAIL conditions.<p\>\r
+\r
+\r
+##3.4 Updating the configuration file\r
+\r
+All test cases share one configuration file. You can update the config.xml file if needed, but please be cautious.\r
+\r
+##3.5 Packing\r
+\r
+You can use pack.sh to create your zip file.\r
--- /dev/null
+Copyright (C) 2013 Intel Corporation. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Intel Corporation nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--- /dev/null
+## Introduction
+
+Behavior Test Tool is a device behavior checker that uses jQuery.
+It has these features:
+
+* A list of behaviors you can test, with information about test cases
+* Test cases for checking and evaluating the behavior of a device
+* Automatically generated test reports you can view and save for further analysis
+
+## Authors:
+
+* Lin, Wanming <wanmingx.lin@intel.com>
+
+## LICENSE
+
+Copyright (c) 2013 Intel Corporation. All rights reserved.
+Except as noted, this software is licensed under BSD-3-Clause License.
+Please see the LICENSE file for the BSD-3-Clause License.
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<widget xmlns="http://www.w3.org/ns/widgets" xmlns:tizen="http://tizen.org/ns/widgets" id="http://tizen.org/test/tct-behavior-tests" version="3.0" viewmodes="">
+ <access origin="*"/>
+ <tizen:application id="tctbhtests.TCTBehaviorTests" package="tctbhtests" required_version="2.2"/>
+ <icon src="icon.png" height="117" width="117"/>
+ <name>tct-behavior-tests</name>
+ <tizen:privilege name="http://tizen.org/privilege/location"/>
+ <tizen:privilege name="http://tizen.org/privilege/mediacapture"/>
+ <tizen:privilege name="http://tizen.org/privilege/alarm"/>
+ <tizen:privilege name="http://tizen.org/privilege/application.launch"/>
+ <tizen:privilege name="http://tizen.org/privilege/bluetooth.admin"/>
+ <tizen:privilege name="http://tizen.org/privilege/bluetooth.gap"/>
+ <tizen:privilege name="http://tizen.org/privilege/bluetooth.spp"/>
+ <tizen:privilege name="http://tizen.org/privilege/calendar.read"/>
+ <tizen:privilege name="http://tizen.org/privilege/calendar.write"/>
+ <tizen:privilege name="http://tizen.org/privilege/callhistory.read"/>
+ <tizen:privilege name="http://tizen.org/privilege/callhistory.write"/>
+ <tizen:privilege name="http://tizen.org/privilege/contact.read"/>
+ <tizen:privilege name="http://tizen.org/privilege/contact.write"/>
+ <tizen:privilege name="http://tizen.org/privilege/content.read"/>
+ <tizen:privilege name="http://tizen.org/privilege/content.write"/>
+ <tizen:privilege name="http://tizen.org/privilege/download"/>
+ <tizen:privilege name="http://tizen.org/privilege/filesystem.read"/>
+ <tizen:privilege name="http://tizen.org/privilege/filesystem.write"/>
+ <tizen:privilege name="http://tizen.org/privilege/messaging.read"/>
+ <tizen:privilege name="http://tizen.org/privilege/messaging.write"/>
+ <tizen:privilege name="http://tizen.org/privilege/nfc.admin"/>
+ <tizen:privilege name="http://tizen.org/privilege/nfc.cardemulation"/>
+ <tizen:privilege name="http://tizen.org/privilege/nfc.common"/>
+ <tizen:privilege name="http://tizen.org/privilege/nfc.p2p"/>
+ <tizen:privilege name="http://tizen.org/privilege/nfc.tag"/>
+ <tizen:privilege name="http://tizen.org/privilege/notification"/>
+ <tizen:privilege name="http://tizen.org/privilege/power"/>
+ <tizen:privilege name="http://tizen.org/privilege/system"/>
+ <tizen:privilege name="http://tizen.org/privilege/time"/>
+ <tizen:privilege name="http://tizen.org/privilege/datasync"/>
+ <tizen:privilege name="http://tizen.org/privilege/package.info"/>
+ <tizen:privilege name="http://tizen.org/privilege/packagemanager.install"/>
+ <tizen:privilege name="http://tizen.org/privilege/setting"/>
+ <tizen:privilege name="http://tizen.org/privilege/bluetoothmanager"/>
+ <tizen:privilege name="http://tizen.org/privilege/push"/>
+ <tizen:privilege name="http://tizen.org/privilege/systemmanager"/>
+ <tizen:setting context-menu="disable" background-support="disable" encryption="disable" install-location="auto"/>
+</widget>
--- /dev/null
+Copyright (c) 2013 Intel Corporation.
+Except as noted, this software is licensed under BSD-3-Clause License.
+Please, see the LICENSE.BSD-3 file for the BSD-3-Clause License.
+
+Following resources are licensed under its own license.
+
+fail.png,
+pass.png:
+Created by the Paint application.
+The above files are licensed under Intel BSD-3-Clause License.
--- /dev/null
+Copyright (c) 2013 Intel Corporation.
+Except as noted, this software is licensed under BSD-3-Clause License.
+Please, see the LICENSE.BSD-3 file for the BSD-3-Clause License.
+
+Following resources are licensed under its own license.
+
+ajax-loader.gif,
+icons-18-black.png,
+icons-18-white.png,
+icons-36-black.png,
+icons-36-white.png:
+The above files are licensed under jQuery MIT License:
+From https://github.com/jquery/jquery-mobile/tree/1.2-stable/css/themes/default/images
+Please see the LICENSE.MIT for the MIT terms and conditions.
--- /dev/null
+/*
+* jQuery Mobile Framework Git Build: SHA1: b49cc06499abf8f987cf90f35349cfac0918c939 <> Date: Tue Oct 2 11:22:34 2012 -0700
+* http://jquerymobile.com
+*
+* Copyright 2012 jQuery Foundation and other contributors
+* Released under the MIT license.
+* http://jquery.org/license
+*
+*/
+
+
+/* Swatches */
+/* A
+-----------------------------------------------------------------------------------------------------------*/
+.ui-bar-a {
+ border: 1px solid #333 /*{a-bar-border}*/;
+ background: #111 /*{a-bar-background-color}*/;
+ color: #fff /*{a-bar-color}*/;
+ font-weight: bold;
+ text-shadow: 0 /*{a-bar-shadow-x}*/ -1px /*{a-bar-shadow-y}*/ 1px /*{a-bar-shadow-radius}*/ #000 /*{a-bar-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #3c3c3c /*{a-bar-background-start}*/), to( #111 /*{a-bar-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/);
+}
+.ui-bar-a,
+.ui-bar-a input,
+.ui-bar-a select,
+.ui-bar-a textarea,
+.ui-bar-a button {
+ font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+}
+.ui-bar-a .ui-link-inherit {
+ color: #fff /*{a-bar-color}*/;
+}
+.ui-bar-a a.ui-link {
+ color: #7cc4e7 /*{a-bar-link-color}*/;
+ font-weight: bold;
+}
+.ui-bar-a a.ui-link:visited {
+ color: #2489ce /*{a-bar-link-visited}*/;
+}
+.ui-bar-a a.ui-link:hover {
+ color: #2489ce /*{a-bar-link-hover}*/;
+}
+.ui-bar-a a.ui-link:active {
+ color: #2489ce /*{a-bar-link-active}*/;
+}
+.ui-body-a,
+.ui-overlay-a {
+ border: 1px solid #444 /*{a-body-border}*/;
+ background: #222 /*{a-body-background-color}*/;
+ color: #fff /*{a-body-color}*/;
+ text-shadow: 0 /*{a-body-shadow-x}*/ 1px /*{a-body-shadow-y}*/ 1px /*{a-body-shadow-radius}*/ #111 /*{a-body-shadow-color}*/;
+ font-weight: normal;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #444 /*{a-body-background-start}*/), to( #222 /*{a-body-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #444 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #444 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #444 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #444 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #444 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/);
+}
+.ui-overlay-a {
+ background-image: none;
+ border-width: 0;
+}
+.ui-body-a,
+.ui-body-a input,
+.ui-body-a select,
+.ui-body-a textarea,
+.ui-body-a button {
+ font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+}
+.ui-body-a .ui-link-inherit {
+ color: #fff /*{a-body-color}*/;
+}
+.ui-body-a .ui-link {
+ color: #2489ce /*{a-body-link-color}*/;
+ font-weight: bold;
+}
+.ui-body-a .ui-link:visited {
+ color: #2489ce /*{a-body-link-visited}*/;
+}
+.ui-body-a .ui-link:hover {
+ color: #2489ce /*{a-body-link-hover}*/;
+}
+.ui-body-a .ui-link:active {
+ color: #2489ce /*{a-body-link-active}*/;
+}
+.ui-btn-up-a {
+ border: 1px solid #111 /*{a-bup-border}*/;
+ background: #333 /*{a-bup-background-color}*/;
+ font-weight: bold;
+ color: #fff /*{a-bup-color}*/;
+ text-shadow: 0 /*{a-bup-shadow-x}*/ 1px /*{a-bup-shadow-y}*/ 1px /*{a-bup-shadow-radius}*/ #111 /*{a-bup-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #444 /*{a-bup-background-start}*/), to( #2d2d2d /*{a-bup-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #444 /*{a-bup-background-start}*/, #2d2d2d /*{a-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #444 /*{a-bup-background-start}*/, #2d2d2d /*{a-bup-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #444 /*{a-bup-background-start}*/, #2d2d2d /*{a-bup-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #444 /*{a-bup-background-start}*/, #2d2d2d /*{a-bup-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #444 /*{a-bup-background-start}*/, #2d2d2d /*{a-bup-background-end}*/);
+}
+.ui-btn-up-a:visited,
+.ui-btn-up-a a.ui-link-inherit {
+ color: #fff /*{a-bup-color}*/;
+}
+.ui-btn-hover-a {
+ border: 1px solid #000 /*{a-bhover-border}*/;
+ background: #444 /*{a-bhover-background-color}*/;
+ font-weight: bold;
+ color: #fff /*{a-bhover-color}*/;
+ text-shadow: 0 /*{a-bhover-shadow-x}*/ 1px /*{a-bhover-shadow-y}*/ 1px /*{a-bhover-shadow-radius}*/ #111 /*{a-bhover-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #555 /*{a-bhover-background-start}*/), to( #383838 /*{a-bhover-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #555 /*{a-bhover-background-start}*/, #383838 /*{a-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #555 /*{a-bhover-background-start}*/, #383838 /*{a-bhover-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #555 /*{a-bhover-background-start}*/, #383838 /*{a-bhover-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #555 /*{a-bhover-background-start}*/, #383838 /*{a-bhover-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #555 /*{a-bhover-background-start}*/, #383838 /*{a-bhover-background-end}*/);
+}
+.ui-btn-hover-a:visited,
+.ui-btn-hover-a:hover,
+.ui-btn-hover-a a.ui-link-inherit {
+ color: #fff /*{a-bhover-color}*/;
+}
+.ui-btn-down-a {
+ border: 1px solid #000 /*{a-bdown-border}*/;
+ background: #222 /*{a-bdown-background-color}*/;
+ font-weight: bold;
+ color: #fff /*{a-bdown-color}*/;
+ text-shadow: 0 /*{a-bdown-shadow-x}*/ 1px /*{a-bdown-shadow-y}*/ 1px /*{a-bdown-shadow-radius}*/ #111 /*{a-bdown-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #202020 /*{a-bdown-background-start}*/), to( #2c2c2c /*{a-bdown-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #202020 /*{a-bdown-background-start}*/, #2c2c2c /*{a-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #202020 /*{a-bdown-background-start}*/, #2c2c2c /*{a-bdown-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #202020 /*{a-bdown-background-start}*/, #2c2c2c /*{a-bdown-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #202020 /*{a-bdown-background-start}*/, #2c2c2c /*{a-bdown-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #202020 /*{a-bdown-background-start}*/, #2c2c2c /*{a-bdown-background-end}*/);
+}
+.ui-btn-down-a:visited,
+.ui-btn-down-a:hover,
+.ui-btn-down-a a.ui-link-inherit {
+ color: #fff /*{a-bdown-color}*/;
+}
+.ui-btn-up-a,
+.ui-btn-hover-a,
+.ui-btn-down-a {
+ font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+ text-decoration: none;
+}
+/* B
+-----------------------------------------------------------------------------------------------------------*/
+.ui-bar-b {
+ border: 1px solid #456f9a /*{b-bar-border}*/;
+ background: #5e87b0 /*{b-bar-background-color}*/;
+ color: #fff /*{b-bar-color}*/;
+ font-weight: bold;
+ text-shadow: 0 /*{b-bar-shadow-x}*/ 1px /*{b-bar-shadow-y}*/ 1px /*{b-bar-shadow-radius}*/ #3e6790 /*{b-bar-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #6facd5 /*{b-bar-background-start}*/), to( #497bae /*{b-bar-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #6facd5 /*{b-bar-background-start}*/, #497bae /*{b-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #6facd5 /*{b-bar-background-start}*/, #497bae /*{b-bar-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #6facd5 /*{b-bar-background-start}*/, #497bae /*{b-bar-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #6facd5 /*{b-bar-background-start}*/, #497bae /*{b-bar-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #6facd5 /*{b-bar-background-start}*/, #497bae /*{b-bar-background-end}*/);
+}
+.ui-bar-b,
+.ui-bar-b input,
+.ui-bar-b select,
+.ui-bar-b textarea,
+.ui-bar-b button {
+ font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+}
+.ui-bar-b .ui-link-inherit {
+ color: #fff /*{b-bar-color}*/;
+}
+.ui-bar-b a.ui-link {
+ color: #ddf0f8 /*{b-bar-link-color}*/;
+ font-weight: bold;
+}
+.ui-bar-b a.ui-link:visited {
+ color: #ddf0f8 /*{b-bar-link-visited}*/;
+}
+.ui-bar-b a.ui-link:hover {
+ color: #ddf0f8 /*{b-bar-link-hover}*/;
+}
+.ui-bar-b a.ui-link:active {
+ color: #ddf0f8 /*{b-bar-link-active}*/;
+}
+.ui-body-b,
+.ui-overlay-b {
+ border: 1px solid #999 /*{b-body-border}*/;
+ background: #f3f3f3 /*{b-body-background-color}*/;
+ color: #222 /*{b-body-color}*/;
+ text-shadow: 0 /*{b-body-shadow-x}*/ 1px /*{b-body-shadow-y}*/ 0 /*{b-body-shadow-radius}*/ #fff /*{b-body-shadow-color}*/;
+ font-weight: normal;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #ddd /*{b-body-background-start}*/), to( #ccc /*{b-body-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #ddd /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #ddd /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #ddd /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #ddd /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #ddd /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/);
+}
+.ui-overlay-b {
+ background-image: none;
+ border-width: 0;
+}
+.ui-body-b,
+.ui-body-b input,
+.ui-body-b select,
+.ui-body-b textarea,
+.ui-body-b button {
+ font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+}
+.ui-body-b .ui-link-inherit {
+ color: #333 /*{b-body-color}*/;
+}
+.ui-body-b .ui-link {
+ color: #2489ce /*{b-body-link-color}*/;
+ font-weight: bold;
+}
+.ui-body-b .ui-link:visited {
+ color: #2489ce /*{b-body-link-visited}*/;
+}
+.ui-body-b .ui-link:hover {
+ color: #2489ce /*{b-body-link-hover}*/;
+}
+.ui-body-b .ui-link:active {
+ color: #2489ce /*{b-body-link-active}*/;
+}
+.ui-btn-up-b {
+ border: 1px solid #044062 /*{b-bup-border}*/;
+ background: #396b9e /*{b-bup-background-color}*/;
+ font-weight: bold;
+ color: #fff /*{b-bup-color}*/;
+ text-shadow: 0 /*{b-bup-shadow-x}*/ 1px /*{b-bup-shadow-y}*/ 1px /*{b-bup-shadow-radius}*/ #194b7e /*{b-bup-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #5f9cc5 /*{b-bup-background-start}*/), to( #396b9e /*{b-bup-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/);
+}
+.ui-btn-up-b:visited,
+.ui-btn-up-b a.ui-link-inherit {
+ color: #fff /*{b-bup-color}*/;
+}
+.ui-btn-hover-b {
+ border: 1px solid #00415e /*{b-bhover-border}*/;
+ background: #4b88b6 /*{b-bhover-background-color}*/;
+ font-weight: bold;
+ color: #fff /*{b-bhover-color}*/;
+ text-shadow: 0 /*{b-bhover-shadow-x}*/ 1px /*{b-bhover-shadow-y}*/ 1px /*{b-bhover-shadow-radius}*/ #194b7e /*{b-bhover-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #6facd5 /*{b-bhover-background-start}*/), to( #4272a4 /*{b-bhover-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #6facd5 /*{b-bhover-background-start}*/, #4272a4 /*{b-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #6facd5 /*{b-bhover-background-start}*/, #4272a4 /*{b-bhover-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #6facd5 /*{b-bhover-background-start}*/, #4272a4 /*{b-bhover-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #6facd5 /*{b-bhover-background-start}*/, #4272a4 /*{b-bhover-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #6facd5 /*{b-bhover-background-start}*/, #4272a4 /*{b-bhover-background-end}*/);
+}
+.ui-btn-hover-b:visited,
+.ui-btn-hover-b:hover,
+.ui-btn-hover-b a.ui-link-inherit {
+ color: #fff /*{b-bhover-color}*/;
+}
+.ui-btn-down-b {
+ border: 1px solid #225377 /*{b-bdown-border}*/;
+ background: #4e89c5 /*{b-bdown-background-color}*/;
+ font-weight: bold;
+ color: #fff /*{b-bdown-color}*/;
+ text-shadow: 0 /*{b-bdown-shadow-x}*/ 1px /*{b-bdown-shadow-y}*/ 1px /*{b-bdown-shadow-radius}*/ #194b7e /*{b-bdown-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #295b8e /*{b-bdown-background-start}*/), to( #3e79b5 /*{b-bdown-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #295b8e /*{b-bdown-background-start}*/, #3e79b5 /*{b-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #295b8e /*{b-bdown-background-start}*/, #3e79b5 /*{b-bdown-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #295b8e /*{b-bdown-background-start}*/, #3e79b5 /*{b-bdown-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #295b8e /*{b-bdown-background-start}*/, #3e79b5 /*{b-bdown-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #295b8e /*{b-bdown-background-start}*/, #3e79b5 /*{b-bdown-background-end}*/);
+}
+.ui-btn-down-b:visited,
+.ui-btn-down-b:hover,
+.ui-btn-down-b a.ui-link-inherit {
+ color: #fff /*{b-bdown-color}*/;
+}
+.ui-btn-up-b,
+.ui-btn-hover-b,
+.ui-btn-down-b {
+ font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+ text-decoration: none;
+}
+/* C
+-----------------------------------------------------------------------------------------------------------*/
+.ui-bar-c {
+ border: 1px solid #b3b3b3 /*{c-bar-border}*/;
+ background: #eee /*{c-bar-background-color}*/;
+ color: #3e3e3e /*{c-bar-color}*/;
+ font-weight: bold;
+ text-shadow: 0 /*{c-bar-shadow-x}*/ 1px /*{c-bar-shadow-y}*/ 1px /*{c-bar-shadow-radius}*/ #fff /*{c-bar-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #f0f0f0 /*{c-bar-background-start}*/), to( #ddd /*{c-bar-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #f0f0f0 /*{c-bar-background-start}*/, #ddd /*{c-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #f0f0f0 /*{c-bar-background-start}*/, #ddd /*{c-bar-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #f0f0f0 /*{c-bar-background-start}*/, #ddd /*{c-bar-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #f0f0f0 /*{c-bar-background-start}*/, #ddd /*{c-bar-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #f0f0f0 /*{c-bar-background-start}*/, #ddd /*{c-bar-background-end}*/);
+}
+.ui-bar-c .ui-link-inherit {
+ color: #3e3e3e /*{c-bar-color}*/;
+}
+.ui-bar-c a.ui-link {
+ color: #7cc4e7 /*{c-bar-link-color}*/;
+ font-weight: bold;
+}
+.ui-bar-c a.ui-link:visited {
+ color: #2489ce /*{c-bar-link-visited}*/;
+}
+.ui-bar-c a.ui-link:hover {
+ color: #2489ce /*{c-bar-link-hover}*/;
+}
+.ui-bar-c a.ui-link:active {
+ color: #2489ce /*{c-bar-link-active}*/;
+}
+.ui-bar-c,
+.ui-bar-c input,
+.ui-bar-c select,
+.ui-bar-c textarea,
+.ui-bar-c button {
+ font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+}
+.ui-body-c,
+.ui-overlay-c {
+ border: 1px solid #aaa /*{c-body-border}*/;
+ color: #333 /*{c-body-color}*/;
+ text-shadow: 0 /*{c-body-shadow-x}*/ 1px /*{c-body-shadow-y}*/ 0 /*{c-body-shadow-radius}*/ #fff /*{c-body-shadow-color}*/;
+ background: #f9f9f9 /*{c-body-background-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #f9f9f9 /*{c-body-background-start}*/), to( #eee /*{c-body-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #f9f9f9 /*{c-body-background-start}*/, #eee /*{c-body-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #f9f9f9 /*{c-body-background-start}*/, #eee /*{c-body-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #f9f9f9 /*{c-body-background-start}*/, #eee /*{c-body-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #f9f9f9 /*{c-body-background-start}*/, #eee /*{c-body-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #f9f9f9 /*{c-body-background-start}*/, #eee /*{c-body-background-end}*/);
+}
+.ui-overlay-c {
+ background-image: none;
+ border-width: 0;
+}
+.ui-body-c,
+.ui-body-c input,
+.ui-body-c select,
+.ui-body-c textarea,
+.ui-body-c button {
+ font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+}
+.ui-body-c .ui-link-inherit {
+ color: #333 /*{c-body-color}*/;
+}
+.ui-body-c .ui-link {
+ color: #2489ce /*{c-body-link-color}*/;
+ font-weight: bold;
+}
+.ui-body-c .ui-link:visited {
+ color: #2489ce /*{c-body-link-visited}*/;
+}
+.ui-body-c .ui-link:hover {
+ color: #2489ce /*{c-body-link-hover}*/;
+}
+.ui-body-c .ui-link:active {
+ color: #2489ce /*{c-body-link-active}*/;
+}
+.ui-btn-up-c {
+ border: 1px solid #ccc /*{c-bup-border}*/;
+ background: #eee /*{c-bup-background-color}*/;
+ font-weight: bold;
+ color: #222 /*{c-bup-color}*/;
+ text-shadow: 0 /*{c-bup-shadow-x}*/ 1px /*{c-bup-shadow-y}*/ 0 /*{c-bup-shadow-radius}*/ #fff /*{c-bup-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #fff /*{c-bup-background-start}*/), to( #f1f1f1 /*{c-bup-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #fff /*{c-bup-background-start}*/, #f1f1f1 /*{c-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #fff /*{c-bup-background-start}*/, #f1f1f1 /*{c-bup-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #fff /*{c-bup-background-start}*/, #f1f1f1 /*{c-bup-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #fff /*{c-bup-background-start}*/, #f1f1f1 /*{c-bup-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #fff /*{c-bup-background-start}*/, #f1f1f1 /*{c-bup-background-end}*/);
+}
+.ui-btn-up-c:visited,
+.ui-btn-up-c a.ui-link-inherit {
+ color: #2f3e46 /*{c-bup-color}*/;
+}
+.ui-btn-hover-c {
+ border: 1px solid #bbb /*{c-bhover-border}*/;
+ background: #dfdfdf /*{c-bhover-background-color}*/;
+ font-weight: bold;
+ color: #222 /*{c-bhover-color}*/;
+ text-shadow: 0 /*{c-bhover-shadow-x}*/ 1px /*{c-bhover-shadow-y}*/ 0 /*{c-bhover-shadow-radius}*/ #fff /*{c-bhover-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #f6f6f6 /*{c-bhover-background-start}*/), to( #e0e0e0 /*{c-bhover-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #f6f6f6 /*{c-bhover-background-start}*/, #e0e0e0 /*{c-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #f6f6f6 /*{c-bhover-background-start}*/, #e0e0e0 /*{c-bhover-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #f6f6f6 /*{c-bhover-background-start}*/, #e0e0e0 /*{c-bhover-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #f6f6f6 /*{c-bhover-background-start}*/, #e0e0e0 /*{c-bhover-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #f6f6f6 /*{c-bhover-background-start}*/, #e0e0e0 /*{c-bhover-background-end}*/);
+}
+.ui-btn-hover-c:visited,
+.ui-btn-hover-c:hover,
+.ui-btn-hover-c a.ui-link-inherit {
+ color: #2f3e46 /*{c-bhover-color}*/;
+}
+.ui-btn-down-c {
+ border: 1px solid #bbb /*{c-bdown-border}*/;
+ background: #d6d6d6 /*{c-bdown-background-color}*/;
+ font-weight: bold;
+ color: #222 /*{c-bdown-color}*/;
+ text-shadow: 0 /*{c-bdown-shadow-x}*/ 1px /*{c-bdown-shadow-y}*/ 0 /*{c-bdown-shadow-radius}*/ #fff /*{c-bdown-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #d0d0d0 /*{c-bdown-background-start}*/), to( #dfdfdf /*{c-bdown-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #d0d0d0 /*{c-bdown-background-start}*/, #dfdfdf /*{c-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #d0d0d0 /*{c-bdown-background-start}*/, #dfdfdf /*{c-bdown-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #d0d0d0 /*{c-bdown-background-start}*/, #dfdfdf /*{c-bdown-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #d0d0d0 /*{c-bdown-background-start}*/, #dfdfdf /*{c-bdown-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #d0d0d0 /*{c-bdown-background-start}*/, #dfdfdf /*{c-bdown-background-end}*/);
+}
+.ui-btn-down-c:visited,
+.ui-btn-down-c:hover,
+.ui-btn-down-c a.ui-link-inherit {
+ color: #2f3e46 /*{c-bdown-color}*/;
+}
+.ui-btn-up-c,
+.ui-btn-hover-c,
+.ui-btn-down-c {
+ font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+ text-decoration: none;
+}
+/* D
+-----------------------------------------------------------------------------------------------------------*/
+.ui-bar-d {
+ border: 1px solid #bbb /*{d-bar-border}*/;
+ background: #bbb /*{d-bar-background-color}*/;
+ color: #333 /*{d-bar-color}*/;
+ font-weight: bold;
+ text-shadow: 0 /*{d-bar-shadow-x}*/ 1px /*{d-bar-shadow-y}*/ 0 /*{d-bar-shadow-radius}*/ #eee /*{d-bar-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #ddd /*{d-bar-background-start}*/), to( #bbb /*{d-bar-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/);
+}
+.ui-bar-d,
+.ui-bar-d input,
+.ui-bar-d select,
+.ui-bar-d textarea,
+.ui-bar-d button {
+ font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+}
+.ui-bar-d .ui-link-inherit {
+ color: #333 /*{d-bar-color}*/;
+}
+.ui-bar-d a.ui-link {
+ color: #2489ce /*{d-bar-link-color}*/;
+ font-weight: bold;
+}
+.ui-bar-d a.ui-link:visited {
+ color: #2489ce /*{d-bar-link-visited}*/;
+}
+.ui-bar-d a.ui-link:hover {
+ color: #2489ce /*{d-bar-link-hover}*/;
+}
+.ui-bar-d a.ui-link:active {
+ color: #2489ce /*{d-bar-link-active}*/;
+}
+.ui-body-d,
+.ui-overlay-d {
+ border: 1px solid #bbb /*{d-body-border}*/;
+ color: #333 /*{d-body-color}*/;
+ text-shadow: 0 /*{d-body-shadow-x}*/ 1px /*{d-body-shadow-y}*/ 0 /*{d-body-shadow-radius}*/ #fff /*{d-body-shadow-color}*/;
+ background: #fff /*{d-body-background-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #fff /*{d-body-background-start}*/), to( #fff /*{d-body-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/);
+}
+.ui-overlay-d {
+ background-image: none;
+ border-width: 0;
+}
+.ui-body-d,
+.ui-body-d input,
+.ui-body-d select,
+.ui-body-d textarea,
+.ui-body-d button {
+ font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+}
+.ui-body-d .ui-link-inherit {
+ color: #333 /*{d-body-color}*/;
+}
+.ui-body-d .ui-link {
+ color: #2489ce /*{d-body-link-color}*/;
+ font-weight: bold;
+}
+.ui-body-d .ui-link:visited {
+ color: #2489ce /*{d-body-link-visited}*/;
+}
+.ui-body-d .ui-link:hover {
+ color: #2489ce /*{d-body-link-hover}*/;
+}
+.ui-body-d .ui-link:active {
+ color: #2489ce /*{d-body-link-active}*/;
+}
+.ui-btn-up-d {
+ border: 1px solid #bbb /*{d-bup-border}*/;
+ background: #fff /*{d-bup-background-color}*/;
+ font-weight: bold;
+ color: #333 /*{d-bup-color}*/;
+ text-shadow: 0 /*{d-bup-shadow-x}*/ 1px /*{d-bup-shadow-y}*/ 0 /*{d-bup-shadow-radius}*/ #fff /*{d-bup-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #fafafa /*{d-bup-background-start}*/), to( #f6f6f6 /*{d-bup-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #fafafa /*{d-bup-background-start}*/, #f6f6f6 /*{d-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #fafafa /*{d-bup-background-start}*/, #f6f6f6 /*{d-bup-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #fafafa /*{d-bup-background-start}*/, #f6f6f6 /*{d-bup-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #fafafa /*{d-bup-background-start}*/, #f6f6f6 /*{d-bup-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #fafafa /*{d-bup-background-start}*/, #f6f6f6 /*{d-bup-background-end}*/);
+}
+.ui-btn-up-d:visited,
+.ui-btn-up-d a.ui-link-inherit {
+ color: #333 /*{d-bup-color}*/;
+}
+.ui-btn-hover-d {
+ border: 1px solid #aaa /*{d-bhover-border}*/;
+ background: #eee /*{d-bhover-background-color}*/;
+ font-weight: bold;
+ color: #333 /*{d-bhover-color}*/;
+ cursor: pointer;
+ text-shadow: 0 /*{d-bhover-shadow-x}*/ 1px /*{d-bhover-shadow-y}*/ 0 /*{d-bhover-shadow-radius}*/ #fff /*{d-bhover-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #eee /*{d-bhover-background-start}*/), to( #fff /*{d-bhover-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #eee /*{d-bhover-background-start}*/, #fff /*{d-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #eee /*{d-bhover-background-start}*/, #fff /*{d-bhover-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #eee /*{d-bhover-background-start}*/, #fff /*{d-bhover-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #eee /*{d-bhover-background-start}*/, #fff /*{d-bhover-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #eee /*{d-bhover-background-start}*/, #fff /*{d-bhover-background-end}*/);
+}
+.ui-btn-hover-d:visited,
+.ui-btn-hover-d:hover,
+.ui-btn-hover-d a.ui-link-inherit {
+ color: #333 /*{d-bhover-color}*/;
+}
+.ui-btn-down-d {
+ border: 1px solid #aaa /*{d-bdown-border}*/;
+ background: #eee /*{d-bdown-background-color}*/;
+ font-weight: bold;
+ color: #333 /*{d-bdown-color}*/;
+ text-shadow: 0 /*{d-bdown-shadow-x}*/ 1px /*{d-bdown-shadow-y}*/ 0 /*{d-bdown-shadow-radius}*/ #fff /*{d-bdown-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #e5e5e5 /*{d-bdown-background-start}*/), to( #f2f2f2 /*{d-bdown-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #e5e5e5 /*{d-bdown-background-start}*/, #f2f2f2 /*{d-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #e5e5e5 /*{d-bdown-background-start}*/, #f2f2f2 /*{d-bdown-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #e5e5e5 /*{d-bdown-background-start}*/, #f2f2f2 /*{d-bdown-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #e5e5e5 /*{d-bdown-background-start}*/, #f2f2f2 /*{d-bdown-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #e5e5e5 /*{d-bdown-background-start}*/, #f2f2f2 /*{d-bdown-background-end}*/);
+}
+.ui-btn-down-d:visited,
+.ui-btn-down-d:hover,
+.ui-btn-down-d a.ui-link-inherit {
+ color: #333 /*{d-bdown-color}*/;
+}
+.ui-btn-up-d,
+.ui-btn-hover-d,
+.ui-btn-down-d {
+ font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+ text-decoration: none;
+}
+/* E
+-----------------------------------------------------------------------------------------------------------*/
+.ui-bar-e {
+ border: 1px solid #f7c942 /*{e-bar-border}*/;
+ background: #fadb4e /*{e-bar-background-color}*/;
+ color: #333 /*{e-bar-color}*/;
+ font-weight: bold;
+ text-shadow: 0 /*{e-bar-shadow-x}*/ 1px /*{e-bar-shadow-y}*/ 0 /*{e-bar-shadow-radius}*/ #fff /*{e-bar-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #fceda7 /*{e-bar-background-start}*/), to( #fbef7e /*{e-bar-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #fceda7 /*{e-bar-background-start}*/, #fbef7e /*{e-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #fceda7 /*{e-bar-background-start}*/, #fbef7e /*{e-bar-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #fceda7 /*{e-bar-background-start}*/, #fbef7e /*{e-bar-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #fceda7 /*{e-bar-background-start}*/, #fbef7e /*{e-bar-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #fceda7 /*{e-bar-background-start}*/, #fbef7e /*{e-bar-background-end}*/);
+}
+.ui-bar-e,
+.ui-bar-e input,
+.ui-bar-e select,
+.ui-bar-e textarea,
+.ui-bar-e button {
+ font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+}
+.ui-bar-e .ui-link-inherit {
+ color: #333 /*{e-bar-color}*/;
+}
+.ui-bar-e a.ui-link {
+ color: #2489ce /*{e-bar-link-color}*/;
+ font-weight: bold;
+}
+.ui-bar-e a.ui-link:visited {
+ color: #2489ce /*{e-bar-link-visited}*/;
+}
+.ui-bar-e a.ui-link:hover {
+ color: #2489ce /*{e-bar-link-hover}*/;
+}
+.ui-bar-e a.ui-link:active {
+ color: #2489ce /*{e-bar-link-active}*/;
+}
+.ui-body-e,
+.ui-overlay-e {
+ border: 1px solid #f7c942 /*{e-body-border}*/;
+ color: #222 /*{e-body-color}*/;
+ text-shadow: 0 /*{e-body-shadow-x}*/ 1px /*{e-body-shadow-y}*/ 0 /*{e-body-shadow-radius}*/ #fff /*{e-body-shadow-color}*/;
+ background: #fff9df /*{e-body-background-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #fffadf /*{e-body-background-start}*/), to( #fff3a5 /*{e-body-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #fffadf /*{e-body-background-start}*/, #fff3a5 /*{e-body-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #fffadf /*{e-body-background-start}*/, #fff3a5 /*{e-body-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #fffadf /*{e-body-background-start}*/, #fff3a5 /*{e-body-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #fffadf /*{e-body-background-start}*/, #fff3a5 /*{e-body-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #fffadf /*{e-body-background-start}*/, #fff3a5 /*{e-body-background-end}*/);
+}
+.ui-overlay-e {
+ background-image: none;
+ border-width: 0;
+}
+.ui-body-e,
+.ui-body-e input,
+.ui-body-e select,
+.ui-body-e textarea,
+.ui-body-e button {
+ font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+}
+.ui-body-e .ui-link-inherit {
+ color: #222 /*{e-body-color}*/;
+}
+.ui-body-e .ui-link {
+ color: #2489ce /*{e-body-link-color}*/;
+ font-weight: bold;
+}
+.ui-body-e .ui-link:visited {
+ color: #2489ce /*{e-body-link-visited}*/;
+}
+.ui-body-e .ui-link:hover {
+ color: #2489ce /*{e-body-link-hover}*/;
+}
+.ui-body-e .ui-link:active {
+ color: #2489ce /*{e-body-link-active}*/;
+}
+.ui-btn-up-e {
+ border: 1px solid #f4c63f /*{e-bup-border}*/;
+ background: #fadb4e /*{e-bup-background-color}*/;
+ font-weight: bold;
+ color: #222 /*{e-bup-color}*/;
+ text-shadow: 0 /*{e-bup-shadow-x}*/ 1px /*{e-bup-shadow-y}*/ 0 /*{e-bup-shadow-radius}*/ #fff /*{e-bup-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #ffefaa /*{e-bup-background-start}*/), to( #ffe155 /*{e-bup-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #ffefaa /*{e-bup-background-start}*/, #ffe155 /*{e-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #ffefaa /*{e-bup-background-start}*/, #ffe155 /*{e-bup-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #ffefaa /*{e-bup-background-start}*/, #ffe155 /*{e-bup-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #ffefaa /*{e-bup-background-start}*/, #ffe155 /*{e-bup-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #ffefaa /*{e-bup-background-start}*/, #ffe155 /*{e-bup-background-end}*/);
+}
+.ui-btn-up-e:visited,
+.ui-btn-up-e a.ui-link-inherit {
+ color: #222 /*{e-bup-color}*/;
+}
+.ui-btn-hover-e {
+ border: 1px solid #f2c43d /*{e-bhover-border}*/;
+ background: #fbe26f /*{e-bhover-background-color}*/;
+ font-weight: bold;
+ color: #111 /*{e-bhover-color}*/;
+ text-shadow: 0 /*{e-bhover-shadow-x}*/ 1px /*{e-bhover-shadow-y}*/ 0 /*{e-bhover-shadow-radius}*/ #fff /*{e-bhover-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #fff5ba /*{e-bhover-background-start}*/), to( #fbdd52 /*{e-bhover-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #fff5ba /*{e-bhover-background-start}*/, #fbdd52 /*{e-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #fff5ba /*{e-bhover-background-start}*/, #fbdd52 /*{e-bhover-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #fff5ba /*{e-bhover-background-start}*/, #fbdd52 /*{e-bhover-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #fff5ba /*{e-bhover-background-start}*/, #fbdd52 /*{e-bhover-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #fff5ba /*{e-bhover-background-start}*/, #fbdd52 /*{e-bhover-background-end}*/);
+}
+.ui-btn-hover-e:visited,
+.ui-btn-hover-e:hover,
+.ui-btn-hover-e a.ui-link-inherit {
+ color: #333 /*{e-bhover-color}*/;
+}
+.ui-btn-down-e {
+ border: 1px solid #f2c43d /*{e-bdown-border}*/;
+ background: #fceda7 /*{e-bdown-background-color}*/;
+ font-weight: bold;
+ color: #111 /*{e-bdown-color}*/;
+ text-shadow: 0 /*{e-bdown-shadow-x}*/ 1px /*{e-bdown-shadow-y}*/ 0 /*{e-bdown-shadow-radius}*/ #fff /*{e-bdown-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #f8d94c /*{e-bdown-background-start}*/), to( #fadb4e /*{e-bdown-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #f8d94c /*{e-bdown-background-start}*/, #fadb4e /*{e-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #f8d94c /*{e-bdown-background-start}*/, #fadb4e /*{e-bdown-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #f8d94c /*{e-bdown-background-start}*/, #fadb4e /*{e-bdown-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #f8d94c /*{e-bdown-background-start}*/, #fadb4e /*{e-bdown-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #f8d94c /*{e-bdown-background-start}*/, #fadb4e /*{e-bdown-background-end}*/);
+}
+.ui-btn-down-e:visited,
+.ui-btn-down-e:hover,
+.ui-btn-down-e a.ui-link-inherit {
+ color: #333 /*{e-bdown-color}*/;
+}
+.ui-btn-up-e,
+.ui-btn-hover-e,
+.ui-btn-down-e {
+ font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+ text-decoration: none;
+}
+
+/* r
+-----------------------------------------------------------------------------------------------------------*/
+.ui-bar-r {
+ border: 1px solid #f7c942 /*{e-bar-border}*/;
+ background: #fadb4e /*{e-bar-background-color}*/;
+ color: #333 /*{e-bar-color}*/;
+ font-weight: bold;
+ text-shadow: 0 /*{e-bar-shadow-x}*/ 1px /*{e-bar-shadow-y}*/ 0 /*{e-bar-shadow-radius}*/ #fff /*{e-bar-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #fceda7 /*{e-bar-background-start}*/), to( #fbef7e /*{e-bar-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #fceda7 /*{e-bar-background-start}*/, #fbef7e /*{e-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #fceda7 /*{e-bar-background-start}*/, #fbef7e /*{e-bar-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #fceda7 /*{e-bar-background-start}*/, #fbef7e /*{e-bar-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #fceda7 /*{e-bar-background-start}*/, #fbef7e /*{e-bar-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #fceda7 /*{e-bar-background-start}*/, #fbef7e /*{e-bar-background-end}*/);
+}
+.ui-bar-r,
+.ui-bar-r input,
+.ui-bar-r select,
+.ui-bar-r textarea,
+.ui-bar-r button {
+ font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+}
+.ui-bar-r .ui-link-inherit {
+ color: #333 /*{e-bar-color}*/;
+}
+.ui-bar-r a.ui-link {
+ color: #2489ce /*{e-bar-link-color}*/;
+ font-weight: bold;
+}
+.ui-bar-r a.ui-link:visited {
+ color: #2489ce /*{e-bar-link-visited}*/;
+}
+.ui-bar-r a.ui-link:hover {
+ color: #2489ce /*{e-bar-link-hover}*/;
+}
+.ui-bar-r a.ui-link:active {
+ color: #2489ce /*{e-bar-link-active}*/;
+}
+.ui-body-r,
+.ui-overlay-r {
+ border: 1px solid #f7c942 /*{e-body-border}*/;
+ color: #222 /*{e-body-color}*/;
+ text-shadow: 0 /*{e-body-shadow-x}*/ 1px /*{e-body-shadow-y}*/ 0 /*{e-body-shadow-radius}*/ #fff /*{e-body-shadow-color}*/;
+ background: #fff9df /*{e-body-background-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #fffadf /*{e-body-background-start}*/), to( #fff3a5 /*{e-body-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #fffadf /*{e-body-background-start}*/, #fff3a5 /*{e-body-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #fffadf /*{e-body-background-start}*/, #fff3a5 /*{e-body-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #fffadf /*{e-body-background-start}*/, #fff3a5 /*{e-body-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #fffadf /*{e-body-background-start}*/, #fff3a5 /*{e-body-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #fffadf /*{e-body-background-start}*/, #fff3a5 /*{e-body-background-end}*/);
+}
+.ui-overlay-r {
+ background-image: none;
+ border-width: 0;
+}
+.ui-body-r,
+.ui-body-r input,
+.ui-body-r select,
+.ui-body-r textarea,
+.ui-body-r button {
+ font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+}
+.ui-body-r .ui-link-inherit {
+ color: #222 /*{e-body-color}*/;
+}
+.ui-body-r .ui-link {
+ color: #2489ce /*{e-body-link-color}*/;
+ font-weight: bold;
+}
+.ui-body-r .ui-link:visited {
+ color: #2489ce /*{e-body-link-visited}*/;
+}
+.ui-body-r .ui-link:hover {
+ color: #2489ce /*{e-body-link-hover}*/;
+}
+.ui-body-r .ui-link:active {
+ color: #2489ce /*{e-body-link-active}*/;
+}
+.ui-btn-up-r {
+ border: 1px solid rgb(245, 219, 196) /*{e-bup-border}*/;
+ background: rgb(241, 163, 150) /*{e-bup-background-color}*/;
+ font-weight: bold;
+ color: #222 /*{e-bup-color}*/;
+ text-shadow: 0 /*{e-bup-shadow-x}*/ 0px /*{e-bup-shadow-y}*/ 0 /*{e-bup-shadow-radius}*/ #fff /*{e-bup-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( rgb(245, 219, 196) /*{e-bup-background-start}*/), rgb(241, 163, 150) /*{e-bup-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( rgb(245, 219, 196) /*{e-bup-background-start}*/, rgb(241, 163, 150) /*{e-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( rgb(245, 219, 196) /*{e-bup-background-start}*/, rgb(241, 163, 150) /*{e-bup-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( rgb(245, 219, 196) /*{e-bup-background-start}*/, rgb(241, 163, 150) /*{e-bup-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( rgb(245, 219, 196) /*{e-bup-background-start}*/, rgb(241, 163, 150) /*{e-bup-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( rgb(245, 219, 196) /*{e-bup-background-start}*/, rgb(241, 163, 150) /*{e-bup-background-end}*/);
+}
+.ui-btn-up-r:visited,
+.ui-btn-up-r a.ui-link-inherit {
+ color: #222 /*{e-bup-color}*/;
+}
+.ui-btn-hover-r {
+ border: 1px solid rgb(245, 219, 196) /*{e-bhover-border}*/;
+ background: rgb(245, 219, 196) /*{e-bhover-background-color}*/;
+ font-weight: bold;
+ color: #111 /*{e-bhover-color}*/;
+ text-shadow: 0 /*{e-bhover-shadow-x}*/ 0px /*{e-bhover-shadow-y}*/ 0 /*{e-bhover-shadow-radius}*/ #fff /*{e-bhover-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( rgb(245, 219, 196) /*{e-bhover-background-start}*/), to( rgb(241, 163, 150) /*{e-bhover-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( rgb(245, 219, 196) /*{e-bhover-background-start}*/, rgb(241, 163, 150) /*{e-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( rgb(245, 219, 196) /*{e-bhover-background-start}*/, rgb(241, 163, 150) /*{e-bhover-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( rgb(245, 219, 196) /*{e-bhover-background-start}*/, rgb(241, 163, 150) /*{e-bhover-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( rgb(245, 219, 196) /*{e-bhover-background-start}*/, rgb(241, 163, 150) /*{e-bhover-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( rgb(245, 219, 196) /*{e-bhover-background-start}*/, rgb(241, 163, 150) /*{e-bhover-background-end}*/);
+}
+.ui-btn-hover-r:visited,
+.ui-btn-hover-r:hover,
+.ui-btn-hover-r a.ui-link-inherit {
+ color: #333 /*{e-bhover-color}*/;
+}
+.ui-btn-down-r {
+ border: 1px solid rgb(250, 230, 220) /*{e-bdown-border}*/;
+ background: rgb(250, 230, 220) /*{e-bdown-background-color}*/;
+ font-weight: bold;
+ color: #111 /*{e-bdown-color}*/;
+ text-shadow: 0 /*{e-bdown-shadow-x}*/ 0px /*{e-bdown-shadow-y}*/ 0 /*{e-bdown-shadow-radius}*/ #fff /*{e-bdown-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( rgb(250, 230, 220) /*{e-bdown-background-start}*/), to( rgb(241, 163, 150) /*{e-bdown-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( rgb(250, 230, 220) /*{e-bdown-background-start}*/, rgb(241, 163, 150) /*{e-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( rgb(250, 230, 220) /*{e-bdown-background-start}*/, rgb(241, 163, 150) /*{e-bdown-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( rgb(250, 230, 220) /*{e-bdown-background-start}*/, rgb(241, 163, 150) /*{e-bdown-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( rgb(250, 230, 220) /*{e-bdown-background-start}*/, rgb(241, 163, 150) /*{e-bdown-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( rgb(250, 230, 220) /*{e-bdown-background-start}*/, rgb(241, 163, 150) /*{e-bdown-background-end}*/);
+}
+.ui-btn-down-r:visited,
+.ui-btn-down-r:hover,
+.ui-btn-down-r a.ui-link-inherit {
+ color: #333 /*{e-bdown-color}*/;
+}
+.ui-btn-up-r,
+.ui-btn-hover-r,
+.ui-btn-down-r {
+ font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+ text-decoration: none;
+}
+/* g
+-----------------------------------------------------------------------------------------------------------*/
+.ui-bar-g {
+ border: 1px solid #f7c942 /*{e-bar-border}*/;
+ background: #fadb4e /*{e-bar-background-color}*/;
+ color: #333 /*{e-bar-color}*/;
+ font-weight: bold;
+ text-shadow: 0 /*{e-bar-shadow-x}*/ 1px /*{e-bar-shadow-y}*/ 0 /*{e-bar-shadow-radius}*/ #fff /*{e-bar-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #fceda7 /*{e-bar-background-start}*/), to( #fbef7e /*{e-bar-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #fceda7 /*{e-bar-background-start}*/, #fbef7e /*{e-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #fceda7 /*{e-bar-background-start}*/, #fbef7e /*{e-bar-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #fceda7 /*{e-bar-background-start}*/, #fbef7e /*{e-bar-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #fceda7 /*{e-bar-background-start}*/, #fbef7e /*{e-bar-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #fceda7 /*{e-bar-background-start}*/, #fbef7e /*{e-bar-background-end}*/);
+}
+.ui-bar-g,
+.ui-bar-g input,
+.ui-bar-g select,
+.ui-bar-g textarea,
+.ui-bar-g button {
+ font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+}
+.ui-bar-g .ui-link-inherit {
+ color: #333 /*{e-bar-color}*/;
+}
+.ui-bar-g a.ui-link {
+ color: #2489ce /*{e-bar-link-color}*/;
+ font-weight: bold;
+}
+.ui-bar-g a.ui-link:visited {
+ color: #2489ce /*{e-bar-link-visited}*/;
+}
+.ui-bar-g a.ui-link:hover {
+ color: #2489ce /*{e-bar-link-hover}*/;
+}
+.ui-bar-g a.ui-link:active {
+ color: #2489ce /*{e-bar-link-active}*/;
+}
+.ui-body-g,
+.ui-overlay-g {
+ border: 1px solid #f7c942 /*{e-body-border}*/;
+ color: #222 /*{e-body-color}*/;
+ text-shadow: 0 /*{e-body-shadow-x}*/ 1px /*{e-body-shadow-y}*/ 0 /*{e-body-shadow-radius}*/ #fff /*{e-body-shadow-color}*/;
+ background: #fff9df /*{e-body-background-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #fffadf /*{e-body-background-start}*/), to( #fff3a5 /*{e-body-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #fffadf /*{e-body-background-start}*/, #fff3a5 /*{e-body-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #fffadf /*{e-body-background-start}*/, #fff3a5 /*{e-body-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #fffadf /*{e-body-background-start}*/, #fff3a5 /*{e-body-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #fffadf /*{e-body-background-start}*/, #fff3a5 /*{e-body-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #fffadf /*{e-body-background-start}*/, #fff3a5 /*{e-body-background-end}*/);
+ //background-image: linear-gradient( rgb(253, 102, 127) /*{e-body-background-start}*/, rgb(189, 215, 175) /*{e-body-background-end}*/);
+}
+.ui-overlay-g {
+ background-image: none;
+ border-width: 0;
+}
+.ui-body-g,
+.ui-body-g input,
+.ui-body-g select,
+.ui-body-g textarea,
+.ui-body-g button {
+ font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+}
+.ui-body-g .ui-link-inherit {
+ color: #222 /*{e-body-color}*/;
+}
+.ui-body-g .ui-link {
+ color: #2489ce /*{e-body-link-color}*/;
+ font-weight: bold;
+}
+.ui-body-g .ui-link:visited {
+ color: #2489ce /*{e-body-link-visited}*/;
+}
+.ui-body-g .ui-link:hover {
+ color: #2489ce /*{e-body-link-hover}*/;
+}
+.ui-body-g .ui-link:active {
+ color: #2489ce /*{e-body-link-active}*/;
+}
+.ui-btn-up-g {
+ border: 1px solid rgb(220, 250, 220) /*{e-bup-border}*/;
+ background: rgb(220, 250, 220) /*{e-bup-background-color}*/;
+ font-weight: bold;
+ color: #222 /*{e-bup-color}*/;
+ text-shadow: 0 /*{e-bup-shadow-x}*/ 0px /*{e-bup-shadow-y}*/ 0 /*{e-bup-shadow-radius}*/ #fff /*{e-bup-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( rgb(220, 250, 220) /*{e-bup-background-start}*/), to( rgb(99, 220, 179) /*{e-bup-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( rgb(220, 250, 220) /*{e-bup-background-start}*/, rgb(99, 220, 179) /*{e-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( rgb(220, 250, 220) /*{e-bup-background-start}*/, rgb(99, 220, 179) /*{e-bup-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( rgb(220, 250, 220) /*{e-bup-background-start}*/, rgb(99, 220, 179) /*{e-bup-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( rgb(220, 250, 220) /*{e-bup-background-start}*/, rgb(99, 220, 179) /*{e-bup-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( rgb(220, 250, 220) /*{e-bup-background-start}*/, rgb(99, 220, 179) /*{e-bup-background-end}*/);
+}
+.ui-btn-up-g:visited,
+.ui-btn-up-g a.ui-link-inherit {
+ color: #222 /*{e-bup-color}*/;
+}
+.ui-btn-hover-g {
+ border: 1px solid rgb(220, 250, 220) /*{e-bhover-border}*/;
+ background: rgb(220, 250, 220) /*{e-bhover-background-color}*/;
+ font-weight: bold;
+ color: #111 /*{e-bhover-color}*/;
+ text-shadow: 0 /*{e-bhover-shadow-x}*/ 0px /*{e-bhover-shadow-y}*/ 0 /*{e-bhover-shadow-radius}*/ #fff /*{e-bhover-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( rgb(220, 250, 220) /*{e-bhover-background-start}*/), to( rgb(99, 220, 179) /*{e-bhover-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( rgb(220, 250, 220) /*{e-bhover-background-start}*/, rgb(99, 220, 179) /*{e-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( rgb(220, 250, 220) /*{e-bhover-background-start}*/, rgb(99, 220, 179) /*{e-bhover-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( rgb(220, 250, 220) /*{e-bhover-background-start}*/, rgb(99, 220, 179) /*{e-bhover-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( rgb(220, 250, 220) /*{e-bhover-background-start}*/, rgb(99, 220, 179) /*{e-bhover-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( rgb(220, 250, 220) /*{e-bhover-background-start}*/, rgb(99, 220, 179) /*{e-bhover-background-end}*/);
+}
+.ui-btn-hover-g:visited,
+.ui-btn-hover-g:hover,
+.ui-btn-hover-g a.ui-link-inherit {
+ color: #333 /*{e-bhover-color}*/;
+}
+.ui-btn-down-g {
+ border: 1px solid rgb(220, 250, 250) /*{e-bdown-border}*/;
+ background: rgb(220, 250, 250) /*{e-bdown-background-color}*/;
+ font-weight: bold;
+ color: #111 /*{e-bdown-color}*/;
+ text-shadow: 0 /*{e-bdown-shadow-x}*/ 0px /*{e-bdown-shadow-y}*/ 0 /*{e-bdown-shadow-radius}*/ #fff /*{e-bdown-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( rgb(220, 250, 250) /*{e-bdown-background-start}*/), to( rgb(99, 220, 179) /*{e-bdown-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( rgb(220, 250, 250) /*{e-bdown-background-start}*/, rgb(99, 220, 179) /*{e-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( rgb(220, 250, 250) /*{e-bdown-background-start}*/, rgb(99, 220, 179) /*{e-bdown-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( rgb(220, 250, 250) /*{e-bdown-background-start}*/, rgb(99, 220, 179) /*{e-bdown-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( rgb(220, 250, 250) /*{e-bdown-background-start}*/, rgb(99, 220, 179) /*{e-bdown-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( rgb(220, 250, 250) /*{e-bdown-background-start}*/, rgb(99, 220, 179) /*{e-bdown-background-end}*/);
+}
+.ui-btn-down-g:visited,
+.ui-btn-down-g:hover,
+.ui-btn-down-g a.ui-link-inherit {
+ color: #333 /*{e-bdown-color}*/;
+}
+.ui-btn-up-g,
+.ui-btn-hover-g,
+.ui-btn-down-g {
+ font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+ text-decoration: none;
+}
+
+/* Structure */
+/* links within "buttons"
+-----------------------------------------------------------------------------------------------------------*/
+a.ui-link-inherit {
+ text-decoration: none !important;
+}
+/* Active class used as the "on" state across all themes
+-----------------------------------------------------------------------------------------------------------*/
+.ui-btn-active {
+ border: 1px solid #2373a5 /*{global-active-border}*/;
+ background: #5393c5 /*{global-active-background-color}*/;
+ font-weight: bold;
+ color: #fff /*{global-active-color}*/;
+ cursor: pointer;
+ text-shadow: 0 /*{global-active-shadow-x}*/ 1px /*{global-active-shadow-y}*/ 1px /*{global-active-shadow-radius}*/ #3373a5 /*{global-active-shadow-color}*/;
+ text-decoration: none;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #5393c5 /*{global-active-background-start}*/), to( #6facd5 /*{global-active-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #5393c5 /*{global-active-background-start}*/, #6facd5 /*{global-active-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #5393c5 /*{global-active-background-start}*/, #6facd5 /*{global-active-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #5393c5 /*{global-active-background-start}*/, #6facd5 /*{global-active-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #5393c5 /*{global-active-background-start}*/, #6facd5 /*{global-active-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #5393c5 /*{global-active-background-start}*/, #6facd5 /*{global-active-background-end}*/);
+ font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+}
+.ui-btn-active:visited,
+.ui-btn-active:hover,
+.ui-btn-active a.ui-link-inherit {
+ color: #fff /*{global-active-color}*/;
+}
+/* button inner top highlight
+-----------------------------------------------------------------------------------------------------------*/
+.ui-btn-inner {
+ border-top: 1px solid #fff;
+ border-color: rgba(255,255,255,.3);
+}
+/* corner rounding classes
+-----------------------------------------------------------------------------------------------------------*/
+.ui-corner-tl {
+ -moz-border-radius-topleft: .6em /*{global-radii-blocks}*/;
+ -webkit-border-top-left-radius: .6em /*{global-radii-blocks}*/;
+ border-top-left-radius: .6em /*{global-radii-blocks}*/;
+}
+.ui-corner-tr {
+ -moz-border-radius-topright: .6em /*{global-radii-blocks}*/;
+ -webkit-border-top-right-radius: .6em /*{global-radii-blocks}*/;
+ border-top-right-radius: .6em /*{global-radii-blocks}*/;
+}
+.ui-corner-bl {
+ -moz-border-radius-bottomleft: .6em /*{global-radii-blocks}*/;
+ -webkit-border-bottom-left-radius: .6em /*{global-radii-blocks}*/;
+ border-bottom-left-radius: .6em /*{global-radii-blocks}*/;
+}
+.ui-corner-br {
+ -moz-border-radius-bottomright: .6em /*{global-radii-blocks}*/;
+ -webkit-border-bottom-right-radius: .6em /*{global-radii-blocks}*/;
+ border-bottom-right-radius: .6em /*{global-radii-blocks}*/;
+}
+.ui-corner-top {
+ -moz-border-radius-topleft: .6em /*{global-radii-blocks}*/;
+ -webkit-border-top-left-radius: .6em /*{global-radii-blocks}*/;
+ border-top-left-radius: .6em /*{global-radii-blocks}*/;
+ -moz-border-radius-topright: .6em /*{global-radii-blocks}*/;
+ -webkit-border-top-right-radius: .6em /*{global-radii-blocks}*/;
+ border-top-right-radius: .6em /*{global-radii-blocks}*/;
+}
+.ui-corner-bottom {
+ -moz-border-radius-bottomleft: .6em /*{global-radii-blocks}*/;
+ -webkit-border-bottom-left-radius: .6em /*{global-radii-blocks}*/;
+ border-bottom-left-radius: .6em /*{global-radii-blocks}*/;
+ -moz-border-radius-bottomright: .6em /*{global-radii-blocks}*/;
+ -webkit-border-bottom-right-radius: .6em /*{global-radii-blocks}*/;
+ border-bottom-right-radius: .6em /*{global-radii-blocks}*/;
+ }
+.ui-corner-right {
+ -moz-border-radius-topright: .6em /*{global-radii-blocks}*/;
+ -webkit-border-top-right-radius: .6em /*{global-radii-blocks}*/;
+ border-top-right-radius: .6em /*{global-radii-blocks}*/;
+ -moz-border-radius-bottomright: .6em /*{global-radii-blocks}*/;
+ -webkit-border-bottom-right-radius: .6em /*{global-radii-blocks}*/;
+ border-bottom-right-radius: .6em /*{global-radii-blocks}*/;
+}
+.ui-corner-left {
+ -moz-border-radius-topleft: .6em /*{global-radii-blocks}*/;
+ -webkit-border-top-left-radius: .6em /*{global-radii-blocks}*/;
+ border-top-left-radius: .6em /*{global-radii-blocks}*/;
+ -moz-border-radius-bottomleft: .6em /*{global-radii-blocks}*/;
+ -webkit-border-bottom-left-radius: .6em /*{global-radii-blocks}*/;
+ border-bottom-left-radius: .6em /*{global-radii-blocks}*/;
+}
+.ui-corner-all {
+ -moz-border-radius: .6em /*{global-radii-blocks}*/;
+ -webkit-border-radius: .6em /*{global-radii-blocks}*/;
+ border-radius: .6em /*{global-radii-blocks}*/;
+}
+.ui-corner-none {
+ -moz-border-radius: 0;
+ -webkit-border-radius: 0;
+ border-radius: 0;
+}
+/* Form field separator
+-----------------------------------------------------------------------------------------------------------*/
+.ui-br {
+ border-bottom: rgb(130,130,130);
+ border-bottom: rgba(130,130,130,.3);
+ border-bottom-width: 1px;
+ border-bottom-style: solid;
+}
+/* Interaction cues
+-----------------------------------------------------------------------------------------------------------*/
+.ui-disabled {
+ filter: Alpha(Opacity=30);
+ opacity: .3;
+ zoom: 1;
+}
+.ui-disabled,
+.ui-disabled a {
+ cursor: default !important;
+ pointer-events: none;
+}
+/* Icons
+-----------------------------------------------------------------------------------------------------------*/
+.ui-icon,
+.ui-icon-searchfield:after {
+ background: #666 /*{global-icon-color}*/;
+ background: rgba(0,0,0,.4) /*{global-icon-disc}*/;
+ background-image: url(images/jquery/icons-18-white.png) /*{global-icon-set}*/;
+ background-repeat: no-repeat;
+ -moz-border-radius: 9px;
+ -webkit-border-radius: 9px;
+ border-radius: 9px;
+}
+/* Alt icon color
+-----------------------------------------------------------------------------------------------------------*/
+.ui-icon-alt {
+ background: #fff;
+ background: rgba(255,255,255,.3);
+ background-image: url(images/jquery/icons-18-black.png);
+ background-repeat: no-repeat;
+}
+/* HD/"retina" sprite
+-----------------------------------------------------------------------------------------------------------*/
+@media only screen and (-webkit-min-device-pixel-ratio: 1.5),
+ only screen and (min--moz-device-pixel-ratio: 1.5),
+ only screen and (min-resolution: 240dpi) {
+
+ .ui-icon-plus, .ui-icon-minus, .ui-icon-delete, .ui-icon-arrow-r,
+ .ui-icon-arrow-l, .ui-icon-arrow-u, .ui-icon-arrow-d, .ui-icon-check,
+ .ui-icon-gear, .ui-icon-refresh, .ui-icon-forward, .ui-icon-back,
+ .ui-icon-grid, .ui-icon-star, .ui-icon-alert, .ui-icon-info, .ui-icon-home, .ui-icon-search, .ui-icon-searchfield:after,
+ .ui-icon-checkbox-off, .ui-icon-checkbox-on, .ui-icon-radio-off, .ui-icon-radio-on {
+ background-image: url(images/jquery/icons-36-white.png);
+ -moz-background-size: 776px 18px;
+ -o-background-size: 776px 18px;
+ -webkit-background-size: 776px 18px;
+ background-size: 776px 18px;
+ }
+ .ui-icon-alt {
+ background-image: url(images/jquery/icons-36-black.png);
+ }
+}
+/* plus minus */
+.ui-icon-plus {
+ background-position: -0 50%;
+}
+.ui-icon-minus {
+ background-position: -36px 50%;
+}
+/* delete/close */
+.ui-icon-delete {
+ background-position: -72px 50%;
+}
+/* arrows */
+.ui-icon-arrow-r {
+ background-position: -108px 50%;
+}
+.ui-icon-arrow-l {
+ background-position: -144px 50%;
+}
+.ui-icon-arrow-u {
+ background-position: -180px 50%;
+}
+.ui-icon-arrow-d {
+ background-position: -216px 50%;
+}
+/* misc */
+.ui-icon-check {
+ background-position: -252px 50%;
+}
+.ui-icon-gear {
+ background-position: -288px 50%;
+}
+.ui-icon-refresh {
+ background-position: -324px 50%;
+}
+.ui-icon-forward {
+ background-position: -360px 50%;
+}
+.ui-icon-back {
+ background-position: -396px 50%;
+}
+.ui-icon-grid {
+ background-position: -432px 50%;
+}
+.ui-icon-star {
+ background-position: -468px 50%;
+}
+.ui-icon-alert {
+ background-position: -504px 50%;
+}
+.ui-icon-info {
+ background-position: -540px 50%;
+}
+.ui-icon-home {
+ background-position: -576px 50%;
+}
+.ui-icon-search,
+.ui-icon-searchfield:after {
+ background-position: -612px 50%;
+}
+.ui-icon-checkbox-off {
+ background-position: -684px 50%;
+}
+.ui-icon-checkbox-on {
+ background-position: -648px 50%;
+}
+.ui-icon-radio-off {
+ background-position: -756px 50%;
+}
+.ui-icon-radio-on {
+ background-position: -720px 50%;
+}
+/* checks,radios */
+.ui-checkbox .ui-icon,
+.ui-selectmenu-list .ui-icon {
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+}
+.ui-icon-checkbox-off,
+.ui-icon-radio-off {
+ background-color: transparent;
+}
+.ui-checkbox-on .ui-icon,
+.ui-radio-on .ui-icon {
+ background-color: #4596ce /*{global-active-background-color}*/; /* NOTE: this hex should match the active state color. It's repeated here for cascade */
+}
+/* loading icon */
+.ui-icon-loading {
+ background: url(images/jquery/ajax-loader.gif);
+ background-size: 46px 46px;
+}
+/* Button corner classes
+-----------------------------------------------------------------------------------------------------------*/
+.ui-btn-corner-tl {
+ -moz-border-radius-topleft: 1em /*{global-radii-buttons}*/;
+ -webkit-border-top-left-radius: 1em /*{global-radii-buttons}*/;
+ border-top-left-radius: 1em /*{global-radii-buttons}*/;
+}
+.ui-btn-corner-tr {
+ -moz-border-radius-topright: 1em /*{global-radii-buttons}*/;
+ -webkit-border-top-right-radius: 1em /*{global-radii-buttons}*/;
+ border-top-right-radius: 1em /*{global-radii-buttons}*/;
+}
+.ui-btn-corner-bl {
+ -moz-border-radius-bottomleft: 1em /*{global-radii-buttons}*/;
+ -webkit-border-bottom-left-radius: 1em /*{global-radii-buttons}*/;
+ border-bottom-left-radius: 1em /*{global-radii-buttons}*/;
+}
+.ui-btn-corner-br {
+ -moz-border-radius-bottomright: 1em /*{global-radii-buttons}*/;
+ -webkit-border-bottom-right-radius: 1em /*{global-radii-buttons}*/;
+ border-bottom-right-radius: 1em /*{global-radii-buttons}*/;
+}
+.ui-btn-corner-top {
+ -moz-border-radius-topleft: 1em /*{global-radii-buttons}*/;
+ -webkit-border-top-left-radius: 1em /*{global-radii-buttons}*/;
+ border-top-left-radius: 1em /*{global-radii-buttons}*/;
+ -moz-border-radius-topright: 1em /*{global-radii-buttons}*/;
+ -webkit-border-top-right-radius: 1em /*{global-radii-buttons}*/;
+ border-top-right-radius: 1em /*{global-radii-buttons}*/;
+}
+.ui-btn-corner-bottom {
+ -moz-border-radius-bottomleft: 1em /*{global-radii-buttons}*/;
+ -webkit-border-bottom-left-radius: 1em /*{global-radii-buttons}*/;
+ border-bottom-left-radius: 1em /*{global-radii-buttons}*/;
+ -moz-border-radius-bottomright: 1em /*{global-radii-buttons}*/;
+ -webkit-border-bottom-right-radius: 1em /*{global-radii-buttons}*/;
+ border-bottom-right-radius: 1em /*{global-radii-buttons}*/;
+}
+.ui-btn-corner-right {
+ -moz-border-radius-topright: 1em /*{global-radii-buttons}*/;
+ -webkit-border-top-right-radius: 1em /*{global-radii-buttons}*/;
+ border-top-right-radius: 1em /*{global-radii-buttons}*/;
+ -moz-border-radius-bottomright: 1em /*{global-radii-buttons}*/;
+ -webkit-border-bottom-right-radius: 1em /*{global-radii-buttons}*/;
+ border-bottom-right-radius: 1em /*{global-radii-buttons}*/;
+}
+.ui-btn-corner-left {
+ -moz-border-radius-topleft: 1em /*{global-radii-buttons}*/;
+ -webkit-border-top-left-radius: 1em /*{global-radii-buttons}*/;
+ border-top-left-radius: 1em /*{global-radii-buttons}*/;
+ -moz-border-radius-bottomleft: 1em /*{global-radii-buttons}*/;
+ -webkit-border-bottom-left-radius: 1em /*{global-radii-buttons}*/;
+ border-bottom-left-radius: 1em /*{global-radii-buttons}*/;
+}
+.ui-btn-corner-all {
+ -moz-border-radius: 1em /*{global-radii-buttons}*/;
+ -webkit-border-radius: 1em /*{global-radii-buttons}*/;
+ border-radius: 1em /*{global-radii-buttons}*/;
+}
+/* radius clip workaround for cleaning up corner trapping */
+.ui-corner-tl,
+.ui-corner-tr,
+.ui-corner-bl,
+.ui-corner-br,
+.ui-corner-top,
+.ui-corner-bottom,
+.ui-corner-right,
+.ui-corner-left,
+.ui-corner-all,
+.ui-btn-corner-tl,
+.ui-btn-corner-tr,
+.ui-btn-corner-bl,
+.ui-btn-corner-br,
+.ui-btn-corner-top,
+.ui-btn-corner-bottom,
+.ui-btn-corner-right,
+.ui-btn-corner-left,
+.ui-btn-corner-all {
+ -webkit-background-clip: padding-box;
+ -moz-background-clip: padding;
+ background-clip: padding-box;
+}
+/* Overlay / modal
+-----------------------------------------------------------------------------------------------------------*/
+.ui-overlay {
+ background: #666;
+ filter: Alpha(Opacity=50);
+ opacity: .5;
+ position: absolute;
+ width: 100%;
+ height: 100%;
+}
+.ui-overlay-shadow {
+ -moz-box-shadow: 0px 0px 12px rgba(0,0,0,.6);
+ -webkit-box-shadow: 0px 0px 12px rgba(0,0,0,.6);
+ box-shadow: 0px 0px 12px rgba(0,0,0,.6);
+}
+.ui-shadow {
+ -moz-box-shadow: 0px 1px 4px /*{global-box-shadow-size}*/ rgba(0,0,0,.3) /*{global-box-shadow-color}*/;
+ -webkit-box-shadow: 0px 1px 4px /*{global-box-shadow-size}*/ rgba(0,0,0,.3) /*{global-box-shadow-color}*/;
+ box-shadow: 0px 1px 4px /*{global-box-shadow-size}*/ rgba(0,0,0,.3) /*{global-box-shadow-color}*/;
+}
+.ui-bar-a .ui-shadow,
+.ui-bar-b .ui-shadow ,
+.ui-bar-c .ui-shadow {
+ -moz-box-shadow: 0px 1px 0 rgba(255,255,255,.3);
+ -webkit-box-shadow: 0px 1px 0 rgba(255,255,255,.3);
+ box-shadow: 0px 1px 0 rgba(255,255,255,.3);
+}
+.ui-shadow-inset {
+ -moz-box-shadow: inset 0px 1px 4px rgba(0,0,0,.2);
+ -webkit-box-shadow: inset 0px 1px 4px rgba(0,0,0,.2);
+ box-shadow: inset 0px 1px 4px rgba(0,0,0,.2);
+}
+.ui-icon-shadow {
+ -moz-box-shadow: 0px 1px 0 rgba(255,255,255,.4) /*{global-icon-shadow}*/;
+ -webkit-box-shadow: 0px 1px 0 rgba(255,255,255,.4) /*{global-icon-shadow}*/;
+ box-shadow: 0px 1px 0 rgba(255,255,255,.4) /*{global-icon-shadow}*/;
+}
+/* Focus state - set here for specificity (note: these classes are added by JavaScript)
+-----------------------------------------------------------------------------------------------------------*/
+.ui-btn:focus, .ui-link-inherit:focus {
+ outline: 0;
+}
+.ui-btn.ui-focus {
+ z-index: 1;
+}
+.ui-focus,
+.ui-btn:focus {
+ -moz-box-shadow: inset 0px 0px 3px #387bbe /*{global-active-background-color}*/, 0px 0px 9px #387bbe /*{global-active-background-color}*/;
+ -webkit-box-shadow: inset 0px 0px 3px #387bbe /*{global-active-background-color}*/, 0px 0px 9px #387bbe /*{global-active-background-color}*/;
+ box-shadow: inset 0px 0px 3px #387bbe /*{global-active-background-color}*/, 0px 0px 9px #387bbe /*{global-active-background-color}*/;
+}
+.ui-input-text.ui-focus,
+.ui-input-search.ui-focus {
+ -moz-box-shadow: 0px 0px 12px #387bbe /*{global-active-background-color}*/;
+ -webkit-box-shadow: 0px 0px 12px #387bbe /*{global-active-background-color}*/;
+ box-shadow: 0px 0px 12px #387bbe /*{global-active-background-color}*/;
+}
+/* unset box shadow in browsers that don't do it right
+-----------------------------------------------------------------------------------------------------------*/
+.ui-mobile-nosupport-boxshadow * {
+ -moz-box-shadow: none !important;
+ -webkit-box-shadow: none !important;
+ box-shadow: none !important;
+}
+/* ...and bring back focus */
+.ui-mobile-nosupport-boxshadow .ui-focus,
+.ui-mobile-nosupport-boxshadow .ui-btn:focus,
+.ui-mobile-nosupport-boxshadow .ui-link-inherit:focus {
+ outline-width: 1px;
+ outline-style: auto;
+}
+/* some unsets - more probably needed */
+.ui-mobile, .ui-mobile body { height: 99.9%; }
+.ui-mobile fieldset, .ui-page { padding: 0; margin: 0; }
+.ui-mobile a img, .ui-mobile fieldset { border-width: 0; }
+/* responsive page widths */
+.ui-mobile-viewport { margin: 0; overflow-x: visible; -webkit-text-size-adjust: 100%; -ms-text-size-adjust:none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); }
+/* Issue #2066 */
+body.ui-mobile-viewport,
+div.ui-mobile-viewport { overflow-x: hidden; }
+/* "page" containers - full-screen views, one should always be in view post-pageload */
+.ui-mobile [data-role=page], .ui-mobile [data-role=dialog], .ui-page { top: 0; left: 0; width: 100%; min-height: 100%; position: absolute; display: none; border: 0; }
+.ui-mobile .ui-page-active { display: block; overflow: visible; }
+/* on ios4, setting focus on the page element causes flashing during transitions when there is an outline, so we turn off outlines */
+.ui-page { outline: none; }
+/*orientations from js are available */
+@media screen and (orientation: portrait){
+.ui-mobile, .ui-mobile .ui-page { min-height: 420px; }
+}
+@media screen and (orientation: landscape){
+.ui-mobile, .ui-mobile .ui-page { min-height: 300px; }
+}
+/* loading screen */
+.ui-loading .ui-loader { display: block; }
+.ui-loader { display: none; z-index: 9999999; position: fixed; top: 50%; left: 50%; border:0; }
+.ui-loader-default { background: none; filter: Alpha(Opacity=18); opacity: .18; width: 46px; height: 46px; margin-left: -23px; margin-top: -23px; }
+.ui-loader-verbose { width: 200px; filter: Alpha(Opacity=88); opacity: .88; box-shadow: 0 1px 1px -1px #fff; height: auto; margin-left: -110px; margin-top: -43px; padding: 10px; }
+.ui-loader-default h1 { font-size: 0; width: 0; height: 0; overflow: hidden; }
+.ui-loader-verbose h1 { font-size: 16px; margin: 0; text-align: center; }
+.ui-loader .ui-icon { background-color: #000; display: block; margin: 0; width: 44px; height: 44px; padding: 1px; -webkit-border-radius: 36px; -moz-border-radius: 36px; border-radius: 36px; }
+.ui-loader-verbose .ui-icon { margin: 0 auto 10px; filter: Alpha(Opacity=75); opacity: .75; }
+.ui-loader-textonly { padding: 15px; margin-left: -115px; }
+.ui-loader-textonly .ui-icon { display: none; }
+.ui-loader-fakefix { position: absolute; }
+/*fouc*/
+.ui-mobile-rendering > * { visibility: hidden; }
+/*headers, content panels*/
+.ui-bar, .ui-body { position: relative; padding: .4em 15px; overflow: hidden; display: block; clear:both; }
+.ui-bar { font-size: 16px; margin: 0; }
+.ui-bar h1, .ui-bar h2, .ui-bar h3, .ui-bar h4, .ui-bar h5, .ui-bar h6 { margin: 0; padding: 0; font-size: 16px; display: inline-block; }
+.ui-header, .ui-footer { position: relative; border-left-width: 0; border-right-width: 0; zoom: 1; }
+.ui-header .ui-btn-left,
+.ui-header .ui-btn-right,
+.ui-footer .ui-btn-left,
+.ui-footer .ui-btn-right { position: absolute; top: 3px; }
+.ui-header .ui-btn-left,
+.ui-footer .ui-btn-left { left: 5px; }
+.ui-header .ui-btn-right,
+.ui-footer .ui-btn-right { right: 5px; }
+.ui-footer .ui-btn-icon-notext,
+.ui-header .ui-btn-icon-notext { top: 6px; }
+.ui-header .ui-title, .ui-footer .ui-title { min-height: 1.1em; text-align: center; font-size: 16px; display: block; margin: .6em 30% .8em; padding: 0; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; outline: 0 !important; }
+.ui-footer .ui-title { margin: .6em 15px .8em; }
+/*content area*/
+.ui-content { border-width: 0; overflow: visible; overflow-x: hidden; padding: 15px; }
+/* icons sizing */
+.ui-icon { width: 18px; height: 18px; }
+/* non-js content hiding */
+.ui-nojs { position: absolute; left: -9999px; }
+/* accessible content hiding */
+.ui-hide-label label.ui-input-text, .ui-hide-label label.ui-select, .ui-hide-label label.ui-slider, .ui-hide-label label.ui-submit, .ui-hide-label .ui-controlgroup-label,
+.ui-hidden-accessible { position: absolute !important; left: -9999px; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
+/* Transitions originally inspired by those from jQtouch, nice work, folks */
+.ui-mobile-viewport-transitioning,
+.ui-mobile-viewport-transitioning .ui-page {
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.ui-page-pre-in {
+ opacity: 0;
+}
+.in {
+ -webkit-animation-timing-function: ease-out;
+ -webkit-animation-duration: 350ms;
+ -moz-animation-timing-function: ease-out;
+ -moz-animation-duration: 350ms;
+}
+.out {
+ -webkit-animation-timing-function: ease-in;
+ -webkit-animation-duration: 225ms;
+ -moz-animation-timing-function: ease-in;
+ -moz-animation-duration: 225ms;
+}
+@-webkit-keyframes fadein {
+ from { opacity: 0; }
+ to { opacity: 1; }
+}
+@-moz-keyframes fadein {
+ from { opacity: 0; }
+ to { opacity: 1; }
+}
+@-webkit-keyframes fadeout {
+ from { opacity: 1; }
+ to { opacity: 0; }
+}
+@-moz-keyframes fadeout {
+ from { opacity: 1; }
+ to { opacity: 0; }
+}
+.fade.out {
+ opacity: 0;
+ -webkit-animation-duration: 125ms;
+ -webkit-animation-name: fadeout;
+ -moz-animation-duration: 125ms;
+ -moz-animation-name: fadeout;
+}
+.fade.in {
+ opacity: 1;
+ -webkit-animation-duration: 225ms;
+ -webkit-animation-name: fadein;
+ -moz-animation-duration: 225ms;
+ -moz-animation-name: fadein;
+}
+.pop {
+ -webkit-transform-origin: 50% 50%;
+ -moz-transform-origin: 50% 50%;
+}
+.pop.in {
+ -webkit-transform: scale(1);
+ -moz-transform: scale(1);
+ opacity: 1;
+ -webkit-animation-name: popin;
+ -moz-animation-name: popin;
+ -webkit-animation-duration: 350ms;
+ -moz-animation-duration: 350ms;
+}
+.pop.out {
+ -webkit-animation-name: fadeout;
+ -moz-animation-name: fadeout;
+ opacity: 0;
+ -webkit-animation-duration: 100ms;
+ -moz-animation-duration: 100ms;
+}
+.pop.in.reverse {
+ -webkit-animation-name: fadein;
+ -moz-animation-name: fadein;
+}
+.pop.out.reverse {
+ -webkit-transform: scale(.8);
+ -moz-transform: scale(.8);
+ -webkit-animation-name: popout;
+ -moz-animation-name: popout;
+}
+@-webkit-keyframes popin {
+ from {
+ -webkit-transform: scale(.8);
+ opacity: 0;
+ }
+ to {
+ -webkit-transform: scale(1);
+ opacity: 1;
+ }
+}
+@-moz-keyframes popin {
+ from {
+ -moz-transform: scale(.8);
+ opacity: 0;
+ }
+ to {
+ -moz-transform: scale(1);
+ opacity: 1;
+ }
+}
+@-webkit-keyframes popout {
+ from {
+ -webkit-transform: scale(1);
+ opacity: 1;
+ }
+ to {
+ -webkit-transform: scale(.8);
+ opacity: 0;
+ }
+}
+@-moz-keyframes popout {
+ from {
+ -moz-transform: scale(1);
+ opacity: 1;
+ }
+ to {
+ -moz-transform: scale(.8);
+ opacity: 0;
+ }
+}
+/* keyframes for slidein from sides */
+@-webkit-keyframes slideinfromright {
+ from { -webkit-transform: translateX(100%); }
+ to { -webkit-transform: translateX(0); }
+}
+@-moz-keyframes slideinfromright {
+ from { -moz-transform: translateX(100%); }
+ to { -moz-transform: translateX(0); }
+}
+@-webkit-keyframes slideinfromleft {
+ from { -webkit-transform: translateX(-100%); }
+ to { -webkit-transform: translateX(0); }
+}
+@-moz-keyframes slideinfromleft {
+ from { -moz-transform: translateX(-100%); }
+ to { -moz-transform: translateX(0); }
+}
+/* keyframes for slideout to sides */
+@-webkit-keyframes slideouttoleft {
+ from { -webkit-transform: translateX(0); }
+ to { -webkit-transform: translateX(-100%); }
+}
+@-moz-keyframes slideouttoleft {
+ from { -moz-transform: translateX(0); }
+ to { -moz-transform: translateX(-100%); }
+}
+@-webkit-keyframes slideouttoright {
+ from { -webkit-transform: translateX(0); }
+ to { -webkit-transform: translateX(100%); }
+}
+@-moz-keyframes slideouttoright {
+ from { -moz-transform: translateX(0); }
+ to { -moz-transform: translateX(100%); }
+}
+.slide.out, .slide.in {
+ -webkit-animation-timing-function: ease-out;
+ -webkit-animation-duration: 350ms;
+ -moz-animation-timing-function: ease-out;
+ -moz-animation-duration: 350ms;
+}
+.slide.out {
+ -webkit-transform: translateX(-100%);
+ -webkit-animation-name: slideouttoleft;
+ -moz-transform: translateX(-100%);
+ -moz-animation-name: slideouttoleft;
+}
+.slide.in {
+ -webkit-transform: translateX(0);
+ -webkit-animation-name: slideinfromright;
+ -moz-transform: translateX(0);
+ -moz-animation-name: slideinfromright;
+}
+.slide.out.reverse {
+ -webkit-transform: translateX(100%);
+ -webkit-animation-name: slideouttoright;
+ -moz-transform: translateX(100%);
+ -moz-animation-name: slideouttoright;
+}
+.slide.in.reverse {
+ -webkit-transform: translateX(0);
+ -webkit-animation-name: slideinfromleft;
+ -moz-transform: translateX(0);
+ -moz-animation-name: slideinfromleft;
+}
+.slidefade.out {
+ -webkit-transform: translateX(-100%);
+ -webkit-animation-name: slideouttoleft;
+ -moz-transform: translateX(-100%);
+ -moz-animation-name: slideouttoleft;
+ -webkit-animation-duration: 225ms;
+ -moz-animation-duration: 225ms;
+}
+.slidefade.in {
+ -webkit-transform: translateX(0);
+ -webkit-animation-name: fadein;
+ -moz-transform: translateX(0);
+ -moz-animation-name: fadein;
+ -webkit-animation-duration: 200ms;
+ -moz-animation-duration: 200ms;
+}
+.slidefade.out.reverse {
+ -webkit-transform: translateX(100%);
+ -webkit-animation-name: slideouttoright;
+ -moz-transform: translateX(100%);
+ -moz-animation-name: slideouttoright;
+ -webkit-animation-duration: 200ms;
+ -moz-animation-duration: 200ms;
+}
+.slidefade.in.reverse {
+ -webkit-transform: translateX(0);
+ -webkit-animation-name: fadein;
+ -moz-transform: translateX(0);
+ -moz-animation-name: fadein;
+ -webkit-animation-duration: 200ms;
+ -moz-animation-duration: 200ms;
+}
+/* slide down */
+.slidedown.out {
+ -webkit-animation-name: fadeout;
+ -moz-animation-name: fadeout;
+ -webkit-animation-duration: 100ms;
+ -moz-animation-duration: 100ms;
+}
+.slidedown.in {
+ -webkit-transform: translateY(0);
+ -webkit-animation-name: slideinfromtop;
+ -moz-transform: translateY(0);
+ -moz-animation-name: slideinfromtop;
+ -webkit-animation-duration: 250ms;
+ -moz-animation-duration: 250ms;
+}
+.slidedown.in.reverse {
+ -webkit-animation-name: fadein;
+ -moz-animation-name: fadein;
+ -webkit-animation-duration: 150ms;
+ -moz-animation-duration: 150ms;
+}
+.slidedown.out.reverse {
+ -webkit-transform: translateY(-100%);
+ -moz-transform: translateY(-100%);
+ -webkit-animation-name: slideouttotop;
+ -moz-animation-name: slideouttotop;
+ -webkit-animation-duration: 200ms;
+ -moz-animation-duration: 200ms;
+}
+@-webkit-keyframes slideinfromtop {
+ from { -webkit-transform: translateY(-100%); }
+ to { -webkit-transform: translateY(0); }
+}
+@-moz-keyframes slideinfromtop {
+ from { -moz-transform: translateY(-100%); }
+ to { -moz-transform: translateY(0); }
+}
+@-webkit-keyframes slideouttotop {
+ from { -webkit-transform: translateY(0); }
+ to { -webkit-transform: translateY(-100%); }
+}
+@-moz-keyframes slideouttotop {
+ from { -moz-transform: translateY(0); }
+ to { -moz-transform: translateY(-100%); }
+}
+/* slide up */
+.slideup.out {
+ -webkit-animation-name: fadeout;
+ -moz-animation-name: fadeout;
+ -webkit-animation-duration: 100ms;
+ -moz-animation-duration: 100ms;
+}
+.slideup.in {
+ -webkit-transform: translateY(0);
+ -webkit-animation-name: slideinfrombottom;
+ -moz-transform: translateY(0);
+ -moz-animation-name: slideinfrombottom;
+ -webkit-animation-duration: 250ms;
+ -moz-animation-duration: 250ms;
+}
+.slideup.in.reverse {
+ -webkit-animation-name: fadein;
+ -moz-animation-name: fadein;
+ -webkit-animation-duration: 150ms;
+ -moz-animation-duration: 150ms;
+}
+.slideup.out.reverse {
+ -webkit-transform: translateY(100%);
+ -moz-transform: translateY(100%);
+ -webkit-animation-name: slideouttobottom;
+ -moz-animation-name: slideouttobottom;
+ -webkit-animation-duration: 200ms;
+ -moz-animation-duration: 200ms;
+}
+@-webkit-keyframes slideinfrombottom {
+ from { -webkit-transform: translateY(100%); }
+ to { -webkit-transform: translateY(0); }
+}
+@-moz-keyframes slideinfrombottom {
+ from { -moz-transform: translateY(100%); }
+ to { -moz-transform: translateY(0); }
+}
+@-webkit-keyframes slideouttobottom {
+ from { -webkit-transform: translateY(0); }
+ to { -webkit-transform: translateY(100%); }
+}
+@-moz-keyframes slideouttobottom {
+ from { -moz-transform: translateY(0); }
+ to { -moz-transform: translateY(100%); }
+}
+/* The properties in this rule are only necessary for the 'flip' transition.
+ * We need specify the perspective to create a projection matrix. This will add
+ * some depth as the element flips. The depth number represents the distance of
+ * the viewer from the z-plane. According to the CSS3 spec, 1000 is a moderate
+ * value.
+ */
+.viewport-flip {
+ -webkit-perspective: 1000;
+ -moz-perspective: 1000;
+ position: absolute;
+}
+.flip {
+ -webkit-backface-visibility:hidden;
+ -webkit-transform:translateX(0); /* Needed to work around an iOS 3.1 bug that causes listview thumbs to disappear when -webkit-visibility:hidden is used. */
+ -moz-backface-visibility:hidden;
+ -moz-transform:translateX(0);
+}
+.flip.out {
+ -webkit-transform: rotateY(-90deg) scale(.9);
+ -webkit-animation-name: flipouttoleft;
+ -webkit-animation-duration: 175ms;
+ -moz-transform: rotateY(-90deg) scale(.9);
+ -moz-animation-name: flipouttoleft;
+ -moz-animation-duration: 175ms;
+}
+.flip.in {
+ -webkit-animation-name: flipintoright;
+ -webkit-animation-duration: 225ms;
+ -moz-animation-name: flipintoright;
+ -moz-animation-duration: 225ms;
+}
+.flip.out.reverse {
+ -webkit-transform: rotateY(90deg) scale(.9);
+ -webkit-animation-name: flipouttoright;
+ -moz-transform: rotateY(90deg) scale(.9);
+ -moz-animation-name: flipouttoright;
+}
+.flip.in.reverse {
+ -webkit-animation-name: flipintoleft;
+ -moz-animation-name: flipintoleft;
+}
+@-webkit-keyframes flipouttoleft {
+ from { -webkit-transform: rotateY(0); }
+ to { -webkit-transform: rotateY(-90deg) scale(.9); }
+}
+@-moz-keyframes flipouttoleft {
+ from { -moz-transform: rotateY(0); }
+ to { -moz-transform: rotateY(-90deg) scale(.9); }
+}
+@-webkit-keyframes flipouttoright {
+ from { -webkit-transform: rotateY(0) ; }
+ to { -webkit-transform: rotateY(90deg) scale(.9); }
+}
+@-moz-keyframes flipouttoright {
+ from { -moz-transform: rotateY(0); }
+ to { -moz-transform: rotateY(90deg) scale(.9); }
+}
+@-webkit-keyframes flipintoleft {
+ from { -webkit-transform: rotateY(-90deg) scale(.9); }
+ to { -webkit-transform: rotateY(0); }
+}
+@-moz-keyframes flipintoleft {
+ from { -moz-transform: rotateY(-90deg) scale(.9); }
+ to { -moz-transform: rotateY(0); }
+}
+@-webkit-keyframes flipintoright {
+ from { -webkit-transform: rotateY(90deg) scale(.9); }
+ to { -webkit-transform: rotateY(0); }
+}
+@-moz-keyframes flipintoright {
+ from { -moz-transform: rotateY(90deg) scale(.9); }
+ to { -moz-transform: rotateY(0); }
+}
+/* The properties in this rule are only necessary for the 'flip' transition.
+ * We need specify the perspective to create a projection matrix. This will add
+ * some depth as the element flips. The depth number represents the distance of
+ * the viewer from the z-plane. According to the CSS3 spec, 1000 is a moderate
+ * value.
+ */
+.viewport-turn {
+ -webkit-perspective: 1000;
+ -moz-perspective: 1000;
+ position: absolute;
+}
+.turn {
+ -webkit-backface-visibility:hidden;
+ -webkit-transform:translateX(0); /* Needed to work around an iOS 3.1 bug that causes listview thumbs to disappear when -webkit-visibility:hidden is used. */
+ -webkit-transform-origin: 0;
+
+ -moz-backface-visibility:hidden;
+ -moz-transform:translateX(0); /* Needed to work around an iOS 3.1 bug that causes listview thumbs to disappear when -webkit-visibility:hidden is used. */
+ -moz-transform-origin: 0;
+}
+.turn.out {
+ -webkit-transform: rotateY(-90deg) scale(.9);
+ -webkit-animation-name: flipouttoleft;
+ -moz-transform: rotateY(-90deg) scale(.9);
+ -moz-animation-name: flipouttoleft;
+ -webkit-animation-duration: 125ms;
+ -moz-animation-duration: 125ms;
+}
+.turn.in {
+ -webkit-animation-name: flipintoright;
+ -moz-animation-name: flipintoright;
+ -webkit-animation-duration: 250ms;
+ -moz-animation-duration: 250ms;
+
+}
+.turn.out.reverse {
+ -webkit-transform: rotateY(90deg) scale(.9);
+ -webkit-animation-name: flipouttoright;
+ -moz-transform: rotateY(90deg) scale(.9);
+ -moz-animation-name: flipouttoright;
+}
+.turn.in.reverse {
+ -webkit-animation-name: flipintoleft;
+ -moz-animation-name: flipintoleft;
+}
+@-webkit-keyframes flipouttoleft {
+ from { -webkit-transform: rotateY(0); }
+ to { -webkit-transform: rotateY(-90deg) scale(.9); }
+}
+@-moz-keyframes flipouttoleft {
+ from { -moz-transform: rotateY(0); }
+ to { -moz-transform: rotateY(-90deg) scale(.9); }
+}
+@-webkit-keyframes flipouttoright {
+ from { -webkit-transform: rotateY(0) ; }
+ to { -webkit-transform: rotateY(90deg) scale(.9); }
+}
+@-moz-keyframes flipouttoright {
+ from { -moz-transform: rotateY(0); }
+ to { -moz-transform: rotateY(90deg) scale(.9); }
+}
+@-webkit-keyframes flipintoleft {
+ from { -webkit-transform: rotateY(-90deg) scale(.9); }
+ to { -webkit-transform: rotateY(0); }
+}
+@-moz-keyframes flipintoleft {
+ from { -moz-transform: rotateY(-90deg) scale(.9); }
+ to { -moz-transform: rotateY(0); }
+}
+@-webkit-keyframes flipintoright {
+ from { -webkit-transform: rotateY(90deg) scale(.9); }
+ to { -webkit-transform: rotateY(0); }
+}
+@-moz-keyframes flipintoright {
+ from { -moz-transform: rotateY(90deg) scale(.9); }
+ to { -moz-transform: rotateY(0); }
+}
+/* flow transition */
+.flow {
+ -webkit-transform-origin: 50% 30%;
+ -moz-transform-origin: 50% 30%;
+ -webkit-box-shadow: 0 0 20px rgba(0,0,0,.4);
+ -moz-box-shadow: 0 0 20px rgba(0,0,0,.4);
+}
+.ui-dialog.flow {
+ -webkit-transform-origin: none;
+ -moz-transform-origin: none;
+ -webkit-box-shadow: none;
+ -moz-box-shadow: none;
+}
+.flow.out {
+ -webkit-transform: translateX(-100%) scale(.7);
+ -webkit-animation-name: flowouttoleft;
+ -webkit-animation-timing-function: ease;
+ -webkit-animation-duration: 350ms;
+ -moz-transform: translateX(-100%) scale(.7);
+ -moz-animation-name: flowouttoleft;
+ -moz-animation-timing-function: ease;
+ -moz-animation-duration: 350ms;
+}
+.flow.in {
+ -webkit-transform: translateX(0) scale(1);
+ -webkit-animation-name: flowinfromright;
+ -webkit-animation-timing-function: ease;
+ -webkit-animation-duration: 350ms;
+ -moz-transform: translateX(0) scale(1);
+ -moz-animation-name: flowinfromright;
+ -moz-animation-timing-function: ease;
+ -moz-animation-duration: 350ms;
+}
+.flow.out.reverse {
+ -webkit-transform: translateX(100%);
+ -webkit-animation-name: flowouttoright;
+ -moz-transform: translateX(100%);
+ -moz-animation-name: flowouttoright;
+}
+.flow.in.reverse {
+ -webkit-animation-name: flowinfromleft;
+ -moz-animation-name: flowinfromleft;
+}
+@-webkit-keyframes flowouttoleft {
+ 0% { -webkit-transform: translateX(0) scale(1); }
+ 60%, 70% { -webkit-transform: translateX(0) scale(.7); }
+ 100% { -webkit-transform: translateX(-100%) scale(.7); }
+}
+@-moz-keyframes flowouttoleft {
+ 0% { -moz-transform: translateX(0) scale(1); }
+ 60%, 70% { -moz-transform: translateX(0) scale(.7); }
+ 100% { -moz-transform: translateX(-100%) scale(.7); }
+}
+@-webkit-keyframes flowouttoright {
+ 0% { -webkit-transform: translateX(0) scale(1); }
+ 60%, 70% { -webkit-transform: translateX(0) scale(.7); }
+ 100% { -webkit-transform: translateX(100%) scale(.7); }
+}
+@-moz-keyframes flowouttoright {
+ 0% { -moz-transform: translateX(0) scale(1); }
+ 60%, 70% { -moz-transform: translateX(0) scale(.7); }
+ 100% { -moz-transform: translateX(100%) scale(.7); }
+}
+@-webkit-keyframes flowinfromleft {
+ 0% { -webkit-transform: translateX(-100%) scale(.7); }
+ 30%, 40% { -webkit-transform: translateX(0) scale(.7); }
+ 100% { -webkit-transform: translateX(0) scale(1); }
+}
+@-moz-keyframes flowinfromleft {
+ 0% { -moz-transform: translateX(-100%) scale(.7); }
+ 30%, 40% { -moz-transform: translateX(0) scale(.7); }
+ 100% { -moz-transform: translateX(0) scale(1); }
+}
+@-webkit-keyframes flowinfromright {
+ 0% { -webkit-transform: translateX(100%) scale(.7); }
+ 30%, 40% { -webkit-transform: translateX(0) scale(.7); }
+ 100% { -webkit-transform: translateX(0) scale(1); }
+}
+@-moz-keyframes flowinfromright {
+ 0% { -moz-transform: translateX(100%) scale(.7); }
+ 30%, 40% { -moz-transform: translateX(0) scale(.7); }
+ 100% { -moz-transform: translateX(0) scale(1); }
+}
+/* content configurations. */
+.ui-grid-a, .ui-grid-b, .ui-grid-c, .ui-grid-d { overflow: hidden; }
+.ui-block-a, .ui-block-b, .ui-block-c, .ui-block-d, .ui-block-e { margin: 0; padding: 0; border: 0; float: left; min-height: 1px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; -ms-box-sizing: border-box; box-sizing: border-box; }
+/* grid solo: 100 - single item fallback */
+.ui-grid-solo .ui-block-a { display: block; float: none; }
+/* Lower percentages for older browsers (i.e. IE7) to prevent wrapping. -.5px to fix BB5 wrap issue. */
+/* grid a: 50/50 */
+.ui-grid-a .ui-block-a, .ui-grid-a .ui-block-b { width: 49.95%; }
+.ui-grid-a > :nth-child(n) { width: 50%; margin-right: -.5px; }
+.ui-grid-a .ui-block-a { clear: left; }
+/* grid b: 33/33/33 */
+.ui-grid-b .ui-block-a, .ui-grid-b .ui-block-b, .ui-grid-b .ui-block-c { width: 33.25%; }
+.ui-grid-b > :nth-child(n) { width: 33.333%; margin-right: -.5px; }
+.ui-grid-b .ui-block-a { clear: left; }
+/* grid c: 25/25/25/25 */
+.ui-grid-c .ui-block-a, .ui-grid-c .ui-block-b, .ui-grid-c .ui-block-c, .ui-grid-c .ui-block-d { width: 24.925%; }
+.ui-grid-c > :nth-child(n) { width: 25%; margin-right: -.5px; }
+.ui-grid-c .ui-block-a { clear: left; }
+/* grid d: 20/20/20/20/20 */
+.ui-grid-d .ui-block-a, .ui-grid-d .ui-block-b, .ui-grid-d .ui-block-c, .ui-grid-d .ui-block-d, .ui-grid-d .ui-block-e { width: 19.925%; }
+.ui-grid-d > :nth-child(n) { width: 20%; }
+.ui-grid-d .ui-block-a { clear: left; }
+/* fixed page header & footer configuration */
+.ui-header-fixed,
+.ui-footer-fixed {
+ left: 0;
+ right: 0;
+ width: 100%;
+ position: fixed;
+ z-index: 1000;
+}
+.ui-header-fixed {
+ top: 0;
+}
+.ui-footer-fixed {
+ bottom: 0;
+}
+.ui-header-fullscreen,
+.ui-footer-fullscreen {
+ filter: Alpha(Opacity=90);
+ opacity: .9;
+}
+.ui-page-header-fixed {
+ padding-top: 2.6875em;
+}
+.ui-page-footer-fixed {
+ padding-bottom: 2.6875em;
+}
+.ui-page-header-fullscreen .ui-content,
+.ui-page-footer-fullscreen .ui-content {
+ padding: 0;
+}
+.ui-fixed-hidden {
+ position: absolute;
+}
+.ui-page-header-fullscreen .ui-fixed-hidden,
+.ui-page-footer-fullscreen .ui-fixed-hidden {
+ left: -9999px;
+}
+.ui-header-fixed .ui-btn,
+.ui-footer-fixed .ui-btn {
+ z-index: 10;
+}
+.ui-navbar { max-width: 100%; }
+.ui-navbar.ui-mini { margin: 0; }
+.ui-navbar ul:before, .ui-navbar ul:after { content: " "; display: table; }
+.ui-navbar ul:after { clear: both; }
+.ui-navbar ul { list-style:none; margin: 0; padding: 0; position: relative; display: block; border: 0; max-width: 100%; overflow: visible; zoom: 1; }
+.ui-navbar li .ui-btn { display: block; text-align: center; margin: 0 -1px 0 0; border-right-width: 0; }
+.ui-navbar li .ui-btn-icon-right .ui-icon { right: 6px; }
+/* add border if not in header/footer (full width) */
+.ui-navbar li:last-child .ui-btn,
+.ui-navbar .ui-grid-duo .ui-block-b .ui-btn { margin-right: 0; border-right-width: 1px; }
+.ui-header .ui-navbar li:last-child .ui-btn,
+.ui-footer .ui-navbar li:last-child .ui-btn,
+.ui-header .ui-navbar .ui-grid-duo .ui-block-b .ui-btn,
+.ui-footer .ui-navbar .ui-grid-duo .ui-block-b .ui-btn { margin-right: -1px; border-right-width: 0; }
+.ui-navbar .ui-grid-duo li.ui-block-a:last-child .ui-btn { margin-right: -1px; border-right-width: 1px; }
+.ui-header .ui-navbar li .ui-btn,
+.ui-footer .ui-navbar li .ui-btn { border-top-width: 0; border-bottom-width: 0; }
+/* fixing gaps caused by subpixel problem */
+.ui-header .ui-navbar .ui-grid-b li.ui-block-c .ui-btn,
+.ui-footer .ui-navbar .ui-grid-b li.ui-block-c .ui-btn { margin-right: -5px; }
+.ui-header .ui-navbar .ui-grid-c li.ui-block-d .ui-btn,
+.ui-footer .ui-navbar .ui-grid-c li.ui-block-d .ui-btn,
+.ui-header .ui-navbar .ui-grid-d li.ui-block-e .ui-btn,
+.ui-footer .ui-navbar .ui-grid-d li.ui-block-e .ui-btn { margin-right: -4px; }
+.ui-header .ui-navbar .ui-grid-b li.ui-block-c .ui-btn-icon-right .ui-icon,
+.ui-footer .ui-navbar .ui-grid-b li.ui-block-c .ui-btn-icon-right .ui-icon,
+.ui-header .ui-navbar .ui-grid-c li.ui-block-d .ui-btn-icon-right .ui-icon,
+.ui-footer .ui-navbar .ui-grid-c li.ui-block-d .ui-btn-icon-right .ui-icon,
+.ui-header .ui-navbar .ui-grid-d li.ui-block-e .ui-btn-icon-right .ui-icon,
+.ui-footer .ui-navbar .ui-grid-d li.ui-block-e .ui-btn-icon-right .ui-icon { right: 8px; }
+.ui-navbar li .ui-btn .ui-btn-inner { padding-top: .7em; padding-bottom: .8em }
+.ui-navbar li .ui-btn-icon-top .ui-btn-inner { padding-top: 30px; }
+.ui-navbar li .ui-btn-icon-bottom .ui-btn-inner { padding-bottom: 30px; }
+.ui-btn { display: block; text-align: center; cursor:pointer; position: relative; margin: .5em 0; padding: 0; }
+.ui-mini { margin-top: .25em; margin-bottom: .25em; }
+.ui-btn-left, .ui-btn-right, .ui-input-clear, .ui-btn-inline,
+.ui-grid-a .ui-btn, .ui-grid-b .ui-btn, .ui-grid-c .ui-btn, .ui-grid-d .ui-btn, .ui-grid-e .ui-btn, .ui-grid-solo .ui-btn { margin-right: 5px; margin-left: 5px; }
+.ui-btn-inner { font-size: 16px; padding: .6em 20px; min-width: .75em; display: block; position: relative; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; zoom: 1; }
+.ui-btn input, .ui-btn button { z-index: 2; }
+.ui-btn-left, .ui-btn-right, .ui-btn-inline { display: inline-block; vertical-align: middle; }
+.ui-mobile .ui-btn-left, .ui-mobile .ui-btn-right { margin: 0; } /* .ui-mobile to increase specificity level */
+.ui-btn-block { display: block; }
+.ui-header > .ui-btn,
+.ui-footer > .ui-btn { display: inline-block; margin: 0; }
+.ui-header .ui-btn-block,
+.ui-footer .ui-btn-block { display: block; }
+.ui-header .ui-btn-inner,
+.ui-footer .ui-btn-inner,
+.ui-mini .ui-btn-inner { font-size: 12.5px; padding: .55em 11px .5em; }
+.ui-fullsize .ui-btn-inner,
+.ui-fullsize .ui-btn-inner { font-size: 16px; padding: .6em 20px; }
+.ui-btn-icon-notext { width: 24px; height: 24px; }
+.ui-btn-icon-notext .ui-btn-inner { padding: 0; height: 100%; }
+.ui-btn-icon-notext .ui-btn-inner .ui-icon { margin: 2px 1px 2px 3px; float: left; }
+.ui-btn-text { position: relative; z-index: 1; width: 100%; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none; }
+.ui-btn-icon-notext .ui-btn-text { position: absolute; left: -9999px; }
+.ui-btn-icon-left .ui-btn-inner { padding-left: 40px; }
+.ui-btn-icon-right .ui-btn-inner { padding-right: 40px; }
+.ui-btn-icon-top .ui-btn-inner { padding-top: 40px; }
+.ui-btn-icon-bottom .ui-btn-inner { padding-bottom: 40px; }
+.ui-header .ui-btn-icon-left .ui-btn-inner,
+.ui-footer .ui-btn-icon-left .ui-btn-inner,
+.ui-mini.ui-btn-icon-left .ui-btn-inner,
+.ui-mini .ui-btn-icon-left .ui-btn-inner { padding-left: 30px; }
+.ui-header .ui-btn-icon-right .ui-btn-inner,
+.ui-footer .ui-btn-icon-right .ui-btn-inner,
+.ui-mini.ui-btn-icon-right .ui-btn-inner,
+.ui-mini .ui-btn-icon-right .ui-btn-inner { padding-right: 30px; }
+.ui-header .ui-btn-icon-top .ui-btn-inner,
+.ui-footer .ui-btn-icon-top .ui-btn-inner { padding: 30px 3px .5em 3px; }
+.ui-mini.ui-btn-icon-top .ui-btn-inner,
+.ui-mini .ui-btn-icon-top .ui-btn-inner { padding-top: 30px; }
+.ui-header .ui-btn-icon-bottom .ui-btn-inner,
+.ui-footer .ui-btn-icon-bottom .ui-btn-inner { padding: .55em 3px 30px 3px; }
+.ui-mini.ui-btn-icon-bottom .ui-btn-inner,
+.ui-mini .ui-btn-icon-bottom .ui-btn-inner { padding-bottom: 30px; }
+/*btn icon positioning*/
+.ui-btn-icon-notext .ui-icon { display: block; z-index: 0;}
+.ui-btn-icon-left > .ui-btn-inner > .ui-icon, .ui-btn-icon-right > .ui-btn-inner > .ui-icon { position: absolute; top: 50%; margin-top: -9px; }
+.ui-btn-icon-top .ui-btn-inner .ui-icon, .ui-btn-icon-bottom .ui-btn-inner .ui-icon { position: absolute; left: 50%; margin-left: -9px; }
+.ui-btn-icon-left .ui-icon { left: 10px; }
+.ui-btn-icon-right .ui-icon { right: 10px; }
+.ui-btn-icon-top .ui-icon { top: 10px; }
+.ui-btn-icon-bottom .ui-icon { top: auto; bottom: 10px; }
+.ui-header .ui-btn-icon-left .ui-icon,
+.ui-footer .ui-btn-icon-left .ui-icon,
+.ui-mini.ui-btn-icon-left .ui-icon,
+.ui-mini .ui-btn-icon-left .ui-icon { left: 5px; }
+.ui-header .ui-btn-icon-right .ui-icon,
+.ui-footer .ui-btn-icon-right .ui-icon,
+.ui-mini.ui-btn-icon-right .ui-icon,
+.ui-mini .ui-btn-icon-right .ui-icon { right: 5px; }
+.ui-header .ui-btn-icon-top .ui-icon,
+.ui-footer .ui-btn-icon-top .ui-icon,
+.ui-mini.ui-btn-icon-top .ui-icon,
+.ui-mini .ui-btn-icon-top .ui-icon { top: 5px; }
+.ui-header .ui-btn-icon-bottom .ui-icon,
+.ui-footer .ui-btn-icon-bottom .ui-icon,
+.ui-mini.ui-btn-icon-bottom .ui-icon,
+.ui-mini .ui-btn-icon-bottom .ui-icon { bottom: 5px; }
+/*hiding native button,inputs */
+.ui-btn-hidden { position: absolute; top: 0; left: 0; width: 100%; height: 100%; -webkit-appearance: none; cursor: pointer; background: #fff; background: rgba(255,255,255,0); filter: Alpha(Opacity=0); opacity: .1; font-size: 1px; border: none; text-indent: -9999px; }
+/* Fixes IE/WP filter alpha opacity bugs */
+.ui-disabled .ui-btn-hidden { display: none; }
+.ui-disabled { z-index: 1; }
+.ui-field-contain .ui-btn.ui-submit { margin: 0; }
+label.ui-submit { font-size: 16px; line-height: 1.4; font-weight: normal; margin: 0 0 .3em; display: block; }
+@media all and (min-width: 450px){
+ .ui-field-contain label.ui-submit { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0; }
+ .ui-field-contain .ui-btn.ui-submit { width: 78%; display: inline-block; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; -ms-box-sizing: border-box; box-sizing: border-box; }
+ .ui-hide-label .ui-btn.ui-submit { width: auto; display: block; }
+}
+.ui-collapsible-inset { margin: .5em 0; }
+.ui-collapsible-heading { font-size: 16px; display: block; margin: 0 -15px; padding: 0; position: relative; }
+.ui-collapsible-inset .ui-collapsible-heading { margin: 0; }
+.ui-collapsible-heading .ui-btn { text-align: left; margin: 0; border-left-width: 0; border-right-width: 0; }
+.ui-collapsible-inset .ui-collapsible-heading .ui-btn { border-right-width: 1px; border-left-width: 1px; }
+.ui-collapsible-collapsed + .ui-collapsible:not(.ui-collapsible-inset) .ui-collapsible-heading .ui-btn { border-top-width: 0; }
+.ui-collapsible-set .ui-collapsible:not(.ui-collapsible-inset) .ui-collapsible-heading .ui-btn { border-top-width: 1px; }
+.ui-collapsible-heading .ui-btn-inner,
+.ui-collapsible-heading .ui-btn-icon-left .ui-btn-inner { padding-left: 40px; }
+.ui-collapsible-heading .ui-btn-icon-right .ui-btn-inner { padding-left: 12px; padding-right: 40px; }
+.ui-collapsible-heading .ui-btn-icon-top .ui-btn-inner,
+.ui-collapsible-heading .ui-btn-icon-bottom .ui-btn-inner { padding-right: 40px; text-align: center; }
+.ui-collapsible-heading .ui-btn span.ui-btn { position: absolute; left: 6px; top: 50%; margin: -12px 0 0 0; width: 20px; height: 20px; padding: 1px 0px 1px 2px; text-indent: -9999px; }
+.ui-collapsible-heading .ui-btn span.ui-btn .ui-btn-inner { padding: 10px 0; }
+.ui-collapsible-heading .ui-btn span.ui-btn .ui-icon { left: 0; margin-top: -10px; }
+.ui-collapsible-heading-status { position: absolute; top: -9999px; left:0px; }
+.ui-collapsible-content {
+ display: block;
+ margin: 0 -15px;
+ padding: 10px 15px;
+ border-left-width: 0;
+ border-right-width: 0;
+ border-top: none; /* Overrides ui-body-* */
+ background-image: none; /* Overrides ui-body-* */
+}
+.ui-collapsible-inset .ui-collapsible-content { margin: 0; border-right-width: 1px; border-left-width: 1px; }
+.ui-collapsible-content-collapsed { display: none; }
+.ui-collapsible-set { margin: .5em 0; }
+.ui-collapsible-set .ui-collapsible { margin: -1px 0 0; }
+.ui-collapsible-set .ui-collapsible:first-child { margin-top: 0; }
+.ui-controlgroup, fieldset.ui-controlgroup { padding: 0; margin: .5em 0; zoom: 1; }
+.ui-controlgroup.ui-mini, fieldset.ui-controlgroup.ui-mini { margin: .25em 0; }
+.ui-field-contain .ui-controlgroup, .ui-field-contain fieldset.ui-controlgroup { margin: 0; }
+.ui-bar .ui-controlgroup { margin: 0 5px; }
+.ui-controlgroup-label { font-size: 16px; line-height: 1.4; font-weight: normal; margin: 0 0 .4em; }
+.ui-controlgroup li { list-style: none; }
+.ui-controlgroup-vertical .ui-btn,
+.ui-controlgroup-vertical .ui-checkbox, .ui-controlgroup-vertical .ui-radio { margin: 0; border-bottom-width: 0; }
+.ui-controlgroup-vertical .ui-controlgroup-last { border-bottom-width: 1px; }
+.ui-controlgroup-controls label.ui-select { position: absolute; left: -9999px; }
+.ui-controlgroup .ui-btn-icon-notext { width: auto; height: auto; top: auto; }
+.ui-controlgroup .ui-btn-icon-notext .ui-btn-inner { height: 20px; padding: .6em 20px .6em 20px }
+.ui-controlgroup-horizontal .ui-btn-icon-notext .ui-btn-inner { width: 18px; }
+.ui-controlgroup.ui-mini .ui-btn-icon-notext .ui-btn-inner,
+.ui-header .ui-controlgroup .ui-btn-icon-notext .ui-btn-inner,
+.ui-footer .ui-controlgroup .ui-btn-icon-notext .ui-btn-inner { height: 16px; padding: .55em 11px .5em 11px; }
+.ui-controlgroup .ui-btn-icon-notext .ui-btn-inner .ui-icon { position: absolute; top: 50%; right: 50%; margin: -9px -9px 0 0; }
+.ui-controlgroup-horizontal .ui-controlgroup-controls:before,
+.ui-controlgroup-horizontal .ui-controlgroup-controls:after { content: ""; display: table; }
+.ui-controlgroup-horizontal .ui-controlgroup-controls:after { clear: both; }
+.ui-controlgroup-horizontal .ui-controlgroup-controls { display: inline-block; vertical-align: middle; zoom: 1; }
+.ui-controlgroup-horizontal .ui-btn-inner { text-align: center; }
+.ui-controlgroup-horizontal.ui-mini .ui-btn-inner { height: 16px; line-height: 16px; }
+.ui-controlgroup-horizontal .ui-btn, .ui-controlgroup-horizontal .ui-select,
+.ui-controlgroup-horizontal .ui-checkbox, .ui-controlgroup-horizontal .ui-radio { float: left; clear: none; margin: 0 -1px 0 0; }
+.ui-controlgroup-horizontal .ui-select .ui-btn,
+.ui-controlgroup-horizontal .ui-checkbox .ui-btn, .ui-controlgroup-horizontal .ui-radio .ui-btn { float: none; margin: 0; }
+.ui-controlgroup-horizontal .ui-controlgroup-last, .ui-controlgroup-horizontal .ui-select:last-child,
+.ui-controlgroup-horizontal .ui-checkbox:last-child, .ui-controlgroup-horizontal .ui-radio:last-child { margin-right: 0; }
+.ui-controlgroup .ui-checkbox label, .ui-controlgroup .ui-radio label { font-size: 16px; }
+@media all and (min-width: 450px){
+ .ui-field-contain .ui-controlgroup-label { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0; }
+ .ui-field-contain .ui-controlgroup-controls { width: 78%; display: inline-block; }
+ .ui-field-contain .ui-controlgroup .ui-select { width: 100%; display: block; }
+ .ui-field-contain .ui-controlgroup-horizontal .ui-select { width: auto; }
+ .ui-hide-label .ui-controlgroup-controls { width: 100%; }
+}
+.ui-dialog {
+ background: none !important; /* this is to ensure that dialog theming does not apply (by default at least) on the page div */
+}
+.ui-dialog-contain {
+ width: 92.5%;
+ max-width: 500px;
+ margin: 10% auto 15px auto;
+ padding: 0;
+ position: relative;
+ top: -15px;
+}
+.ui-dialog-contain > .ui-header,
+.ui-dialog-contain > .ui-content,
+.ui-dialog-contain > .ui-footer {
+ display: block;
+ position: relative;
+ width: auto;
+ margin: 0;
+}
+.ui-dialog-contain > .ui-header {
+ border: none;
+ overflow: hidden;
+ z-index: 10;
+ padding: 0;
+}
+.ui-dialog-contain > .ui-content {
+ padding: 15px;
+}
+.ui-dialog-contain > .ui-footer {
+ z-index: 10;
+ padding: 0 15px;
+}
+.ui-popup-open .ui-header-fixed,
+.ui-popup-open .ui-footer-fixed {
+ position: absolute !important; /* See line #553 of popup.js */
+}
+.ui-popup-screen {
+ background-image: url(data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==); /* Necessary to set some form of background to ensure element is clickable in IE6/7. While legacy IE won't understand the data-URI'd image, it ensures no additional requests occur in all other browsers with little overhead. */
+ top: 0px;
+ left: 0px;
+ right: 0px;
+ bottom: 1px;
+ position: absolute;
+ filter: Alpha(Opacity=0);
+ opacity: 0;
+ z-index: 1099;
+}
+.ui-popup-screen.in {
+ opacity: 0.5;
+ filter: Alpha(Opacity=50);
+}
+.ui-popup-screen.out {
+ opacity: 0;
+ filter: Alpha(Opacity=0);
+}
+.ui-popup-container {
+ z-index: 1100;
+ display: inline-block;
+ position: absolute;
+ padding: 0;
+ outline: 0;
+}
+.ui-popup {
+ position: relative;
+}
+.ui-popup.ui-content,
+.ui-popup .ui-content {
+ overflow: visible;
+}
+.ui-popup > p,
+.ui-popup > h1,
+.ui-popup > h2,
+.ui-popup > h3,
+.ui-popup > h4,
+.ui-popup > h5,
+.ui-popup > h6 {
+ margin: .5em 7px;
+}
+.ui-popup > span {
+ display: block;
+ margin: .5em 7px;
+}
+.ui-popup .ui-title {
+ font-size: 16px;
+ font-weight: bold;
+ margin-top: .5em;
+ margin-bottom: .5em;
+}
+.ui-popup-container .ui-content > p,
+.ui-popup-container .ui-content > h1,
+.ui-popup-container .ui-content > h2,
+.ui-popup-container .ui-content > h3,
+.ui-popup-container .ui-content > h4,
+.ui-popup-container .ui-content > h5,
+.ui-popup-container .ui-content > h6 {
+ margin: .5em 0;
+}
+.ui-popup-container .ui-content > span {
+ margin: 0;
+}
+.ui-popup-container .ui-content > p:first-child,
+.ui-popup-container .ui-content > h1:first-child,
+.ui-popup-container .ui-content > h2:first-child,
+.ui-popup-container .ui-content > h3:first-child,
+.ui-popup-container .ui-content > h4:first-child,
+.ui-popup-container .ui-content > h5:first-child,
+.ui-popup-container .ui-content > h6:first-child {
+ margin-top: 0;
+}
+.ui-popup-container .ui-content > p:last-child,
+.ui-popup-container .ui-content > h1:last-child,
+.ui-popup-container .ui-content > h2:last-child,
+.ui-popup-container .ui-content > h3:last-child,
+.ui-popup-container .ui-content > h4:last-child,
+.ui-popup-container .ui-content > h5:last-child,
+.ui-popup-container .ui-content > h6:last-child {
+ margin-bottom: 0;
+}
+.ui-popup > img {
+ width: auto;
+ height: auto;
+ max-width: 100%;
+ max-height: 100%;
+ vertical-align: middle;
+}
+.ui-popup iframe {
+ vertical-align: middle;
+}
+@media all and (min-width: 450px){
+ .ui-popup .ui-field-contain label.ui-submit,
+ .ui-popup .ui-field-contain .ui-controlgroup-label,
+ .ui-popup .ui-field-contain label.ui-select,
+ .ui-popup .ui-field-contain label.ui-input-text {
+ font-size: 16px; line-height: 1.4; display: block; font-weight: normal; margin: 0 0 .3em;
+ }
+ .ui-popup .ui-field-contain .ui-btn.ui-submit,
+ .ui-popup .ui-field-contain .ui-controlgroup-controls,
+ .ui-popup .ui-field-contain .ui-select,
+ .ui-popup .ui-field-contain input.ui-input-text,
+ .ui-popup .ui-field-contain textarea.ui-input-text,
+ .ui-popup .ui-field-contain .ui-input-search {
+ width: 100%; display: block;
+ }
+}
+.ui-popup > .ui-btn-left,
+.ui-popup > .ui-btn-right {
+ position: absolute;
+ top: -9px;
+ margin: 0;
+ z-index: 1101;
+}
+.ui-popup > .ui-btn-left { left: -9px; }
+.ui-popup > .ui-btn-right { right: -9px; }
+.ui-popup.ui-corner-all > .ui-header,
+.ui-popup.ui-corner-all ~ .ui-content,
+.ui-popup.ui-corner-all > .ui-content:first-child {
+ -webkit-border-top-left-radius: inherit;
+ border-top-left-radius: inherit;
+ -webkit-border-top-right-radius: inherit;
+ border-top-right-radius: inherit;
+}
+.ui-popup.ui-corner-all > .ui-content,
+.ui-popup.ui-corner-all > .ui-footer,
+.ui-popup.ui-corner-all > .ui-header:nth-child(n):last-child {
+ -webkit-border-bottom-left-radius: inherit;
+ border-bottom-left-radius: inherit;
+ -webkit-border-bottom-right-radius: inherit;
+ border-bottom-right-radius: inherit;
+}
+.ui-popup.ui-corner-all > .ui-content:nth-child(2),
+.ui-popup.ui-corner-all > .ui-header:nth-child(2) {
+ -webkit-border-top-left-radius: 0;
+ border-top-left-radius: 0;
+ -webkit-border-top-right-radius: 0;
+ border-top-right-radius: 0;
+}
+.ui-popup.ui-corner-all > .ui-content:nth-last-child(1n+2),
+.ui-popup.ui-corner-all > .ui-footer:nth-last-child(1n+2) {
+ -webkit-border-bottom-left-radius: 0;
+ border-bottom-left-radius: 0;
+ -webkit-border-bottom-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.ui-popup.ui-corner-all > .ui-header:only-child,
+.ui-popup.ui-corner-all > .ui-footer:only-child {
+ -webkit-border-radius: inherit;
+ border-radius: inherit;
+}
+.ui-checkbox, .ui-radio { position: relative; clear: both; margin: 0; z-index: 1; }
+.ui-checkbox .ui-btn, .ui-radio .ui-btn { margin-top: .5em; margin-bottom: .5em; text-align: left; z-index: 2; }
+.ui-checkbox .ui-btn.ui-mini, .ui-radio .ui-btn.ui-mini { margin: .25em 0; }
+.ui-controlgroup .ui-checkbox .ui-btn, .ui-controlgroup .ui-radio .ui-btn { margin: 0; }
+.ui-checkbox .ui-btn-inner, .ui-radio .ui-btn-inner { white-space: normal; }
+.ui-checkbox .ui-btn-icon-left .ui-btn-inner,.ui-radio .ui-btn-icon-left .ui-btn-inner { padding-left: 45px; }
+.ui-checkbox .ui-mini.ui-btn-icon-left .ui-btn-inner,.ui-radio .ui-mini.ui-btn-icon-left .ui-btn-inner { padding-left: 36px; }
+.ui-checkbox .ui-btn-icon-right .ui-btn-inner, .ui-radio .ui-btn-icon-right .ui-btn-inner { padding-right: 45px; }
+.ui-checkbox .ui-mini.ui-btn-icon-right .ui-btn-inner, .ui-radio .ui-mini.ui-btn-icon-right .ui-btn-inner { padding-right: 36px; }
+.ui-checkbox .ui-btn-icon-top .ui-btn-inner,.ui-radio .ui-btn-icon-top .ui-btn-inner { padding-right: 0; padding-left: 0; text-align: center; }
+.ui-checkbox .ui-btn-icon-bottom .ui-btn-inner, .ui-radio .ui-btn-icon-bottom .ui-btn-inner { padding-right: 0; padding-left: 0; text-align: center; }
+.ui-checkbox .ui-icon, .ui-radio .ui-icon { top: 1.1em; }
+.ui-checkbox .ui-btn-icon-left .ui-icon, .ui-radio .ui-btn-icon-left .ui-icon { left: 15px; }
+.ui-checkbox .ui-mini.ui-btn-icon-left .ui-icon, .ui-radio .ui-mini.ui-btn-icon-left .ui-icon { left: 9px; }
+.ui-checkbox .ui-btn-icon-right .ui-icon, .ui-radio .ui-btn-icon-right .ui-icon { right: 15px; }
+.ui-checkbox .ui-mini.ui-btn-icon-right .ui-icon, .ui-radio .ui-mini.ui-btn-icon-right .ui-icon { right: 9px; }
+.ui-checkbox .ui-btn-icon-top .ui-icon, .ui-radio .ui-btn-icon-top .ui-icon { top: 10px; }
+.ui-checkbox .ui-btn-icon-bottom .ui-icon, .ui-radio .ui-btn-icon-bottom .ui-icon { top: auto; bottom: 10px; }
+.ui-checkbox .ui-btn-icon-right .ui-icon, .ui-radio .ui-btn-icon-right .ui-icon { right: 15px; }
+.ui-checkbox .ui-mini.ui-btn-icon-right .ui-icon, .ui-radio .ui-mini.ui-btn-icon-right .ui-icon { right: 9px; }
+/* input, label positioning */
+.ui-checkbox input,.ui-radio input { position:absolute; left:20px; top:50%; width: 10px; height: 10px; margin:-5px 0 0 0; outline: 0 !important; z-index: 1; }
+.ui-field-contain, fieldset.ui-field-contain { padding: .8em 0; margin: 0; border-width: 0 0 1px 0; overflow: visible; }
+.ui-field-contain:last-child { border-bottom-width: 0; }
+.ui-field-contain { max-width: 100%; } /* This prevents horizontal scrollbar in IE7 */
+@media all and (min-width: 450px){
+ .ui-field-contain, .ui-mobile fieldset.ui-field-contain { border-width: 0; padding: 0; margin: 1em 0; }
+}
+.ui-select { display: block; position: relative; }
+.ui-select select { position: absolute; left: -9999px; top: -9999px; }
+.ui-select .ui-btn { overflow: hidden; opacity: 1; }
+.ui-field-contain .ui-select .ui-btn { margin: 0; }
+/* Fixes #2588: When Windows Phone 7.5 (Mango) tries to calculate a numeric opacity for a select (including "inherit") without explicitly specifying an opacity on the parent to give it context, a bug appears where clicking elsewhere on the page after opening the select will open the select again. */
+.ui-select .ui-btn select { cursor: pointer; -webkit-appearance: none; left: 0; top:0; width: 100%; min-height: 1.5em; min-height: 100%; height: 3em; max-height: 100%; filter: Alpha(Opacity=0); opacity: 0; z-index: 2; }
+.ui-select .ui-disabled { opacity: .3; }
+/* Display none because of issues with IE/WP's filter alpha opacity */
+.ui-select .ui-disabled select { display: none; }
+@-moz-document url-prefix() { .ui-select .ui-btn select { opacity: 0.0001; }}
+.ui-select .ui-btn.ui-select-nativeonly { border-radius: 0; border: 0; }
+.ui-select .ui-btn.ui-select-nativeonly select { opacity: 1; text-indent: 0; display: block; }
+.ui-select .ui-disabled.ui-select-nativeonly .ui-btn-inner { opacity: 0; }
+.ui-select .ui-btn-icon-right .ui-btn-inner, .ui-select .ui-li-has-count .ui-btn-inner { padding-right: 45px; }
+.ui-select .ui-mini.ui-btn-icon-right .ui-btn-inner { padding-right: 32px; }
+.ui-select .ui-btn-icon-right.ui-li-has-count .ui-btn-inner { padding-right: 80px; }
+.ui-select .ui-mini.ui-btn-icon-right.ui-li-has-count .ui-btn-inner { padding-right: 67px; }
+.ui-select .ui-btn-icon-right .ui-icon { right: 15px; }
+.ui-select .ui-mini.ui-btn-icon-right .ui-icon { right: 7px; }
+.ui-select .ui-btn-icon-right.ui-li-has-count .ui-li-count { right: 45px; }
+.ui-select .ui-mini.ui-btn-icon-right.ui-li-has-count .ui-li-count { right: 32px; }
+/* labels */
+label.ui-select { font-size: 16px; line-height: 1.4; font-weight: normal; margin: 0 0 .3em; display: block; }
+/*listbox*/
+.ui-select .ui-btn-text, .ui-selectmenu .ui-btn-text { display: block; min-height: 1em; overflow: hidden !important;
+/* This !important is required for iPad Safari specifically. See https://github.com/jquery/jquery-mobile/issues/2647 */ }
+.ui-select .ui-btn-text { text-overflow: ellipsis; }
+.ui-selectmenu { padding: 6px; min-width: 160px; }
+.ui-selectmenu .ui-listview { margin: 0; }
+.ui-selectmenu .ui-btn.ui-li-divider { cursor: default; }
+.ui-selectmenu-hidden { top: -99999px; left: -9999px; }
+.ui-screen-hidden, .ui-selectmenu-list .ui-li .ui-icon { display: none; }
+.ui-selectmenu-list .ui-li .ui-icon { display: block; }
+.ui-li.ui-selectmenu-placeholder { display: none; }
+.ui-selectmenu .ui-header { margin: 0; padding: 0; }
+.ui-selectmenu .ui-header .ui-title { margin: 0.6em 46px 0.8em; }
+@media all and (min-width: 450px){
+ .ui-field-contain label.ui-select { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0; }
+ .ui-field-contain .ui-select { width: 78%; display: inline-block; }
+ .ui-hide-label .ui-select { width: 100%; }
+}
+/* when no placeholder is defined in a multiple select, the header height doesn't even extend past the close button. this shim's content in there */
+.ui-selectmenu .ui-header h1:after { content: '.'; visibility: hidden; }
+label.ui-input-text { font-size: 16px; line-height: 1.4; display: block; font-weight: normal; margin: 0 0 .3em; }
+input.ui-input-text, textarea.ui-input-text { background-image: none; padding: .4em; margin: .5em 0; line-height: 1.4; font-size: 16px; display: block; width: 100%; outline: 0; }
+input.ui-input-text.ui-mini, textarea.ui-input-text.ui-mini { margin: .25em 0; }
+.ui-field-contain input.ui-input-text, .ui-field-contain textarea.ui-input-text { margin: 0; }
+input.ui-input-text, textarea.ui-input-text, .ui-input-search { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; -ms-box-sizing: border-box; box-sizing: border-box; }
+input.ui-input-text { -webkit-appearance: none; }
+textarea.ui-input-text { height: 50px; -webkit-transition: height 200ms linear; -moz-transition: height 200ms linear; -o-transition: height 200ms linear; transition: height 200ms linear; }
+.ui-input-search { padding: 0 30px; margin: .5em 0; background-image: none; position: relative; }
+.ui-input-search.ui-mini { margin: .25em 0; }
+.ui-field-contain .ui-input-search { margin: 0; }
+.ui-icon-searchfield:after { position: absolute; left: 7px; top: 50%; margin-top: -9px; content: ""; width: 18px; height: 18px; opacity: .5; }
+.ui-input-search input.ui-input-text { border: none; width: 98%; padding: .4em 0; margin: 0; display: block; background: transparent none; outline: 0 !important; }
+.ui-input-search .ui-input-clear { position: absolute; right: 0; top: 50%; margin-top: -13px; }
+.ui-mini .ui-input-clear { right: -3px; }
+.ui-input-search .ui-input-clear-hidden { display: none; }
+input.ui-mini, .ui-mini input, textarea.ui-mini { font-size: 14px; }
+textarea.ui-mini { height: 45px; }
+@media all and (min-width: 450px){
+ .ui-field-contain label.ui-input-text { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0 }
+ .ui-field-contain input.ui-input-text,
+ .ui-field-contain textarea.ui-input-text,
+ .ui-field-contain .ui-input-search { width: 78%; display: inline-block; }
+ .ui-hide-label input.ui-input-text,
+ .ui-hide-label textarea.ui-input-text,
+ .ui-hide-label .ui-input-search { width: 100%; }
+ .ui-input-search input.ui-input-text { width: 98%; /*echos rule from above*/ }
+}
+.ui-listview { margin: 0; }
+ol.ui-listview, ol.ui-listview .ui-li-divider { counter-reset: listnumbering; }
+.ui-content .ui-listview { margin: -15px; }
+.ui-collapsible-content > .ui-listview { margin: -10px -15px; }
+.ui-content .ui-listview-inset { margin: 1em 0; }
+.ui-collapsible-content .ui-listview-inset { margin: .5em 0; }
+.ui-listview, .ui-li { list-style:none; padding:0; }
+.ui-li, .ui-li.ui-field-contain { display: block; margin:0; position: relative; overflow: visible; text-align: left; border-width: 0; border-top-width: 1px; }
+.ui-li.ui-btn { margin: 0; }
+.ui-li .ui-btn-text a.ui-link-inherit { text-overflow: ellipsis; overflow: hidden; white-space: nowrap; }
+.ui-li-static { background-image: none; }
+.ui-li-divider { padding: .5em 15px; font-size: 14px; font-weight: bold; }
+ol.ui-listview .ui-link-inherit:before, ol.ui-listview .ui-li-static:before, .ui-li-dec { font-size: .8em; display: inline-block; padding-right: .3em; font-weight: normal; counter-increment: listnumbering; content: counter(listnumbering) ". "; }
+ol.ui-listview .ui-li-jsnumbering:before { content: "" !important; } /* to avoid chance of duplication */
+.ui-listview-inset .ui-li { border-right-width: 1px; border-left-width: 1px; }
+.ui-li-last, .ui-li.ui-field-contain.ui-li-last { border-bottom-width: 1px; }
+.ui-collapsible [class*="ui-body"] > .ui-listview:not(.ui-listview-inset) .ui-li-last { border-bottom-width: 0; }
+.ui-collapsible-content > .ui-listview:not(.ui-listview-inset) .ui-li:first-child { border-top-width: 0; }
+.ui-collapsible-content > .ui-listview:not(.ui-listview-inset),
+.ui-collapsible-content > .ui-listview:not(.ui-listview-inset) .ui-li-last { -webkit-border-bottom-left-radius: inherit; -webkit-border-bottom-right-radius: inherit; border-bottom-left-radius: inherit; border-bottom-right-radius: inherit; }
+.ui-collapsible-content > .ui-listview:not(.ui-listview-inset) .ui-li-last .ui-li-link-alt { -webkit-border-bottom-right-radius: inherit; border-bottom-right-radius: inherit; }
+.ui-li>.ui-btn-inner { display: block; position: relative; padding: 0; }
+.ui-li .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li { padding: .7em 15px; display: block; }
+.ui-li-has-thumb .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-thumb { min-height: 60px; padding-left: 100px; }
+.ui-li-has-icon .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-icon { min-height: 20px; padding-left: 40px; }
+.ui-li-has-count .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-count, .ui-li-divider.ui-li-has-count { padding-right: 45px; }
+.ui-li-has-arrow .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-arrow { padding-right: 40px; }
+.ui-li-has-arrow.ui-li-has-count .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-arrow.ui-li-has-count { padding-right: 75px; }
+.ui-li-heading { font-size: 16px; font-weight: bold; display: block; margin: .6em 0; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; }
+.ui-li-desc { font-size: 12px; font-weight: normal; display: block; margin: -.5em 0 .6em; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; }
+.ui-li-thumb, .ui-listview .ui-li-icon { position: absolute; left: 1px; top: 0; max-height: 80px; max-width: 80px; }
+.ui-listview .ui-li-icon { max-height: 16px; max-width: 16px; left: 10px; top: .9em; }
+.ui-li-thumb, .ui-listview .ui-li-icon, .ui-li-content { float: left; margin-right: 10px; }
+.ui-li-aside { float: right; width: 50%; text-align: right; margin: .3em 0; }
+@media all and (min-width: 480px){
+ .ui-li-aside { width: 45%; }
+}
+.ui-li-divider { cursor: default; }
+.ui-li-has-alt .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-alt { padding-right: 53px; }
+.ui-li-has-alt.ui-li-has-count .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-alt.ui-li-has-count { padding-right: 88px; }
+.ui-li-has-count .ui-li-count { position: absolute; font-size: 11px; font-weight: bold; padding: .2em .5em; top: 50%; margin-top: -.9em; right: 10px; }
+.ui-li-has-count.ui-li-divider .ui-li-count, .ui-li-has-count .ui-link-inherit .ui-li-count { margin-top: -.95em; }
+.ui-li-has-arrow.ui-li-has-count .ui-li-count { right: 40px; }
+.ui-li-has-alt.ui-li-has-count .ui-li-count { right: 53px; }
+.ui-li-link-alt { position: absolute; width: 40px; height: 100%; border-width: 0; border-left-width: 1px; top: 0; right: 0; margin: 0; padding: 0; z-index: 2; }
+.ui-li-link-alt .ui-btn { overflow: hidden; position: absolute; right: 8px; top: 50%; margin: -13px 0 0 0; border-bottom-width: 1px; z-index: -1;}
+.ui-li-link-alt .ui-btn-inner { padding: 0; height: 100%; position: absolute; width: 100%; top: 0; left: 0;}
+.ui-li-link-alt .ui-btn .ui-icon { right: 50%; margin-right: -9px; }
+.ui-li-link-alt .ui-btn-icon-notext .ui-btn-inner .ui-icon { position: absolute; top: 50%; margin-top: -9px; }
+.ui-listview * .ui-btn-inner > .ui-btn > .ui-btn-inner { border-top: 0px; }
+.ui-listview-filter { border-width: 0; overflow: hidden; margin: -15px -15px 15px -15px; }
+.ui-collapsible-content .ui-listview-filter { margin: -10px -15px 10px -15px; border-bottom: inherit; }
+.ui-listview-filter-inset { margin: -15px -5px; background: transparent; }
+.ui-collapsible-content .ui-listview-filter-inset { margin: -5px; border-bottom-width: 0; }
+.ui-listview-filter .ui-input-search { margin: 5px; width: auto; display: block; }
+.ui-li.ui-screen-hidden{ display:none; }
+/* Odd iPad positioning issue. */
+@media only screen and (min-device-width: 768px) and (max-device-width: 1024px) {
+ .ui-li .ui-btn-text { overflow: visible; }
+}
+label.ui-slider { font-size: 16px; line-height: 1.4; font-weight: normal; margin: 0 0 .3em; display: block; }
+input.ui-slider-input,
+.ui-field-contain input.ui-slider-input { display: inline-block; width: 50px; background-image: none; padding: .4em; margin: .5em 0; line-height: 1.4; font-size: 16px; outline: 0; }
+input.ui-slider-input.ui-mini,
+.ui-field-contain input.ui-slider-input.ui-mini { width: 45px; margin: .25em 0; font-size: 14px; }
+.ui-field-contain input.ui-slider-input { margin: 0; }
+input.ui-slider-input, .ui-field-contain input.ui-slider-input { -webkit-box-sizing: content-box; -moz-box-sizing: content-box; -ms-box-sizing: content-box; box-sizing: content-box; }
+/* Fixes input fields being to small on Safari/Mac because of the up and down arrows. */
+.ui-slider-input::-webkit-outer-spin-button { margin: 0; }
+select.ui-slider-switch { display: none; }
+div.ui-slider { position: relative; display: inline-block; overflow: visible; height: 15px; padding: 0; margin: 0 2% 0 20px; top: 4px; width: 65%; }
+div.ui-slider-mini { height: 12px; margin-left: 10px; top: 2px; }
+div.ui-slider-bg { border: none; height: 100%; padding-right: 8px; }
+.ui-controlgroup a.ui-slider-handle, a.ui-btn.ui-slider-handle { position: absolute; z-index: 1; top: 50%; width: 28px; height: 28px; margin: -15px 0 0 -15px; outline: 0; }
+a.ui-btn.ui-slider-handle .ui-btn-inner { padding: 0; height: 100%; }
+div.ui-slider-mini a.ui-slider-handle { height: 14px; width: 14px; margin: -8px 0 0 -7px; }
+div.ui-slider-mini a.ui-slider-handle .ui-btn-inner { height: 30px; width: 30px; padding: 0; margin: -9px 0 0 -9px; border-top: none; }
+@media all and (min-width: 450px){
+ .ui-field-contain label.ui-slider { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0; }
+ .ui-field-contain div.ui-slider { width: 43%; }
+ .ui-field-contain div.ui-slider-switch { width: 5.5em; }
+}
+div.ui-slider-switch { height: 32px; margin-left: 0; width: 5.8em; }
+a.ui-slider-handle-snapping { -webkit-transition: left 70ms linear; -moz-transition: left 70ms linear; }
+div.ui-slider-switch .ui-slider-handle { margin: 1px 0 0 -15px; }
+.ui-slider-inneroffset { margin: 0 16px; position: relative; z-index: 1; }
+div.ui-slider-switch.ui-slider-mini { width: 5em; height: 29px; }
+div.ui-slider-switch.ui-slider-mini .ui-slider-inneroffset { margin: 0 15px 0 14px; }
+div.ui-slider-switch.ui-slider-mini .ui-slider-handle { width: 25px; height: 25px; margin: 1px 0 0 -13px; }
+div.ui-slider-switch.ui-slider-mini a.ui-slider-handle .ui-btn-inner { height: 30px; width: 30px; padding: 0; margin: 0; }
+span.ui-slider-label { position: absolute; text-align: center; width: 100%; overflow: hidden; font-size: 16px; top: 0; line-height: 2; min-height: 100%; border-width: 0; white-space: nowrap; }
+.ui-slider-mini span.ui-slider-label { font-size: 14px; }
+span.ui-slider-label-a { z-index: 1; left: 0; text-indent: -1.5em; }
+span.ui-slider-label-b { z-index: 0; right: 0; text-indent: 1.5em;}
+.ui-slider-inline { width: 120px; display: inline-block; }
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Wang, Jing J <jing.j.wang@intel.com>
+ Fan, Yugang <yugang.fan@intel.com>
+
+*/
+.ui-page .ui-content .ui-listview img {
+ position:absolute;
+ top:0;
+ bottom:0;
+ margin:auto;
+}
+
+.ui-page .ui-content .ui-listview h1 {
+ line-height : 45px;
+ vertical-align : middle;
+ white-space : normal;
+}
+
+.ui-li-count {
+ min-width: 30px;
+ text-align: center;
+}
+
+#overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: #000;
+ opacity: 0.6;
+ filter: alpha(opacity=60);
+ z-index:50;
+}
+
+.wgtButton {
+ height:40px;
+ line-height:20px;
+}
+
+.hideButton {
+ display:none;
+}
+
+.fontSize {
+ font-size:85%
+}
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Wang, Jing J <jing.j.wang@intel.com>
+ Lin, Wanming <wanmingx.lin@intel.com>
+ Fan, Yugang <yugang.fan@intel.com>
+ Shentu, Jiazhen <jiazhenx.shentu@intel.com>
+
+-->
+<html>
+<head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width">
+ <link rel="stylesheet" type="text/css" href="css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="css/main.css" />
+ <script src="js/thirdparty/jquery.js"></script>
+ <script src="js/thirdparty/jquery.mobile.js"></script>
+ <script src="js/main.js"></script>
+</head>
+<body>
+<div data-role="page" id="home_ui">
+ <div data-role="header" data-position="fixed" data-tap-toggle="false">
+ <h1 style="width:75%; margin-left:auto; margin-right:auto;">TCT Behavior Test Tool</h1>
+ <a id="version" class="ui-btn-right"></a>
+ </div>
+ <div id="app_selector" data-role="content">
+ <ul data-role="listview" id="mylist" data-mini="true" data-inset="true"></ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false" align="center">
+ <div data-role="controlgroup" data-type="horizontal">
+ <a href="javascript:exportResult();" data-role="button" data-icon="gear">Export</a>
+ <a id="reset" data-role="button" data-icon="refresh">Reset</a>
+ <a href="#popup_exit" data-rel="popup" data-position-to="window" data-role="button" data-inline="true" data-transition="pop" data-icon="back">Exit</a>
+ </div>
+ </div>
+ <div data-role="popup" id="popup_exit" data-overlay-theme="a" data-theme="c" data-dismissible="false" style="max-width:400px;" class="ui-corner-all">
+ <div data-role="header" data-theme="a" class="ui-corner-top">
+ <h1>Reminder</h1>
+ </div>
+ <div data-role="content" data-theme="d" class="ui-corner-bottom ui-content">
+ <h3 class="ui-title">Do you want to save test result before exit?</h3>
+ <a id="exit" data-role="button" data-rel="back" data-theme="c">Yes</a>
+ <a data-role="button" data-rel="back" data-theme="e">No, thanks</a>
+ </div>
+ </div>
+</div>
+<div data-role="page" id="test_ui">
+ <iframe id="test_frame" width="100%" frameborder="no" border="0" src="" allowfullscreen="true"></iframe>
+</div>
+</body>
+</html>
--- /dev/null
+#!/usr/bin/env python
+
+import os
+import shutil
+import glob
+import time
+import sys
+import subprocess
+from optparse import OptionParser, make_option
+
+
+SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
+PARAMETERS = None
+ADB_CMD = "adb"
+
+
+def doCMD(cmd):
+ # Do not need handle timeout in this short script
+ print "-->> \"%s\"" % cmd
+ output = []
+ cmd_proc = subprocess.Popen(
+ cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
+ while True:
+ cmd_return_code = cmd_proc.poll()
+ if cmd_return_code != None:
+ break
+
+ if not cmd.endswith("&"):
+ while True:
+ line = cmd_proc.stdout.readline().strip('\n')
+ print line
+ if not line or line.find("daemon started") >= 0:
+ break
+ output.append(line)
+
+ return (cmd_return_code, output)
+
+
+def uninstPKGs():
+ action_status = True
+ for root, dirs, files in os.walk(SCRIPT_DIR):
+ for file in files:
+ if file.endswith(".apk"):
+ cmd = "%s -s %s uninstall org.xwalk.%s" % (
+ ADB_CMD, PARAMETERS.device, os.path.basename(os.path.splitext(file)[0]))
+ (return_code, output) = doCMD(cmd)
+ for line in output:
+ if "Failure" in line:
+ action_status = False
+ break
+ return action_status
+
+
+def instPKGs():
+ action_status = True
+ for root, dirs, files in os.walk(SCRIPT_DIR):
+ for file in files:
+ if file.endswith(".apk"):
+ cmd = "%s -s %s install %s" % (ADB_CMD,
+ PARAMETERS.device, os.path.join(root, file))
+ (return_code, output) = doCMD(cmd)
+ for line in output:
+ if "Failure" in line:
+ action_status = False
+ break
+ return action_status
+
+
+def main():
+ try:
+ usage = "usage: inst.py -i"
+ opts_parser = OptionParser(usage=usage)
+ opts_parser.add_option(
+ "-s", dest="device", action="store", help="Specify device")
+ opts_parser.add_option(
+ "-i", dest="binstpkg", action="store_true", help="Install package")
+ opts_parser.add_option(
+ "-u", dest="buninstpkg", action="store_true", help="Uninstall package")
+ global PARAMETERS
+ (PARAMETERS, args) = opts_parser.parse_args()
+ except Exception, e:
+ print "Got wrong option: %s, exit ..." % e
+ sys.exit(1)
+
+ if not PARAMETERS.device:
+ (return_code, output) = doCMD("adb devices")
+ for line in output:
+ if str.find(line, "\tdevice") != -1:
+ PARAMETERS.device = line.split("\t")[0]
+ break
+
+ if not PARAMETERS.device:
+ print "No device found"
+ sys.exit(1)
+
+ if PARAMETERS.binstpkg and PARAMETERS.buninstpkg:
+ print "-i and -u are conflict"
+ sys.exit(1)
+
+ if PARAMETERS.buninstpkg:
+ if not uninstPKGs():
+ sys.exit(1)
+ else:
+ if not instPKGs():
+ sys.exit(1)
+
+if __name__ == "__main__":
+ main()
+ sys.exit(0)
--- /dev/null
+#!/usr/bin/env python
+
+import os
+import shutil
+import glob
+import time
+import sys
+import subprocess
+import string
+from optparse import OptionParser, make_option
+
+
+SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
+PKG_NAME = os.path.basename(SCRIPT_DIR)
+PARAMETERS = None
+#XW_ENV = "export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket"
+SRC_DIR = "/home/app/content"
+PKG_SRC_DIR = "%s/tct/opt/%s" % (SRC_DIR, PKG_NAME)
+
+
+def doCMD(cmd):
+ # Do not need handle timeout in this short script, let tool do it
+ print "-->> \"%s\"" % cmd
+ output = []
+ cmd_proc = subprocess.Popen(
+ cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
+ while True:
+ cmd_return_code = cmd_proc.poll()
+ if cmd_return_code != None:
+ break
+
+ if not cmd.endswith("&"):
+ while True:
+ line = cmd_proc.stdout.readline().strip("\r\n")
+ print line
+ if not line or line.find("daemon started") >= 0:
+ break
+ output.append(line)
+
+ return (cmd_return_code, output)
+
+
+def updateCMD(cmd=None):
+ if "pkgcmd" in cmd:
+ cmd = "su - %s -c '%s;%s'" % (PARAMETERS.user, XW_ENV, cmd)
+ return cmd
+def getUSERID():
+ if PARAMETERS.mode == "SDB":
+ cmd = "sdb -s %s shell id -u %s" % (
+ PARAMETERS.device, PARAMETERS.user)
+ else:
+ cmd = "ssh %s \"id -u %s\"" % (
+ PARAMETERS.device, PARAMETERS.user )
+ return doCMD(cmd)
+
+
+def getPKGID(pkg_name=None):
+ if PARAMETERS.mode == "SDB":
+ cmd = "sdb -s %s shell %s" % (
+ PARAMETERS.device, updateCMD('pkgcmd -l'))
+ else:
+ cmd = "ssh %s \"%s\"" % (
+ PARAMETERS.device, updateCMD('pkgcmd -l'))
+
+ (return_code, output) = doCMD(cmd)
+ if return_code != 0:
+ return None
+
+ test_pkg_id = None
+ for line in output:
+ if line.find("[" + pkg_name + "]") != -1:
+ pkgidIndex = line.split().index("pkgid")
+ test_pkg_id = line.split()[pkgidIndex+1].strip("[]")
+ break
+ return test_pkg_id
+
+
+def doRemoteCMD(cmd=None):
+ if PARAMETERS.mode == "SDB":
+ cmd = "sdb -s %s shell %s" % (PARAMETERS.device, updateCMD(cmd))
+ else:
+ cmd = "ssh %s \"%s\"" % (PARAMETERS.device, updateCMD(cmd))
+
+ return doCMD(cmd)
+
+
+def doRemoteCopy(src=None, dest=None):
+ if PARAMETERS.mode == "SDB":
+ cmd_prefix = "sdb -s %s push" % PARAMETERS.device
+ cmd = "%s %s %s" % (cmd_prefix, src, dest)
+ else:
+ cmd = "scp -r %s %s:/%s" % (src, PARAMETERS.device, dest)
+
+ (return_code, output) = doCMD(cmd)
+ doRemoteCMD("sync")
+
+ if return_code != 0:
+ return True
+ else:
+ return False
+
+
+def uninstPKGs():
+ action_status = True
+ for root, dirs, files in os.walk(SCRIPT_DIR):
+ for file in files:
+ if file.endswith(".wgt"):
+ pkg_id = getPKGID(os.path.basename(os.path.splitext(file)[0]))
+ if not pkg_id:
+ action_status = False
+ continue
+ (return_code, output) = doRemoteCMD(
+ "pkgcmd -u -t wgt -q -n %s" % pkg_id)
+ for line in output:
+ if "Failure" in line:
+ action_status = False
+ break
+
+ (return_code, output) = doRemoteCMD(
+ "rm -rf %s" % PKG_SRC_DIR)
+ if return_code != 0:
+ action_status = False
+
+ return action_status
+
+
+def instPKGs():
+ action_status = True
+ (return_code, output) = doRemoteCMD(
+ "mkdir -p %s" % PKG_SRC_DIR)
+ if return_code != 0:
+ action_status = False
+ for root, dirs, files in os.walk(SCRIPT_DIR):
+ for file in files:
+ if file.endswith(".wgt"):
+ if not doRemoteCopy(os.path.join(root, file), "%s/%s" % (SRC_DIR, file)):
+ action_status = False
+ (return_code, output) = doRemoteCMD(
+ "pkgcmd -i -t wgt -q -p %s/%s" % (SRC_DIR, file))
+ doRemoteCMD("rm -rf %s/%s" % (SRC_DIR, file))
+ for line in output:
+ if "Failure" in line:
+ action_status = False
+ break
+
+ for item in glob.glob("%s/*" % SCRIPT_DIR):
+ if item.endswith(".wgt"):
+ continue
+ elif item.endswith("inst.py"):
+ continue
+ else:
+ item_name = os.path.basename(item)
+ if not doRemoteCopy(item, PKG_SRC_DIR+"/"+item_name):
+ #if not doRemoteCopy(item, PKG_SRC_DIR):
+ action_status = False
+
+ return action_status
+
+
+def main():
+ try:
+ usage = "usage: inst.py -i"
+ opts_parser = OptionParser(usage=usage)
+ opts_parser.add_option(
+ "-m", dest="mode", action="store", help="Specify mode")
+ opts_parser.add_option(
+ "-s", dest="device", action="store", help="Specify device")
+ opts_parser.add_option(
+ "-i", dest="binstpkg", action="store_true", help="Install package")
+ opts_parser.add_option(
+ "-u", dest="buninstpkg", action="store_true", help="Uninstall package")
+ opts_parser.add_option(
+ "-a", dest="user", action="store", help="User name")
+ global PARAMETERS
+ (PARAMETERS, args) = opts_parser.parse_args()
+ except Exception, e:
+ print "Got wrong option: %s, exit ..." % e
+ sys.exit(1)
+
+ if not PARAMETERS.user:
+ PARAMETERS.user = "app"
+ if not PARAMETERS.mode:
+ PARAMETERS.mode = "SDB"
+
+ if PARAMETERS.mode == "SDB":
+ if not PARAMETERS.device:
+ (return_code, output) = doCMD("sdb devices")
+ for line in output:
+ if str.find(line, "\tdevice") != -1:
+ PARAMETERS.device = line.split("\t")[0]
+ break
+ else:
+ PARAMETERS.mode = "SSH"
+
+ if not PARAMETERS.device:
+ print "No device provided"
+ sys.exit(1)
+
+ user_info = getUSERID()
+ re_code = user_info[0]
+ if re_code == 0 :
+ global XW_ENV
+ userid = user_info[1][0]
+ XW_ENV = "export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket"%str(userid)
+ else:
+ print "[Error] cmd commands error : %s"%str(user_info[1])
+ sys.exit(1)
+ if PARAMETERS.binstpkg and PARAMETERS.buninstpkg:
+ print "-i and -u are conflict"
+ sys.exit(1)
+
+ if PARAMETERS.buninstpkg:
+ if not uninstPKGs():
+ sys.exit(1)
+ else:
+ if not instPKGs():
+ sys.exit(1)
+
+if __name__ == "__main__":
+ main()
+ sys.exit(0)
--- /dev/null
+#!/usr/bin/env python
+
+import os
+import shutil
+import glob
+import time
+import sys
+import subprocess
+import string
+from optparse import OptionParser, make_option
+
+
+SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
+PKG_NAME = os.path.basename(SCRIPT_DIR)
+PARAMETERS = None
+#XW_ENV = "export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket"
+SRC_DIR = "/home/app/content"
+PKG_SRC_DIR = "%s/tct/opt/%s" % (SRC_DIR, PKG_NAME)
+
+
+def doCMD(cmd):
+ # Do not need handle timeout in this short script, let tool do it
+ print "-->> \"%s\"" % cmd
+ output = []
+ cmd_proc = subprocess.Popen(
+ cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
+ while True:
+ cmd_return_code = cmd_proc.poll()
+ if cmd_return_code != None:
+ break
+
+ if not cmd.endswith("&"):
+ while True:
+ line = cmd_proc.stdout.readline().strip("\r\n")
+ print line
+ if not line or line.find("daemon started") >= 0:
+ break
+ output.append(line)
+
+ return (cmd_return_code, output)
+
+
+def updateCMD(cmd=None):
+ if "pkgcmd" in cmd:
+ cmd = "su - %s -c '%s;%s'" % (PARAMETERS.user, XW_ENV, cmd)
+ return cmd
+def getUSERID():
+ if PARAMETERS.mode == "SDB":
+ cmd = "sdb -s %s shell id -u %s" % (
+ PARAMETERS.device, PARAMETERS.user)
+ else:
+ cmd = "ssh %s \"id -u %s\"" % (
+ PARAMETERS.device, PARAMETERS.user )
+ return doCMD(cmd)
+
+
+def getPKGID(pkg_name=None):
+ if PARAMETERS.mode == "SDB":
+ cmd = "sdb -s %s shell %s" % (
+ PARAMETERS.device, updateCMD('pkgcmd -l'))
+ else:
+ cmd = "ssh %s \"%s\"" % (
+ PARAMETERS.device, updateCMD('pkgcmd -l'))
+
+ (return_code, output) = doCMD(cmd)
+ if return_code != 0:
+ return None
+
+ test_pkg_id = None
+ for line in output:
+ if line.find("[" + pkg_name + "]") != -1:
+ pkgidIndex = line.split().index("pkgid")
+ test_pkg_id = line.split()[pkgidIndex+1].strip("[]")
+ break
+ return test_pkg_id
+
+
+def doRemoteCMD(cmd=None):
+ if PARAMETERS.mode == "SDB":
+ cmd = "sdb -s %s shell %s" % (PARAMETERS.device, updateCMD(cmd))
+ else:
+ cmd = "ssh %s \"%s\"" % (PARAMETERS.device, updateCMD(cmd))
+
+ return doCMD(cmd)
+
+
+def doRemoteCopy(src=None, dest=None):
+ if PARAMETERS.mode == "SDB":
+ cmd_prefix = "sdb -s %s push" % PARAMETERS.device
+ cmd = "%s %s %s" % (cmd_prefix, src, dest)
+ else:
+ cmd = "scp -r %s %s:/%s" % (src, PARAMETERS.device, dest)
+
+ (return_code, output) = doCMD(cmd)
+ doRemoteCMD("sync")
+
+ if return_code != 0:
+ return True
+ else:
+ return False
+
+
+def uninstPKGs():
+ action_status = True
+ for root, dirs, files in os.walk(SCRIPT_DIR):
+ for file in files:
+ if file.endswith(".xpk"):
+ pkg_id = getPKGID(os.path.basename(os.path.splitext(file)[0]))
+ if not pkg_id:
+ action_status = False
+ continue
+ (return_code, output) = doRemoteCMD(
+ "pkgcmd -u -t xpk -q -n %s" % pkg_id)
+ for line in output:
+ if "Failure" in line:
+ action_status = False
+ break
+
+ (return_code, output) = doRemoteCMD(
+ "rm -rf %s" % PKG_SRC_DIR)
+ if return_code != 0:
+ action_status = False
+
+ return action_status
+
+
+def instPKGs():
+ action_status = True
+ (return_code, output) = doRemoteCMD(
+ "mkdir -p %s" % PKG_SRC_DIR)
+ if return_code != 0:
+ action_status = False
+ for root, dirs, files in os.walk(SCRIPT_DIR):
+ for file in files:
+ if file.endswith(".xpk"):
+ if not doRemoteCopy(os.path.join(root, file), "%s/%s" % (SRC_DIR, file)):
+ action_status = False
+ (return_code, output) = doRemoteCMD(
+ "pkgcmd -i -t xpk -q -p %s/%s" % (SRC_DIR, file))
+ doRemoteCMD("rm -rf %s/%s" % (SRC_DIR, file))
+ for line in output:
+ if "Failure" in line:
+ action_status = False
+ break
+
+ for item in glob.glob("%s/*" % SCRIPT_DIR):
+ if item.endswith(".xpk"):
+ continue
+ elif item.endswith("inst.py"):
+ continue
+ else:
+ item_name = os.path.basename(item)
+ if not doRemoteCopy(item, PKG_SRC_DIR+"/"+item_name):
+ #if not doRemoteCopy(item, PKG_SRC_DIR):
+ action_status = False
+
+ return action_status
+
+
+def main():
+ try:
+ usage = "usage: inst.py -i"
+ opts_parser = OptionParser(usage=usage)
+ opts_parser.add_option(
+ "-m", dest="mode", action="store", help="Specify mode")
+ opts_parser.add_option(
+ "-s", dest="device", action="store", help="Specify device")
+ opts_parser.add_option(
+ "-i", dest="binstpkg", action="store_true", help="Install package")
+ opts_parser.add_option(
+ "-u", dest="buninstpkg", action="store_true", help="Uninstall package")
+ opts_parser.add_option(
+ "-a", dest="user", action="store", help="User name")
+ global PARAMETERS
+ (PARAMETERS, args) = opts_parser.parse_args()
+ except Exception, e:
+ print "Got wrong option: %s, exit ..." % e
+ sys.exit(1)
+
+ if not PARAMETERS.user:
+ PARAMETERS.user = "app"
+ if not PARAMETERS.mode:
+ PARAMETERS.mode = "SDB"
+
+ if PARAMETERS.mode == "SDB":
+ if not PARAMETERS.device:
+ (return_code, output) = doCMD("sdb devices")
+ for line in output:
+ if str.find(line, "\tdevice") != -1:
+ PARAMETERS.device = line.split("\t")[0]
+ break
+ else:
+ PARAMETERS.mode = "SSH"
+
+ if not PARAMETERS.device:
+ print "No device provided"
+ sys.exit(1)
+
+ user_info = getUSERID()
+ re_code = user_info[0]
+ if re_code == 0 :
+ global XW_ENV
+ userid = user_info[1][0]
+ XW_ENV = "export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket"%str(userid)
+ else:
+ print "[Error] cmd commands error : %s"%str(user_info[1])
+ sys.exit(1)
+ if PARAMETERS.binstpkg and PARAMETERS.buninstpkg:
+ print "-i and -u are conflict"
+ sys.exit(1)
+
+ if PARAMETERS.buninstpkg:
+ if not uninstPKGs():
+ sys.exit(1)
+ else:
+ if not instPKGs():
+ sys.exit(1)
+
+if __name__ == "__main__":
+ main()
+ sys.exit(0)
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Wang, Jing J <jing.j.wang@intel.com>
+ Fan, Yugang <yugang.fan@intel.com>
+ Jiazhen, Shentu <jiazhenx.shentu@intel.com>
+
+*/
+
+var sstorage = window.sessionStorage;
+var applist;
+
+function exportResult() {
+ //TODO: export the test result from the saved result in session storage.
+}
+
+function SaveAndExit() {
+ //TODO: export the test result from the saved result in session storage, then exit the app.
+}
+
+function getVersion() {
+ var version = "";
+ $.ajax({
+ async : false,
+ type : "GET",
+ url : "config.xml",
+ dataType : "xml",
+ success : function(xml){
+ $(xml).find("widget").each(function(){version = $(this).attr("version");});
+ }
+ });
+ return version;
+}
+
+function getApps() {
+ var tests = "";
+ $.ajax({
+ async : false,
+ type : "GET",
+ url : "tests.xml",
+ dataType : "xml",
+ success : function(xml){tests = xml;}
+ });
+ return tests;
+}
+
+function updateList() {
+ $("#mylist").empty();
+ $(applist).find("set").each(function(){
+ $("#mylist").append("<li data-role=\"list-divider\">"+$(this).attr("name")+"</li>");
+ $(this).find("testcase").each(function(){
+ var url = "tests/" + $(this).attr("id") + "/index.html?test_name="+$(this).attr("purpose");
+ var appLine = "<li class=\"app\" id=\"" + $(this).attr("id") + "\">"
+ + "<a href=\"" + url + "\">" + "<h2>" + $(this).attr("purpose") + "</h2></a></li>";
+ $("#mylist").append(appLine);
+ });
+ });
+
+ for(var i=0; i<sstorage.length; i++){
+ var name = sstorage.key(i);
+ var item = sstorage.getItem(name);
+ var node = $("h2:contains('"+ name + "')").parent().parent();
+ if (item == "PASS") {
+ node.attr("data-theme", "g");
+ node.append("<img src='css/images/pass.png' class='ui-li-thumb'>");
+ node.append("<span class='ui-li-count' style='color:green;'>PASS</span>");
+ node.find("a h2").css("padding-left", "20px");
+ } else if (item == "FAIL"){
+ node.attr("data-theme", "r");
+ node.append("<img src='css/images/fail.png' class='ui-li-thumb'>");
+ node.append("<span class='ui-li-count' style='color:red;'>FAIL</span>");
+ node.find("a h2").css("padding-left", "20px");
+ } else {
+ resultnum = item.split(",");
+ if (resultnum[3] == "PASS") {
+ node.attr("data-theme", "g");
+ node.append("<img src='css/images/pass.png' class='ui-li-thumb'>");
+ node.append("<span class='ui-li-count' style='color:green;'>" + resultnum[0] + "</span>");
+ node.append("<span class='ui-li-count' style='color:red;'>" + resultnum[1] + "</span>");
+ node.append("<span class='ui-li-count' style='color:gray;'>" + resultnum[2] + "</span>");
+ node.find("a h2").css("padding-left", "20px");
+ } else if (resultnum[3] == "FAIL"){
+ node.attr("data-theme", "r");
+ node.append("<img src='css/images/fail.png' class='ui-li-thumb'>");
+ node.append("<span class='ui-li-count' style='color:green;'>" + resultnum[0] + "</span>");
+ node.append("<span class='ui-li-count' style='color:red;'>" + resultnum[1] + "</span>");
+ node.append("<span class='ui-li-count' style='color:gray;'>" + resultnum[2] + "</span>");
+ node.find("a h2").css("padding-left", "20px");
+ }
+ }
+ }
+ $("#mylist").listview("refresh");
+ $(".ui-li-has-count").each(function() {
+ var childs = $(this).find(".ui-li-count");
+ if (childs.length == 3) {
+ $(childs[0]).css("min-width","10px");
+ $(childs[1]).css("min-width","10px");
+ $(childs[2]).css("min-width","10px");
+ var shiftSecond = ($(childs[2]).position().left - $(childs[1]).outerWidth());
+ var shiftFirst = (shiftSecond - 23);
+ $(childs[0]).css("left", shiftFirst).css("right","auto");
+ $(childs[1]).css("left", shiftSecond).css("right","auto");
+ }
+ });
+}
+
+function updateFooter() {
+ $(':jqmData(role=footer)').find(':jqmData(role=button) > span:first-child').css('padding', '15px 10px 15px 30px');
+}
+
+function launchMain(node) {
+ if ($("#home_ui").find("div").length > 0) {
+ updateList();
+ $.mobile.changePage("#home_ui", {
+ 'allowSamePageTransition' : true,
+ 'transition' : 'slide',
+ 'reverse' : true
+ });
+ if (node != "") {
+ $("html,body").animate({
+ scrollTop:$("h2:contains(" + node +")").offset().top - 25
+ }, 500);
+ }
+ } else {
+ $.mobile.changePage("#main", {
+ 'allowSamePageTransition' : true,
+ 'transition' : 'slide',
+ 'reverse' : true
+ });
+ }
+ $("#test_frame").attr("src", "");
+}
+
+function runApp(url) {
+ $.mobile.changePage("#test_ui", {
+ 'allowSamePageTransition' : true,
+ 'transition' : 'slide',
+ 'changeHash' : false
+ });
+ $("#test_frame").attr("height", $(window).height());
+ $("#test_frame").attr("src", url);
+}
+
+$("#home_ui").live("pagebeforecreate", function () {
+ $("#version").text(getVersion());
+});
+
+$("#home_ui").live("pageshow", function () {
+ applist = getApps();
+ updateList();
+ updateFooter();
+});
+
+$("#exit").live("click", function () {
+ window.open('', '_self');
+ window.close();
+});
+
+$("#reset").live("click", function (event) {
+ sstorage.clear();
+ updateList();
+ return false;
+});
+
+$(".app").live("click", function () {
+ runApp($(this).find("div div a").attr("href"));
+ return false;
+});
+
+$('#main').live('pageshow',function(){
+ for(var i=0;i<sstorage.length;i++){
+ var key = sstorage.key(i);
+ var str = "h2:contains("+ key +")";
+ var node = $(str);
+ var item = sstorage.getItem(key);
+ if (item == "PASS") {
+ node.attr('style', 'color:green;');
+ } else if (item == "FAIL"){
+ node.attr('style', 'color:red;');
+ }
+ }
+ updateFooter();
+});
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Wang, Jing J <jing.j.wang@intel.com>
+ Li, Hao <haox.li@intel.com>
+ Fan, Yugang <yugang.fan@intel.com>
+ Jiazhen, Shentu <jiazhenx.shentu@intel.com>
+
+*/
+
+function EnablePassButton(){
+ $('#pass_button').removeClass("ui-disabled");
+}
+
+function DisablePassButton(){
+ $('#pass_button').addClass("ui-disabled");
+}
+
+function getAppName() {
+ var lpath = window.parent._appURL;
+ var from = lpath.lastIndexOf("tests/") + 6;
+ var to = lpath.lastIndexOf("/");
+ return lpath.substring(from, to);
+}
+
+function backAppsHome() {
+ if (document.getElementById("wgt_name")) {
+ test = $("#wgt_name").attr("value");
+ } else {
+ test = document.title;
+ }
+ window.parent.launchMain(test);
+}
+
+function reportResult(res) {
+ if (document.getElementById("wgt_name")) {
+ test = $("#wgt_name").attr("value");
+ } else if (document.getElementById("sub_test")) {
+ var length = $("a h2").length;
+ var pass_num = 0;
+ var fail_num = 0;
+ $("a h2").each(function () {
+ var color = $(this).css("color");
+ if (color == "rgb(0, 128, 0)") {
+ pass_num++;
+ } else if (color == "rgb(255, 0, 0)") {
+ fail_num++;
+ }
+ });
+ res = [pass_num,fail_num,length-pass_num-fail_num, res];
+ test = document.title;
+ } else {
+ test = document.title;
+ }
+ window.sessionStorage.setItem(test, res);
+ backAppsHome();
+}
+
+function getParms() {
+ var parms = new Array();
+ var str = location.search.substring(1);
+ var items = str.split('&');
+ for ( var i = 0; i < items.length; i++) {
+ var pos = items[i].indexOf('=');
+ if (pos > 0) {
+ var key = items[i].substring(0, pos);
+ var val = items[i].substring(pos + 1);
+ if (!parms[key]) {
+ var rawVal = decodeURI(val);
+ if (rawVal.indexOf(',') < 0)
+ parms[key] = rawVal;
+ else
+ parms[key] = rawVal.split(',');
+ }
+ }
+ }
+ return parms["test_name"];
+}
+
+$(document).ready(function(){
+ var testname = getParms();
+ document.title = testname;
+ $("#main_page_title").text(testname);
+});
+
+$(document).bind('pagecreate', function () {
+ var footbar = $(':jqmData(role=footer)');
+ footbar.empty();
+ footbar.attr("data-tap-toggle", "false");
+ footbar.append("<div data-role=\"controlgroup\" data-type=\"horizontal\" align=\"center\">" +
+ "<a href=\"javascript:reportResult('PASS');\" id=\"pass_button\" data-role=\"button\" data-icon=\"check\" style=\"color: green\">Pass</a>" +
+ "<a href=\"javascript:reportResult('FAIL');\" id=\"fail_button\" data-role=\"button\" data-icon=\"delete\" style=\"color: red\">Fail</a>" +
+ "<a href=\"#popup_info\" data-icon=\"info\" data-role=\"button\" data-rel=\"popup\" data-transition=\"pop\">Info</a>" +
+ "<a href=\"javascript:backAppsHome();\" data-role=\"button\" data-rel=\"popup\" data-icon=\"home\">Back</a></div>");
+ footbar.trigger("create");
+ $(':jqmData(role=footer)').find(':jqmData(role=button) > span:first-child').css('padding', '15px 10px 15px 30px');
+ $("#popup_info").popup( "option", "theme", "a");
+ var maxHeight = $(window).height() - 100 + "px";
+ $("#popup_info").css("max-height", maxHeight);
+ $("#popup_info").css("margin-bottom", "30px");
+});
+
+function checkInstalledPkg(pkgId) {
+ var packageInfo = null;
+ try {
+ if(pkgId && (typeof(tizen) != 'undefined')) {
+ packageInfo = tizen.package.getPackageInfo(pkgId);
+ }
+ } catch (e) {}
+
+ return packageInfo === null ? false : true;
+}
--- /dev/null
+/*! jQuery v1.8.2 jquery.com | jquery.org/license */\r
+(function(a,b){function G(a){var b=F[a]={};return p.each(a.split(s),function(a,c){b[c]=!0}),b}function J(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(I,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:+d+""===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else d=b}return d}function K(a){var b;for(b in a){if(b==="data"&&p.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function ba(){return!1}function bb(){return!0}function bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function bi(a,b){do a=a[b];while(a&&a.nodeType!==1);return a}function bj(a,b,c){b=b||0;if(p.isFunction(b))return p.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return p.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=p.grep(a,function(a){return a.nodeType===1});if(be.test(b))return p.filter(b,d,!c);b=p.filter(b,d)}return p.grep(a,function(a,d){return p.inArray(a,b)>=0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d<e;d++)p.event.add(b,c,h[c][d])}g.data&&(g.data=p.extend({},g.data))}function bE(a,b){var c;if(b.nodeType!==1)return;b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c==="object"?(b.parentNode&&(b.outerHTML=a.outerHTML),p.support.html5Clone&&a.innerHTML&&!p.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):c==="input"&&bv.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):c==="option"?b.selected=a.defaultSelected:c==="input"||c==="textarea"?b.defaultValue=a.defaultValue:c==="script"&&b.text!==a.text&&(b.text=a.text),b.removeAttribute(p.expando)}function bF(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bG(a){bv.test(a.type)&&(a.defaultChecked=a.checked)}function bY(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=bW.length;while(e--){b=bW[e]+c;if(b in a)return b}return d}function bZ(a,b){return a=b||a,p.css(a,"display")==="none"||!p.contains(a.ownerDocument,a)}function b$(a,b){var c,d,e=[],f=0,g=a.length;for(;f<g;f++){c=a[f];if(!c.style)continue;e[f]=p._data(c,"olddisplay"),b?(!e[f]&&c.style.display==="none"&&(c.style.display=""),c.style.display===""&&bZ(c)&&(e[f]=p._data(c,"olddisplay",cc(c.nodeName)))):(d=bH(c,"display"),!e[f]&&d!=="none"&&p._data(c,"olddisplay",d))}for(f=0;f<g;f++){c=a[f];if(!c.style)continue;if(!b||c.style.display==="none"||c.style.display==="")c.style.display=b?e[f]||"":"none"}return a}function b_(a,b,c){var d=bP.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function ca(a,b,c,d){var e=c===(d?"border":"content")?4:b==="width"?1:0,f=0;for(;e<4;e+=2)c==="margin"&&(f+=p.css(a,c+bV[e],!0)),d?(c==="content"&&(f-=parseFloat(bH(a,"padding"+bV[e]))||0),c!=="margin"&&(f-=parseFloat(bH(a,"border"+bV[e]+"Width"))||0)):(f+=parseFloat(bH(a,"padding"+bV[e]))||0,c!=="padding"&&(f+=parseFloat(bH(a,"border"+bV[e]+"Width"))||0));return f}function cb(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=!0,f=p.support.boxSizing&&p.css(a,"boxSizing")==="border-box";if(d<=0||d==null){d=bH(a,b);if(d<0||d==null)d=a.style[b];if(bQ.test(d))return d;e=f&&(p.support.boxSizingReliable||d===a.style[b]),d=parseFloat(d)||0}return d+ca(a,b,c||(f?"border":"content"),e)+"px"}function cc(a){if(bS[a])return bS[a];var b=p("<"+a+">").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write("<!doctype html><html><body>"),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bS[a]=c,c}function ci(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||ce.test(a)?d(a,e):ci(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ci(a+"["+e+"]",b[e],c,d);else d(a,b)}function cz(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h<i;h++)d=g[h],f=/^\+/.test(d),f&&(d=d.substr(1)||"*"),e=a[d]=a[d]||[],e[f?"unshift":"push"](c)}}function cA(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h,i=a[f],j=0,k=i?i.length:0,l=a===cv;for(;j<k&&(l||!h);j++)h=i[j](c,d,e),typeof h=="string"&&(!l||g[h]?h=b:(c.dataTypes.unshift(h),h=cA(a,c,d,e,h,g)));return(l||!h)&&!g["*"]&&(h=cA(a,c,d,e,"*",g)),h}function cB(a,c){var d,e,f=p.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((f[d]?a:e||(e={}))[d]=c[d]);e&&p.extend(!0,a,e)}function cC(a,c,d){var e,f,g,h,i=a.contents,j=a.dataTypes,k=a.responseFields;for(f in k)f in d&&(c[k[f]]=d[f]);while(j[0]==="*")j.shift(),e===b&&(e=a.mimeType||c.getResponseHeader("content-type"));if(e)for(f in i)if(i[f]&&i[f].test(e)){j.unshift(f);break}if(j[0]in d)g=j[0];else{for(f in d){if(!j[0]||a.converters[f+" "+j[0]]){g=f;break}h||(h=f)}g=g||h}if(g)return g!==j[0]&&j.unshift(g),d[g]}function cD(a,b){var c,d,e,f,g=a.dataTypes.slice(),h=g[0],i={},j=0;a.dataFilter&&(b=a.dataFilter(b,a.dataType));if(g[1])for(c in a.converters)i[c.toLowerCase()]=a.converters[c];for(;e=g[++j];)if(e!=="*"){if(h!=="*"&&h!==e){c=i[h+" "+e]||i["* "+e];if(!c)for(d in i){f=d.split(" ");if(f[1]===e){c=i[h+" "+f[0]]||i["* "+f[0]];if(c){c===!0?c=i[d]:i[d]!==!0&&(e=f[0],g.splice(j--,0,e));break}}}if(c!==!0)if(c&&a["throws"])b=c(b);else try{b=c(b)}catch(k){return{state:"parsererror",error:c?k:"No conversion from "+h+" to "+e}}}h=e}return{state:"success",data:b}}function cL(){try{return new a.XMLHttpRequest}catch(b){}}function cM(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function cU(){return setTimeout(function(){cN=b},0),cN=p.now()}function cV(a,b){p.each(b,function(b,c){var d=(cT[b]||[]).concat(cT["*"]),e=0,f=d.length;for(;e<f;e++)if(d[e].call(a,b,c))return})}function cW(a,b,c){var d,e=0,f=0,g=cS.length,h=p.Deferred().always(function(){delete i.elem}),i=function(){var b=cN||cU(),c=Math.max(0,j.startTime+j.duration-b),d=1-(c/j.duration||0),e=0,f=j.tweens.length;for(;e<f;e++)j.tweens[e].run(d);return h.notifyWith(a,[j,d,c]),d<1&&f?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:p.extend({},b),opts:p.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:cN||cU(),duration:c.duration,tweens:[],createTween:function(b,c,d){var e=p.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(e),e},stop:function(b){var c=0,d=b?j.tweens.length:0;for(;c<d;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;cX(k,j.opts.specialEasing);for(;e<g;e++){d=cS[e].call(j,a,k,j.opts);if(d)return d}return cV(j,k),p.isFunction(j.opts.start)&&j.opts.start.call(a,j),p.fx.timer(p.extend(i,{anim:j,queue:j.opts.queue,elem:a})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}function cX(a,b){var c,d,e,f,g;for(c in a){d=p.camelCase(c),e=b[d],f=a[c],p.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=p.cssHooks[d];if(g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}}function cY(a,b,c){var d,e,f,g,h,i,j,k,l=this,m=a.style,n={},o=[],q=a.nodeType&&bZ(a);c.queue||(j=p._queueHooks(a,"fx"),j.unqueued==null&&(j.unqueued=0,k=j.empty.fire,j.empty.fire=function(){j.unqueued||k()}),j.unqueued++,l.always(function(){l.always(function(){j.unqueued--,p.queue(a,"fx").length||j.empty.fire()})})),a.nodeType===1&&("height"in b||"width"in b)&&(c.overflow=[m.overflow,m.overflowX,m.overflowY],p.css(a,"display")==="inline"&&p.css(a,"float")==="none"&&(!p.support.inlineBlockNeedsLayout||cc(a.nodeName)==="inline"?m.display="inline-block":m.zoom=1)),c.overflow&&(m.overflow="hidden",p.support.shrinkWrapBlocks||l.done(function(){m.overflow=c.overflow[0],m.overflowX=c.overflow[1],m.overflowY=c.overflow[2]}));for(d in b){f=b[d];if(cP.exec(f)){delete b[d];if(f===(q?"hide":"show"))continue;o.push(d)}}g=o.length;if(g){h=p._data(a,"fxshow")||p._data(a,"fxshow",{}),q?p(a).show():l.done(function(){p(a).hide()}),l.done(function(){var b;p.removeData(a,"fxshow",!0);for(b in n)p.style(a,b,n[b])});for(d=0;d<g;d++)e=o[d],i=l.createTween(e,q?h[e]:0),n[e]=h[e]||p.style(a,e),e in h||(h[e]=i.start,q&&(i.end=i.start,i.start=e==="width"||e==="height"?1:0))}}function cZ(a,b,c,d,e){return new cZ.prototype.init(a,b,c,d,e)}function c$(a,b){var c,d={height:a},e=0;b=b?1:0;for(;e<4;e+=2-b)c=bV[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function da(a){return p.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}var c,d,e=a.document,f=a.location,g=a.navigator,h=a.jQuery,i=a.$,j=Array.prototype.push,k=Array.prototype.slice,l=Array.prototype.indexOf,m=Object.prototype.toString,n=Object.prototype.hasOwnProperty,o=String.prototype.trim,p=function(a,b){return new p.fn.init(a,b,c)},q=/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,r=/\S/,s=/\s+/,t=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,u=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,y=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,z=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,A=/^-ms-/,B=/-([\da-z])/gi,C=function(a,b){return(b+"").toUpperCase()},D=function(){e.addEventListener?(e.removeEventListener("DOMContentLoaded",D,!1),p.ready()):e.readyState==="complete"&&(e.detachEvent("onreadystatechange",D),p.ready())},E={};p.fn=p.prototype={constructor:p,init:function(a,c,d){var f,g,h,i;if(!a)return this;if(a.nodeType)return this.context=this[0]=a,this.length=1,this;if(typeof a=="string"){a.charAt(0)==="<"&&a.charAt(a.length-1)===">"&&a.length>=3?f=[null,a,null]:f=u.exec(a);if(f&&(f[1]||!c)){if(f[1])return c=c instanceof p?c[0]:c,i=c&&c.nodeType?c.ownerDocument||c:e,a=p.parseHTML(f[1],i,!0),v.test(f[1])&&p.isPlainObject(c)&&this.attr.call(a,c,!0),p.merge(this,a);g=e.getElementById(f[2]);if(g&&g.parentNode){if(g.id!==f[2])return d.find(a);this.length=1,this[0]=g}return this.context=e,this.selector=a,this}return!c||c.jquery?(c||d).find(a):this.constructor(c).find(a)}return p.isFunction(a)?d.ready(a):(a.selector!==b&&(this.selector=a.selector,this.context=a.context),p.makeArray(a,this))},selector:"",jquery:"1.8.2",length:0,size:function(){return this.length},toArray:function(){return k.call(this)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=p.merge(this.constructor(),a);return d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")"),d},each:function(a,b){return p.each(this,a,b)},ready:function(a){return p.ready.promise().done(a),this},eq:function(a){return a=+a,a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(k.apply(this,arguments),"slice",k.call(arguments).join(","))},map:function(a){return this.pushStack(p.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:j,sort:[].sort,splice:[].splice},p.fn.init.prototype=p.fn,p.extend=p.fn.extend=function(){var a,c,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;typeof h=="boolean"&&(k=h,h=arguments[1]||{},i=2),typeof h!="object"&&!p.isFunction(h)&&(h={}),j===i&&(h=this,--i);for(;i<j;i++)if((a=arguments[i])!=null)for(c in a){d=h[c],e=a[c];if(h===e)continue;k&&e&&(p.isPlainObject(e)||(f=p.isArray(e)))?(f?(f=!1,g=d&&p.isArray(d)?d:[]):g=d&&p.isPlainObject(d)?d:{},h[c]=p.extend(k,g,e)):e!==b&&(h[c]=e)}return h},p.extend({noConflict:function(b){return a.$===p&&(a.$=i),b&&a.jQuery===p&&(a.jQuery=h),p},isReady:!1,readyWait:1,holdReady:function(a){a?p.readyWait++:p.ready(!0)},ready:function(a){if(a===!0?--p.readyWait:p.isReady)return;if(!e.body)return setTimeout(p.ready,1);p.isReady=!0;if(a!==!0&&--p.readyWait>0)return;d.resolveWith(e,[p]),p.fn.trigger&&p(e).trigger("ready").off("ready")},isFunction:function(a){return p.type(a)==="function"},isArray:Array.isArray||function(a){return p.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):E[m.call(a)]||"object"},isPlainObject:function(a){if(!a||p.type(a)!=="object"||a.nodeType||p.isWindow(a))return!1;try{if(a.constructor&&!n.call(a,"constructor")&&!n.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||n.call(a,d)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},error:function(a){throw new Error(a)},parseHTML:function(a,b,c){var d;return!a||typeof a!="string"?null:(typeof b=="boolean"&&(c=b,b=0),b=b||e,(d=v.exec(a))?[b.createElement(d[1])]:(d=p.buildFragment([a],b,c?null:[]),p.merge([],(d.cacheable?p.clone(d.fragment):d.fragment).childNodes)))},parseJSON:function(b){if(!b||typeof b!="string")return null;b=p.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(w.test(b.replace(y,"@").replace(z,"]").replace(x,"")))return(new Function("return "+b))();p.error("Invalid JSON: "+b)},parseXML:function(c){var d,e;if(!c||typeof c!="string")return null;try{a.DOMParser?(e=new DOMParser,d=e.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(f){d=b}return(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&p.error("Invalid XML: "+c),d},noop:function(){},globalEval:function(b){b&&r.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(A,"ms-").replace(B,C)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,c,d){var e,f=0,g=a.length,h=g===b||p.isFunction(a);if(d){if(h){for(e in a)if(c.apply(a[e],d)===!1)break}else for(;f<g;)if(c.apply(a[f++],d)===!1)break}else if(h){for(e in a)if(c.call(a[e],e,a[e])===!1)break}else for(;f<g;)if(c.call(a[f],f,a[f++])===!1)break;return a},trim:o&&!o.call(" ")?function(a){return a==null?"":o.call(a)}:function(a){return a==null?"":(a+"").replace(t,"")},makeArray:function(a,b){var c,d=b||[];return a!=null&&(c=p.type(a),a.length==null||c==="string"||c==="function"||c==="regexp"||p.isWindow(a)?j.call(d,a):p.merge(d,a)),d},inArray:function(a,b,c){var d;if(b){if(l)return l.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=c.length,e=a.length,f=0;if(typeof d=="number")for(;f<d;f++)a[e++]=c[f];else while(c[f]!==b)a[e++]=c[f++];return a.length=e,a},grep:function(a,b,c){var d,e=[],f=0,g=a.length;c=!!c;for(;f<g;f++)d=!!b(a[f],f),c!==d&&e.push(a[f]);return e},map:function(a,c,d){var e,f,g=[],h=0,i=a.length,j=a instanceof p||i!==b&&typeof i=="number"&&(i>0&&a[0]&&a[i-1]||i===0||p.isArray(a));if(j)for(;h<i;h++)e=c(a[h],h,d),e!=null&&(g[g.length]=e);else for(f in a)e=c(a[f],f,d),e!=null&&(g[g.length]=e);return g.concat.apply([],g)},guid:1,proxy:function(a,c){var d,e,f;return typeof c=="string"&&(d=a[c],c=a,a=d),p.isFunction(a)?(e=k.call(arguments,2),f=function(){return a.apply(c,e.concat(k.call(arguments)))},f.guid=a.guid=a.guid||p.guid++,f):b},access:function(a,c,d,e,f,g,h){var i,j=d==null,k=0,l=a.length;if(d&&typeof d=="object"){for(k in d)p.access(a,c,k,d[k],1,g,e);f=1}else if(e!==b){i=h===b&&p.isFunction(e),j&&(i?(i=c,c=function(a,b,c){return i.call(p(a),c)}):(c.call(a,e),c=null));if(c)for(;k<l;k++)c(a[k],d,i?e.call(a[k],k,c(a[k],d)):e,h);f=1}return f?a:j?c.call(a):l?c(a[0],d):g},now:function(){return(new Date).getTime()}}),p.ready.promise=function(b){if(!d){d=p.Deferred();if(e.readyState==="complete")setTimeout(p.ready,1);else if(e.addEventListener)e.addEventListener("DOMContentLoaded",D,!1),a.addEventListener("load",p.ready,!1);else{e.attachEvent("onreadystatechange",D),a.attachEvent("onload",p.ready);var c=!1;try{c=a.frameElement==null&&e.documentElement}catch(f){}c&&c.doScroll&&function g(){if(!p.isReady){try{c.doScroll("left")}catch(a){return setTimeout(g,50)}p.ready()}}()}}return d.promise(b)},p.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){E["[object "+b+"]"]=b.toLowerCase()}),c=p(e);var F={};p.Callbacks=function(a){a=typeof a=="string"?F[a]||G(a):p.extend({},a);var c,d,e,f,g,h,i=[],j=!a.once&&[],k=function(b){c=a.memory&&b,d=!0,h=f||0,f=0,g=i.length,e=!0;for(;i&&h<g;h++)if(i[h].apply(b[0],b[1])===!1&&a.stopOnFalse){c=!1;break}e=!1,i&&(j?j.length&&k(j.shift()):c?i=[]:l.disable())},l={add:function(){if(i){var b=i.length;(function d(b){p.each(b,function(b,c){var e=p.type(c);e==="function"&&(!a.unique||!l.has(c))?i.push(c):c&&c.length&&e!=="string"&&d(c)})})(arguments),e?g=i.length:c&&(f=b,k(c))}return this},remove:function(){return i&&p.each(arguments,function(a,b){var c;while((c=p.inArray(b,i,c))>-1)i.splice(c,1),e&&(c<=g&&g--,c<=h&&h--)}),this},has:function(a){return p.inArray(a,i)>-1},empty:function(){return i=[],this},disable:function(){return i=j=c=b,this},disabled:function(){return!i},lock:function(){return j=b,c||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return b=b||[],b=[a,b.slice?b.slice():b],i&&(!d||j)&&(e?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!d}};return l},p.extend({Deferred:function(a){var b=[["resolve","done",p.Callbacks("once memory"),"resolved"],["reject","fail",p.Callbacks("once memory"),"rejected"],["notify","progress",p.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return p.Deferred(function(c){p.each(b,function(b,d){var f=d[0],g=a[b];e[d[1]](p.isFunction(g)?function(){var a=g.apply(this,arguments);a&&p.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f+"With"](this===e?c:this,[a])}:c[f])}),a=null}).promise()},promise:function(a){return a!=null?p.extend(a,d):d}},e={};return d.pipe=d.then,p.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[a^1][2].disable,b[2][2].lock),e[f[0]]=g.fire,e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=k.call(arguments),d=c.length,e=d!==1||a&&p.isFunction(a.promise)?d:0,f=e===1?a:p.Deferred(),g=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?k.call(arguments):d,c===h?f.notifyWith(b,c):--e||f.resolveWith(b,c)}},h,i,j;if(d>1){h=new Array(d),i=new Array(d),j=new Array(d);for(;b<d;b++)c[b]&&p.isFunction(c[b].promise)?c[b].promise().done(g(b,j,c)).fail(f.reject).progress(g(b,i,h)):--e}return e||f.resolveWith(j,c),f.promise()}}),p.support=function(){var b,c,d,f,g,h,i,j,k,l,m,n=e.createElement("div");n.setAttribute("className","t"),n.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",c=n.getElementsByTagName("*"),d=n.getElementsByTagName("a")[0],d.style.cssText="top:1px;float:left;opacity:.5";if(!c||!c.length)return{};f=e.createElement("select"),g=f.appendChild(e.createElement("option")),h=n.getElementsByTagName("input")[0],b={leadingWhitespace:n.firstChild.nodeType===3,tbody:!n.getElementsByTagName("tbody").length,htmlSerialize:!!n.getElementsByTagName("link").length,style:/top/.test(d.getAttribute("style")),hrefNormalized:d.getAttribute("href")==="/a",opacity:/^0.5/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:h.value==="on",optSelected:g.selected,getSetAttribute:n.className!=="t",enctype:!!e.createElement("form").enctype,html5Clone:e.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",boxModel:e.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},h.checked=!0,b.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,b.optDisabled=!g.disabled;try{delete n.test}catch(o){b.deleteExpando=!1}!n.addEventListener&&n.attachEvent&&n.fireEvent&&(n.attachEvent("onclick",m=function(){b.noCloneEvent=!1}),n.cloneNode(!0).fireEvent("onclick"),n.detachEvent("onclick",m)),h=e.createElement("input"),h.value="t",h.setAttribute("type","radio"),b.radioValue=h.value==="t",h.setAttribute("checked","checked"),h.setAttribute("name","t"),n.appendChild(h),i=e.createDocumentFragment(),i.appendChild(n.lastChild),b.checkClone=i.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=h.checked,i.removeChild(h),i.appendChild(n);if(n.attachEvent)for(k in{submit:!0,change:!0,focusin:!0})j="on"+k,l=j in n,l||(n.setAttribute(j,"return;"),l=typeof n[j]=="function"),b[k+"Bubbles"]=l;return p(function(){var c,d,f,g,h="padding:0;margin:0;border:0;display:block;overflow:hidden;",i=e.getElementsByTagName("body")[0];if(!i)return;c=e.createElement("div"),c.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",i.insertBefore(c,i.firstChild),d=e.createElement("div"),c.appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",f=d.getElementsByTagName("td"),f[0].style.cssText="padding:0;margin:0;border:0;display:none",l=f[0].offsetHeight===0,f[0].style.display="",f[1].style.display="none",b.reliableHiddenOffsets=l&&f[0].offsetHeight===0,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",b.boxSizing=d.offsetWidth===4,b.doesNotIncludeMarginInBodyOffset=i.offsetTop!==1,a.getComputedStyle&&(b.pixelPosition=(a.getComputedStyle(d,null)||{}).top!=="1%",b.boxSizingReliable=(a.getComputedStyle(d,null)||{width:"4px"}).width==="4px",g=e.createElement("div"),g.style.cssText=d.style.cssText=h,g.style.marginRight=g.style.width="0",d.style.width="1px",d.appendChild(g),b.reliableMarginRight=!parseFloat((a.getComputedStyle(g,null)||{}).marginRight)),typeof d.style.zoom!="undefined"&&(d.innerHTML="",d.style.cssText=h+"width:1px;padding:1px;display:inline;zoom:1",b.inlineBlockNeedsLayout=d.offsetWidth===3,d.style.display="block",d.style.overflow="visible",d.innerHTML="<div></div>",d.firstChild.style.width="5px",b.shrinkWrapBlocks=d.offsetWidth!==3,c.style.zoom=1),i.removeChild(c),c=d=f=g=null}),i.removeChild(n),c=d=f=g=h=i=n=null,b}();var H=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,I=/([A-Z])/g;p.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(p.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){return a=a.nodeType?p.cache[a[p.expando]]:a[p.expando],!!a&&!K(a)},data:function(a,c,d,e){if(!p.acceptData(a))return;var f,g,h=p.expando,i=typeof c=="string",j=a.nodeType,k=j?p.cache:a,l=j?a[h]:a[h]&&h;if((!l||!k[l]||!e&&!k[l].data)&&i&&d===b)return;l||(j?a[h]=l=p.deletedIds.pop()||p.guid++:l=h),k[l]||(k[l]={},j||(k[l].toJSON=p.noop));if(typeof c=="object"||typeof c=="function")e?k[l]=p.extend(k[l],c):k[l].data=p.extend(k[l].data,c);return f=k[l],e||(f.data||(f.data={}),f=f.data),d!==b&&(f[p.camelCase(c)]=d),i?(g=f[c],g==null&&(g=f[p.camelCase(c)])):g=f,g},removeData:function(a,b,c){if(!p.acceptData(a))return;var d,e,f,g=a.nodeType,h=g?p.cache:a,i=g?a[p.expando]:p.expando;if(!h[i])return;if(b){d=c?h[i]:h[i].data;if(d){p.isArray(b)||(b in d?b=[b]:(b=p.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,f=b.length;e<f;e++)delete d[b[e]];if(!(c?K:p.isEmptyObject)(d))return}}if(!c){delete h[i].data;if(!K(h[i]))return}g?p.cleanData([a],!0):p.support.deleteExpando||h!=h.window?delete h[i]:h[i]=null},_data:function(a,b,c){return p.data(a,b,c,!0)},acceptData:function(a){var b=a.nodeName&&p.noData[a.nodeName.toLowerCase()];return!b||b!==!0&&a.getAttribute("classid")===b}}),p.fn.extend({data:function(a,c){var d,e,f,g,h,i=this[0],j=0,k=null;if(a===b){if(this.length){k=p.data(i);if(i.nodeType===1&&!p._data(i,"parsedAttrs")){f=i.attributes;for(h=f.length;j<h;j++)g=f[j].name,g.indexOf("data-")||(g=p.camelCase(g.substring(5)),J(i,g,k[g]));p._data(i,"parsedAttrs",!0)}}return k}return typeof a=="object"?this.each(function(){p.data(this,a)}):(d=a.split(".",2),d[1]=d[1]?"."+d[1]:"",e=d[1]+"!",p.access(this,function(c){if(c===b)return k=this.triggerHandler("getData"+e,[d[0]]),k===b&&i&&(k=p.data(i,a),k=J(i,a,k)),k===b&&d[1]?this.data(d[0]):k;d[1]=c,this.each(function(){var b=p(this);b.triggerHandler("setData"+e,d),p.data(this,a,c),b.triggerHandler("changeData"+e,d)})},null,c,arguments.length>1,null,!1))},removeData:function(a){return this.each(function(){p.removeData(this,a)})}}),p.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=p._data(a,b),c&&(!d||p.isArray(c)?d=p._data(a,b,p.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=p.queue(a,b),d=c.length,e=c.shift(),f=p._queueHooks(a,b),g=function(){p.dequeue(a,b)};e==="inprogress"&&(e=c.shift(),d--),e&&(b==="fx"&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return p._data(a,c)||p._data(a,c,{empty:p.Callbacks("once memory").add(function(){p.removeData(a,b+"queue",!0),p.removeData(a,c,!0)})})}}),p.fn.extend({queue:function(a,c){var d=2;return typeof a!="string"&&(c=a,a="fx",d--),arguments.length<d?p.queue(this[0],a):c===b?this:this.each(function(){var b=p.queue(this,a,c);p._queueHooks(this,a),a==="fx"&&b[0]!=="inprogress"&&p.dequeue(this,a)})},dequeue:function(a){return this.each(function(){p.dequeue(this,a)})},delay:function(a,b){return a=p.fx?p.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){var d,e=1,f=p.Deferred(),g=this,h=this.length,i=function(){--e||f.resolveWith(g,[g])};typeof a!="string"&&(c=a,a=b),a=a||"fx";while(h--)d=p._data(g[h],a+"queueHooks"),d&&d.empty&&(e++,d.empty.add(i));return i(),f.promise(c)}});var L,M,N,O=/[\t\r\n]/g,P=/\r/g,Q=/^(?:button|input)$/i,R=/^(?:button|input|object|select|textarea)$/i,S=/^a(?:rea|)$/i,T=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,U=p.support.getSetAttribute;p.fn.extend({attr:function(a,b){return p.access(this,p.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){p.removeAttr(this,a)})},prop:function(a,b){return p.access(this,p.prop,a,b,arguments.length>1)},removeProp:function(a){return a=p.propFix[a]||a,this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,f,g,h;if(p.isFunction(a))return this.each(function(b){p(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(s);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{f=" "+e.className+" ";for(g=0,h=b.length;g<h;g++)f.indexOf(" "+b[g]+" ")<0&&(f+=b[g]+" ");e.className=p.trim(f)}}}return this},removeClass:function(a){var c,d,e,f,g,h,i;if(p.isFunction(a))return this.each(function(b){p(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(s);for(h=0,i=this.length;h<i;h++){e=this[h];if(e.nodeType===1&&e.className){d=(" "+e.className+" ").replace(O," ");for(f=0,g=c.length;f<g;f++)while(d.indexOf(" "+c[f]+" ")>=0)d=d.replace(" "+c[f]+" "," ");e.className=a?p.trim(d):""}}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";return p.isFunction(a)?this.each(function(c){p(this).toggleClass(a.call(this,c,this.className,b),b)}):this.each(function(){if(c==="string"){var e,f=0,g=p(this),h=b,i=a.split(s);while(e=i[f++])h=d?h:!g.hasClass(e),g[h?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&p._data(this,"__className__",this.className),this.className=this.className||a===!1?"":p._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(O," ").indexOf(b)>=0)return!0;return!1},val:function(a){var c,d,e,f=this[0];if(!arguments.length){if(f)return c=p.valHooks[f.type]||p.valHooks[f.nodeName.toLowerCase()],c&&"get"in c&&(d=c.get(f,"value"))!==b?d:(d=f.value,typeof d=="string"?d.replace(P,""):d==null?"":d);return}return e=p.isFunction(a),this.each(function(d){var f,g=p(this);if(this.nodeType!==1)return;e?f=a.call(this,d,g.val()):f=a,f==null?f="":typeof f=="number"?f+="":p.isArray(f)&&(f=p.map(f,function(a){return a==null?"":a+""})),c=p.valHooks[this.type]||p.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,f,"value")===b)this.value=f})}}),p.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,f=a.selectedIndex,g=[],h=a.options,i=a.type==="select-one";if(f<0)return null;c=i?f:0,d=i?f+1:h.length;for(;c<d;c++){e=h[c];if(e.selected&&(p.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!p.nodeName(e.parentNode,"optgroup"))){b=p(e).val();if(i)return b;g.push(b)}}return i&&!g.length&&h.length?p(h[f]).val():g},set:function(a,b){var c=p.makeArray(b);return p(a).find("option").each(function(){this.selected=p.inArray(p(this).val(),c)>=0}),c.length||(a.selectedIndex=-1),c}}},attrFn:{},attr:function(a,c,d,e){var f,g,h,i=a.nodeType;if(!a||i===3||i===8||i===2)return;if(e&&p.isFunction(p.fn[c]))return p(a)[c](d);if(typeof a.getAttribute=="undefined")return p.prop(a,c,d);h=i!==1||!p.isXMLDoc(a),h&&(c=c.toLowerCase(),g=p.attrHooks[c]||(T.test(c)?M:L));if(d!==b){if(d===null){p.removeAttr(a,c);return}return g&&"set"in g&&h&&(f=g.set(a,d,c))!==b?f:(a.setAttribute(c,d+""),d)}return g&&"get"in g&&h&&(f=g.get(a,c))!==null?f:(f=a.getAttribute(c),f===null?b:f)},removeAttr:function(a,b){var c,d,e,f,g=0;if(b&&a.nodeType===1){d=b.split(s);for(;g<d.length;g++)e=d[g],e&&(c=p.propFix[e]||e,f=T.test(e),f||p.attr(a,e,""),a.removeAttribute(U?e:c),f&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(Q.test(a.nodeName)&&a.parentNode)p.error("type property can't be changed");else if(!p.support.radioValue&&b==="radio"&&p.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}},value:{get:function(a,b){return L&&p.nodeName(a,"button")?L.get(a,b):b in a?a.value:null},set:function(a,b,c){if(L&&p.nodeName(a,"button"))return L.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,f,g,h=a.nodeType;if(!a||h===3||h===8||h===2)return;return g=h!==1||!p.isXMLDoc(a),g&&(c=p.propFix[c]||c,f=p.propHooks[c]),d!==b?f&&"set"in f&&(e=f.set(a,d,c))!==b?e:a[c]=d:f&&"get"in f&&(e=f.get(a,c))!==null?e:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):R.test(a.nodeName)||S.test(a.nodeName)&&a.href?0:b}}}}),M={get:function(a,c){var d,e=p.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;return b===!1?p.removeAttr(a,c):(d=p.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase())),c}},U||(N={name:!0,id:!0,coords:!0},L=p.valHooks.button={get:function(a,c){var d;return d=a.getAttributeNode(c),d&&(N[c]?d.value!=="":d.specified)?d.value:b},set:function(a,b,c){var d=a.getAttributeNode(c);return d||(d=e.createAttribute(c),a.setAttributeNode(d)),d.value=b+""}},p.each(["width","height"],function(a,b){p.attrHooks[b]=p.extend(p.attrHooks[b],{set:function(a,c){if(c==="")return a.setAttribute(b,"auto"),c}})}),p.attrHooks.contenteditable={get:L.get,set:function(a,b,c){b===""&&(b="false"),L.set(a,b,c)}}),p.support.hrefNormalized||p.each(["href","src","width","height"],function(a,c){p.attrHooks[c]=p.extend(p.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),p.support.style||(p.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=b+""}}),p.support.optSelected||(p.propHooks.selected=p.extend(p.propHooks.selected,{get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}})),p.support.enctype||(p.propFix.enctype="encoding"),p.support.checkOn||p.each(["radio","checkbox"],function(){p.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),p.each(["radio","checkbox"],function(){p.valHooks[this]=p.extend(p.valHooks[this],{set:function(a,b){if(p.isArray(b))return a.checked=p.inArray(p(a).val(),b)>=0}})});var V=/^(?:textarea|input|select)$/i,W=/^([^\.]*|)(?:\.(.+)|)$/,X=/(?:^|\s)hover(\.\S+|)\b/,Y=/^key/,Z=/^(?:mouse|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=function(a){return p.event.special.hover?a:a.replace(X,"mouseenter$1 mouseleave$1")};p.event={add:function(a,c,d,e,f){var g,h,i,j,k,l,m,n,o,q,r;if(a.nodeType===3||a.nodeType===8||!c||!d||!(g=p._data(a)))return;d.handler&&(o=d,d=o.handler,f=o.selector),d.guid||(d.guid=p.guid++),i=g.events,i||(g.events=i={}),h=g.handle,h||(g.handle=h=function(a){return typeof p!="undefined"&&(!a||p.event.triggered!==a.type)?p.event.dispatch.apply(h.elem,arguments):b},h.elem=a),c=p.trim(_(c)).split(" ");for(j=0;j<c.length;j++){k=W.exec(c[j])||[],l=k[1],m=(k[2]||"").split(".").sort(),r=p.event.special[l]||{},l=(f?r.delegateType:r.bindType)||l,r=p.event.special[l]||{},n=p.extend({type:l,origType:k[1],data:e,handler:d,guid:d.guid,selector:f,needsContext:f&&p.expr.match.needsContext.test(f),namespace:m.join(".")},o),q=i[l];if(!q){q=i[l]=[],q.delegateCount=0;if(!r.setup||r.setup.call(a,e,m,h)===!1)a.addEventListener?a.addEventListener(l,h,!1):a.attachEvent&&a.attachEvent("on"+l,h)}r.add&&(r.add.call(a,n),n.handler.guid||(n.handler.guid=d.guid)),f?q.splice(q.delegateCount++,0,n):q.push(n),p.event.global[l]=!0}a=null},global:{},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,q,r=p.hasData(a)&&p._data(a);if(!r||!(m=r.events))return;b=p.trim(_(b||"")).split(" ");for(f=0;f<b.length;f++){g=W.exec(b[f])||[],h=i=g[1],j=g[2];if(!h){for(h in m)p.event.remove(a,h+b[f],c,d,!0);continue}n=p.event.special[h]||{},h=(d?n.delegateType:n.bindType)||h,o=m[h]||[],k=o.length,j=j?new RegExp("(^|\\.)"+j.split(".").sort().join("\\.(?:.*\\.|)")+"(\\.|$)"):null;for(l=0;l<o.length;l++)q=o[l],(e||i===q.origType)&&(!c||c.guid===q.guid)&&(!j||j.test(q.namespace))&&(!d||d===q.selector||d==="**"&&q.selector)&&(o.splice(l--,1),q.selector&&o.delegateCount--,n.remove&&n.remove.call(a,q));o.length===0&&k!==o.length&&((!n.teardown||n.teardown.call(a,j,r.handle)===!1)&&p.removeEvent(a,h,r.handle),delete m[h])}p.isEmptyObject(m)&&(delete r.handle,p.removeData(a,"events",!0))},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,f,g){if(!f||f.nodeType!==3&&f.nodeType!==8){var h,i,j,k,l,m,n,o,q,r,s=c.type||c,t=[];if($.test(s+p.event.triggered))return;s.indexOf("!")>=0&&(s=s.slice(0,-1),i=!0),s.indexOf(".")>=0&&(t=s.split("."),s=t.shift(),t.sort());if((!f||p.event.customEvent[s])&&!p.event.global[s])return;c=typeof c=="object"?c[p.expando]?c:new p.Event(s,c):new p.Event(s),c.type=s,c.isTrigger=!0,c.exclusive=i,c.namespace=t.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+t.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,m=s.indexOf(":")<0?"on"+s:"";if(!f){h=p.cache;for(j in h)h[j].events&&h[j].events[s]&&p.event.trigger(c,d,h[j].handle.elem,!0);return}c.result=b,c.target||(c.target=f),d=d!=null?p.makeArray(d):[],d.unshift(c),n=p.event.special[s]||{};if(n.trigger&&n.trigger.apply(f,d)===!1)return;q=[[f,n.bindType||s]];if(!g&&!n.noBubble&&!p.isWindow(f)){r=n.delegateType||s,k=$.test(r+s)?f:f.parentNode;for(l=f;k;k=k.parentNode)q.push([k,r]),l=k;l===(f.ownerDocument||e)&&q.push([l.defaultView||l.parentWindow||a,r])}for(j=0;j<q.length&&!c.isPropagationStopped();j++)k=q[j][0],c.type=q[j][1],o=(p._data(k,"events")||{})[c.type]&&p._data(k,"handle"),o&&o.apply(k,d),o=m&&k[m],o&&p.acceptData(k)&&o.apply&&o.apply(k,d)===!1&&c.preventDefault();return c.type=s,!g&&!c.isDefaultPrevented()&&(!n._default||n._default.apply(f.ownerDocument,d)===!1)&&(s!=="click"||!p.nodeName(f,"a"))&&p.acceptData(f)&&m&&f[s]&&(s!=="focus"&&s!=="blur"||c.target.offsetWidth!==0)&&!p.isWindow(f)&&(l=f[m],l&&(f[m]=null),p.event.triggered=s,f[s](),p.event.triggered=b,l&&(f[m]=l)),c.result}return},dispatch:function(c){c=p.event.fix(c||a.event);var d,e,f,g,h,i,j,l,m,n,o=(p._data(this,"events")||{})[c.type]||[],q=o.delegateCount,r=k.call(arguments),s=!c.exclusive&&!c.namespace,t=p.event.special[c.type]||{},u=[];r[0]=c,c.delegateTarget=this;if(t.preDispatch&&t.preDispatch.call(this,c)===!1)return;if(q&&(!c.button||c.type!=="click"))for(f=c.target;f!=this;f=f.parentNode||this)if(f.disabled!==!0||c.type!=="click"){h={},j=[];for(d=0;d<q;d++)l=o[d],m=l.selector,h[m]===b&&(h[m]=l.needsContext?p(m,this).index(f)>=0:p.find(m,this,null,[f]).length),h[m]&&j.push(l);j.length&&u.push({elem:f,matches:j})}o.length>q&&u.push({elem:this,matches:o.slice(q)});for(d=0;d<u.length&&!c.isPropagationStopped();d++){i=u[d],c.currentTarget=i.elem;for(e=0;e<i.matches.length&&!c.isImmediatePropagationStopped();e++){l=i.matches[e];if(s||!c.namespace&&!l.namespace||c.namespace_re&&c.namespace_re.test(l.namespace))c.data=l.data,c.handleObj=l,g=((p.event.special[l.origType]||{}).handle||l.handler).apply(i.elem,r),g!==b&&(c.result=g,g===!1&&(c.preventDefault(),c.stopPropagation()))}}return t.postDispatch&&t.postDispatch.call(this,c),c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,c){var d,f,g,h=c.button,i=c.fromElement;return a.pageX==null&&c.clientX!=null&&(d=a.target.ownerDocument||e,f=d.documentElement,g=d.body,a.pageX=c.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=c.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?c.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0),a}},fix:function(a){if(a[p.expando])return a;var b,c,d=a,f=p.event.fixHooks[a.type]||{},g=f.props?this.props.concat(f.props):this.props;a=p.Event(d);for(b=g.length;b;)c=g[--b],a[c]=d[c];return a.target||(a.target=d.srcElement||e),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,f.filter?f.filter(a,d):a},special:{load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){p.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=p.extend(new p.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?p.event.trigger(e,null,b):p.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},p.event.handle=p.event.dispatch,p.removeEvent=e.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]=="undefined"&&(a[d]=null),a.detachEvent(d,c))},p.Event=function(a,b){if(this instanceof p.Event)a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?bb:ba):this.type=a,b&&p.extend(this,b),this.timeStamp=a&&a.timeStamp||p.now(),this[p.expando]=!0;else return new p.Event(a,b)},p.Event.prototype={preventDefault:function(){this.isDefaultPrevented=bb;var a=this.originalEvent;if(!a)return;a.preventDefault?a.preventDefault():a.returnValue=!1},stopPropagation:function(){this.isPropagationStopped=bb;var a=this.originalEvent;if(!a)return;a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=bb,this.stopPropagation()},isDefaultPrevented:ba,isPropagationStopped:ba,isImmediatePropagationStopped:ba},p.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){p.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj,g=f.selector;if(!e||e!==d&&!p.contains(d,e))a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b;return c}}}),p.support.submitBubbles||(p.event.special.submit={setup:function(){if(p.nodeName(this,"form"))return!1;p.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=p.nodeName(c,"input")||p.nodeName(c,"button")?c.form:b;d&&!p._data(d,"_submit_attached")&&(p.event.add(d,"submit._submit",function(a){a._submit_bubble=!0}),p._data(d,"_submit_attached",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&p.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){if(p.nodeName(this,"form"))return!1;p.event.remove(this,"._submit")}}),p.support.changeBubbles||(p.event.special.change={setup:function(){if(V.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")p.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),p.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),p.event.simulate("change",this,a,!0)});return!1}p.event.add(this,"beforeactivate._change",function(a){var b=a.target;V.test(b.nodeName)&&!p._data(b,"_change_attached")&&(p.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&p.event.simulate("change",this.parentNode,a,!0)}),p._data(b,"_change_attached",!0))})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){return p.event.remove(this,"._change"),!V.test(this.nodeName)}}),p.support.focusinBubbles||p.each({focus:"focusin",blur:"focusout"},function(a,b){var c=0,d=function(a){p.event.simulate(b,a.target,p.event.fix(a),!0)};p.event.special[b]={setup:function(){c++===0&&e.addEventListener(a,d,!0)},teardown:function(){--c===0&&e.removeEventListener(a,d,!0)}}}),p.fn.extend({on:function(a,c,d,e,f){var g,h;if(typeof a=="object"){typeof c!="string"&&(d=d||c,c=b);for(h in a)this.on(h,c,d,a[h],f);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=ba;else if(!e)return this;return f===1&&(g=e,e=function(a){return p().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=p.guid++)),this.each(function(){p.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,c,d){var e,f;if(a&&a.preventDefault&&a.handleObj)return e=a.handleObj,p(a.delegateTarget).off(e.namespace?e.origType+"."+e.namespace:e.origType,e.selector,e.handler),this;if(typeof a=="object"){for(f in a)this.off(f,c,a[f]);return this}if(c===!1||typeof c=="function")d=c,c=b;return d===!1&&(d=ba),this.each(function(){p.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){return p(this.context).on(a,this.selector,b,c),this},die:function(a,b){return p(this.context).off(a,this.selector||"**",b),this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length===1?this.off(a,"**"):this.off(b,a||"**",c)},trigger:function(a,b){return this.each(function(){p.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return p.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||p.guid++,d=0,e=function(c){var e=(p._data(this,"lastToggle"+a.guid)||0)%d;return p._data(this,"lastToggle"+a.guid,e+1),c.preventDefault(),b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),p.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){p.fn[b]=function(a,c){return c==null&&(c=a,a=null),arguments.length>0?this.on(b,null,a,c):this.trigger(b)},Y.test(b)&&(p.event.fixHooks[b]=p.event.keyHooks),Z.test(b)&&(p.event.fixHooks[b]=p.event.mouseHooks)}),function(a,b){function bc(a,b,c,d){c=c||[],b=b||r;var e,f,i,j,k=b.nodeType;if(!a||typeof a!="string")return c;if(k!==1&&k!==9)return[];i=g(b);if(!i&&!d)if(e=P.exec(a))if(j=e[1]){if(k===9){f=b.getElementById(j);if(!f||!f.parentNode)return c;if(f.id===j)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(j))&&h(b,f)&&f.id===j)return c.push(f),c}else{if(e[2])return w.apply(c,x.call(b.getElementsByTagName(a),0)),c;if((j=e[3])&&_&&b.getElementsByClassName)return w.apply(c,x.call(b.getElementsByClassName(j),0)),c}return bp(a.replace(L,"$1"),b,c,d,i)}function bd(a){return function(b){var c=b.nodeName.toLowerCase();return c==="input"&&b.type===a}}function be(a){return function(b){var c=b.nodeName.toLowerCase();return(c==="input"||c==="button")&&b.type===a}}function bf(a){return z(function(b){return b=+b,z(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function bg(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}function bh(a,b){var c,d,f,g,h,i,j,k=C[o][a];if(k)return b?0:k.slice(0);h=a,i=[],j=e.preFilter;while(h){if(!c||(d=M.exec(h)))d&&(h=h.slice(d[0].length)),i.push(f=[]);c=!1;if(d=N.exec(h))f.push(c=new q(d.shift())),h=h.slice(c.length),c.type=d[0].replace(L," ");for(g in e.filter)(d=W[g].exec(h))&&(!j[g]||(d=j[g](d,r,!0)))&&(f.push(c=new q(d.shift())),h=h.slice(c.length),c.type=g,c.matches=d);if(!c)break}return b?h.length:h?bc.error(a):C(a,i).slice(0)}function bi(a,b,d){var e=b.dir,f=d&&b.dir==="parentNode",g=u++;return b.first?function(b,c,d){while(b=b[e])if(f||b.nodeType===1)return a(b,c,d)}:function(b,d,h){if(!h){var i,j=t+" "+g+" ",k=j+c;while(b=b[e])if(f||b.nodeType===1){if((i=b[o])===k)return b.sizset;if(typeof i=="string"&&i.indexOf(j)===0){if(b.sizset)return b}else{b[o]=k;if(a(b,d,h))return b.sizset=!0,b;b.sizset=!1}}}else while(b=b[e])if(f||b.nodeType===1)if(a(b,d,h))return b}}function bj(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function bk(a,b,c,d,e){var f,g=[],h=0,i=a.length,j=b!=null;for(;h<i;h++)if(f=a[h])if(!c||c(f,d,e))g.push(f),j&&b.push(h);return g}function bl(a,b,c,d,e,f){return d&&!d[o]&&(d=bl(d)),e&&!e[o]&&(e=bl(e,f)),z(function(f,g,h,i){if(f&&e)return;var j,k,l,m=[],n=[],o=g.length,p=f||bo(b||"*",h.nodeType?[h]:h,[],f),q=a&&(f||!b)?bk(p,m,a,h,i):p,r=c?e||(f?a:o||d)?[]:g:q;c&&c(q,r,h,i);if(d){l=bk(r,n),d(l,[],h,i),j=l.length;while(j--)if(k=l[j])r[n[j]]=!(q[n[j]]=k)}if(f){j=a&&r.length;while(j--)if(k=r[j])f[m[j]]=!(g[m[j]]=k)}else r=bk(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):w.apply(g,r)})}function bm(a){var b,c,d,f=a.length,g=e.relative[a[0].type],h=g||e.relative[" "],i=g?1:0,j=bi(function(a){return a===b},h,!0),k=bi(function(a){return y.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==l)||((b=c).nodeType?j(a,c,d):k(a,c,d))}];for(;i<f;i++)if(c=e.relative[a[i].type])m=[bi(bj(m),c)];else{c=e.filter[a[i].type].apply(null,a[i].matches);if(c[o]){d=++i;for(;d<f;d++)if(e.relative[a[d].type])break;return bl(i>1&&bj(m),i>1&&a.slice(0,i-1).join("").replace(L,"$1"),c,i<d&&bm(a.slice(i,d)),d<f&&bm(a=a.slice(d)),d<f&&a.join(""))}m.push(c)}return bj(m)}function bn(a,b){var d=b.length>0,f=a.length>0,g=function(h,i,j,k,m){var n,o,p,q=[],s=0,u="0",x=h&&[],y=m!=null,z=l,A=h||f&&e.find.TAG("*",m&&i.parentNode||i),B=t+=z==null?1:Math.E;y&&(l=i!==r&&i,c=g.el);for(;(n=A[u])!=null;u++){if(f&&n){for(o=0;p=a[o];o++)if(p(n,i,j)){k.push(n);break}y&&(t=B,c=++g.el)}d&&((n=!p&&n)&&s--,h&&x.push(n))}s+=u;if(d&&u!==s){for(o=0;p=b[o];o++)p(x,q,i,j);if(h){if(s>0)while(u--)!x[u]&&!q[u]&&(q[u]=v.call(k));q=bk(q)}w.apply(k,q),y&&!h&&q.length>0&&s+b.length>1&&bc.uniqueSort(k)}return y&&(t=B,l=z),x};return g.el=0,d?z(g):g}function bo(a,b,c,d){var e=0,f=b.length;for(;e<f;e++)bc(a,b[e],c,d);return c}function bp(a,b,c,d,f){var g,h,j,k,l,m=bh(a),n=m.length;if(!d&&m.length===1){h=m[0]=m[0].slice(0);if(h.length>2&&(j=h[0]).type==="ID"&&b.nodeType===9&&!f&&e.relative[h[1].type]){b=e.find.ID(j.matches[0].replace(V,""),b,f)[0];if(!b)return c;a=a.slice(h.shift().length)}for(g=W.POS.test(a)?-1:h.length-1;g>=0;g--){j=h[g];if(e.relative[k=j.type])break;if(l=e.find[k])if(d=l(j.matches[0].replace(V,""),R.test(h[0].type)&&b.parentNode||b,f)){h.splice(g,1),a=d.length&&h.join("");if(!a)return w.apply(c,x.call(d,0)),c;break}}}return i(a,m)(d,b,f,c,R.test(a)),c}function bq(){}var c,d,e,f,g,h,i,j,k,l,m=!0,n="undefined",o=("sizcache"+Math.random()).replace(".",""),q=String,r=a.document,s=r.documentElement,t=0,u=0,v=[].pop,w=[].push,x=[].slice,y=[].indexOf||function(a){var b=0,c=this.length;for(;b<c;b++)if(this[b]===a)return b;return-1},z=function(a,b){return a[o]=b==null||b,a},A=function(){var a={},b=[];return z(function(c,d){return b.push(c)>e.cacheLength&&delete a[b.shift()],a[c]=d},a)},B=A(),C=A(),D=A(),E="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",G=F.replace("w","w#"),H="([*^$|!~]?=)",I="\\["+E+"*("+F+")"+E+"*(?:"+H+E+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+G+")|)|)"+E+"*\\]",J=":("+F+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+I+")|[^:]|\\\\.)*|.*))\\)|)",K=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+E+"*((?:-\\d)?\\d*)"+E+"*\\)|)(?=[^-]|$)",L=new RegExp("^"+E+"+|((?:^|[^\\\\])(?:\\\\.)*)"+E+"+$","g"),M=new RegExp("^"+E+"*,"+E+"*"),N=new RegExp("^"+E+"*([\\x20\\t\\r\\n\\f>+~])"+E+"*"),O=new RegExp(J),P=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,Q=/^:not/,R=/[\x20\t\r\n\f]*[+~]/,S=/:not\($/,T=/h\d/i,U=/input|select|textarea|button/i,V=/\\(?!\\)/g,W={ID:new RegExp("^#("+F+")"),CLASS:new RegExp("^\\.("+F+")"),NAME:new RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:new RegExp("^("+F.replace("w","w*")+")"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+J),POS:new RegExp(K,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+E+"*(even|odd|(([+-]|)(\\d*)n|)"+E+"*(?:([+-]|)"+E+"*(\\d+)|))"+E+"*\\)|)","i"),needsContext:new RegExp("^"+E+"*[>+~]|"+K,"i")},X=function(a){var b=r.createElement("div");try{return a(b)}catch(c){return!1}finally{b=null}},Y=X(function(a){return a.appendChild(r.createComment("")),!a.getElementsByTagName("*").length}),Z=X(function(a){return a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!==n&&a.firstChild.getAttribute("href")==="#"}),$=X(function(a){a.innerHTML="<select></select>";var b=typeof a.lastChild.getAttribute("multiple");return b!=="boolean"&&b!=="string"}),_=X(function(a){return a.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",!a.getElementsByClassName||!a.getElementsByClassName("e").length?!1:(a.lastChild.className="e",a.getElementsByClassName("e").length===2)}),ba=X(function(a){a.id=o+0,a.innerHTML="<a name='"+o+"'></a><div name='"+o+"'></div>",s.insertBefore(a,s.firstChild);var b=r.getElementsByName&&r.getElementsByName(o).length===2+r.getElementsByName(o+0).length;return d=!r.getElementById(o),s.removeChild(a),b});try{x.call(s.childNodes,0)[0].nodeType}catch(bb){x=function(a){var b,c=[];for(;b=this[a];a++)c.push(b);return c}}bc.matches=function(a,b){return bc(a,null,null,b)},bc.matchesSelector=function(a,b){return bc(b,null,null,[a]).length>0},f=bc.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(e===1||e===9||e===11){if(typeof a.textContent=="string")return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=f(a)}else if(e===3||e===4)return a.nodeValue}else for(;b=a[d];d++)c+=f(b);return c},g=bc.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?b.nodeName!=="HTML":!1},h=bc.contains=s.contains?function(a,b){var c=a.nodeType===9?a.documentElement:a,d=b&&b.parentNode;return a===d||!!(d&&d.nodeType===1&&c.contains&&c.contains(d))}:s.compareDocumentPosition?function(a,b){return b&&!!(a.compareDocumentPosition(b)&16)}:function(a,b){while(b=b.parentNode)if(b===a)return!0;return!1},bc.attr=function(a,b){var c,d=g(a);return d||(b=b.toLowerCase()),(c=e.attrHandle[b])?c(a):d||$?a.getAttribute(b):(c=a.getAttributeNode(b),c?typeof a[b]=="boolean"?a[b]?b:null:c.specified?c.value:null:null)},e=bc.selectors={cacheLength:50,createPseudo:z,match:W,attrHandle:Z?{}:{href:function(a){return a.getAttribute("href",2)},type:function(a){return a.getAttribute("type")}},find:{ID:d?function(a,b,c){if(typeof b.getElementById!==n&&!c){var d=b.getElementById(a);return d&&d.parentNode?[d]:[]}}:function(a,c,d){if(typeof c.getElementById!==n&&!d){var e=c.getElementById(a);return e?e.id===a||typeof e.getAttributeNode!==n&&e.getAttributeNode("id").value===a?[e]:b:[]}},TAG:Y?function(a,b){if(typeof b.getElementsByTagName!==n)return b.getElementsByTagName(a)}:function(a,b){var c=b.getElementsByTagName(a);if(a==="*"){var d,e=[],f=0;for(;d=c[f];f++)d.nodeType===1&&e.push(d);return e}return c},NAME:ba&&function(a,b){if(typeof b.getElementsByName!==n)return b.getElementsByName(name)},CLASS:_&&function(a,b,c){if(typeof b.getElementsByClassName!==n&&!c)return b.getElementsByClassName(a)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(V,""),a[3]=(a[4]||a[5]||"").replace(V,""),a[2]==="~="&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),a[1]==="nth"?(a[2]||bc.error(a[0]),a[3]=+(a[3]?a[4]+(a[5]||1):2*(a[2]==="even"||a[2]==="odd")),a[4]=+(a[6]+a[7]||a[2]==="odd")):a[2]&&bc.error(a[0]),a},PSEUDO:function(a){var b,c;if(W.CHILD.test(a[0]))return null;if(a[3])a[2]=a[3];else if(b=a[4])O.test(b)&&(c=bh(b,!0))&&(c=b.indexOf(")",b.length-c)-b.length)&&(b=b.slice(0,c),a[0]=a[0].slice(0,c)),a[2]=b;return a.slice(0,3)}},filter:{ID:d?function(a){return a=a.replace(V,""),function(b){return b.getAttribute("id")===a}}:function(a){return a=a.replace(V,""),function(b){var c=typeof b.getAttributeNode!==n&&b.getAttributeNode("id");return c&&c.value===a}},TAG:function(a){return a==="*"?function(){return!0}:(a=a.replace(V,"").toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=B[o][a];return b||(b=B(a,new RegExp("(^|"+E+")"+a+"("+E+"|$)"))),function(a){return b.test(a.className||typeof a.getAttribute!==n&&a.getAttribute("class")||"")}},ATTR:function(a,b,c){return function(d,e){var f=bc.attr(d,a);return f==null?b==="!=":b?(f+="",b==="="?f===c:b==="!="?f!==c:b==="^="?c&&f.indexOf(c)===0:b==="*="?c&&f.indexOf(c)>-1:b==="$="?c&&f.substr(f.length-c.length)===c:b==="~="?(" "+f+" ").indexOf(c)>-1:b==="|="?f===c||f.substr(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d){return a==="nth"?function(a){var b,e,f=a.parentNode;if(c===1&&d===0)return!0;if(f){e=0;for(b=f.firstChild;b;b=b.nextSibling)if(b.nodeType===1){e++;if(a===b)break}}return e-=d,e===c||e%c===0&&e/c>=0}:function(b){var c=b;switch(a){case"only":case"first":while(c=c.previousSibling)if(c.nodeType===1)return!1;if(a==="first")return!0;c=b;case"last":while(c=c.nextSibling)if(c.nodeType===1)return!1;return!0}}},PSEUDO:function(a,b){var c,d=e.pseudos[a]||e.setFilters[a.toLowerCase()]||bc.error("unsupported pseudo: "+a);return d[o]?d(b):d.length>1?(c=[a,a,"",b],e.setFilters.hasOwnProperty(a.toLowerCase())?z(function(a,c){var e,f=d(a,b),g=f.length;while(g--)e=y.call(a,f[g]),a[e]=!(c[e]=f[g])}):function(a){return d(a,0,c)}):d}},pseudos:{not:z(function(a){var b=[],c=[],d=i(a.replace(L,"$1"));return d[o]?z(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)if(f=g[h])a[h]=!(b[h]=f)}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:z(function(a){return function(b){return bc(a,b).length>0}}),contains:z(function(a){return function(b){return(b.textContent||b.innerText||f(b)).indexOf(a)>-1}}),enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&!!a.checked||b==="option"&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},parent:function(a){return!e.pseudos.empty(a)},empty:function(a){var b;a=a.firstChild;while(a){if(a.nodeName>"@"||(b=a.nodeType)===3||b===4)return!1;a=a.nextSibling}return!0},header:function(a){return T.test(a.nodeName)},text:function(a){var b,c;return a.nodeName.toLowerCase()==="input"&&(b=a.type)==="text"&&((c=a.getAttribute("type"))==null||c.toLowerCase()===b)},radio:bd("radio"),checkbox:bd("checkbox"),file:bd("file"),password:bd("password"),image:bd("image"),submit:be("submit"),reset:be("reset"),button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&a.type==="button"||b==="button"},input:function(a){return U.test(a.nodeName)},focus:function(a){var b=a.ownerDocument;return a===b.activeElement&&(!b.hasFocus||b.hasFocus())&&(!!a.type||!!a.href)},active:function(a){return a===a.ownerDocument.activeElement},first:bf(function(a,b,c){return[0]}),last:bf(function(a,b,c){return[b-1]}),eq:bf(function(a,b,c){return[c<0?c+b:c]}),even:bf(function(a,b,c){for(var d=0;d<b;d+=2)a.push(d);return a}),odd:bf(function(a,b,c){for(var d=1;d<b;d+=2)a.push(d);return a}),lt:bf(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:bf(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},j=s.compareDocumentPosition?function(a,b){return a===b?(k=!0,0):(!a.compareDocumentPosition||!b.compareDocumentPosition?a.compareDocumentPosition:a.compareDocumentPosition(b)&4)?-1:1}:function(a,b){if(a===b)return k=!0,0;if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,h=b.parentNode,i=g;if(g===h)return bg(a,b);if(!g)return-1;if(!h)return 1;while(i)e.unshift(i),i=i.parentNode;i=h;while(i)f.unshift(i),i=i.parentNode;c=e.length,d=f.length;for(var j=0;j<c&&j<d;j++)if(e[j]!==f[j])return bg(e[j],f[j]);return j===c?bg(a,f[j],-1):bg(e[j],b,1)},[0,0].sort(j),m=!k,bc.uniqueSort=function(a){var b,c=1;k=m,a.sort(j);if(k)for(;b=a[c];c++)b===a[c-1]&&a.splice(c--,1);return a},bc.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},i=bc.compile=function(a,b){var c,d=[],e=[],f=D[o][a];if(!f){b||(b=bh(a)),c=b.length;while(c--)f=bm(b[c]),f[o]?d.push(f):e.push(f);f=D(a,bn(e,d))}return f},r.querySelectorAll&&function(){var a,b=bp,c=/'|\\/g,d=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,e=[":focus"],f=[":active",":focus"],h=s.matchesSelector||s.mozMatchesSelector||s.webkitMatchesSelector||s.oMatchesSelector||s.msMatchesSelector;X(function(a){a.innerHTML="<select><option selected=''></option></select>",a.querySelectorAll("[selected]").length||e.push("\\["+E+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),a.querySelectorAll(":checked").length||e.push(":checked")}),X(function(a){a.innerHTML="<p test=''></p>",a.querySelectorAll("[test^='']").length&&e.push("[*^$]="+E+"*(?:\"\"|'')"),a.innerHTML="<input type='hidden'/>",a.querySelectorAll(":enabled").length||e.push(":enabled",":disabled")}),e=new RegExp(e.join("|")),bp=function(a,d,f,g,h){if(!g&&!h&&(!e||!e.test(a))){var i,j,k=!0,l=o,m=d,n=d.nodeType===9&&a;if(d.nodeType===1&&d.nodeName.toLowerCase()!=="object"){i=bh(a),(k=d.getAttribute("id"))?l=k.replace(c,"\\$&"):d.setAttribute("id",l),l="[id='"+l+"'] ",j=i.length;while(j--)i[j]=l+i[j].join("");m=R.test(a)&&d.parentNode||d,n=i.join(",")}if(n)try{return w.apply(f,x.call(m.querySelectorAll(n),0)),f}catch(p){}finally{k||d.removeAttribute("id")}}return b(a,d,f,g,h)},h&&(X(function(b){a=h.call(b,"div");try{h.call(b,"[test!='']:sizzle"),f.push("!=",J)}catch(c){}}),f=new RegExp(f.join("|")),bc.matchesSelector=function(b,c){c=c.replace(d,"='$1']");if(!g(b)&&!f.test(c)&&(!e||!e.test(c)))try{var i=h.call(b,c);if(i||a||b.document&&b.document.nodeType!==11)return i}catch(j){}return bc(c,null,null,[b]).length>0})}(),e.pseudos.nth=e.pseudos.eq,e.filters=bq.prototype=e.pseudos,e.setFilters=new bq,bc.attr=p.attr,p.find=bc,p.expr=bc.selectors,p.expr[":"]=p.expr.pseudos,p.unique=bc.uniqueSort,p.text=bc.getText,p.isXMLDoc=bc.isXML,p.contains=bc.contains}(a);var bc=/Until$/,bd=/^(?:parents|prev(?:Until|All))/,be=/^.[^:#\[\.,]*$/,bf=p.expr.match.needsContext,bg={children:!0,contents:!0,next:!0,prev:!0};p.fn.extend({find:function(a){var b,c,d,e,f,g,h=this;if(typeof a!="string")return p(a).filter(function(){for(b=0,c=h.length;b<c;b++)if(p.contains(h[b],this))return!0});g=this.pushStack("","find",a);for(b=0,c=this.length;b<c;b++){d=g.length,p.find(a,this[b],g);if(b>0)for(e=d;e<g.length;e++)for(f=0;f<d;f++)if(g[f]===g[e]){g.splice(e--,1);break}}return g},has:function(a){var b,c=p(a,this),d=c.length;return this.filter(function(){for(b=0;b<d;b++)if(p.contains(this,c[b]))return!0})},not:function(a){return this.pushStack(bj(this,a,!1),"not",a)},filter:function(a){return this.pushStack(bj(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?bf.test(a)?p(a,this.context).index(this[0])>=0:p.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c,d=0,e=this.length,f=[],g=bf.test(a)||typeof a!="string"?p(a,b||this.context):0;for(;d<e;d++){c=this[d];while(c&&c.ownerDocument&&c!==b&&c.nodeType!==11){if(g?g.index(c)>-1:p.find.matchesSelector(c,a)){f.push(c);break}c=c.parentNode}}return f=f.length>1?p.unique(f):f,this.pushStack(f,"closest",a)},index:function(a){return a?typeof a=="string"?p.inArray(this[0],p(a)):p.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(a,b){var c=typeof a=="string"?p(a,b):p.makeArray(a&&a.nodeType?[a]:a),d=p.merge(this.get(),c);return this.pushStack(bh(c[0])||bh(d[0])?d:p.unique(d))},addBack:function(a){return this.add(a==null?this.prevObject:this.prevObject.filter(a))}}),p.fn.andSelf=p.fn.addBack,p.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return p.dir(a,"parentNode")},parentsUntil:function(a,b,c){return p.dir(a,"parentNode",c)},next:function(a){return bi(a,"nextSibling")},prev:function(a){return bi(a,"previousSibling")},nextAll:function(a){return p.dir(a,"nextSibling")},prevAll:function(a){return p.dir(a,"previousSibling")},nextUntil:function(a,b,c){return p.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return p.dir(a,"previousSibling",c)},siblings:function(a){return p.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return p.sibling(a.firstChild)},contents:function(a){return p.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:p.merge([],a.childNodes)}},function(a,b){p.fn[a]=function(c,d){var e=p.map(this,b,c);return bc.test(a)||(d=c),d&&typeof d=="string"&&(e=p.filter(d,e)),e=this.length>1&&!bg[a]?p.unique(e):e,this.length>1&&bd.test(a)&&(e=e.reverse()),this.pushStack(e,a,k.call(arguments).join(","))}}),p.extend({filter:function(a,b,c){return c&&(a=":not("+a+")"),b.length===1?p.find.matchesSelector(b[0],a)?[b[0]]:[]:p.find.matches(a,b)},dir:function(a,c,d){var e=[],f=a[c];while(f&&f.nodeType!==9&&(d===b||f.nodeType!==1||!p(f).is(d)))f.nodeType===1&&e.push(f),f=f[c];return e},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var bl="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",bm=/ jQuery\d+="(?:null|\d+)"/g,bn=/^\s+/,bo=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bp=/<([\w:]+)/,bq=/<tbody/i,br=/<|&#?\w+;/,bs=/<(?:script|style|link)/i,bt=/<(?:script|object|embed|option|style)/i,bu=new RegExp("<(?:"+bl+")[\\s/>]","i"),bv=/^(?:checkbox|radio)$/,bw=/checked\s*(?:[^=]|=\s*.checked.)/i,bx=/\/(java|ecma)script/i,by=/^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,bz={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bA=bk(e),bB=bA.appendChild(e.createElement("div"));bz.optgroup=bz.option,bz.tbody=bz.tfoot=bz.colgroup=bz.caption=bz.thead,bz.th=bz.td,p.support.htmlSerialize||(bz._default=[1,"X<div>","</div>"]),p.fn.extend({text:function(a){return p.access(this,function(a){return a===b?p.text(this):this.empty().append((this[0]&&this[0].ownerDocument||e).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(p.isFunction(a))return this.each(function(b){p(this).wrapAll(a.call(this,b))});if(this[0]){var b=p(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return p.isFunction(a)?this.each(function(b){p(this).wrapInner(a.call(this,b))}):this.each(function(){var b=p(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=p.isFunction(a);return this.each(function(c){p(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){p.nodeName(this,"body")||p(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(a,this.firstChild)})},before:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(a,this),"before",this.selector)}},after:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(this,a),"after",this.selector)}},remove:function(a,b){var c,d=0;for(;(c=this[d])!=null;d++)if(!a||p.filter(a,[c]).length)!b&&c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),p.cleanData([c])),c.parentNode&&c.parentNode.removeChild(c);return this},empty:function(){var a,b=0;for(;(a=this[b])!=null;b++){a.nodeType===1&&p.cleanData(a.getElementsByTagName("*"));while(a.firstChild)a.removeChild(a.firstChild)}return this},clone:function(a,b){return a=a==null?!1:a,b=b==null?a:b,this.map(function(){return p.clone(this,a,b)})},html:function(a){return p.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(bm,""):b;if(typeof a=="string"&&!bs.test(a)&&(p.support.htmlSerialize||!bu.test(a))&&(p.support.leadingWhitespace||!bn.test(a))&&!bz[(bp.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(bo,"<$1></$2>");try{for(;d<e;d++)c=this[d]||{},c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),c.innerHTML=a);c=0}catch(f){}}c&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(a){return bh(this[0])?this.length?this.pushStack(p(p.isFunction(a)?a():a),"replaceWith",a):this:p.isFunction(a)?this.each(function(b){var c=p(this),d=c.html();c.replaceWith(a.call(this,b,d))}):(typeof a!="string"&&(a=p(a).detach()),this.each(function(){var b=this.nextSibling,c=this.parentNode;p(this).remove(),b?p(b).before(a):p(c).append(a)}))},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){a=[].concat.apply([],a);var e,f,g,h,i=0,j=a[0],k=[],l=this.length;if(!p.support.checkClone&&l>1&&typeof j=="string"&&bw.test(j))return this.each(function(){p(this).domManip(a,c,d)});if(p.isFunction(j))return this.each(function(e){var f=p(this);a[0]=j.call(this,e,c?f.html():b),f.domManip(a,c,d)});if(this[0]){e=p.buildFragment(a,this,k),g=e.fragment,f=g.firstChild,g.childNodes.length===1&&(g=f);if(f){c=c&&p.nodeName(f,"tr");for(h=e.cacheable||l-1;i<l;i++)d.call(c&&p.nodeName(this[i],"table")?bC(this[i],"tbody"):this[i],i===h?g:p.clone(g,!0,!0))}g=f=null,k.length&&p.each(k,function(a,b){b.src?p.ajax?p.ajax({url:b.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):p.error("no ajax"):p.globalEval((b.text||b.textContent||b.innerHTML||"").replace(by,"")),b.parentNode&&b.parentNode.removeChild(b)})}return this}}),p.buildFragment=function(a,c,d){var f,g,h,i=a[0];return c=c||e,c=!c.nodeType&&c[0]||c,c=c.ownerDocument||c,a.length===1&&typeof i=="string"&&i.length<512&&c===e&&i.charAt(0)==="<"&&!bt.test(i)&&(p.support.checkClone||!bw.test(i))&&(p.support.html5Clone||!bu.test(i))&&(g=!0,f=p.fragments[i],h=f!==b),f||(f=c.createDocumentFragment(),p.clean(a,c,f,d),g&&(p.fragments[i]=h&&f)),{fragment:f,cacheable:g}},p.fragments={},p.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){p.fn[a]=function(c){var d,e=0,f=[],g=p(c),h=g.length,i=this.length===1&&this[0].parentNode;if((i==null||i&&i.nodeType===11&&i.childNodes.length===1)&&h===1)return g[b](this[0]),this;for(;e<h;e++)d=(e>0?this.clone(!0):this).get(),p(g[e])[b](d),f=f.concat(d);return this.pushStack(f,a,g.selector)}}),p.extend({clone:function(a,b,c){var d,e,f,g;p.support.html5Clone||p.isXMLDoc(a)||!bu.test("<"+a.nodeName+">")?g=a.cloneNode(!0):(bB.innerHTML=a.outerHTML,bB.removeChild(g=bB.firstChild));if((!p.support.noCloneEvent||!p.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!p.isXMLDoc(a)){bE(a,g),d=bF(a),e=bF(g);for(f=0;d[f];++f)e[f]&&bE(d[f],e[f])}if(b){bD(a,g);if(c){d=bF(a),e=bF(g);for(f=0;d[f];++f)bD(d[f],e[f])}}return d=e=null,g},clean:function(a,b,c,d){var f,g,h,i,j,k,l,m,n,o,q,r,s=b===e&&bA,t=[];if(!b||typeof b.createDocumentFragment=="undefined")b=e;for(f=0;(h=a[f])!=null;f++){typeof h=="number"&&(h+="");if(!h)continue;if(typeof h=="string")if(!br.test(h))h=b.createTextNode(h);else{s=s||bk(b),l=b.createElement("div"),s.appendChild(l),h=h.replace(bo,"<$1></$2>"),i=(bp.exec(h)||["",""])[1].toLowerCase(),j=bz[i]||bz._default,k=j[0],l.innerHTML=j[1]+h+j[2];while(k--)l=l.lastChild;if(!p.support.tbody){m=bq.test(h),n=i==="table"&&!m?l.firstChild&&l.firstChild.childNodes:j[1]==="<table>"&&!m?l.childNodes:[];for(g=n.length-1;g>=0;--g)p.nodeName(n[g],"tbody")&&!n[g].childNodes.length&&n[g].parentNode.removeChild(n[g])}!p.support.leadingWhitespace&&bn.test(h)&&l.insertBefore(b.createTextNode(bn.exec(h)[0]),l.firstChild),h=l.childNodes,l.parentNode.removeChild(l)}h.nodeType?t.push(h):p.merge(t,h)}l&&(h=l=s=null);if(!p.support.appendChecked)for(f=0;(h=t[f])!=null;f++)p.nodeName(h,"input")?bG(h):typeof h.getElementsByTagName!="undefined"&&p.grep(h.getElementsByTagName("input"),bG);if(c){q=function(a){if(!a.type||bx.test(a.type))return d?d.push(a.parentNode?a.parentNode.removeChild(a):a):c.appendChild(a)};for(f=0;(h=t[f])!=null;f++)if(!p.nodeName(h,"script")||!q(h))c.appendChild(h),typeof h.getElementsByTagName!="undefined"&&(r=p.grep(p.merge([],h.getElementsByTagName("script")),q),t.splice.apply(t,[f+1,0].concat(r)),f+=r.length)}return t},cleanData:function(a,b){var c,d,e,f,g=0,h=p.expando,i=p.cache,j=p.support.deleteExpando,k=p.event.special;for(;(e=a[g])!=null;g++)if(b||p.acceptData(e)){d=e[h],c=d&&i[d];if(c){if(c.events)for(f in c.events)k[f]?p.event.remove(e,f):p.removeEvent(e,f,c.handle);i[d]&&(delete i[d],j?delete e[h]:e.removeAttribute?e.removeAttribute(h):e[h]=null,p.deletedIds.push(d))}}}}),function(){var a,b;p.uaMatch=function(a){a=a.toLowerCase();var b=/(chrome)[ \/]([\w.]+)/.exec(a)||/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||a.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},a=p.uaMatch(g.userAgent),b={},a.browser&&(b[a.browser]=!0,b.version=a.version),b.chrome?b.webkit=!0:b.webkit&&(b.safari=!0),p.browser=b,p.sub=function(){function a(b,c){return new a.fn.init(b,c)}p.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function c(c,d){return d&&d instanceof p&&!(d instanceof a)&&(d=a(d)),p.fn.init.call(this,c,d,b)},a.fn.init.prototype=a.fn;var b=a(e);return a}}();var bH,bI,bJ,bK=/alpha\([^)]*\)/i,bL=/opacity=([^)]*)/,bM=/^(top|right|bottom|left)$/,bN=/^(none|table(?!-c[ea]).+)/,bO=/^margin/,bP=new RegExp("^("+q+")(.*)$","i"),bQ=new RegExp("^("+q+")(?!px)[a-z%]+$","i"),bR=new RegExp("^([-+])=("+q+")","i"),bS={},bT={position:"absolute",visibility:"hidden",display:"block"},bU={letterSpacing:0,fontWeight:400},bV=["Top","Right","Bottom","Left"],bW=["Webkit","O","Moz","ms"],bX=p.fn.toggle;p.fn.extend({css:function(a,c){return p.access(this,function(a,c,d){return d!==b?p.style(a,c,d):p.css(a,c)},a,c,arguments.length>1)},show:function(){return b$(this,!0)},hide:function(){return b$(this)},toggle:function(a,b){var c=typeof a=="boolean";return p.isFunction(a)&&p.isFunction(b)?bX.apply(this,arguments):this.each(function(){(c?a:bZ(this))?p(this).show():p(this).hide()})}}),p.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bH(a,"opacity");return c===""?"1":c}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":p.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!a||a.nodeType===3||a.nodeType===8||!a.style)return;var f,g,h,i=p.camelCase(c),j=a.style;c=p.cssProps[i]||(p.cssProps[i]=bY(j,i)),h=p.cssHooks[c]||p.cssHooks[i];if(d===b)return h&&"get"in h&&(f=h.get(a,!1,e))!==b?f:j[c];g=typeof d,g==="string"&&(f=bR.exec(d))&&(d=(f[1]+1)*f[2]+parseFloat(p.css(a,c)),g="number");if(d==null||g==="number"&&isNaN(d))return;g==="number"&&!p.cssNumber[i]&&(d+="px");if(!h||!("set"in h)||(d=h.set(a,d,e))!==b)try{j[c]=d}catch(k){}},css:function(a,c,d,e){var f,g,h,i=p.camelCase(c);return c=p.cssProps[i]||(p.cssProps[i]=bY(a.style,i)),h=p.cssHooks[c]||p.cssHooks[i],h&&"get"in h&&(f=h.get(a,!0,e)),f===b&&(f=bH(a,c)),f==="normal"&&c in bU&&(f=bU[c]),d||e!==b?(g=parseFloat(f),d||p.isNumeric(g)?g||0:f):f},swap:function(a,b,c){var d,e,f={};for(e in b)f[e]=a.style[e],a.style[e]=b[e];d=c.call(a);for(e in b)a.style[e]=f[e];return d}}),a.getComputedStyle?bH=function(b,c){var d,e,f,g,h=a.getComputedStyle(b,null),i=b.style;return h&&(d=h[c],d===""&&!p.contains(b.ownerDocument,b)&&(d=p.style(b,c)),bQ.test(d)&&bO.test(c)&&(e=i.width,f=i.minWidth,g=i.maxWidth,i.minWidth=i.maxWidth=i.width=d,d=h.width,i.width=e,i.minWidth=f,i.maxWidth=g)),d}:e.documentElement.currentStyle&&(bH=function(a,b){var c,d,e=a.currentStyle&&a.currentStyle[b],f=a.style;return e==null&&f&&f[b]&&(e=f[b]),bQ.test(e)&&!bM.test(b)&&(c=f.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":e,e=f.pixelLeft+"px",f.left=c,d&&(a.runtimeStyle.left=d)),e===""?"auto":e}),p.each(["height","width"],function(a,b){p.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth===0&&bN.test(bH(a,"display"))?p.swap(a,bT,function(){return cb(a,b,d)}):cb(a,b,d)},set:function(a,c,d){return b_(a,c,d?ca(a,b,d,p.support.boxSizing&&p.css(a,"boxSizing")==="border-box"):0)}}}),p.support.opacity||(p.cssHooks.opacity={get:function(a,b){return bL.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=p.isNumeric(b)?"alpha(opacity="+b*100+")":"",f=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&p.trim(f.replace(bK,""))===""&&c.removeAttribute){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bK.test(f)?f.replace(bK,e):f+" "+e}}),p(function(){p.support.reliableMarginRight||(p.cssHooks.marginRight={get:function(a,b){return p.swap(a,{display:"inline-block"},function(){if(b)return bH(a,"marginRight")})}}),!p.support.pixelPosition&&p.fn.position&&p.each(["top","left"],function(a,b){p.cssHooks[b]={get:function(a,c){if(c){var d=bH(a,b);return bQ.test(d)?p(a).position()[b]+"px":d}}}})}),p.expr&&p.expr.filters&&(p.expr.filters.hidden=function(a){return a.offsetWidth===0&&a.offsetHeight===0||!p.support.reliableHiddenOffsets&&(a.style&&a.style.display||bH(a,"display"))==="none"},p.expr.filters.visible=function(a){return!p.expr.filters.hidden(a)}),p.each({margin:"",padding:"",border:"Width"},function(a,b){p.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bV[d]+b]=e[d]||e[d-2]||e[0];return f}},bO.test(a)||(p.cssHooks[a+b].set=b_)});var cd=/%20/g,ce=/\[\]$/,cf=/\r?\n/g,cg=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,ch=/^(?:select|textarea)/i;p.fn.extend({serialize:function(){return p.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?p.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ch.test(this.nodeName)||cg.test(this.type))}).map(function(a,b){var c=p(this).val();return c==null?null:p.isArray(c)?p.map(c,function(a,c){return{name:b.name,value:a.replace(cf,"\r\n")}}):{name:b.name,value:c.replace(cf,"\r\n")}}).get()}}),p.param=function(a,c){var d,e=[],f=function(a,b){b=p.isFunction(b)?b():b==null?"":b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=p.ajaxSettings&&p.ajaxSettings.traditional);if(p.isArray(a)||a.jquery&&!p.isPlainObject(a))p.each(a,function(){f(this.name,this.value)});else for(d in a)ci(d,a[d],c,f);return e.join("&").replace(cd,"+")};var cj,ck,cl=/#.*$/,cm=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,cn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,co=/^(?:GET|HEAD)$/,cp=/^\/\//,cq=/\?/,cr=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,cs=/([?&])_=[^&]*/,ct=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,cu=p.fn.load,cv={},cw={},cx=["*/"]+["*"];try{ck=f.href}catch(cy){ck=e.createElement("a"),ck.href="",ck=ck.href}cj=ct.exec(ck.toLowerCase())||[],p.fn.load=function(a,c,d){if(typeof a!="string"&&cu)return cu.apply(this,arguments);if(!this.length)return this;var e,f,g,h=this,i=a.indexOf(" ");return i>=0&&(e=a.slice(i,a.length),a=a.slice(0,i)),p.isFunction(c)?(d=c,c=b):c&&typeof c=="object"&&(f="POST"),p.ajax({url:a,type:f,dataType:"html",data:c,complete:function(a,b){d&&h.each(d,g||[a.responseText,b,a])}}).done(function(a){g=arguments,h.html(e?p("<div>").append(a.replace(cr,"")).find(e):a)}),this},p.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){p.fn[b]=function(a){return this.on(b,a)}}),p.each(["get","post"],function(a,c){p[c]=function(a,d,e,f){return p.isFunction(d)&&(f=f||e,e=d,d=b),p.ajax({type:c,url:a,data:d,success:e,dataType:f})}}),p.extend({getScript:function(a,c){return p.get(a,b,c,"script")},getJSON:function(a,b,c){return p.get(a,b,c,"json")},ajaxSetup:function(a,b){return b?cB(a,p.ajaxSettings):(b=a,a=p.ajaxSettings),cB(a,b),a},ajaxSettings:{url:ck,isLocal:cn.test(cj[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":cx},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":p.parseJSON,"text xml":p.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:cz(cv),ajaxTransport:cz(cw),ajax:function(a,c){function y(a,c,f,i){var k,s,t,u,w,y=c;if(v===2)return;v=2,h&&clearTimeout(h),g=b,e=i||"",x.readyState=a>0?4:0,f&&(u=cC(l,x,f));if(a>=200&&a<300||a===304)l.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(p.lastModified[d]=w),w=x.getResponseHeader("Etag"),w&&(p.etag[d]=w)),a===304?(y="notmodified",k=!0):(k=cD(l,u),y=k.state,s=k.data,t=k.error,k=!t);else{t=y;if(!y||a)y="error",a<0&&(a=0)}x.status=a,x.statusText=(c||y)+"",k?o.resolveWith(m,[s,y,x]):o.rejectWith(m,[x,y,t]),x.statusCode(r),r=b,j&&n.trigger("ajax"+(k?"Success":"Error"),[x,l,k?s:t]),q.fireWith(m,[x,y]),j&&(n.trigger("ajaxComplete",[x,l]),--p.active||p.event.trigger("ajaxStop"))}typeof a=="object"&&(c=a,a=b),c=c||{};var d,e,f,g,h,i,j,k,l=p.ajaxSetup({},c),m=l.context||l,n=m!==l&&(m.nodeType||m instanceof p)?p(m):p.event,o=p.Deferred(),q=p.Callbacks("once memory"),r=l.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,setRequestHeader:function(a,b){if(!v){var c=a.toLowerCase();a=u[c]=u[c]||a,t[a]=b}return this},getAllResponseHeaders:function(){return v===2?e:null},getResponseHeader:function(a){var c;if(v===2){if(!f){f={};while(c=cm.exec(e))f[c[1].toLowerCase()]=c[2]}c=f[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){return v||(l.mimeType=a),this},abort:function(a){return a=a||w,g&&g.abort(a),y(0,a),this}};o.promise(x),x.success=x.done,x.error=x.fail,x.complete=q.add,x.statusCode=function(a){if(a){var b;if(v<2)for(b in a)r[b]=[r[b],a[b]];else b=a[x.status],x.always(b)}return this},l.url=((a||l.url)+"").replace(cl,"").replace(cp,cj[1]+"//"),l.dataTypes=p.trim(l.dataType||"*").toLowerCase().split(s),l.crossDomain==null&&(i=ct.exec(l.url.toLowerCase())||!1,l.crossDomain=i&&i.join(":")+(i[3]?"":i[1]==="http:"?80:443)!==cj.join(":")+(cj[3]?"":cj[1]==="http:"?80:443)),l.data&&l.processData&&typeof l.data!="string"&&(l.data=p.param(l.data,l.traditional)),cA(cv,l,c,x);if(v===2)return x;j=l.global,l.type=l.type.toUpperCase(),l.hasContent=!co.test(l.type),j&&p.active++===0&&p.event.trigger("ajaxStart");if(!l.hasContent){l.data&&(l.url+=(cq.test(l.url)?"&":"?")+l.data,delete l.data),d=l.url;if(l.cache===!1){var z=p.now(),A=l.url.replace(cs,"$1_="+z);l.url=A+(A===l.url?(cq.test(l.url)?"&":"?")+"_="+z:"")}}(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",l.contentType),l.ifModified&&(d=d||l.url,p.lastModified[d]&&x.setRequestHeader("If-Modified-Since",p.lastModified[d]),p.etag[d]&&x.setRequestHeader("If-None-Match",p.etag[d])),x.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+(l.dataTypes[0]!=="*"?", "+cx+"; q=0.01":""):l.accepts["*"]);for(k in l.headers)x.setRequestHeader(k,l.headers[k]);if(!l.beforeSend||l.beforeSend.call(m,x,l)!==!1&&v!==2){w="abort";for(k in{success:1,error:1,complete:1})x[k](l[k]);g=cA(cw,l,c,x);if(!g)y(-1,"No Transport");else{x.readyState=1,j&&n.trigger("ajaxSend",[x,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){x.abort("timeout")},l.timeout));try{v=1,g.send(t,y)}catch(B){if(v<2)y(-1,B);else throw B}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var cE=[],cF=/\?/,cG=/(=)\?(?=&|$)|\?\?/,cH=p.now();p.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=cE.pop()||p.expando+"_"+cH++;return this[a]=!0,a}}),p.ajaxPrefilter("json jsonp",function(c,d,e){var f,g,h,i=c.data,j=c.url,k=c.jsonp!==!1,l=k&&cG.test(j),m=k&&!l&&typeof i=="string"&&!(c.contentType||"").indexOf("application/x-www-form-urlencoded")&&cG.test(i);if(c.dataTypes[0]==="jsonp"||l||m)return f=c.jsonpCallback=p.isFunction(c.jsonpCallback)?c.jsonpCallback():c.jsonpCallback,g=a[f],l?c.url=j.replace(cG,"$1"+f):m?c.data=i.replace(cG,"$1"+f):k&&(c.url+=(cF.test(j)?"&":"?")+c.jsonp+"="+f),c.converters["script json"]=function(){return h||p.error(f+" was not called"),h[0]},c.dataTypes[0]="json",a[f]=function(){h=arguments},e.always(function(){a[f]=g,c[f]&&(c.jsonpCallback=d.jsonpCallback,cE.push(f)),h&&p.isFunction(g)&&g(h[0]),h=g=b}),"script"}),p.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){return p.globalEval(a),a}}}),p.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),p.ajaxTransport("script",function(a){if(a.crossDomain){var c,d=e.head||e.getElementsByTagName("head")[0]||e.documentElement;return{send:function(f,g){c=e.createElement("script"),c.async="async",a.scriptCharset&&(c.charset=a.scriptCharset),c.src=a.url,c.onload=c.onreadystatechange=function(a,e){if(e||!c.readyState||/loaded|complete/.test(c.readyState))c.onload=c.onreadystatechange=null,d&&c.parentNode&&d.removeChild(c),c=b,e||g(200,"success")},d.insertBefore(c,d.firstChild)},abort:function(){c&&c.onload(0,1)}}}});var cI,cJ=a.ActiveXObject?function(){for(var a in cI)cI[a](0,1)}:!1,cK=0;p.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&cL()||cM()}:cL,function(a){p.extend(p.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(p.ajaxSettings.xhr()),p.support.ajax&&p.ajaxTransport(function(c){if(!c.crossDomain||p.support.cors){var d;return{send:function(e,f){var g,h,i=c.xhr();c.username?i.open(c.type,c.url,c.async,c.username,c.password):i.open(c.type,c.url,c.async);if(c.xhrFields)for(h in c.xhrFields)i[h]=c.xhrFields[h];c.mimeType&&i.overrideMimeType&&i.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(h in e)i.setRequestHeader(h,e[h])}catch(j){}i.send(c.hasContent&&c.data||null),d=function(a,e){var h,j,k,l,m;try{if(d&&(e||i.readyState===4)){d=b,g&&(i.onreadystatechange=p.noop,cJ&&delete cI[g]);if(e)i.readyState!==4&&i.abort();else{h=i.status,k=i.getAllResponseHeaders(),l={},m=i.responseXML,m&&m.documentElement&&(l.xml=m);try{l.text=i.responseText}catch(a){}try{j=i.statusText}catch(n){j=""}!h&&c.isLocal&&!c.crossDomain?h=l.text?200:404:h===1223&&(h=204)}}}catch(o){e||f(-1,o)}l&&f(h,j,l,k)},c.async?i.readyState===4?setTimeout(d,0):(g=++cK,cJ&&(cI||(cI={},p(a).unload(cJ)),cI[g]=d),i.onreadystatechange=d):d()},abort:function(){d&&d(0,1)}}}});var cN,cO,cP=/^(?:toggle|show|hide)$/,cQ=new RegExp("^(?:([-+])=|)("+q+")([a-z%]*)$","i"),cR=/queueHooks$/,cS=[cY],cT={"*":[function(a,b){var c,d,e=this.createTween(a,b),f=cQ.exec(b),g=e.cur(),h=+g||0,i=1,j=20;if(f){c=+f[2],d=f[3]||(p.cssNumber[a]?"":"px");if(d!=="px"&&h){h=p.css(e.elem,a,!0)||c||1;do i=i||".5",h=h/i,p.style(e.elem,a,h+d);while(i!==(i=e.cur()/g)&&i!==1&&--j)}e.unit=d,e.start=h,e.end=f[1]?h+(f[1]+1)*c:c}return e}]};p.Animation=p.extend(cW,{tweener:function(a,b){p.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");var c,d=0,e=a.length;for(;d<e;d++)c=a[d],cT[c]=cT[c]||[],cT[c].unshift(b)},prefilter:function(a,b){b?cS.unshift(a):cS.push(a)}}),p.Tween=cZ,cZ.prototype={constructor:cZ,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(p.cssNumber[c]?"":"px")},cur:function(){var a=cZ.propHooks[this.prop];return a&&a.get?a.get(this):cZ.propHooks._default.get(this)},run:function(a){var b,c=cZ.propHooks[this.prop];return this.options.duration?this.pos=b=p.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):cZ.propHooks._default.set(this),this}},cZ.prototype.init.prototype=cZ.prototype,cZ.propHooks={_default:{get:function(a){var b;return a.elem[a.prop]==null||!!a.elem.style&&a.elem.style[a.prop]!=null?(b=p.css(a.elem,a.prop,!1,""),!b||b==="auto"?0:b):a.elem[a.prop]},set:function(a){p.fx.step[a.prop]?p.fx.step[a.prop](a):a.elem.style&&(a.elem.style[p.cssProps[a.prop]]!=null||p.cssHooks[a.prop])?p.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},cZ.propHooks.scrollTop=cZ.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},p.each(["toggle","show","hide"],function(a,b){var c=p.fn[b];p.fn[b]=function(d,e,f){return d==null||typeof d=="boolean"||!a&&p.isFunction(d)&&p.isFunction(e)?c.apply(this,arguments):this.animate(c$(b,!0),d,e,f)}}),p.fn.extend({fadeTo:function(a,b,c,d){return this.filter(bZ).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=p.isEmptyObject(a),f=p.speed(b,c,d),g=function(){var b=cW(this,p.extend({},a),f);e&&b.stop(!0)};return e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,c,d){var e=function(a){var b=a.stop;delete a.stop,b(d)};return typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,c=a!=null&&a+"queueHooks",f=p.timers,g=p._data(this);if(c)g[c]&&g[c].stop&&e(g[c]);else for(c in g)g[c]&&g[c].stop&&cR.test(c)&&e(g[c]);for(c=f.length;c--;)f[c].elem===this&&(a==null||f[c].queue===a)&&(f[c].anim.stop(d),b=!1,f.splice(c,1));(b||!d)&&p.dequeue(this,a)})}}),p.each({slideDown:c$("show"),slideUp:c$("hide"),slideToggle:c$("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){p.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),p.speed=function(a,b,c){var d=a&&typeof a=="object"?p.extend({},a):{complete:c||!c&&b||p.isFunction(a)&&a,duration:a,easing:c&&b||b&&!p.isFunction(b)&&b};d.duration=p.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in p.fx.speeds?p.fx.speeds[d.duration]:p.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";return d.old=d.complete,d.complete=function(){p.isFunction(d.old)&&d.old.call(this),d.queue&&p.dequeue(this,d.queue)},d},p.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},p.timers=[],p.fx=cZ.prototype.init,p.fx.tick=function(){var a,b=p.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||p.fx.stop()},p.fx.timer=function(a){a()&&p.timers.push(a)&&!cO&&(cO=setInterval(p.fx.tick,p.fx.interval))},p.fx.interval=13,p.fx.stop=function(){clearInterval(cO),cO=null},p.fx.speeds={slow:600,fast:200,_default:400},p.fx.step={},p.expr&&p.expr.filters&&(p.expr.filters.animated=function(a){return p.grep(p.timers,function(b){return a===b.elem}).length});var c_=/^(?:body|html)$/i;p.fn.offset=function(a){if(arguments.length)return a===b?this:this.each(function(b){p.offset.setOffset(this,a,b)});var c,d,e,f,g,h,i,j={top:0,left:0},k=this[0],l=k&&k.ownerDocument;if(!l)return;return(d=l.body)===k?p.offset.bodyOffset(k):(c=l.documentElement,p.contains(c,k)?(typeof k.getBoundingClientRect!="undefined"&&(j=k.getBoundingClientRect()),e=da(l),f=c.clientTop||d.clientTop||0,g=c.clientLeft||d.clientLeft||0,h=e.pageYOffset||c.scrollTop,i=e.pageXOffset||c.scrollLeft,{top:j.top+h-f,left:j.left+i-g}):j)},p.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;return p.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(p.css(a,"marginTop"))||0,c+=parseFloat(p.css(a,"marginLeft"))||0),{top:b,left:c}},setOffset:function(a,b,c){var d=p.css(a,"position");d==="static"&&(a.style.position="relative");var e=p(a),f=e.offset(),g=p.css(a,"top"),h=p.css(a,"left"),i=(d==="absolute"||d==="fixed")&&p.inArray("auto",[g,h])>-1,j={},k={},l,m;i?(k=e.position(),l=k.top,m=k.left):(l=parseFloat(g)||0,m=parseFloat(h)||0),p.isFunction(b)&&(b=b.call(a,c,f)),b.top!=null&&(j.top=b.top-f.top+l),b.left!=null&&(j.left=b.left-f.left+m),"using"in b?b.using.call(a,j):e.css(j)}},p.fn.extend({position:function(){if(!this[0])return;var a=this[0],b=this.offsetParent(),c=this.offset(),d=c_.test(b[0].nodeName)?{top:0,left:0}:b.offset();return c.top-=parseFloat(p.css(a,"marginTop"))||0,c.left-=parseFloat(p.css(a,"marginLeft"))||0,d.top+=parseFloat(p.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(p.css(b[0],"borderLeftWidth"))||0,{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||e.body;while(a&&!c_.test(a.nodeName)&&p.css(a,"position")==="static")a=a.offsetParent;return a||e.body})}}),p.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);p.fn[a]=function(e){return p.access(this,function(a,e,f){var g=da(a);if(f===b)return g?c in g?g[c]:g.document.documentElement[e]:a[e];g?g.scrollTo(d?p(g).scrollLeft():f,d?f:p(g).scrollTop()):a[e]=f},a,e,arguments.length,null)}}),p.each({Height:"height",Width:"width"},function(a,c){p.each({padding:"inner"+a,content:c,"":"outer"+a},function(d,e){p.fn[e]=function(e,f){var g=arguments.length&&(d||typeof e!="boolean"),h=d||(e===!0||f===!0?"margin":"border");return p.access(this,function(c,d,e){var f;return p.isWindow(c)?c.document.documentElement["client"+a]:c.nodeType===9?(f=c.documentElement,Math.max(c.body["scroll"+a],f["scroll"+a],c.body["offset"+a],f["offset"+a],f["client"+a])):e===b?p.css(c,d,e,h):p.style(c,d,e,h)},c,g?e:b,g,null)}})}),a.jQuery=a.$=p,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return p})})(window);
\ No newline at end of file
--- /dev/null
+/*! jQuery Mobile vGit Build: SHA1: b49cc06499abf8f987cf90f35349cfac0918c939 <> Date: Tue Oct 2 11:22:34 2012 -0700 jquerymobile.com | jquery.org/license !*/
+(function(a,b,c){typeof define=="function"&&define.amd?define(["jquery"],function(d){return c(d,a,b),d.mobile}):c(a.jQuery,a,b)})(this,document,function(a,b,c,d){(function(a,b,d){var e={};a.mobile=a.extend({},{version:"1.2.0",ns:"",subPageUrlKey:"ui-page",activePageClass:"ui-page-active",activeBtnClass:"ui-btn-active",focusClass:"ui-focus",ajaxEnabled:!0,hashListeningEnabled:!0,linkBindingEnabled:!0,defaultPageTransition:"fade",maxTransitionWidth:!1,minScrollBack:250,touchOverflowEnabled:!1,defaultDialogTransition:"pop",pageLoadErrorMessage:"Error Loading Page",pageLoadErrorMessageTheme:"e",phonegapNavigationEnabled:!1,autoInitializePage:!0,pushStateEnabled:!0,ignoreContentEnabled:!1,orientationChangeEnabled:!0,buttonMarkup:{hoverDelay:200},keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91},silentScroll:function(d){a.type(d)!=="number"&&(d=a.mobile.defaultHomeScroll),a.event.special.scrollstart.enabled=!1,setTimeout(function(){b.scrollTo(0,d),a(c).trigger("silentscroll",{x:0,y:d})},20),setTimeout(function(){a.event.special.scrollstart.enabled=!0},150)},nsNormalizeDict:e,nsNormalize:function(b){if(!b)return;return e[b]||(e[b]=a.camelCase(a.mobile.ns+b))},getInheritedTheme:function(a,b){var c=a[0],d="",e=/ui-(bar|body|overlay)-([a-z])\b/,f,g;while(c){f=c.className||"";if(f&&(g=e.exec(f))&&(d=g[2]))break;c=c.parentNode}return d||b||"a"},closestPageData:function(a){return a.closest(':jqmData(role="page"), :jqmData(role="dialog")').data("page")},enhanceable:function(a){return this.haveParents(a,"enhance")},hijackable:function(a){return this.haveParents(a,"ajax")},haveParents:function(b,c){if(!a.mobile.ignoreContentEnabled)return b;var d=b.length,e=a(),f,g,h;for(var i=0;i<d;i++){g=b.eq(i),h=!1,f=b[i];while(f){var j=f.getAttribute?f.getAttribute("data-"+a.mobile.ns+c):"";if(j==="false"){h=!0;break}f=f.parentNode}h||(e=e.add(g))}return e},getScreenHeight:function(){return b.innerHeight||a(b).height()}},a.mobile),a.fn.jqmData=function(b,c){var e;return typeof b!="undefined"&&(b&&(b=a.mobile.nsNormalize(b)),arguments.length<2||c===d?e=this.data(b):e=this.data(b,c)),e},a.jqmData=function(b,c,d){var e;return typeof c!="undefined"&&(e=a.data(b,c?a.mobile.nsNormalize(c):c,d)),e},a.fn.jqmRemoveData=function(b){return this.removeData(a.mobile.nsNormalize(b))},a.jqmRemoveData=function(b,c){return a.removeData(b,a.mobile.nsNormalize(c))},a.fn.removeWithDependents=function(){a.removeWithDependents(this)},a.removeWithDependents=function(b){var c=a(b);(c.jqmData("dependents")||a()).remove(),c.remove()},a.fn.addDependents=function(b){a.addDependents(a(this),b)},a.addDependents=function(b,c){var d=a(b).jqmData("dependents")||a();a(b).jqmData("dependents",a.merge(d,c))},a.fn.getEncodedText=function(){return a("<div/>").text(a(this).text()).html()},a.fn.jqmEnhanceable=function(){return a.mobile.enhanceable(this)},a.fn.jqmHijackable=function(){return a.mobile.hijackable(this)};var f=a.find,g=/:jqmData\(([^)]*)\)/g;a.find=function(b,c,d,e){return b=b.replace(g,"[data-"+(a.mobile.ns||"")+"$1]"),f.call(this,b,c,d,e)},a.extend(a.find,f),a.find.matches=function(b,c){return a.find(b,null,null,c)},a.find.matchesSelector=function(b,c){return a.find(c,null,null,[b]).length>0}})(a,this),function(a,b){var c=0,d=Array.prototype.slice,e=a.cleanData;a.cleanData=function(b){for(var c=0,d;(d=b[c])!=null;c++)try{a(d).triggerHandler("remove")}catch(f){}e(b)},a.widget=function(b,c,d){var e,f,g,h,i=b.split(".")[0];b=b.split(".")[1],e=i+"-"+b,d||(d=c,c=a.Widget),a.expr[":"][e]=function(b){return!!a.data(b,e)},a[i]=a[i]||{},f=a[i][b],g=a[i][b]=function(a,b){if(!this._createWidget)return new g(a,b);arguments.length&&this._createWidget(a,b)},a.extend(g,f,{version:d.version,_proto:a.extend({},d),_childConstructors:[]}),h=new c,h.options=a.widget.extend({},h.options),a.each(d,function(b,e){a.isFunction(e)&&(d[b]=function(){var a=function(){return c.prototype[b].apply(this,arguments)},d=function(a){return c.prototype[b].apply(this,a)};return function(){var b=this._super,c=this._superApply,f;return this._super=a,this._superApply=d,f=e.apply(this,arguments),this._super=b,this._superApply=c,f}}())}),g.prototype=a.widget.extend(h,{widgetEventPrefix:b},d,{constructor:g,namespace:i,widgetName:b,widgetBaseClass:e,widgetFullName:e}),f?(a.each(f._childConstructors,function(b,c){var d=c.prototype;a.widget(d.namespace+"."+d.widgetName,g,c._proto)}),delete f._childConstructors):c._childConstructors.push(g),a.widget.bridge(b,g)},a.widget.extend=function(c){var e=d.call(arguments,1),f=0,g=e.length,h,i;for(;f<g;f++)for(h in e[f])i=e[f][h],e[f].hasOwnProperty(h)&&i!==b&&(c[h]=a.isPlainObject(i)?a.widget.extend({},c[h],i):i);return c},a.widget.bridge=function(c,e){var f=e.prototype.widgetFullName;a.fn[c]=function(g){var h=typeof g=="string",i=d.call(arguments,1),j=this;return g=!h&&i.length?a.widget.extend.apply(null,[g].concat(i)):g,h?this.each(function(){var d,e=a.data(this,f);if(!e)return a.error("cannot call methods on "+c+" prior to initialization; "+"attempted to call method '"+g+"'");if(!a.isFunction(e[g])||g.charAt(0)==="_")return a.error("no such method '"+g+"' for "+c+" widget instance");d=e[g].apply(e,i);if(d!==e&&d!==b)return j=d&&d.jquery?j.pushStack(d.get()):d,!1}):this.each(function(){var b=a.data(this,f);b?b.option(g||{})._init():new e(g,this)}),j}},a.Widget=function(a,b){},a.Widget._childConstructors=[],a.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(b,d){d=a(d||this.defaultElement||this)[0],this.element=a(d),this.uuid=c++,this.eventNamespace="."+this.widgetName+this.uuid,this.options=a.widget.extend({},this.options,this._getCreateOptions(),b),this.bindings=a(),this.hoverable=a(),this.focusable=a(),d!==this&&(a.data(d,this.widgetName,this),a.data(d,this.widgetFullName,this),this._on({remove:"destroy"}),this.document=a(d.style?d.ownerDocument:d.document||d),this.window=a(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:a.noop,_getCreateEventData:a.noop,_create:a.noop,_init:a.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetName).removeData(this.widgetFullName).removeData(a.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:a.noop,widget:function(){return this.element},option:function(c,d){var e=c,f,g,h;if(arguments.length===0)return a.widget.extend({},this.options);if(typeof c=="string"){e={},f=c.split("."),c=f.shift();if(f.length){g=e[c]=a.widget.extend({},this.options[c]);for(h=0;h<f.length-1;h++)g[f[h]]=g[f[h]]||{},g=g[f[h]];c=f.pop();if(d===b)return g[c]===b?null:g[c];g[c]=d}else{if(d===b)return this.options[c]===b?null:this.options[c];e[c]=d}}return this._setOptions(e),this},_setOptions:function(a){var b;for(b in a)this._setOption(b,a[b]);return this},_setOption:function(a,b){return this.options[a]=b,a==="disabled"&&(this.widget().toggleClass(this.widgetFullName+"-disabled ui-state-disabled",!!b).attr("aria-disabled",b),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")),this},enable:function(){return this._setOption("disabled",!1)},disable:function(){return this._setOption("disabled",!0)},_on:function(b,c){c?(b=a(b),this.bindings=this.bindings.add(b)):(c=b,b=this.element);var d=this;a.each(c,function(c,e){function f(){if(d.options.disabled===!0||a(this).hasClass("ui-state-disabled"))return;return(typeof e=="string"?d[e]:e).apply(d,arguments)}typeof e!="string"&&(f.guid=e.guid=e.guid||f.guid||a.guid++);var g=c.match(/^(\w+)\s*(.*)$/),h=g[1]+d.eventNamespace,i=g[2];i?d.widget().delegate(i,h,f):b.bind(h,f)})},_off:function(a,b){b=(b||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,a.unbind(b).undelegate(b)},_delay:function(a,b){function c(){return(typeof a=="string"?d[a]:a).apply(d,arguments)}var d=this;return setTimeout(c,b||0)},_hoverable:function(b){this.hoverable=this.hoverable.add(b),this._on(b,{mouseenter:function(b){a(b.currentTarget).addClass("ui-state-hover")},mouseleave:function(b){a(b.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(b){this.focusable=this.focusable.add(b),this._on(b,{focusin:function(b){a(b.currentTarget).addClass("ui-state-focus")},focusout:function(b){a(b.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(b,c,d){var e,f,g=this.options[b];d=d||{},c=a.Event(c),c.type=(b===this.widgetEventPrefix?b:this.widgetEventPrefix+b).toLowerCase(),c.target=this.element[0],f=c.originalEvent;if(f)for(e in f)e in c||(c[e]=f[e]);return this.element.trigger(c,d),!(a.isFunction(g)&&g.apply(this.element[0],[c].concat(d))===!1||c.isDefaultPrevented())}},a.each({show:"fadeIn",hide:"fadeOut"},function(b,c){a.Widget.prototype["_"+b]=function(d,e,f){typeof e=="string"&&(e={effect:e});var g,h=e?e===!0||typeof e=="number"?c:e.effect||c:b;e=e||{},typeof e=="number"&&(e={duration:e}),g=!a.isEmptyObject(e),e.complete=f,e.delay&&d.delay(e.delay),g&&a.effects&&(a.effects.effect[h]||a.uiBackCompat!==!1&&a.effects[h])?d[b](e):h!==b&&d[h]?d[h](e.duration,e.easing,f):d.queue(function(c){a(this)[b](),f&&f.call(d[0]),c()})}}),a.uiBackCompat!==!1&&(a.Widget.prototype._getCreateOptions=function(){return a.metadata&&a.metadata.get(this.element[0])[this.widgetName]})}(a),function(a,b){a.widget("mobile.widget",{_createWidget:function(){a.Widget.prototype._createWidget.apply(this,arguments),this._trigger("init")},_getCreateOptions:function(){var c=this.element,d={};return a.each(this.options,function(a){var e=c.jqmData(a.replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()}));e!==b&&(d[a]=e)}),d},enhanceWithin:function(b,c){this.enhance(a(this.options.initSelector,a(b)),c)},enhance:function(b,c){var d,e,f=a(b),g=this;f=a.mobile.enhanceable(f),c&&f.length&&(d=a.mobile.closestPageData(f),e=d&&d.keepNativeSelector()||"",f=f.not(e)),f[this.widgetName]()},raise:function(a){throw"Widget ["+this.widgetName+"]: "+a}})}(a),function(a,b){a.extend(a.mobile,{loadingMessageTextVisible:d,loadingMessageTheme:d,loadingMessage:d,showPageLoadingMsg:function(b,c,d){a.mobile.loading("show",b,c,d)},hidePageLoadingMsg:function(){a.mobile.loading("hide")},loading:function(){this.loaderWidget.loader.apply(this.loaderWidget,arguments)}});var c="ui-loader",e=a("html"),f=a(b);a.widget("mobile.loader",{options:{theme:"a",textVisible:!1,html:"",text:"loading"},defaultHtml:"<div class='"+c+"'>"+"<span class='ui-icon ui-icon-loading'></span>"+"<h1></h1>"+"</div>",fakeFixLoader:function(){var b=a("."+a.mobile.activeBtnClass).first();this.element.css({top:a.support.scrollTop&&f.scrollTop()+f.height()/2||b.length&&b.offset().top||100})},checkLoaderPosition:function(){var b=this.element.offset(),c=f.scrollTop(),d=a.mobile.getScreenHeight();if(b.top<c||b.top-c>d)this.element.addClass("ui-loader-fakefix"),this.fakeFixLoader(),f.unbind("scroll",this.checkLoaderPosition).bind("scroll",this.fakeFixLoader)},resetHtml:function(){this.element.html(a(this.defaultHtml).html())},show:function(b,g,h){var i,j,k,l;this.resetHtml(),a.type(b)==="object"?(l=a.extend({},this.options,b),b=l.theme||a.mobile.loadingMessageTheme):(l=this.options,b=b||a.mobile.loadingMessageTheme||l.theme),j=g||a.mobile.loadingMessage||l.text,e.addClass("ui-loading");if(a.mobile.loadingMessage!==!1||l.html)a.mobile.loadingMessageTextVisible!==d?i=a.mobile.loadingMessageTextVisible:i=l.textVisible,this.element.attr("class",c+" ui-corner-all ui-body-"+b+" ui-loader-"+(i||g||b.text?"verbose":"default")+(l.textonly||h?" ui-loader-textonly":"")),l.html?this.element.html(l.html):this.element.find("h1").text(j),this.element.appendTo(a.mobile.pageContainer),this.checkLoaderPosition(),f.bind("scroll",a.proxy(this.checkLoaderPosition,this))},hide:function(){e.removeClass("ui-loading"),a.mobile.loadingMessage&&this.element.removeClass("ui-loader-fakefix"),a(b).unbind("scroll",a.proxy(this.fakeFixLoader,this)),a(b).unbind("scroll",a.proxy(this.checkLoaderPosition,this))}}),f.bind("pagecontainercreate",function(){a.mobile.loaderWidget=a.mobile.loaderWidget||a(a.mobile.loader.prototype.defaultHtml).loader()})}(a,this),function(a,b,c,d){function x(a){while(a&&typeof a.originalEvent!="undefined")a=a.originalEvent;return a}function y(b,c){var e=b.type,f,g,i,k,l,m,n,o,p;b=a.Event(b),b.type=c,f=b.originalEvent,g=a.event.props,e.search(/^(mouse|click)/)>-1&&(g=j);if(f)for(n=g.length,k;n;)k=g[--n],b[k]=f[k];e.search(/mouse(down|up)|click/)>-1&&!b.which&&(b.which=1);if(e.search(/^touch/)!==-1){i=x(f),e=i.touches,l=i.changedTouches,m=e&&e.length?e[0]:l&&l.length?l[0]:d;if(m)for(o=0,p=h.length;o<p;o++)k=h[o],b[k]=m[k]}return b}function z(b){var c={},d,f;while(b){d=a.data(b,e);for(f in d)d[f]&&(c[f]=c.hasVirtualBinding=!0);b=b.parentNode}return c}function A(b,c){var d;while(b){d=a.data(b,e);if(d&&(!c||d[c]))return b;b=b.parentNode}return null}function B(){r=!1}function C(){r=!0}function D(){v=0,p.length=0,q=!1,C()}function E(){B()}function F(){G(),l=setTimeout(function(){l=0,D()},a.vmouse.resetTimerDuration)}function G(){l&&(clearTimeout(l),l=0)}function H(b,c,d){var e;if(d&&d[b]||!d&&A(c.target,b))e=y(c,b),a(c.target).trigger(e);return e}function I(b){var c=a.data(b.target,f);if(!q&&(!v||v!==c)){var d=H("v"+b.type,b);d&&(d.isDefaultPrevented()&&b.preventDefault(),d.isPropagationStopped()&&b.stopPropagation(),d.isImmediatePropagationStopped()&&b.stopImmediatePropagation())}}function J(b){var c=x(b).touches,d,e;if(c&&c.length===1){d=b.target,e=z(d);if(e.hasVirtualBinding){v=u++,a.data(d,f,v),G(),E(),o=!1;var g=x(b).touches[0];m=g.pageX,n=g.pageY,H("vmouseover",b,e),H("vmousedown",b,e)}}}function K(a){if(r)return;o||H("vmousecancel",a,z(a.target)),o=!0,F()}function L(b){if(r)return;var c=x(b).touches[0],d=o,e=a.vmouse.moveDistanceThreshold,f=z(b.target);o=o||Math.abs(c.pageX-m)>e||Math.abs(c.pageY-n)>e,o&&!d&&H("vmousecancel",b,f),H("vmousemove",b,f),F()}function M(a){if(r)return;C();var b=z(a.target),c;H("vmouseup",a,b);if(!o){var d=H("vclick",a,b);d&&d.isDefaultPrevented()&&(c=x(a).changedTouches[0],p.push({touchID:v,x:c.clientX,y:c.clientY}),q=!0)}H("vmouseout",a,b),o=!1,F()}function N(b){var c=a.data(b,e),d;if(c)for(d in c)if(c[d])return!0;return!1}function O(){}function P(b){var c=b.substr(1);return{setup:function(d,f){N(this)||a.data(this,e,{});var g=a.data(this,e);g[b]=!0,k[b]=(k[b]||0)+1,k[b]===1&&t.bind(c,I),a(this).bind(c,O),s&&(k.touchstart=(k.touchstart||0)+1,k.touchstart===1&&t.bind("touchstart",J).bind("touchend",M).bind("touchmove",L).bind("scroll",K))},teardown:function(d,f){--k[b],k[b]||t.unbind(c,I),s&&(--k.touchstart,k.touchstart||t.unbind("touchstart",J).unbind("touchmove",L).unbind("touchend",M).unbind("scroll",K));var g=a(this),h=a.data(this,e);h&&(h[b]=!1),g.unbind(c,O),N(this)||g.removeData(e)}}}var e="virtualMouseBindings",f="virtualTouchID",g="vmouseover vmousedown vmousemove vmouseup vclick vmouseout vmousecancel".split(" "),h="clientX clientY pageX pageY screenX screenY".split(" "),i=a.event.mouseHooks?a.event.mouseHooks.props:[],j=a.event.props.concat(i),k={},l=0,m=0,n=0,o=!1,p=[],q=!1,r=!1,s="addEventListener"in c,t=a(c),u=1,v=0,w;a.vmouse={moveDistanceThreshold:10,clickDistanceThreshold:10,resetTimerDuration:1500};for(var Q=0;Q<g.length;Q++)a.event.special[g[Q]]=P(g[Q]);s&&c.addEventListener("click",function(b){var c=p.length,d=b.target,e,g,h,i,j,k;if(c){e=b.clientX,g=b.clientY,w=a.vmouse.clickDistanceThreshold,h=d;while(h){for(i=0;i<c;i++){j=p[i],k=0;if(h===d&&Math.abs(j.x-e)<w&&Math.abs(j.y-g)<w||a.data(h,f)===j.touchID){b.preventDefault(),b.stopPropagation();return}}h=h.parentNode}}},!0)}(a,b,c),function(a,b){var d={touch:"ontouchend"in c};a.mobile=a.mobile||{},a.mobile.support=a.mobile.support||{},a.extend(a.support,d),a.extend(a.mobile.support,d)}(a),function(a,b,d){function j(b,c,d){var e=d.type;d.type=c,a.event.handle.call(b,d),d.type=e}a.each("touchstart touchmove touchend tap taphold swipe swipeleft swiperight scrollstart scrollstop".split(" "),function(b,c){a.fn[c]=function(a){return a?this.bind(c,a):this.trigger(c)},a.attrFn&&(a.attrFn[c]=!0)});var e=a.mobile.support.touch,f="touchmove scroll",g=e?"touchstart":"mousedown",h=e?"touchend":"mouseup",i=e?"touchmove":"mousemove";a.event.special.scrollstart={enabled:!0,setup:function(){function g(a,c){d=c,j(b,d?"scrollstart":"scrollstop",a)}var b=this,c=a(b),d,e;c.bind(f,function(b){if(!a.event.special.scrollstart.enabled)return;d||g(b,!0),clearTimeout(e),e=setTimeout(function(){g(b,!1)},50)})}},a.event.special.tap={tapholdThreshold:750,setup:function(){var b=this,d=a(b);d.bind("vmousedown",function(e){function i(){clearTimeout(h)}function k(){i(),d.unbind("vclick",l).unbind("vmouseup",i),a(c).unbind("vmousecancel",k)}function l(a){k(),f===a.target&&j(b,"tap",a)}if(e.which&&e.which!==1)return!1;var f=e.target,g=e.originalEvent,h;d.bind("vmouseup",i).bind("vclick",l),a(c).bind("vmousecancel",k),h=setTimeout(function(){j(b,"taphold",a.Event("taphold",{target:f}))},a.event.special.tap.tapholdThreshold)})}},a.event.special.swipe={scrollSupressionThreshold:30,durationThreshold:1e3,horizontalDistanceThreshold:30,verticalDistanceThreshold:75,setup:function(){var b=this,c=a(b);c.bind(g,function(b){function j(b){if(!f)return;var c=b.originalEvent.touches?b.originalEvent.touches[0]:b;g={time:(new Date).getTime(),coords:[c.pageX,c.pageY]},Math.abs(f.coords[0]-g.coords[0])>a.event.special.swipe.scrollSupressionThreshold&&b.preventDefault()}var e=b.originalEvent.touches?b.originalEvent.touches[0]:b,f={time:(new Date).getTime(),coords:[e.pageX,e.pageY],origin:a(b.target)},g;c.bind(i,j).one(h,function(b){c.unbind(i,j),f&&g&&g.time-f.time<a.event.special.swipe.durationThreshold&&Math.abs(f.coords[0]-g.coords[0])>a.event.special.swipe.horizontalDistanceThreshold&&Math.abs(f.coords[1]-g.coords[1])<a.event.special.swipe.verticalDistanceThreshold&&f.origin.trigger("swipe").trigger(f.coords[0]>g.coords[0]?"swipeleft":"swiperight"),f=g=d})})}},a.each({scrollstop:"scrollstart",taphold:"tap",swipeleft:"swipe",swiperight:"swipe"},function(b,c){a.event.special[b]={setup:function(){a(this).bind(c,a.noop)}}})}(a,this),function(a,c){a.extend(a.support,{orientation:"orientation"in b&&"onorientationchange"in b})}(a),function(a){a.event.special.throttledresize={setup:function(){a(this).bind("resize",c)},teardown:function(){a(this).unbind("resize",c)}};var b=250,c=function(){f=(new Date).getTime(),g=f-d,g>=b?(d=f,a(this).trigger("throttledresize")):(e&&clearTimeout(e),e=setTimeout(c,b-g))},d=0,e,f,g}(a),function(a,b){function o(){var a=g();a!==h&&(h=a,d.trigger(e))}var d=a(b),e="orientationchange",f,g,h,i,j,k={0:!0,180:!0};if(a.support.orientation){var l=b.innerWidth||a(b).width(),m=b.innerHeight||a(b).height(),n=50;i=l>m&&l-m>n,j=k[b.orientation];if(i&&j||!i&&!j)k={"-90":!0,90:!0}}a.event.special.orientationchange=a.extend({},a.event.special.orientationchange,{setup:function(){if(a.support.orientation&&!a.event.special.orientationchange.disabled)return!1;h=g(),d.bind("throttledresize",o)},teardown:function(){if(a.support.orientation&&!a.event.special.orientationchange.disabled)return!1;d.unbind("throttledresize",o)},add:function(a){var b=a.handler;a.handler=function(a){return a.orientation=g(),b.apply(this,arguments)}}}),a.event.special.orientationchange.orientation=g=function(){var d=!0,e=c.documentElement;return a.support.orientation?d=k[b.orientation]:d=e&&e.clientWidth/e.clientHeight<1.1,d?"portrait":"landscape"},a.fn[e]=function(a){return a?this.bind(e,a):this.trigger(e)},a.attrFn&&(a.attrFn[e]=!0)}(a,this),function(a,d){var e=a(b),f=a("html");a.mobile.media=function(){var b={},d=a("<div id='jquery-mediatest'></div>"),e=a("<body>").append(d);return function(a){if(!(a in b)){var g=c.createElement("style"),h="@media "+a+" { #jquery-mediatest { position:absolute; } }";g.type="text/css",g.styleSheet?g.styleSheet.cssText=h:g.appendChild(c.createTextNode(h)),f.prepend(e).prepend(g),b[a]=d.css("position")==="absolute",e.add(g).remove()}return b[a]}}()}(a),function(a,d){function e(a){var b=a.charAt(0).toUpperCase()+a.substr(1),c=(a+" "+h.join(b+" ")+b).split(" ");for(var e in c)if(g[c[e]]!==d)return!0}function m(a,b,d){var e=c.createElement("div"),f=function(a){return a.charAt(0).toUpperCase()+a.substr(1)},g=function(a){return"-"+a.charAt(0).toLowerCase()+a.substr(1)+"-"},i=function(c){var d=g(c)+a+": "+b+";",h=f(c),i=h+f(a);e.setAttribute("style",d),!e.style[i]||(k=!0)},j=d?[d]:h,k;for(var l=0;l<j.length;l++)i(j[l]);return!!k}function n(){var b="transform-3d";return m("perspective","10px","moz")||a.mobile.media("(-"+h.join("-"+b+"),(-")+"-"+b+"),("+b+")")}function o(){var b=location.protocol+"//"+location.host+location.pathname+"ui-dir/",c=a("head base"),d=null,e="",g,h;return c.length?e=c.attr("href"):c=d=a("<base>",{href:b}).appendTo("head"),g=a("<a href='testurl' />").prependTo(f),h=g[0].href,c[0].href=e||location.pathname,d&&d.remove(),h.indexOf(b)===0}function p(){var a=c.createElement("x"),d=c.documentElement,e=b.getComputedStyle,f;return"pointerEvents"in a.style?(a.style.pointerEvents="auto",a.style.pointerEvents="x",d.appendChild(a),f=e&&e(a,"").pointerEvents==="auto",d.removeChild(a),!!f):!1}function q(){var a=c.createElement("div");return typeof a.getBoundingClientRect!="undefined"}var f=a("<body>").prependTo("html"),g=f[0].style,h=["Webkit","Moz","O"],i="palmGetResource"in b,j=b.opera,k=b.operamini&&{}.toString.call(b.operamini)==="[object OperaMini]",l=b.blackberry&&!e("-webkit-transform");a.extend(a.mobile,{browser:{}}),a.mobile.browser.ie=function(){var a=3,b=c.createElement("div"),d=b.all||[];do b.innerHTML="<!--[if gt IE "+ ++a+"]><br><![endif]-->";while(d[0]);return a>4?a:!a}(),a.extend(a.support,{cssTransitions:"WebKitTransitionEvent"in b||m("transition","height 100ms linear")&&!j,pushState:"pushState"in history&&"replaceState"in history,mediaquery:a.mobile.media("only all"),cssPseudoElement:!!e("content"),touchOverflow:!!e("overflowScrolling"),cssTransform3d:n(),boxShadow:!!e("boxShadow")&&!l,scrollTop:("pageXOffset"in b||"scrollTop"in c.documentElement||"scrollTop"in f[0])&&!i&&!k,dynamicBaseTag:o(),cssPointerEvents:p(),boundingRect:q()}),f.remove();var r=function(){var a=b.navigator.userAgent;return a.indexOf("Nokia")>-1&&(a.indexOf("Symbian/3")>-1||a.indexOf("Series60/5")>-1)&&a.indexOf("AppleWebKit")>-1&&a.match(/(BrowserNG|NokiaBrowser)\/7\.[0-3]/)}();a.mobile.gradeA=function(){return(a.support.mediaquery||a.mobile.browser.ie&&a.mobile.browser.ie>=7)&&(a.support.boundingRect||a.fn.jquery.match(/1\.[0-7+]\.[0-9+]?/)!==null)},a.mobile.ajaxBlacklist=b.blackberry&&!b.WebKitPoint||k||r,r&&a(function(){a("head link[rel='stylesheet']").attr("rel","alternate stylesheet").attr("rel","stylesheet")}),a.support.boxShadow||a("html").addClass("ui-mobile-nosupport-boxshadow")}(a),function(a,b){a.widget("mobile.page",a.mobile.widget,{options:{theme:"c",domCache:!1,keepNativeDefault:":jqmData(role='none'), :jqmData(role='nojs')"},_create:function(){var a=this;if(a._trigger("beforecreate")===!1)return!1;a.element.attr("tabindex","0").addClass("ui-page ui-body-"+a.options.theme).bind("pagebeforehide",function(){a.removeContainerBackground()}).bind("pagebeforeshow",function(){a.setContainerBackground()})},removeContainerBackground:function(){a.mobile.pageContainer.removeClass("ui-overlay-"+a.mobile.getInheritedTheme(this.element.parent()))},setContainerBackground:function(b){this.options.theme&&a.mobile.pageContainer.addClass("ui-overlay-"+(b||this.options.theme))},keepNativeSelector:function(){var b=this.options,c=b.keepNative&&a.trim(b.keepNative);return c&&b.keepNative!==b.keepNativeDefault?[b.keepNative,b.keepNativeDefault].join(", "):b.keepNativeDefault}})}(a),function(a,b,d){function k(a){return a=a||location.href,"#"+a.replace(/^[^#]*#?(.*)$/,"$1")}var e="hashchange",f=c,g,h=a.event.special,i=f.documentMode,j="on"+e in b&&(i===d||i>7);a.fn[e]=function(a){return a?this.bind(e,a):this.trigger(e)},a.fn[e].delay=50,h[e]=a.extend(h[e],{setup:function(){if(j)return!1;a(g.start)},teardown:function(){if(j)return!1;a(g.stop)}}),g=function(){function n(){var c=k(),d=m(h);c!==h?(l(h=c,d),a(b).trigger(e)):d!==h&&(location.href=location.href.replace(/#.*/,"")+d),g=setTimeout(n,a.fn[e].delay)}var c={},g,h=k(),i=function(a){return a},l=i,m=i;return c.start=function(){g||n()},c.stop=function(){g&&clearTimeout(g),g=d},a.browser.msie&&!j&&function(){var b,d;c.start=function(){b||(d=a.fn[e].src,d=d&&d+k(),b=a('<iframe tabindex="-1" title="empty"/>').hide().one("load",function(){d||l(k()),n()}).attr("src",d||"javascript:0").insertAfter("body")[0].contentWindow,f.onpropertychange=function(){try{event.propertyName==="title"&&(b.document.title=f.title)}catch(a){}})},c.stop=i,m=function(){return k(b.location.href)},l=function(c,d){var g=b.document,h=a.fn[e].domain;c!==d&&(g.title=f.title,g.open(),h&&g.write('<script>document.domain="'+h+'"</script>'),g.close(),b.location.hash=c)}}(),c}()}(a,this),function(a,b,c){var d=function(d){return d===c&&(d=!0),function(c,e,f,g){var h=new a.Deferred,i=e?" reverse":"",j=a.mobile.urlHistory.getActive(),k=j.lastScroll||a.mobile.defaultHomeScroll,l=a.mobile.getScreenHeight(),m=a.mobile.maxTransitionWidth!==!1&&a(b).width()>a.mobile.maxTransitionWidth,n=!a.support.cssTransitions||m||!c||c==="none"||Math.max(a(b).scrollTop(),k)>a.mobile.getMaxScrollForTransition(),o=" ui-page-pre-in",p=function(){a.mobile.pageContainer.toggleClass("ui-mobile-viewport-transitioning viewport-"+c)},q=function(){a.event.special.scrollstart.enabled=!1,b.scrollTo(0,k),setTimeout(function(){a.event.special.scrollstart.enabled=!0},150)},r=function(){g.removeClass(a.mobile.activePageClass+" out in reverse "+c).height("")},s=function(){d?g.animationComplete(t):t(),g.height(l+a(b).scrollTop()).addClass(c+" out"+i)},t=function(){g&&d&&r(),u()},u=function(){f.css("z-index",-10),f.addClass(a.mobile.activePageClass+o),a.mobile.focusPage(f),f.height(l+k),q(),f.css("z-index",""),n||f.animationComplete(v),f.removeClass(o).addClass(c+" in"+i),n&&v()},v=function(){d||g&&r(),f.removeClass("out in reverse "+c).height(""),p(),a(b).scrollTop()!==k&&q(),h.resolve(c,e,f,g,!0)};return p(),g&&!n?s():t(),h.promise()}},e=d(),f=d(!1),g=function(){return a.mobile.getScreenHeight()*3};a.mobile.defaultTransitionHandler=e,a.mobile.transitionHandlers={"default":a.mobile.defaultTransitionHandler,sequential:e,simultaneous:f},a.mobile.transitionFallbacks={},a.mobile._maybeDegradeTransition=function(b){return b&&!a.support.cssTransform3d&&a.mobile.transitionFallbacks[b]&&(b=a.mobile.transitionFallbacks[b]),b},a.mobile.getMaxScrollForTransition=a.mobile.getMaxScrollForTransition||g}(a,this),function(a,d){function u(b){!!i&&(!i.closest("."+a.mobile.activePageClass).length||b)&&i.removeClass(a.mobile.activeBtnClass),i=null}function v(){m=!1,l.length>0&&a.mobile.changePage.apply(null,l.pop())}function z(b,c,d,e){c&&c.data("page")._trigger("beforehide",null,{nextPage:b}),b.data("page")._trigger("beforeshow",null,{prevPage:c||a("")}),a.mobile.hidePageLoadingMsg(),d=a.mobile._maybeDegradeTransition(d);var f=a.mobile.transitionHandlers[d||"default"]||a.mobile.defaultTransitionHandler,g=f(d,e,b,c);return g.done(function(){c&&c.data("page")._trigger("hide",null,{nextPage:b}),b.data("page")._trigger("show",null,{prevPage:c||a("")})}),g}function A(){var b=a("."+a.mobile.activePageClass),c=parseFloat(b.css("padding-top")),d=parseFloat(b.css("padding-bottom")),e=parseFloat(b.css("border-top-width")),f=parseFloat(b.css("border-bottom-width"));b.css("min-height",s()-c-d-e-f)}function B(b,c){c&&b.attr("data-"+a.mobile.ns+"role",c),b.page()}function C(a){while(a){if(typeof a.nodeName=="string"&&a.nodeName.toLowerCase()==="a")break;a=a.parentNode}return a}function D(b){var c=a(b).closest(".ui-page").jqmData("url"),d=q.hrefNoHash;if(!c||!h.isPath(c))c=d;return h.makeUrlAbsolute(c,d)}var e=a(b),f=a("html"),g=a("head"),h={urlParseRE:/^(((([^:\/#\?]+:)?(?:(\/\/)((?:(([^:@\/#\?]+)(?:\:([^:@\/#\?]+))?)@)?(([^:\/#\?\]\[]+|\[[^\/\]@#?]+\])(?:\:([0-9]+))?))?)?)?((\/?(?:[^\/\?#]+\/+)*)([^\?#]*)))?(\?[^#]+)?)(#.*)?/,getLocation:function(a){var b=a?this.parseUrl(a):location,c=this.parseUrl(a||location.href).hash;return c=c==="#"?"":c,b.protocol+"//"+b.host+b.pathname+b.search+c},parseLocation:function(){return this.parseUrl(this.getLocation())},parseUrl:function(b){if(a.type(b)==="object")return b;var c=h.urlParseRE.exec(b||"")||[];return{href:c[0]||"",hrefNoHash:c[1]||"",hrefNoSearch:c[2]||"",domain:c[3]||"",protocol:c[4]||"",doubleSlash:c[5]||"",authority:c[6]||"",username:c[8]||"",password:c[9]||"",host:c[10]||"",hostname:c[11]||"",port:c[12]||"",pathname:c[13]||"",directory:c[14]||"",filename:c[15]||"",search:c[16]||"",hash:c[17]||""}},makePathAbsolute:function(a,b){if(a&&a.charAt(0)==="/")return a;a=a||"",b=b?b.replace(/^\/|(\/[^\/]*|[^\/]+)$/g,""):"";var c=b?b.split("/"):[],d=a.split("/");for(var e=0;e<d.length;e++){var f=d[e];switch(f){case".":break;case"..":c.length&&c.pop();break;default:c.push(f)}}return"/"+c.join("/")},isSameDomain:function(a,b){return h.parseUrl(a).domain===h.parseUrl(b).domain},isRelativeUrl:function(a){return h.parseUrl(a).protocol===""},isAbsoluteUrl:function(a){return h.parseUrl(a).protocol!==""},makeUrlAbsolute:function(a,b){if(!h.isRelativeUrl(a))return a;b===d&&(b=q);var c=h.parseUrl(a),e=h.parseUrl(b),f=c.protocol||e.protocol,g=c.protocol?c.doubleSlash:c.doubleSlash||e.doubleSlash,i=c.authority||e.authority,j=c.pathname!=="",k=h.makePathAbsolute(c.pathname||e.filename,e.pathname),l=c.search||!j&&e.search||"",m=c.hash;return f+g+i+k+l+m},addSearchParams:function(b,c){var d=h.parseUrl(b),e=typeof c=="object"?a.param(c):c,f=d.search||"?";return d.hrefNoSearch+f+(f.charAt(f.length-1)!=="?"?"&":"")+e+(d.hash||"")},convertUrlToDataUrl:function(a){var c=h.parseUrl(a);return h.isEmbeddedPage(c)?c.hash.split(n)[0].replace(/^#/,""):h.isSameDomain(c,q)?c.hrefNoHash.replace(q.domain,"").split(n)[0]:b.decodeURIComponent(a)},get:function(a){return a===d&&(a=h.parseLocation().hash),h.stripHash(a).replace(/[^\/]*\.[^\/*]+$/,"")},getFilePath:function(b){var c="&"+a.mobile.subPageUrlKey;return b&&b.split(c)[0].split(n)[0]},set:function(a){location.hash=a},isPath:function(a){return/\//.test(a)},clean:function(a){return a.replace(q.domain,"")},stripHash:function(a){return a.replace(/^#/,"")},cleanHash:function(a){return h.stripHash(a.replace(/\?.*$/,"").replace(n,""))},isHashValid:function(a){return/^#[^#]+$/.test(a)},isExternal:function(a){var b=h.parseUrl(a);return b.protocol&&b.domain!==p.domain?!0:!1},hasProtocol:function(a){return/^(:?\w+:)/.test(a)},isFirstPageUrl:function(b){var c=h.parseUrl(h.makeUrlAbsolute(b,q)),e=c.hrefNoHash===p.hrefNoHash||r&&c.hrefNoHash===q.hrefNoHash,f=a.mobile.firstPage,g=f&&f[0]?f[0].id:d;return e&&(!c.hash||c.hash==="#"||g&&c.hash.replace(/^#/,"")===g)},isEmbeddedPage:function(a){var b=h.parseUrl(a);return b.protocol!==""?b.hash&&(b.hrefNoHash===p.hrefNoHash||r&&b.hrefNoHash===q.hrefNoHash):/^#/.test(b.href)},isPermittedCrossDomainRequest:function(b,c){return a.mobile.allowCrossDomainPages&&b.protocol==="file:"&&c.search(/^https?:/)!==-1}},i=null,j={stack:[],activeIndex:0,getActive:function(){return j.stack[j.activeIndex]},getPrev:function(){return j.stack[j.activeIndex-1]},getNext:function(){return j.stack[j.activeIndex+1]},addNew:function(a,b,c,d,e){j.getNext()&&j.clearForward(),j.stack.push({url:a,transition:b,title:c,pageUrl:d,role:e}),j.activeIndex=j.stack.length-1},clearForward:function(){j.stack=j.stack.slice(0,j.activeIndex+1)},directHashChange:function(b){var c,e,f,g=this.getActive();a.each(j.stack,function(a,d){decodeURIComponent(b.currentUrl)===decodeURIComponent(d.url)&&(c=a<j.activeIndex,e=!c,f=a)}),this.activeIndex=f!==d?f:this.activeIndex,c?(b.either||b.isBack)(!0):e&&(b.either||b.isForward)(!1)},ignoreNextHashChange:!1},k="[tabindex],a,button:visible,select:visible,input",l=[],m=!1,n="&ui-state=dialog",o=g.children("base"),p=h.parseLocation(),q=o.length?h.parseUrl(h.makeUrlAbsolute(o.attr("href"),p.href)):p,r=p.hrefNoHash!==q.hrefNoHash,s=a.mobile.getScreenHeight,t=a.support.dynamicBaseTag?{element:o.length?o:a("<base>",{href:q.hrefNoHash}).prependTo(g),set:function(a){t.element.attr("href",h.makeUrlAbsolute(a,q))},reset:function(){t.element.attr("href",q.hrefNoHash)}}:d;a.mobile.back=function(){var a=b.navigator;this.phonegapNavigationEnabled&&a&&a.app&&a.app.backHistory?a.app.backHistory():b.history.back()},a.mobile.focusPage=function(a){var b=a.find("[autofocus]"),c=a.find(".ui-title:eq(0)");if(b.length){b.focus();return}c.length?c.focus():a.focus()};var w=!0,x,y;x=function(){if(!w)return;var b=a.mobile.urlHistory.getActive();if(b){var c=e.scrollTop();b.lastScroll=c<a.mobile.minScrollBack?a.mobile.defaultHomeScroll:c}},y=function(){setTimeout(x,100)},e.bind(a.support.pushState?"popstate":"hashchange",function(){w=!1}),e.one(a.support.pushState?"popstate":"hashchange",function(){w=!0}),e.one("pagecontainercreate",function(){a.mobile.pageContainer.bind("pagechange",function(){w=!0,e.unbind("scrollstop",y),e.bind("scrollstop",y)})}),e.bind("scrollstop",y),a.mobile._maybeDegradeTransition=a.mobile._maybeDegradeTransition||function(a){return a},a.fn.animationComplete=function(b){return a.support.cssTransitions?a(this).one("webkitAnimationEnd animationend",b):(setTimeout(b,0),a(this))},a.mobile.path=h,a.mobile.base=t,a.mobile.urlHistory=j,a.mobile.dialogHashKey=n,a.mobile.allowCrossDomainPages=!1,a.mobile.getDocumentUrl=function(b){return b?a.extend({},p):p.href},a.mobile.getDocumentBase=function(b){return b?a.extend({},q):q.href},a.mobile._bindPageRemove=function(){var b=a(this);!b.data("page").options.domCache&&b.is(":jqmData(external-page='true')")&&b.bind("pagehide.remove",function(){var b=a(this),c=new a.Event("pageremove");b.trigger(c),c.isDefaultPrevented()||b.removeWithDependents()})},a.mobile.loadPage=function(b,c){var e=a.Deferred(),f=a.extend({},a.mobile.loadPage.defaults,c),g=null,i=null,j=function(){var b=a.mobile.activePage&&D(a.mobile.activePage);return b||q.hrefNoHash},k=h.makeUrlAbsolute(b,j());f.data&&f.type==="get"&&(k=h.addSearchParams(k,f.data),f.data=d),f.data&&f.type==="post"&&(f.reloadPage=!0);var l=h.getFilePath(k),m=h.convertUrlToDataUrl(k);f.pageContainer=f.pageContainer||a.mobile.pageContainer,g=f.pageContainer.children("[data-"+a.mobile.ns+"url='"+m+"']"),g.length===0&&m&&!h.isPath(m)&&(g=f.pageContainer.children("#"+m).attr("data-"+a.mobile.ns+"url",m).jqmData("url",m));if(g.length===0)if(a.mobile.firstPage&&h.isFirstPageUrl(l))a.mobile.firstPage.parent().length&&(g=a(a.mobile.firstPage));else if(h.isEmbeddedPage(l))return e.reject(k,c),e.promise();if(g.length){if(!f.reloadPage)return B(g,f.role),e.resolve(k,c,g),e.promise();i=g}var n=f.pageContainer,o=new a.Event("pagebeforeload"),r={url:b,absUrl:k,dataUrl:m,deferred:e,options:f};n.trigger(o,r);if(o.isDefaultPrevented())return e.promise();if(f.showLoadMsg)var s=setTimeout(function(){a.mobile.showPageLoadingMsg()},f.loadMsgDelay),u=function(){clearTimeout(s),a.mobile.hidePageLoadingMsg()};return t&&t.reset(),!a.mobile.allowCrossDomainPages&&!h.isSameDomain(p,k)?e.reject(k,c):a.ajax({url:l,type:f.type,data:f.data,dataType:"html",success:function(d,j,n){var o=a("<div></div>"),p=d.match(/<title[^>]*>([^<]*)/)&&RegExp.$1,q=new RegExp("(<[^>]+\\bdata-"+a.mobile.ns+"role=[\"']?page[\"']?[^>]*>)"),s=new RegExp("\\bdata-"+a.mobile.ns+"url=[\"']?([^\"'>]*)[\"']?");q.test(d)&&RegExp.$1&&s.test(RegExp.$1)&&RegExp.$1&&(b=l=h.getFilePath(a("<div>"+RegExp.$1+"</div>").text())),t&&t.set(l),o.get(0).innerHTML=d,g=o.find(":jqmData(role='page'), :jqmData(role='dialog')").first(),g.length||(g=a("<div data-"+a.mobile.ns+"role='page'>"+d.split(/<\/?body[^>]*>/gmi)[1]+"</div>")),p&&!g.jqmData("title")&&(~p.indexOf("&")&&(p=a("<div>"+p+"</div>").text()),g.jqmData("title",p));if(!a.support.dynamicBaseTag){var v=h.get(l);g.find("[src], link[href], a[rel='external'], :jqmData(ajax='false'), a[target]").each(function(){var b=a(this).is("[href]")?"href":a(this).is("[src]")?"src":"action",c=a(this).attr(b);c=c.replace(location.protocol+"//"+location.host+location.pathname,""),/^(\w+:|#|\/)/.test(c)||a(this).attr(b,v+c)})}g.attr("data-"+a.mobile.ns+"url",h.convertUrlToDataUrl(l)).attr("data-"+a.mobile.ns+"external-page",!0).appendTo(f.pageContainer),g.one("pagecreate",a.mobile._bindPageRemove),B(g,f.role),k.indexOf("&"+a.mobile.subPageUrlKey)>-1&&(g=f.pageContainer.children("[data-"+a.mobile.ns+"url='"+m+"']")),f.showLoadMsg&&u(),r.xhr=n,r.textStatus=j,r.page=g,f.pageContainer.trigger("pageload",r),e.resolve(k,c,g,i)},error:function(b,d,g){t&&t.set(h.get()),r.xhr=b,r.textStatus=d,r.errorThrown=g;var i=new a.Event("pageloadfailed");f.pageContainer.trigger(i,r);if(i.isDefaultPrevented())return;f.showLoadMsg&&(u(),a.mobile.showPageLoadingMsg(a.mobile.pageLoadErrorMessageTheme,a.mobile.pageLoadErrorMessage,!0),setTimeout(a.mobile.hidePageLoadingMsg,1500)),e.reject(k,c)}}),e.promise()},a.mobile.loadPage.defaults={type:"get",data:d,reloadPage:!1,role:d,showLoadMsg:!1,pageContainer:d,loadMsgDelay:50},a.mobile.changePage=function(b,e){if(m){l.unshift(arguments);return}var f=a.extend({},a.mobile.changePage.defaults,e);f.pageContainer=f.pageContainer||a.mobile.pageContainer,f.fromPage=f.fromPage||a.mobile.activePage;var g=f.pageContainer,i=new a.Event("pagebeforechange"),k={toPage:b,options:f};g.trigger(i,k);if(i.isDefaultPrevented())return;b=k.toPage,m=!0;if(typeof b=="string"){a.mobile.loadPage(b,f).done(function(b,c,d,e){m=!1,c.duplicateCachedPage=e,a.mobile.changePage(d,c)}).fail(function(a,b){m=!1,u(!0),v(),f.pageContainer.trigger("pagechangefailed",k)});return}b[0]===a.mobile.firstPage[0]&&!f.dataUrl&&(f.dataUrl=p.hrefNoHash);var o=f.fromPage,q=f.dataUrl&&h.convertUrlToDataUrl(f.dataUrl)||b.jqmData("url"),r=q,s=h.getFilePath(q),t=j.getActive(),w=j.activeIndex===0,x=0,y=c.title,A=f.role==="dialog"||b.jqmData("role")==="dialog";if(o&&o[0]===b[0]&&!f.allowSamePageTransition){m=!1,g.trigger("pagechange",k),f.fromHashChange&&j.directHashChange({currentUrl:q,isBack:function(){},isForward:function(){}});return}B(b,f.role),f.fromHashChange&&j.directHashChange({currentUrl:q,isBack:function(){x=-1},isForward:function(){x=1}});try{c.activeElement&&c.activeElement.nodeName.toLowerCase()!=="body"?a(c.activeElement).blur():a("input:focus, textarea:focus, select:focus").blur()}catch(C){}var D=!1;A&&t&&(t.url.indexOf(n)>-1&&!a.mobile.activePage.is(".ui-dialog")&&(f.changeHash=!1,D=!0),q=(t.url||"")+(D?"":n),j.activeIndex===0&&q===j.initialDst&&(q+=n)),f.changeHash!==!1&&q&&(j.ignoreNextHashChange=!0,h.set(q));var E=t?b.jqmData("title")||b.children(":jqmData(role='header')").find(".ui-title").getEncodedText():y;!!E&&y===c.title&&(y=E),b.jqmData("title")||b.jqmData("title",y),f.transition=f.transition||(x&&!w?t.transition:d)||(A?a.mobile.defaultDialogTransition:a.mobile.defaultPageTransition),x||(D&&(j.activeIndex=Math.max(0,j.activeIndex-1)),j.addNew(q,f.transition,y,r,f.role)),c.title=j.getActive().title,a.mobile.activePage=b,f.reverse=f.reverse||x<0,z(b,o,f.transition,f.reverse).done(function(c,d,e,h,i){u(),f.duplicateCachedPage&&f.duplicateCachedPage.remove(),i||a.mobile.focusPage(b),v(),g.trigger("pagechange",k)})},a.mobile.changePage.defaults={transition:d,reverse:!1,changeHash:!0,fromHashChange:!1,role:d,duplicateCachedPage:d,pageContainer:d,showLoadMsg:!0,dataUrl:d,fromPage:d,allowSamePageTransition:!1},a.mobile.navreadyDeferred=a.Deferred(),a.mobile.navreadyDeferred.done(function(){a(c).delegate("form","submit",function(b){var c=a(this);if(!a.mobile.ajaxEnabled||c.is(":jqmData(ajax='false')")||!c.jqmHijackable().length)return;var d=c.attr("method"),e=c.attr("target"),f=c.attr("action");f||(f=D(c),f===q.hrefNoHash&&(f=p.hrefNoSearch)),f=h.makeUrlAbsolute(f,D(c));if(h.isExternal(f)&&!h.isPermittedCrossDomainRequest(p,f)||e)return;a.mobile.changePage(f,{type:d&&d.length&&d.toLowerCase()||"get",data:c.serialize(),transition:c.jqmData("transition"),reverse:c.jqmData("direction")==="reverse",reloadPage:!0}),b.preventDefault()}),a(c).bind("vclick",function(b){if(b.which>1||!a.mobile.linkBindingEnabled)return;var c=C(b.target);if(!a(c).jqmHijackable().length)return;c&&h.parseUrl(c.getAttribute("href")||"#").hash!=="#"&&(u(!0),i=a(c).closest(".ui-btn").not(".ui-disabled"),i.addClass(a.mobile.activeBtnClass))}),a(c).bind("click",function(c){if(!a.mobile.linkBindingEnabled)return;var e=C(c.target),f=a(e),g;if(!e||c.which>1||!f.jqmHijackable().length)return;g=function(){b.setTimeout(function(){u(!0)},200)};if(f.is(":jqmData(rel='back')"))return a.mobile.back(),!1;var i=D(f),j=h.makeUrlAbsolute(f.attr("href")||"#",i);if(!a.mobile.ajaxEnabled&&!h.isEmbeddedPage(j)){g();return}if(j.search("#")!==-1){j=j.replace(/[^#]*#/,"");if(!j){c.preventDefault();return}h.isPath(j)?j=h.makeUrlAbsolute(j,i):j=h.makeUrlAbsolute("#"+j,p.hrefNoHash)}var k=f.is("[rel='external']")||f.is(":jqmData(ajax='false')")||f.is("[target]"),l=k||h.isExternal(j)&&!h.isPermittedCrossDomainRequest(p,j);if(l){g();return}var m=f.jqmData("transition"),n=f.jqmData("direction")==="reverse"||f.jqmData("back"),o=f.attr("data-"+a.mobile.ns+"rel")||d;a.mobile.changePage(j,{transition:m,reverse:n,role:o,link:f}),c.preventDefault()}),a(c).delegate(".ui-page","pageshow.prefetch",function(){var b=[];a(this).find("a:jqmData(prefetch)").each(function(){var c=a(this),d=c.attr("href");d&&a.inArray(d,b)===-1&&(b.push(d),a.mobile.loadPage(d,{role:c.attr("data-"+a.mobile.ns+"rel")}))})}),a.mobile._handleHashChange=function(c){var e=h.stripHash(c),f=a.mobile.urlHistory.stack.length===0?"none":d,g=new a.Event("navigate"),i={transition:f,changeHash:!1,fromHashChange:!0};0===j.stack.length&&(j.initialDst=e),a.mobile.pageContainer.trigger(g);if(g.isDefaultPrevented())return;if(!a.mobile.hashListeningEnabled||j.ignoreNextHashChange){j.ignoreNextHashChange=!1;return}if(j.stack.length>1&&e.indexOf(n)>-1&&j.initialDst!==e){if(!a.mobile.activePage.is(".ui-dialog")){j.directHashChange({currentUrl:e,isBack:function(){a.mobile.back()},isForward:function(){b.history.forward()}});return}j.directHashChange({currentUrl:e,either:function(b){var c=a.mobile.urlHistory.getActive();e=c.pageUrl,a.extend(i,{role:c.role,transition:c.transition,reverse:b})}})}e?(e=typeof e=="string"&&!h.isPath(e)?h.makeUrlAbsolute("#"+e,q):e,e===h.makeUrlAbsolute("#"+j.initialDst,q)&&j.stack.length&&j.stack[0].url!==j.initialDst.replace(n,"")&&(e=a.mobile.firstPage),a.mobile.changePage(e,i)):a.mobile.changePage(a.mobile.firstPage,i)},e.bind("hashchange",function(b,c){a.mobile._handleHashChange(h.parseLocation().hash)}),a(c).bind("pageshow",A),a(b).bind("throttledresize",A)})}(a),function(a,b){var e={},f=e,g=a(b),h=a.mobile.path.parseLocation(),i=a.Deferred(),j=a.Deferred();a(c).ready(a.proxy(j,"resolve")),a(c).one("mobileinit",a.proxy(i,"resolve")),a.extend(e,{initialFilePath:function(){return h.pathname+h.search}(),hashChangeTimeout:200,hashChangeEnableTimer:d,initialHref:h.hrefNoHash,state:function(){return{hash:a.mobile.path.parseLocation().hash||"#"+f.initialFilePath,title:c.title,initialHref:f.initialHref}},resetUIKeys:function(b){var c=a.mobile.dialogHashKey,d="&"+a.mobile.subPageUrlKey,e=b.indexOf(c);return e>-1?b=b.slice(0,e)+"#"+b.slice(e):b.indexOf(d)>-1&&(b=b.split(d).join("#"+d)),b},nextHashChangePrevented:function(b){a.mobile.urlHistory.ignoreNextHashChange=b,f.onHashChangeDisabled=b},onHashChange:function(b){if(f.onHashChangeDisabled)return;var d,e,g=a.mobile.path.parseLocation().hash,h=a.mobile.path.isPath(g),i=h?a.mobile.path.getLocation():a.mobile.getDocumentUrl();g=h?g.replace("#",""):g,e=f.state(),d=a.mobile.path.makeUrlAbsolute(g,i),h&&(d=f.resetUIKeys(d)),history.replaceState(e,c.title,d)},onPopState:function(b){var c=b.originalEvent.state,d,e,g;c&&(clearTimeout(f.hashChangeEnableTimer),f.nextHashChangePrevented(!1),a.mobile._handleHashChange(c.hash),f.nextHashChangePrevented(!0),f.hashChangeEnableTimer=setTimeout(function(){f.nextHashChangePrevented(!1)},f.hashChangeTimeout))},init:function(){g.bind("hashchange",f.onHashChange),g.bind("popstate",f.onPopState),location.hash===""&&history.replaceState(f.state(),c.title,a.mobile.path.getLocation())}}),a.when(j,i,a.mobile.navreadyDeferred).done(function(){a.mobile.pushStateEnabled&&a.support.pushState&&e.init()})}(a,this),function(a,b,c){a.mobile.transitionFallbacks.flip="fade"}(a,this),function(a,b,c){a.mobile.transitionFallbacks.flow="fade"}(a,this),function(a,b,c){a.mobile.transitionFallbacks.pop="fade"}(a,this),function(a,b,c){a.mobile.transitionHandlers.slide=a.mobile.transitionHandlers.simultaneous,a.mobile.transitionFallbacks.slide="fade"}(a,this),function(a,b,c){a.mobile.transitionFallbacks.slidedown="fade"}(a,this),function(a,b,c){a.mobile.transitionFallbacks.slidefade="fade"}(a,this),function(a,b,c){a.mobile.transitionFallbacks.slideup="fade"}(a,this),function(a,b,c){a.mobile.transitionFallbacks.turn="fade"}(a,this),function(a,b){a.mobile.page.prototype.options.degradeInputs={color:!1,date:!1,datetime:!1,"datetime-local":!1,email:!1,month:!1,number:!1,range:"number",search:"text",tel:!1,time:!1,url:!1,week:!1},a(c).bind("pagecreate create",function(b){var c=a.mobile.closestPageData(a(b.target)),d;if(!c)return;d=c.options,a(b.target).find("input").not(c.keepNativeSelector()).each(function(){var b=a(this),c=this.getAttribute("type"),e=d.degradeInputs[c]||"text";if(d.degradeInputs[c]){var f=a("<div>").html(b.clone()).html(),g=f.indexOf(" type=")>-1,h=g?/\s+type=["']?\w+['"]?/:/\/?>/,i=' type="'+e+'" data-'+a.mobile.ns+'type="'+c+'"'+(g?"":">");b.replaceWith(f.replace(h,i))}})})}(a),function(a,b,d){a.widget("mobile.dialog",a.mobile.widget,{options:{closeBtnText:"Close",overlayTheme:"a",initSelector:":jqmData(role='dialog')"},_create:function(){var b=this,c=this.element,d=a("<a href='#' data-"+a.mobile.ns+"icon='delete' data-"+a.mobile.ns+"iconpos='notext'>"+this.options.closeBtnText+"</a>"),e=a("<div/>",{role:"dialog","class":"ui-dialog-contain ui-corner-all ui-overlay-shadow"});c.addClass("ui-dialog ui-overlay-"+this.options.overlayTheme),c.wrapInner(e).children().find(":jqmData(role='header')").prepend(d).end().children(":first-child").addClass("ui-corner-top").end().children(":last-child").addClass("ui-corner-bottom"),d.bind("click",function(){b.close()}),c.bind("vclick submit",function(b){var c=a(b.target).closest(b.type==="vclick"?"a":"form"),d;c.length&&!c.jqmData("transition")&&(d=a.mobile.urlHistory.getActive()||{},c.attr("data-"+a.mobile.ns+"transition",d.transition||a.mobile.defaultDialogTransition).attr("data-"+a.mobile.ns+"direction","reverse"))}).bind("pagehide",function(b,c){a(this).find("."+a.mobile.activeBtnClass).not(".ui-slider-bg").removeClass(a.mobile.activeBtnClass)}).bind("pagebeforeshow",function(){b._isCloseable=!0,b.options.overlayTheme&&b.element.page("removeContainerBackground").page("setContainerBackground",b.options.overlayTheme)})},close:function(){var b;this._isCloseable&&(this._isCloseable=!1,a.mobile.hashListeningEnabled?a.mobile.back():(b=a.mobile.urlHistory.getPrev().url,a.mobile.path.isPath(b)||(b=a.mobile.path.makeUrlAbsolute("#"+b)),a.mobile.changePage(b,{changeHash:!1,fromHashChange:!0})))}}),a(c).delegate(a.mobile.dialog.prototype.options.initSelector,"pagecreate",function(){a.mobile.dialog.prototype.enhance(this)})}(a,this),function(a,b){a.mobile.page.prototype.options.backBtnText="Back",a.mobile.page.prototype.options.addBackBtn=!1,a.mobile.page.prototype.options.backBtnTheme=null,a.mobile.page.prototype.options.headerTheme="a",a.mobile.page.prototype.options.footerTheme="a",a.mobile.page.prototype.options.contentTheme=null,a(c).bind("pagecreate",function(b){var c=a(b.target),d=c.data("page").options,e=c.jqmData("role"),f=d.theme;a(":jqmData(role='header'), :jqmData(role='footer'), :jqmData(role='content')",c).jqmEnhanceable().each(function(){var b=a(this),g=b.jqmData("role"),h=b.jqmData("theme"),i=h||d.contentTheme||e==="dialog"&&f,j,k,l,m;b.addClass("ui-"+g);if(g==="header"||g==="footer"){var n=h||(g==="header"?d.headerTheme:d.footerTheme)||f;b.addClass("ui-bar-"+n).attr("role",g==="header"?"banner":"contentinfo"),g==="header"&&(j=b.children("a, button"),k=j.hasClass("ui-btn-left"),l=j.hasClass("ui-btn-right"),k=k||j.eq(0).not(".ui-btn-right").addClass("ui-btn-left").length,l=l||j.eq(1).addClass("ui-btn-right").length),d.addBackBtn&&g==="header"&&a(".ui-page").length>1&&c.jqmData("url")!==a.mobile.path.stripHash(location.hash)&&!k&&(m=a("<a href='javascript:void(0);' class='ui-btn-left' data-"+a.mobile.ns+"rel='back' data-"+a.mobile.ns+"icon='arrow-l'>"+d.backBtnText+"</a>").attr("data-"+a.mobile.ns+"theme",d.backBtnTheme||n).prependTo(b)),b.children("h1, h2, h3, h4, h5, h6").addClass("ui-title").attr({role:"heading","aria-level":"1"})}else g==="content"&&(i&&b.addClass("ui-body-"+i),b.attr("role","main"))})})}(a),function(a,b){a.fn.fieldcontain=function(a){return this.addClass("ui-field-contain ui-body ui-br").contents().filter(function(){return this.nodeType===3&&!/\S/.test(this.nodeValue)}).remove()},a(c).bind("pagecreate create",function(b){a(":jqmData(role='fieldcontain')",b.target).jqmEnhanceable().fieldcontain()})}(a),function(a,b){a.fn.grid=function(b){return this.each(function(){var c=a(this),d=a.extend({grid:null},b),e=c.children(),f={solo:1,a:2,b:3,c:4,d:5},g=d.grid,h;if(!g)if(e.length<=5)for(var i in f)f[i]===e.length&&(g=i);else g="a",c.addClass("ui-grid-duo");h=f[g],c.addClass("ui-grid-"+g),e.filter(":nth-child("+h+"n+1)").addClass("ui-block-a"),h>1&&e.filter(":nth-child("+h+"n+2)").addClass("ui-block-b"),h>2&&e.filter(":nth-child("+h+"n+3)").addClass("ui-block-c"),h>3&&e.filter(":nth-child("+h+"n+4)").addClass("ui-block-d"),h>4&&e.filter(":nth-child("+h+"n+5)").addClass("ui-block-e")})}}(a),function(a,b){a(c).bind("pagecreate create",function(b){a(":jqmData(role='nojs')",b.target).addClass("ui-nojs")})}(a),function(a,b){function d(a){var b;while(a){b=typeof a.className=="string"&&a.className+" ";if(b&&b.indexOf("ui-btn ")>-1&&b.indexOf("ui-disabled ")<0)break;a=a.parentNode}return a}a.fn.buttonMarkup=function(d){var f=this,g=function(b,c){j.setAttribute("data-"+a.mobile.ns+b,c),i.jqmData(b,c)};d=d&&a.type(d)==="object"?d:{};for(var h=0;h<f.length;h++){var i=f.eq(h),j=i[0],k=a.extend({},a.fn.buttonMarkup.defaults,{icon:d.icon!==b?d.icon:i.jqmData("icon"),iconpos:d.iconpos!==b?d.iconpos:i.jqmData("iconpos"),theme:d.theme!==b?d.theme:i.jqmData("theme")||a.mobile.getInheritedTheme(i,"c"),inline:d.inline!==b?d.inline:i.jqmData("inline"),shadow:d.shadow!==b?d.shadow:i.jqmData("shadow"),corners:d.corners!==b?d.corners:i.jqmData("corners"),iconshadow:d.iconshadow!==b?d.iconshadow:i.jqmData("iconshadow"),mini:d.mini!==b?d.mini:i.jqmData("mini")},d),l="ui-btn-inner",m="ui-btn-text",n,o,p,q,r,s;a.each(k,g),i.jqmData("rel")==="popup"&&i.attr("href")&&(j.setAttribute("aria-haspopup",!0),j.setAttribute("aria-owns",j.getAttribute("href"))),s=a.data(j.tagName==="INPUT"||j.tagName==="BUTTON"?j.parentNode:j,"buttonElements"),s?(j=s.outer,i=a(j),p=s.inner,q=s.text,a(s.icon).remove(),s.icon=null):(p=c.createElement(k.wrapperEls),q=c.createElement(k.wrapperEls)),r=k.icon?c.createElement("span"):null,e&&!s&&e(),k.theme||(k.theme=a.mobile.getInheritedTheme(i,"c")),n="ui-btn ui-btn-up-"+k.theme,n+=k.shadow?" ui-shadow":"",n+=k.corners?" ui-btn-corner-all":"",k.mini!==b&&(n+=k.mini===!0?" ui-mini":" ui-fullsize"),k.inline!==b&&(n+=k.inline===!0?" ui-btn-inline":" ui-btn-block"),k.icon&&(k.icon="ui-icon-"+k.icon,k.iconpos=k.iconpos||"left",o="ui-icon "+k.icon,k.iconshadow&&(o+=" ui-icon-shadow")),k.iconpos&&(n+=" ui-btn-icon-"+k.iconpos,k.iconpos==="notext"&&!i.attr("title")&&i.attr("title",i.getEncodedText())),l+=k.corners?" ui-btn-corner-all":"",k.iconpos&&k.iconpos==="notext"&&!i.attr("title")&&i.attr("title",i.getEncodedText()),s&&i.removeClass(s.bcls||""),i.removeClass("ui-link").addClass(n),p.className=l,q.className=m,s||p.appendChild(q);if(r){r.className=o;if(!s||!s.icon)r.innerHTML=" ",p.appendChild(r)}while(j.firstChild&&!s)q.appendChild(j.firstChild);s||j.appendChild(p),s={bcls:n,outer:j,inner:p,text:q,icon:r},a.data(j,"buttonElements",s),a.data(p,"buttonElements",s),a.data(q,"buttonElements",s),r&&a.data(r,"buttonElements",s)}return this},a.fn.buttonMarkup.defaults={corners:!0,shadow:!0,iconshadow:!0,wrapperEls:"span"};var e=function(){var b=a.mobile.buttonMarkup.hoverDelay,f,g;a(c).bind({"vmousedown vmousecancel vmouseup vmouseover vmouseout focus blur scrollstart":function(c){var e,h=a(d(c.target)),i=c.originalEvent&&/^touch/.test(c.originalEvent.type),j=c.type;if(h.length){e=h.attr("data-"+a.mobile.ns+"theme");if(j==="vmousedown")i?f=setTimeout(function(){h.removeClass("ui-btn-up-"+e).addClass("ui-btn-down-"+e)},b):h.removeClass("ui-btn-up-"+e).addClass("ui-btn-down-"+e);else if(j==="vmousecancel"||j==="vmouseup")h.removeClass("ui-btn-down-"+e).addClass("ui-btn-up-"+e);else if(j==="vmouseover"||j==="focus")i?g=setTimeout(function(){h.removeClass("ui-btn-up-"+e).addClass("ui-btn-hover-"+e)},b):h.removeClass("ui-btn-up-"+e).addClass("ui-btn-hover-"+e);else if(j==="vmouseout"||j==="blur"||j==="scrollstart")h.removeClass("ui-btn-hover-"+e+" ui-btn-down-"+e).addClass("ui-btn-up-"+e),f&&clearTimeout(f),g&&clearTimeout(g)}},"focusin focus":function(b){a(d(b.target)).addClass(a.mobile.focusClass)},"focusout blur":function(b){a(d(b.target)).removeClass(a.mobile.focusClass)}}),e=null};a(c).bind("pagecreate create",function(b){a(":jqmData(role='button'), .ui-bar > a, .ui-header > a, .ui-footer > a, .ui-bar > :jqmData(role='controlgroup') > a",b.target).jqmEnhanceable().not("button, input, .ui-btn, :jqmData(role='none'), :jqmData(role='nojs')").buttonMarkup()})}(a),function(a,b){a.widget("mobile.collapsible",a.mobile.widget,{options:{expandCueText:" click to expand contents",collapseCueText:" click to collapse contents",collapsed:!0,heading:"h1,h2,h3,h4,h5,h6,legend",theme:null,contentTheme:null,inset:!0,mini:!1,initSelector:":jqmData(role='collapsible')"},_create:function(){var c=this.element,d=this.options,e=c.addClass("ui-collapsible"),f=c.children(d.heading).first(),g=c.jqmData("collapsed-icon")||d.collapsedIcon,h=c.jqmData("expanded-icon")||d.expandedIcon,i=e.wrapInner("<div class='ui-collapsible-content'></div>").children(".ui-collapsible-content"),j=c.closest(":jqmData(role='collapsible-set')").addClass("ui-collapsible-set");f.is("legend")&&(f=a("<div role='heading'>"+f.html()+"</div>").insertBefore(f),f.next().remove()),j.length?(d.theme||(d.theme=j.jqmData("theme")||a.mobile.getInheritedTheme(j,"c")),d.contentTheme||(d.contentTheme=j.jqmData("content-theme")),d.collapsedIcon||(d.collapsedIcon=j.jqmData("collapsed-icon")),d.expandedIcon||(d.expandedIcon=j.jqmData("expanded-icon")),d.iconPos||(d.iconPos=j.jqmData("iconpos")),j.jqmData("inset")!==b?d.inset=j.jqmData("inset"):d.inset=!0,d.mini||(d.mini=j.jqmData("mini"))):d.theme||(d.theme=a.mobile.getInheritedTheme(c,"c")),!d.inset||e.addClass("ui-collapsible-inset"),i.addClass(d.contentTheme?"ui-body-"+d.contentTheme:""),g=c.jqmData("collapsed-icon")||d.collapsedIcon||"plus",h=c.jqmData("expanded-icon")||d.expandedIcon||"minus",f.insertBefore(i).addClass("ui-collapsible-heading").append("<span class='ui-collapsible-heading-status'></span>").wrapInner("<a href='#' class='ui-collapsible-heading-toggle'></a>").find("a").first().buttonMarkup({shadow:!1,corners:!1,iconpos:c.jqmData("iconpos")||d.iconPos||"left",icon:g,mini:d.mini,theme:d.theme}),!d.inset||f.find("a").first().add(".ui-btn-inner",c).addClass("ui-corner-top ui-corner-bottom"),e.bind("expand collapse",function(b){if(!b.isDefaultPrevented()){var c=a(this),k=b.type==="collapse",l=d.contentTheme;b.preventDefault(),f.toggleClass("ui-collapsible-heading-collapsed",k).find(".ui-collapsible-heading-status").text(k?d.expandCueText:d.collapseCueText).end().find(".ui-icon").toggleClass("ui-icon-"+h,!k).toggleClass("ui-icon-"+g,k||h===g).end().find("a").first().removeClass(a.mobile.activeBtnClass),c.toggleClass("ui-collapsible-collapsed",k),i.toggleClass("ui-collapsible-content-collapsed",k).attr("aria-hidden",k),l&&!!d.inset&&(!j.length||e.jqmData("collapsible-last"))&&(f.find("a").first().add(f.find(".ui-btn-inner")).toggleClass("ui-corner-bottom",k),i.toggleClass("ui-corner-bottom",!k)),i.trigger("updatelayout")}}).trigger(d.collapsed?"collapse":"expand"),f.bind("tap",function(b){f.find("a").first().addClass(a.mobile.activeBtnClass)}).bind("click",function(a){var b=f.is(".ui-collapsible-heading-collapsed")?"expand":"collapse";e.trigger(b),a.preventDefault(),a.stopPropagation()})}}),a(c).bind("pagecreate create",function(b){a.mobile.collapsible.prototype.enhanceWithin(b.target)})}(a),function(a,b){a.widget("mobile.collapsibleset",a.mobile.widget,{options:{initSelector:":jqmData(role='collapsible-set')"},_create:function(){var c=this.element.addClass("ui-collapsible-set"),d=this.options;d.theme||(d.theme=a.mobile.getInheritedTheme(c,"c")),d.contentTheme||(d.contentTheme=c.jqmData("content-theme")),c.jqmData("inset")!==b&&(d.inset=c.jqmData("inset")),d.inset=d.inset!==b?d.inset:!0,c.jqmData("collapsiblebound")||c.jqmData("collapsiblebound",!0).bind("expand collapse",function(b){var c=b.type==="collapse",e=a(b.target).closest(".ui-collapsible"),f=e.data("collapsible");e.jqmData("collapsible-last")&&!!d.inset&&(e.find(".ui-collapsible-heading").first().find("a").first().toggleClass("ui-corner-bottom",c).find(".ui-btn-inner").toggleClass("ui-corner-bottom",c),e.find(".ui-collapsible-content").toggleClass("ui-corner-bottom",!c))}).bind("expand",function(b){var c=a(b.target).closest(".ui-collapsible");c.parent().is(":jqmData(role='collapsible-set')")&&c.siblings(".ui-collapsible").trigger("collapse")})},_init:function(){var a=this.element,b=a.children(":jqmData(role='collapsible')"),c=b.filter(":jqmData(collapsed='false')");this.refresh(),c.trigger("expand")},refresh:function(){var b=this.element,c=this.options,d=b.children(":jqmData(role='collapsible')");a.mobile.collapsible.prototype.enhance(d.not(".ui-collapsible")),!c.inset||(d.each(function(){a(this).jqmRemoveData("collapsible-last").find(".ui-collapsible-heading").find("a").first().removeClass("ui-corner-top ui-corner-bottom").find(".ui-btn-inner").removeClass("ui-corner-top ui-corner-bottom")}),d.first().find("a").first().addClass("ui-corner-top").find(".ui-btn-inner").addClass("ui-corner-top"),d.last().jqmData("collapsible-last",!0).find("a").first().addClass("ui-corner-bottom").find(".ui-btn-inner").addClass("ui-corner-bottom"))}}),a(c).bind("pagecreate create",function(b){a.mobile.collapsibleset.prototype.enhanceWithin(b.target)})}(a),function(a,b){a.widget("mobile.navbar",a.mobile.widget,{options:{iconpos:"top",grid:null,initSelector:":jqmData(role='navbar')"},_create:function(){var c=this.element,d=c.find("a"),e=d.filter(":jqmData(icon)").length?this.options.iconpos:b;c.addClass("ui-navbar ui-mini").attr("role","navigation").find("ul").jqmEnhanceable().grid({grid:this.options.grid}),d.buttonMarkup({corners:!1,shadow:!1,inline:!0,iconpos:e}),c.delegate("a","vclick",function(b){a(b.target).hasClass("ui-disabled")||(d.removeClass(a.mobile.activeBtnClass),a(this).addClass(a.mobile.activeBtnClass))}),c.closest(".ui-page").bind("pagebeforeshow",function(){d.filter(".ui-state-persist").addClass(a.mobile.activeBtnClass)})}}),a(c).bind("pagecreate create",function(b){a.mobile.navbar.prototype.enhanceWithin(b.target)})}(a),function(a,b){var d={};a.widget("mobile.listview",a.mobile.widget,{options:{theme:null,countTheme:"c",headerTheme:"b",dividerTheme:"b",splitIcon:"arrow-r",splitTheme:"b",inset:!1,initSelector:":jqmData(role='listview')"},_create:function(){var a=this,b="";b+=a.options.inset?" ui-listview-inset ui-corner-all ui-shadow ":"",a.element.addClass(function(a,c){return c+" ui-listview "+b}),a.refresh(!0)},_removeCorners:function(a,b){var c="ui-corner-top ui-corner-tr ui-corner-tl",d="ui-corner-bottom ui-corner-br ui-corner-bl";a=a.add(a.find(".ui-btn-inner, .ui-li-link-alt, .ui-li-thumb")),b==="top"?a.removeClass(c):b==="bottom"?a.removeClass(d):a.removeClass(c+" "+d)},_refreshCorners:function(a){var b,c,d,e;b=this.element.children("li"),c=a||b.filter(":visible").length===0?b.not(".ui-screen-hidden"):b.filter(":visible"),b.filter(".ui-li-last").removeClass("ui-li-last"),this.options.inset?(this._removeCorners(b),d=c.first().addClass("ui-corner-top"),d.add(d.find(".ui-btn-inner").not(".ui-li-link-alt span:first-child")).addClass("ui-corner-top").end().find(".ui-li-link-alt, .ui-li-link-alt span:first-child").addClass("ui-corner-tr").end().find(".ui-li-thumb").not(".ui-li-icon").addClass("ui-corner-tl"),e=c.last().addClass("ui-corner-bottom ui-li-last"),e.add(e.find(".ui-btn-inner")).find(".ui-li-link-alt").addClass("ui-corner-br").end().find(".ui-li-thumb").not(".ui-li-icon").addClass("ui-corner-bl")):c.last().addClass("ui-li-last"),a||this.element.trigger("updatelayout")},_findFirstElementByTagName:function(a,b,c,d){var e={};e[c]=e[d]=!0;while(a){if(e[a.nodeName])return a;a=a[b]}return null},_getChildrenByTagName:function(b,c,d){var e=[],f={};f[c]=f[d]=!0,b=b.firstChild;while(b)f[b.nodeName]&&e.push(b),b=b.nextSibling;return a(e)},_addThumbClasses:function(b){var c,d,e=b.length;for(c=0;c<e;c++)d=a(this._findFirstElementByTagName(b[c].firstChild,"nextSibling","img","IMG")),d.length&&(d.addClass("ui-li-thumb"),a(this._findFirstElementByTagName(d[0].parentNode,"parentNode","li","LI")).addClass(d.is(".ui-li-icon")?"ui-li-has-icon":"ui-li-has-thumb"))},refresh:function(b){this.parentPage=this.element.closest(".ui-page"),this._createSubPages();var d=this.options,e=this.element,f=this,g=e.jqmData("dividertheme")||d.dividerTheme,h=e.jqmData("splittheme"),i=e.jqmData("spliticon"),j=this._getChildrenByTagName(e[0],"li","LI"),k=!!a.nodeName(e[0],"ol"),l=!a.support.cssPseudoElement,m=e.attr("start"),n={},o,p,q,r,s,t,u,v,w,x,y,z,A,B;k&&l&&e.find(".ui-li-dec").remove(),k&&(m||m===0?l?u=parseFloat(m):(v=parseFloat(m)-1,e.css("counter-reset","listnumbering "+v)):l&&(u=1)),d.theme||(d.theme=a.mobile.getInheritedTheme(this.element,"c"));for(var C=0,D=j.length;C<D;C++){o=j.eq(C),p="ui-li";if(b||!o.hasClass("ui-li")){q=o.jqmData("theme")||d.theme,r=this._getChildrenByTagName(o[0],"a","A");var E=o.jqmData("role")==="list-divider";r.length&&!E?(y=o.jqmData("icon"),o.buttonMarkup({wrapperEls:"div",shadow:!1,corners:!1,iconpos:"right",icon:r.length>1||y===!1?!1:y||"arrow-r",theme:q}),y!==!1&&r.length===1&&o.addClass("ui-li-has-arrow"),r.first().removeClass("ui-link").addClass("ui-link-inherit"),r.length>1&&(p+=" ui-li-has-alt",s=r.last(),t=h||s.jqmData("theme")||d.splitTheme,B=s.jqmData("icon"),s.appendTo(o).attr("title",s.getEncodedText()).addClass("ui-li-link-alt").empty().buttonMarkup({shadow:!1,corners:!1,theme:q,icon:!1,iconpos:"notext"}).find(".ui-btn-inner").append(a(c.createElement("span")).buttonMarkup({shadow:!0,corners:!0,theme:t,iconpos:"notext",icon:B||y||i||d.splitIcon})))):E?(p+=" ui-li-divider ui-bar-"+g,o.attr("role","heading"),k&&(m||m===0?l?u=parseFloat(m):(w=parseFloat(m)-1,o.css("counter-reset","listnumbering "+w)):l&&(u=1))):p+=" ui-li-static ui-btn-up-"+q}k&&l&&p.indexOf("ui-li-divider")<0&&(x=p.indexOf("ui-li-static")>0?o:o.find(".ui-link-inherit"),x.addClass("ui-li-jsnumbering").prepend("<span class='ui-li-dec'>"+u++ +". </span>")),n[p]||(n[p]=[]),n[p].push(o[0])}for(p in n)a(n[p]).addClass(p).children(".ui-btn-inner").addClass(p);e.find("h1, h2, h3, h4, h5, h6").addClass("ui-li-heading").end().find("p, dl").addClass("ui-li-desc").end().find(".ui-li-aside").each(function(){var b=a(this);b.prependTo(b.parent())}).end().find(".ui-li-count").each(function(){a(this).closest("li").addClass("ui-li-has-count")}).addClass("ui-btn-up-"+(e.jqmData("counttheme")||this.options.countTheme)+" ui-btn-corner-all"),this._addThumbClasses(j),this._addThumbClasses(e.find(".ui-link-inherit")),this._refreshCorners(b),this._trigger("afterrefresh")},_idStringEscape:function(a){return a.replace(/[^a-zA-Z0-9]/g,"-")},_createSubPages:function(){var b=this.element,c=b.closest(".ui-page"),e=c.jqmData("url"),f=e||c[0][a.expando],g=b.attr("id"),h=this.options,i="data-"+a.mobile.ns,j=this,k=c.find(":jqmData(role='footer')").jqmData("id"),l;typeof d[f]=="undefined"&&(d[f]=-1),g=g||++d[f],a(b.find("li>ul, li>ol").toArray().reverse()).each(function(c){var d=this,f=a(this),j=f.attr("id")||g+"-"+c,m=f.parent(),n=a(f.prevAll().toArray().reverse()),p=n.length?n:a("<span>"+a.trim(m.contents()[0].nodeValue)+"</span>"),q=p.first().getEncodedText(),r=(e||"")+"&"+a.mobile.subPageUrlKey+"="+j,s=f.jqmData("theme")||h.theme,t=f.jqmData("counttheme")||b.jqmData("counttheme")||h.countTheme,u,v;l=!0,u=f.detach().wrap("<div "+i+"role='page' "+i+"url='"+r+"' "+i+"theme='"+s+"' "+i+"count-theme='"+t+"'><div "+i+"role='content'></div></div>").parent().before("<div "+i+"role='header' "+i+"theme='"+h.headerTheme+"'><div class='ui-title'>"+q+"</div></div>").after(k?a("<div "+i+"role='footer' "+i+"id='"+k+"'>"):"").parent().appendTo(a.mobile.pageContainer),u.page(),v=m.find("a:first"),v.length||(v=a("<a/>").html(p||q).prependTo(m.empty())),v.attr("href","#"+r)}).listview();if(l&&c.is(":jqmData(external-page='true')")&&c.data("page").options.domCache===!1){var m=function(b,d){var f=d.nextPage,g,h=new a.Event("pageremove");d.nextPage&&(g=f.jqmData("url"),g.indexOf(e+"&"+a.mobile.subPageUrlKey)!==0&&(j.childPages().remove(),c.trigger(h),h.isDefaultPrevented()||c.removeWithDependents()))};c.unbind("pagehide.remove").bind("pagehide.remove",m)}},childPages:function(){var b=this.parentPage.jqmData("url");return a(":jqmData(url^='"+b+"&"+a.mobile.subPageUrlKey+"')")}}),a(c).bind("pagecreate create",function(b){a.mobile.listview.prototype.enhanceWithin(b.target)})}(a),function(a,b){a.mobile.listview.prototype.options.autodividers=!1,a.mobile.listview.prototype.options.autodividersSelector=function(a){var b=a.text()||null;return b?(b=b.slice(0,1).toUpperCase(),b):null},a(c).delegate("ul,ol","listviewcreate",function(){var b=a(this),d=b.data("listview");if(!d||!d.options.autodividers)return;var e=function(){b.find("li:jqmData(role='list-divider')").remove();var e=b.find("li"),f=null,g,h;for(var i=0;i<e.length;i++){g=e[i],h=d.options.autodividersSelector(a(g));if(h&&f!==h){var j=c.createElement("li");j.appendChild(c.createTextNode(h)),j.setAttribute("data-"+a.mobile.ns+"role","list-divider"),g.parentNode.insertBefore(j,g)}f=h}},f=function(){b.unbind("listviewafterrefresh",f),e(),d.refresh(),b.bind("listviewafterrefresh",f)};f()})}(a),function(a,b){a.widget("mobile.checkboxradio",a.mobile.widget,{options:{theme:null,initSelector:"input[type='checkbox'],input[type='radio']"},_create:function(){var d=this,e=this.element,f=function(a,b){return a.jqmData(b)||a.closest("form, fieldset").jqmData(b)},g=a(e).closest("label"),h=g.length?g:a(e).closest("form, fieldset, :jqmData(role='page'), :jqmData(role='dialog')").find("label").filter("[for='"+e[0].id+"']").first(),i=e[0].type,j=f(e,"mini"),k=i+"-on",l=i+"-off",m=e.parents(":jqmData(type='horizontal')").length?b:l,n=f(e,"iconpos"),o=m?"":" "+a.mobile.activeBtnClass,p="ui-"+k+o,q="ui-"+l,r="ui-icon-"+k,s="ui-icon-"+l;if(i!=="checkbox"&&i!=="radio")return;a.extend(this,{label:h,inputtype:i,checkedClass:p,uncheckedClass:q,checkedicon:r,uncheckedicon:s}),this.options.theme||(this.options.theme=a.mobile.getInheritedTheme(this.element,"c")),h.buttonMarkup({theme:this.options.theme,icon:m,shadow:!1,mini:j,iconpos:n});var t=c.createElement("div");t.className="ui-"+i,e.add(h).wrapAll(t),h.bind({vmouseover:function(b){a(this).parent().is(".ui-disabled")&&b.stopPropagation()},vclick:function(a){if(e.is(":disabled")){a.preventDefault();return}return d._cacheVals(),e.prop("checked",i==="radio"&&!0||!e.prop("checked")),e.triggerHandler("click"),d._getInputSet().not(e).prop("checked",!1),d._updateAll(),!1}}),e.bind({vmousedown:function(){d._cacheVals()},vclick:function(){var b=a(this);b.is(":checked")?(b.prop("checked",!0),d._getInputSet().not(b).prop("checked",!1)):b.prop("checked",!1),d._updateAll()},focus:function(){h.addClass(a.mobile.focusClass)},blur:function(){h.removeClass(a.mobile.focusClass)}}),this.refresh()},_cacheVals:function(){this._getInputSet().each(function(){a(this).jqmData("cacheVal",this.checked)})},_getInputSet:function(){return this.inputtype==="checkbox"?this.element:this.element.closest("form, fieldset, :jqmData(role='page'), :jqmData(role='dialog')").find("input[name='"+this.element[0].name+"'][type='"+this.inputtype+"']")},_updateAll:function(){var b=this;this._getInputSet().each(function(){var c=a(this);(this.checked||b.inputtype==="checkbox")&&c.trigger("change")}).checkboxradio("refresh")},refresh:function(){var a=this.element[0],b=this.label,c=b.find(".ui-icon");a.checked?(b.addClass(this.checkedClass).removeClass(this.uncheckedClass),c.addClass(this.checkedicon).removeClass(this.uncheckedicon)):(b.removeClass(this.checkedClass).addClass(this.uncheckedClass),c.removeClass(this.checkedicon).addClass(this.uncheckedicon)),a.disabled?this.disable():this.enable()},disable:function(){this.element.prop("disabled",!0).parent().addClass("ui-disabled")},enable:function(){this.element.prop("disabled",!1).parent().removeClass("ui-disabled")}}),a(c).bind("pagecreate create",function(b){a.mobile.checkboxradio.prototype.enhanceWithin(b.target,!0)})}(a),function(a,b){a.widget("mobile.button",a.mobile.widget,{options:{theme:null,icon:null,iconpos:null,corners:!0,shadow:!0,iconshadow:!0,initSelector:"button, [type='button'], [type='submit'], [type='reset']"},_create:function(){var d=this.element,e,f=this.options,g,h,i=f.inline||d.jqmData("inline"),j=f.mini||d.jqmData("mini"),k="",l;if(d[0].tagName==="A"){d.hasClass("ui-btn")||d.buttonMarkup();return}this.options.theme||(this.options.theme=a.mobile.getInheritedTheme(this.element,"c")),!~d[0].className.indexOf("ui-btn-left")||(k="ui-btn-left"),!~d[0].className.indexOf("ui-btn-right")||(k="ui-btn-right");if(d.attr("type")==="submit"||d.attr("type")==="reset")k?k+=" ui-submit":k="ui-submit";a("label[for='"+d.attr("id")+"']").addClass("ui-submit"),this.button=a("<div></div>")[d.html()?"html":"text"](d.html()||d.val()).insertBefore(d).buttonMarkup({theme:f.theme,icon:f.icon,iconpos:f.iconpos,inline:i,corners:f.corners,shadow:f.shadow,iconshadow:f.iconshadow,mini:j}).addClass(k).append(d.addClass("ui-btn-hidden")),e=this.button,g=d.attr("type"),h=d.attr("name"),g!=="button"&&g!=="reset"&&h&&d.bind("vclick",function(){l===b&&(l=a("<input>",{type:"hidden",name:d.attr("name"),value:d.attr("value")}).insertBefore(d),a(c).one("submit",function(){l.remove(),l=b}))}),d.bind({focus:function(){e.addClass(a.mobile.focusClass)},blur:function(){e.removeClass(a.mobile.focusClass)}}),this.refresh()},enable:function(){return this.element.attr("disabled",!1),this.button.removeClass("ui-disabled").attr("aria-disabled",!1),this._setOption("disabled",!1)},disable:function(){return this.element.attr("disabled",!0),this.button.addClass("ui-disabled").attr("aria-disabled",!0),this._setOption("disabled",!0)},refresh:function(){var b=this.element;b.prop("disabled")?this.disable():this.enable(),a(this.button.data("buttonElements").text)[b.html()?"html":"text"](b.html()||b.val())}}),a(c).bind("pagecreate create",function(b){a.mobile.button.prototype.enhanceWithin(b.target,!0)})}(a),function(a,b){a.fn.controlgroup=function(b){function c(a,b){a.removeClass("ui-btn-corner-all ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-controlgroup-last ui-shadow").eq(0).addClass(b[0]).end().last().addClass(b[1]).addClass("ui-controlgroup-last")}return this.each(function(){var d=a(this),e=a.extend({direction:d.jqmData("type")||"vertical",shadow:!1,excludeInvisible:!0,mini:d.jqmData("mini")},b),f=d.children("legend"),g=d.children(".ui-controlgroup-label"),h=d.children(".ui-controlgroup-controls"),i=e.direction==="horizontal"?["ui-corner-left","ui-corner-right"]:["ui-corner-top","ui-corner-bottom"],j=d.find("input").first().attr("type");h.length&&h.contents().unwrap(),d.wrapInner("<div class='ui-controlgroup-controls'></div>"),f.length?(a("<div role='heading' class='ui-controlgroup-label'>"+f.html()+"</div>").insertBefore(d.children(0)),f.remove()):g.length&&d.prepend(g),d.addClass("ui-corner-all ui-controlgroup ui-controlgroup-"+e.direction),c(d.find(".ui-btn"+(e.excludeInvisible?":visible":"")).not(".ui-slider-handle"),i),c(d.find(".ui-btn-inner"),i),e.shadow&&d.addClass("ui-shadow"),e.mini&&d.addClass("ui-mini")})}}(a),function(a,b){a(c).bind("pagecreate create",function(b){a(b.target).find("a").jqmEnhanceable().not(".ui-btn, .ui-link-inherit, :jqmData(role='none'), :jqmData(role='nojs')").addClass("ui-link")})}(a),function(a,d){function e(a,b,c,d){var e=d;return a<b?e=c+(a-b)/2:e=Math.min(Math.max(c,d-b/2),c+a-b),e}function f(){var c=a(b);return{x:c.scrollLeft(),y:c.scrollTop(),cx:b.innerWidth||c.width(),cy:b.innerHeight||c.height()}}a.widget("mobile.popup",a.mobile.widget,{options:{theme:null,overlayTheme:null,shadow:!0,corners:!0,transition:"none",positionTo:"origin",tolerance:null,initSelector:":jqmData(role='popup')",closeLinkSelector:"a:jqmData(rel='back')",closeLinkEvents:"click.popup",navigateEvents:"navigate.popup",closeEvents:"navigate.popup pagebeforechange.popup",history:!a.mobile.browser.ie},_eatEventAndClose:function(a){return a.preventDefault(),a.stopImmediatePropagation(),this.close(),!1},_resizeScreen:function(){var a=this._ui.container.outerHeight(!0);this._ui.screen.removeAttr("style"),a>this._ui.screen.height()&&this._ui.screen.height(a)},_handleWindowKeyUp:function(b){if(this._isOpen&&b.keyCode===a.mobile.keyCode.ESCAPE)return this._eatEventAndClose(b)},_maybeRefreshTimeout:function(){var b=f();if(this._resizeData){if(b.x===this._resizeData.winCoords.x&&b.y===this._resizeData.winCoords.y&&b.cx===this._resizeData.winCoords.cx&&b.cy===this._resizeData.winCoords.cy)return!1;clearTimeout(this._resizeData.timeoutId)}return this._resizeData={timeoutId:setTimeout(a.proxy(this,"_resizeTimeout"),200),winCoords:b},!0},_resizeTimeout:function(){this._maybeRefreshTimeout()||(this._trigger("beforeposition"),this._ui.container.removeClass("ui-selectmenu-hidden").offset(this._placementCoords(this._desiredCoords(d,d,"window"))),this._resizeScreen(),this._resizeData=null,this._orientationchangeInProgress=!1)},_handleWindowResize:function(a){this._isOpen&&this._maybeRefreshTimeout()},_handleWindowOrientationchange:function(a){this._orientationchangeInProgress||(this._ui.container.addClass("ui-selectmenu-hidden").removeAttr("style"),this._orientationchangeInProgress=!0)},_create:function(){var c={screen:a("<div class='ui-screen-hidden ui-popup-screen'></div>"),placeholder:a("<div style='display: none;'><!-- placeholder --></div>"),container:a("<div class='ui-popup-container ui-selectmenu-hidden'></div>")},e=this.element.closest(".ui-page"),f=this.element.attr("id"),g=this;this.options.history=this.options.history&&a.mobile.ajaxEnabled&&a.mobile.hashListeningEnabled,e.length===0&&(e=a("body")),this.options.container=this.options.container||a.mobile.pageContainer,e.append(c.screen),c.container.insertAfter(c.screen),c.placeholder.insertAfter(this.element),f&&(c.screen.attr("id",f+"-screen"),c.container.attr("id",f+"-popup"),c.placeholder.html("<!-- placeholder for "+f+" -->")),c.container.append(this.element),this.element.addClass("ui-popup"),a.extend(this,{_page:e,_ui:c,_fallbackTransition:"",_currentTransition:!1,_prereqs:null,_isOpen:!1,_tolerance:null,_resizeData:null,_orientationchangeInProgress:!1,_globalHandlers:[{src:a(b),handler:{orientationchange:a.proxy(this,"_handleWindowOrientationchange"),resize:a.proxy(this,"_handleWindowResize"),keyup:a.proxy(this,"_handleWindowKeyUp")}}]}),a.each(this.options,function(a,b){g.options[a]=d,g._setOption(a,b,!0)}),c.screen.bind("vclick",a.proxy(this,"_eatEventAndClose")),a.each(this._globalHandlers,function(a,b){b.src.bind(b.handler)})},_applyTheme:function(a,b,c){var d=(a.attr("class")||"").split(" "),e=!0,f=null,g,h=String(b);while(d.length>0){f=d.pop(),g=(new RegExp("^ui-"+c+"-([a-z])$")).exec(f);if(g&&g.length>1){f=g[1];break}f=null}b!==f&&(a.removeClass("ui-"+c+"-"+f),b!==null&&b!=="none"&&a.addClass("ui-"+c+"-"+h))},_setTheme:function(a){this._applyTheme(this.element,a,"body")},_setOverlayTheme:function(a){this._applyTheme(this._ui.screen,a,"overlay"),this._isOpen&&this._ui.screen.addClass("in")},_setShadow:function(a){this.element.toggleClass("ui-overlay-shadow",a)},_setCorners:function(a){this.element.toggleClass("ui-corner-all",a)},_applyTransition:function(b){this._ui.container.removeClass(this._fallbackTransition),b&&b!=="none"&&(this._fallbackTransition=a.mobile._maybeDegradeTransition(b),this._ui.container.addClass(this._fallbackTransition))},_setTransition:function(a){this._currentTransition||this._applyTransition(a)},_setTolerance:function(b){var c={t:30,r:15,b:30,l:15};if(b){var d=String(b).split(",");a.each(d,function(a,b){d[a]=parseInt(b,10)});switch(d.length){case 1:isNaN(d[0])||(c.t=c.r=c.b=c.l=d[0]);break;case 2:isNaN(d[0])||(c.t=c.b=d[0]),isNaN(d[1])||(c.l=c.r=d[1]);break;case 4:isNaN(d[0])||(c.t=d[0]),isNaN(d[1])||(c.r=d[1]),isNaN(d[2])||(c.b=d[2]),isNaN(d[3])||(c.l=d[3]);break;default:}}this._tolerance=c},_setOption:function(b,c){var e,f="_set"+b.charAt(0).toUpperCase()+b.slice(1);this[f]!==d&&this[f](c),e=["initSelector","closeLinkSelector","closeLinkEvents","navigateEvents","closeEvents","history","container"],a.mobile.widget.prototype._setOption.apply(this,arguments),a.inArray(b,e)===-1&&this.element.attr("data-"+(a.mobile.ns||"")+b.replace(/([A-Z])/,"-$1").toLowerCase(),c)},_placementCoords:function(a){var b=f(),d={x:this._tolerance.l,y:b.y+this._tolerance.t,cx:b.cx-this._tolerance.l-this._tolerance.r,cy:b.cy-this._tolerance.t-this._tolerance.b},g,h;this._ui.container.css("max-width",d.cx),g={cx:this._ui.container.outerWidth(!0),cy:this._ui.container.outerHeight(!0)},h={x:e(d.cx,g.cx,d.x,a.x),y:e(d.cy,g.cy,d.y,a.y)},h.y=Math.max(0,h.y);var i=c.documentElement,j=c.body,k=Math.max(i.clientHeight,j.scrollHeight,j.offsetHeight,i.scrollHeight,i.offsetHeight);return h.y-=Math.min(h.y,Math.max(0,h.y+g.cy-k)),{left:h.x,top:h.y}},_createPrereqs:function(b,c,d){var e=this,f;f={screen:a.Deferred(),container:a.Deferred()},f.screen.then(function(){f===e._prereqs&&b()}),f.container.then(function(){f===e._prereqs&&c()}),a.when(f.screen,f.container).done(function(){f===e._prereqs&&(e._prereqs=null,d())}),e._prereqs=f},_animate:function(b){this._ui.screen.removeClass(b.classToRemove).addClass(b.screenClassToAdd),b.prereqs.screen.resolve(),b.transition&&b.transition!=="none"?(b.applyTransition&&this._applyTransition(b.transition),this._ui.container.animationComplete(a.proxy(b.prereqs.container,"resolve")).addClass(b.containerClassToAdd).removeClass(b.classToRemove)):b.prereqs.container.resolve()},_desiredCoords:function(b,c,d){var e=null,g,h=f();if(d&&d!=="origin")if(d==="window")b=h.cx/2+h.x,c=h.cy/2+h.y;else{try{e=a(d)}catch(i){e=null}e&&(e.filter(":visible"),e.length===0&&(e=null))}e&&(g=e.offset(),b=g.left+e.outerWidth()/2,c=g.top+e.outerHeight()/2);if(a.type(b)!=="number"||isNaN(b))b=h.cx/2+h.x;if(a.type(c)!=="number"||isNaN(c))c=h.cy/2+h.y;return{x:b,y:c}},_openPrereqsComplete:function(){var a=this;a._ui.container.addClass("ui-popup-active"),a._isOpen=!0,a._resizeScreen(),setTimeout(function(){a._ui.container.attr("tabindex","0").focus(),a._trigger("afteropen")})},_open:function(c){var d,e,f=function(){var a=b,c=navigator.userAgent,d=c.match(/AppleWebKit\/([0-9\.]+)/),e=!!d&&d[1],f=c.match(/Android (\d+(?:\.\d+))/),g=!!f&&f[1],h=c.indexOf("Chrome")>-1;return f!==null&&g==="4.0"&&e&&e>534.13&&!h?!0:!1}();c=c||{},e=c.transition||this.options.transition,this._trigger("beforeposition"),d=this._placementCoords(this._desiredCoords(c.x,c.y,c.positionTo||this.options.positionTo||"origin")),this._createPrereqs(a.noop,a.noop,a.proxy(this,"_openPrereqsComplete")),e?(this._currentTransition=e,this._applyTransition(e)):e=this.options.transition,this.options.theme||this._setTheme(this._page.jqmData("theme")||a.mobile.getInheritedTheme(this._page,"c")),this._ui.screen.removeClass("ui-screen-hidden"),this._ui.container.removeClass("ui-selectmenu-hidden").offset(d),this.options.overlayTheme&&f&&this.element.closest(".ui-page").addClass("ui-popup-open"),this._animate({additionalCondition:!0,transition:e,classToRemove:"",screenClassToAdd:"in",containerClassToAdd:"in",applyTransition:!1,prereqs:this._prereqs})},_closePrereqScreen:function(){this._ui.screen.removeClass("out").addClass("ui-screen-hidden")},_closePrereqContainer:function(){this._ui.container.removeClass("reverse out").addClass("ui-selectmenu-hidden").removeAttr("style")},_closePrereqsDone:function(){var b=this,c=b.options;b._ui.container.removeAttr("tabindex"),c.container.unbind(c.closeEvents),b.element.undelegate(c.closeLinkSelector,c.closeLinkEvents),a.mobile.popup.active=d,b._trigger("afterclose")},_close:function(){this._ui.container.removeClass("ui-popup-active"),this._page.removeClass("ui-popup-open"),this._isOpen=!1,this._createPrereqs(a.proxy(this,"_closePrereqScreen"),a.proxy(this,"_closePrereqContainer"),a.proxy(this,"_closePrereqsDone")),this._animate({additionalCondition:this._ui.screen.hasClass("in"),transition:this._currentTransition||this.options.transition,classToRemove:"in",screenClassToAdd:"out",containerClassToAdd:"reverse out",applyTransition:!0,prereqs:this._prereqs})},_destroy:function(){var b=this;b._close(),b._setTheme("none"),b.element.insertAfter(b._ui.placeholder).removeClass("ui-popup ui-overlay-shadow ui-corner-all"),b._ui.screen.remove(),b._ui.container.remove(),b._ui.placeholder.remove(),a.each(b._globalHandlers,function(b,c){a.each(c.handler,function(a,b){c.src.unbind(a,b)})})},_bindContainerClose:function(){var b=this;b.options.container.one(b.options.closeEvents,a.proxy(b._close,b))},open:function(b){var c=this,e=this.options,f,g,h,i,j,k;if(a.mobile.popup.active)return;a.mobile.popup.active=this;if(!e.history){c._open(b),c._bindContainerClose(),c.element.delegate(e.closeLinkSelector,e.closeLinkEvents,function(a){return c._close(),!1});return}g=a.mobile.dialogHashKey,h=a.mobile.activePage,i=h.is(".ui-dialog"),f=a.mobile.urlHistory.getActive().url,j=f.indexOf(g)>-1&&!i,k=a.mobile.urlHistory;if(j){c._open(b),c._bindContainerClose();return}f.indexOf(g)===-1&&!i?f=f+g:f=a.mobile.path.parseLocation().hash+g,k.activeIndex===0&&f===k.initialDst&&(f+=g),e.container.one(e.navigateEvents,function(a){a.preventDefault(),c._open(b),c._bindContainerClose()}),k.ignoreNextHashChange=i,k.addNew(f,d,d,d,"dialog"),a.mobile.path.set(f)},close:function(){if(!a.mobile.popup.active)return;this.options.history?a.mobile.back():this._close()}}),a.mobile.popup.handleLink=function(b){var c=b.closest(":jqmData(role='page')"),d=c.length===0?a("body"):c,e=a(a.mobile.path.parseUrl(b.attr("href")).hash,d[0]),f;e.data("popup")&&(f=b.offset(),e.popup("open",{x:f.left+b.outerWidth()/2,y:f.top+b.outerHeight()/2,transition:b.jqmData("transition"),positionTo:b.jqmData("position-to"),link:b})),setTimeout(function(){b.removeClass(a.mobile.activeBtnClass)},300)},a(c).bind("pagebeforechange",function(b,c){c.options.role==="popup"&&(a.mobile.popup.handleLink(c.options.link),b.preventDefault())}),a(c).bind("pagecreate create",function(b){a.mobile.popup.prototype.enhanceWithin(b.target,!0)})}(a),function(a){var b=a("meta[name=viewport]"),c=b.attr("content"),d=c+",maximum-scale=1, user-scalable=no",e=c+",maximum-scale=10, user-scalable=yes",f=/(user-scalable[\s]*=[\s]*no)|(maximum-scale[\s]*=[\s]*1)[$,\s]/.test(c);a.mobile.zoom=a.extend({},{enabled:!f,locked:!1,disable:function(c){!f&&!a.mobile.zoom.locked&&(b.attr("content",d),a.mobile.zoom.enabled=!1,a.mobile.zoom.locked=c||!1)},enable:function(c){!f&&(!a.mobile.zoom.locked||c===!0)&&(b.attr("content",e),a.mobile.zoom.enabled=!0,a.mobile.zoom.locked=!1)},restore:function(){f||(b.attr("content",c),a.mobile.zoom.enabled=!0)}})}(a),function(a,d){a.widget("mobile.textinput",a.mobile.widget,{options:{theme:null,preventFocusZoom:/iPhone|iPad|iPod/.test(navigator.platform)&&navigator.userAgent.indexOf("AppleWebKit")>-1,initSelector:"input[type='text'], input[type='search'], :jqmData(type='search'), input[type='number'], :jqmData(type='number'), input[type='password'], input[type='email'], input[type='url'], input[type='tel'], textarea, input[type='time'], input[type='date'], input[type='month'], input[type='week'], input[type='datetime'], input[type='datetime-local'], input[type='color'], input:not([type])",clearSearchButtonText:"clear text",disabled:!1},_create:function(){function m(){setTimeout(function(){l.toggleClass("ui-input-clear-hidden",!e.val())},0)}var d=this,e=this.element,f=this.options,g=f.theme||a.mobile.getInheritedTheme(this.element,"c"),h=" ui-body-"+g,i=e.jqmData("mini")===!0,j=i?" ui-mini":"",k,l;a("label[for='"+e.attr("id")+"']").addClass("ui-input-text"),k=e.addClass("ui-input-text ui-body-"+g),typeof e[0].autocorrect!="undefined"&&!a.support.touchOverflow&&(e[0].setAttribute("autocorrect","off"),e[0].setAttribute("autocomplete","off")),e.is("[type='search'],:jqmData(type='search')")?(k=e.wrap("<div class='ui-input-search ui-shadow-inset ui-btn-corner-all ui-btn-shadow ui-icon-searchfield"+h+j+"'></div>").parent(),l=a("<a href='#' class='ui-input-clear' title='"+f.clearSearchButtonText+"'>"+f.clearSearchButtonText+"</a>").bind("click",function(a){e.val("").focus().trigger("change"),l.addClass("ui-input-clear-hidden"),a.preventDefault()}).appendTo(k).buttonMarkup({icon:"delete",iconpos:"notext",corners:!0,shadow:!0,mini:i}),m(),e.bind("paste cut keyup focus change blur",m)):e.addClass("ui-corner-all ui-shadow-inset"+h+j),e.focus(function(){k.addClass(a.mobile.focusClass)}).blur(function(){k.removeClass(a.mobile.focusClass)}).bind("focus",function(){f.preventFocusZoom&&a.mobile.zoom.disable(!0)}).bind("blur",function(){f.preventFocusZoom&&a.mobile.zoom.enable(!0)});if(e.is("textarea")){var n=15,o=100,p;this._keyup=function(){var a=e[0].scrollHeight,b=e[0].clientHeight;b<a&&e.height(a+n)},e.keyup(function(){clearTimeout(p),p=setTimeout(d._keyup,o)}),this._on(a(c),{pagechange:"_keyup"}),a.trim(e.val())&&this._on(a(b),{load:"_keyup"})}e.attr("disabled")&&this.disable()},disable:function(){var a;return this.element.attr("disabled",!0).is("[type='search'], :jqmData(type='search')")?a=this.element.parent():a=this.element,a.addClass("ui-disabled"),this._setOption("disabled",!0)},enable:function(){var a;return this.element.attr("disabled",!1).is("[type='search'], :jqmData(type='search')")?a=this.element.parent():a=this.element,a.removeClass("ui-disabled"),this._setOption("disabled",!1)}}),a(c).bind("pagecreate create",function(b){a.mobile.textinput.prototype.enhanceWithin(b.target,!0)})}(a),function(a,b){a.mobile.listview.prototype.options.filter=!1,a.mobile.listview.prototype.options.filterPlaceholder="Filter items...",a.mobile.listview.prototype.options.filterTheme="c";var d=function(a,b,c){return a.toString().toLowerCase().indexOf(b)===-1};a.mobile.listview.prototype.options.filterCallback=d,a(c).delegate(":jqmData(role='listview')","listviewcreate",function(){var b=a(this),c=b.data("listview");if(!c.options.filter)return;var e=a("<form>",{"class":"ui-listview-filter ui-bar-"+c.options.filterTheme,role:"search"}),f=a("<input>",{placeholder:c.options.filterPlaceholder}).attr("data-"+a.mobile.ns+"type","search").jqmData("lastval","").bind("keyup change",function(){var e=a(this),f=this.value.toLowerCase(),g=null,h=e.jqmData("lastval")+"",i=!1,j="",k,l=c.options.filterCallback!==d;c._trigger("beforefilter","beforefilter",{input:this}),e.jqmData("lastval",f),l||f.length<h.length||f.indexOf(h)!==0?g=b.children():g=b.children(":not(.ui-screen-hidden)");if(f){for(var m=g.length-1;m>=0;m--)k=a(g[m]),j=k.jqmData("filtertext")||k.text(),k.is("li:jqmData(role=list-divider)")?(k.toggleClass("ui-filter-hidequeue",!i),i=!1):c.options.filterCallback(j,f,k)?k.toggleClass("ui-filter-hidequeue",!0):i=!0;g.filter(":not(.ui-filter-hidequeue)").toggleClass("ui-screen-hidden",!1),g.filter(".ui-filter-hidequeue").toggleClass("ui-screen-hidden",!0).toggleClass("ui-filter-hidequeue",!1)}else g.toggleClass("ui-screen-hidden",!1);c._refreshCorners()}).appendTo(e).textinput();c.options.inset&&e.addClass("ui-listview-filter-inset"),e.bind("submit",function(){return!1}).insertBefore(b)})}(a),function(a,d){a.widget("mobile.slider",a.mobile.widget,{widgetEventPrefix:"slide",options:{theme:null,trackTheme:null,disabled:!1,initSelector:"input[type='range'], :jqmData(type='range'), :jqmData(role='slider')",mini:!1},_create:function(){var e=this,f=this.element,g=a.mobile.getInheritedTheme(f,"c"),h=this.options.theme||g,i=this.options.trackTheme||g,j=f[0].nodeName.toLowerCase(),k=j==="select"?"ui-slider-switch":"",l=f.attr("id"),m=a("[for='"+l+"']"),n=m.attr("id")||l+"-label",o=m.attr("id",n),p=function(){return j==="input"?parseFloat(f.val()):f[0].selectedIndex},q=j==="input"?parseFloat(f.attr("min")):0,r=j==="input"?parseFloat(f.attr("max")):f.find("option").length-1,s=b.parseFloat(f.attr("step")||1),t=this.options.inline||f.jqmData("inline")===!0?" ui-slider-inline":"",u=this.options.mini||f.jqmData("mini")?" ui-slider-mini":"",v=c.createElement("a"),w=a(v),x=c.createElement("div"),y=a(x),z=f.jqmData("highlight")&&j!=="select"?function(){var b=c.createElement("div");return b.className="ui-slider-bg "+a.mobile.activeBtnClass+" ui-btn-corner-all",a(b).prependTo(y)}():!1,A;this._type=j,v.setAttribute("href","#"),x.setAttribute("role","application"),x.className=["ui-slider ",k," ui-btn-down-",i," ui-btn-corner-all",t,u].join(""),v.className="ui-slider-handle",x.appendChild(v),w.buttonMarkup({corners:!0,theme:h,shadow:!0}).attr({role:"slider","aria-valuemin":q,"aria-valuemax":r,"aria-valuenow":p(),"aria-valuetext":p(),title:p(),"aria-labelledby":n}),a.extend(this,{slider:y,handle:w,valuebg:z,dragging:!1,beforeStart:null,userModified:!1,mouseMoved:!1});if(j==="select"){var B=c.createElement("div");B.className="ui-slider-inneroffset";for(var C=0,D=x.childNodes.length;C<D;C++)B.appendChild(x.childNodes[C]);x.appendChild(B),w.addClass("ui-slider-handle-snapping"),A=f.find("option");for(var E=0,F=A.length;E<F;E++){var G=E?"a":"b",H=E?" "+a.mobile.activeBtnClass:" ui-btn-down-"+i,I=c.createElement("div"),J=c.createElement("span");J.className=["ui-slider-label ui-slider-label-",G,H," ui-btn-corner-all"].join(""),J.setAttribute("role","img"),J.appendChild(c.createTextNode(A[E].innerHTML)),a(J).prependTo(y)}e._labels=a(".ui-slider-label",y)}o.addClass("ui-slider"),f.addClass(j==="input"?"ui-slider-input":"ui-slider-switch").change(function(){e.mouseMoved||e.refresh(p(),!0)}).keyup(function(){e.refresh(p(),!0,!0)}).blur(function(){e.refresh(p(),!0)}),this._preventDocumentDrag=function(a){if(e.dragging&&!e.options.disabled)return e.mouseMoved=!0,j==="select"&&w.removeClass("ui-slider-handle-snapping"),e.refresh(a),e.userModified=e.beforeStart!==f[0].selectedIndex,!1},this._on(a(c),{vmousemove:this._preventDocumentDrag}),f.bind("vmouseup",a.proxy(e._checkedRefresh,e)),y.bind("vmousedown",function(a){return e.options.disabled?!1:(e.dragging=!0,e.userModified=!1,e.mouseMoved=!1,j==="select"&&(e.beforeStart=f[0].selectedIndex),e.refresh(a),e._trigger("start"),!1)}).bind("vclick",!1),this._sliderMouseUp=function(){if(e.dragging)return e.dragging=!1,j==="select"&&(w.addClass("ui-slider-handle-snapping"),e.mouseMoved?e.userModified?e.refresh(e.beforeStart===0?1:0):e.refresh(e.beforeStart):e.refresh(e.beforeStart===0?1:0)),e.mouseMoved=!1,e._trigger("stop"),!1},this._on(y.add(c),{vmouseup:this._sliderMouseUp}),y.insertAfter(f),j==="select"&&this.handle.bind({focus:function(){y.addClass(a.mobile.focusClass)},blur:function(){y.removeClass(a.mobile.focusClass)}}),this.handle.bind({vmousedown:function(){a(this).focus()},vclick:!1,keydown:function(b){var c=p();if(e.options.disabled)return;switch(b.keyCode){case a.mobile.keyCode.HOME:case a.mobile.keyCode.END:case a.mobile.keyCode.PAGE_UP:case a.mobile.keyCode.PAGE_DOWN:case a.mobile.keyCode.UP:case a.mobile.keyCode.RIGHT:case a.mobile.keyCode.DOWN:case a.mobile.keyCode.LEFT:b.preventDefault(),e._keySliding||(e._keySliding=!0,a(this).addClass("ui-state-active"))}switch(b.keyCode){case a.mobile.keyCode.HOME:e.refresh(q);break;case a.mobile.keyCode.END:e.refresh(r);break;case a.mobile.keyCode.PAGE_UP:case a.mobile.keyCode.UP:case a.mobile.keyCode.RIGHT:e.refresh(c+s);break;case a.mobile.keyCode.PAGE_DOWN:case a.mobile.keyCode.DOWN:case a.mobile.keyCode.LEFT:e.refresh(c-s)}},keyup:function(b){e._keySliding&&(e._keySliding=!1,a(this).removeClass("ui-state-active"))}}),this.refresh(d,d,!0)},_checkedRefresh:function(){this.value!=this._value()&&this.refresh(this._value())},_value:function(){return this._type==="input"?parseFloat(this.element.val()):this.element[0].selectedIndex},refresh:function(b,c,d){(this.options.disabled||this.element.attr("disabled"))&&this.disable(),this.value=this._value();var e=this.element,f,g=e[0].nodeName.toLowerCase(),h=g==="input"?parseFloat(e.attr("min")):0,i=g==="input"?parseFloat(e.attr("max")):e.find("option").length-1,j=g==="input"&&parseFloat(e.attr("step"))>0?parseFloat(e.attr("step")):1;if(typeof b=="object"){var k=b,l=8;if(!this.dragging||k.pageX<this.slider.offset().left-l||k.pageX>this.slider.offset().left+this.slider.width()+l)return;f=Math.round((k.pageX-this.slider.offset().left)/this.slider.width()*100)}else b==null&&(b=g==="input"?parseFloat(e.val()||0):e[0].selectedIndex),f=(parseFloat(b)-h)/(i-h)*100;if(isNaN(f))return;f<0&&(f=0),f>100&&(f=100);var m=f/100*(i-h)+h,n=(m-h)%j,o=m-n;Math.abs(n)*2>=j&&(o+=n>0?j:-j),m=parseFloat(o.toFixed(5)),m<h&&(m=h),m>i&&(m=i),this.handle.css("left",f+"%"),this.handle.attr({"aria-valuenow":g==="input"?m:e.find("option").eq(m).attr("value"),"aria-valuetext":g==="input"?m:e.find("option").eq(m).getEncodedText(),title:g==="input"?m:e.find("option").eq(m).getEncodedText()}),this.valuebg&&this.valuebg.css("width",f+"%");if(this._labels){var p=this.handle.width()/this.slider.width()*100,q=f&&p+(100-p)*f/100,r=f===100?0:Math.min(p+100-q,100);this._labels.each(function(){var b=a(this).is(".ui-slider-label-a");a(this).width((b?q:r)+"%")})}if(!d){var s=!1;g==="input"?(s=e.val()!==m,e.val(m)):(s=e[0].selectedIndex!==m,e[0].selectedIndex=m),!c&&s&&e.trigger("change")}},enable:function(){return this.element.attr("disabled",!1),this.slider.removeClass("ui-disabled").attr("aria-disabled",!1),this._setOption("disabled",!1)},disable:function(){return this.element.attr("disabled",!0),this.slider.addClass("ui-disabled").attr("aria-disabled",!0),this._setOption("disabled",!0)}}),a(c).bind("pagecreate create",function(b){a.mobile.slider.prototype.enhanceWithin(b.target,!0)})}(a),function(a,d){a.widget("mobile.selectmenu",a.mobile.widget,{options:{theme:null,disabled:!1,icon:"arrow-d",iconpos:"right",inline:!1,corners:!0,shadow:!0,iconshadow:!0,overlayTheme:"a",hidePlaceholderMenuItems:!0,closeText:"Close",nativeMenu:!0,preventFocusZoom:/iPhone|iPad|iPod/.test(navigator.platform)&&navigator.userAgent.indexOf("AppleWebKit")>-1,initSelector:"select:not( :jqmData(role='slider') )",mini:!1},_button:function(){return a("<div/>")},_setDisabled:function(a){return this.element.attr("disabled",a),this.button.attr("aria-disabled",a),this._setOption("disabled",a)},_focusButton:function(){var a=this;setTimeout(function(){a.button.focus()},40)},_selectOptions:function(){return this.select.find("option")},_preExtension:function(){var b="";!~this.element[0].className.indexOf("ui-btn-left")||(b=" ui-btn-left"),!~this.element[0].className.indexOf("ui-btn-right")||(b=" ui-btn-right"),this.select=this.element.wrap("<div class='ui-select"+b+"'>"),this.selectID=this.select.attr("id"),this.label=a("label[for='"+this.selectID+"']").addClass("ui-select"),this.isMultiple=this.select[0].multiple,this.options.theme||(this.options.theme=a.mobile.getInheritedTheme(this.select,"c"))},_create:function(){this._preExtension(),this._trigger("beforeCreate"),this.button=this._button();var c=this,d=this.options,e=d.inline||this.select.jqmData("inline"),f=d.mini||this.select.jqmData("mini"),g=d.icon?d.iconpos||this.select.jqmData("iconpos"):!1,h=this.select[0].selectedIndex===-1?0:this.select[0].selectedIndex,i=this.button.insertBefore(this.select).buttonMarkup({theme:d.theme,icon:d.icon,iconpos:g,inline:e,corners:d.corners,shadow:d.shadow,iconshadow:d.iconshadow,mini:f});this.setButtonText(),d.nativeMenu&&b.opera&&b.opera.version&&i.addClass("ui-select-nativeonly"),this.isMultiple&&(this.buttonCount=a("<span>").addClass("ui-li-count ui-btn-up-c ui-btn-corner-all").hide().appendTo(i.addClass("ui-li-has-count"))),(d.disabled||this.element.attr("disabled"))&&this.disable(),this.select.change(function(){c.refresh()}),this.build()},build:function(){var b=this;this.select.appendTo(b.button).bind("vmousedown",function(){b.button.addClass(a.mobile.activeBtnClass)}).bind("focus",function(){b.button.addClass(a.mobile.focusClass)}).bind("blur",function(){b.button.removeClass(a.mobile.focusClass)}).bind("focus vmouseover",function(){b.button.trigger("vmouseover")}).bind("vmousemove",function(){b.button.removeClass(a.mobile.activeBtnClass)}).bind("change blur vmouseout",function(){b.button.trigger("vmouseout").removeClass(a.mobile.activeBtnClass)}).bind("change blur",function(){b.button.removeClass("ui-btn-down-"+b.options.theme)}),b.button.bind("vmousedown",function(){b.options.preventFocusZoom&&a.mobile.zoom.disable(!0)}).bind("mouseup",function(){b.options.preventFocusZoom&&setTimeout(function(){a.mobile.zoom.enable(!0)},0)})},selected:function(){return this._selectOptions().filter(":selected")},selectedIndices:function(){var a=this;return this.selected().map(function(){return a._selectOptions().index(this)}).get()},setButtonText:function(){var b=this,d=this.selected(),e=this.placeholder,f=a(c.createElement("span"));this.button.find(".ui-btn-text").html(function(){return d.length?e=d.map(function(){return a(this).text()}).get().join(", "):e=b.placeholder,f.text(e).addClass(b.select.attr("class")).addClass(d.attr("class"))})},setButtonCount:function(){var a=this.selected();this.isMultiple&&this.buttonCount[a.length>1?"show":"hide"]().text(a.length)},refresh:function(){this.setButtonText(),this.setButtonCount()},open:a.noop,close:a.noop,disable:function(){this._setDisabled(!0),this.button.addClass("ui-disabled")},enable:function(){this._setDisabled(!1),this.button.removeClass("ui-disabled")}}),a(c).bind("pagecreate create",function(b){a.mobile.selectmenu.prototype.enhanceWithin(b.target,!0)})}(a),function(a,d){var e=function(d){var e=d.select,f=d.selectID,g=d.label,h=d.select.closest(".ui-page"),i=d._selectOptions(),j=d.isMultiple=d.select[0].multiple,k=f+"-button",l=f+"-menu",m=a("<div data-"+a.mobile.ns+"role='dialog' data-"+a.mobile.ns+"theme='"+d.options.theme+"' data-"+a.mobile.ns+"overlay-theme='"+d.options.overlayTheme+"'>"+"<div data-"+a.mobile.ns+"role='header'>"+"<div class='ui-title'>"+g.getEncodedText()+"</div>"+"</div>"+"<div data-"+a.mobile.ns+"role='content'></div>"+"</div>"),n=a("<div>",{"class":"ui-selectmenu"}).insertAfter(d.select).popup({theme:"a"}),o=a("<ul>",{"class":"ui-selectmenu-list",id:l,role:"listbox","aria-labelledby":k}).attr("data-"+a.mobile.ns+"theme",d.options.theme).appendTo(n),p=a("<div>",{"class":"ui-header ui-bar-"+d.options.theme}).prependTo(n),q=a("<h1>",{"class":"ui-title"}).appendTo(p),r,s,t;d.isMultiple&&(t=a("<a>",{text:d.options.closeText,href:"#","class":"ui-btn-left"}).attr("data-"+a.mobile.ns+"iconpos","notext").attr("data-"+a.mobile.ns+"icon","delete").appendTo(p).buttonMarkup()),a.extend(d,{select:d.select,selectID:f,buttonId:k,menuId:l,thisPage:h,menuPage:m,label:g,selectOptions:i,isMultiple:j,theme:d.options.theme,listbox:n,list:o,header:p,headerTitle:q,headerClose:t,menuPageContent:r,menuPageClose:s,placeholder:"",build:function(){var b=this;b.refresh(),b.select.attr("tabindex","-1").focus(function(){a(this).blur(),b.button.focus()}),b.button.bind("vclick keydown",function(c){if(c.type==="vclick"||c.keyCode&&(c.keyCode===a.mobile.keyCode.ENTER||c.keyCode===a.mobile.keyCode.SPACE))b.open(),c.preventDefault()}),b.list.attr("role","listbox").bind("focusin",function(b){a(b.target).attr("tabindex","0").trigger("vmouseover")}).bind("focusout",function(b){a(b.target).attr("tabindex","-1").trigger("vmouseout")}).delegate("li:not(.ui-disabled, .ui-li-divider)","click",function(c){var e=b.select[0].selectedIndex,f=b.list.find("li:not(.ui-li-divider)").index(this),g=b._selectOptions().eq(f)[0];g.selected=b.isMultiple?!g.selected:!0,b.isMultiple&&a(this).find(".ui-icon").toggleClass("ui-icon-checkbox-on",g.selected).toggleClass("ui-icon-checkbox-off",!g.selected),(b.isMultiple||e!==f)&&b.select.trigger("change"),b.isMultiple?b.list.find("li:not(.ui-li-divider)").eq(f).addClass("ui-btn-down-"+d.options.theme).find("a").first().focus():b.close(),c.preventDefault()}).keydown(function(b){var c=a(b.target),e=c.closest("li"),f,g;switch(b.keyCode){case 38:return f=e.prev().not(".ui-selectmenu-placeholder"),f.is(".ui-li-divider")&&(f=f.prev()),f.length&&(c.blur().attr("tabindex","-1"),f.addClass("ui-btn-down-"+d.options.theme).find("a").first().focus()),!1;case 40:return g=e.next(),g.is(".ui-li-divider")&&(g=g.next()),g.length&&(c.blur().attr("tabindex","-1"),g.addClass("ui-btn-down-"+d.options.theme).find("a").first().focus()),!1;case 13:case 32:return c.trigger("click"),!1}}),b.menuPage.bind("pagehide",function(){b.list.appendTo(b.listbox),b._focusButton(),a.mobile._bindPageRemove.call(b.thisPage)}),b.listbox.bind("popupafterclose",function(a){b.close()}),b.isMultiple&&b.headerClose.click(function(){if(b.menuType==="overlay")return b.close(),!1}),b.thisPage.addDependents(this.menuPage)},_isRebuildRequired:function(){var a=this.list.find("li"),b=this._selectOptions();return b.text()!==a.text()},selected:function(){return this._selectOptions().filter(":selected:not( :jqmData(placeholder='true') )")},refresh:function(b,c){var d=this,e=this.element,f=this.isMultiple,g;(b||this._isRebuildRequired())&&d._buildList(),g=this.selectedIndices(),d.setButtonText(),d.setButtonCount(),d.list.find("li:not(.ui-li-divider)").removeClass(a.mobile.activeBtnClass).attr("aria-selected",!1).each(function(b){if(a.inArray(b,g)>-1){var c=a(this);c.attr("aria-selected",!0),d.isMultiple?c.find(".ui-icon").removeClass("ui-icon-checkbox-off").addClass("ui-icon-checkbox-on"):c.is(".ui-selectmenu-placeholder")?c.next().addClass(a.mobile.activeBtnClass):c.addClass(a.mobile.activeBtnClass)}})},close:function(){if(this.options.disabled||!this.isOpen)return;var b=this;b.menuType==="page"?a.mobile.back():(b.listbox.popup("close"),b.list.appendTo(b.listbox),b._focusButton()),b.isOpen=!1},open:function(){function o(){var b=c.list.find("."+a.mobile.activeBtnClass+" a");b.length===0&&(b=c.list.find("li.ui-btn:not( :jqmData(placeholder='true') ) a")),b.first().focus().closest("li").addClass("ui-btn-down-"+d.options.theme)}if(this.options.disabled)return;var c=this,e=a(b),f=c.list.parent(),g=f.outerHeight(),h=f.outerWidth(),i=a("."+a.mobile.activePageClass),j=e.scrollTop(),k=c.button.offset().top,l=e.height(),n=e.width();c.button.addClass(a.mobile.activeBtnClass),setTimeout(function(){c.button.removeClass(a.mobile.activeBtnClass)},300),g>l-80||!a.support.scrollTop?(c.menuPage.appendTo(a.mobile.pageContainer).page(),c.menuPageContent=m.find(".ui-content"),c.menuPageClose=m.find(".ui-header a"),c.thisPage.unbind("pagehide.remove"),j===0&&k>l&&c.thisPage.one("pagehide",function(){a(this).jqmData("lastScroll",k)}),c.menuPage.one("pageshow",function(){o(),c.isOpen=!0}),c.menuType="page",c.menuPageContent.append(c.list),c.menuPage.find("div .ui-title").text(c.label.text()),a.mobile.changePage(c.menuPage,{transition:a.mobile.defaultDialogTransition})):(c.menuType="overlay",c.listbox.one("popupafteropen",o).popup("open",{x:c.button.offset().left+c.button.outerWidth()/2,y:c.button.offset().top+c.button.outerHeight()/2}),c.isOpen=!0)},_buildList:function(){var b=this,d=this.options,e=this.placeholder,f=!0,g=[],h=[],i=b.isMultiple?"checkbox-off":"false";b.list.empty().filter(".ui-listview").listview("destroy");var j=b.select.find("option"),k=j.length,l=this.select[0],m="data-"+a.mobile.ns,n=m+"option-index",o=m+"icon",p=m+"role",q=m+"placeholder",r=c.createDocumentFragment(),s=!1,t;for(var u=0;u<k;u++,s=!1){var v=j[u],w=a(v),x=v.parentNode,y=w.text(),z=c.createElement("a"),A=[];z.setAttribute("href","#"),z.appendChild(c.createTextNode(y));if(x!==l&&x.nodeName.toLowerCase()==="optgroup"){var B=x.getAttribute("label");if(B!==t){var C=c.createElement("li");C.setAttribute(p,"list-divider"),C.setAttribute("role","option"),C.setAttribute("tabindex","-1"),C.appendChild(c.createTextNode(B)),r.appendChild(C),t=B}}f&&(!v.getAttribute("value")||y.length===0||w.jqmData("placeholder"))&&(f=!1,s=!0,v.setAttribute(q,!0),d.hidePlaceholderMenuItems&&A.push("ui-selectmenu-placeholder"),e||(e=b.placeholder=y));var D=c.createElement("li");v.disabled&&(A.push("ui-disabled"),D.setAttribute("aria-disabled",!0)),D.setAttribute(n,u),D.setAttribute(o,i),s&&D.setAttribute(q,!0),D.className=A.join(" "),D.setAttribute("role","option"),z.setAttribute("tabindex","-1"),D.appendChild(z),r.appendChild(D)}b.list[0].appendChild(r),!this.isMultiple&&!e.length?this.header.hide():this.headerTitle.text(this.placeholder),b.list.listview()},_button:function(){return a("<a>",{href:"#",role:"button",id:this.buttonId,"aria-haspopup":"true","aria-owns":this.menuId})}})};a(c).bind("selectmenubeforecreate",function(b){var c=a(b.target).data("selectmenu");!c.options.nativeMenu&&c.element.parents(":jqmData(role='popup')").length===0&&e(c)})}(a),function(a,d){a.widget("mobile.fixedtoolbar",a.mobile.widget,{options:{visibleOnPageShow:!0,disablePageZoom:!0,transition:"slide",fullscreen:!1,tapToggle:!0,tapToggleBlacklist:"a, button, input, select, textarea, .ui-header-fixed, .ui-footer-fixed, .ui-popup",hideDuringFocus:"input, textarea, select",updatePagePadding:!0,trackPersistentToolbars:!0,supportBlacklist:function(){var a=b,c=navigator.userAgent,d=navigator.platform,e=c.match(/AppleWebKit\/([0-9]+)/),f=!!e&&e[1],g=c.match(/Fennec\/([0-9]+)/),h=!!g&&g[1],i=c.match(/Opera Mobi\/([0-9]+)/),j=!!i&&i[1];return(d.indexOf("iPhone")>-1||d.indexOf("iPad")>-1||d.indexOf("iPod")>-1)&&f&&f<534||a.operamini&&{}.toString.call(a.operamini)==="[object OperaMini]"||i&&j<7458||c.indexOf("Android")>-1&&f&&f<533||h&&h<6||"palmGetResource"in b&&f&&f<534||c.indexOf("MeeGo")>-1&&c.indexOf("NokiaBrowser/8.5.0")>-1?!0:!1},initSelector:":jqmData(position='fixed')"},_create:function(){var a=this,b=a.options,c=a.element,d=c.is(":jqmData(role='header')")?"header":"footer",e=c.closest(".ui-page");if(b.supportBlacklist()){a.destroy();return}c.addClass("ui-"+d+"-fixed"),b.fullscreen?(c.addClass("ui-"+d+"-fullscreen"),e.addClass("ui-page-"+d+"-fullscreen")):e.addClass("ui-page-"+d+"-fixed"),a._addTransitionClass(),a._bindPageEvents(),a._bindToggleHandlers()},_addTransitionClass:function(){var a=this.options.transition;a&&a!=="none"&&(a==="slide"&&(a=this.element.is(".ui-header")?"slidedown":"slideup"),this.element.addClass(a))},_bindPageEvents:function(){var c=this,d=c.options,e=c.element;e.closest(".ui-page").bind("pagebeforeshow",function(){d.disablePageZoom&&a.mobile.zoom.disable(!0),d.visibleOnPageShow||c.hide(!0)}).bind("webkitAnimationStart animationstart updatelayout",function(){var a=this;d.updatePagePadding&&c.updatePagePadding(a)}).bind("pageshow",function(){var e=this;c.updatePagePadding(e),d.updatePagePadding&&a(b).bind("throttledresize."+c.widgetName,function(){c.updatePagePadding(e)})}).bind("pagebeforehide",function(e,f){d.disablePageZoom&&a.mobile.zoom.enable(!0),d.updatePagePadding&&a(b).unbind("throttledresize."+c.widgetName);if(d.trackPersistentToolbars){var g=a(".ui-footer-fixed:jqmData(id)",this),h=a(".ui-header-fixed:jqmData(id)",this),i=g.length&&f.nextPage&&a(".ui-footer-fixed:jqmData(id='"+g.jqmData("id")+"')",f.nextPage)||a(),j=h.length&&f.nextPage&&a(".ui-header-fixed:jqmData(id='"+h.jqmData("id")+"')",f.nextPage)||a();if(i.length||j.length)i.add(j).appendTo(a.mobile.pageContainer),f.nextPage.one("pageshow",function(){i.add(j).appendTo(this)})}})},_visible:!0,updatePagePadding:function(b){var c=this.element,d=c.is(".ui-header");if(this.options.fullscreen)return;b=b||c.closest(".ui-page"),a(b).css("padding-"+(d?"top":"bottom"),c.outerHeight())},_useTransition:function(c){var d=a(b),e=this.element,f=d.scrollTop(),g=e.height(),h=e.closest(".ui-page").height(),i=a.mobile.getScreenHeight(),j=e.is(":jqmData(role='header')")?"header":"footer";return!c&&(this.options.transition&&this.options.transition!=="none"&&(j==="header"&&!this.options.fullscreen&&f>g||j==="footer"&&!this.options.fullscreen&&f+i<h-g)||this.options.fullscreen)},show:function(a){var b="ui-fixed-hidden",c=this.element;this._useTransition(a)?c.removeClass("out "+b).addClass("in"):c.removeClass(b),this._visible=!0},hide:function(a){var b="ui-fixed-hidden",c=this.element,d="out"+(this.options.transition==="slide"?" reverse":"");this._useTransition(a)?c.addClass(d).removeClass("in").animationComplete(function(){c.addClass(b).removeClass(d)}):c.addClass(b).removeClass(d),this._visible=!1},toggle:function(){this[this._visible?"hide":"show"]()},_bindToggleHandlers:function(){var b=this,c=b.options,d=b.element;d.closest(".ui-page").bind("vclick",function(d){c.tapToggle&&!a(d.target).closest(c.tapToggleBlacklist).length&&b.toggle()}).bind("focusin focusout",function(d){screen.width<500&&a(d.target).is(c.hideDuringFocus)&&!a(d.target).closest(".ui-header-fixed, .ui-footer-fixed").length&&b[d.type==="focusin"&&b._visible?"hide":"show"]()})},destroy:function(){this.element.removeClass("ui-header-fixed ui-footer-fixed ui-header-fullscreen ui-footer-fullscreen in out fade slidedown slideup ui-fixed-hidden"),this.element.closest(".ui-page").removeClass("ui-page-header-fixed ui-page-footer-fixed ui-page-header-fullscreen ui-page-footer-fullscreen")}}),a(c).bind("pagecreate create",function(b){a(b.target).jqmData("fullscreen")&&a(a.mobile.fixedtoolbar.prototype.options.initSelector,b.target).not(":jqmData(fullscreen)").jqmData("fullscreen",!0),a.mobile.fixedtoolbar.prototype.enhanceWithin(b.target)})}(a),function(a,b){function i(a){d=a.originalEvent,h=d.accelerationIncludingGravity,e=Math.abs(h.x),f=Math.abs(h.y),g=Math.abs(h.z),!b.orientation&&(e>7||(g>6&&f<8||g<8&&f>6)&&e>5)?c.enabled&&c.disable():c.enabled||c.enable()}if(!(/iPhone|iPad|iPod/.test(navigator.platform)&&navigator.userAgent.indexOf("AppleWebKit")>-1))return;var c=a.mobile.zoom,d,e,f,g,h;a(b).bind("orientationchange.iosorientationfix",c.enable).bind("devicemotion.iosorientationfix",i)}(a,this),function(a,b,d){function h(){e.removeClass("ui-mobile-rendering")}var e=a("html"),f=a("head"),g=a(b);a(b.document).trigger("mobileinit");if(!a.mobile.gradeA())return;a.mobile.ajaxBlacklist&&(a.mobile.ajaxEnabled=!1),e.addClass("ui-mobile ui-mobile-rendering"),setTimeout(h,5e3),a.extend(a.mobile,{initializePage:function(){var b=a(":jqmData(role='page'), :jqmData(role='dialog')"),d=a.mobile.path.parseLocation().hash.replace("#",""),e=c.getElementById(d);b.length||(b=a("body").wrapInner("<div data-"+a.mobile.ns+"role='page'></div>").children(0)),b.each(function(){var b=a(this);b.jqmData("url")||b.attr("data-"+a.mobile.ns+"url",b.attr("id")||location.pathname+location.search)}),a.mobile.firstPage=b.first(),a.mobile.pageContainer=b.first().parent().addClass("ui-mobile-viewport"),g.trigger("pagecontainercreate"),a.mobile.showPageLoadingMsg(),h(),!a.mobile.hashListeningEnabled||!a.mobile.path.isHashValid(location.hash)||!a(e).is(':jqmData(role="page")')&&!a.mobile.path.isPath(d)&&d!==a.mobile.dialogHashKey?(a.mobile.path.isHashValid(location.hash)&&(a.mobile.urlHistory.initialDst=d.replace("#","")),a.mobile.changePage(a.mobile.firstPage,{transition:"none",reverse:!0,changeHash:!1,fromHashChange:!0})):g.trigger("hashchange",[!0])}}),a.mobile.navreadyDeferred.resolve(),a(function(){b.scrollTo(0,1),a.mobile.defaultHomeScroll=!a.support.scrollTop||a(b).scrollTop()===1?0:1,a.fn.controlgroup&&a(c).bind("pagecreate create",function(b){a(":jqmData(role='controlgroup')",b.target).jqmEnhanceable().controlgroup({excludeInvisible:!1})}),a.mobile.autoInitializePage&&a.mobile.initializePage(),g.load(a.mobile.silentScroll),a.support.cssPointerEvents||a(c).delegate(".ui-disabled","vclick",function(a){a.preventDefault(),a.stopImmediatePropagation()})})}(a,this)});
\ No newline at end of file
--- /dev/null
+{
+ "version": "0.0.1",
+ "name": "tct-behavior-tests",
+ "permissions": ["tabs", "unlimited_storage", "notifications", "http://*/*", "https://*/*"],
+ "description": "tct-behavior-tests",
+ "file_name": "manifest.json",
+ "app": {
+ "launch": {
+ "local_path": "index.html"
+ }
+ },
+ "icons": {
+ "128": "icon.png"
+ }
+}
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Hao, Yunfei <yunfeix.hao@intel.com>
+
+*/
+
+#test-blue {
+ background-color: blue;
+ height: 100px;
+ width: 100px;
+}
--- /dev/null
+pre.prettyprint{padding:5px;font-family:Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,serif;margin-bottom:10px;background-color:#eee;overflow:auto;width:auto;width:650px !ie7;padding-bottom:20px !ie7;max-height:600px;}pre.prettyprint{max-height:none\9;}code.prettyprint{font-family:Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,serif;background-color:#eee;}p code.prettyprint{padding:1px 5px 1px 5px;}.str{color:maroon;}.kwd{color:#00008b;}.com{color:gray;}.typ{color:#2b91af;}.lit{color:maroon;}.pun{color:#000;}.pln{color:#000;}.tag{color:maroon;}.atn{color:red;}.atv{color:blue;}.dec{color:purple;}@media print{.str{color:#060;}.kwd{color:#006;font-weight:bold;}.com{color:#600;font-style:italic;}.typ{color:#404;font-weight:bold;}.lit{color:#044;}.pun{color:#440;}.pln{color:#000;}.tag{color:#006;font-weight:bold;}.atn{color:#404;}.atv{color:#060;}}
\ No newline at end of file
--- /dev/null
+Copyright (c) 2013 Intel Corporation.
+Except as noted, this software is licensed under BSD-3-Clause License.
+Please, see the LICENSE.BSD-3 file for the BSD-3-Clause License.
+
+Following resources are licensed under its own license.
+
+tests.css:
+This above file is under Intel GPL 2.0 License.
+From https://github.com/testkit/testkit-lite
+Please see LICENSE.GPL for the GPL terms and conditions.
--- /dev/null
+@charset "UTF-8";\r
+/* CSS Document */\r
+#testcasepage div,\r
+#testcasepage h1,\r
+#testcasepage p,\r
+#testcasepage table,\r
+#testcasepage tr,\r
+#testcasepage th,\r
+#testcasepage td {\r
+ margin: 0;\r
+ padding: 0;\r
+ border: 0;\r
+ font-weight: inherit;\r
+ font-style: inherit;\r
+ font-size: 0.96em;\r
+ font-family: arial;\r
+ vertical-align: baseline;\r
+}\r
+\r
+#testcasepage p {\r
+ text-align: left;\r
+}\r
+\r
+#suite_title {\r
+ text-align: left;\r
+}\r
+\r
+#btc {\r
+ text-align: right;\r
+}\r
+\r
+#testcasepage table {\r
+ border-collapse: separate;\r
+ border-spacing: 0;\r
+ margin-bottom: 1.4em;\r
+ vertical-align: middle;\r
+}\r
+\r
+#testcasepage th,\r
+#testcasepage td {\r
+ text-align: left;\r
+ font-weight: normal;\r
+ padding: 4px 10px 4px 5px;\r
+ vertical-align: middle;\r
+}\r
+\r
+#cases table {\r
+ width: 101%;\r
+}\r
+\r
+#fail_cases table {\r
+ width: 101%;\r
+}\r
+\r
+#title table {\r
+ width: 101%;\r
+}\r
+\r
+#device table {\r
+ width: 50%;\r
+}\r
+\r
+#summary table {\r
+ width: 50%;\r
+}\r
+\r
+#testcasepage th {\r
+ border-bottom: 1px solid #000;\r
+ background-color: #AAAAAA;\r
+ border-left: 1px solid #000;\r
+ border-top: 1px solid #000;\r
+ color: #000;\r
+ font-weight: bold;\r
+ vertical-align: bottom;\r
+}\r
+\r
+#testcasepage th:last-child,\r
+#testcasepage td:last-child {\r
+ border-right: 1px solid #000;\r
+}\r
+\r
+#testcasepage td {\r
+ border-left: 1px solid;\r
+ font-weight: normal;\r
+ border-bottom: 1px solid;\r
+}\r
+\r
+#testcasepage td.yellow_rate {\r
+ background-color: #ffcc00;\r
+}\r
+\r
+#testcasepage td.green_rate {\r
+ background-color: #33cc33;\r
+}\r
+\r
+#testcasepage td.dgreen_rate {\r
+ background-color: #339933;\r
+}\r
+\r
+#testcasepage td.red_rate {\r
+ background-color: #FF3333;\r
+}\r
+\r
+#title table,\r
+#title tr,\r
+#title td {\r
+ border-left: none;\r
+ border-bottom: none;\r
+ text-align: center;\r
+}\r
+\r
+#title td:last-child {\r
+ border-right: none;\r
+}\r
+\r
+#testcasepage h1 {\r
+ font-size: 2em;\r
+ font-family: Arial, sans-serif;\r
+ font-weight: bold;\r
+ line-height: 1;\r
+ color: #000;\r
+ margin-bottom: 0.75em;\r
+ padding-top: 0.25em;\r
+ font-weight: bold;\r
+}\r
+\r
+#goTopBtn {\r
+ right: 0px;\r
+ bottom: 0px;\r
+ position: fixed; +position: absolute;\r
+ top: expression(parseInt(document.body.scrollTop) + document.body.clientHeight - 40);\r
+}\r
--- /dev/null
+Copyright (c) 2013 Intel Corporation.
+Except as noted, this software is licensed under BSD-3-Clause License.
+Please, see the LICENSE.BSD-3 file for the BSD-3-Clause License.
+
+Following resources are licensed under its own license.
+
+canvas-index.css,
+a-green.css:
+The above files are licensed under the W3C Dual License.
+From https://github.com/w3c/web-platform-tests, https://github.com/w3c/csswg-test
+Please see http://www.w3.org/Consortium/Legal/2008/04-testsuite-copyright.html
--- /dev/null
+.a { color: green; }
\ No newline at end of file
--- /dev/null
+body {
+ font-size: small;
+ font-family: sans-serif;
+}
+
+a {
+ text-decoration: none;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+h3 {
+ display: inline;
+ font-size: medium;
+}
+
+h3 + p {
+ display: inline;
+ margin-left: 0.5em;
+}
+
+li {
+ list-style-type: none;
+}
+
+ul {
+ padding-left: 2em;
+ margin-left: 0;
+}
\ No newline at end of file
--- /dev/null
+Copyright (c) 2013 Intel Corporation.
+Except as noted, this software is licensed under BSD-3-Clause License.
+Please, see the LICENSE.BSD-3 file for the BSD-3-Clause License.
+
+Following resources are licensed under its own license.
+
+CanvasTest.ttf,
+csstest-basic-bold.ttf:
+The above files are licensed under the W3C Dual License.
+From https://github.com/w3c/web-platform-tests, https://github.com/w3c/csswg-test
+Please see http://www.w3.org/Consortium/Legal/2008/04-testsuite-copyright.html
--- /dev/null
+Copyright (c) 2013 Intel Corporation.
+Except as noted, this software is licensed under BSD-3-Clause License.
+Please, see the LICENSE.BSD-3 file for the BSD-3-Clause License.
+
+Following resources are licensed under its own license.
+
+Ahem.woff:
+The above file is under BSD Two Clause License:
+From http://svn.webkit.org/repository/webkit/trunk/LayoutTests/resources/
+Please see http://trac.webkit.org/browser/trunk/Source/WebKit/LICENSE
--- /dev/null
+Copyright (c) 2013 Intel Corporation.
+Except as noted, this software is licensed under BSD-3-Clause License.
+Please, see the COPYING file in the test suite for the BSD-3-Clause License.
+
+Following resources are licensed under its own license.
+
+blue-100x100.png,
+green-100x100.png,
+red-100x100.png:
+The above files are licensed under Intel BSD-3-Clause License.
+Created by the Paint application.
--- /dev/null
+Copyright (c) 2013 Intel Corporation.
+Except as noted, this software is licensed under BSD-3-Clause License.
+Please, see the COPYING file in the test suite for the BSD-3-Clause License.
+
+Following resources are licensed under its own license.
+
+PNG_512x512_318Kb_BBB.png:
+The above file is licensed under MeeGo LGPL v2.1 License.
+From http://testdata.meego.com
+Please see the LICENSE.LGPL for LGPL terms and conditions.
--- /dev/null
+Copyright (c) 2013 Intel Corporation.
+Except as noted, this software is licensed under BSD-3-Clause License.
+Please, see the LICENSE.BSD-3 file for the BSD-3-Clause License.
+
+Following resources are licensed under its own license.
+
+back_top.png:
+This above file is under Intel GPL 2.0 License.
+From https://github.com/testkit/testkit-lite
+Please see LICENSE.GPL for the GPL terms and conditions.
--- /dev/null
+Copyright (c) 2013 Intel Corporation.
+Except as noted, this software is licensed under BSD-3-Clause License.
+Please, see the LICENSE.BSD-3 file for the BSD-3-Clause License.
+
+Following resources are licensed under its own license.
+
+1x1-white.png:
+The file is licensed under the W3C Dual License.
+From https://github.com/w3c/csswg-test/
+Please see http://www.w3.org/Consortium/Legal/2008/04-testsuite-copyright.html.
--- /dev/null
+Copyright (c) 2013 Intel Corporation.
+Except as noted, this software is licensed under BSD-3-Clause License.
+Please, see the LICENSE.BSD-3 file for the BSD-3-Clause License.
+
+Following resources are licensed under its own license.
+
+The ring.png:
+The above file is licensed under WebKit BSD-2-Clause License.
+From http://svn.webkit.org/repository/webkit/trunk/LayoutTests/fast/backgrounds/resources/
+Please see the LICENSE.BSD-2 file for the BSD-2-Clause License.
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Zhang, Zhiqiang <zhiqiang.zhang@intel.com>
+
+*/
+
+var X = 10;
+var Y = eval(X + 17);
--- /dev/null
+#!/usr/bin/env python
+#
+# Copyright (c) 2014 Intel Corporation.
+#
+# Redistribution and use in source and binary forms, with or without modification,
+# are permitted provided that the following conditions are met:
+#
+# * Redistributions of works must retain the original copyright notice, this list
+# of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the original copyright notice,
+# this list of conditions and the following disclaimer in the documentation
+# and/or other materials provided with the distribution.
+# * Neither the name of Intel Corporation nor the names of its contributors
+# may be used to endorse or promote products derived from this work without
+# specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# Authors:
+# Hao, Yunfei <yunfeix.hao@intel.com>
+
+import time
+import os
+print 'Content-Type: text/html\n\n'
+while True:
+ i = raw_input()
+ if i is None:
+ break
+ if str(i).strip()=='':
+ break
+ n = 1
+ if os.path.isfile('/tmp/csp-report.log'):
+ file_object_num = open('/tmp/csp-report.log','r')
+ for line in file_object_num:
+ if str(line).find("Time:") >= 0:
+ n = n+1
+ file_object_num.close( )
+ file_object = open('/tmp/csp-report.log', 'a')
+ file_object.write('\n %d Time:' %n)
+ file_object.write( time.strftime(' %Y-%m-%d %H:%M:%S',time.localtime(time.time())))
+ file_object.write('\n')
+ file_object.write(' Data:')
+ file_object.write(i)
+ file_object.write('\n')
+ file_object.close( )
+ print i
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Zhang, Zhiqiang <zhiqiang.zhang@intel.com>
+
+*/
+var q = null;
+function getVideoURI (){
+
+}
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Zhang, Zhiqiang <zhiqiang.zhang@intel.com>
+
+*/
+function getVideoURI (){
+
+}
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Zhang, Zhiqiang <zhiqiang.zhang@intel.com>
+
+*/
+var q = null;
--- /dev/null
+Copyright (c) 2013 Intel Corporation.
+Except as noted, this software is licensed under BSD-3-Clause License.
+Please, see the LICENSE.BSD-3 file for the BSD-3-Clause License.
+
+Following resources are licensed under its own license.
+
+application.js:
+This above file is under Intel GPL 2.0 License.
+From https://github.com/testkit/testkit-lite
+Please see LICENSE.GPL for the GPL terms and conditions.
--- /dev/null
+function getScrollTop() {
+ return f_scrollTop();
+}
+
+function f_scrollTop() {
+ return f_filterResults (
+ $(window) ? $(window).scrollTop() : 0,
+ document.documentElement ? document.documentElement.scrollTop : 0,
+ document.body ? document.body.scrollTop : 0
+ );
+}
+
+function f_filterResults(n_win, n_docel, n_body) {
+ var n_result = n_win ? n_win : 0;
+ if (n_docel && (!n_result || (n_result > n_docel)))
+ n_result = n_docel;
+ return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
+}
+
+function setScrollTop() {
+ $(window) ? $(window).scrollTop(0): 0;
+ document.documentElement ? document.documentElement.scrollTop = 0 :0;
+ document.body ? document.body.scrollTop = 0 : 0;
+}
+
+function goTopEx() {
+ $node = $('#goTopBtn');
+
+ if (getScrollTop() > 0) {
+ $node.show();
+ } else {
+ $node.hide();
+ }
+
+ $(window).scroll(function () {
+ if (getScrollTop() > 0) {
+ $node.show();
+ } else {
+ $node.hide();
+ }
+ });
+
+ $node.click(function () {
+ setScrollTop();
+ });
+}
+
--- /dev/null
+Copyright (c) 2013 Intel Corporation.
+Except as noted, this software is licensed under BSD-3-Clause License.
+Please, see the COPYING file in the test suite for the BSD-3-Clause License.
+
+Following resources are licensed under its own license.
+
+red-green.theora.ogv:
+The above files are licensed under the MIT License.
+From https://github.com/KhronosGroup/WebGL/blob/master/conformance-suites/1.0.2/conformance/resources/red-green.theora.ogv
+Please see LICENSE.MIT for the MIT terms and conditions.
--- /dev/null
+Copyright (c) 2013 Intel Corporation.
+Except as noted, this software is licensed under BSD-3-Clause License.
+Please, see the COPYING file in the test suite for the BSD-3-Clause License.
+
+Following resources are licensed under its own license.
+
+3GP_h263_CIF_30FPS_507Kbps_HE-AAC_Stereo_64Kbps_60sec(4.1Mb)_BBB.3gp(Renamed from 3GP_h263_CIF_30FPS_507Kbps_eAAC+_Stereo_64Kbps_60sec(4.1Mb)_BBB.3gp),
+MP4_h264_CIF_15FPS_387Kbps_MP3_44.1KHz_64Kbps_60sec(3.4Mb)_BBB(hinted).mp4,
+MP4_MPEG4_CIF_15FPS_387Kbps_MP3_44.1KHz_64Kbps_60sec(3Mb)_BBB(hinted).mp4:
+The above file is licensed under MeeGo LGPL v2.1 License.
+From http://testdata.meego.com
+Please see the LICENSE.LGPL for LGPL terms and conditions.
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="./testresult.xsl"?>
+<test_definition>
+<suite name="tct-behavior-tests">
+ <set name="CSP">
+ <testcase id="csp-none" result="N/A"></testcase>
+ <testcase id="csp-self" result="N/A"></testcase>
+ <testcase id="default-src_none" result="N/A"></testcase>
+ <testcase id="default-src_asterisk" result="N/A"></testcase>
+ <testcase id="sandbox-empty-ext" result="N/A"></testcase>
+ <testcase id="sandbox-empty-int" result="N/A"></testcase>
+ <testcase id="sandbox-empty-inline" result="N/A"></testcase>
+ <testcase id="sandbox-same-origin-allow-scripts" result="N/A"></testcase>
+ <testcase id="script-src_none" result="N/A"></testcase>
+ <testcase id="style-src_self" result="N/A"></testcase>
+ </set>
+ <set name="PackageManagement">
+ <testcase id="Sample-widget1" result="N/A"></testcase>
+ <testcase id="Sample-widget2" result="N/A"></testcase>
+ <testcase id="Sample-widget3" result="N/A"></testcase>
+ <testcase id="Sample-widget4" result="N/A"></testcase>
+ <testcase id="widget-version-1" result="N/A"></testcase>
+ <testcase id="npruntime-all-on-arm" result="N/A"></testcase>
+ <testcase id="npruntime-arm-on-x86" result="N/A"></testcase>
+ </set>
+ <set name="ConfigurationExtension">
+ <testcase id="application-content" result="N/A"></testcase>
+ <testcase id="setting-ar-true" result="N/A"></testcase>
+ <testcase id="setting-bs-disable" result="N/A"></testcase>
+ <testcase id="setting-cm-disable" result="N/A"></testcase>
+ <testcase id="setting-cm-enable" result="N/A"></testcase>
+ <testcase id="setting-encrypt-disable" result="N/A"></testcase>
+ <testcase id="setting-encrypt-enable" result="N/A"></testcase>
+ <testcase id="setting-hwkey-default" result="N/A"></testcase>
+ <testcase id="setting-hwkey-disable" result="N/A"></testcase>
+ <testcase id="setting-hwkey-enable" result="N/A"></testcase>
+ <testcase id="setting-install-location-internal-only-with-card" result="N/A"></testcase>
+ <testcase id="setting-install-location-prefer-external-no-card" result="N/A"></testcase>
+ <testcase id="setting-install-location-prefer-external-with-card" result="N/A"></testcase>
+ <testcase id="application-content-crosswalksite" result="N/A"></testcase>
+ </set>
+ <set name="Stability">
+ <testcase id="test-half-memory" result="N/A"></testcase>
+ <testcase id="test-hd-image" result="N/A"></testcase>
+ </set>
+ <set name="WRTSupport">
+ <testcase id="other-localization" result="N/A"></testcase>
+ <testcase id="lifecycle-unload-event" result="N/A"></testcase>
+ <testcase id="other-widget-access-policy" result="N/A"></testcase>
+ <testcase id="other-uri-schemes" result="N/A"></testcase>
+ <testcase id="other-uri-schemes-mailto" result="N/A"></testcase>
+ <testcase id="url-access-multi" result="N/A"></testcase>
+ <testcase id="url-access-multi-all" result="N/A"></testcase>
+ <testcase id="url-access-multi-subdomains" result="N/A"></testcase>
+ <testcase id="security-policy" result="N/A"></testcase>
+ <testcase id="protection-encryption-check" result="N/A"></testcase>
+ </set>
+ <set name="WRTUI">
+ <testcase id="multiple-browsing-context" result="N/A"></testcase>
+ <testcase id="view-mode-fullscreen-rotation" result="N/A"></testcase>
+ <testcase id="view-mode-maximized-rotation" result="N/A"></testcase>
+ </set>
+ <set name="Gesture">
+ <testcase id="Crosswalk_WebApp_Pinch_Zoom_Map" result="N/A"></testcase>
+ <testcase id="Crosswalk_WebApp_Pinch_Zoom_Pic" result="N/A"></testcase>
+ <testcase id="Crosswalk_WebApp_Pinch_Zoom_Text" result="N/A"></testcase>
+ <testcase id="Crosswalk_WebApp_Touch_Gesture_Click" result="N/A"></testcase>
+ <testcase id="Crosswalk_WebApp_Touch_Gesture_Scroll" result="N/A"></testcase>
+ <testcase id="Crosswalk_WebApp_Touch_Gesture_Swipe" result="N/A"></testcase>
+ </set>
+ <set name="ScrollIndicator">
+ <testcase id="Crosswalk_WebApp_ScrollIndicators_Default" result="N/A"></testcase>
+ <testcase id="Crosswalk_WebApp_ScrollIndicators_LargeSize" result="N/A"></testcase>
+ <testcase id="Crosswalk_WebApp_ScrollIndicators_Map" result="N/A"></testcase>
+ <testcase id="Crosswalk_WebApp_ScrollIndicators_Operate" result="N/A"></testcase>
+ <testcase id="Crosswalk_WebApp_ScrollIndicators_Pic" result="N/A"></testcase>
+ </set>
+ <set name="VideoPlay">
+ <testcase id="Crosswalk_VideoFormat_MP4" result="N/A"></testcase>
+ <testcase id="Crosswalk_VideoFormat_OGV" result="N/A"></testcase>
+ <testcase id="Crosswalk_VideoFormat_WebM" result="N/A"></testcase>
+ <testcase id="Crosswalk_WebApp_Video_FullScreen" result="N/A"></testcase>
+ <testcase id="Crosswalk_WebApp_Video_HWAccelerate" result="N/A"></testcase>
+ </set>
+ <set name="Integration">
+ <testcase id="Crosswalk_WebApp_Integration_NoCursors" result="N/A"></testcase>
+ <testcase id="Crosswalk_System_Interruption" result="N/A"></testcase>
+ <testcase id="Crosswalk_System_Proxy" result="N/A"></testcase>
+ </set>
+ <set name="VKB">
+ <testcase id="Crosswalk_VKB_Basic" result="N/A"></testcase>
+ <testcase id="Crosswalk_VKB_ContentSwitch" result="N/A"></testcase>
+ </set>
+</suite>
+</test_definition>
--- /dev/null
+{
+ "pkg-blacklist": [
+ "config.xml",
+ "pack.py",
+ "testcase.xsl",
+ "testresult.xsl",
+ "tests.css",
+ "icon.png",
+ "manifest.json",
+ "suite.json",
+ "inst.*"
+ ],
+ "pkg-list": {
+ "apk,cordova": {
+ "blacklist": [
+ "*"
+ ],
+ "copylist": {
+ "LICENSE": "LICENSE",
+ "inst.apk.py": "inst.py",
+ "js/thirdparty/jquery.js": "res/js/jquery.js",
+ "res/css": "res/css",
+ "res/font": "res/font",
+ "res/images": "res/images",
+ "res/js": "res/js",
+ "res/media/khronos/red-green.theora.ogv": "res/media/red-green.theora.ogv",
+ "testresult.xsl": "res/css/testresult.xsl",
+ "tests.android.xml": "tests.xml"
+ },
+ "subapp-list": {
+ ".": {
+ "app-name": "tct-behavior-tests",
+ "blacklist": [
+ "manifest.json"
+ ],
+ "copylist": {
+ "tests.android.xml": "tests.xml"
+ },
+ "install-path": "."
+ }
+ }
+ },
+ "wgt": {
+ "blacklist": [
+ "*"
+ ],
+ "copylist": {
+ "LICENSE": "LICENSE",
+ "inst.wgt.py": "inst.py",
+ "js/thirdparty/jquery.js": "res/js/jquery.js",
+ "res/css": "res/css",
+ "res/font": "res/font",
+ "res/images": "res/images",
+ "res/js": "res/js",
+ "res/media/khronos/red-green.theora.ogv": "res/media/red-green.theora.ogv",
+ "testresult.xsl": "res/css/testresult.xsl",
+ "tests.tizen.xml": "tests.xml"
+ },
+ "sign-flag": "true",
+ "subapp-list": {
+ ".": {
+ "app-name": "tct-behavior-tests",
+ "copylist": {
+ "tests.tizen.xml": "tests.xml"
+ },
+ "install-path": ".",
+ "sign-flag": "true"
+ },
+ "tests/Viewport/ViewportTest": {
+ "app-name": "ViewportTest",
+ "blacklist": [],
+ "install-path": "apps",
+ "sign-flag": "true"
+ }
+ }
+ },
+ "xpk": {
+ "blacklist": [
+ "*"
+ ],
+ "copylist": {
+ "LICENSE": "LICENSE",
+ "inst.xpk.py": "inst.py",
+ "js/thirdparty/jquery.js": "res/js/jquery.js",
+ "res/css": "res/css",
+ "res/font": "res/font",
+ "res/images": "res/images",
+ "res/js": "res/js",
+ "res/media/khronos/red-green.theora.ogv": "res/media/red-green.theora.ogv",
+ "testresult.xsl": "res/css/testresult.xsl",
+ "tests.tizen.xml": "tests.xml"
+ },
+ "subapp-list": {
+ ".": {
+ "app-name": "tct-behavior-tests",
+ "blacklist": [],
+ "copylist": {
+ "tests.tizen.xml": "tests.xml"
+ },
+ "install-path": "."
+ },
+ "tests/Viewport/ViewportTest": {
+ "app-name": "ViewportTest",
+ "blacklist": [],
+ "install-path": "apps",
+ "sign-flag": "true"
+ }
+ }
+ }
+ },
+ "pkg-name": "tct-behavior-tests"
+}
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+ <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
+ <xsl:template match="/">
+ <html>
+ <STYLE type="text/css">
+ @import "tests.css";
+ </STYLE>
+ <head>
+ <script type="text/javascript" src="jquery.min.js"/>
+ </head>
+ <body>
+ <div id="testcasepage">
+ <div id="title">
+ <table>
+ <tr>
+ <td>
+ <h1>Test Cases</h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div id="suites">
+ <a name="contents"/>
+ <table>
+ <tr>
+ <th>Test Suite</th>
+ <th>Total</th>
+ <th>Auto</th>
+ <th>Manual</th>
+ </tr>
+ <tr>
+ <td>
+ Total
+ </td>
+ <td>
+ <xsl:value-of select="count(test_definition/suite/set//testcase)"/>
+ </td>
+ <td>
+ <xsl:value-of select="count(test_definition/suite/set//testcase[@execution_type = 'auto'])"/>
+ </td>
+ <td>
+ <xsl:value-of select="count(test_definition/suite/set//testcase[@execution_type != 'auto'])"/>
+ </td>
+ </tr>
+ <xsl:for-each select="test_definition/suite">
+ <tr>
+ <td>
+ <a>
+ <xsl:attribute name="href">
+ #<xsl:value-of select="@name"/>
+ </xsl:attribute>
+ <xsl:value-of select="@name"/>
+ </a>
+ </td>
+ <td>
+ <xsl:value-of select="count(set//testcase)"/>
+ </td>
+ <td>
+ <xsl:value-of select="count(set/testcase[@execution_type = 'auto'])"/>
+ </td>
+ <td>
+ <xsl:value-of select="count(set/testcase[@execution_type != 'auto'])"/>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </table>
+ </div>
+ <div id="title">
+ <table>
+ <tr>
+ <td class="title">
+ <h1>Detailed Test Cases</h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div id="cases">
+ <xsl:for-each select="test_definition/suite">
+ <xsl:sort select="@name"/>
+ <div id="btc">
+ <a href="#contents">Back to Contents</a>
+ </div>
+ <div id="suite_title">
+ Test Suite:
+ <xsl:value-of select="@name"/>
+ <a><xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute></a>
+ </div>
+ <table>
+ <tr>
+ <th>Case_ID</th>
+ <th>Purpose</th>
+ <th>Type</th>
+ <th>Component</th>
+ <th>Execution Type</th>
+ <th>Description</th>
+ <th>Specification</th>
+ </tr>
+ <xsl:for-each select=".//set">
+ <xsl:sort select="@name"/>
+ <tr>
+ <td colspan="7">
+ Test Set:
+ <xsl:value-of select="@name"/>
+ </td>
+ </tr>
+ <xsl:for-each select=".//testcase">
+ <!-- xsl:sort select="@id" /> -->
+ <tr>
+ <td>
+ <xsl:value-of select="@id"/>
+ </td>
+ <td>
+ <xsl:value-of select="@purpose"/>
+ </td>
+ <td>
+ <xsl:value-of select="@type"/>
+ </td>
+ <td>
+ <xsl:value-of select="@component"/>
+ </td>
+ <td>
+ <xsl:value-of select="@execution_type"/>
+ </td>
+ <td>
+ <p>
+ Pre_condition:
+ <xsl:value-of select=".//description/pre_condition"/>
+ </p>
+ <p>
+ Post_condition:
+ <xsl:value-of select=".//description/post_condition"/>
+ </p>
+ <p>
+ Test Script Entry:
+ <xsl:value-of select=".//description/test_script_entry"/>
+ </p>
+ <p>
+ Steps:
+ <p/>
+ <xsl:for-each select=".//description/steps/step"><xsl:sort select="@order"/>
+ Step
+ <xsl:value-of select="@order"/>
+ :
+ <xsl:value-of select="./step_desc"/>
+ ;
+ <p/>
+ Expected Result:
+ <xsl:value-of select="./expected"/>
+ <p/>
+ </xsl:for-each>
+ </p>
+ </td>
+ <td>
+ <xsl:for-each select=".//specs/spec"><b>[Spec_Assertion]:</b><br/>
+ [Category]:
+ <xsl:value-of select="./spec_assertion/@category"/>
+ <br/>
+ [Section]:
+ <xsl:value-of select="./spec_assertion/@section"/>
+ <br/>
+ [Specification]:
+ <xsl:value-of select="./spec_assertion/@specification"/>
+ <br/>
+ [Interface]:
+ <xsl:value-of select="./spec_assertion/@interface"/>
+ <br/>
+ <xsl:choose><xsl:when test="./spec_assertion/@element_name">
+ [<xsl:value-of select="./spec_assertion/@element_type"/>]:
+ <xsl:value-of select="./spec_assertion/@element_name"/>
+ <br/>
+ </xsl:when></xsl:choose>
+ [URL]:
+ <xsl:value-of select="./spec_url"/>
+ <br/>
+ [Statement]:
+ <xsl:value-of select="./spec_statement"/>
+ <br/>
+ </xsl:for-each>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </xsl:for-each>
+ </table>
+ </xsl:for-each>
+ </div>
+ </div>
+ <div id="goTopBtn">
+ <img border="0" src="./back_top.png"/>
+ </div>
+ <script type="text/javascript" src="application.js"/>
+ <script language="javascript" type="text/javascript">
+ $(document).ready(function(){
+ goTopEx();
+ });
+ </script>
+ </body>
+ </html>
+ </xsl:template>
+</xsl:stylesheet>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+ <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
+ <xsl:template match="/">
+ <html>
+ <STYLE type="text/css">
+ @import "tests.css";
+ </STYLE>
+ <head>
+ <script type="text/javascript" src="jquery.min.js"/>
+ </head>
+ <body>
+ <div id="testcasepage">
+ <div id="title">
+ <table>
+ <tr>
+ <td>
+ <h1>Test Report</h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div id="device">
+ <table>
+ <tr>
+ <th colspan="2">Device Information</th>
+ </tr>
+ <tr>
+ <td>Device Name</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="test_definition/environment/@device_name">
+ <xsl:if test="test_definition/environment/@device_name = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="test_definition/environment/@device_name"/>
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Device Model</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="test_definition/environment/@device_model">
+ <xsl:if test="test_definition/environment/@device_model = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="test_definition/environment/@device_model"/>
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>OS Version</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="test_definition/environment/@os_version">
+ <xsl:if test="test_definition/environment/@os_version = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="test_definition/environment/@os_version"/>
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Device ID</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="test_definition/environment/@device_id">
+ <xsl:if test="test_definition/environment/@device_id = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="test_definition/environment/@device_id"/>
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Firmware Version</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="test_definition/environment/@firmware_version">
+ <xsl:if test="test_definition/environment/@firmware_version = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="test_definition/environment/@firmware_version"/>
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Build ID</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="test_definition/environment/@build_id">
+ <xsl:if test="test_definition/environment/@build_id = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="test_definition/environment/@build_id"/>
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Screen Size</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="test_definition/environment/@screen_size">
+ <xsl:if test="test_definition/environment/@screen_size = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="test_definition/environment/@screen_size"/>
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Resolution</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="test_definition/environment/@resolution">
+ <xsl:if test="test_definition/environment/@resolution = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="test_definition/environment/@resolution"/>
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Host Info</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="test_definition/environment/@host">
+ <xsl:if test="test_definition/environment/@host = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="test_definition/environment/@host"/>
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>CTS Version</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="test_definition/environment/@cts_version">
+ <xsl:if test="test_definition/environment/@cts_version = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="test_definition/environment/@cts_version"/>
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Others</td>
+ <td>
+ <xsl:if test="test_definition/environment/other = ''">
+ N/A
+ </xsl:if>
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word" select="test_definition/environment/other"/>
+ </xsl:call-template>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div id="summary">
+ <table>
+ <tr>
+ <th colspan="2">Test Summary</th>
+ </tr>
+ <tr>
+ <td>Test Plan Name</td>
+ <td>
+ <xsl:value-of select="test_definition/summary/@test_plan_name"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Tests Total</td>
+ <td>
+ <xsl:value-of select="count(test_definition//suite/set/testcase)"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Test Passed</td>
+ <td>
+ <xsl:value-of select="count(test_definition//suite/set/testcase[@result = 'PASS'])"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Test Failed</td>
+ <td>
+ <xsl:value-of select="count(test_definition//suite/set/testcase[@result = 'FAIL'])"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Test Block</td>
+ <td>
+ <xsl:value-of select="count(test_definition//suite/set/testcase[@result = 'BLOCK'])"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Test Not Run</td>
+ <td>
+ <xsl:value-of select="count(test_definition//suite/set/testcase) - count(test_definition//suite/set/testcase[@result = 'PASS']) - count(test_definition//suite/set/testcase[@result = 'FAIL']) - count(test_definition//suite/set/testcase[@result = 'BLOCK'])"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Start time</td>
+ <td>
+ <xsl:value-of select="test_definition/summary/start_at"/>
+ </td>
+ </tr>
+ <tr>
+ <td>End time</td>
+ <td>
+ <xsl:value-of select="test_definition/summary/end_at"/>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div id="suite_summary">
+ <div id="title">
+ <a name="contents"/>
+ <table>
+ <tr>
+ <td class="title">
+ <h1>Test Summary by Suite</h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <table>
+ <tr>
+ <th>Suite</th>
+ <th>Passed</th>
+ <th>Failed</th>
+ <th>Blocked</th>
+ <th>Not Run</th>
+ <th>Total</th>
+ </tr>
+ <xsl:for-each select="test_definition/suite">
+ <xsl:sort select="@name"/>
+ <tr>
+ <td>
+ <a>
+ <xsl:attribute name="href">
+ #<xsl:value-of select="@name"/>
+ </xsl:attribute>
+ <xsl:value-of select="@name"/>
+ </a>
+ </td>
+ <td>
+ <xsl:value-of select="count(set//testcase[@result = 'PASS'])"/>
+ </td>
+ <td>
+ <xsl:value-of select="count(set//testcase[@result = 'FAIL'])"/>
+ </td>
+ <td>
+ <xsl:value-of select="count(set//testcase[@result = 'BLOCK'])"/>
+ </td>
+ <td>
+ <xsl:value-of select="count(set//testcase) - count(set//testcase[@result = 'PASS']) - count(set//testcase[@result = 'FAIL']) - count(set//testcase[@result = 'BLOCK'])"/>
+ </td>
+ <td>
+ <xsl:value-of select="count(set//testcase)"/>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </table>
+ </div>
+ <div id="fail_cases">
+ <div id="title">
+ <table>
+ <tr>
+ <td class="title">
+ <h1 align="center">
+ Test Failures (
+ <xsl:value-of select="count(test_definition/suite/set//testcase[@result = 'FAIL'])"/>
+ )
+ </h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <xsl:for-each select="test_definition/suite">
+ <xsl:sort select="@name"/>
+ <div id="btc">
+ <a href="#contents">Back to Contents</a>
+ </div>
+ <div id="suite_title">
+ Test Suite:
+ <xsl:value-of select="@name"/>
+ <a><xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute></a>
+ </div>
+ <table>
+ <tr>
+ <th>Case_ID</th>
+ <th>Purpose</th>
+ <th>Result</th>
+ <th>Stdout</th>
+ </tr>
+ <xsl:for-each select=".//set">
+ <xsl:sort select="@name"/>
+ <tr>
+ <td colspan="4">
+ Test Set:
+ <xsl:value-of select="@name"/>
+ </td>
+ </tr>
+ <xsl:for-each select=".//testcase">
+ <xsl:sort select="@id"/>
+ <xsl:choose>
+ <xsl:when test="@result">
+ <xsl:if test="@result = 'FAIL'">
+ <tr>
+ <td>
+ <xsl:value-of select="@id"/>
+ </td>
+ <td>
+ <xsl:value-of select="@purpose"/>
+ </td>
+ <td class="red_rate">
+ <xsl:value-of select="@result"/>
+ </td>
+ <td>
+ <xsl:value-of select=".//result_info/stdout"/>
+ <xsl:if test=".//result_info/stdout = ''">
+ N/A
+ </xsl:if>
+ </td>
+ </tr>
+ </xsl:if>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:for-each>
+ </table>
+ </xsl:for-each>
+ </div>
+ <div id="cases">
+ <div id="title">
+ <table>
+ <tr>
+ <td class="title">
+ <h1 align="center">Detailed Test Results</h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <xsl:for-each select="test_definition/suite">
+ <xsl:sort select="@name"/>
+ <div id="btc">
+ <a href="#contents">Back to Contents</a>
+ </div>
+ <div id="suite_title">
+ Test Suite:
+ <xsl:value-of select="@name"/>
+ <a><xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute></a>
+ </div>
+ <table>
+ <tr>
+ <th>Case_ID</th>
+ <th>Purpose</th>
+ <th>Result</th>
+ <th>Stdout</th>
+ </tr>
+ <xsl:for-each select=".//set">
+ <xsl:sort select="@name"/>
+ <tr>
+ <td colspan="4">
+ Test Set:
+ <xsl:value-of select="@name"/>
+ </td>
+ </tr>
+ <xsl:for-each select=".//testcase">
+ <xsl:sort select="@id"/>
+ <tr>
+ <td>
+ <xsl:value-of select="@id"/>
+ </td>
+ <td>
+ <xsl:value-of select="@purpose"/>
+ </td>
+ <xsl:choose>
+ <xsl:when test="@result">
+ <xsl:if test="@result = 'FAIL'">
+ <td class="red_rate">
+ <xsl:value-of select="@result"/>
+ </td>
+ </xsl:if>
+ <xsl:if test="@result = 'PASS'">
+ <td class="green_rate">
+ <xsl:value-of select="@result"/>
+ </td>
+ </xsl:if>
+ <xsl:if test="@result = 'BLOCK' ">
+ <td>
+ BLOCK
+ </td>
+ </xsl:if>
+ <xsl:if test="@result != 'BLOCK' and @result != 'FAIL' and @result != 'PASS' ">
+ <td>
+ Not Run
+ </td>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <td>
+ </td>
+ </xsl:otherwise>
+ </xsl:choose>
+ <td>
+ <xsl:value-of select=".//result_info/stdout"/>
+ <xsl:if test=".//result_info/stdout = ''">
+ N/A
+ </xsl:if>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </xsl:for-each>
+ </table>
+ </xsl:for-each>
+ </div>
+ </div>
+ <div id="goTopBtn">
+ <img border="0" src="./back_top.png"/>
+ </div>
+ <script type="text/javascript" src="application.js"/>
+ <script language="javascript" type="text/javascript">
+ $(document).ready(function(){
+ goTopEx();
+ });
+ </script>
+ </body>
+ </html>
+ </xsl:template>
+ <xsl:template name="br-replace">
+ <xsl:param name="word"/>
+ <xsl:variable name="cr">
+ <xsl:text>
+ </xsl:text>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="contains($word,$cr)">
+ <xsl:value-of select="substring-before($word,$cr)"/>
+ <br/>
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word" select="substring-after($word,$cr)"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$word"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+</xsl:stylesheet>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="./testcase.xsl"?>
+<test_definition>
+ <suite name="tct-behavior-tests">
+ <set name="Media and Animation">
+ <testcase component="TCT Behavior" execution_type="manual" id="MediaPlayback" purpose="Media Playback Test">
+ </testcase>
+ <testcase component="TCT Behavior" execution_type="manual" id="2D3DAnimation" purpose="2D/3D Animation Test">
+ </testcase>
+ <testcase component="TCT Behavior" execution_type="manual" id="SVGTransformation" purpose="SVG Transformation Test">
+ </testcase>
+ <testcase component="TCT Behavior" execution_type="manual" id="CSSStyle" purpose="CSS Style Test">
+ </testcase>
+ <testcase component="TCT Behavior" execution_type="manual" id="CSSAnimation" purpose="CSS Animation Test">
+ </testcase>
+ <testcase component="TCT Behavior" execution_type="manual" id="Canvas-PicRotaScaleTransfVampix" purpose="Canvas Usage Test">
+ </testcase>
+ <testcase component="TCT Behavior" execution_type="manual" id="CSS-AnimTransfBackgBordFont" purpose="CSS Usage Test">
+ </testcase>
+ <testcase component="TCT Behavior" execution_type="manual" id="WOFF" purpose="WOFF Test">
+ </testcase>
+ </set>
+ <set name="Hardware and Sensor">
+ <testcase component="TCT Behavior" execution_type="manual" id="CameraViaUserMedia" purpose="Camera via UserMedia Test">
+ <capability name="cameraFront"/>
+ </testcase>
+ <testcase component="TCT Behavior" execution_type="manual" id="LocationGPS" purpose="Location GPS Test">
+ <capability name="locationGps"/>
+ </testcase>
+ </set>
+ <set name="Gesture">
+ <testcase component="TCT Behavior" execution_type="manual" id="Touch" purpose="Touch Test">
+ </testcase>
+ <testcase component="TCT Behavior" execution_type="manual" id="PageVisibility" purpose="Page Visibility Test">
+ </testcase>
+ </set>
+ <set name="Content">
+ <testcase component="TCT Behavior" execution_type="manual" id="FileReader" purpose="FileReader Test">
+ </testcase>
+ </set>
+ <set name="System">
+ <testcase component="TCT Behavior" execution_type="manual" id="FullScreen" purpose="Full Screen Test">
+ </testcase>
+ </set>
+ </suite>
+</test_definition>
--- /dev/null
+@charset "UTF-8";\r
+/* CSS Document */\r
+#testcasepage div,\r
+#testcasepage h1,\r
+#testcasepage p,\r
+#testcasepage table,\r
+#testcasepage tr,\r
+#testcasepage th,\r
+#testcasepage td {\r
+ margin: 0;\r
+ padding: 0;\r
+ border: 0;\r
+ font-weight: inherit;\r
+ font-style: inherit;\r
+ font-size: 0.96em;\r
+ font-family: arial;\r
+ vertical-align: baseline;\r
+}\r
+\r
+#testcasepage p {\r
+ text-align: left;\r
+}\r
+\r
+#suite_title {\r
+ text-align: left;\r
+}\r
+\r
+#btc {\r
+ text-align: right;\r
+}\r
+\r
+#testcasepage table {\r
+ border-collapse: separate;\r
+ border-spacing: 0;\r
+ margin-bottom: 1.4em;\r
+ vertical-align: middle;\r
+}\r
+\r
+#testcasepage th,\r
+#testcasepage td {\r
+ text-align: left;\r
+ font-weight: normal;\r
+ padding: 4px 10px 4px 5px;\r
+ vertical-align: middle;\r
+}\r
+\r
+#cases table {\r
+ width: 101%;\r
+}\r
+\r
+#fail_cases table {\r
+ width: 101%;\r
+}\r
+\r
+#title table {\r
+ width: 101%;\r
+}\r
+\r
+#device table {\r
+ width: 50%;\r
+}\r
+\r
+#summary table {\r
+ width: 50%;\r
+}\r
+\r
+#testcasepage th {\r
+ border-bottom: 1px solid #000;\r
+ background-color: #AAAAAA;\r
+ border-left: 1px solid #000;\r
+ border-top: 1px solid #000;\r
+ color: #000;\r
+ font-weight: bold;\r
+ vertical-align: bottom;\r
+}\r
+\r
+#testcasepage th:last-child,\r
+#testcasepage td:last-child {\r
+ border-right: 1px solid #000;\r
+}\r
+\r
+#testcasepage td {\r
+ border-left: 1px solid;\r
+ font-weight: normal;\r
+ border-bottom: 1px solid;\r
+}\r
+\r
+#testcasepage td.yellow_rate {\r
+ background-color: #ffcc00;\r
+}\r
+\r
+#testcasepage td.green_rate {\r
+ background-color: #33cc33;\r
+}\r
+\r
+#testcasepage td.dgreen_rate {\r
+ background-color: #339933;\r
+}\r
+\r
+#testcasepage td.red_rate {\r
+ background-color: #FF3333;\r
+}\r
+\r
+#title table,\r
+#title tr,\r
+#title td {\r
+ border-left: none;\r
+ border-bottom: none;\r
+ text-align: center;\r
+}\r
+\r
+#title td:last-child {\r
+ border-right: none;\r
+}\r
+\r
+#testcasepage h1 {\r
+ font-size: 2em;\r
+ font-family: Arial, sans-serif;\r
+ font-weight: bold;\r
+ line-height: 1;\r
+ color: #000;\r
+ margin-bottom: 0.75em;\r
+ padding-top: 0.25em;\r
+ font-weight: bold;\r
+}\r
+\r
+#goTopBtn {\r
+ right: 0px;\r
+ bottom: 0px;\r
+ position: fixed; +position: absolute;\r
+ top: expression(parseInt(document.body.scrollTop) + document.body.clientHeight - 40);\r
+}\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="testcase.xsl"?>
+<test_definition>
+ <suite name="tct-behavior-tests">
+ <set name="Media and Animation">
+ <testcase purpose="Media Playback Test" type="functional_positive" status="approved" component="TCT Behavior" execution_type="manual" platform="all" priority="P0" id="MediaPlayback">
+ </testcase>
+ <testcase purpose="2D/3D Animation Test" type="functional_positive" status="approved" component="TCT Behavior" execution_type="manual" platform="all" priority="P0" id="2D3DAnimation">
+ </testcase>
+ <testcase purpose="SVG Transformation Test" type="functional_positive" status="approved" component="TCT Behavior" execution_type="manual" platform="all" priority="P0" id="SVGTransformation">
+ </testcase>
+ <testcase purpose="CSS Style Test" type="functional_positive" status="approved" component="TCT Behavior" execution_type="manual" platform="all" priority="P0" id="CSSStyle">
+ </testcase>
+ <testcase purpose="CSS Animation Test" type="functional_positive" status="approved" component="TCT Behavior" execution_type="manual" platform="all" priority="P0" id="CSSAnimation">
+ </testcase>
+ <testcase purpose="Canvas Usage Test" type="functional_positive" status="approved" component="TCT Behavior" execution_type="manual" platform="all" priority="P0" id="Canvas-PicRotaScaleTransfVampix">
+ </testcase>
+ <testcase purpose="CSS Usage Test" type="functional_positive" status="approved" component="TCT Behavior" execution_type="manual" platform="all" priority="P0" id="CSS-AnimTransfBackgBordFont">
+ </testcase>
+ <testcase purpose="WOFF Test" type="functional_positive" status="approved" component="TCT Behavior" execution_type="manual" platform="all" priority="P0" id="WOFF">
+ </testcase>
+ </set>
+ <set name="Hardware and Sensor">
+ <testcase purpose="Camera Test" type="functional_positive" status="designed" component="TCT Behavior" execution_type="manual" platform="android" priority="P0" id="Camera">
+ <capability name="camera"/>
+ </testcase>
+ <testcase purpose="Camera via UserMedia Test" type="functional_positive" status="approved" component="TCT Behavior" execution_type="manual" platform="all" priority="P0" id="CameraViaUserMedia">
+ <capability name="cameraFront"/>
+ </testcase>
+ <testcase purpose="Vibration Test" type="functional_positive" status="designed" component="TCT Behavior" execution_type="manual" platform="android" priority="P0" id="Vibration">
+ </testcase>
+ <testcase purpose="Location GPS Test" type="functional_positive" status="approved" component="TCT Behavior" execution_type="manual" platform="android" priority="P0" id="LocationGPS">
+ <capability name="locationGps"/>
+ </testcase>
+ <testcase purpose="Accelerometer Test" type="functional_positive" status="designed" component="TCT Behavior" execution_type="manual" platform="all" priority="P0" id="Accelerometer">
+ <capability name="accelerometer"/>
+ </testcase>
+ <testcase purpose="Gamepad Test" type="functional_positive" status="designed" component="Crosswalk Behavior" execution_type="manual" platform="android" priority="P0" id="Gamepad">
+ <capability name="accelerometer"/>
+ </testcase>
+ </set>
+ <set name="Gesture">
+ <testcase purpose="Touch Test" type="functional_positive" status="approved" component="TCT Behavior" execution_type="manual" platform="all" priority="P0" id="Touch">
+ </testcase>
+ <testcase purpose="Drag and Drop Test" type="functional_positive" status="approved" component="TCT Behavior" execution_type="manual" platform="tizen" priority="P0" id="DragandDrop">
+ </testcase>
+ <testcase purpose="Clipboard Test" type="functional_positive" status="approved" component="TCT Behavior" execution_type="manual" platform="tizen" priority="P0" id="Clipboard">
+ </testcase>
+ <testcase purpose="Viewport Test" type="functional_positive" status="approved" component="TCT Behavior" execution_type="manual" platform="tizen" priority="P0" id="Viewport">
+ </testcase>
+ <testcase purpose="Page Visibility Test" type="functional_positive" status="approved" component="TCT Behavior" execution_type="manual" platform="android" priority="P0" id="PageVisibility">
+ </testcase>
+ </set>
+ <set name="Application">
+ <testcase purpose="Alarm Test" type="functional_positive" status="approved" component="TCT Behavior" execution_type="manual" platform="tizen" priority="P0" id="Alarm">
+ </testcase>
+ <testcase purpose="Application Test" type="functional_positive" status="designed" component="TCT Behavior" execution_type="manual" platform="all" priority="P0" id="Application">
+ </testcase>
+ <testcase purpose="AppControl Extending Test" type="functional_positive" status="designed" component="TCT Behavior" execution_type="manual" platform="all" priority="P0" id="AppControlExtending">
+ </testcase>
+ <testcase purpose="Package Test" type="functional_positive" status="approved" component="TCT Behavior" execution_type="manual" platform="tizen" priority="P0" id="Package">
+ </testcase>
+ <testcase purpose="Hybrid Application Test" type="functional_positive" status="designed" component="TCT Behavior" execution_type="manual" platform="tizen" priority="P0" id="HybridApplication">
+ </testcase>
+ </set>
+ <set name="Communication">
+ <testcase purpose="Bluetooth Test" type="functional_positive" status="approved" component="TCT Behavior" execution_type="manual" platform="tizen" priority="P0" id="Bluetooth">
+ <capability name="bluetooth"/>
+ </testcase>
+ <testcase purpose="Messaging SMS/MMS Test" type="functional_positive" status="designed" component="TCT Behavior" execution_type="manual" platform="tizen" priority="P0" id="MessagingSMSMMS">
+ <capability name="telephony"/>
+ </testcase>
+ <testcase purpose="Messaging Email Test" type="functional_positive" status="designed" component="TCT Behavior" execution_type="manual" platform="tizen" priority="P0" id="MessagingEmail">
+ </testcase>
+ <testcase purpose="NFC Test" type="functional_positive" status="designed" component="TCT Behavior" execution_type="manual" platform="all" priority="P0" id="NFC">
+ <capability name="nfc"/>
+ </testcase>
+ <testcase purpose="Push Test" type="functional_positive" status="designed" component="TCT Behavior" execution_type="manual" platform="all" priority="P0" id="Push">
+ <capability name="push"/>
+ </testcase>
+ <testcase purpose="Telephony Test" type="functional_positive" status="approved" component="TCT Behavior" execution_type="manual" platform="tizen" priority="P0" id="Telephony">
+ </testcase>
+ </set>
+ <set name="Social">
+ <testcase purpose="DataSync Test" type="functional_positive" status="designed" component="TCT Behavior" execution_type="manual" platform="tizen" priority="P0" id="DataSync">
+ </testcase>
+ </set>
+ <set name="Content">
+ <testcase purpose="Download Test" type="functional_positive" status="approved" component="TCT Behavior" execution_type="manual" platform="tizen" priority="P0" id="Download">
+ </testcase>
+ <testcase purpose="FileReader Test" type="functional_positive" status="approved" component="TCT Behavior" execution_type="manual" platform="all" priority="P0" id="FileReader">
+ </testcase>
+ </set>
+ <set name="System">
+ <testcase purpose="Power Test" type="functional_positive" status="designed" component="TCT Behavior" execution_type="manual" platform="tizen" priority="P0" id="Power">
+ </testcase>
+ <testcase purpose="SystemInfo Test" type="functional_positive" status="approved" component="TCT Behavior" execution_type="manual" platform="tizen" priority="P0" id="SystemInfo">
+ </testcase>
+ <testcase purpose="SystemSetting Screen Test" type="functional_positive" status="approved" component="TCT Behavior" execution_type="manual" platform="tizen" priority="P0" id="SystemSettingScreen">
+ </testcase>
+ <testcase purpose="SystemSetting IncomingCall Test" type="functional_positive" status="approved" component="TCT Behavior" execution_type="manual" platform="tizen" priority="P0" id="SystemSettingIncomingCall">
+ </testcase>
+ <testcase purpose="Security Test" type="functional_positive" status="approved" component="TCT Behavior" execution_type="manual" platform="tizen" priority="P0" id="Security">
+ </testcase>
+ <testcase purpose="Notification Test" type="functional_positive" status="approved" component="TCT Behavior" execution_type="manual" platform="tizen" priority="P0" id="Notification">
+ </testcase>
+ <testcase purpose="Full Screen Test" type="functional_positive" status="approved" component="TCT Behavior" execution_type="manual" platform="all" priority="P0" id="FullScreen">
+ </testcase>
+ <testcase purpose="Battery Status Test" type="functional_positive" status="designed" component="Crosswalk Behavior" execution_type="manual" platform="android" priority="P0" id="BatteryStatus">
+ </testcase>
+ </set>
+ <set name="Web Runtime">
+ <testcase purpose="Application Invisible Test" type="functional_positive" status="designed" component="TCT Behavior" execution_type="manual" platform="all" priority="P0" id="ApplicationInvisible">
+ </testcase>
+ <testcase purpose="Dynamic Box Test" type="functional_positive" status="designed" component="TCT Behavior" execution_type="manual" platform="all" priority="P0" id="DynamicBox">
+ <capability name="shellAppWidget"/>
+ </testcase>
+ <testcase purpose="CSP Test" type="functional_positive" status="approved" component="TCT Behavior" execution_type="manual" platform="tizen" priority="P0" id="CSP" subcase="10">
+ </testcase>
+ <testcase purpose="User Interface Test" type="functional_positive" status="approved" component="TCT Behavior" execution_type="manual" platform="tizen" priority="P0" id="WRTUI" subcase="3">
+ </testcase>
+ <testcase purpose="Application Runtime Test" type="functional_positive" status="approved" component="TCT Behavior" execution_type="manual" platform="tizen" priority="P0" id="WRTSupport" subcase="10">
+ </testcase>
+ <testcase purpose="Configuration Extension Test" type="functional_positive" status="approved" component="TCT Behavior" execution_type="manual" platform="tizen" priority="P0" id="ConfigurationExtension" subcase="10">
+ </testcase>
+ <testcase purpose="Package Management Test" type="functional_positive" status="approved" component="TCT Behavior" execution_type="manual" platform="tizen" priority="P0" id="PackageManagement" subcase="4">
+ </testcase>
+ <testcase purpose="User Agent String Test" type="functional_positive" status="designed" component="TCT Behavior" execution_type="manual" platform="all" priority="P0" id="UserAgentString">
+ </testcase>
+ </set>
+ </suite>
+</test_definition>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="./testcase.xsl"?>
+<test_definition>
+ <suite name="tct-behavior-tests">
+ <set name="Media and Animation">
+ <testcase component="TCT Behavior" execution_type="manual" id="MediaPlayback" purpose="Media Playback Test">
+ </testcase>
+ <testcase component="TCT Behavior" execution_type="manual" id="2D3DAnimation" purpose="2D/3D Animation Test">
+ </testcase>
+ <testcase component="TCT Behavior" execution_type="manual" id="SVGTransformation" purpose="SVG Transformation Test">
+ </testcase>
+ <testcase component="TCT Behavior" execution_type="manual" id="CSSStyle" purpose="CSS Style Test">
+ </testcase>
+ <testcase component="TCT Behavior" execution_type="manual" id="CSSAnimation" purpose="CSS Animation Test">
+ </testcase>
+ <testcase component="TCT Behavior" execution_type="manual" id="Canvas-PicRotaScaleTransfVampix" purpose="Canvas Usage Test">
+ </testcase>
+ <testcase component="TCT Behavior" execution_type="manual" id="CSS-AnimTransfBackgBordFont" purpose="CSS Usage Test">
+ </testcase>
+ <testcase component="TCT Behavior" execution_type="manual" id="WOFF" purpose="WOFF Test">
+ </testcase>
+ </set>
+ <set name="Hardware and Sensor">
+ <testcase component="TCT Behavior" execution_type="manual" id="CameraViaUserMedia" purpose="Camera via UserMedia Test">
+ <capability name="cameraFront"/>
+ </testcase>
+ </set>
+ <set name="Gesture">
+ <testcase component="TCT Behavior" execution_type="manual" id="Touch" purpose="Touch Test">
+ </testcase>
+ <testcase component="TCT Behavior" execution_type="manual" id="DragandDrop" purpose="Drag and Drop Test">
+ </testcase>
+ <testcase component="TCT Behavior" execution_type="manual" id="Clipboard" purpose="Clipboard Test">
+ </testcase>
+ <testcase component="TCT Behavior" execution_type="manual" id="Viewport" purpose="Viewport Test">
+ </testcase>
+ </set>
+ <set name="Application">
+ <testcase component="TCT Behavior" execution_type="manual" id="Alarm" purpose="Alarm Test">
+ </testcase>
+ <testcase component="TCT Behavior" execution_type="manual" id="Package" purpose="Package Test">
+ </testcase>
+ </set>
+ <set name="Communication">
+ <testcase component="TCT Behavior" execution_type="manual" id="Bluetooth" purpose="Bluetooth Test">
+ <capability name="bluetooth"/>
+ </testcase>
+ <testcase component="TCT Behavior" execution_type="manual" id="Telephony" purpose="Telephony Test">
+ </testcase>
+ </set>
+ <set name="Content">
+ <testcase component="TCT Behavior" execution_type="manual" id="Download" purpose="Download Test">
+ </testcase>
+ <testcase component="TCT Behavior" execution_type="manual" id="FileReader" purpose="FileReader Test">
+ </testcase>
+ </set>
+ <set name="System">
+ <testcase component="TCT Behavior" execution_type="manual" id="SystemInfo" purpose="SystemInfo Test">
+ </testcase>
+ <testcase component="TCT Behavior" execution_type="manual" id="SystemSettingScreen" purpose="SystemSetting Screen Test">
+ </testcase>
+ <testcase component="TCT Behavior" execution_type="manual" id="SystemSettingIncomingCall" purpose="SystemSetting IncomingCall Test">
+ </testcase>
+ <testcase component="TCT Behavior" execution_type="manual" id="Security" purpose="Security Test">
+ </testcase>
+ <testcase component="TCT Behavior" execution_type="manual" id="Notification" purpose="Notification Test">
+ </testcase>
+ <testcase component="TCT Behavior" execution_type="manual" id="FullScreen" purpose="Full Screen Test">
+ </testcase>
+ </set>
+ <set name="Web Runtime">
+ <testcase component="TCT Behavior" execution_type="manual" id="CSP" purpose="CSP Test" subcase="10">
+ </testcase>
+ <testcase component="TCT Behavior" execution_type="manual" id="WRTUI" purpose="User Interface Test" subcase="3">
+ </testcase>
+ <testcase component="TCT Behavior" execution_type="manual" id="WRTSupport" purpose="Application Runtime Test" subcase="10">
+ </testcase>
+ <testcase component="TCT Behavior" execution_type="manual" id="ConfigurationExtension" purpose="Configuration Extension Test" subcase="10">
+ </testcase>
+ <testcase component="TCT Behavior" execution_type="manual" id="PackageManagement" purpose="Package Management Test" subcase="4">
+ </testcase>
+ </set>
+ </suite>
+</test_definition>
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Lin, Wanming <wanmingx.lin@intel.com>
+
+*/
+.ui-slider .ui-btn-inner {
+ padding: 6px 0 0 0 !important;
+ font-size:.9em;
+}
+div.ui-slider {
+ margin: 0 2% 7px 0px;
+ width: 100%;
+}
+
+#viewArea {
+ width: 100%;
+ border: 1px solid black;
+}
+
+#mainTester {
+ position: relative;
+ width: 330px;
+ height: 300px;
+ margin: 0px auto;
+}
+
+.containing-element {padding-top: 20px;}
+
+.containing-element .ui-slider-switch { width: 100%;}
+
+.containing-element .ui-controlgroup-controls { width: 100%;}
+
+.ui-radio { width: 50%;}
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Lin, Wanming <wanmingx.lin@intel.com>
+
+-->
+<html>
+<head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width">
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../css/main.css" />
+ <link rel="stylesheet" type="text/css" href="css/style.css" />
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/tests.js"></script>
+ <script src="js/SpinningBox.js"></script>
+ <script src="js/main.js"></script>
+ <script src="js/slider.tooltip.js"></script>
+ <script src="js/khronos/webgl-utils.js"></script>
+ <script src="js/khronos/webgl-debug.js"></script>
+ <script src="js/khronos/J3DI.js"></script>
+ <script src="js/khronos/J3DIMath.js"></script>
+ <script id="vshader" type="x-shader/x-vertex">
+ uniform mat4 u_modelViewProjMatrix;
+ uniform mat4 u_normalMatrix;
+ uniform vec3 lightDir;
+
+ attribute vec3 vNormal;
+ attribute vec4 vColor;
+ attribute vec4 vPosition;
+
+ varying float v_Dot;
+ varying vec4 v_Color;
+
+ void main()
+ {
+ gl_Position = u_modelViewProjMatrix * vPosition;
+ v_Color = vColor;
+ vec4 transNormal = u_normalMatrix * vec4(vNormal, 1);
+ v_Dot = max(dot(transNormal.xyz, lightDir), 0.0);
+ }
+ </script>
+ <script id="fshader" type="x-shader/x-fragment">
+ precision mediump float;
+
+ varying float v_Dot;
+ varying vec4 v_Color;
+
+ void main()
+ {
+ gl_FragColor = vec4(v_Color.xyz * v_Dot, v_Color.a);
+ }
+ </script>
+</head>
+<body>
+<div data-role="header">
+ <h1 id="main_page_title"></h1>
+</div>
+<div data-role= "content">
+ <div id="viewArea">
+ <div id="mainTester">
+ <canvas id="canvas" width="330" height="300">
+ Not support the <canvas>> element. Ouch! failed!
+ </canvas>
+ </div>
+ </div>
+ <div class="containing-element">
+ <label for="flip-1">Status</label>
+ <select name="flip-1" id="flip-1" data-role="slider">
+ <option value="paused">Pause</option>
+ <option value="running" selected>Play</option>
+ </select>
+ <fieldset data-role="controlgroup" data-type="horizontal">
+ <legend>Direction</legend>
+ <input type="radio" name="radio-choice-2" id="direction-1" value="right" checked="checked" />
+ <label for="direction-1">To-Right</label>
+ <input type="radio" name="radio-choice-2" id="direction-2" value="left" />
+ <label for="direction-2">To-Left</label>
+ </fieldset>
+ <label for="slider-1">Size</label>
+ <input type="range" name="slider-1" id="slider-1" data-highlight="true" min="1" max="5" value="3" data-show-value="true" class="hideButton">
+ <label for="speed-1">Speed</label>
+ <input type="range" name="speed-1" id="speed-1" data-highlight="true" min="1" max="10" value="5" data-show-value="true" class="hideButton">
+ </div>
+</div>
+<div data-role="footer" data-position="fixed">
+</div>
+<div data-role="popup" id="popup_info">
+ <font class="fontSize">
+ <p>Test Purpose: </p>
+ <p>Verifies the 3D cube is drawn with red, yellow, blue, green and light blue colors, rotate smoothly and correctly. And tests the functionality of play and pause, rotate direction left or right, size of the cube from 1 to 5, rotate speed from 1 to 10 levels.</p>
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Status" slider to play or pause the animation.</li>
+ <li>Click the "Direction" buttons to change the rotation direction.</li>
+ <li>Click the "Size" slider to change the animation size.</li>
+ <li>Click the "Speed" slider to change the rotation speed.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if all the check points work well during rotation.</p>
+ </font>
+</div>
+</body>
+</html>
--- /dev/null
+The SpinningBox.js comes from
+https://github.com/KhronosGroup/WebGL
+with some modifications.
+
++ var incAngle = 0;
++ var currentAngle = 0;
++ var bakAngle = 0;
++ var viewDistance = 18;
++ var requestId;
++ var canvas;
+
+ function reshape(gl)
+ {
+- var canvas = document.getElementById('example');
++ var canvas = document.getElementById('canvas');
+- var windowWidth = window.innerWidth - 20;
+- var windowHeight = window.innerHeight - 40;
+- if (windowWidth == width && windowHeight == height)
+- return;
+
+- width = windowWidth;
+- height = windowHeight;
+- canvas.width = width;
+- canvas.height = height;
+
+- gl.viewport(0, 0, width, height);
++ gl.viewport(0, 0, canvas.width, canvas.height);
+ g.perspectiveMatrix = new J3DIMatrix4();
+- g.perspectiveMatrix.perspective(30, width/height, 1, 10000);
++ g.perspectiveMatrix.perspective(30, canvas.width/canvas.height, 1, 10000);
+- g.perspectiveMatrix.lookat(0, 0, 7, 0, 0, 0, 0, 1, 0);
++ g.perspectiveMatrix.lookat(0, 0, viewDistance, 0, 0, 0, 0, 1, 0);
+
+These tests are copyright by the Khronos Group under MIT License:
+https://www.khronos.org/registry/webgl/sdk/tests/test-guidelines.md
+
+
+The jquery extension code of main.js(line 251~376) comes from
+https://github.com/jquery/jquery-mobile/tree/1.3-stable
+with some modifications.
+
+ this._currentValue = newValue;
++ var ID = this.element[0].id;
++ if (ID == "slider-1") {
++ var value = 7 + 23*(4 - (parseInt(newValue, 10) - 1))/5;
++ setSize(value);
++ if (parseInt(newValue, 10) != 3) {
++ testFlag.size = true;
++ checkEnable();
++ }
++ } else if (ID == "speed-1") {
++ setSpeed(parseInt(newValue, 10));
++ if (parseInt(newValue, 10) != 5) {
++ testFlag.speed = true;
++ checkEnable();
++ }
++ } else if (ID == "flip-1") {
++ if (newValue == "0") {
++ stop();
++ $("input[type='radio']").checkboxradio('disable');
++ $("#slider-1").slider('disable');
++ $("#speed-1").slider('disable');
++ testFlag.status = true;
++ checkEnable();
++ } else if (newValue == "1"){
++ if (!isInit) {
++ reStart();
++ $("input[type='radio']").checkboxradio('enable');
++ $("#slider-1").slider('enable');
++ $("#speed-1").slider('enable');
++ } else {
++ isInit = false;
++ }
++ }
++ }
+
+ if ( o.popupEnabled ) {
+ this._positionPopup();
+- this._popup.html( newValue );
++ this._popup.html( Math.round(newValue) );
+ }
+
+ if ( o.showValue ) {
+- this._handleText.html( newValue );
++ this._handleText.html( Math.round(newValue) );
+ }
+
+jQuery Mobile v@VERSION
+http://jquerymobile.com
+
+Copyright 2010, 2013 jQuery Foundation, Inc. and other contributors
+Released under the MIT license.
+http://jquery.org/license
+
--- /dev/null
+var g = {}; // globals
+
+var incAngle = 0;
+var currentAngle = 0;
+var bakAngle = 0;
+var viewDistance = 18;
+var requestId;
+
+var canvas;
+
+
+function init() {
+ // Initialize
+ var gl = initWebGL(
+ // The id of the Canvas Element
+ "canvas");
+ if (!gl) {
+ return;
+ }
+
+ g.program = simpleSetup(
+ gl,
+ // The ids of the vertex and fragment shaders
+ "vshader", "fshader",
+ // The vertex attribute names used by the shaders.
+ // The order they appear here corresponds to their index
+ // used later.
+ [ "vNormal", "vColor", "vPosition"],
+ // The clear color and depth values
+ [ 0, 0, 0, 1 ], 10000);
+
+ // Set up a uniform variable for the shaders
+ gl.uniform3f(gl.getUniformLocation(g.program, "lightDir"), 0, 0, 1);
+
+ // Create a box. On return 'gl' contains a 'box' property with
+ // the BufferObjects containing the arrays for vertices,
+ // normals, texture coords, and indices.
+ g.box = makeBox(gl);
+
+ // Set up the array of colors for the cube's faces
+ var colors = new Uint8Array(
+ [ 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, // v0-v1-v2-v3 front
+ 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, // v0-v3-v4-v5 right
+ 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, // v0-v5-v6-v1 top
+ 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, // v1-v6-v7-v2 left
+ 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, // v7-v4-v3-v2 bottom
+ 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1 ] // v4-v7-v6-v5 back
+ );
+
+ // Set up the vertex buffer for the colors
+ g.box.colorObject = gl.createBuffer();
+ gl.bindBuffer(gl.ARRAY_BUFFER, g.box.colorObject);
+ gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);
+
+ // Create some matrices to use later and save their locations in the shaders
+ g.mvMatrix = new J3DIMatrix4();
+ g.u_normalMatrixLoc = gl.getUniformLocation(g.program, "u_normalMatrix");
+ g.normalMatrix = new J3DIMatrix4();
+ g.u_modelViewProjMatrixLoc =
+ gl.getUniformLocation(g.program, "u_modelViewProjMatrix");
+ g.mvpMatrix = new J3DIMatrix4();
+
+ // Enable all of the vertex attribute arrays.
+ gl.enableVertexAttribArray(0);
+ gl.enableVertexAttribArray(1);
+ gl.enableVertexAttribArray(2);
+
+ // Set up all the vertex attributes for vertices, normals and colors
+ gl.bindBuffer(gl.ARRAY_BUFFER, g.box.vertexObject);
+ gl.vertexAttribPointer(2, 3, gl.FLOAT, false, 0, 0);
+
+ gl.bindBuffer(gl.ARRAY_BUFFER, g.box.normalObject);
+ gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
+
+ gl.bindBuffer(gl.ARRAY_BUFFER, g.box.colorObject);
+ gl.vertexAttribPointer(1, 4, gl.UNSIGNED_BYTE, false, 0, 0);
+
+ // Bind the index array
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, g.box.indexObject);
+
+ return gl;
+}
+
+//width = -1;
+//height = -1;
+//var requestId;
+
+function reshape(gl) {
+ //var canvas = document.getElementById('example');
+ var canvas = document.getElementById('canvas');
+ //var windowWidth = window.innerWidth - 20;
+ //var windowHeight = window.innerHeight - 40;
+ //if (windowWidth == width && windowHeight == height)
+ // return;
+
+ //width = windowWidth;
+ //height = windowHeight;
+ //canvas.width = width;
+ //canvas.height = height;
+
+ // Set the viewport and projection matrix for the scene
+ //gl.viewport(0, 0, width, height);
+ gl.viewport(0, 0, canvas.width, canvas.height);
+ g.perspectiveMatrix = new J3DIMatrix4();
+ //g.perspectiveMatrix.perspective(30, width/height, 1, 10000);
+ g.perspectiveMatrix.perspective(30, canvas.width/canvas.height, 1, 10000);
+ //g.perspectiveMatrix.lookat(0, 0, 7, 0, 0, 0, 0, 1, 0);
+ g.perspectiveMatrix.lookat(0, 0, viewDistance, 0, 0, 0, 0, 1, 0);
+}
+
+function drawPicture(gl) {
+ // Make sure the canvas is sized correctly.
+ reshape(gl);
+
+ gl.clearColor(1.0, 1.0, 1.0, 1.0);
+ // Clear the canvas
+ gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
+
+ // Make a model/view matrix.
+ g.mvMatrix.makeIdentity();
+ g.mvMatrix.rotate(20, 1, 0, 0);
+ g.mvMatrix.rotate(currentAngle, 0, 1, 0);
+
+ // Construct the normal matrix from the model-view matrix and pass it in
+ g.normalMatrix.load(g.mvMatrix);
+ g.normalMatrix.invert();
+ g.normalMatrix.transpose();
+ g.normalMatrix.setUniform(gl, g.u_normalMatrixLoc, false);
+
+ // Construct the model-view * projection matrix and pass it in
+ g.mvpMatrix.load(g.perspectiveMatrix);
+ g.mvpMatrix.multiply(g.mvMatrix);
+ g.mvpMatrix.setUniform(gl, g.u_modelViewProjMatrixLoc, false);
+
+ // Draw the cube
+ gl.drawElements(gl.TRIANGLES, g.box.numIndices, gl.UNSIGNED_BYTE, 0);
+
+ currentAngle += incAngle;
+ if (currentAngle > 360)
+ currentAngle -= 360;
+}
--- /dev/null
+The files come from https://www.khronos.org/registry/webgl/sdk/demos/webkit/resources/
+
+
+These tests are copyright by the Khronos Group under MIT License:
+https://www.khronos.org/registry/webgl/sdk/tests/test-guidelines.md
+
+Copyright (c) 2012 The Khronos Group Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and/or associated documentation files (the
+"Materials"), to deal in the Materials without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Materials, and to
+permit persons to whom the Materials are furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Materials.
+
+THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
--- /dev/null
+/*
+ * Copyright (C) 2009 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+//
+// initWebGL
+//
+// Initialize the Canvas element with the passed name as a WebGL object and return the
+// WebGLRenderingContext.
+function initWebGL(canvasName, vshader, fshader, attribs, clearColor, clearDepth)
+{
+ var canvas = document.getElementById(canvasName);
+ return gl = WebGLUtils.setupWebGL(canvas);
+}
+
+function log(msg) {
+ if (window.console && window.console.log) {
+ window.console.log(msg);
+ }
+}
+
+// Load shaders with the passed names and create a program with them. Return this program
+// in the 'program' property of the returned context.
+//
+// For each string in the passed attribs array, bind an attrib with that name at that index.
+// Once the attribs are bound, link the program and then use it.
+//
+// Set the clear color to the passed array (4 values) and set the clear depth to the passed value.
+// Enable depth testing and blending with a blend func of (SRC_ALPHA, ONE_MINUS_SRC_ALPHA)
+//
+// A console function is added to the context: console(string). This can be replaced
+// by the caller. By default, it maps to the window.console() function on WebKit and to
+// an empty function on other browsers.
+//
+function simpleSetup(gl, vshader, fshader, attribs, clearColor, clearDepth)
+{
+ // create our shaders
+ var vertexShader = loadShader(gl, vshader);
+ var fragmentShader = loadShader(gl, fshader);
+
+ // Create the program object
+ var program = gl.createProgram();
+
+ // Attach our two shaders to the program
+ gl.attachShader (program, vertexShader);
+ gl.attachShader (program, fragmentShader);
+
+ // Bind attributes
+ for (var i = 0; i < attribs.length; ++i)
+ gl.bindAttribLocation (program, i, attribs[i]);
+
+ // Link the program
+ gl.linkProgram(program);
+
+ // Check the link status
+ var linked = gl.getProgramParameter(program, gl.LINK_STATUS);
+ if (!linked && !gl.isContextLost()) {
+ // something went wrong with the link
+ var error = gl.getProgramInfoLog (program);
+ log("Error in program linking:"+error);
+
+ gl.deleteProgram(program);
+ gl.deleteProgram(fragmentShader);
+ gl.deleteProgram(vertexShader);
+
+ return null;
+ }
+
+ gl.useProgram(program);
+
+ gl.clearColor(clearColor[0], clearColor[1], clearColor[2], clearColor[3]);
+ gl.clearDepth(clearDepth);
+
+ gl.enable(gl.DEPTH_TEST);
+ gl.enable(gl.BLEND);
+ gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
+
+ return program;
+}
+
+//
+// loadShader
+//
+// 'shaderId' is the id of a <script> element containing the shader source string.
+// Load this shader and return the WebGLShader object corresponding to it.
+//
+function loadShader(ctx, shaderId)
+{
+ var shaderScript = document.getElementById(shaderId);
+ if (!shaderScript) {
+ log("*** Error: shader script '"+shaderId+"' not found");
+ return null;
+ }
+
+ if (shaderScript.type == "x-shader/x-vertex")
+ var shaderType = ctx.VERTEX_SHADER;
+ else if (shaderScript.type == "x-shader/x-fragment")
+ var shaderType = ctx.FRAGMENT_SHADER;
+ else {
+ log("*** Error: shader script '"+shaderId+"' of undefined type '"+shaderScript.type+"'");
+ return null;
+ }
+
+ // Create the shader object
+ var shader = ctx.createShader(shaderType);
+
+ // Load the shader source
+ ctx.shaderSource(shader, shaderScript.text);
+
+ // Compile the shader
+ ctx.compileShader(shader);
+
+ // Check the compile status
+ var compiled = ctx.getShaderParameter(shader, ctx.COMPILE_STATUS);
+ if (!compiled && !ctx.isContextLost()) {
+ // Something went wrong during compilation; get the error
+ var error = ctx.getShaderInfoLog(shader);
+ log("*** Error compiling shader '"+shaderId+"':"+error);
+ ctx.deleteShader(shader);
+ return null;
+ }
+
+ return shader;
+}
+
+//
+// makeBox
+//
+// Create a box with vertices, normals and texCoords. Create VBOs for each as well as the index array.
+// Return an object with the following properties:
+//
+// normalObject WebGLBuffer object for normals
+// texCoordObject WebGLBuffer object for texCoords
+// vertexObject WebGLBuffer object for vertices
+// indexObject WebGLBuffer object for indices
+// numIndices The number of indices in the indexObject
+//
+function makeBox(ctx)
+{
+ // box
+ // v6----- v5
+ // /| /|
+ // v1------v0|
+ // | | | |
+ // | |v7---|-|v4
+ // |/ |/
+ // v2------v3
+ //
+ // vertex coords array
+ var vertices = new Float32Array(
+ [ 1, 1, 1, -1, 1, 1, -1,-1, 1, 1,-1, 1, // v0-v1-v2-v3 front
+ 1, 1, 1, 1,-1, 1, 1,-1,-1, 1, 1,-1, // v0-v3-v4-v5 right
+ 1, 1, 1, 1, 1,-1, -1, 1,-1, -1, 1, 1, // v0-v5-v6-v1 top
+ -1, 1, 1, -1, 1,-1, -1,-1,-1, -1,-1, 1, // v1-v6-v7-v2 left
+ -1,-1,-1, 1,-1,-1, 1,-1, 1, -1,-1, 1, // v7-v4-v3-v2 bottom
+ 1,-1,-1, -1,-1,-1, -1, 1,-1, 1, 1,-1 ] // v4-v7-v6-v5 back
+ );
+
+ // normal array
+ var normals = new Float32Array(
+ [ 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, // v0-v1-v2-v3 front
+ 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, // v0-v3-v4-v5 right
+ 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, // v0-v5-v6-v1 top
+ -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, // v1-v6-v7-v2 left
+ 0,-1, 0, 0,-1, 0, 0,-1, 0, 0,-1, 0, // v7-v4-v3-v2 bottom
+ 0, 0,-1, 0, 0,-1, 0, 0,-1, 0, 0,-1 ] // v4-v7-v6-v5 back
+ );
+
+
+ // texCoord array
+ var texCoords = new Float32Array(
+ [ 1, 1, 0, 1, 0, 0, 1, 0, // v0-v1-v2-v3 front
+ 0, 1, 0, 0, 1, 0, 1, 1, // v0-v3-v4-v5 right
+ 1, 0, 1, 1, 0, 1, 0, 0, // v0-v5-v6-v1 top
+ 1, 1, 0, 1, 0, 0, 1, 0, // v1-v6-v7-v2 left
+ 0, 0, 1, 0, 1, 1, 0, 1, // v7-v4-v3-v2 bottom
+ 0, 0, 1, 0, 1, 1, 0, 1 ] // v4-v7-v6-v5 back
+ );
+
+ // index array
+ var indices = new Uint8Array(
+ [ 0, 1, 2, 0, 2, 3, // front
+ 4, 5, 6, 4, 6, 7, // right
+ 8, 9,10, 8,10,11, // top
+ 12,13,14, 12,14,15, // left
+ 16,17,18, 16,18,19, // bottom
+ 20,21,22, 20,22,23 ] // back
+ );
+
+ var retval = { };
+
+ retval.normalObject = ctx.createBuffer();
+ ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.normalObject);
+ ctx.bufferData(ctx.ARRAY_BUFFER, normals, ctx.STATIC_DRAW);
+
+ retval.texCoordObject = ctx.createBuffer();
+ ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.texCoordObject);
+ ctx.bufferData(ctx.ARRAY_BUFFER, texCoords, ctx.STATIC_DRAW);
+
+ retval.vertexObject = ctx.createBuffer();
+ ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.vertexObject);
+ ctx.bufferData(ctx.ARRAY_BUFFER, vertices, ctx.STATIC_DRAW);
+
+ ctx.bindBuffer(ctx.ARRAY_BUFFER, null);
+
+ retval.indexObject = ctx.createBuffer();
+ ctx.bindBuffer(ctx.ELEMENT_ARRAY_BUFFER, retval.indexObject);
+ ctx.bufferData(ctx.ELEMENT_ARRAY_BUFFER, indices, ctx.STATIC_DRAW);
+ ctx.bindBuffer(ctx.ELEMENT_ARRAY_BUFFER, null);
+
+ retval.numIndices = indices.length;
+
+ return retval;
+}
+
+//
+// makeSphere
+//
+// Create a sphere with the passed number of latitude and longitude bands and the passed radius.
+// Sphere has vertices, normals and texCoords. Create VBOs for each as well as the index array.
+// Return an object with the following properties:
+//
+// normalObject WebGLBuffer object for normals
+// texCoordObject WebGLBuffer object for texCoords
+// vertexObject WebGLBuffer object for vertices
+// indexObject WebGLBuffer object for indices
+// numIndices The number of indices in the indexObject
+//
+function makeSphere(ctx, radius, lats, longs)
+{
+ var geometryData = [ ];
+ var normalData = [ ];
+ var texCoordData = [ ];
+ var indexData = [ ];
+
+ for (var latNumber = 0; latNumber <= lats; ++latNumber) {
+ for (var longNumber = 0; longNumber <= longs; ++longNumber) {
+ var theta = latNumber * Math.PI / lats;
+ var phi = longNumber * 2 * Math.PI / longs;
+ var sinTheta = Math.sin(theta);
+ var sinPhi = Math.sin(phi);
+ var cosTheta = Math.cos(theta);
+ var cosPhi = Math.cos(phi);
+
+ var x = cosPhi * sinTheta;
+ var y = cosTheta;
+ var z = sinPhi * sinTheta;
+ var u = 1-(longNumber/longs);
+ var v = latNumber/lats;
+
+ normalData.push(x);
+ normalData.push(y);
+ normalData.push(z);
+ texCoordData.push(u);
+ texCoordData.push(v);
+ geometryData.push(radius * x);
+ geometryData.push(radius * y);
+ geometryData.push(radius * z);
+ }
+ }
+
+ for (var latNumber = 0; latNumber < lats; ++latNumber) {
+ for (var longNumber = 0; longNumber < longs; ++longNumber) {
+ var first = (latNumber * (longs+1)) + longNumber;
+ var second = first + longs + 1;
+ indexData.push(first);
+ indexData.push(second);
+ indexData.push(first+1);
+
+ indexData.push(second);
+ indexData.push(second+1);
+ indexData.push(first+1);
+ }
+ }
+
+ var retval = { };
+
+ retval.normalObject = ctx.createBuffer();
+ ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.normalObject);
+ ctx.bufferData(ctx.ARRAY_BUFFER, new Float32Array(normalData), ctx.STATIC_DRAW);
+
+ retval.texCoordObject = ctx.createBuffer();
+ ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.texCoordObject);
+ ctx.bufferData(ctx.ARRAY_BUFFER, new Float32Array(texCoordData), ctx.STATIC_DRAW);
+
+ retval.vertexObject = ctx.createBuffer();
+ ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.vertexObject);
+ ctx.bufferData(ctx.ARRAY_BUFFER, new Float32Array(geometryData), ctx.STATIC_DRAW);
+
+ retval.numIndices = indexData.length;
+ retval.indexObject = ctx.createBuffer();
+ ctx.bindBuffer(ctx.ELEMENT_ARRAY_BUFFER, retval.indexObject);
+ ctx.bufferData(ctx.ELEMENT_ARRAY_BUFFER, new Uint16Array(indexData), ctx.STREAM_DRAW);
+
+ return retval;
+}
+
+// Array of Objects curently loading
+var g_loadingObjects = [];
+
+// Clears all the Objects currently loading.
+// This is used to handle context lost events.
+function clearLoadingObjects() {
+ for (var ii = 0; ii < g_loadingObjects.length; ++ii) {
+ g_loadingObjects[ii].onreadystatechange = undefined;
+ }
+ g_loadingObjects = [];
+}
+
+//
+// loadObj
+//
+// Load a .obj file from the passed URL. Return an object with a 'loaded' property set to false.
+// When the object load is complete, the 'loaded' property becomes true and the following
+// properties are set:
+//
+// normalObject WebGLBuffer object for normals
+// texCoordObject WebGLBuffer object for texCoords
+// vertexObject WebGLBuffer object for vertices
+// indexObject WebGLBuffer object for indices
+// numIndices The number of indices in the indexObject
+//
+function loadObj(ctx, url)
+{
+ var obj = { loaded : false };
+ obj.ctx = ctx;
+ var req = new XMLHttpRequest();
+ req.obj = obj;
+ g_loadingObjects.push(req);
+ req.onreadystatechange = function () { processLoadObj(req) };
+ req.open("GET", url, true);
+ req.send(null);
+ return obj;
+}
+
+function processLoadObj(req)
+{
+ log("req="+req)
+ // only if req shows "complete"
+ if (req.readyState == 4) {
+ g_loadingObjects.splice(g_loadingObjects.indexOf(req), 1);
+ doLoadObj(req.obj, req.responseText);
+ }
+}
+
+function doLoadObj(obj, text)
+{
+ vertexArray = [ ];
+ normalArray = [ ];
+ textureArray = [ ];
+ indexArray = [ ];
+
+ var vertex = [ ];
+ var normal = [ ];
+ var texture = [ ];
+ var facemap = { };
+ var index = 0;
+
+ // This is a map which associates a range of indices with a name
+ // The name comes from the 'g' tag (of the form "g NAME"). Indices
+ // are part of one group until another 'g' tag is seen. If any indices
+ // come before a 'g' tag, it is given the group name "_unnamed"
+ // 'group' is an object whose property names are the group name and
+ // whose value is a 2 element array with [<first index>, <num indices>]
+ var groups = { };
+ var currentGroup = [-1, 0];
+ groups["_unnamed"] = currentGroup;
+
+ var lines = text.split("\n");
+ for (var lineIndex in lines) {
+ var line = lines[lineIndex].replace(/[ \t]+/g, " ").replace(/\s\s*$/, "");
+
+ // ignore comments
+ if (line[0] == "#")
+ continue;
+
+ var array = line.split(" ");
+ if (array[0] == "g") {
+ // new group
+ currentGroup = [indexArray.length, 0];
+ groups[array[1]] = currentGroup;
+ }
+ else if (array[0] == "v") {
+ // vertex
+ vertex.push(parseFloat(array[1]));
+ vertex.push(parseFloat(array[2]));
+ vertex.push(parseFloat(array[3]));
+ }
+ else if (array[0] == "vt") {
+ // normal
+ texture.push(parseFloat(array[1]));
+ texture.push(parseFloat(array[2]));
+ }
+ else if (array[0] == "vn") {
+ // normal
+ normal.push(parseFloat(array[1]));
+ normal.push(parseFloat(array[2]));
+ normal.push(parseFloat(array[3]));
+ }
+ else if (array[0] == "f") {
+ // face
+ if (array.length != 4) {
+ log("*** Error: face '"+line+"' not handled");
+ continue;
+ }
+
+ for (var i = 1; i < 4; ++i) {
+ if (!(array[i] in facemap)) {
+ // add a new entry to the map and arrays
+ var f = array[i].split("/");
+ var vtx, nor, tex;
+
+ if (f.length == 1) {
+ vtx = parseInt(f[0]) - 1;
+ nor = vtx;
+ tex = vtx;
+ }
+ else if (f.length = 3) {
+ vtx = parseInt(f[0]) - 1;
+ tex = parseInt(f[1]) - 1;
+ nor = parseInt(f[2]) - 1;
+ }
+ else {
+ obj.ctx.console.log("*** Error: did not understand face '"+array[i]+"'");
+ return null;
+ }
+
+ // do the vertices
+ var x = 0;
+ var y = 0;
+ var z = 0;
+ if (vtx * 3 + 2 < vertex.length) {
+ x = vertex[vtx*3];
+ y = vertex[vtx*3+1];
+ z = vertex[vtx*3+2];
+ }
+ vertexArray.push(x);
+ vertexArray.push(y);
+ vertexArray.push(z);
+
+ // do the textures
+ x = 0;
+ y = 0;
+ if (tex * 2 + 1 < texture.length) {
+ x = texture[tex*2];
+ y = texture[tex*2+1];
+ }
+ textureArray.push(x);
+ textureArray.push(y);
+
+ // do the normals
+ x = 0;
+ y = 0;
+ z = 1;
+ if (nor * 3 + 2 < normal.length) {
+ x = normal[nor*3];
+ y = normal[nor*3+1];
+ z = normal[nor*3+2];
+ }
+ normalArray.push(x);
+ normalArray.push(y);
+ normalArray.push(z);
+
+ facemap[array[i]] = index++;
+ }
+
+ indexArray.push(facemap[array[i]]);
+ currentGroup[1]++;
+ }
+ }
+ }
+
+ // set the VBOs
+ obj.normalObject = obj.ctx.createBuffer();
+ obj.ctx.bindBuffer(obj.ctx.ARRAY_BUFFER, obj.normalObject);
+ obj.ctx.bufferData(obj.ctx.ARRAY_BUFFER, new Float32Array(normalArray), obj.ctx.STATIC_DRAW);
+
+ obj.texCoordObject = obj.ctx.createBuffer();
+ obj.ctx.bindBuffer(obj.ctx.ARRAY_BUFFER, obj.texCoordObject);
+ obj.ctx.bufferData(obj.ctx.ARRAY_BUFFER, new Float32Array(textureArray), obj.ctx.STATIC_DRAW);
+
+ obj.vertexObject = obj.ctx.createBuffer();
+ obj.ctx.bindBuffer(obj.ctx.ARRAY_BUFFER, obj.vertexObject);
+ obj.ctx.bufferData(obj.ctx.ARRAY_BUFFER, new Float32Array(vertexArray), obj.ctx.STATIC_DRAW);
+
+ obj.numIndices = indexArray.length;
+ obj.indexObject = obj.ctx.createBuffer();
+ obj.ctx.bindBuffer(obj.ctx.ELEMENT_ARRAY_BUFFER, obj.indexObject);
+ obj.ctx.bufferData(obj.ctx.ELEMENT_ARRAY_BUFFER, new Uint16Array(indexArray), obj.ctx.STREAM_DRAW);
+
+ obj.groups = groups;
+
+ obj.loaded = true;
+}
+
+// Array of images curently loading
+var g_loadingImages = [];
+
+// Clears all the images currently loading.
+// This is used to handle context lost events.
+function clearLoadingImages() {
+ for (var ii = 0; ii < g_loadingImages.length; ++ii) {
+ g_loadingImages[ii].onload = undefined;
+ }
+ g_loadingImages = [];
+}
+
+//
+// loadImageTexture
+//
+// Load the image at the passed url, place it in a new WebGLTexture object and return the WebGLTexture.
+//
+function loadImageTexture(ctx, url)
+{
+ var texture = ctx.createTexture();
+ ctx.bindTexture(ctx.TEXTURE_2D, texture);
+ ctx.texImage2D(ctx.TEXTURE_2D, 0, ctx.RGBA, 1, 1, 0, ctx.RGBA, ctx.UNSIGNED_BYTE, null);
+ var image = new Image();
+ g_loadingImages.push(image);
+ image.onload = function() { doLoadImageTexture(ctx, image, texture) }
+ image.src = url;
+ return texture;
+}
+
+function doLoadImageTexture(ctx, image, texture)
+{
+ g_loadingImages.splice(g_loadingImages.indexOf(image), 1);
+ ctx.bindTexture(ctx.TEXTURE_2D, texture);
+ ctx.texImage2D(
+ ctx.TEXTURE_2D, 0, ctx.RGBA, ctx.RGBA, ctx.UNSIGNED_BYTE, image);
+ ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_MAG_FILTER, ctx.LINEAR);
+ ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_MIN_FILTER, ctx.LINEAR);
+ ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_WRAP_S, ctx.CLAMP_TO_EDGE);
+ ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_WRAP_T, ctx.CLAMP_TO_EDGE);
+ //ctx.generateMipmap(ctx.TEXTURE_2D)
+ ctx.bindTexture(ctx.TEXTURE_2D, null);
+}
+
+//
+// Framerate object
+//
+// This object keeps track of framerate and displays it as the innerHTML text of the
+// HTML element with the passed id. Once created you call snapshot at the end
+// of every rendering cycle. Every 500ms the framerate is updated in the HTML element.
+//
+Framerate = function(id)
+{
+ this.numFramerates = 10;
+ this.framerateUpdateInterval = 500;
+ this.id = id;
+
+ this.renderTime = -1;
+ this.framerates = [ ];
+ self = this;
+ var fr = function() { self.updateFramerate() }
+ setInterval(fr, this.framerateUpdateInterval);
+}
+
+Framerate.prototype.updateFramerate = function()
+{
+ var tot = 0;
+ for (var i = 0; i < this.framerates.length; ++i)
+ tot += this.framerates[i];
+
+ var framerate = tot / this.framerates.length;
+ framerate = Math.round(framerate);
+ document.getElementById(this.id).innerHTML = "Framerate:"+framerate+"fps";
+}
+
+Framerate.prototype.snapshot = function()
+{
+ if (this.renderTime < 0)
+ this.renderTime = new Date().getTime();
+ else {
+ var newTime = new Date().getTime();
+ var t = newTime - this.renderTime;
+ if (t == 0)
+ return;
+ var framerate = 1000/t;
+ this.framerates.push(framerate);
+ while (this.framerates.length > this.numFramerates)
+ this.framerates.shift();
+ this.renderTime = newTime;
+ }
+}
--- /dev/null
+/*
+ * Copyright (C) 2009 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+ // J3DI (Jedi) - A support library for WebGL.
+
+/*
+ J3DI Math Classes. Currently includes:
+
+ J3DIMatrix4 - A 4x4 Matrix
+*/
+
+/*
+ J3DIMatrix4 class
+
+ This class implements a 4x4 matrix. It has functions which duplicate the
+ functionality of the OpenGL matrix stack and glut functions. On browsers
+ that support it, CSSMatrix is used to accelerate operations.
+
+ IDL:
+
+ [
+ Constructor(in J3DIMatrix4 matrix), // copy passed matrix into new J3DIMatrix4
+ Constructor(in sequence<float> array) // create new J3DIMatrix4 with 16 floats (row major)
+ Constructor() // create new J3DIMatrix4 with identity matrix
+ ]
+ interface J3DIMatrix4 {
+ void load(in J3DIMatrix4 matrix); // copy the values from the passed matrix
+ void load(in sequence<float> array); // copy 16 floats into the matrix
+ sequence<float> getAsArray(); // return the matrix as an array of 16 floats
+ Float32Array getAsFloat32Array(); // return the matrix as a Float32Array with 16 values
+ void setUniform(in WebGLRenderingContext ctx, // Send the matrix to the passed uniform location in the passed context
+ in WebGLUniformLocation loc,
+ in boolean transpose);
+ void makeIdentity(); // replace the matrix with identity
+ void transpose(); // replace the matrix with its transpose
+ void invert(); // replace the matrix with its inverse
+
+ void translate(in float x, in float y, in float z); // multiply the matrix by passed translation values on the right
+ void translate(in J3DVector3 v); // multiply the matrix by passed translation values on the right
+ void scale(in float x, in float y, in float z); // multiply the matrix by passed scale values on the right
+ void scale(in J3DVector3 v); // multiply the matrix by passed scale values on the right
+ void rotate(in float angle, // multiply the matrix by passed rotation values on the right
+ in float x, in float y, in float z); // (angle is in degrees)
+ void rotate(in float angle, in J3DVector3 v); // multiply the matrix by passed rotation values on the right
+ // (angle is in degrees)
+ void multiply(in CanvasMatrix matrix); // multiply the matrix by the passed matrix on the right
+ void divide(in float divisor); // divide the matrix by the passed divisor
+ void ortho(in float left, in float right, // multiply the matrix by the passed ortho values on the right
+ in float bottom, in float top,
+ in float near, in float far);
+ void frustum(in float left, in float right, // multiply the matrix by the passed frustum values on the right
+ in float bottom, in float top,
+ in float near, in float far);
+ void perspective(in float fovy, in float aspect, // multiply the matrix by the passed perspective values on the right
+ in float zNear, in float zFar);
+ void lookat(in J3DVector3 eye, // multiply the matrix by the passed lookat
+ in J3DVector3 center, in J3DVector3 up); // values on the right
+ bool decompose(in J3DVector3 translate, // decompose the matrix into the passed vector
+ in J3DVector3 rotate,
+ in J3DVector3 scale,
+ in J3DVector3 skew,
+ in sequence<float> perspective);
+ }
+
+ [
+ Constructor(in J3DVector3 vector), // copy passed vector into new J3DVector3
+ Constructor(in sequence<float> array) // create new J3DVector3 with 3 floats from array
+ Constructor(in float x, in float y, in float z) // create new J3DVector3 with 3 floats
+ Constructor() // create new J3DVector3 with (0,0,0)
+ ]
+ interface J3DVector3 {
+ void load(in J3DVector3 vector); // copy the values from the passed vector
+ void load(in sequence<float> array); // copy 3 floats into the vector from array
+ void load(in float x, in float y, in float z); // copy 3 floats into the vector
+ sequence<float> getAsArray(); // return the vector as an array of 3 floats
+ Float32Array getAsFloat32Array(); // return the matrix as a Float32Array with 16 values
+ void multMatrix(in J3DIMatrix4 matrix); // multiply the vector by the passed matrix (on the right)
+ float vectorLength(); // return the length of the vector
+ float dot(); // return the dot product of the vector
+ void cross(in J3DVector3 v); // replace the vector with vector x v
+ void divide(in float divisor); // divide the vector by the passed divisor
+ }
+*/
+
+J3DIHasCSSMatrix = false;
+J3DIHasCSSMatrixCopy = false;
+/*
+if ("WebKitCSSMatrix" in window && ("media" in window && window.media.matchMedium("(-webkit-transform-3d)")) ||
+ ("styleMedia" in window && window.styleMedia.matchMedium("(-webkit-transform-3d)"))) {
+ J3DIHasCSSMatrix = true;
+ if ("copy" in WebKitCSSMatrix.prototype)
+ J3DIHasCSSMatrixCopy = true;
+}
+*/
+
+// console.log("J3DIHasCSSMatrix="+J3DIHasCSSMatrix);
+// console.log("J3DIHasCSSMatrixCopy="+J3DIHasCSSMatrixCopy);
+
+//
+// J3DIMatrix4
+//
+J3DIMatrix4 = function(m)
+{
+ if (J3DIHasCSSMatrix)
+ this.$matrix = new WebKitCSSMatrix;
+ else
+ this.$matrix = new Object;
+
+ if (typeof m == 'object') {
+ if ("length" in m && m.length >= 16) {
+ this.load(m);
+ return;
+ }
+ else if (m instanceof J3DIMatrix4) {
+ this.load(m);
+ return;
+ }
+ }
+ this.makeIdentity();
+}
+
+J3DIMatrix4.prototype.load = function()
+{
+ if (arguments.length == 1 && typeof arguments[0] == 'object') {
+ var matrix;
+
+ if (arguments[0] instanceof J3DIMatrix4) {
+ matrix = arguments[0].$matrix;
+
+ this.$matrix.m11 = matrix.m11;
+ this.$matrix.m12 = matrix.m12;
+ this.$matrix.m13 = matrix.m13;
+ this.$matrix.m14 = matrix.m14;
+
+ this.$matrix.m21 = matrix.m21;
+ this.$matrix.m22 = matrix.m22;
+ this.$matrix.m23 = matrix.m23;
+ this.$matrix.m24 = matrix.m24;
+
+ this.$matrix.m31 = matrix.m31;
+ this.$matrix.m32 = matrix.m32;
+ this.$matrix.m33 = matrix.m33;
+ this.$matrix.m34 = matrix.m34;
+
+ this.$matrix.m41 = matrix.m41;
+ this.$matrix.m42 = matrix.m42;
+ this.$matrix.m43 = matrix.m43;
+ this.$matrix.m44 = matrix.m44;
+ return;
+ }
+ else
+ matrix = arguments[0];
+
+ if ("length" in matrix && matrix.length >= 16) {
+ this.$matrix.m11 = matrix[0];
+ this.$matrix.m12 = matrix[1];
+ this.$matrix.m13 = matrix[2];
+ this.$matrix.m14 = matrix[3];
+
+ this.$matrix.m21 = matrix[4];
+ this.$matrix.m22 = matrix[5];
+ this.$matrix.m23 = matrix[6];
+ this.$matrix.m24 = matrix[7];
+
+ this.$matrix.m31 = matrix[8];
+ this.$matrix.m32 = matrix[9];
+ this.$matrix.m33 = matrix[10];
+ this.$matrix.m34 = matrix[11];
+
+ this.$matrix.m41 = matrix[12];
+ this.$matrix.m42 = matrix[13];
+ this.$matrix.m43 = matrix[14];
+ this.$matrix.m44 = matrix[15];
+ return;
+ }
+ }
+
+ this.makeIdentity();
+}
+
+J3DIMatrix4.prototype.getAsArray = function()
+{
+ return [
+ this.$matrix.m11, this.$matrix.m12, this.$matrix.m13, this.$matrix.m14,
+ this.$matrix.m21, this.$matrix.m22, this.$matrix.m23, this.$matrix.m24,
+ this.$matrix.m31, this.$matrix.m32, this.$matrix.m33, this.$matrix.m34,
+ this.$matrix.m41, this.$matrix.m42, this.$matrix.m43, this.$matrix.m44
+ ];
+}
+
+J3DIMatrix4.prototype.getAsFloat32Array = function()
+{
+ if (J3DIHasCSSMatrixCopy) {
+ var array = new Float32Array(16);
+ this.$matrix.copy(array);
+ return array;
+ }
+ return new Float32Array(this.getAsArray());
+}
+
+J3DIMatrix4.prototype.setUniform = function(ctx, loc, transpose)
+{
+ if (J3DIMatrix4.setUniformArray == undefined) {
+ J3DIMatrix4.setUniformWebGLArray = new Float32Array(16);
+ J3DIMatrix4.setUniformArray = new Array(16);
+ }
+
+ if (J3DIHasCSSMatrixCopy)
+ this.$matrix.copy(J3DIMatrix4.setUniformWebGLArray);
+ else {
+ J3DIMatrix4.setUniformArray[0] = this.$matrix.m11;
+ J3DIMatrix4.setUniformArray[1] = this.$matrix.m12;
+ J3DIMatrix4.setUniformArray[2] = this.$matrix.m13;
+ J3DIMatrix4.setUniformArray[3] = this.$matrix.m14;
+ J3DIMatrix4.setUniformArray[4] = this.$matrix.m21;
+ J3DIMatrix4.setUniformArray[5] = this.$matrix.m22;
+ J3DIMatrix4.setUniformArray[6] = this.$matrix.m23;
+ J3DIMatrix4.setUniformArray[7] = this.$matrix.m24;
+ J3DIMatrix4.setUniformArray[8] = this.$matrix.m31;
+ J3DIMatrix4.setUniformArray[9] = this.$matrix.m32;
+ J3DIMatrix4.setUniformArray[10] = this.$matrix.m33;
+ J3DIMatrix4.setUniformArray[11] = this.$matrix.m34;
+ J3DIMatrix4.setUniformArray[12] = this.$matrix.m41;
+ J3DIMatrix4.setUniformArray[13] = this.$matrix.m42;
+ J3DIMatrix4.setUniformArray[14] = this.$matrix.m43;
+ J3DIMatrix4.setUniformArray[15] = this.$matrix.m44;
+
+ J3DIMatrix4.setUniformWebGLArray.set(J3DIMatrix4.setUniformArray);
+ }
+
+ ctx.uniformMatrix4fv(loc, transpose, J3DIMatrix4.setUniformWebGLArray);
+}
+
+J3DIMatrix4.prototype.makeIdentity = function()
+{
+ this.$matrix.m11 = 1;
+ this.$matrix.m12 = 0;
+ this.$matrix.m13 = 0;
+ this.$matrix.m14 = 0;
+
+ this.$matrix.m21 = 0;
+ this.$matrix.m22 = 1;
+ this.$matrix.m23 = 0;
+ this.$matrix.m24 = 0;
+
+ this.$matrix.m31 = 0;
+ this.$matrix.m32 = 0;
+ this.$matrix.m33 = 1;
+ this.$matrix.m34 = 0;
+
+ this.$matrix.m41 = 0;
+ this.$matrix.m42 = 0;
+ this.$matrix.m43 = 0;
+ this.$matrix.m44 = 1;
+}
+
+J3DIMatrix4.prototype.transpose = function()
+{
+ var tmp = this.$matrix.m12;
+ this.$matrix.m12 = this.$matrix.m21;
+ this.$matrix.m21 = tmp;
+
+ tmp = this.$matrix.m13;
+ this.$matrix.m13 = this.$matrix.m31;
+ this.$matrix.m31 = tmp;
+
+ tmp = this.$matrix.m14;
+ this.$matrix.m14 = this.$matrix.m41;
+ this.$matrix.m41 = tmp;
+
+ tmp = this.$matrix.m23;
+ this.$matrix.m23 = this.$matrix.m32;
+ this.$matrix.m32 = tmp;
+
+ tmp = this.$matrix.m24;
+ this.$matrix.m24 = this.$matrix.m42;
+ this.$matrix.m42 = tmp;
+
+ tmp = this.$matrix.m34;
+ this.$matrix.m34 = this.$matrix.m43;
+ this.$matrix.m43 = tmp;
+}
+
+J3DIMatrix4.prototype.invert = function()
+{
+ if (J3DIHasCSSMatrix) {
+ this.$matrix = this.$matrix.inverse();
+ return;
+ }
+
+ // Calculate the 4x4 determinant
+ // If the determinant is zero,
+ // then the inverse matrix is not unique.
+ var det = this._determinant4x4();
+
+ if (Math.abs(det) < 1e-8)
+ return null;
+
+ this._makeAdjoint();
+
+ // Scale the adjoint matrix to get the inverse
+ this.$matrix.m11 /= det;
+ this.$matrix.m12 /= det;
+ this.$matrix.m13 /= det;
+ this.$matrix.m14 /= det;
+
+ this.$matrix.m21 /= det;
+ this.$matrix.m22 /= det;
+ this.$matrix.m23 /= det;
+ this.$matrix.m24 /= det;
+
+ this.$matrix.m31 /= det;
+ this.$matrix.m32 /= det;
+ this.$matrix.m33 /= det;
+ this.$matrix.m34 /= det;
+
+ this.$matrix.m41 /= det;
+ this.$matrix.m42 /= det;
+ this.$matrix.m43 /= det;
+ this.$matrix.m44 /= det;
+}
+
+J3DIMatrix4.prototype.translate = function(x,y,z)
+{
+ if (typeof x == 'object' && "length" in x) {
+ var t = x;
+ x = t[0];
+ y = t[1];
+ z = t[2];
+ }
+ else {
+ if (x == undefined)
+ x = 0;
+ if (y == undefined)
+ y = 0;
+ if (z == undefined)
+ z = 0;
+ }
+
+ if (J3DIHasCSSMatrix) {
+ this.$matrix = this.$matrix.translate(x, y, z);
+ return;
+ }
+
+ var matrix = new J3DIMatrix4();
+ matrix.$matrix.m41 = x;
+ matrix.$matrix.m42 = y;
+ matrix.$matrix.m43 = z;
+
+ this.multiply(matrix);
+}
+
+J3DIMatrix4.prototype.scale = function(x,y,z)
+{
+ if (typeof x == 'object' && "length" in x) {
+ var t = x;
+ x = t[0];
+ y = t[1];
+ z = t[2];
+ }
+ else {
+ if (x == undefined)
+ x = 1;
+ if (z == undefined) {
+ if (y == undefined) {
+ y = x;
+ z = x;
+ }
+ else
+ z = 1;
+ }
+ else if (y == undefined)
+ y = x;
+ }
+
+ if (J3DIHasCSSMatrix) {
+ this.$matrix = this.$matrix.scale(x, y, z);
+ return;
+ }
+
+ var matrix = new J3DIMatrix4();
+ matrix.$matrix.m11 = x;
+ matrix.$matrix.m22 = y;
+ matrix.$matrix.m33 = z;
+
+ this.multiply(matrix);
+}
+
+J3DIMatrix4.prototype.rotate = function(angle,x,y,z)
+{
+ // Forms are (angle, x,y,z), (angle,vector), (angleX, angleY, angleZ), (angle)
+ if (typeof x == 'object' && "length" in x) {
+ var t = x;
+ x = t[0];
+ y = t[1];
+ z = t[2];
+ }
+ else {
+ if (arguments.length == 1) {
+ x = 0;
+ y = 0;
+ z = 1;
+ }
+ else if (arguments.length == 3) {
+ this.rotate(angle, 1,0,0); // about X axis
+ this.rotate(x, 0,1,0); // about Y axis
+ this.rotate(y, 0,0,1); // about Z axis
+ return;
+ }
+ }
+
+ if (J3DIHasCSSMatrix) {
+ this.$matrix = this.$matrix.rotateAxisAngle(x, y, z, angle);
+ return;
+ }
+
+ // angles are in degrees. Switch to radians
+ angle = angle / 180 * Math.PI;
+
+ angle /= 2;
+ var sinA = Math.sin(angle);
+ var cosA = Math.cos(angle);
+ var sinA2 = sinA * sinA;
+
+ // normalize
+ var len = Math.sqrt(x * x + y * y + z * z);
+ if (len == 0) {
+ // bad vector, just use something reasonable
+ x = 0;
+ y = 0;
+ z = 1;
+ } else if (len != 1) {
+ x /= len;
+ y /= len;
+ z /= len;
+ }
+
+ var mat = new J3DIMatrix4();
+
+ // optimize case where axis is along major axis
+ if (x == 1 && y == 0 && z == 0) {
+ mat.$matrix.m11 = 1;
+ mat.$matrix.m12 = 0;
+ mat.$matrix.m13 = 0;
+ mat.$matrix.m21 = 0;
+ mat.$matrix.m22 = 1 - 2 * sinA2;
+ mat.$matrix.m23 = 2 * sinA * cosA;
+ mat.$matrix.m31 = 0;
+ mat.$matrix.m32 = -2 * sinA * cosA;
+ mat.$matrix.m33 = 1 - 2 * sinA2;
+ mat.$matrix.m14 = mat.$matrix.m24 = mat.$matrix.m34 = 0;
+ mat.$matrix.m41 = mat.$matrix.m42 = mat.$matrix.m43 = 0;
+ mat.$matrix.m44 = 1;
+ } else if (x == 0 && y == 1 && z == 0) {
+ mat.$matrix.m11 = 1 - 2 * sinA2;
+ mat.$matrix.m12 = 0;
+ mat.$matrix.m13 = -2 * sinA * cosA;
+ mat.$matrix.m21 = 0;
+ mat.$matrix.m22 = 1;
+ mat.$matrix.m23 = 0;
+ mat.$matrix.m31 = 2 * sinA * cosA;
+ mat.$matrix.m32 = 0;
+ mat.$matrix.m33 = 1 - 2 * sinA2;
+ mat.$matrix.m14 = mat.$matrix.m24 = mat.$matrix.m34 = 0;
+ mat.$matrix.m41 = mat.$matrix.m42 = mat.$matrix.m43 = 0;
+ mat.$matrix.m44 = 1;
+ } else if (x == 0 && y == 0 && z == 1) {
+ mat.$matrix.m11 = 1 - 2 * sinA2;
+ mat.$matrix.m12 = 2 * sinA * cosA;
+ mat.$matrix.m13 = 0;
+ mat.$matrix.m21 = -2 * sinA * cosA;
+ mat.$matrix.m22 = 1 - 2 * sinA2;
+ mat.$matrix.m23 = 0;
+ mat.$matrix.m31 = 0;
+ mat.$matrix.m32 = 0;
+ mat.$matrix.m33 = 1;
+ mat.$matrix.m14 = mat.$matrix.m24 = mat.$matrix.m34 = 0;
+ mat.$matrix.m41 = mat.$matrix.m42 = mat.$matrix.m43 = 0;
+ mat.$matrix.m44 = 1;
+ } else {
+ var x2 = x*x;
+ var y2 = y*y;
+ var z2 = z*z;
+
+ mat.$matrix.m11 = 1 - 2 * (y2 + z2) * sinA2;
+ mat.$matrix.m12 = 2 * (x * y * sinA2 + z * sinA * cosA);
+ mat.$matrix.m13 = 2 * (x * z * sinA2 - y * sinA * cosA);
+ mat.$matrix.m21 = 2 * (y * x * sinA2 - z * sinA * cosA);
+ mat.$matrix.m22 = 1 - 2 * (z2 + x2) * sinA2;
+ mat.$matrix.m23 = 2 * (y * z * sinA2 + x * sinA * cosA);
+ mat.$matrix.m31 = 2 * (z * x * sinA2 + y * sinA * cosA);
+ mat.$matrix.m32 = 2 * (z * y * sinA2 - x * sinA * cosA);
+ mat.$matrix.m33 = 1 - 2 * (x2 + y2) * sinA2;
+ mat.$matrix.m14 = mat.$matrix.m24 = mat.$matrix.m34 = 0;
+ mat.$matrix.m41 = mat.$matrix.m42 = mat.$matrix.m43 = 0;
+ mat.$matrix.m44 = 1;
+ }
+ this.multiply(mat);
+}
+
+J3DIMatrix4.prototype.multiply = function(mat)
+{
+ if (J3DIHasCSSMatrix) {
+ this.$matrix = this.$matrix.multiply(mat.$matrix);
+ return;
+ }
+
+ var m11 = (mat.$matrix.m11 * this.$matrix.m11 + mat.$matrix.m12 * this.$matrix.m21
+ + mat.$matrix.m13 * this.$matrix.m31 + mat.$matrix.m14 * this.$matrix.m41);
+ var m12 = (mat.$matrix.m11 * this.$matrix.m12 + mat.$matrix.m12 * this.$matrix.m22
+ + mat.$matrix.m13 * this.$matrix.m32 + mat.$matrix.m14 * this.$matrix.m42);
+ var m13 = (mat.$matrix.m11 * this.$matrix.m13 + mat.$matrix.m12 * this.$matrix.m23
+ + mat.$matrix.m13 * this.$matrix.m33 + mat.$matrix.m14 * this.$matrix.m43);
+ var m14 = (mat.$matrix.m11 * this.$matrix.m14 + mat.$matrix.m12 * this.$matrix.m24
+ + mat.$matrix.m13 * this.$matrix.m34 + mat.$matrix.m14 * this.$matrix.m44);
+
+ var m21 = (mat.$matrix.m21 * this.$matrix.m11 + mat.$matrix.m22 * this.$matrix.m21
+ + mat.$matrix.m23 * this.$matrix.m31 + mat.$matrix.m24 * this.$matrix.m41);
+ var m22 = (mat.$matrix.m21 * this.$matrix.m12 + mat.$matrix.m22 * this.$matrix.m22
+ + mat.$matrix.m23 * this.$matrix.m32 + mat.$matrix.m24 * this.$matrix.m42);
+ var m23 = (mat.$matrix.m21 * this.$matrix.m13 + mat.$matrix.m22 * this.$matrix.m23
+ + mat.$matrix.m23 * this.$matrix.m33 + mat.$matrix.m24 * this.$matrix.m43);
+ var m24 = (mat.$matrix.m21 * this.$matrix.m14 + mat.$matrix.m22 * this.$matrix.m24
+ + mat.$matrix.m23 * this.$matrix.m34 + mat.$matrix.m24 * this.$matrix.m44);
+
+ var m31 = (mat.$matrix.m31 * this.$matrix.m11 + mat.$matrix.m32 * this.$matrix.m21
+ + mat.$matrix.m33 * this.$matrix.m31 + mat.$matrix.m34 * this.$matrix.m41);
+ var m32 = (mat.$matrix.m31 * this.$matrix.m12 + mat.$matrix.m32 * this.$matrix.m22
+ + mat.$matrix.m33 * this.$matrix.m32 + mat.$matrix.m34 * this.$matrix.m42);
+ var m33 = (mat.$matrix.m31 * this.$matrix.m13 + mat.$matrix.m32 * this.$matrix.m23
+ + mat.$matrix.m33 * this.$matrix.m33 + mat.$matrix.m34 * this.$matrix.m43);
+ var m34 = (mat.$matrix.m31 * this.$matrix.m14 + mat.$matrix.m32 * this.$matrix.m24
+ + mat.$matrix.m33 * this.$matrix.m34 + mat.$matrix.m34 * this.$matrix.m44);
+
+ var m41 = (mat.$matrix.m41 * this.$matrix.m11 + mat.$matrix.m42 * this.$matrix.m21
+ + mat.$matrix.m43 * this.$matrix.m31 + mat.$matrix.m44 * this.$matrix.m41);
+ var m42 = (mat.$matrix.m41 * this.$matrix.m12 + mat.$matrix.m42 * this.$matrix.m22
+ + mat.$matrix.m43 * this.$matrix.m32 + mat.$matrix.m44 * this.$matrix.m42);
+ var m43 = (mat.$matrix.m41 * this.$matrix.m13 + mat.$matrix.m42 * this.$matrix.m23
+ + mat.$matrix.m43 * this.$matrix.m33 + mat.$matrix.m44 * this.$matrix.m43);
+ var m44 = (mat.$matrix.m41 * this.$matrix.m14 + mat.$matrix.m42 * this.$matrix.m24
+ + mat.$matrix.m43 * this.$matrix.m34 + mat.$matrix.m44 * this.$matrix.m44);
+
+ this.$matrix.m11 = m11;
+ this.$matrix.m12 = m12;
+ this.$matrix.m13 = m13;
+ this.$matrix.m14 = m14;
+
+ this.$matrix.m21 = m21;
+ this.$matrix.m22 = m22;
+ this.$matrix.m23 = m23;
+ this.$matrix.m24 = m24;
+
+ this.$matrix.m31 = m31;
+ this.$matrix.m32 = m32;
+ this.$matrix.m33 = m33;
+ this.$matrix.m34 = m34;
+
+ this.$matrix.m41 = m41;
+ this.$matrix.m42 = m42;
+ this.$matrix.m43 = m43;
+ this.$matrix.m44 = m44;
+}
+
+J3DIMatrix4.prototype.divide = function(divisor)
+{
+ this.$matrix.m11 /= divisor;
+ this.$matrix.m12 /= divisor;
+ this.$matrix.m13 /= divisor;
+ this.$matrix.m14 /= divisor;
+
+ this.$matrix.m21 /= divisor;
+ this.$matrix.m22 /= divisor;
+ this.$matrix.m23 /= divisor;
+ this.$matrix.m24 /= divisor;
+
+ this.$matrix.m31 /= divisor;
+ this.$matrix.m32 /= divisor;
+ this.$matrix.m33 /= divisor;
+ this.$matrix.m34 /= divisor;
+
+ this.$matrix.m41 /= divisor;
+ this.$matrix.m42 /= divisor;
+ this.$matrix.m43 /= divisor;
+ this.$matrix.m44 /= divisor;
+
+}
+
+J3DIMatrix4.prototype.ortho = function(left, right, bottom, top, near, far)
+{
+ var tx = (left + right) / (left - right);
+ var ty = (top + bottom) / (top - bottom);
+ var tz = (far + near) / (far - near);
+
+ var matrix = new J3DIMatrix4();
+ matrix.$matrix.m11 = 2 / (left - right);
+ matrix.$matrix.m12 = 0;
+ matrix.$matrix.m13 = 0;
+ matrix.$matrix.m14 = 0;
+ matrix.$matrix.m21 = 0;
+ matrix.$matrix.m22 = 2 / (top - bottom);
+ matrix.$matrix.m23 = 0;
+ matrix.$matrix.m24 = 0;
+ matrix.$matrix.m31 = 0;
+ matrix.$matrix.m32 = 0;
+ matrix.$matrix.m33 = -2 / (far - near);
+ matrix.$matrix.m34 = 0;
+ matrix.$matrix.m41 = tx;
+ matrix.$matrix.m42 = ty;
+ matrix.$matrix.m43 = tz;
+ matrix.$matrix.m44 = 1;
+
+ this.multiply(matrix);
+}
+
+J3DIMatrix4.prototype.frustum = function(left, right, bottom, top, near, far)
+{
+ var matrix = new J3DIMatrix4();
+ var A = (right + left) / (right - left);
+ var B = (top + bottom) / (top - bottom);
+ var C = -(far + near) / (far - near);
+ var D = -(2 * far * near) / (far - near);
+
+ matrix.$matrix.m11 = (2 * near) / (right - left);
+ matrix.$matrix.m12 = 0;
+ matrix.$matrix.m13 = 0;
+ matrix.$matrix.m14 = 0;
+
+ matrix.$matrix.m21 = 0;
+ matrix.$matrix.m22 = 2 * near / (top - bottom);
+ matrix.$matrix.m23 = 0;
+ matrix.$matrix.m24 = 0;
+
+ matrix.$matrix.m31 = A;
+ matrix.$matrix.m32 = B;
+ matrix.$matrix.m33 = C;
+ matrix.$matrix.m34 = -1;
+
+ matrix.$matrix.m41 = 0;
+ matrix.$matrix.m42 = 0;
+ matrix.$matrix.m43 = D;
+ matrix.$matrix.m44 = 0;
+
+ this.multiply(matrix);
+}
+
+J3DIMatrix4.prototype.perspective = function(fovy, aspect, zNear, zFar)
+{
+ var top = Math.tan(fovy * Math.PI / 360) * zNear;
+ var bottom = -top;
+ var left = aspect * bottom;
+ var right = aspect * top;
+ this.frustum(left, right, bottom, top, zNear, zFar);
+}
+
+J3DIMatrix4.prototype.lookat = function(eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz)
+{
+ if (typeof eyez == 'object' && "length" in eyez) {
+ var t = eyez;
+ upx = t[0];
+ upy = t[1];
+ upz = t[2];
+
+ t = eyey;
+ centerx = t[0];
+ centery = t[1];
+ centerz = t[2];
+
+ t = eyex;
+ eyex = t[0];
+ eyey = t[1];
+ eyez = t[2];
+ }
+
+ var matrix = new J3DIMatrix4();
+
+ // Make rotation matrix
+
+ // Z vector
+ var zx = eyex - centerx;
+ var zy = eyey - centery;
+ var zz = eyez - centerz;
+ var mag = Math.sqrt(zx * zx + zy * zy + zz * zz);
+ if (mag) {
+ zx /= mag;
+ zy /= mag;
+ zz /= mag;
+ }
+
+ // Y vector
+ var yx = upx;
+ var yy = upy;
+ var yz = upz;
+
+ // X vector = Y cross Z
+ xx = yy * zz - yz * zy;
+ xy = -yx * zz + yz * zx;
+ xz = yx * zy - yy * zx;
+
+ // Recompute Y = Z cross X
+ yx = zy * xz - zz * xy;
+ yy = -zx * xz + zz * xx;
+ yx = zx * xy - zy * xx;
+
+ // cross product gives area of parallelogram, which is < 1.0 for
+ // non-perpendicular unit-length vectors; so normalize x, y here
+
+ mag = Math.sqrt(xx * xx + xy * xy + xz * xz);
+ if (mag) {
+ xx /= mag;
+ xy /= mag;
+ xz /= mag;
+ }
+
+ mag = Math.sqrt(yx * yx + yy * yy + yz * yz);
+ if (mag) {
+ yx /= mag;
+ yy /= mag;
+ yz /= mag;
+ }
+
+ matrix.$matrix.m11 = xx;
+ matrix.$matrix.m12 = xy;
+ matrix.$matrix.m13 = xz;
+ matrix.$matrix.m14 = 0;
+
+ matrix.$matrix.m21 = yx;
+ matrix.$matrix.m22 = yy;
+ matrix.$matrix.m23 = yz;
+ matrix.$matrix.m24 = 0;
+
+ matrix.$matrix.m31 = zx;
+ matrix.$matrix.m32 = zy;
+ matrix.$matrix.m33 = zz;
+ matrix.$matrix.m34 = 0;
+
+ matrix.$matrix.m41 = 0;
+ matrix.$matrix.m42 = 0;
+ matrix.$matrix.m43 = 0;
+ matrix.$matrix.m44 = 1;
+ matrix.translate(-eyex, -eyey, -eyez);
+
+ this.multiply(matrix);
+}
+
+// Returns true on success, false otherwise. All params are Array objects
+J3DIMatrix4.prototype.decompose = function(_translate, _rotate, _scale, _skew, _perspective)
+{
+ // Normalize the matrix.
+ if (this.$matrix.m44 == 0)
+ return false;
+
+ // Gather the params
+ var translate, rotate, scale, skew, perspective;
+
+ var translate = (_translate == undefined || !("length" in _translate)) ? new J3DIVector3 : _translate;
+ var rotate = (_rotate == undefined || !("length" in _rotate)) ? new J3DIVector3 : _rotate;
+ var scale = (_scale == undefined || !("length" in _scale)) ? new J3DIVector3 : _scale;
+ var skew = (_skew == undefined || !("length" in _skew)) ? new J3DIVector3 : _skew;
+ var perspective = (_perspective == undefined || !("length" in _perspective)) ? new Array(4) : _perspective;
+
+ var matrix = new J3DIMatrix4(this);
+
+ matrix.divide(matrix.$matrix.m44);
+
+ // perspectiveMatrix is used to solve for perspective, but it also provides
+ // an easy way to test for singularity of the upper 3x3 component.
+ var perspectiveMatrix = new J3DIMatrix4(matrix);
+
+ perspectiveMatrix.$matrix.m14 = 0;
+ perspectiveMatrix.$matrix.m24 = 0;
+ perspectiveMatrix.$matrix.m34 = 0;
+ perspectiveMatrix.$matrix.m44 = 1;
+
+ if (perspectiveMatrix._determinant4x4() == 0)
+ return false;
+
+ // First, isolate perspective.
+ if (matrix.$matrix.m14 != 0 || matrix.$matrix.m24 != 0 || matrix.$matrix.m34 != 0) {
+ // rightHandSide is the right hand side of the equation.
+ var rightHandSide = [ matrix.$matrix.m14, matrix.$matrix.m24, matrix.$matrix.m34, matrix.$matrix.m44 ];
+
+ // Solve the equation by inverting perspectiveMatrix and multiplying
+ // rightHandSide by the inverse.
+ var inversePerspectiveMatrix = new J3DIMatrix4(perspectiveMatrix);
+ inversePerspectiveMatrix.invert();
+ var transposedInversePerspectiveMatrix = new J3DIMatrix4(inversePerspectiveMatrix);
+ transposedInversePerspectiveMatrix.transpose();
+ transposedInversePerspectiveMatrix.multVecMatrix(perspective, rightHandSide);
+
+ // Clear the perspective partition
+ matrix.$matrix.m14 = matrix.$matrix.m24 = matrix.$matrix.m34 = 0
+ matrix.$matrix.m44 = 1;
+ }
+ else {
+ // No perspective.
+ perspective[0] = perspective[1] = perspective[2] = 0;
+ perspective[3] = 1;
+ }
+
+ // Next take care of translation
+ translate[0] = matrix.$matrix.m41
+ matrix.$matrix.m41 = 0
+ translate[1] = matrix.$matrix.m42
+ matrix.$matrix.m42 = 0
+ translate[2] = matrix.$matrix.m43
+ matrix.$matrix.m43 = 0
+
+ // Now get scale and shear. 'row' is a 3 element array of 3 component vectors
+ var row0 = new J3DIVector3(matrix.$matrix.m11, matrix.$matrix.m12, matrix.$matrix.m13);
+ var row1 = new J3DIVector3(matrix.$matrix.m21, matrix.$matrix.m22, matrix.$matrix.m23);
+ var row2 = new J3DIVector3(matrix.$matrix.m31, matrix.$matrix.m32, matrix.$matrix.m33);
+
+ // Compute X scale factor and normalize first row.
+ scale[0] = row0.vectorLength();
+ row0.divide(scale[0]);
+
+ // Compute XY shear factor and make 2nd row orthogonal to 1st.
+ skew[0] = row0.dot(row1);
+ row1.combine(row0, 1.0, -skew[0]);
+
+ // Now, compute Y scale and normalize 2nd row.
+ scale[1] = row1.vectorLength();
+ row1.divide(scale[1]);
+ skew[0] /= scale[1];
+
+ // Compute XZ and YZ shears, orthogonalize 3rd row
+ skew[1] = row1.dot(row2);
+ row2.combine(row0, 1.0, -skew[1]);
+ skew[2] = row1.dot(row2);
+ row2.combine(row1, 1.0, -skew[2]);
+
+ // Next, get Z scale and normalize 3rd row.
+ scale[2] = row2.vectorLength();
+ row2.divide(scale[2]);
+ skew[1] /= scale[2];
+ skew[2] /= scale[2];
+
+ // At this point, the matrix (in rows) is orthonormal.
+ // Check for a coordinate system flip. If the determinant
+ // is -1, then negate the matrix and the scaling factors.
+ var pdum3 = new J3DIVector3(row1);
+ pdum3.cross(row2);
+ if (row0.dot(pdum3) < 0) {
+ for (i = 0; i < 3; i++) {
+ scale[i] *= -1;
+ row[0][i] *= -1;
+ row[1][i] *= -1;
+ row[2][i] *= -1;
+ }
+ }
+
+ // Now, get the rotations out
+ rotate[1] = Math.asin(-row0[2]);
+ if (Math.cos(rotate[1]) != 0) {
+ rotate[0] = Math.atan2(row1[2], row2[2]);
+ rotate[2] = Math.atan2(row0[1], row0[0]);
+ }
+ else {
+ rotate[0] = Math.atan2(-row2[0], row1[1]);
+ rotate[2] = 0;
+ }
+
+ // Convert rotations to degrees
+ var rad2deg = 180 / Math.PI;
+ rotate[0] *= rad2deg;
+ rotate[1] *= rad2deg;
+ rotate[2] *= rad2deg;
+
+ return true;
+}
+
+J3DIMatrix4.prototype._determinant2x2 = function(a, b, c, d)
+{
+ return a * d - b * c;
+}
+
+J3DIMatrix4.prototype._determinant3x3 = function(a1, a2, a3, b1, b2, b3, c1, c2, c3)
+{
+ return a1 * this._determinant2x2(b2, b3, c2, c3)
+ - b1 * this._determinant2x2(a2, a3, c2, c3)
+ + c1 * this._determinant2x2(a2, a3, b2, b3);
+}
+
+J3DIMatrix4.prototype._determinant4x4 = function()
+{
+ var a1 = this.$matrix.m11;
+ var b1 = this.$matrix.m12;
+ var c1 = this.$matrix.m13;
+ var d1 = this.$matrix.m14;
+
+ var a2 = this.$matrix.m21;
+ var b2 = this.$matrix.m22;
+ var c2 = this.$matrix.m23;
+ var d2 = this.$matrix.m24;
+
+ var a3 = this.$matrix.m31;
+ var b3 = this.$matrix.m32;
+ var c3 = this.$matrix.m33;
+ var d3 = this.$matrix.m34;
+
+ var a4 = this.$matrix.m41;
+ var b4 = this.$matrix.m42;
+ var c4 = this.$matrix.m43;
+ var d4 = this.$matrix.m44;
+
+ return a1 * this._determinant3x3(b2, b3, b4, c2, c3, c4, d2, d3, d4)
+ - b1 * this._determinant3x3(a2, a3, a4, c2, c3, c4, d2, d3, d4)
+ + c1 * this._determinant3x3(a2, a3, a4, b2, b3, b4, d2, d3, d4)
+ - d1 * this._determinant3x3(a2, a3, a4, b2, b3, b4, c2, c3, c4);
+}
+
+J3DIMatrix4.prototype._makeAdjoint = function()
+{
+ var a1 = this.$matrix.m11;
+ var b1 = this.$matrix.m12;
+ var c1 = this.$matrix.m13;
+ var d1 = this.$matrix.m14;
+
+ var a2 = this.$matrix.m21;
+ var b2 = this.$matrix.m22;
+ var c2 = this.$matrix.m23;
+ var d2 = this.$matrix.m24;
+
+ var a3 = this.$matrix.m31;
+ var b3 = this.$matrix.m32;
+ var c3 = this.$matrix.m33;
+ var d3 = this.$matrix.m34;
+
+ var a4 = this.$matrix.m41;
+ var b4 = this.$matrix.m42;
+ var c4 = this.$matrix.m43;
+ var d4 = this.$matrix.m44;
+
+ // Row column labeling reversed since we transpose rows & columns
+ this.$matrix.m11 = this._determinant3x3(b2, b3, b4, c2, c3, c4, d2, d3, d4);
+ this.$matrix.m21 = - this._determinant3x3(a2, a3, a4, c2, c3, c4, d2, d3, d4);
+ this.$matrix.m31 = this._determinant3x3(a2, a3, a4, b2, b3, b4, d2, d3, d4);
+ this.$matrix.m41 = - this._determinant3x3(a2, a3, a4, b2, b3, b4, c2, c3, c4);
+
+ this.$matrix.m12 = - this._determinant3x3(b1, b3, b4, c1, c3, c4, d1, d3, d4);
+ this.$matrix.m22 = this._determinant3x3(a1, a3, a4, c1, c3, c4, d1, d3, d4);
+ this.$matrix.m32 = - this._determinant3x3(a1, a3, a4, b1, b3, b4, d1, d3, d4);
+ this.$matrix.m42 = this._determinant3x3(a1, a3, a4, b1, b3, b4, c1, c3, c4);
+
+ this.$matrix.m13 = this._determinant3x3(b1, b2, b4, c1, c2, c4, d1, d2, d4);
+ this.$matrix.m23 = - this._determinant3x3(a1, a2, a4, c1, c2, c4, d1, d2, d4);
+ this.$matrix.m33 = this._determinant3x3(a1, a2, a4, b1, b2, b4, d1, d2, d4);
+ this.$matrix.m43 = - this._determinant3x3(a1, a2, a4, b1, b2, b4, c1, c2, c4);
+
+ this.$matrix.m14 = - this._determinant3x3(b1, b2, b3, c1, c2, c3, d1, d2, d3);
+ this.$matrix.m24 = this._determinant3x3(a1, a2, a3, c1, c2, c3, d1, d2, d3);
+ this.$matrix.m34 = - this._determinant3x3(a1, a2, a3, b1, b2, b3, d1, d2, d3);
+ this.$matrix.m44 = this._determinant3x3(a1, a2, a3, b1, b2, b3, c1, c2, c3);
+}
+
+//
+// J3DIVector3
+//
+J3DIVector3 = function(x,y,z)
+{
+ this.load(x,y,z);
+}
+
+J3DIVector3.prototype.load = function(x,y,z)
+{
+ if (typeof x == 'object' && "length" in x) {
+ this[0] = x[0];
+ this[1] = x[1];
+ this[2] = x[2];
+ }
+ else if (typeof x == 'number') {
+ this[0] = x;
+ this[1] = y;
+ this[2] = z;
+ }
+ else {
+ this[0] = 0;
+ this[1] = 0;
+ this[2] = 0;
+ }
+}
+
+J3DIVector3.prototype.getAsArray = function()
+{
+ return [ this[0], this[1], this[2] ];
+}
+
+J3DIVector3.prototype.getAsFloat32Array = function()
+{
+ return new Float32Array(this.getAsArray());
+}
+
+J3DIVector3.prototype.vectorLength = function()
+{
+ return Math.sqrt(this[0] * this[0] + this[1] * this[1] + this[2] * this[2]);
+}
+
+J3DIVector3.prototype.divide = function(divisor)
+{
+ this[0] /= divisor; this[1] /= divisor; this[2] /= divisor;
+}
+
+J3DIVector3.prototype.cross = function(v)
+{
+ this[0] = this[1] * v[2] - this[2] * v[1];
+ this[1] = -this[0] * v[2] + this[2] * v[0];
+ this[2] = this[0] * v[1] - this[1] * v[0];
+}
+
+J3DIVector3.prototype.dot = function(v)
+{
+ return this[0] * v[0] + this[1] * v[1] + this[2] * v[2];
+}
+
+J3DIVector3.prototype.combine = function(v, ascl, bscl)
+{
+ this[0] = (ascl * this[0]) + (bscl * v[0]);
+ this[1] = (ascl * this[1]) + (bscl * v[1]);
+ this[2] = (ascl * this[2]) + (bscl * v[2]);
+}
+
+J3DIVector3.prototype.multVecMatrix = function(matrix)
+{
+ var x = this[0];
+ var y = this[1];
+ var z = this[2];
+
+ this[0] = matrix.$matrix.m41 + x * matrix.$matrix.m11 + y * matrix.$matrix.m21 + z * matrix.$matrix.m31;
+ this[1] = matrix.$matrix.m42 + x * matrix.$matrix.m12 + y * matrix.$matrix.m22 + z * matrix.$matrix.m32;
+ this[2] = matrix.$matrix.m43 + x * matrix.$matrix.m13 + y * matrix.$matrix.m23 + z * matrix.$matrix.m33;
+ var w = matrix.$matrix.m44 + x * matrix.$matrix.m14 + y * matrix.$matrix.m24 + z * matrix.$matrix.m34;
+ if (w != 1 && w != 0) {
+ this[0] /= w;
+ this[1] /= w;
+ this[2] /= w;
+ }
+}
+
+J3DIVector3.prototype.toString = function()
+{
+ return "["+this[0]+","+this[1]+","+this[2]+"]";
+}
--- /dev/null
+/*
+** Copyright (c) 2012 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+
+// Various functions for helping debug WebGL apps.
+
+WebGLDebugUtils = function() {
+
+/**
+ * Wrapped logging function.
+ * @param {string} msg Message to log.
+ */
+var log = function(msg) {
+ if (window.console && window.console.log) {
+ window.console.log(msg);
+ }
+};
+
+/**
+ * Wrapped error logging function.
+ * @param {string} msg Message to log.
+ */
+var error = function(msg) {
+ if (window.console && window.console.error) {
+ window.console.error(msg);
+ } else {
+ log(msg);
+ }
+};
+
+/**
+ * Which arguements are enums.
+ * @type {!Object.<number, string>}
+ */
+var glValidEnumContexts = {
+
+ // Generic setters and getters
+
+ 'enable': { 0:true },
+ 'disable': { 0:true },
+ 'getParameter': { 0:true },
+
+ // Rendering
+
+ 'drawArrays': { 0:true },
+ 'drawElements': { 0:true, 2:true },
+
+ // Shaders
+
+ 'createShader': { 0:true },
+ 'getShaderParameter': { 1:true },
+ 'getProgramParameter': { 1:true },
+
+ // Vertex attributes
+
+ 'getVertexAttrib': { 1:true },
+ 'vertexAttribPointer': { 2:true },
+
+ // Textures
+
+ 'bindTexture': { 0:true },
+ 'activeTexture': { 0:true },
+ 'getTexParameter': { 0:true, 1:true },
+ 'texParameterf': { 0:true, 1:true },
+ 'texParameteri': { 0:true, 1:true, 2:true },
+ 'texImage2D': { 0:true, 2:true, 6:true, 7:true },
+ 'texSubImage2D': { 0:true, 6:true, 7:true },
+ 'copyTexImage2D': { 0:true, 2:true },
+ 'copyTexSubImage2D': { 0:true },
+ 'generateMipmap': { 0:true },
+
+ // Buffer objects
+
+ 'bindBuffer': { 0:true },
+ 'bufferData': { 0:true, 2:true },
+ 'bufferSubData': { 0:true },
+ 'getBufferParameter': { 0:true, 1:true },
+
+ // Renderbuffers and framebuffers
+
+ 'pixelStorei': { 0:true, 1:true },
+ 'readPixels': { 4:true, 5:true },
+ 'bindRenderbuffer': { 0:true },
+ 'bindFramebuffer': { 0:true },
+ 'checkFramebufferStatus': { 0:true },
+ 'framebufferRenderbuffer': { 0:true, 1:true, 2:true },
+ 'framebufferTexture2D': { 0:true, 1:true, 2:true },
+ 'getFramebufferAttachmentParameter': { 0:true, 1:true, 2:true },
+ 'getRenderbufferParameter': { 0:true, 1:true },
+ 'renderbufferStorage': { 0:true, 1:true },
+
+ // Frame buffer operations (clear, blend, depth test, stencil)
+
+ 'clear': { 0:true },
+ 'depthFunc': { 0:true },
+ 'blendFunc': { 0:true, 1:true },
+ 'blendFuncSeparate': { 0:true, 1:true, 2:true, 3:true },
+ 'blendEquation': { 0:true },
+ 'blendEquationSeparate': { 0:true, 1:true },
+ 'stencilFunc': { 0:true },
+ 'stencilFuncSeparate': { 0:true, 1:true },
+ 'stencilMaskSeparate': { 0:true },
+ 'stencilOp': { 0:true, 1:true, 2:true },
+ 'stencilOpSeparate': { 0:true, 1:true, 2:true, 3:true },
+
+ // Culling
+
+ 'cullFace': { 0:true },
+ 'frontFace': { 0:true },
+};
+
+/**
+ * Map of numbers to names.
+ * @type {Object}
+ */
+var glEnums = null;
+
+/**
+ * Initializes this module. Safe to call more than once.
+ * @param {!WebGLRenderingContext} ctx A WebGL context. If
+ * you have more than one context it doesn't matter which one
+ * you pass in, it is only used to pull out constants.
+ */
+function init(ctx) {
+ if (glEnums == null) {
+ glEnums = { };
+ for (var propertyName in ctx) {
+ if (typeof ctx[propertyName] == 'number') {
+ glEnums[ctx[propertyName]] = propertyName;
+ }
+ }
+ }
+}
+
+/**
+ * Checks the utils have been initialized.
+ */
+function checkInit() {
+ if (glEnums == null) {
+ throw 'WebGLDebugUtils.init(ctx) not called';
+ }
+}
+
+/**
+ * Returns true or false if value matches any WebGL enum
+ * @param {*} value Value to check if it might be an enum.
+ * @return {boolean} True if value matches one of the WebGL defined enums
+ */
+function mightBeEnum(value) {
+ checkInit();
+ return (glEnums[value] !== undefined);
+}
+
+/**
+ * Gets an string version of an WebGL enum.
+ *
+ * Example:
+ * var str = WebGLDebugUtil.glEnumToString(ctx.getError());
+ *
+ * @param {number} value Value to return an enum for
+ * @return {string} The string version of the enum.
+ */
+function glEnumToString(value) {
+ checkInit();
+ var name = glEnums[value];
+ return (name !== undefined) ? name :
+ ("*UNKNOWN WebGL ENUM (0x" + value.toString(16) + ")");
+}
+
+/**
+ * Returns the string version of a WebGL argument.
+ * Attempts to convert enum arguments to strings.
+ * @param {string} functionName the name of the WebGL function.
+ * @param {number} argumentIndx the index of the argument.
+ * @param {*} value The value of the argument.
+ * @return {string} The value as a string.
+ */
+function glFunctionArgToString(functionName, argumentIndex, value) {
+ var funcInfo = glValidEnumContexts[functionName];
+ if (funcInfo !== undefined) {
+ if (funcInfo[argumentIndex]) {
+ return glEnumToString(value);
+ }
+ }
+ if (value === null) {
+ return "null";
+ } else if (value === undefined) {
+ return "undefined";
+ } else {
+ return value.toString();
+ }
+}
+
+/**
+ * Converts the arguments of a WebGL function to a string.
+ * Attempts to convert enum arguments to strings.
+ *
+ * @param {string} functionName the name of the WebGL function.
+ * @param {number} args The arguments.
+ * @return {string} The arguments as a string.
+ */
+function glFunctionArgsToString(functionName, args) {
+ // apparently we can't do args.join(",");
+ var argStr = "";
+ for (var ii = 0; ii < args.length; ++ii) {
+ argStr += ((ii == 0) ? '' : ', ') +
+ glFunctionArgToString(functionName, ii, args[ii]);
+ }
+ return argStr;
+};
+
+
+function makePropertyWrapper(wrapper, original, propertyName) {
+ //log("wrap prop: " + propertyName);
+ wrapper.__defineGetter__(propertyName, function() {
+ return original[propertyName];
+ });
+ // TODO(gmane): this needs to handle properties that take more than
+ // one value?
+ wrapper.__defineSetter__(propertyName, function(value) {
+ //log("set: " + propertyName);
+ original[propertyName] = value;
+ });
+}
+
+// Makes a function that calls a function on another object.
+function makeFunctionWrapper(original, functionName) {
+ //log("wrap fn: " + functionName);
+ var f = original[functionName];
+ return function() {
+ //log("call: " + functionName);
+ var result = f.apply(original, arguments);
+ return result;
+ };
+}
+
+/**
+ * Given a WebGL context returns a wrapped context that calls
+ * gl.getError after every command and calls a function if the
+ * result is not gl.NO_ERROR.
+ *
+ * @param {!WebGLRenderingContext} ctx The webgl context to
+ * wrap.
+ * @param {!function(err, funcName, args): void} opt_onErrorFunc
+ * The function to call when gl.getError returns an
+ * error. If not specified the default function calls
+ * console.log with a message.
+ * @param {!function(funcName, args): void} opt_onFunc The
+ * function to call when each webgl function is called.
+ * You can use this to log all calls for example.
+ */
+function makeDebugContext(ctx, opt_onErrorFunc, opt_onFunc) {
+ init(ctx);
+ opt_onErrorFunc = opt_onErrorFunc || function(err, functionName, args) {
+ // apparently we can't do args.join(",");
+ var argStr = "";
+ for (var ii = 0; ii < args.length; ++ii) {
+ argStr += ((ii == 0) ? '' : ', ') +
+ glFunctionArgToString(functionName, ii, args[ii]);
+ }
+ error("WebGL error "+ glEnumToString(err) + " in "+ functionName +
+ "(" + argStr + ")");
+ };
+
+ // Holds booleans for each GL error so after we get the error ourselves
+ // we can still return it to the client app.
+ var glErrorShadow = { };
+
+ // Makes a function that calls a WebGL function and then calls getError.
+ function makeErrorWrapper(ctx, functionName) {
+ return function() {
+ if (opt_onFunc) {
+ opt_onFunc(functionName, arguments);
+ }
+ var result = ctx[functionName].apply(ctx, arguments);
+ var err = ctx.getError();
+ if (err != 0) {
+ glErrorShadow[err] = true;
+ opt_onErrorFunc(err, functionName, arguments);
+ }
+ return result;
+ };
+ }
+
+ // Make a an object that has a copy of every property of the WebGL context
+ // but wraps all functions.
+ var wrapper = {};
+ for (var propertyName in ctx) {
+ if (typeof ctx[propertyName] == 'function') {
+ wrapper[propertyName] = makeErrorWrapper(ctx, propertyName);
+ } else {
+ makePropertyWrapper(wrapper, ctx, propertyName);
+ }
+ }
+
+ // Override the getError function with one that returns our saved results.
+ wrapper.getError = function() {
+ for (var err in glErrorShadow) {
+ if (glErrorShadow.hasOwnProperty(err)) {
+ if (glErrorShadow[err]) {
+ glErrorShadow[err] = false;
+ return err;
+ }
+ }
+ }
+ return ctx.NO_ERROR;
+ };
+
+ return wrapper;
+}
+
+function resetToInitialState(ctx) {
+ var numAttribs = ctx.getParameter(ctx.MAX_VERTEX_ATTRIBS);
+ var tmp = ctx.createBuffer();
+ ctx.bindBuffer(ctx.ARRAY_BUFFER, tmp);
+ for (var ii = 0; ii < numAttribs; ++ii) {
+ ctx.disableVertexAttribArray(ii);
+ ctx.vertexAttribPointer(ii, 4, ctx.FLOAT, false, 0, 0);
+ ctx.vertexAttrib1f(ii, 0);
+ }
+ ctx.deleteBuffer(tmp);
+
+ var numTextureUnits = ctx.getParameter(ctx.MAX_TEXTURE_IMAGE_UNITS);
+ for (var ii = 0; ii < numTextureUnits; ++ii) {
+ ctx.activeTexture(ctx.TEXTURE0 + ii);
+ ctx.bindTexture(ctx.TEXTURE_CUBE_MAP, null);
+ ctx.bindTexture(ctx.TEXTURE_2D, null);
+ }
+
+ ctx.activeTexture(ctx.TEXTURE0);
+ ctx.useProgram(null);
+ ctx.bindBuffer(ctx.ARRAY_BUFFER, null);
+ ctx.bindBuffer(ctx.ELEMENT_ARRAY_BUFFER, null);
+ ctx.bindFramebuffer(ctx.FRAMEBUFFER, null);
+ ctx.bindRenderbuffer(ctx.RENDERBUFFER, null);
+ ctx.disable(ctx.BLEND);
+ ctx.disable(ctx.CULL_FACE);
+ ctx.disable(ctx.DEPTH_TEST);
+ ctx.disable(ctx.DITHER);
+ ctx.disable(ctx.SCISSOR_TEST);
+ ctx.blendColor(0, 0, 0, 0);
+ ctx.blendEquation(ctx.FUNC_ADD);
+ ctx.blendFunc(ctx.ONE, ctx.ZERO);
+ ctx.clearColor(0, 0, 0, 0);
+ ctx.clearDepth(1);
+ ctx.clearStencil(-1);
+ ctx.colorMask(true, true, true, true);
+ ctx.cullFace(ctx.BACK);
+ ctx.depthFunc(ctx.LESS);
+ ctx.depthMask(true);
+ ctx.depthRange(0, 1);
+ ctx.frontFace(ctx.CCW);
+ ctx.hint(ctx.GENERATE_MIPMAP_HINT, ctx.DONT_CARE);
+ ctx.lineWidth(1);
+ ctx.pixelStorei(ctx.PACK_ALIGNMENT, 4);
+ ctx.pixelStorei(ctx.UNPACK_ALIGNMENT, 4);
+ ctx.pixelStorei(ctx.UNPACK_FLIP_Y_WEBGL, false);
+ ctx.pixelStorei(ctx.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
+ // TODO: Delete this IF.
+ if (ctx.UNPACK_COLORSPACE_CONVERSION_WEBGL) {
+ ctx.pixelStorei(ctx.UNPACK_COLORSPACE_CONVERSION_WEBGL, ctx.BROWSER_DEFAULT_WEBGL);
+ }
+ ctx.polygonOffset(0, 0);
+ ctx.sampleCoverage(1, false);
+ ctx.scissor(0, 0, ctx.canvas.width, ctx.canvas.height);
+ ctx.stencilFunc(ctx.ALWAYS, 0, 0xFFFFFFFF);
+ ctx.stencilMask(0xFFFFFFFF);
+ ctx.stencilOp(ctx.KEEP, ctx.KEEP, ctx.KEEP);
+ ctx.viewport(0, 0, ctx.canvas.width, ctx.canvas.height);
+ ctx.clear(ctx.COLOR_BUFFER_BIT | ctx.DEPTH_BUFFER_BIT | ctx.STENCIL_BUFFER_BIT);
+
+ // TODO: This should NOT be needed but Firefox fails with 'hint'
+ while(ctx.getError());
+}
+
+function makeLostContextSimulatingCanvas(canvas) {
+ var unwrappedContext_;
+ var wrappedContext_;
+ var onLost_ = [];
+ var onRestored_ = [];
+ var wrappedContext_ = {};
+ var contextId_ = 1;
+ var contextLost_ = false;
+ var resourceId_ = 0;
+ var resourceDb_ = [];
+ var numCallsToLoseContext_ = 0;
+ var numCalls_ = 0;
+ var canRestore_ = false;
+ var restoreTimeout_ = 0;
+
+ // Holds booleans for each GL error so can simulate errors.
+ var glErrorShadow_ = { };
+
+ canvas.getContext = function(f) {
+ return function() {
+ var ctx = f.apply(canvas, arguments);
+ // Did we get a context and is it a WebGL context?
+ if (ctx instanceof WebGLRenderingContext) {
+ if (ctx != unwrappedContext_) {
+ if (unwrappedContext_) {
+ throw "got different context"
+ }
+ unwrappedContext_ = ctx;
+ wrappedContext_ = makeLostContextSimulatingContext(unwrappedContext_);
+ }
+ return wrappedContext_;
+ }
+ return ctx;
+ }
+ }(canvas.getContext);
+
+ function wrapEvent(listener) {
+ if (typeof(listener) == "function") {
+ return listener;
+ } else {
+ return function(info) {
+ listener.handleEvent(info);
+ }
+ }
+ }
+
+ var addOnContextLostListener = function(listener) {
+ onLost_.push(wrapEvent(listener));
+ };
+
+ var addOnContextRestoredListener = function(listener) {
+ onRestored_.push(wrapEvent(listener));
+ };
+
+
+ function wrapAddEventListener(canvas) {
+ var f = canvas.addEventListener;
+ canvas.addEventListener = function(type, listener, bubble) {
+ switch (type) {
+ case 'webglcontextlost':
+ addOnContextLostListener(listener);
+ break;
+ case 'webglcontextrestored':
+ addOnContextRestoredListener(listener);
+ break;
+ default:
+ f.apply(canvas, arguments);
+ }
+ };
+ }
+
+ wrapAddEventListener(canvas);
+
+ canvas.loseContext = function() {
+ if (!contextLost_) {
+ contextLost_ = true;
+ numCallsToLoseContext_ = 0;
+ ++contextId_;
+ while (unwrappedContext_.getError());
+ clearErrors();
+ glErrorShadow_[unwrappedContext_.CONTEXT_LOST_WEBGL] = true;
+ var event = makeWebGLContextEvent("context lost");
+ var callbacks = onLost_.slice();
+ setTimeout(function() {
+ //log("numCallbacks:" + callbacks.length);
+ for (var ii = 0; ii < callbacks.length; ++ii) {
+ //log("calling callback:" + ii);
+ callbacks[ii](event);
+ }
+ if (restoreTimeout_ >= 0) {
+ setTimeout(function() {
+ canvas.restoreContext();
+ }, restoreTimeout_);
+ }
+ }, 0);
+ }
+ };
+
+ canvas.restoreContext = function() {
+ if (contextLost_) {
+ if (onRestored_.length) {
+ setTimeout(function() {
+ if (!canRestore_) {
+ throw "can not restore. webglcontestlost listener did not call event.preventDefault";
+ }
+ freeResources();
+ resetToInitialState(unwrappedContext_);
+ contextLost_ = false;
+ numCalls_ = 0;
+ canRestore_ = false;
+ var callbacks = onRestored_.slice();
+ var event = makeWebGLContextEvent("context restored");
+ for (var ii = 0; ii < callbacks.length; ++ii) {
+ callbacks[ii](event);
+ }
+ }, 0);
+ }
+ }
+ };
+
+ canvas.loseContextInNCalls = function(numCalls) {
+ if (contextLost_) {
+ throw "You can not ask a lost contet to be lost";
+ }
+ numCallsToLoseContext_ = numCalls_ + numCalls;
+ };
+
+ canvas.getNumCalls = function() {
+ return numCalls_;
+ };
+
+ canvas.setRestoreTimeout = function(timeout) {
+ restoreTimeout_ = timeout;
+ };
+
+ function isWebGLObject(obj) {
+ //return false;
+ return (obj instanceof WebGLBuffer ||
+ obj instanceof WebGLFramebuffer ||
+ obj instanceof WebGLProgram ||
+ obj instanceof WebGLRenderbuffer ||
+ obj instanceof WebGLShader ||
+ obj instanceof WebGLTexture);
+ }
+
+ function checkResources(args) {
+ for (var ii = 0; ii < args.length; ++ii) {
+ var arg = args[ii];
+ if (isWebGLObject(arg)) {
+ return arg.__webglDebugContextLostId__ == contextId_;
+ }
+ }
+ return true;
+ }
+
+ function clearErrors() {
+ var k = Object.keys(glErrorShadow_);
+ for (var ii = 0; ii < k.length; ++ii) {
+ delete glErrorShadow_[k];
+ }
+ }
+
+ function loseContextIfTime() {
+ ++numCalls_;
+ if (!contextLost_) {
+ if (numCallsToLoseContext_ == numCalls_) {
+ canvas.loseContext();
+ }
+ }
+ }
+
+ // Makes a function that simulates WebGL when out of context.
+ function makeLostContextFunctionWrapper(ctx, functionName) {
+ var f = ctx[functionName];
+ return function() {
+ // log("calling:" + functionName);
+ // Only call the functions if the context is not lost.
+ loseContextIfTime();
+ if (!contextLost_) {
+ //if (!checkResources(arguments)) {
+ // glErrorShadow_[wrappedContext_.INVALID_OPERATION] = true;
+ // return;
+ //}
+ var result = f.apply(ctx, arguments);
+ return result;
+ }
+ };
+ }
+
+ function freeResources() {
+ for (var ii = 0; ii < resourceDb_.length; ++ii) {
+ var resource = resourceDb_[ii];
+ if (resource instanceof WebGLBuffer) {
+ unwrappedContext_.deleteBuffer(resource);
+ } else if (resource instanceof WebGLFramebuffer) {
+ unwrappedContext_.deleteFramebuffer(resource);
+ } else if (resource instanceof WebGLProgram) {
+ unwrappedContext_.deleteProgram(resource);
+ } else if (resource instanceof WebGLRenderbuffer) {
+ unwrappedContext_.deleteRenderbuffer(resource);
+ } else if (resource instanceof WebGLShader) {
+ unwrappedContext_.deleteShader(resource);
+ } else if (resource instanceof WebGLTexture) {
+ unwrappedContext_.deleteTexture(resource);
+ }
+ }
+ }
+
+ function makeWebGLContextEvent(statusMessage) {
+ return {
+ statusMessage: statusMessage,
+ preventDefault: function() {
+ canRestore_ = true;
+ }
+ };
+ }
+
+ return canvas;
+
+ function makeLostContextSimulatingContext(ctx) {
+ // copy all functions and properties to wrapper
+ for (var propertyName in ctx) {
+ if (typeof ctx[propertyName] == 'function') {
+ wrappedContext_[propertyName] = makeLostContextFunctionWrapper(
+ ctx, propertyName);
+ } else {
+ makePropertyWrapper(wrappedContext_, ctx, propertyName);
+ }
+ }
+
+ // Wrap a few functions specially.
+ wrappedContext_.getError = function() {
+ loseContextIfTime();
+ if (!contextLost_) {
+ var err;
+ while (err = unwrappedContext_.getError()) {
+ glErrorShadow_[err] = true;
+ }
+ }
+ for (var err in glErrorShadow_) {
+ if (glErrorShadow_[err]) {
+ delete glErrorShadow_[err];
+ return err;
+ }
+ }
+ return wrappedContext_.NO_ERROR;
+ };
+
+ var creationFunctions = [
+ "createBuffer",
+ "createFramebuffer",
+ "createProgram",
+ "createRenderbuffer",
+ "createShader",
+ "createTexture"
+ ];
+ for (var ii = 0; ii < creationFunctions.length; ++ii) {
+ var functionName = creationFunctions[ii];
+ wrappedContext_[functionName] = function(f) {
+ return function() {
+ loseContextIfTime();
+ if (contextLost_) {
+ return null;
+ }
+ var obj = f.apply(ctx, arguments);
+ obj.__webglDebugContextLostId__ = contextId_;
+ resourceDb_.push(obj);
+ return obj;
+ };
+ }(ctx[functionName]);
+ }
+
+ var functionsThatShouldReturnNull = [
+ "getActiveAttrib",
+ "getActiveUniform",
+ "getBufferParameter",
+ "getContextAttributes",
+ "getAttachedShaders",
+ "getFramebufferAttachmentParameter",
+ "getParameter",
+ "getProgramParameter",
+ "getProgramInfoLog",
+ "getRenderbufferParameter",
+ "getShaderParameter",
+ "getShaderInfoLog",
+ "getShaderSource",
+ "getTexParameter",
+ "getUniform",
+ "getUniformLocation",
+ "getVertexAttrib"
+ ];
+ for (var ii = 0; ii < functionsThatShouldReturnNull.length; ++ii) {
+ var functionName = functionsThatShouldReturnNull[ii];
+ wrappedContext_[functionName] = function(f) {
+ return function() {
+ loseContextIfTime();
+ if (contextLost_) {
+ return null;
+ }
+ return f.apply(ctx, arguments);
+ }
+ }(wrappedContext_[functionName]);
+ }
+
+ var isFunctions = [
+ "isBuffer",
+ "isEnabled",
+ "isFramebuffer",
+ "isProgram",
+ "isRenderbuffer",
+ "isShader",
+ "isTexture"
+ ];
+ for (var ii = 0; ii < isFunctions.length; ++ii) {
+ var functionName = isFunctions[ii];
+ wrappedContext_[functionName] = function(f) {
+ return function() {
+ loseContextIfTime();
+ if (contextLost_) {
+ return false;
+ }
+ return f.apply(ctx, arguments);
+ }
+ }(wrappedContext_[functionName]);
+ }
+
+ wrappedContext_.checkFramebufferStatus = function(f) {
+ return function() {
+ loseContextIfTime();
+ if (contextLost_) {
+ return wrappedContext_.FRAMEBUFFER_UNSUPPORTED;
+ }
+ return f.apply(ctx, arguments);
+ };
+ }(wrappedContext_.checkFramebufferStatus);
+
+ wrappedContext_.getAttribLocation = function(f) {
+ return function() {
+ loseContextIfTime();
+ if (contextLost_) {
+ return -1;
+ }
+ return f.apply(ctx, arguments);
+ };
+ }(wrappedContext_.getAttribLocation);
+
+ wrappedContext_.getVertexAttribOffset = function(f) {
+ return function() {
+ loseContextIfTime();
+ if (contextLost_) {
+ return 0;
+ }
+ return f.apply(ctx, arguments);
+ };
+ }(wrappedContext_.getVertexAttribOffset);
+
+ wrappedContext_.isContextLost = function() {
+ return contextLost_;
+ };
+
+ return wrappedContext_;
+ }
+}
+
+return {
+ /**
+ * Initializes this module. Safe to call more than once.
+ * @param {!WebGLRenderingContext} ctx A WebGL context. If
+ }
+ * you have more than one context it doesn't matter which one
+ * you pass in, it is only used to pull out constants.
+ */
+ 'init': init,
+
+ /**
+ * Returns true or false if value matches any WebGL enum
+ * @param {*} value Value to check if it might be an enum.
+ * @return {boolean} True if value matches one of the WebGL defined enums
+ */
+ 'mightBeEnum': mightBeEnum,
+
+ /**
+ * Gets an string version of an WebGL enum.
+ *
+ * Example:
+ * WebGLDebugUtil.init(ctx);
+ * var str = WebGLDebugUtil.glEnumToString(ctx.getError());
+ *
+ * @param {number} value Value to return an enum for
+ * @return {string} The string version of the enum.
+ */
+ 'glEnumToString': glEnumToString,
+
+ /**
+ * Converts the argument of a WebGL function to a string.
+ * Attempts to convert enum arguments to strings.
+ *
+ * Example:
+ * WebGLDebugUtil.init(ctx);
+ * var str = WebGLDebugUtil.glFunctionArgToString('bindTexture', 0, gl.TEXTURE_2D);
+ *
+ * would return 'TEXTURE_2D'
+ *
+ * @param {string} functionName the name of the WebGL function.
+ * @param {number} argumentIndx the index of the argument.
+ * @param {*} value The value of the argument.
+ * @return {string} The value as a string.
+ */
+ 'glFunctionArgToString': glFunctionArgToString,
+
+ /**
+ * Converts the arguments of a WebGL function to a string.
+ * Attempts to convert enum arguments to strings.
+ *
+ * @param {string} functionName the name of the WebGL function.
+ * @param {number} args The arguments.
+ * @return {string} The arguments as a string.
+ */
+ 'glFunctionArgsToString': glFunctionArgsToString,
+
+ /**
+ * Given a WebGL context returns a wrapped context that calls
+ * gl.getError after every command and calls a function if the
+ * result is not NO_ERROR.
+ *
+ * You can supply your own function if you want. For example, if you'd like
+ * an exception thrown on any GL error you could do this
+ *
+ * function throwOnGLError(err, funcName, args) {
+ * throw WebGLDebugUtils.glEnumToString(err) +
+ * " was caused by call to " + funcName;
+ * };
+ *
+ * ctx = WebGLDebugUtils.makeDebugContext(
+ * canvas.getContext("webgl"), throwOnGLError);
+ *
+ * @param {!WebGLRenderingContext} ctx The webgl context to wrap.
+ * @param {!function(err, funcName, args): void} opt_onErrorFunc The function
+ * to call when gl.getError returns an error. If not specified the default
+ * function calls console.log with a message.
+ * @param {!function(funcName, args): void} opt_onFunc The
+ * function to call when each webgl function is called. You
+ * can use this to log all calls for example.
+ */
+ 'makeDebugContext': makeDebugContext,
+
+ /**
+ * Given a canvas element returns a wrapped canvas element that will
+ * simulate lost context. The canvas returned adds the following functions.
+ *
+ * loseContext:
+ * simulates a lost context event.
+ *
+ * restoreContext:
+ * simulates the context being restored.
+ *
+ * lostContextInNCalls:
+ * loses the context after N gl calls.
+ *
+ * getNumCalls:
+ * tells you how many gl calls there have been so far.
+ *
+ * setRestoreTimeout:
+ * sets the number of milliseconds until the context is restored
+ * after it has been lost. Defaults to 0. Pass -1 to prevent
+ * automatic restoring.
+ *
+ * @param {!Canvas} canvas The canvas element to wrap.
+ */
+ 'makeLostContextSimulatingCanvas': makeLostContextSimulatingCanvas,
+
+ /**
+ * Resets a context to the initial state.
+ * @param {!WebGLRenderingContext} ctx The webgl context to
+ * reset.
+ */
+ 'resetToInitialState': resetToInitialState
+};
+
+}();
+
--- /dev/null
+/*
+ * Copyright 2010, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+/**
+ * @fileoverview This file contains functions every webgl program will need
+ * a version of one way or another.
+ *
+ * Instead of setting up a context manually it is recommended to
+ * use. This will check for success or failure. On failure it
+ * will attempt to present an approriate message to the user.
+ *
+ * gl = WebGLUtils.setupWebGL(canvas);
+ *
+ * For animated WebGL apps use of setTimeout or setInterval are
+ * discouraged. It is recommended you structure your rendering
+ * loop like this.
+ *
+ * function render() {
+ * window.requestAnimFrame(render, canvas);
+ *
+ * // do rendering
+ * ...
+ * }
+ * render();
+ *
+ * This will call your rendering function up to the refresh rate
+ * of your display but will stop rendering if your app is not
+ * visible.
+ */
+
+WebGLUtils = function() {
+
+/**
+ * Creates the HTLM for a failure message
+ * @param {string} canvasContainerId id of container of th
+ * canvas.
+ * @return {string} The html.
+ */
+var makeFailHTML = function(msg) {
+ return '' +
+ '<table style="background-color: #8CE; width: 100%; height: 100%;"><tr>' +
+ '<td align="center">' +
+ '<div style="display: table-cell; vertical-align: middle;">' +
+ '<div style="">' + msg + '</div>' +
+ '</div>' +
+ '</td></tr></table>';
+};
+
+/**
+ * Mesasge for getting a webgl browser
+ * @type {string}
+ */
+var GET_A_WEBGL_BROWSER = '' +
+ 'This page requires a browser that supports WebGL.<br/>' +
+ '<a href="http://get.webgl.org">Click here to upgrade your browser.</a>';
+
+/**
+ * Mesasge for need better hardware
+ * @type {string}
+ */
+var OTHER_PROBLEM = '' +
+ "It doesn't appear your computer can support WebGL.<br/>" +
+ '<a href="http://get.webgl.org/troubleshooting/">Click here for more information.</a>';
+
+/**
+ * Creates a webgl context. If creation fails it will
+ * change the contents of the container of the <canvas>
+ * tag to an error message with the correct links for WebGL.
+ * @param {Element} canvas. The canvas element to create a
+ * context from.
+ * @param {WebGLContextCreationAttirbutes} opt_attribs Any
+ * creation attributes you want to pass in.
+ * @return {WebGLRenderingContext} The created context.
+ */
+var setupWebGL = function(canvas, opt_attribs) {
+ function showLink(str) {
+ var container = canvas.parentNode;
+ if (container) {
+ container.innerHTML = makeFailHTML(str);
+ }
+ };
+
+ if (!window.WebGLRenderingContext) {
+ showLink(GET_A_WEBGL_BROWSER);
+ return null;
+ }
+
+ var context = create3DContext(canvas, opt_attribs);
+ if (!context) {
+ showLink(OTHER_PROBLEM);
+ }
+ return context;
+};
+
+/**
+ * Creates a webgl context.
+ * @param {!Canvas} canvas The canvas tag to get context
+ * from. If one is not passed in one will be created.
+ * @return {!WebGLContext} The created context.
+ */
+var create3DContext = function(canvas, opt_attribs) {
+ var names = ["webgl", "experimental-webgl", "webkit-3d", "moz-webgl"];
+ var context = null;
+ for (var ii = 0; ii < names.length; ++ii) {
+ try {
+ context = canvas.getContext(names[ii], opt_attribs);
+ } catch(e) {}
+ if (context) {
+ break;
+ }
+ }
+ return context;
+}
+
+return {
+ create3DContext: create3DContext,
+ setupWebGL: setupWebGL
+};
+}();
+
+/**
+ * Provides requestAnimationFrame in a cross browser way.
+ */
+window.requestAnimFrame = (function() {
+ return window.requestAnimationFrame ||
+ window.webkitRequestAnimationFrame ||
+ window.mozRequestAnimationFrame ||
+ window.oRequestAnimationFrame ||
+ window.msRequestAnimationFrame ||
+ function(/* function FrameRequestCallback */ callback, /* DOMElement Element */ element) {
+ return window.setTimeout(callback, 1000/60);
+ };
+})();
+
+/**
+ * Provides cancelAnimationFrame in a cross browser way.
+ */
+window.cancelAnimFrame = (function() {
+ return window.cancelAnimationFrame ||
+ window.webkitCancelAnimationFrame ||
+ window.mozCancelAnimationFrame ||
+ window.oCancelAnimationFrame ||
+ window.msCancelAnimationFrame ||
+ window.clearTimeout;
+})();
+
+
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Liu, Xin <xinx.liu@intel.com>
+
+*/
+
+var ORIGIN_SPEED = 0.5;
+var multiple = 5;
+var isRunning = false;
+var isInit = true;
+var testFlag = {
+ status: false,
+ direction: false,
+ size:false,
+ speed:false
+};
+
+function start() {
+ var c = document.getElementById("canvas");
+ canvas = c;
+
+ var gl = init();
+ if (!gl) {
+ return;
+ }
+ incAngle = ORIGIN_SPEED*multiple;
+ currentAngle = 0;
+
+ f();
+ isRunning = true;
+}
+var f = function() {
+ drawPicture(gl);
+ requestId = window.requestAnimFrame(f, canvas);
+};
+
+function handleContextLost(event) {
+ if (event) {
+ event.preventDefault();
+ }
+ if (requestId !== undefined) {
+ window.cancelAnimFrame(requestId);
+ requestId = undefined;
+ }
+}
+
+function handleContextRestored() {
+ init();
+ f();
+}
+
+function reStart() {
+ if (isRunning) {
+ return;
+ }
+ incAngle = bakAngle;
+ handleContextRestored();
+ isRunning = true;
+}
+
+function stop(event) {
+ if (!isRunning) {
+ return;
+ }
+ bakAngle = incAngle;
+ incAngle = 0;
+ handleContextLost(event);
+ isRunning = false;
+}
+
+function resume() {
+ if(!isRunning) {
+ return;
+ }
+ stop();
+ reStart();
+}
+
+function setToRight() {
+ if(incAngle < 0) {
+ incAngle = -incAngle;
+ }
+ resume();
+}
+
+function setToLeft() {
+ if(incAngle > 0) {
+ incAngle = -incAngle;
+ }
+ resume();
+}
+
+function setSize(value) {
+ if(value < 7 || value > 30) {
+ return;
+ }
+ if (value != viewDistance){
+ viewDistance = value;
+ };
+ resume();
+}
+
+function setSpeed(value) {
+ if(value <= 0 || value > 10) {
+ return;
+ }
+ if(incAngle > 0) {
+ incAngle = ORIGIN_SPEED*value;
+ } else {
+ incAngle = -ORIGIN_SPEED*value;
+ }
+ resume();
+}
+
+function checkEnable() {
+ if (testFlag.status && testFlag.direction
+ && testFlag.size && testFlag.speed) {
+ EnablePassButton();
+ }
+}
+
+$(document).ready(function(){
+ start();
+ // animation-left-right status changes
+ $("input[type='radio']").bind( "change", function(event, ui) {
+ if (this.value == "left") {
+ setToLeft();
+ testFlag.direction = true;
+ checkEnable();
+ } else {
+ setToRight();
+ }
+ });
+ DisablePassButton();
+});
--- /dev/null
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Slider tooltip extension
+//>>label: Slidertooltip
+//>>group: Forms
+//>>css.theme: ../css/themes/default/jquery.mobile.theme.css
+//>>css.structure: ../css/structure/jquery.mobile.slider.tooltip.css
+
+//define( [ "jquery", "./slider" ], function( $ ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, undefined ) {
+
+$.widget( "mobile.slider", $.mobile.slider, {
+ options: {
+ popupEnabled: false,
+ showValue: false
+ },
+
+ _create: function() {
+ var o = this.options,
+ popup = $( "<div></div>", {
+ class: "ui-slider-popup ui-shadow ui-corner-all ui-body-" + ( o.theme ? o.theme : $.mobile.getInheritedTheme( this.element, "c" ) )
+ });
+
+ this._super();
+
+ $.extend( this, {
+ _currentValue: null,
+ _popup: popup,
+ _popupVisible: false,
+ _handleText: this.handle.find( ".ui-btn-text" )
+ });
+
+ this.slider.before( popup );
+ popup.hide();
+
+ this._on( this.handle, { "vmousedown" : "_showPopup" } );
+ this._on( this.slider.add( $.mobile.document ), { "vmouseup" : "_hidePopup" } );
+ this._refresh();
+ },
+
+ // position the popup centered 5px above the handle
+ _positionPopup: function() {
+ var dstOffset = this.handle.offset();
+ this._popup.offset( {
+ left: dstOffset.left + ( this.handle.width() - this._popup.width() ) / 2,
+ top: dstOffset.top - this._popup.outerHeight() - 5
+ });
+ },
+
+ _setOption: function( key, value ) {
+ this._super( key, value );
+
+ if ( key === "showValue" ) {
+ if ( value ) {
+ this._handleText.html( this._value() ).show();
+ } else {
+ this._handleText.hide();
+ }
+ }
+ },
+
+ // show value on the handle and in popup
+ refresh: function() {
+ this._super.apply( this, arguments );
+
+ // necessary because slider's _create() calls refresh(), and that lands
+ // here before our own _create() has even run
+ if ( !this._popup ) {
+ return;
+ }
+
+ this._refresh();
+ },
+
+ _refresh: function() {
+ var o = this.options, newValue;
+
+ if ( o.popupEnabled ) {
+ // remove the title attribute from the handle (which is
+ // responsible for the annoying tooltip); NB we have
+ // to do it here as the jqm slider sets it every time
+ // the slider's value changes :(
+ this.handle.removeAttr( 'title' );
+ }
+
+ newValue = this._value();
+ if ( newValue === this._currentValue ) {
+ return;
+ }
+ this._currentValue = newValue;
+
+ var ID = this.element[0].id;
+ if (ID == "slider-1") {
+ var value = 7 + 23*(4 - (parseInt(newValue, 10) - 1))/5;
+ setSize(value);
+ if (parseInt(newValue, 10) != 3) {
+ testFlag.size = true;
+ checkEnable();
+ }
+ } else if (ID == "speed-1") {
+ setSpeed(parseInt(newValue, 10));
+ if (parseInt(newValue, 10) != 5) {
+ testFlag.speed = true;
+ checkEnable();
+ }
+ } else if (ID == "flip-1") {
+ if (newValue == "0") {
+ stop();
+ $("input[type='radio']").checkboxradio('disable');
+ $("#slider-1").slider('disable');
+ $("#speed-1").slider('disable');
+ testFlag.status = true;
+ checkEnable();
+ } else if (newValue == "1"){
+ if (!isInit) {
+ reStart();
+ $("input[type='radio']").checkboxradio('enable');
+ $("#slider-1").slider('enable');
+ $("#speed-1").slider('enable');
+ } else {
+ isInit = false;
+ }
+ }
+ }
+ if ( o.popupEnabled ) {
+ this._positionPopup();
+ //this._popup.html( newValue );
+ this._popup.html( Math.round(newValue) );
+ }
+
+ if ( o.showValue ) {
+ //this._handleText.html( newValue );
+ this._handleText.html( Math.round(newValue) );
+ }
+ },
+
+ _showPopup: function() {
+ if ( this.options.popupEnabled && !this._popupVisible ) {
+ this._handleText.hide();
+ this._popup.show();
+ this._positionPopup();
+ this._popupVisible = true;
+ }
+ },
+
+ _hidePopup: function() {
+ if ( this.options.popupEnabled && this._popupVisible ) {
+ this._handleText.show();
+ this._popup.hide();
+ this._popupVisible = false;
+ }
+ }
+});
+
+})( jQuery );
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Lin, Wanming <wanmingx.lin@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width">
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../css/main.css" />
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/tests.js"></script>
+ <script src="js/main.js"></script>
+ <style type="text/css">
+ .d{
+ border: 1px solid #000;
+ width:100%;
+ height:200px;
+ }
+ .d li{
+ margin: 10px 5px;
+ }
+ .d p{
+ margin: 10px 25px;
+ }
+ </style>
+ </head>
+ <body>
+ <div data-role="header">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div data-role= "content">
+ <div class="d">
+ <ul id="coordinate">
+ <li id="x">X:</li>
+ <li id="y">Y:</li>
+ <li id="z">Z:</li>
+ </ul>
+ <p>X, Y, Z will be changed while moving the device, otherwise they will be zero</p>
+ </div>
+ </div>
+ <div data-role="footer" data-position="fixed">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font class="fontSize">
+ <p>Test Purpose: </p>
+ <p>Verifies the functionality of Accelerometer. And detects the device moving direction is x axis or y axis or z axis.</p>
+ <p>Expected Result: </p>
+ <p>Test passes if the detected direction reflects the actual device moving direction.</p>
+ </font>
+ </div>
+ </body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Lin, Wanming <wanmingx.lin@intel.com>
+
+*/
+window.addEventListener(
+ "devicemotion",
+ function(evt) {
+ var coordinate = evt.acceleration;
+ jQuery("#x").text("X: " + Math.round(coordinate.x-0));
+ jQuery("#y").text("Y: " + Math.round(coordinate.y-0));
+ jQuery("#z").text("Z: " + Math.round(coordinate.z-0));
+ }, false);
--- /dev/null
+Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+Copyright (c) 2012 Intel Corporation.
+Except as noted, this software is licensed under Apache License, Version 2 or BSD-3-Clause License.
+Please, see the LICENSE.Apache-2.0 file for Apache License, Version 2 terms and conditions
+or the LICENSE.BSD-3 file for BSD-3-Clause License.
+
+Following resources are licensed under its own license.
+
+res/TestAlarm :
+Copyright (c) 2012 Samsung Electronics Co., Ltd. All right reserved.
+The above resource files are licensed under Creative Commons Attribution 3.0.
+Please see the LICENSE.CC-BY-3.0 for Creative Commons Attribution 3.0 terms and conditions.
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Samsung Electronics 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.
+
+Authors:
+ Choi, Jongheon <j-h.choi@samsung.com>
+
+-->
+<html>
+<head>
+<meta charset="utf-8" />
+<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+<link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+<script src="../../js/thirdparty/jquery.js"></script>
+<script src="../../js/thirdparty/jquery.mobile.js"></script>
+<script src="../../js/tests.js"></script>
+<script src="js/main.js"></script>
+</head>
+<body>
+ <div data-role="page" id="main">
+ <div data-role="header" data-position="fixed" data-tap-toggle="false">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div id="content">
+ <ul data-role="listview">
+ <li data-role="list-divider">AlarmTest Install</li>
+ <li>
+ <div data-role="button" id="install" style="height:40px; line-height:20px;">AlarmTest Install</div>
+ </li>
+ <li data-role="list-divider">Alarm List</li>
+ </ul>
+ <ul data-role="listview" id="alarm-all-list"></ul>
+ <ul data-role="listview">
+ <li data-role="list-divider">Absolute Alarm Time</li>
+ <li>
+ <input type="datetime" name="alarm-time" id="alarm-time" value="0000-00-00T00:00Z" />
+ </li>
+ <li data-role="list-divider">Absolute Alarm Repeat interval(sec)</li>
+ <li><input id="absolute-alarm-period" name="absolute-alarm-period" data-popupenabled="false" type="range" value="50" min="0" max="99" /></li>
+ <li data-role="list-divider">Absolute Alarm Add</li>
+ <li>
+ <div data-role="button" id="absolute-alarm-save">Absolute Save</div>
+ </li>
+ <li data-role="list-divider">Relative Alarm Delay(sec)</li>
+ <li><input id="relative-alarm-delay" name="relative-alarm-delay" data-popupenabled="false" type="range" value="50" min="0" max="99" /></li>
+ <li data-role="list-divider">Relative Alarm Repeat interval(sec)</li>
+ <li><input id="relative-alarm-period" name="relative-alarm-period" data-popupenabled="false" type="range" value="50" min="0" max="99" /></li>
+ <li data-role="list-divider">Relative Alarm Add</li>
+ <li>
+ <div data-role="button" id="relative-alarm-save">Relative Save</div>
+ </li>
+ </ul>
+ <ul data-role="listview">
+ <li data-role="list-divider">Alarm Delete</li>
+ <li>
+ <div data-role="button" id="alarm-remove-all">Delete all</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font style="font-size:85%">
+ <p>Check if an application is launched on time</p><br>
+ <p>1. Install AlarmTest</p>
+ <p>2. Set absolute time</p>
+ <p>3. Set an interval</p>
+ <p>4. Save an absolute button</p>
+ <p>5. Watch AlarmTest is launched on time</p>
+ <p>6. Watch AlarmTest is launched after the interval</p>
+ <p>7. Remove the alarm</p>
+ <p>8. Set delay</p>
+ <p>9. Set an interval</p>
+ <p>10. Save a relative alarm</p>
+ <p>11. Watch AlarmTest is launched on time</p>
+ <p>12. Watch AlarmTest is launched after the interval</p>
+ </font>
+ </div>
+ </div>
+</body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Samsung Electronics 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.
+
+Authors:
+ Choi, Jongheon <j-h.choi@samsung.com>
+
+*/
+
+var installUrl;
+$(document).delegate("#main", "pageinit", function() {
+ $("#alarm-remove-all").bind("vclick", function() {
+ removeAll();
+ return false;
+ });
+ $("#alarm-all-list").delegate("li", "vclick", function() {
+ alarmInfo($(this).data("id"));
+ return false;
+ });
+ $("#alarm-all-list").delegate("div", "vclick", function() {
+ removeAlarm($(this).parent().data("id"));
+ return false;
+ });
+ $("#install").bind("vclick", function() {
+ install_(installUrl);
+ $("#absolute-alarm-save").removeClass("ui-disabled");
+ $("#relative-alarm-save").removeClass("ui-disabled");
+ return false;
+ });
+ $("#absolute-alarm-save").bind("vclick", function() {
+ addAlarmAbsolute();
+ $("#alarm-remove-all").removeClass("ui-disabled");
+ return false;
+ });
+ $("#relative-alarm-save").bind("vclick", function() {
+ addAlarmRelative();
+ $("#alarm-remove-all").removeClass("ui-disabled");
+ return false;
+ });
+ $("#absolute-alarm-save").addClass("ui-disabled");
+ $("#relative-alarm-save").addClass("ui-disabled");
+ $("#alarm-remove-all").addClass("ui-disabled");
+ try {
+ tizen.package.setPackageInfoEventListener(packageEventCallback);
+ } catch (e) {
+ alert("Exception: " + e.message);
+ }
+ displayAlarms();
+ alarmPre();
+});
+
+function fileURI() {
+ var documentsDir;
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ if(files[i].name === "TestAlarm.wgt")
+ {
+ var Url1 = files[i].toURI();
+ installUrl = Url1.replace("file:///", "/");
+ }
+ }
+ }
+
+ function onerror(error) {
+ alert("The error " + error.message + " occurred when listing the files in the selected folder");
+ }
+
+ tizen.filesystem.resolve(
+ 'documents',
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error " + e.message);
+ }, "r"
+ );
+}
+
+function displayAlarms() {
+ var alarmsArray = tizen.alarm.getAll();
+ var period, str = "";
+
+ for (var i = 0; i < alarmsArray.length; i++) {
+ if (alarmsArray[i].period) {
+ period = alarmsArray[i].period + " sec";
+ } else {
+ period = "none";
+ }
+
+ if (alarmsArray[i] instanceof tizen.AlarmAbsolute) {
+ var d = alarmsArray[i].date,
+ m = d.getMinutes();
+
+ str += '<li data-id="'
+ + alarmsArray[i].id
+ + '">'
+ + (d.getMonth() + 1)
+ + '/'
+ + d.getDate()
+ + '/'
+ + d.getFullYear()
+ + ' '
+ + d.getHours()
+ + ':'
+ + ((m < 10) ? "0" + m : m)
+ + ' Absolute alarm<br>(Period: '
+ + period
+ + ') <div data-role="button" data-inline="true">Delete</div></li>';
+ } else if (alarmsArray[i] instanceof tizen.AlarmRelative) {
+ str += '<li data-id="'
+ + alarmsArray[i].id
+ + '">'
+ + alarmsArray[i].delay
+ + ' sec Relative alarm<br>(Period: '
+ + period
+ + ') <div data-role="button" data-inline="true">Delete</div></li>';
+ } else {
+ alert("Wrong alarm instance");
+ break;
+ }
+ }
+ $("#alarm-all-list").html(str).trigger("create").listview("refresh");
+}
+
+function addAlarm(alarm) {
+ var arg;
+ arg = new tizen.ApplicationControl("http://tizen.org/appcontrol/operation/view",
+ null,
+ null,
+ null,
+ [new tizen.ApplicationControlData("id", ["bhvtcalarm.AlarmTest"])]);
+
+ try {
+ tizen.alarm.add(alarm, "bhvtcalarm.AlarmTest", arg);
+ } catch (e) {
+ alert("error: " + e.message);
+ }
+}
+
+function addAlarmAbsolute() {
+ var period = parseInt($("#absolute-alarm-period").prop("value")),
+ time = $("#alarm-time").prop("value"),
+ year, month, date, hours, minutes, splits, d, t;
+
+ if (time === null || time === "" || period < 0) {
+ alert("Getting alarm settings failed");
+ }
+ else
+ {
+ splits = time.split("T");
+ d = splits[0].split("-");
+ t = splits[1].split(":");
+
+ year = parseInt(d[0]);
+ month = parseInt(d[1]) - 1;
+ date = parseInt(d[2]);
+ hours = parseInt(t[0]);
+ minutes = parseInt(t[1]);
+
+ var inputDate = new Date(year, month, date, hours, minutes, 0, 0);
+ var myAlarm = new tizen.AlarmAbsolute(inputDate, (period > 0 ? period : null));
+
+ addAlarm(myAlarm);
+ alert("Absolute Alarm Added");
+ displayAlarms();
+ }
+}
+
+function addAlarmRelative() {
+ var period = parseInt($("#relative-alarm-period").prop("value")),
+ delay = parseInt($("#relative-alarm-delay").prop("value"));
+
+ if ((delay < 0) || (period < 0)) {
+ alert("Getting alarm settings failed");
+ }
+ else
+ {
+ var myAlarm = new tizen.AlarmRelative(delay, period);
+
+ addAlarm(myAlarm);
+ alert("Relative Alarm Added");
+ displayAlarms();
+ }
+}
+
+function removeAll() {
+ tizen.alarm.removeAll();
+ alert("Alarm delete all");
+ displayAlarms();
+}
+
+function removeAlarm(id) {
+ try {
+ tizen.alarm.remove(id);
+ alert("Alarm delete");
+ } catch (e) {
+ alert("Alarm remove failed. The once alarm might be already removed automatically");
+ }
+ displayAlarms();
+}
+
+function alarmInfo(id) {
+ var alarm = tizen.alarm.get(id);
+
+ if (alarm) {
+ if (alarm instanceof tizen.AlarmAbsolute) {
+ alert("Next scheduled alarm is " + alarm.getNextScheduledDate());
+ } else {
+ alert("Remaining seconds is " + alarm.getRemainingSeconds() + " SECS");
+ }
+ } else {
+ alert("Alarm info retrieving failed<br/>This once alarm might be already removed automatically");
+ displayAlarms();
+ }
+}
+
+function install_(url) {
+ var onInstallationSuccess = {
+ onprogress: function(packageId, percentage)
+ {
+ console.log("On installation(" + packageId + "): progress(" + percentage + ")");
+ document.getElementById("install").innerHTML = '<div data-role="button" id="install" style="height:40px; line-height:40px;">Installing... ' + percentage + "%" + '</div>';
+ },
+ oncomplete: function(packageId)
+ {
+ console.log("Installation(" + packageId + ") Complete");
+ document.getElementById("install").innerHTML = '<div data-role="button" id="install" style="height:40px; line-height:40px;">AlarmTest Install</div>';
+ }
+ }
+
+ var onError = function (err) {
+ alert("Error occured on installation : " + err.message);
+ }
+
+ try {
+ tizen.package.install(url, onInstallationSuccess, onError);
+ } catch (e) {
+ alert("Exception: " + e.name);
+ }
+}
+
+var packageEventCallback = {
+ oninstalled: function(packageInfo) {
+ alert("The package " + packageInfo.name + " is installed");
+ install_flag = true;
+ },
+ onupdated: function(packageInfo) {
+ alert("The package " + packageInfo.name + " is updated");
+ },
+ onuninstalled: function(packageId) {
+ alert("The package " + packageId + " is uninstalled");
+ install_flag = false;
+ }
+};
+
+function alarmPre() {
+ var documentsDir;
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ if(files[i].name === "TestAlarm")
+ {
+ documentsDir.copyTo(
+ files[i].fullPath,
+ "documents/TestAlarm.wgt",
+ false,
+ function() {
+ console.log("Alarm Precondition Success!");
+ });
+ }
+ }
+ fileURI();
+ }
+
+ function onerror(error) {
+ alert("The error " + error.message + " occurred when listing the files in the selected folder");
+ }
+
+ tizen.filesystem.resolve(
+ 'wgt-package/tests/Alarm/res/',
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error " + e.message);
+ }, "r"
+ );
+}
--- /dev/null
+6<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Hao, Yunfei <yunfeix.hao@intel.com>
+
+-->
+<html>
+<head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../css/main.css" />
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/tests.js"></script>
+ <script src="js/main.js"></script>
+</head>
+<body>
+ <div data-role="page" id="main">
+ <div data-role="header" data-position="fixed" data-tap-toggle="false">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div id="content">
+ <ul data-role="listview">
+ <li data-role="list-divider">Test the custom feature</li>
+ <li>
+ <div data-role="button" id="install1" class="wgtButton">Install</div>
+ </li>
+ <li>
+ <div data-role="button" id="launch1" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Test the regular feature</li>
+ <li>
+ <div data-role="button" id="install2" class="wgtButton">Install</div>
+ </li>
+ <li>
+ <div data-role="button" id="launch2" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Packages Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Purpose: </p>
+ <p>Verifies the functionality of launching the Application which control by user instead of system. Tests the two test Applications could be launched by App ID or customized AppControl's "operation" attribute by user.</p>
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the custom package.</li>
+ <li>Click the "Launch" button to launch the custom package.</li>
+ <li>Click the "Install" button to install the regular package.</li>
+ <li>Click the "Launch" button to launch the regular package.</li>
+ <li>Click the "Uninstall" button to uninstall the two widgets.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if the test Applications launch successfully.</p>
+ </font>
+ </div>
+ </div>
+</body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.sandbox
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Hao, Yunfei <yunfeix.hao@intel.com>
+
+*/
+var installUrl1;
+var installUrl2;
+
+$(document).delegate("#main", "pageinit", function() {
+ DisablePassButton();
+
+ $("#install1").bind("vclick", function() {
+ install(installUrl1, "install1");
+ });
+ $("#install2").bind("vclick", function() {
+ install(installUrl2, "install2");
+ });
+ $("#launch1").bind("vclick", function() {
+ launch("app-control1");
+ if(checkInstalledPkg("apcontrol2")) {
+ $("#install2").addClass("ui-disabled");
+ $("#launch2").removeClass("ui-disabled");
+ } else {
+ $("#install2").removeClass("ui-disabled");
+ }
+ });
+ $("#launch2").bind("vclick", function() {
+ launch("app-control2");
+ $("#uninstall").removeClass("ui-disabled");
+ });
+ $("#uninstall").bind("vclick", function() {
+ ["apcontrol1", "apcontrol2"].forEach(function(package_id) {
+ if(checkInstalledPkg(package_id)) {
+ setTimeout(function() {
+ uninstall(package_id);
+ }, 1000);
+ }
+ });
+ });
+ try {
+ tizen.package.setPackageInfoEventListener(packageEventCallback);
+ } catch (e) {
+ alert("Exception: " + e.message);
+ }
+ packagePre();
+ $("#launch1").addClass("ui-disabled");
+ $("#launch2").addClass("ui-disabled");
+ $("#install2").addClass("ui-disabled");
+ $("#uninstall").addClass("ui-disabled");
+
+ if(checkInstalledPkg("apcontrol1")) {
+ $("#install1").addClass("ui-disabled");
+ $("#launch1").removeClass("ui-disabled");
+ }
+});
+
+var packageEventCallback = {
+ oninstalled: function(packageInfo) {
+ alert("The package " + packageInfo.name + " is installed");
+ },
+ onupdated: function(packageInfo) {
+ alert("The package " + packageInfo.name + " is updated");
+ },
+ onuninstalled: function(packageId) {
+ alert("The package " + packageId + " is uninstalled");
+ }
+};
+
+function fileURI() {
+ var documentsDir;
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ if(files[i].name == "app_control_custom_wgt.wgt")
+ {
+ var Url1 = files[i].toURI();
+ installUrl1 = Url1.replace("file:///", "/");
+ }
+ if(files[i].name == "app_control_regular_wgt.wgt")
+ {
+ var Url2 = files[i].toURI();
+ installUrl2 = Url2.replace("file:///", "/");
+ }
+ }
+ }
+
+ function onerror(error) {
+ alert("The error " + error.message + " occurred when listing the files in the selected folder");
+ }
+
+ tizen.filesystem.resolve(
+ 'documents',
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error" + e.message);
+ }, "r"
+ );
+}
+
+function install(url, type) {
+
+ var onInstallationSuccess = {
+ onprogress: function(packageId, percentage)
+ {
+ console.log("On installation(" + packageId + "): progress(" + percentage + ")");
+ if(type == "install1") {
+ $("#install1").html('<div data-role="button" id="install1" style="height:40px; line-height:40px;">Installing... ' + percentage + "%" + '</div>');
+ }
+ if(type == "install2") {
+ $("#install2").html('<div data-role="button" id="install2" style="height:40px; line-height:40px;">Installing... ' + percentage + "%" + '</div>');
+ }
+ },
+ oncomplete: function(packageId)
+ {
+ console.log("Installation(" + packageId + ") Complete");
+ if(type == "install1") {
+ $("#install1").addClass("ui-disabled");
+ $("#launch1").removeClass("ui-disabled");
+ $("#install1").html('<div data-role="button" id="install1" style="height:40px; line-height:40px;">Install</div>');
+ }
+ if(type == "install2") {
+ $("#install2").addClass("ui-disabled");
+ $("#launch2").removeClass("ui-disabled");
+ $("#install2").html('<div data-role="button" id="install2" style="height:40px; line-height:40px;">Install</div>');
+ }
+ }
+ }
+
+ var onError = function (err) {
+ if (err.name != "UnknownError") {
+ alert("Error occured on installation : " + err.name);
+ }
+ }
+
+ try {
+ tizen.package.install(url, onInstallationSuccess, onError);
+ } catch(e) {
+ alert("Exception: " + e.name);
+ }
+}
+
+function uninstall(package_id) {
+
+ var onUninstallationSuccess = {
+ onprogress: function(packageId, percentage)
+ {
+ console.log("On uninstallation(" + packageId + "): progress(" + percentage + ")");
+ },
+ oncomplete: function(packageId)
+ {
+ console.log("Uninstallation(" + packageId + ") Complete");
+ if(packageId == "apcontrol1") {
+ $("#launch1").addClass("ui-disabled");
+ }
+ if(packageId == "apcontrol2") {
+ $("#launch2").addClass("ui-disabled");
+ $("#uninstall").addClass("ui-disabled");
+ EnablePassButton();
+ }
+ }
+ }
+
+ var onError = function (err) {
+ if (err.name != "UnknownError") {
+ alert("Error occured on uninstallation : " + err.name);
+ }
+ }
+
+ try {
+ tizen.package.uninstall(package_id, onUninstallationSuccess, onError);
+ } catch (e) {
+ alert("Exception: " + e.name);
+ }
+}
+
+function launch(option) {
+ function onSuccess() {
+ console.log(id + " launched successfully!");
+ }
+
+ function onError(err) {
+ alert("launch failed : " + err.message);
+ }
+
+ try {
+ if (option == "app-control1"){
+ var control;
+ var APP_CONTROL_OPERATION="http://tizen.org/appcontrol/operation/appControl1_c";
+ control = new tizen.ApplicationControl(APP_CONTROL_OPERATION, null, null, null, null);
+ tizen.application.launchAppControl(control, null, onSuccess, onError, null);
+ }else if (option == "app-control2"){
+ var control;
+ var APP_CONTROL_OPERATION="http://tizen.org/appcontrol/operation/appControl2_c";
+ control = new tizen.ApplicationControl(APP_CONTROL_OPERATION, null, null, null, null);
+ tizen.application.launchAppControl(control, "apcontrol2.AppcontrolRegularWgt", onSuccess, onError, null);
+ }
+ } catch (exc) {
+ alert("launch exc:" + exc.message);
+ }
+}
+
+function packagePre() {
+ var documentsDir;
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ if(files[i].name == "app_control_custom_wgt")
+ {
+ documentsDir.copyTo(
+ files[i].fullPath,
+ "documents/app_control_custom_wgt.wgt",
+ true,
+ function() {
+ console.log("app_control_custom_wgt Precondition Success(1)!");
+ });
+ }
+ if(files[i].name == "app_control_regular_wgt")
+ {
+ documentsDir.copyTo(
+ files[i].fullPath,
+ "documents/app_control_regular_wgt.wgt",
+ true,
+ function() {
+ console.log("app_control_regular_wgt Precondition Success(2)!");
+ });
+ }
+ }
+ fileURI();
+ }
+
+ function onerror(error) {
+ alert("The error " + error.message + " occurred when listing the files in the selected folder");
+ }
+
+ tizen.filesystem.resolve(
+ 'wgt-package/tests/AppControlExtending/res/',
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error" + e.message);
+ }, "r"
+ );
+}
--- /dev/null
+Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+Copyright (c) 2012 Intel Corporation.
+Except as noted, this software is licensed under Apache License, Version 2 or BSD-3-Clause License.
+Please, see the LICENSE.Apache-2.0 file for Apache License, Version 2 terms and conditions
+or the LICENSE.BSD-3 file for BSD-3-Clause License.
+
+Following resources are licensed under its own license.
+
+res/audio.acc,
+res/audio.amr,
+res/audio.mp3,
+res/audio.wav,
+res/iconA.png,
+res/iconV.png,
+res/image.bmp,
+res/image.gif,
+res/image.jpeg,
+res/image.png,
+res/video.3gp,
+res/video.mp4 :
+Copyright (c) 2012 Samsung Electronics Co., Ltd. All right reserved.
+The above resource files are licensed under Creative Commons Attribution 3.0.
+Please see the LICENSE.CC-BY-3.0 for Creative Commons Attribution 3.0 terms and conditions.
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Samsung Electronics 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.
+
+Authors:
+ Choi, Jongheon <j-h.choi@samsung.com>
+
+-->
+<html>
+<head>
+<meta charset="utf-8" />
+<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+<link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+<script src="../../js/thirdparty/jquery.js"></script>
+<script src="../../js/thirdparty/jquery.mobile.js"></script>
+<script src="../../js/tests.js"></script>
+<script src="js/main.js"></script>
+<style type="text/css">
+#image ul, li {list-style:none;}
+#audio ul, li {list-style:none;}
+#video ul, li {list-style:none;}
+#image img {margin:5px; width:65px; height:70px}
+#audio img {margin:5px; width:70px; height:70px}
+#video img {margin:5px; width:70px; height:70px}
+</style>
+</head>
+<body>
+ <div data-role="page" id="main">
+ <div data-role="header" data-position="fixed" data-tap-toggle="false">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div id="content">
+ <ul data-role="listview">
+ <li data-role="list-divider">AppControl Image</li>
+ </ul>
+ <ul data-role="listview" id="image"></ul>
+ <ul data-role="listview">
+ <li data-role="list-divider">AppControl Audio</li>
+ </ul>
+ <ul data-role="listview" id="audio"></ul>
+ <ul data-role="listview">
+ <li data-role="list-divider">AppControl Video</li>
+ </ul>
+ <ul data-role="listview" id="video"></ul>
+ <ul data-role="listview">
+ <li data-role="list-divider">AppControl File</li>
+ <li id="allFile">All File</li>
+ <li id="imageFile">Image File</li>
+ <li id="audioFile">Audio File</li>
+ <li id="videoFile">Video File</li>
+ <li data-role="list-divider">AppControl Browser</li>
+ <li id="tizen">https://www.tizen.org</li>
+ <li><input type="text" id="url" value="http://"/><div data-role="button" id="browser">Browser</div></li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font style="font-size:85%">
+ <p>Check if AppControls are supported</p><br>
+ <p>1. Select a thumbnail in the AppControl Image category</p>
+ <p>2. Check if the original image is displayed</p>
+ <p>3. Select a music file in the AppControl Audio category</p>
+ <p>4. Check if the music file is played</p>
+ <p>5. Select a video file in the AppControl Video category</p>
+ <p>6. Check if the video file is played</p>
+ <p>5. Select or Input the URL in the AppControl Browser category</p>
+ <p>6. Check if the URL is browsed</p>
+ </font>
+ </div>
+ </div>
+</body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Samsung Electronics 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.
+
+Authors:
+ Choi, Jongheon <j-h.choi@samsung.com>
+
+*/
+
+var path = "", mime = "", name = "", Url = "";
+var thumAudio = "", thumVideo = "";
+var sharedDir;
+
+$(document).delegate("#main", "pageinit", function() {
+ $("#image").delegate("li", "vclick", function() {
+ name = $(this).data("file");
+ path = $(this).data("url");
+ mime = $(this).data("mime");
+ setAppControlImage(path, mime, name);
+ return false;
+ });
+ $("#audio").delegate("li", "vclick", function() {
+ name = $(this).data("file");
+ path = $(this).data("url");
+ mime = $(this).data("mime");
+ setAppControlAudio(path, mime, name);
+ return false;
+ });
+ $("#video").delegate("li", "vclick", function() {
+ name = $(this).data("file");
+ path = $(this).data("url");
+ mime = $(this).data("mime");
+ setAppControlVideo(path, mime, name);
+ return false;
+ });
+ $("#allFile").bind("vclick", function() {
+ setAppControlFile("*/*");
+ return false;
+ });
+ $("#imageFile").bind("vclick", function() {
+ setAppControlFile("image/*");
+ return false;
+ });
+ $("#videoFile").bind("vclick", function() {
+ setAppControlFile("video/*");
+ return false;
+ });
+ $("#audioFile").bind("vclick", function() {
+ setAppControlFile("audio/*");
+ return false;
+ });
+ $("#tizen").bind("vclick", function() {
+ setAppControlBrowser("https://www.tizen.org");
+ return false;
+ });
+ $("#browser").bind("vclick", function() {
+ var url = $("#url").val();
+ setAppControlBrowser(url);
+ return false;
+ });
+ applicationPre();
+ file();
+});
+
+function file() {
+ var documentsDir;
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ var text = files[i].name.substring(0, 5);
+ if(text == "iconA")
+ {
+ thumAudio = files[i].toURI();
+ thumAudio = thumAudio.replace("file:///", "/");
+ }
+ if(text == "iconV")
+ {
+ thumVideo = files[i].toURI();
+ thumVideo = thumVideo.replace("file:///", "/");
+ }
+ }
+ file2();
+ }
+
+ function onerror(error) {
+ alert("The error " + error.message + " occurred when listing the files in the selected folder");
+ }
+
+ tizen.filesystem.resolve(
+ 'wgt-package/tests/Application/res/',
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error " + e.message);
+ }, "r"
+ );
+}
+
+function file2() {
+ var documentsDir, strImage = "", strVideo = "", strAudio = "";
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ if(files[i].isFile == true)
+ {
+ var mime = files[i].name.replace(".", "/");
+ var text = files[i].name.substring(0, 5);
+ var file = files[i].name;
+ Url = files[i].toURI();
+ Url = Url.replace("file:///", "/");
+ if(text == "image")
+ strImage += '<li data-url="' + Url + '" data-mime="' + mime + '" data-file="' + file + '"><img src="' + Url + '" alt="" />' + file + '</li>';
+ if(text == "audio")
+ strAudio += '<li data-url="' + Url + '" data-mime="' + mime + '" data-file="' + file + '"><img src="' + thumAudio + '" alt="" />' + file + '</li>';
+ if(text == "video")
+ strVideo += '<li data-url="' + Url + '" data-mime="' + mime + '" data-file="' + file + '"><img src="' + thumVideo + '" alt="" />' + file + '</li>';
+ }
+ }
+ $("#image").html(strImage).trigger("create").listview("refresh");
+ $("#audio").html(strAudio).trigger("create").listview("refresh");
+ $("#video").html(strVideo).trigger("create").listview("refresh");
+ }
+
+ function onerror(error) {
+ alert("The error " + error.message + " occurred when listing the files in the selected folder");
+ }
+
+ tizen.filesystem.resolve(
+ 'wgt-package/tests/Application/res/',
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error " + e.message);
+ }, "r"
+ );
+}
+
+function setAppControlImage(url, mime, name) {
+ var appControl = new tizen.ApplicationControl(
+ "http://tizen.org/appcontrol/operation/view",
+ sharedDir+"/data/"+name,
+ mime);
+ var appControlReplyCB = {
+ onsuccess: function(data) {
+ },
+ onfailure: function() {
+ }
+ };
+ try {
+ tizen.application.launchAppControl(appControl, null,
+ function(){
+ console.log("launch appControl succeeded");
+ },
+ function(e){
+ alert("launch appControl failed. Reason: " + e.message);
+ },
+ appControlReplyCB);
+ } catch(e)
+ {
+ alert("launch appControl error: " + e.message);
+ }
+}
+
+function setAppControlAudio(url, mime, name) {
+ var appControl = new tizen.ApplicationControl(
+ "http://tizen.org/appcontrol/operation/view",
+ sharedDir+"/data/"+name,
+ mime);
+ var appControlReplyCB = {
+ onsuccess: function(data) {
+ },
+ onfailure: function() {
+ }
+ };
+ try {
+ tizen.application.launchAppControl(appControl, null,
+ function(){
+ console.log("launch appControl succeeded");
+ },
+ function(e){
+ alert("launch appControl failed. Reason: " + e.message);
+ },
+ appControlReplyCB);
+ } catch(e)
+ {
+ alert("launch appControl error: " + e.message);
+ }
+}
+
+function setAppControlVideo(url, mime, name) {
+ var appControl = new tizen.ApplicationControl(
+ "http://tizen.org/appcontrol/operation/view",
+ sharedDir+"/data/"+name,
+ mime);
+ var appControlReplyCB = {
+ onsuccess: function(data) {
+ },
+ onfailure: function() {
+ }
+ };
+ try {
+ tizen.application.launchAppControl(appControl, null,
+ function(){
+ console.log("launch appControl succeeded");
+ },
+ function(e){
+ alert("launch appControl failed. Reason: " + e.message);
+ },
+ appControlReplyCB);
+ } catch(e)
+ {
+ alert("launch appControl error: " + e.message);
+ }
+}
+
+function setAppControlFile(mime) {
+ var app = {attach:[]};
+ app.attach = [];
+ var appControl = new tizen.ApplicationControl(
+ "http://tizen.org/appcontrol/operation/pick",
+ null,
+ mime);
+ var appControlReplyCB = {
+ onsuccess: function(data) {
+ app.attach.push(data[0].value[0]);
+ alert("Select File : " + app.attach[0]);
+ },
+ onfailure: function() {
+ }
+ };
+ try {
+ tizen.application.launchAppControl(appControl, null,
+ function(){
+ console.log("launch appControl succeeded");
+ },
+ function(e){
+ alert("launch appControl failed. Reason: " + e.message);
+ },
+ appControlReplyCB);
+ } catch(e)
+ {
+ alert("launch appControl error: " + e.message);
+ }
+}
+
+function setAppControlBrowser(url) {
+ var appControl = new tizen.ApplicationControl(
+ "http://tizen.org/appcontrol/operation/view",
+ url,
+ null);
+ var appControlReplyCB = {
+ onsuccess: function(data) {
+ },
+ onfailure: function() {
+ }
+ };
+ try {
+ tizen.application.launchAppControl(appControl, null,
+ function(){
+ console.log("launch appControl succeeded");
+ },
+ function(e){
+ alert("launch appControl failed. Reason: " + e.message);
+ },
+ appControlReplyCB);
+ } catch(e)
+ {
+ alert("launch appControl error: " + e.message);
+ }
+}
+
+function applicationPre() {
+ var documentsDir;
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ sharedDir = tizen.application.getAppSharedURI();
+ sharedDir = sharedDir.replace("file:///", "/");
+ documentsDir.copyTo(
+ files[i].fullPath,
+ sharedDir+"/data/"+files[i].name,
+ true,
+ function() {
+ console.log("PKGID/shared/data/ File Copy");
+ },
+ function(e){
+ console.log("Error : " + e.name);
+ });
+ }
+ }
+
+ function onerror(error) {
+ console.log("The error " + error.message + " occurred when listing the files in the selected folder");
+ }
+
+ tizen.filesystem.resolve(
+ 'wgt-package/tests/Application/res',
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error " + e.message);
+ }, "r"
+ );
+}
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Hao, Yunfei <yunfeix.hao@intel.com>
+
+*/
+
+.container {
+ text-align: center;
+ padding: 50px;
+}
+.numbers {
+ line-height: 40px;
+ text-align: center;
+ width: 0.6em;
+ top: 0;
+ left: 0;
+ position: absolute;
+ color: white;
+}
+.timer {
+ padding: 10px;
+ background: black;
+ display: inline-block;
+ overflow: hidden;
+ position: relative;
+ border-radius: 5px;
+}
+.cell1 {
+ width: 0.60em;
+ height: 40px;
+ font-size: 50px;
+ overflow: hidden;
+ position: relative;
+ float: left;
+}
+.cell2 {
+ width: 0.60em;
+ height: 40px;
+ font-size: 50px;
+ overflow: hidden;
+ position: relative;
+ float: left;
+}
+.ch6 {
+ -webkit-animation: ch6 1000ms steps(6, end) infinite;
+ animation: ch6 1000ms steps(6, end) infinite;
+}
+.ch10 {
+ -webkit-animation: ch10 1000ms steps(10, end) infinite;
+ animation: ch10 1000ms steps(10, end) infinite;
+}
+
+.second {
+ -webkit-animation-duration: 10000ms;
+ animation-duration: 10000ms;
+}
+.seconds10 {
+ -webkit-animation-duration: 60000ms;
+ animation-duration: 60000ms;
+}
+@-webkit-keyframes ch10 {
+ 100% {top: -400px;}
+ 0% {top: 0;}
+}
+@keyframes ch10 {
+ 100% {top: -400px;}
+ 0% {top: 0;}
+}
+@-webkit-keyframes ch6 {
+ 100% {top: -240px;}
+ 0% {top: 0;}
+}
+@keyframes ch6 {
+ 100% {top: -240px;}
+ 0% {top: 0;}
+}
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Hao, Yunfei <yunfeix.hao@intel.com>
+
+-->
+<html>
+<head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <title>ApplicationInvisible</title>
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../css/main.css" />
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/tests.js"></script>
+ <script src="js/main.js"></script>
+ <link rel="stylesheet" type="text/css" href="css/main.css" />
+</head>
+<body>
+ <div data-role="page" id="main">
+ <div data-role="header" data-position="fixed" data-tap-toggle="false">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div id="content">
+ <ul data-role="listview" id="list">
+ <li data-role="list-divider"><div>Enter time</div></li><li><div>
+ <span id="en_time"></span>
+ </div></li>
+ <li data-role="list-divider"><div>Current time</div></li><li><div>
+ <span id="current_time"></span>
+ </div></li>
+ <li data-role="list-divider"><div>Difference time</div></li><li><div>
+ <span id="diff_time"></span>
+ </div></li>
+ <li data-role="list-divider"><div>JS time</div></li><li><div>
+ <div class="container">
+ <div class="timer">
+ <div class="cell1">
+ <div class="numbers" id="js_time_tensecond"></div>
+ </div>
+ <div class="cell2">
+ <div class="numbers" id="js_time_second"></div>
+ </div>
+ </div>
+ </div>
+ </div></li>
+ <li data-role="list-divider"><div>Animation time :</div></li><li><div>
+ <div class="container">
+ <div class="timer">
+ <div class="cell1">
+ <div class="numbers seconds10 ch6">0 1 2 3 4 5 6</div>
+ </div>
+ <div class="cell2">
+ <div class="numbers second ch10">0 1 2 3 4 5 6 7 8 9</div>
+ </div>
+ </div>
+ </div>
+ </div></li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Purpose: </p>
+ <p>Verifies js and css animation will suspend when application goes invisible.</p>
+ <p>Test Step: </p>
+ <ol>
+ <li>Launch another exist App(Webapp or Native app) to let this tct-behavior-test lost focus, what is, let it to background and not in top screen.</li>
+ <li>Resume tct-behavior-test to top screen, e.g. click tct-behavior-test window, or start task switcher and select tct-behavior-tests again.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <ul>
+ <li>The "JS time" is different from the "Difference time".</li>
+ <li>The "Animation time" is different from the "Difference time".</li>
+ </ul>
+ </font>
+ </div>
+ </div>
+</body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.sandbox
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Hao, Yunfei <yunfeix.hao@intel.com>
+
+*/
+
+var systime = new Date();
+var timer = systime.getTime();
+var timer2 = systime.toString().substr(15, 16);
+// Time interval
+var t = 1000;
+//Counter of js
+var Num = 0;
+
+var visibilitychange = "visibilitychange";
+var array = new Array("webkit", "o", "moz", "ms");
+for(var i = 0; i < array.length; i++) {
+ if(array[i] + "Hidden" in document) {
+ visibilitychange = array[i] + "visibilitychange";
+ }
+}
+
+$(document).delegate("#main", "pageinit", function() {
+ Refresh();
+ setInterval("Refresh();", t);
+ //The time when entry this page timer2
+ $("#en_time").html(timer2);
+ DisablePassButton();
+ document.addEventListener(visibilitychange, notification);
+});
+
+function Refresh() {
+ Num = Num + 1;
+ //The current time
+ var curtime = new Date();
+ var timer3 = curtime.toString().substr(15, 16);
+ $("#current_time").html(timer3);
+ //The true timer: NowTime - entryTime
+ $("#diff_time").html(Math.floor((new Date().getTime()-timer)/t) % 60);
+ //The timer of js
+ $("#js_time_tensecond").html((Num-1) / 10);
+ $("#js_time_second").html((Num-1) % 10);
+ if(Num == 60){
+ Num = 0;
+ }
+}
+
+function notification() {
+ EnablePassButton();
+}
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Cui, Jieqiong <jieqiong.cui@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width">
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../css/main.css" />
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="header">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div id="content">
+ <ul data-role="listview">
+ <li data-role="list-divider">battery default values</li>
+ <li>
+ <div><a id="default" data-role="button" href="w3c/battery-created.html" data-ajax="false">Test battery default values</a></div>
+ </li>
+ </ul>
+ <ul data-role="listview">
+ <li data-role="list-divider">battery discharging</li>
+ <li>
+ <div><a id="discharging" data-role="button" href="w3c/battery-discharging-manual.html" data-ajax="false">Test battery discharging</a></div>
+ </li>
+ </ul>
+ <ul data-role="listview">
+ <li data-role="list-divider">charger plugged</li>
+ <li>
+ <div><a id="plugged" data-role="button" href="w3c/battery-plugged-in-manual.html" data-ajax="false">Test charger plugged</a></div>
+ </li>
+ </ul>
+ <ul data-role="listview">
+ <li data-role="list-divider">charger unplugged</li>
+ <li>
+ <div><a id="unplugged" data-role="button" href="w3c/battery-unplugged-manual.html" data-ajax="false">Test charger unplugged</a></div>
+ </li>
+ </ul>
+ <ul data-role="listview">
+ <li data-role="list-divider">battery charging</li>
+ <li>
+ <div><a id="charging" data-role="button" href="w3c/battery-charging-manual.html" data-ajax="false">Test battery charging</a></div>
+ </li>
+ </ul>
+ <ul data-role="listview">
+ <li data-role="list-divider">battery full</li>
+ <li>
+ <div><a id="full" data-role="button" href="w3c/battery-full.html" data-ajax="false">Test battery full</a></div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font class="fontSize">
+ <p>Test purpose</p>
+ <p>Verifies the functionality of battery status, event work well while charging, discharging, plug and unplug charger, battery full.</p>
+ <p>Test battery default values</p>
+ <ul>
+ Pre-conditions:
+ <ol>
+ <li>The implementation is unable to report the battery's charging state, charging time, level or remaining time respectively.</li>
+ <li>The device is unplugged from the charger before this test case is run</li>
+ </ol>
+ Test steps:
+ <ol>
+ <li>Launch 'Test battery default values'</li>
+ </ol>
+ </ul>
+ <p>Test battery discharging</p>
+ <ul>
+ Pre-conditions:
+ <ol>
+ <li>The device is unplugged from the charger before this test is run.</li>
+ <li>The battery must neither be empty or full, nor reach empty or full capacity during the test.</li>
+ </ol>
+ Test steps:
+ <ol>
+ <li>Launch 'Test battery discharging'</li>
+ </ol>
+ </ul>
+ <p>Test battery plugged</p>
+ <ul>
+ Pre-conditions:
+ <ol>
+ <li>The device is unplugged from the charger before this test is run.</li>
+ <li>The battery must not be full or reach full capacity during the time the test is run.</li>
+ </ol>
+ Test steps:
+ <ol>
+ <li>Plug in the charger and wait for all the tests to complete.</li>
+ <li>Launch 'Test battery plugged'</li>
+ </ol>
+ </ul>
+ <p>Test battery unplugged</p>
+ <ul>
+ Pre-conditions:
+ <ol>
+ <li>The device is plugged in to the charger before this test is run.</li>
+ <li>The battery must not be full or reach full capacity during the time the test is run.</li>
+ </ol>
+ Test steps:
+ <ol>
+ <li>Unplug the charger and wait for all the tests to complete.</li>
+ <li>Launch 'Test battery unplugged'</li>
+ </ol>
+ </ul>
+ <p>Test battery charging</p>
+ <ul>
+ Pre-conditions:
+ <ol>
+ <li>The device is plugged in to the charger before this test is run.</li>
+ <li>The battery must neither be empty or full, nor reach empty or full capacity during the test.</li>
+ </ol>
+ Test steps:
+ <ol>
+ <li>Launch 'Test battery charging'</li>
+ </ol>
+ </ul>
+ <p>Test battery full</p>
+ <ul>
+ Pre-conditions:
+ <ol>
+ <li>The device is plugged in to the charger before this test is run.</li>
+ <li>The battery is full.</li>
+ </ol>
+ Test steps:
+ <ol>
+ <li>Launch 'Test battery full'</li>
+ </ol>
+ </ul>
+ <p>Expected Result</p>
+ <p>The tests all pass.</p>
+ </font>
+ </div>
+ </body>
+ </body>
+</html>
--- /dev/null
+This test suite comes from
+https://github.com/w3c/web-platform-tests/
+with modification:
+1. Modify the necessary adjustment on reference path to test harness.
+2.
+ + <style>
+ + .button {
+ + background: #eee;
+ + border: 1px solid #ccc;
+ + border-radius: 5px;
+ + font-weight: bold;
+ + font-size: 15px;
+ + padding: 8px 2px;
+ + width: 340px;
+ + }
+ + </style>
+
+ + <div><button onclick='javascript: window.history.go(-1)' class='button'>Complete Test</button></div>
+
+The testharness come from
+https://github.com/w3c/testharness.js
+without any modification
+
+
+These tests are copyright by W3C and/or the author listed in the test
+file. The tests are dual-licensed under the W3C Test Suite License:
+http://www.w3.org/Consortium/Legal/2008/04-testsuite-license
+and the BSD 3-clause License:
+http://www.w3.org/Consortium/Legal/2008/03-bsd-license
+under W3C's test suite licensing policy:
+http://www.w3.org/Consortium/Legal/2008/04-testsuite-copyright
+
--- /dev/null
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Battery Status API Test Suite</title>
+ <script src="testharness.js"></script>
+ <script src="countdown.js"></script>
+ <link rel="stylesheet" href="testharness.css" media="all"/>
+ <meta name="flags" content="interact">
+ <style>
+ .button {
+ background: #eee;
+ border: 1px solid #ccc;
+ border-radius: 5px;
+ font-weight: bold;
+ font-size: 15px;
+ padding: 8px 2px;
+ width: 340px;
+ }
+ </style>
+ </head>
+ <body>
+ <h1>Description</h1>
+ <p>
+ This test validates that all of the navigator.battery attributes exist and are set to correct values, when the battery is charging.
+ </p>
+ <h2>Preconditions</h2>
+ <ol>
+ <li>
+ The device is plugged in to the charger before this test is run.
+ </li>
+ <li>
+ The battery must neither be empty or full, nor reach empty or full capacity during the test.
+ </li>
+ </ol>
+ <div><button onclick='javascript: window.history.go(-1)' class='button'>Complete Test</button></div>
+ <div id="log"></div>
+ <script>
+ (function() {
+
+ setup({ explicit_timeout: true });
+
+ test(function() {
+ assert_true(navigator.battery.charging);
+ }, 'The charging attribute must be set to true.');
+
+ test(function() {
+ assert_true(navigator.battery.chargingTime < Infinity);
+ }, 'The chargingTime attribute must be set to the time remaining in seconds until the system\'s battery is completely charged. If the reported charging time ' + navigator.battery.chargingTime + ' seconds or ' + Math.round(navigator.battery.chargingTime/60) + ' minutes is not correct, please indicate that the test has failed.');
+
+ test(function() {
+ assert_true(navigator.battery.dischargingTime === Infinity);
+ }, 'The dischargingTime attribute must be set to the value positive Infinity.');
+
+ test(function() {
+ assert_true(0 < navigator.battery.level && navigator.battery.level < 1.0);
+ }, 'The level attribute must be set to the current battery level scaled from 0 to 1.0. If the reported battery level ' + navigator.battery.level + ' is not correct, please indicate that the test has failed.');
+
+ var onlevelchange_test = async_test('When the battery level is updated, must increase the level attribute\'s value and fire a levelchange event.');
+ var battery_level = navigator.battery.level;
+ navigator.battery.onlevelchange = onlevelchange_test.step_func(function (e) {
+ assert_true(navigator.battery.level > battery_level, 'The value of the level attribute must increase.');
+ onlevelchange_test.done();
+ });
+
+ })();
+ </script>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Battery Status API Test Suite</title>
+ <script src="testharness.js"></script>
+ <link rel="stylesheet" href="testharness.css" media="all"/>
+ <style>
+ .button {
+ background: #eee;
+ border: 1px solid #ccc;
+ border-radius: 5px;
+ font-weight: bold;
+ font-size: 15px;
+ padding: 8px 2px;
+ width: 340px;
+ }
+ </style>
+ </head>
+ <body>
+ <h1>Description</h1>
+ <p>
+ <strong>
+ This test is only useful on devices that expose the BatteryManager interface,
+ but lack a backend implementation.
+ </strong>
+ </p>
+ <p>
+ This test validates that all of the navigator.battery attributes exist and are set to their default values.
+ </p>
+ <h2>Preconditions</h2>
+ <ol>
+ <li>
+ The implementation is unable to report the battery's charging state,
+ charging time, level or remaining time respectively.
+ </li>
+ <li>
+ The device is unplugged from the charger before this test case is run.
+ </li>
+ </ol>
+ <div><button onclick='javascript: window.history.go(-1)' class='button'>Complete Test</button></div>
+ <div id="log"></div>
+ <script>
+ (function() {
+ test(function() {
+ var b = navigator.battery||navigator.webkitBattery;;
+ assert_true(b.charging === true, 'charging must be set to true');
+ assert_true(b.chargingTime === 0, 'chargingTime must be set to 0');
+ assert_true(b.level === 1.0, 'level must be set to 1.0');
+ assert_true(b.dischargingTime === Infinity, 'dischargingTime must be set to Infinity');
+
+ }, 'When a BatteryManager object is created, charging must be set to true, ' +
+ 'chargingTime to 0, level to 1.0 and dischargingTime to the value positive ' +
+ 'Infinity, if the implementation is unable to report the battery\'s charging ' +
+ 'state, charging time, level or remaining time respectively.');
+ })();
+ </script>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Battery Status API Test Suite</title>
+ <script src="testharness.js"></script>
+ <script src="countdown.js"></script>
+ <link rel="stylesheet" href="testharness.css" media="all"/>
+ <meta name="flags" content="interact">
+ <style>
+ .button {
+ background: #eee;
+ border: 1px solid #ccc;
+ border-radius: 5px;
+ font-weight: bold;
+ font-size: 15px;
+ padding: 8px 2px;
+ width: 340px;
+ }
+ </style>
+ </head>
+ <body>
+ <h1>Description</h1>
+ <p>
+ This test validates that all of the navigator.battery attributes exist and are set to correct values, when the battery is discharging.
+ </p>
+ <h2>Preconditions</h2>
+ <ol>
+ <li>
+ The device is unplugged from the charger before this test is run.
+ </li>
+ <li>
+ The battery must neither be empty or full, nor reach empty or full capacity during the test.
+ </li>
+ </ol>
+ <p>
+ The highest prime number discovered so far is: <output id="prime"></output>
+ </p>
+ <div><button onclick='javascript: window.history.go(-1)' class='button'>Complete Test</button></div>
+ <div id="log"></div>
+ <script>
+ (function() {
+
+ setup({ explicit_timeout: true });
+ navigator.battery = navigator.battery||navigator.webkitBattery;
+ test(function() {
+ assert_false(navigator.battery.charging);
+ }, 'The charging attribute must be set to false.');
+
+ test(function() {
+ assert_true(navigator.battery.chargingTime === Infinity);
+ }, 'The chargingTime attribute must be set to the value positive Infinity.');
+
+ test(function() {
+ assert_true(navigator.battery.dischargingTime < Infinity);
+ }, 'The dischargingTime attribute must be set to the time remaining in seconds until the system\'s battery is completely discharged. If the reported discharging time ' + navigator.battery.dischargingTime + ' seconds or ' + Math.round(navigator.battery.dischargingTime/60) + ' minutes is not correct, please indicate that the test has failed.');
+
+ test(function() {
+ assert_true(0 <= navigator.battery.level && navigator.battery.level <= 1.0);
+ }, 'The level attribute must be set to the current battery level scaled from 0 to 1.0');
+
+ var onlevelchange_test = async_test('When the battery level is updated, must decrease the level attribute\'s value and fire a levelchange event. If the reported battery level ' + navigator.battery.level + ' is not correct, please indicate that the test has failed.');
+ var battery_level = navigator.battery.level;
+
+ // compute primes to deplete the battery faster
+ var w = new Worker('prime.js');
+ w.postMessage('compute');
+ w.onmessage = function (e) {
+ document.querySelector('#prime').textContent = e.data;
+ };
+
+ navigator.battery.onlevelchange = onlevelchange_test.step_func(function (e) {
+ assert_true(navigator.battery.level < battery_level, 'The value of the level attribute must decrease.');
+ onlevelchange_test.done();
+ w.terminate();
+ });
+
+ add_completion_callback(function () {
+ w.terminate();
+ });
+
+ })();
+ </script>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Battery Status API Test Suite</title>
+ <script src="testharness.js"></script>
+ <link rel="stylesheet" href="testharness.css" media="all"/>
+ <meta name="flags" content="interact">
+ <style>
+ .button {
+ background: #eee;
+ border: 1px solid #ccc;
+ border-radius: 5px;
+ font-weight: bold;
+ font-size: 15px;
+ padding: 8px 2px;
+ width: 340px;
+ }
+ </style>
+ </head>
+ <body>
+ <h1>Description</h1>
+ <p>
+ This test validates that all of the navigator.battery attributes exist and are set to correct values, when the battery is full.
+ </p>
+ <h2>Preconditions</h2>
+ <ol>
+ <li>
+ The device is plugged in to the charger before this test is run.
+ </li>
+ <li>
+ The battery is full.
+ </li>
+ </ol>
+ <div><button onclick='javascript: window.history.go(-1)' class='button'>Complete Test</button></div>
+ <div id="log"></div>
+ <script>
+ (function() {
+ navigator.battery = navigator.battery||navigator.webkitBattery;
+
+ test(function() {
+ assert_true(navigator.battery.charging);
+ }, 'The charging attribute must be set to true if the battery is full (the "otherwise" condition).');
+
+ test(function() {
+ assert_true(navigator.battery.chargingTime === 0);
+ }, 'The chargingTime attribute must be set to 0.');
+
+ test(function() {
+ assert_true(navigator.battery.dischargingTime === Infinity);
+ }, 'The dischargingTime attribute must be set to the value positive Infinity (the "otherwise" condition).');
+
+ test(function() {
+ assert_true(navigator.battery.level === 1.0);
+ }, 'The level attribute must be set to the value 1.0.');
+
+ })();
+ </script>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Battery Status API Test Suite</title>
+ <script src="testharness.js"></script>
+ <script src="countdown.js"></script>
+ <link rel="stylesheet" href="testharness.css" media="all"/>
+ <style>
+ #note { background-color: #fef1b5; border: solid 1px #cdab2d; padding: 5px; margin: 15px; display: none; }
+ .button {
+ background: #eee;
+ border: 1px solid #ccc;
+ border-radius: 5px;
+ font-weight: bold;
+ font-size: 15px;
+ padding: 8px 2px;
+ width: 340px;
+ }
+ </style>
+ <meta name="flags" content="interact">
+ </head>
+ <body>
+ <h1>Description</h1>
+ <p>
+ This test validates that all of the navigator.battery attributes exist and are set to correct values, with corresponding events fired, when the charger is plugged in.
+ </p>
+ <h2>Preconditions</h2>
+ <ol>
+ <li>
+ The device is unplugged from the charger before this test is run.
+ </li>
+ <li>
+ The battery must not be full or reach full capacity during the time the test is run.
+ </li>
+ </ol>
+ <div id="note">
+ Plug in the charger and wait for all the tests to complete.
+ </div>
+ <div><button onclick='javascript: window.history.go(-1)' class='button'>Complete Test</button></div>
+ <div id="log"></div>
+ <script>
+ (function() {
+
+ setup({ explicit_timeout: true });
+ navigator.battery = navigator.battery||navigator.webkitBattery;
+ var onchargingchange_test = async_test('When the device is plugged in and its charging state is updated, must set the charging attribute\'s value to true and fire a chargingchange event.');
+ navigator.battery.onchargingchange = onchargingchange_test.step_func(function (e) {
+ assert_true(navigator.battery.charging, 'The charging attribute must be set to true.')
+ onchargingchange_test.done();
+ });
+
+ var onchargingtimechange_test = async_test('When the device is plugged in and its charging time is updated, must set the chargingTime attribute\'s value and fire a chargingtimechange event. If the reported charging time ' + navigator.battery.chargingTime + ' seconds or ' + Math.round(navigator.battery.chargingTime/60) + ' minutes is not correct, please indicate that the test has failed.');
+ var battery_chargingtime = navigator.battery.chargingTime;
+ navigator.battery.onchargingtimechange = onchargingtimechange_test.step_func(function (e) {
+ assert_true(navigator.battery.chargingTime < battery_chargingtime, 'The value of the chargingTime attribute must decrease.');
+ onchargingtimechange_test.done();
+ });
+
+ var ondischargingtimechange_test = async_test('When the device is plugged in and its discharging time is updated, must set the dischargingTime attribute\'s value to Infinity and fire a dischargingtimechange event.');
+ var battery_dischargingtime = navigator.battery.dischargingTime;
+ navigator.battery.ondischargingtimechange = ondischargingtimechange_test.step_func(function (e) {
+ assert_true(navigator.battery.dischargingTime === Infinity, 'The value of the dischargingTime attribute must be set to Infinity.');
+ ondischargingtimechange_test.done();
+ });
+
+ var onlevelchange_test = async_test('When the device is plugged in and the battery level is updated, must set the level attribute\'s value and fire a levelchange event.');
+ var battery_level = navigator.battery.level;
+ navigator.battery.onlevelchange = onlevelchange_test.step_func(function (e) {
+ assert_true(navigator.battery.level > 0 && navigator.battery.level < 1.0, 'The level attribute must be set to the current battery level scaled from 0 to 1.0. If the reported battery level ' + navigator.battery.level + ' is not correct, please indicate that the test has failed.');
+ onlevelchange_test.done();
+ });
+
+ setTimeout(function() {
+ var note = document.querySelector('#note');
+ note.style.display = 'block';
+ navigator.battery.onchargingchange = function (e) {
+ if (navigator.battery.charging) {
+ note.style.display = 'none';
+ }
+ };
+ }, 4000);
+
+ })();
+ </script>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Battery Status API Test Suite</title>
+ <script src="testharness.js"></script>
+ <script src="countdown.js"></script>
+ <link rel="stylesheet" href="testharness.css" media="all"/>
+ <style>
+ #note { background-color: #fef1b5; border: solid 1px #cdab2d; padding: 5px; margin: 15px; display: none; }
+ .button {
+ background: #eee;
+ border: 1px solid #ccc;
+ border-radius: 5px;
+ font-weight: bold;
+ font-size: 15px;
+ padding: 8px 2px;
+ width: 340px;
+ }
+ </style>
+ <meta name="flags" content="interact">
+ </head>
+ <body>
+ <h1>Description</h1>
+ <p>
+ This test validates that all of the navigator.battery attributes exist and are set to correct values, with corresponding events fired, when the charger is unplugged.
+ </p>
+ <h2>Preconditions</h2>
+ <ol>
+ <li>
+ The device is plugged in to the charger before this test is run.
+ </li>
+ <li>
+ The battery must not be full or reach full capacity during the time the test is run.
+ </li>
+ </ol>
+ <p>
+ The highest prime number discovered so far is: <output id="prime"></output>
+ </p>
+ <div id="note">
+ Unplug the charger and wait for all the tests to complete.
+ </div>
+ <div><button onclick='javascript: window.history.go(-1)' class='button'>Complete Test</button></div>
+ <div id="log"></div>
+ <script>
+ (function() {
+
+ setup({ explicit_timeout: true });
+ navigator.battery = navigator.battery||navigator.webkitBattery;
+ var onchargingchange_test = async_test('When the device is unplugged in and its charging state is updated, must set the charging attribute\'s value to false and fire a chargingchange event.');
+ navigator.battery.onchargingchange = onchargingchange_test.step_func(function (e) {
+ assert_false(navigator.battery.charging, 'The charging attribute must be set to false.')
+ onchargingchange_test.done();
+ });
+
+ var onchargingtimechange_test = async_test('When the device is unplugged in and its charging time is updated, must set the chargingTime attribute\'s value to Infinity and fire a chargingtimechange event.');
+ var battery_chargingtime = navigator.battery.chargingTime;
+ navigator.battery.onchargingtimechange = onchargingtimechange_test.step_func(function (e) {
+ assert_true(navigator.battery.chargingTime === Infinity, 'The value of the chargingTime attribute must be set to Infinity.');
+ onchargingtimechange_test.done();
+ });
+
+ var ondischargingtimechange_test = async_test('When the device is unplugged in and its discharging time is updated, must set the dischargingTime attribute\'s value and fire a dischargingtimechange event. If the reported discharging time ' + navigator.battery.dischargingTime + ' seconds or ' + Math.round(navigator.battery.dischargingTime/60) + ' minutes is not correct, please indicate that the test has failed.');
+ var battery_dischargingtime = navigator.battery.dischargingTime;
+ navigator.battery.ondischargingtimechange = ondischargingtimechange_test.step_func(function (e) {
+ assert_true(navigator.battery.dischargingTime < Infinity, 'The value of the dischargingTime attribute must be set to the remaining discharging time.');
+ ondischargingtimechange_test.done();
+ });
+
+ var onlevelchange_test = async_test('When the device is plugged in and the battery level is updated, must set the level attribute\'s value and fire a levelchange event.');
+ var battery_level = navigator.battery.level;
+
+ // compute primes to deplete the battery faster
+ var w = new Worker('prime.js');
+ w.postMessage('compute');
+ w.onmessage = function (e) {
+ document.querySelector('#prime').textContent = e.data;
+ };
+
+ navigator.battery.onlevelchange = onlevelchange_test.step_func(function (e) {
+ assert_true(navigator.battery.level > 0 && navigator.battery.level < 1.0, 'The level attribute must be set to the current battery level scaled from 0 to 1.0.');
+ onlevelchange_test.done();
+ w.terminate();
+ });
+
+ add_completion_callback(function () {
+ w.terminate();
+ });
+
+ setTimeout(function() {
+ var note = document.querySelector('#note');
+ note.style.display = 'block';
+ navigator.battery.onchargingchange = function (e) {
+ if (!navigator.battery.charging) {
+ note.style.display = 'none';
+ }
+ };
+ }, 4000);
+
+ })();
+ </script>
+ </body>
+</html>
--- /dev/null
+function countdown(prop) {
+ var seconds = !isNaN(parseInt(prop.timeout, 10)) ? (prop.timeout / 1000) : 0,
+ body = document.getElementsByTagName('body')[0],
+ div = document.createElement('div'),
+ timer, remaining_time, min, sec;
+
+ add_completion_callback(function () {
+ clearInterval(timer);
+ body.removeChild(div);
+ });
+
+ div.innerHTML = 'This test will timeout in <span id="remaining_time">...</span>';
+ body.appendChild(div);
+
+ remaining_time = document.querySelector('#remaining_time');
+
+ timer = setInterval(function() {
+ function zeroPad(n) {
+ return (n < 10) ? '0' + n : n;
+ }
+
+ if (seconds / 60 >= 1) {
+ min = Math.floor(seconds / 60);
+ sec = seconds % 60;
+ } else {
+ min = 0;
+ sec = seconds;
+ }
+
+ if (seconds === 0) {
+ div.innerHTML = 'Timeout exceeded. Increase the timeout and re-run.';
+ clearInterval(timer);
+ }
+
+ remaining_time.textContent = zeroPad(min) + ':' + zeroPad(sec);
+ seconds--;
+ }, 1000);
+}
--- /dev/null
+// adapted from http://html5demos.com/worker
+
+var running = false;
+
+onmessage = function (event) {
+ // doesn't matter what the message is, just toggle the worker
+ if (running == false) {
+ running = true;
+ run(1);
+ } else {
+ running = false;
+ }
+};
+
+function run(n) {
+ // split the task into 20k chunks
+ var limit = n + 20000;
+ search: while (running && n < limit) {
+ n += 1;
+ for (var i = 2; i <= Math.sqrt(n); i += 1) {
+ if (n % i == 0) {
+ continue search;
+ }
+ }
+ // found a prime!
+ postMessage(n);
+ }
+ if (n === limit) {
+ // wait for the UI thread to update itself
+ setTimeout(function(start_time) {
+ // resume prime computation at n
+ run(n);
+ }, 150);
+ }
+}
\ No newline at end of file
--- /dev/null
+html {
+ font-family:DejaVu Sans, Bitstream Vera Sans, Arial, Sans;
+}
+
+#log .warning,
+#log .warning a {
+ color: black;
+ background: yellow;
+}
+
+#log .error,
+#log .error a {
+ color: white;
+ background: red;
+}
+
+#log pre {
+ border: 1px solid black;
+ padding: 1em;
+}
+
+section#summary {
+ margin-bottom:1em;
+}
+
+table#results {
+ border-collapse:collapse;
+ table-layout:fixed;
+ width:100%;
+}
+
+table#results th:first-child,
+table#results td:first-child {
+ width:4em;
+}
+
+table#results th:last-child,
+table#results td:last-child {
+ width:50%;
+}
+
+table#results.assertions th:last-child,
+table#results.assertions td:last-child {
+ width:35%;
+}
+
+table#results th {
+ padding:0;
+ padding-bottom:0.5em;
+ border-bottom:medium solid black;
+}
+
+table#results td {
+ padding:1em;
+ padding-bottom:0.5em;
+ border-bottom:thin solid black;
+}
+
+tr.pass > td:first-child {
+ color:green;
+}
+
+tr.fail > td:first-child {
+ color:red;
+}
+
+tr.timeout > td:first-child {
+ color:red;
+}
+
+tr.notrun > td:first-child {
+ color:blue;
+}
+
+.pass > td:first-child, .fail > td:first-child, .timeout > td:first-child, .notrun > td:first-child {
+ font-variant:small-caps;
+}
+
+table#results span {
+ display:block;
+}
+
+table#results span.expected {
+ font-family:DejaVu Sans Mono, Bitstream Vera Sans Mono, Monospace;
+ white-space:pre;
+}
+
+table#results span.actual {
+ font-family:DejaVu Sans Mono, Bitstream Vera Sans Mono, Monospace;
+ white-space:pre;
+}
+
--- /dev/null
+/*
+Distributed under both the W3C Test Suite License [1] and the W3C
+3-clause BSD License [2]. To contribute to a W3C Test Suite, see the
+policies and contribution forms [3].
+
+[1] http://www.w3.org/Consortium/Legal/2008/04-testsuite-license
+[2] http://www.w3.org/Consortium/Legal/2008/03-bsd-license
+[3] http://www.w3.org/2004/10/27-testcases
+*/
+
+/*
+ * == Introduction ==
+ *
+ * This file provides a framework for writing testcases. It is intended to
+ * provide a convenient API for making common assertions, and to work both
+ * for testing synchronous and asynchronous DOM features in a way that
+ * promotes clear, robust, tests.
+ *
+ * == Basic Usage ==
+ *
+ * To use this file, import the script and the testharnessreport script into
+ * the test document:
+ * <script src="/resources/testharness.js"></script>
+ * <script src="/resources/testharnessreport.js"></script>
+ *
+ * Within each file one may define one or more tests. Each test is atomic
+ * in the sense that a single test has a single result (pass/fail/timeout).
+ * Within each test one may have a number of asserts. The test fails at the
+ * first failing assert, and the remainder of the test is (typically) not run.
+ *
+ * If the file containing the tests is a HTML file with an element of id "log"
+ * this will be populated with a table containing the test results after all
+ * the tests have run.
+ *
+ * NOTE: By default tests must be created before the load event fires. For ways
+ * to create tests after the load event, see "Determining when all tests
+ * are complete", below
+ *
+ * == Synchronous Tests ==
+ *
+ * To create a synchronous test use the test() function:
+ *
+ * test(test_function, name, properties)
+ *
+ * test_function is a function that contains the code to test. For example a
+ * trivial passing test would be:
+ *
+ * test(function() {assert_true(true)}, "assert_true with true")
+ *
+ * The function passed in is run in the test() call.
+ *
+ * properties is an object that overrides default test properties. The
+ * recognised properties are:
+ * timeout - the test timeout in ms
+ *
+ * e.g.
+ * test(test_function, "Sample test", {timeout:1000})
+ *
+ * would run test_function with a timeout of 1s.
+ *
+ * Additionally, test-specific metadata can be passed in the properties. These
+ * are used when the individual test has different metadata from that stored
+ * in the <head>.
+ * The recognized metadata properties are:
+ *
+ * help - The url of the part of the specification being tested
+ *
+ * assert - A human readable description of what the test is attempting
+ * to prove
+ *
+ * author - Name and contact information for the author of the test in the
+ * format: "Name <email_addr>" or "Name http://contact/url"
+ *
+ * == Asynchronous Tests ==
+ *
+ * Testing asynchronous features is somewhat more complex since the result of
+ * a test may depend on one or more events or other callbacks. The API provided
+ * for testing these features is indended to be rather low-level but hopefully
+ * applicable to many situations.
+ *
+ * To create a test, one starts by getting a Test object using async_test:
+ *
+ * async_test(name, properties)
+ *
+ * e.g.
+ * var t = async_test("Simple async test")
+ *
+ * Assertions can be added to the test by calling the step method of the test
+ * object with a function containing the test assertions:
+ *
+ * t.step(function() {assert_true(true)});
+ *
+ * When all the steps are complete, the done() method must be called:
+ *
+ * t.done();
+ *
+ * As a convenience, async_test can also takes a function as first argument.
+ * This function is called with the test object as both its `this` object and
+ * first argument. The above example can be rewritten as:
+ *
+ * async_test(function(t) {
+ * object.some_event = function() {
+ * t.step(function (){assert_true(true); t.done();});
+ * };
+ * }, "Simple async test");
+ *
+ * which avoids cluttering the global scope with references to async
+ * tests instances.
+ *
+ * The properties argument is identical to that for test().
+ *
+ * In many cases it is convenient to run a step in response to an event or a
+ * callback. A convenient method of doing this is through the step_func method
+ * which returns a function that, when called runs a test step. For example
+ *
+ * object.some_event = t.step_func(function(e) {assert_true(e.a)});
+ *
+ * == Making assertions ==
+ *
+ * Functions for making assertions start assert_
+ * The best way to get a list is to look in this file for functions names
+ * matching that pattern. The general signature is
+ *
+ * assert_something(actual, expected, description)
+ *
+ * although not all assertions precisely match this pattern e.g. assert_true
+ * only takes actual and description as arguments.
+ *
+ * The description parameter is used to present more useful error messages when
+ * a test fails
+ *
+ * NOTE: All asserts must be located in a test() or a step of an async_test().
+ * asserts outside these places won't be detected correctly by the harness
+ * and may cause a file to stop testing.
+ *
+ * == Setup ==
+ *
+ * Sometimes tests require non-trivial setup that may fail. For this purpose
+ * there is a setup() function, that may be called with one or two arguments.
+ * The two argument version is:
+ *
+ * setup(func, properties)
+ *
+ * The one argument versions may omit either argument.
+ * func is a function to be run synchronously. setup() becomes a no-op once
+ * any tests have returned results. Properties are global properties of the test
+ * harness. Currently recognised properties are:
+ *
+ * timeout - The time in ms after which the harness should stop waiting for
+ * tests to complete (this is different to the per-test timeout
+ * because async tests do not start their timer until .step is called)
+ *
+ * explicit_done - Wait for an explicit call to done() before declaring all
+ * tests complete (see below)
+ *
+ * output_document - The document to which results should be logged. By default
+ * this is the current document but could be an ancestor
+ * document in some cases e.g. a SVG test loaded in an HTML
+ * wrapper
+ *
+ * explicit_timeout - disable file timeout; only stop waiting for results
+ * when the timeout() function is called (typically for
+ * use when integrating with some existing test framework
+ * that has its own timeout mechanism).
+ *
+ * == Determining when all tests are complete ==
+ *
+ * By default the test harness will assume there are no more results to come
+ * when:
+ * 1) There are no Test objects that have been created but not completed
+ * 2) The load event on the document has fired
+ *
+ * This behaviour can be overridden by setting the explicit_done property to
+ * true in a call to setup(). If explicit_done is true, the test harness will
+ * not assume it is done until the global done() function is called. Once done()
+ * is called, the two conditions above apply like normal.
+ *
+ * == Generating tests ==
+ *
+ * NOTE: this functionality may be removed
+ *
+ * There are scenarios in which is is desirable to create a large number of
+ * (synchronous) tests that are internally similar but vary in the parameters
+ * used. To make this easier, the generate_tests function allows a single
+ * function to be called with each set of parameters in a list:
+ *
+ * generate_tests(test_function, parameter_lists, properties)
+ *
+ * For example:
+ *
+ * generate_tests(assert_equals, [
+ * ["Sum one and one", 1+1, 2],
+ * ["Sum one and zero", 1+0, 1]
+ * ])
+ *
+ * Is equivalent to:
+ *
+ * test(function() {assert_equals(1+1, 2)}, "Sum one and one")
+ * test(function() {assert_equals(1+0, 1)}, "Sum one and zero")
+ *
+ * Note that the first item in each parameter list corresponds to the name of
+ * the test.
+ *
+ * The properties argument is identical to that for test(). This may be a
+ * single object (used for all generated tests) or an array.
+ *
+ * == Callback API ==
+ *
+ * The framework provides callbacks corresponding to 3 events:
+ *
+ * start - happens when the first Test is created
+ * result - happens when a test result is recieved
+ * complete - happens when all results are recieved
+ *
+ * The page defining the tests may add callbacks for these events by calling
+ * the following methods:
+ *
+ * add_start_callback(callback) - callback called with no arguments
+ * add_result_callback(callback) - callback called with a test argument
+ * add_completion_callback(callback) - callback called with an array of tests
+ * and an status object
+ *
+ * tests have the following properties:
+ * status: A status code. This can be compared to the PASS, FAIL, TIMEOUT and
+ * NOTRUN properties on the test object
+ * message: A message indicating the reason for failure. In the future this
+ * will always be a string
+ *
+ * The status object gives the overall status of the harness. It has the
+ * following properties:
+ * status: Can be compared to the OK, ERROR and TIMEOUT properties
+ * message: An error message set when the status is ERROR
+ *
+ * == External API ==
+ *
+ * In order to collect the results of multiple pages containing tests, the test
+ * harness will, when loaded in a nested browsing context, attempt to call
+ * certain functions in each ancestor and opener browsing context:
+ *
+ * start - start_callback
+ * result - result_callback
+ * complete - completion_callback
+ *
+ * These are given the same arguments as the corresponding internal callbacks
+ * described above.
+ *
+ * == External API through cross-document messaging ==
+ *
+ * Where supported, the test harness will also send messages using
+ * cross-document messaging to each ancestor and opener browsing context. Since
+ * it uses the wildcard keyword (*), cross-origin communication is enabled and
+ * script on different origins can collect the results.
+ *
+ * This API follows similar conventions as those described above only slightly
+ * modified to accommodate message event API. Each message is sent by the harness
+ * is passed a single vanilla object, available as the `data` property of the
+ * event object. These objects are structures as follows:
+ *
+ * start - { type: "start" }
+ * result - { type: "result", test: Test }
+ * complete - { type: "complete", tests: [Test, ...], status: TestsStatus }
+ *
+ * == List of assertions ==
+ *
+ * assert_true(actual, description)
+ * asserts that /actual/ is strictly true
+ *
+ * assert_false(actual, description)
+ * asserts that /actual/ is strictly false
+ *
+ * assert_equals(actual, expected, description)
+ * asserts that /actual/ is the same value as /expected/
+ *
+ * assert_not_equals(actual, expected, description)
+ * asserts that /actual/ is a different value to /expected/. Yes, this means
+ * that "expected" is a misnomer
+ *
+ * assert_in_array(actual, expected, description)
+ * asserts that /expected/ is an Array, and /actual/ is equal to one of the
+ * members -- expected.indexOf(actual) != -1
+ *
+ * assert_array_equals(actual, expected, description)
+ * asserts that /actual/ and /expected/ have the same length and the value of
+ * each indexed property in /actual/ is the strictly equal to the corresponding
+ * property value in /expected/
+ *
+ * assert_approx_equals(actual, expected, epsilon, description)
+ * asserts that /actual/ is a number within +/- /epsilon/ of /expected/
+ *
+ * assert_less_than(actual, expected, description)
+ * asserts that /actual/ is a number less than /expected/
+ *
+ * assert_greater_than(actual, expected, description)
+ * asserts that /actual/ is a number greater than /expected/
+ *
+ * assert_less_than_equal(actual, expected, description)
+ * asserts that /actual/ is a number less than or equal to /expected/
+ *
+ * assert_greater_than_equal(actual, expected, description)
+ * asserts that /actual/ is a number greater than or equal to /expected/
+ *
+ * assert_regexp_match(actual, expected, description)
+ * asserts that /actual/ matches the regexp /expected/
+ *
+ * assert_class_string(object, class_name, description)
+ * asserts that the class string of /object/ as returned in
+ * Object.prototype.toString is equal to /class_name/.
+ *
+ * assert_own_property(object, property_name, description)
+ * assert that object has own property property_name
+ *
+ * assert_inherits(object, property_name, description)
+ * assert that object does not have an own property named property_name
+ * but that property_name is present in the prototype chain for object
+ *
+ * assert_idl_attribute(object, attribute_name, description)
+ * assert that an object that is an instance of some interface has the
+ * attribute attribute_name following the conditions specified by WebIDL
+ *
+ * assert_readonly(object, property_name, description)
+ * assert that property property_name on object is readonly
+ *
+ * assert_throws(code, func, description)
+ * code - the expected exception:
+ * o string: the thrown exception must be a DOMException with the given
+ * name, e.g., "TimeoutError" (for compatibility with existing
+ * tests, a constant is also supported, e.g., "TIMEOUT_ERR")
+ * o object: the thrown exception must have a property called "name" that
+ * matches code.name
+ * o null: allow any exception (in general, one of the options above
+ * should be used)
+ * func - a function that should throw
+ *
+ * assert_unreached(description)
+ * asserts if called. Used to ensure that some codepath is *not* taken e.g.
+ * an event does not fire.
+ *
+ * assert_any(assert_func, actual, expected_array, extra_arg_1, ... extra_arg_N)
+ * asserts that one assert_func(actual, expected_array_N, extra_arg1, ..., extra_arg_N)
+ * is true for some expected_array_N in expected_array. This only works for assert_func
+ * with signature assert_func(actual, expected, args_1, ..., args_N). Note that tests
+ * with multiple allowed pass conditions are bad practice unless the spec specifically
+ * allows multiple behaviours. Test authors should not use this method simply to hide
+ * UA bugs.
+ *
+ * assert_exists(object, property_name, description)
+ * *** deprecated ***
+ * asserts that object has an own property property_name
+ *
+ * assert_not_exists(object, property_name, description)
+ * *** deprecated ***
+ * assert that object does not have own property property_name
+ */
+
+(function ()
+{
+ var debug = false;
+ // default timeout is 5 seconds, test can override if needed
+ var settings = {
+ output:true,
+ timeout:9000,
+ test_timeout:5000
+ };
+
+ var xhtml_ns = "http://www.w3.org/1999/xhtml";
+
+ // script_prefix is used by Output.prototype.show_results() to figure out
+ // where to get testharness.css from. It's enclosed in an extra closure to
+ // not pollute the library's namespace with variables like "src".
+ var script_prefix = null;
+ (function ()
+ {
+ var scripts = document.getElementsByTagName("script");
+ for (var i = 0; i < scripts.length; i++)
+ {
+ if (scripts[i].src)
+ {
+ var src = scripts[i].src;
+ }
+ else if (scripts[i].href)
+ {
+ //SVG case
+ var src = scripts[i].href.baseVal;
+ }
+ if (src && src.slice(src.length - "testharness.js".length) === "testharness.js")
+ {
+ script_prefix = src.slice(0, src.length - "testharness.js".length);
+ break;
+ }
+ }
+ })();
+
+ /*
+ * API functions
+ */
+
+ var name_counter = 0;
+ function next_default_name()
+ {
+ //Don't use document.title to work around an Opera bug in XHTML documents
+ var prefix = document.getElementsByTagName("title").length > 0 ?
+ document.getElementsByTagName("title")[0].firstChild.data :
+ "Untitled";
+ var suffix = name_counter > 0 ? " " + name_counter : "";
+ name_counter++;
+ return prefix + suffix;
+ }
+
+ function test(func, name, properties)
+ {
+ var test_name = name ? name : next_default_name();
+ properties = properties ? properties : {};
+ var test_obj = new Test(test_name, properties);
+ test_obj.step(func);
+ if (test_obj.status === test_obj.NOTRUN) {
+ test_obj.done();
+ }
+ }
+
+ function async_test(func, name, properties)
+ {
+ if (typeof func !== "function") {
+ properties = name;
+ name = func;
+ func = null;
+ }
+ var test_name = name ? name : next_default_name();
+ properties = properties ? properties : {};
+ var test_obj = new Test(test_name, properties);
+ if (func) {
+ test_obj.step(func, test_obj, test_obj);
+ }
+ return test_obj;
+ }
+
+ function setup(func_or_properties, maybe_properties)
+ {
+ var func = null;
+ var properties = {};
+ if (arguments.length === 2) {
+ func = func_or_properties;
+ properties = maybe_properties;
+ } else if (func_or_properties instanceof Function){
+ func = func_or_properties;
+ } else {
+ properties = func_or_properties;
+ }
+ tests.setup(func, properties);
+ output.setup(properties);
+ }
+
+ function done() {
+ tests.end_wait();
+ }
+
+ function generate_tests(func, args, properties) {
+ forEach(args, function(x, i)
+ {
+ var name = x[0];
+ test(function()
+ {
+ func.apply(this, x.slice(1));
+ },
+ name,
+ Array.isArray(properties) ? properties[i] : properties);
+ });
+ }
+
+ function on_event(object, event, callback)
+ {
+ object.addEventListener(event, callback, false);
+ }
+
+ expose(test, 'test');
+ expose(async_test, 'async_test');
+ expose(generate_tests, 'generate_tests');
+ expose(setup, 'setup');
+ expose(done, 'done');
+ expose(on_event, 'on_event');
+
+ /*
+ * Return a string truncated to the given length, with ... added at the end
+ * if it was longer.
+ */
+ function truncate(s, len)
+ {
+ if (s.length > len) {
+ return s.substring(0, len - 3) + "...";
+ }
+ return s;
+ }
+
+ /*
+ * Convert a value to a nice, human-readable string
+ */
+ function format_value(val)
+ {
+ if (Array.isArray(val))
+ {
+ return "[" + val.map(format_value).join(", ") + "]";
+ }
+
+ switch (typeof val)
+ {
+ case "string":
+ val = val.replace("\\", "\\\\");
+ for (var i = 0; i < 32; i++)
+ {
+ var replace = "\\";
+ switch (i) {
+ case 0: replace += "0"; break;
+ case 1: replace += "x01"; break;
+ case 2: replace += "x02"; break;
+ case 3: replace += "x03"; break;
+ case 4: replace += "x04"; break;
+ case 5: replace += "x05"; break;
+ case 6: replace += "x06"; break;
+ case 7: replace += "x07"; break;
+ case 8: replace += "b"; break;
+ case 9: replace += "t"; break;
+ case 10: replace += "n"; break;
+ case 11: replace += "v"; break;
+ case 12: replace += "f"; break;
+ case 13: replace += "r"; break;
+ case 14: replace += "x0e"; break;
+ case 15: replace += "x0f"; break;
+ case 16: replace += "x10"; break;
+ case 17: replace += "x11"; break;
+ case 18: replace += "x12"; break;
+ case 19: replace += "x13"; break;
+ case 20: replace += "x14"; break;
+ case 21: replace += "x15"; break;
+ case 22: replace += "x16"; break;
+ case 23: replace += "x17"; break;
+ case 24: replace += "x18"; break;
+ case 25: replace += "x19"; break;
+ case 26: replace += "x1a"; break;
+ case 27: replace += "x1b"; break;
+ case 28: replace += "x1c"; break;
+ case 29: replace += "x1d"; break;
+ case 30: replace += "x1e"; break;
+ case 31: replace += "x1f"; break;
+ }
+ val = val.replace(RegExp(String.fromCharCode(i), "g"), replace);
+ }
+ return '"' + val.replace(/"/g, '\\"') + '"';
+ case "boolean":
+ case "undefined":
+ return String(val);
+ case "number":
+ // In JavaScript, -0 === 0 and String(-0) == "0", so we have to
+ // special-case.
+ if (val === -0 && 1/val === -Infinity)
+ {
+ return "-0";
+ }
+ return String(val);
+ case "object":
+ if (val === null)
+ {
+ return "null";
+ }
+
+ // Special-case Node objects, since those come up a lot in my tests. I
+ // ignore namespaces. I use duck-typing instead of instanceof, because
+ // instanceof doesn't work if the node is from another window (like an
+ // iframe's contentWindow):
+ // http://www.w3.org/Bugs/Public/show_bug.cgi?id=12295
+ if ("nodeType" in val
+ && "nodeName" in val
+ && "nodeValue" in val
+ && "childNodes" in val)
+ {
+ switch (val.nodeType)
+ {
+ case Node.ELEMENT_NODE:
+ var ret = "<" + val.tagName.toLowerCase();
+ for (var i = 0; i < val.attributes.length; i++)
+ {
+ ret += " " + val.attributes[i].name + '="' + val.attributes[i].value + '"';
+ }
+ ret += ">" + val.innerHTML + "</" + val.tagName.toLowerCase() + ">";
+ return "Element node " + truncate(ret, 60);
+ case Node.TEXT_NODE:
+ return 'Text node "' + truncate(val.data, 60) + '"';
+ case Node.PROCESSING_INSTRUCTION_NODE:
+ return "ProcessingInstruction node with target " + format_value(truncate(val.target, 60)) + " and data " + format_value(truncate(val.data, 60));
+ case Node.COMMENT_NODE:
+ return "Comment node <!--" + truncate(val.data, 60) + "-->";
+ case Node.DOCUMENT_NODE:
+ return "Document node with " + val.childNodes.length + (val.childNodes.length == 1 ? " child" : " children");
+ case Node.DOCUMENT_TYPE_NODE:
+ return "DocumentType node";
+ case Node.DOCUMENT_FRAGMENT_NODE:
+ return "DocumentFragment node with " + val.childNodes.length + (val.childNodes.length == 1 ? " child" : " children");
+ default:
+ return "Node object of unknown type";
+ }
+ }
+
+ // Fall through to default
+ default:
+ return typeof val + ' "' + truncate(String(val), 60) + '"';
+ }
+ }
+ expose(format_value, "format_value");
+
+ /*
+ * Assertions
+ */
+
+ function assert_true(actual, description)
+ {
+ assert(actual === true, "assert_true", description,
+ "expected true got ${actual}", {actual:actual});
+ };
+ expose(assert_true, "assert_true");
+
+ function assert_false(actual, description)
+ {
+ assert(actual === false, "assert_false", description,
+ "expected false got ${actual}", {actual:actual});
+ };
+ expose(assert_false, "assert_false");
+
+ function same_value(x, y) {
+ if (y !== y)
+ {
+ //NaN case
+ return x !== x;
+ }
+ else if (x === 0 && y === 0) {
+ //Distinguish +0 and -0
+ return 1/x === 1/y;
+ }
+ else
+ {
+ //typical case
+ return x === y;
+ }
+ }
+
+ function assert_equals(actual, expected, description)
+ {
+ /*
+ * Test if two primitives are equal or two objects
+ * are the same object
+ */
+ if (typeof actual != typeof expected)
+ {
+ assert(false, "assert_equals", description,
+ "expected (" + typeof expected + ") ${expected} but got (" + typeof actual + ") ${actual}",
+ {expected:expected, actual:actual});
+ return;
+ }
+ assert(same_value(actual, expected), "assert_equals", description,
+ "expected ${expected} but got ${actual}",
+ {expected:expected, actual:actual});
+ };
+ expose(assert_equals, "assert_equals");
+
+ function assert_not_equals(actual, expected, description)
+ {
+ /*
+ * Test if two primitives are unequal or two objects
+ * are different objects
+ */
+ assert(!same_value(actual, expected), "assert_not_equals", description,
+ "got disallowed value ${actual}",
+ {actual:actual});
+ };
+ expose(assert_not_equals, "assert_not_equals");
+
+ function assert_in_array(actual, expected, description)
+ {
+ assert(expected.indexOf(actual) != -1, "assert_in_array", description,
+ "value ${actual} not in array ${expected}",
+ {actual:actual, expected:expected});
+ }
+ expose(assert_in_array, "assert_in_array");
+
+ function assert_object_equals(actual, expected, description)
+ {
+ //This needs to be improved a great deal
+ function check_equal(actual, expected, stack)
+ {
+ stack.push(actual);
+
+ var p;
+ for (p in actual)
+ {
+ assert(expected.hasOwnProperty(p), "assert_object_equals", description,
+ "unexpected property ${p}", {p:p});
+
+ if (typeof actual[p] === "object" && actual[p] !== null)
+ {
+ if (stack.indexOf(actual[p]) === -1)
+ {
+ check_equal(actual[p], expected[p], stack);
+ }
+ }
+ else
+ {
+ assert(same_value(actual[p], expected[p]), "assert_object_equals", description,
+ "property ${p} expected ${expected} got ${actual}",
+ {p:p, expected:expected, actual:actual});
+ }
+ }
+ for (p in expected)
+ {
+ assert(actual.hasOwnProperty(p),
+ "assert_object_equals", description,
+ "expected property ${p} missing", {p:p});
+ }
+ stack.pop();
+ }
+ check_equal(actual, expected, []);
+ };
+ expose(assert_object_equals, "assert_object_equals");
+
+ function assert_array_equals(actual, expected, description)
+ {
+ assert(actual.length === expected.length,
+ "assert_array_equals", description,
+ "lengths differ, expected ${expected} got ${actual}",
+ {expected:expected.length, actual:actual.length});
+
+ for (var i=0; i < actual.length; i++)
+ {
+ assert(actual.hasOwnProperty(i) === expected.hasOwnProperty(i),
+ "assert_array_equals", description,
+ "property ${i}, property expected to be $expected but was $actual",
+ {i:i, expected:expected.hasOwnProperty(i) ? "present" : "missing",
+ actual:actual.hasOwnProperty(i) ? "present" : "missing"});
+ assert(same_value(expected[i], actual[i]),
+ "assert_array_equals", description,
+ "property ${i}, expected ${expected} but got ${actual}",
+ {i:i, expected:expected[i], actual:actual[i]});
+ }
+ }
+ expose(assert_array_equals, "assert_array_equals");
+
+ function assert_approx_equals(actual, expected, epsilon, description)
+ {
+ /*
+ * Test if two primitive numbers are equal withing +/- epsilon
+ */
+ assert(typeof actual === "number",
+ "assert_approx_equals", description,
+ "expected a number but got a ${type_actual}",
+ {type_actual:typeof actual});
+
+ assert(Math.abs(actual - expected) <= epsilon,
+ "assert_approx_equals", description,
+ "expected ${expected} +/- ${epsilon} but got ${actual}",
+ {expected:expected, actual:actual, epsilon:epsilon});
+ };
+ expose(assert_approx_equals, "assert_approx_equals");
+
+ function assert_less_than(actual, expected, description)
+ {
+ /*
+ * Test if a primitive number is less than another
+ */
+ assert(typeof actual === "number",
+ "assert_less_than", description,
+ "expected a number but got a ${type_actual}",
+ {type_actual:typeof actual});
+
+ assert(actual < expected,
+ "assert_less_than", description,
+ "expected a number less than ${expected} but got ${actual}",
+ {expected:expected, actual:actual});
+ };
+ expose(assert_less_than, "assert_less_than");
+
+ function assert_greater_than(actual, expected, description)
+ {
+ /*
+ * Test if a primitive number is greater than another
+ */
+ assert(typeof actual === "number",
+ "assert_greater_than", description,
+ "expected a number but got a ${type_actual}",
+ {type_actual:typeof actual});
+
+ assert(actual > expected,
+ "assert_greater_than", description,
+ "expected a number greater than ${expected} but got ${actual}",
+ {expected:expected, actual:actual});
+ };
+ expose(assert_greater_than, "assert_greater_than");
+
+ function assert_less_than_equal(actual, expected, description)
+ {
+ /*
+ * Test if a primitive number is less than or equal to another
+ */
+ assert(typeof actual === "number",
+ "assert_less_than_equal", description,
+ "expected a number but got a ${type_actual}",
+ {type_actual:typeof actual});
+
+ assert(actual <= expected,
+ "assert_less_than", description,
+ "expected a number less than or equal to ${expected} but got ${actual}",
+ {expected:expected, actual:actual});
+ };
+ expose(assert_less_than_equal, "assert_less_than_equal");
+
+ function assert_greater_than_equal(actual, expected, description)
+ {
+ /*
+ * Test if a primitive number is greater than or equal to another
+ */
+ assert(typeof actual === "number",
+ "assert_greater_than_equal", description,
+ "expected a number but got a ${type_actual}",
+ {type_actual:typeof actual});
+
+ assert(actual >= expected,
+ "assert_greater_than_equal", description,
+ "expected a number greater than or equal to ${expected} but got ${actual}",
+ {expected:expected, actual:actual});
+ };
+ expose(assert_greater_than_equal, "assert_greater_than_equal");
+
+ function assert_regexp_match(actual, expected, description) {
+ /*
+ * Test if a string (actual) matches a regexp (expected)
+ */
+ assert(expected.test(actual),
+ "assert_regexp_match", description,
+ "expected ${expected} but got ${actual}",
+ {expected:expected, actual:actual});
+ }
+ expose(assert_regexp_match, "assert_regexp_match");
+
+ function assert_class_string(object, class_string, description) {
+ assert_equals({}.toString.call(object), "[object " + class_string + "]",
+ description);
+ }
+ expose(assert_class_string, "assert_class_string");
+
+
+ function _assert_own_property(name) {
+ return function(object, property_name, description)
+ {
+ assert(object.hasOwnProperty(property_name),
+ name, description,
+ "expected property ${p} missing", {p:property_name});
+ };
+ }
+ expose(_assert_own_property("assert_exists"), "assert_exists");
+ expose(_assert_own_property("assert_own_property"), "assert_own_property");
+
+ function assert_not_exists(object, property_name, description)
+ {
+ assert(!object.hasOwnProperty(property_name),
+ "assert_not_exists", description,
+ "unexpected property ${p} found", {p:property_name});
+ };
+ expose(assert_not_exists, "assert_not_exists");
+
+ function _assert_inherits(name) {
+ return function (object, property_name, description)
+ {
+ assert(typeof object === "object",
+ name, description,
+ "provided value is not an object");
+
+ assert("hasOwnProperty" in object,
+ name, description,
+ "provided value is an object but has no hasOwnProperty method");
+
+ assert(!object.hasOwnProperty(property_name),
+ name, description,
+ "property ${p} found on object expected in prototype chain",
+ {p:property_name});
+
+ assert(property_name in object,
+ name, description,
+ "property ${p} not found in prototype chain",
+ {p:property_name});
+ };
+ }
+ expose(_assert_inherits("assert_inherits"), "assert_inherits");
+ expose(_assert_inherits("assert_idl_attribute"), "assert_idl_attribute");
+
+ function assert_readonly(object, property_name, description)
+ {
+ var initial_value = object[property_name];
+ try {
+ //Note that this can have side effects in the case where
+ //the property has PutForwards
+ object[property_name] = initial_value + "a"; //XXX use some other value here?
+ assert(same_value(object[property_name], initial_value),
+ "assert_readonly", description,
+ "changing property ${p} succeeded",
+ {p:property_name});
+ }
+ finally
+ {
+ object[property_name] = initial_value;
+ }
+ };
+ expose(assert_readonly, "assert_readonly");
+
+ function assert_throws(code, func, description)
+ {
+ try
+ {
+ func.call(this);
+ assert(false, "assert_throws", description,
+ "${func} did not throw", {func:func});
+ }
+ catch(e)
+ {
+ if (e instanceof AssertionError) {
+ throw(e);
+ }
+ if (code === null)
+ {
+ return;
+ }
+ if (typeof code === "object")
+ {
+ assert(typeof e == "object" && "name" in e && e.name == code.name,
+ "assert_throws", description,
+ "${func} threw ${actual} (${actual_name}) expected ${expected} (${expected_name})",
+ {func:func, actual:e, actual_name:e.name,
+ expected:code,
+ expected_name:code.name});
+ return;
+ }
+
+ var code_name_map = {
+ INDEX_SIZE_ERR: 'IndexSizeError',
+ HIERARCHY_REQUEST_ERR: 'HierarchyRequestError',
+ WRONG_DOCUMENT_ERR: 'WrongDocumentError',
+ INVALID_CHARACTER_ERR: 'InvalidCharacterError',
+ NO_MODIFICATION_ALLOWED_ERR: 'NoModificationAllowedError',
+ NOT_FOUND_ERR: 'NotFoundError',
+ NOT_SUPPORTED_ERR: 'NotSupportedError',
+ INVALID_STATE_ERR: 'InvalidStateError',
+ SYNTAX_ERR: 'SyntaxError',
+ INVALID_MODIFICATION_ERR: 'InvalidModificationError',
+ NAMESPACE_ERR: 'NamespaceError',
+ INVALID_ACCESS_ERR: 'InvalidAccessError',
+ TYPE_MISMATCH_ERR: 'TypeMismatchError',
+ SECURITY_ERR: 'SecurityError',
+ NETWORK_ERR: 'NetworkError',
+ ABORT_ERR: 'AbortError',
+ URL_MISMATCH_ERR: 'URLMismatchError',
+ QUOTA_EXCEEDED_ERR: 'QuotaExceededError',
+ TIMEOUT_ERR: 'TimeoutError',
+ INVALID_NODE_TYPE_ERR: 'InvalidNodeTypeError',
+ DATA_CLONE_ERR: 'DataCloneError'
+ };
+
+ var name = code in code_name_map ? code_name_map[code] : code;
+
+ var name_code_map = {
+ IndexSizeError: 1,
+ HierarchyRequestError: 3,
+ WrongDocumentError: 4,
+ InvalidCharacterError: 5,
+ NoModificationAllowedError: 7,
+ NotFoundError: 8,
+ NotSupportedError: 9,
+ InvalidStateError: 11,
+ SyntaxError: 12,
+ InvalidModificationError: 13,
+ NamespaceError: 14,
+ InvalidAccessError: 15,
+ TypeMismatchError: 17,
+ SecurityError: 18,
+ NetworkError: 19,
+ AbortError: 20,
+ URLMismatchError: 21,
+ QuotaExceededError: 22,
+ TimeoutError: 23,
+ InvalidNodeTypeError: 24,
+ DataCloneError: 25,
+
+ UnknownError: 0,
+ ConstraintError: 0,
+ DataError: 0,
+ TransactionInactiveError: 0,
+ ReadOnlyError: 0,
+ VersionError: 0
+ };
+
+ if (!(name in name_code_map))
+ {
+ throw new AssertionError('Test bug: unrecognized DOMException code "' + code + '" passed to assert_throws()');
+ }
+
+ var required_props = { code: name_code_map[name] };
+
+ if (required_props.code === 0
+ || ("name" in e && e.name !== e.name.toUpperCase() && e.name !== "DOMException"))
+ {
+ // New style exception: also test the name property.
+ required_props.name = name;
+ }
+
+ //We'd like to test that e instanceof the appropriate interface,
+ //but we can't, because we don't know what window it was created
+ //in. It might be an instanceof the appropriate interface on some
+ //unknown other window. TODO: Work around this somehow?
+
+ assert(typeof e == "object",
+ "assert_throws", description,
+ "${func} threw ${e} with type ${type}, not an object",
+ {func:func, e:e, type:typeof e});
+
+ for (var prop in required_props)
+ {
+ assert(typeof e == "object" && prop in e && e[prop] == required_props[prop],
+ "assert_throws", description,
+ "${func} threw ${e} that is not a DOMException " + code + ": property ${prop} is equal to ${actual}, expected ${expected}",
+ {func:func, e:e, prop:prop, actual:e[prop], expected:required_props[prop]});
+ }
+ }
+ }
+ expose(assert_throws, "assert_throws");
+
+ function assert_unreached(description) {
+ assert(false, "assert_unreached", description,
+ "Reached unreachable code");
+ }
+ expose(assert_unreached, "assert_unreached");
+
+ function assert_any(assert_func, actual, expected_array)
+ {
+ var args = [].slice.call(arguments, 3)
+ var errors = []
+ var passed = false;
+ forEach(expected_array,
+ function(expected)
+ {
+ try {
+ assert_func.apply(this, [actual, expected].concat(args))
+ passed = true;
+ } catch(e) {
+ errors.push(e.message);
+ }
+ });
+ if (!passed) {
+ throw new AssertionError(errors.join("\n\n"));
+ }
+ }
+ expose(assert_any, "assert_any");
+
+ function Test(name, properties)
+ {
+ this.name = name;
+ this.status = this.NOTRUN;
+ this.timeout_id = null;
+ this.is_done = false;
+
+ this.properties = properties;
+ this.timeout_length = properties.timeout ? properties.timeout : settings.test_timeout;
+
+ this.message = null;
+
+ var this_obj = this;
+ this.steps = [];
+
+ tests.push(this);
+ }
+
+ Test.statuses = {
+ PASS:0,
+ FAIL:1,
+ TIMEOUT:2,
+ NOTRUN:3
+ };
+
+ Test.prototype = merge({}, Test.statuses);
+
+ Test.prototype.structured_clone = function()
+ {
+ if(!this._structured_clone)
+ {
+ var msg = this.message;
+ msg = msg ? String(msg) : msg;
+ this._structured_clone = merge({
+ name:String(this.name),
+ status:this.status,
+ message:msg
+ }, Test.statuses);
+ }
+ return this._structured_clone;
+ };
+
+ Test.prototype.step = function(func, this_obj)
+ {
+ //In case the test has already failed
+ if (this.status !== this.NOTRUN)
+ {
+ return;
+ }
+
+ tests.started = true;
+
+ if (this.timeout_id === null) {
+ this.set_timeout();
+ }
+
+ this.steps.push(func);
+
+ if (arguments.length === 1)
+ {
+ this_obj = this;
+ }
+
+ try
+ {
+ return func.apply(this_obj, Array.prototype.slice.call(arguments, 2));
+ }
+ catch(e)
+ {
+ //This can happen if something called synchronously invoked another
+ //step
+ if (this.status !== this.NOTRUN)
+ {
+ return;
+ }
+ this.status = this.FAIL;
+ this.message = (typeof e === "object" && e !== null) ? e.message : e;
+ if (typeof e.stack != "undefined" && typeof e.message == "string") {
+ //Try to make it more informative for some exceptions, at least
+ //in Gecko and WebKit. This results in a stack dump instead of
+ //just errors like "Cannot read property 'parentNode' of null"
+ //or "root is null". Makes it a lot longer, of course.
+ this.message += "(stack: " + e.stack + ")";
+ }
+ this.done();
+ if (debug && e.constructor !== AssertionError) {
+ throw e;
+ }
+ }
+ };
+
+ Test.prototype.step_func = function(func, this_obj)
+ {
+ var test_this = this;
+
+ if (arguments.length === 1)
+ {
+ this_obj = test_this;
+ }
+
+ return function()
+ {
+ test_this.step.apply(test_this, [func, this_obj].concat(
+ Array.prototype.slice.call(arguments)));
+ };
+ };
+
+ Test.prototype.step_func_done = function(func, this_obj)
+ {
+ var test_this = this;
+
+ if (arguments.length === 1)
+ {
+ this_obj = test_this;
+ }
+
+ return function()
+ {
+ test_this.step.apply(test_this, [func, this_obj].concat(
+ Array.prototype.slice.call(arguments)));
+ test_this.done();
+ };
+ };
+
+ Test.prototype.set_timeout = function()
+ {
+ var this_obj = this;
+ this.timeout_id = setTimeout(function()
+ {
+ this_obj.timeout();
+ }, this.timeout_length);
+ };
+
+ Test.prototype.timeout = function()
+ {
+ this.status = this.TIMEOUT;
+ this.timeout_id = null;
+ this.message = "Test timed out";
+ this.done();
+ };
+
+ Test.prototype.done = function()
+ {
+ if (this.is_done) {
+ return;
+ }
+ clearTimeout(this.timeout_id);
+ if (this.status === this.NOTRUN)
+ {
+ this.status = this.PASS;
+ }
+ this.is_done = true;
+ tests.result(this);
+ };
+
+
+ /*
+ * Harness
+ */
+
+ function TestsStatus()
+ {
+ this.status = null;
+ this.message = null;
+ }
+
+ TestsStatus.statuses = {
+ OK:0,
+ ERROR:1,
+ TIMEOUT:2
+ };
+
+ TestsStatus.prototype = merge({}, TestsStatus.statuses);
+
+ TestsStatus.prototype.structured_clone = function()
+ {
+ if(!this._structured_clone)
+ {
+ var msg = this.message;
+ msg = msg ? String(msg) : msg;
+ this._structured_clone = merge({
+ status:this.status,
+ message:msg
+ }, TestsStatus.statuses);
+ }
+ return this._structured_clone;
+ };
+
+ function Tests()
+ {
+ this.tests = [];
+ this.num_pending = 0;
+
+ this.phases = {
+ INITIAL:0,
+ SETUP:1,
+ HAVE_TESTS:2,
+ HAVE_RESULTS:3,
+ COMPLETE:4
+ };
+ this.phase = this.phases.INITIAL;
+
+ this.properties = {};
+
+ //All tests can't be done until the load event fires
+ this.all_loaded = false;
+ this.wait_for_finish = false;
+ this.processing_callbacks = false;
+
+ this.timeout_length = settings.timeout;
+ this.timeout_id = null;
+
+ this.start_callbacks = [];
+ this.test_done_callbacks = [];
+ this.all_done_callbacks = [];
+
+ this.status = new TestsStatus();
+
+ var this_obj = this;
+
+ on_event(window, "load",
+ function()
+ {
+ this_obj.all_loaded = true;
+ if (this_obj.all_done())
+ {
+ this_obj.complete();
+ }
+ });
+
+ this.set_timeout();
+ }
+
+ Tests.prototype.setup = function(func, properties)
+ {
+ if (this.phase >= this.phases.HAVE_RESULTS)
+ {
+ return;
+ }
+ if (this.phase < this.phases.SETUP)
+ {
+ this.phase = this.phases.SETUP;
+ }
+
+ for (var p in properties)
+ {
+ if (properties.hasOwnProperty(p))
+ {
+ this.properties[p] = properties[p];
+ }
+ }
+
+ if (properties.timeout)
+ {
+ this.timeout_length = properties.timeout;
+ }
+ if (properties.explicit_done)
+ {
+ this.wait_for_finish = true;
+ }
+ if (properties.explicit_timeout) {
+ this.timeout_length = null;
+ }
+
+ if (func)
+ {
+ try
+ {
+ func();
+ } catch(e)
+ {
+ this.status.status = this.status.ERROR;
+ this.status.message = e;
+ };
+ }
+ this.set_timeout();
+ };
+
+ Tests.prototype.set_timeout = function()
+ {
+ var this_obj = this;
+ clearTimeout(this.timeout_id);
+ if (this.timeout_length !== null)
+ {
+ this.timeout_id = setTimeout(function() {
+ this_obj.timeout();
+ }, this.timeout_length);
+ }
+ };
+
+ Tests.prototype.timeout = function() {
+ this.status.status = this.status.TIMEOUT;
+ this.complete();
+ };
+
+ Tests.prototype.end_wait = function()
+ {
+ this.wait_for_finish = false;
+ if (this.all_done()) {
+ this.complete();
+ }
+ };
+
+ Tests.prototype.push = function(test)
+ {
+ if (this.phase < this.phases.HAVE_TESTS) {
+ this.start();
+ }
+ this.num_pending++;
+ this.tests.push(test);
+ };
+
+ Tests.prototype.all_done = function() {
+ return (this.all_loaded && this.num_pending === 0 &&
+ !this.wait_for_finish && !this.processing_callbacks);
+ };
+
+ Tests.prototype.start = function() {
+ this.phase = this.phases.HAVE_TESTS;
+ this.notify_start();
+ };
+
+ Tests.prototype.notify_start = function() {
+ var this_obj = this;
+ forEach (this.start_callbacks,
+ function(callback)
+ {
+ callback(this_obj.properties);
+ });
+ forEach_windows(
+ function(w, is_same_origin)
+ {
+ if(is_same_origin && w.start_callback)
+ {
+ try
+ {
+ w.start_callback(this_obj.properties);
+ }
+ catch(e)
+ {
+ if (debug)
+ {
+ throw(e);
+ }
+ }
+ }
+ if (supports_post_message(w) && w !== self)
+ {
+ w.postMessage({
+ type: "start",
+ properties: this_obj.properties
+ }, "*");
+ }
+ });
+ };
+
+ Tests.prototype.result = function(test)
+ {
+ if (this.phase > this.phases.HAVE_RESULTS)
+ {
+ return;
+ }
+ this.phase = this.phases.HAVE_RESULTS;
+ this.num_pending--;
+ this.notify_result(test);
+ };
+
+ Tests.prototype.notify_result = function(test) {
+ var this_obj = this;
+ this.processing_callbacks = true;
+ forEach(this.test_done_callbacks,
+ function(callback)
+ {
+ callback(test, this_obj);
+ });
+
+ forEach_windows(
+ function(w, is_same_origin)
+ {
+ if(is_same_origin && w.result_callback)
+ {
+ try
+ {
+ w.result_callback(test);
+ }
+ catch(e)
+ {
+ if(debug) {
+ throw e;
+ }
+ }
+ }
+ if (supports_post_message(w) && w !== self)
+ {
+ w.postMessage({
+ type: "result",
+ test: test.structured_clone()
+ }, "*");
+ }
+ });
+ this.processing_callbacks = false;
+ if (this_obj.all_done())
+ {
+ this_obj.complete();
+ }
+ };
+
+ Tests.prototype.complete = function() {
+ if (this.phase === this.phases.COMPLETE) {
+ return;
+ }
+ this.phase = this.phases.COMPLETE;
+ var this_obj = this;
+ this.tests.forEach(
+ function(x)
+ {
+ if(x.status === x.NOTRUN)
+ {
+ this_obj.notify_result(x);
+ }
+ }
+ );
+ this.notify_complete();
+ };
+
+ Tests.prototype.notify_complete = function()
+ {
+ clearTimeout(this.timeout_id);
+ var this_obj = this;
+ var tests = map(this_obj.tests,
+ function(test)
+ {
+ return test.structured_clone();
+ });
+ if (this.status.status === null)
+ {
+ this.status.status = this.status.OK;
+ }
+
+ forEach (this.all_done_callbacks,
+ function(callback)
+ {
+ callback(this_obj.tests, this_obj.status);
+ });
+
+ forEach_windows(
+ function(w, is_same_origin)
+ {
+ if(is_same_origin && w.completion_callback)
+ {
+ try
+ {
+ w.completion_callback(this_obj.tests, this_obj.status);
+ }
+ catch(e)
+ {
+ if (debug)
+ {
+ throw e;
+ }
+ }
+ }
+ if (supports_post_message(w) && w !== self)
+ {
+ w.postMessage({
+ type: "complete",
+ tests: tests,
+ status: this_obj.status.structured_clone()
+ }, "*");
+ }
+ });
+ };
+
+ var tests = new Tests();
+
+ function timeout() {
+ if (tests.timeout_length === null)
+ {
+ tests.timeout();
+ }
+ }
+ expose(timeout, 'timeout');
+
+ function add_start_callback(callback) {
+ tests.start_callbacks.push(callback);
+ }
+
+ function add_result_callback(callback)
+ {
+ tests.test_done_callbacks.push(callback);
+ }
+
+ function add_completion_callback(callback)
+ {
+ tests.all_done_callbacks.push(callback);
+ }
+
+ expose(add_start_callback, 'add_start_callback');
+ expose(add_result_callback, 'add_result_callback');
+ expose(add_completion_callback, 'add_completion_callback');
+
+ /*
+ * Output listener
+ */
+
+ function Output() {
+ this.output_document = document;
+ this.output_node = null;
+ this.done_count = 0;
+ this.enabled = settings.output;
+ this.phase = this.INITIAL;
+ }
+
+ Output.prototype.INITIAL = 0;
+ Output.prototype.STARTED = 1;
+ Output.prototype.HAVE_RESULTS = 2;
+ Output.prototype.COMPLETE = 3;
+
+ Output.prototype.setup = function(properties) {
+ if (this.phase > this.INITIAL) {
+ return;
+ }
+
+ //If output is disabled in testharnessreport.js the test shouldn't be
+ //able to override that
+ this.enabled = this.enabled && (properties.hasOwnProperty("output") ?
+ properties.output : settings.output);
+ };
+
+ Output.prototype.init = function(properties)
+ {
+ if (this.phase >= this.STARTED) {
+ return;
+ }
+ if (properties.output_document) {
+ this.output_document = properties.output_document;
+ } else {
+ this.output_document = document;
+ }
+ this.phase = this.STARTED;
+ };
+
+ Output.prototype.resolve_log = function()
+ {
+ var output_document;
+ if (typeof this.output_document === "function")
+ {
+ output_document = this.output_document.apply(undefined);
+ } else
+ {
+ output_document = this.output_document;
+ }
+ if (!output_document)
+ {
+ return;
+ }
+ var node = output_document.getElementById("log");
+ if (node)
+ {
+ this.output_document = output_document;
+ this.output_node = node;
+ }
+ };
+
+ Output.prototype.show_status = function(test)
+ {
+ if (this.phase < this.STARTED)
+ {
+ this.init();
+ }
+ if (!this.enabled)
+ {
+ return;
+ }
+ if (this.phase < this.HAVE_RESULTS)
+ {
+ this.resolve_log();
+ this.phase = this.HAVE_RESULTS;
+ }
+ this.done_count++;
+ if (this.output_node)
+ {
+ if (this.done_count < 100
+ || (this.done_count < 1000 && this.done_count % 100 == 0)
+ || this.done_count % 1000 == 0) {
+ this.output_node.textContent = "Running, "
+ + this.done_count + " complete, "
+ + tests.num_pending + " remain";
+ }
+ }
+ };
+
+ Output.prototype.show_results = function (tests, harness_status)
+ {
+ if (this.phase >= this.COMPLETE) {
+ return;
+ }
+ if (!this.enabled)
+ {
+ return;
+ }
+ if (!this.output_node) {
+ this.resolve_log();
+ }
+ this.phase = this.COMPLETE;
+
+ var log = this.output_node;
+ if (!log)
+ {
+ return;
+ }
+ var output_document = this.output_document;
+
+ while (log.lastChild)
+ {
+ log.removeChild(log.lastChild);
+ }
+
+ if (script_prefix != null) {
+ var stylesheet = output_document.createElementNS(xhtml_ns, "link");
+ stylesheet.setAttribute("rel", "stylesheet");
+ stylesheet.setAttribute("href", script_prefix + "testharness.css");
+ var heads = output_document.getElementsByTagName("head");
+ if (heads.length) {
+ heads[0].appendChild(stylesheet);
+ }
+ }
+
+ var status_text = {};
+ status_text[Test.prototype.PASS] = "Pass";
+ status_text[Test.prototype.FAIL] = "Fail";
+ status_text[Test.prototype.TIMEOUT] = "Timeout";
+ status_text[Test.prototype.NOTRUN] = "Not Run";
+
+ var status_number = {};
+ forEach(tests, function(test) {
+ var status = status_text[test.status];
+ if (status_number.hasOwnProperty(status))
+ {
+ status_number[status] += 1;
+ } else {
+ status_number[status] = 1;
+ }
+ });
+
+ function status_class(status)
+ {
+ return status.replace(/\s/g, '').toLowerCase();
+ }
+
+ var summary_template = ["section", {"id":"summary"},
+ ["h2", {}, "Summary"],
+ ["p", {}, "Found ${num_tests} tests"],
+ function(vars) {
+ var rv = [["div", {}]];
+ var i=0;
+ while (status_text.hasOwnProperty(i)) {
+ if (status_number.hasOwnProperty(status_text[i])) {
+ var status = status_text[i];
+ rv[0].push(["div", {"class":status_class(status)},
+ ["label", {},
+ ["input", {type:"checkbox", checked:"checked"}],
+ status_number[status] + " " + status]]);
+ }
+ i++;
+ }
+ return rv;
+ }];
+
+ log.appendChild(render(summary_template, {num_tests:tests.length}, output_document));
+
+ forEach(output_document.querySelectorAll("section#summary label"),
+ function(element)
+ {
+ on_event(element, "click",
+ function(e)
+ {
+ if (output_document.getElementById("results") === null)
+ {
+ e.preventDefault();
+ return;
+ }
+ var result_class = element.parentNode.getAttribute("class");
+ var style_element = output_document.querySelector("style#hide-" + result_class);
+ var input_element = element.querySelector("input");
+ if (!style_element && !input_element.checked) {
+ style_element = output_document.createElementNS(xhtml_ns, "style");
+ style_element.id = "hide-" + result_class;
+ style_element.textContent = "table#results > tbody > tr."+result_class+"{display:none}";
+ output_document.body.appendChild(style_element);
+ } else if (style_element && input_element.checked) {
+ style_element.parentNode.removeChild(style_element);
+ }
+ });
+ });
+
+ // This use of innerHTML plus manual escaping is not recommended in
+ // general, but is necessary here for performance. Using textContent
+ // on each individual <td> adds tens of seconds of execution time for
+ // large test suites (tens of thousands of tests).
+ function escape_html(s)
+ {
+ return s.replace(/\&/g, "&")
+ .replace(/</g, "<")
+ .replace(/"/g, """)
+ .replace(/'/g, "'");
+ }
+
+ function has_assertions()
+ {
+ for (var i = 0; i < tests.length; i++) {
+ if (tests[i].properties.hasOwnProperty("assert")) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ function get_assertion(test)
+ {
+ if (test.properties.hasOwnProperty("assert")) {
+ if (Array.isArray(test.properties.assert)) {
+ return test.properties.assert.join(' ');
+ }
+ return test.properties.assert;
+ }
+ return '';
+ }
+
+ log.appendChild(document.createElementNS(xhtml_ns, "section"));
+ var assertions = has_assertions();
+ var html = "<h2>Details</h2><table id='results' " + (assertions ? "class='assertions'" : "" ) + ">"
+ + "<thead><tr><th>Result</th><th>Test Name</th>"
+ + (assertions ? "<th>Assertion</th>" : "")
+ + "<th>Message</th></tr></thead>"
+ + "<tbody>";
+ for (var i = 0; i < tests.length; i++) {
+ html += '<tr class="'
+ + escape_html(status_class(status_text[tests[i].status]))
+ + '"><td>'
+ + escape_html(status_text[tests[i].status])
+ + "</td><td>"
+ + escape_html(tests[i].name)
+ + "</td><td>"
+ + (assertions ? escape_html(get_assertion(tests[i])) + "</td><td>" : "")
+ + escape_html(tests[i].message ? tests[i].message : " ")
+ + "</td></tr>";
+ }
+ html += "</tbody></table>";
+ try {
+ log.lastChild.innerHTML = html;
+ } catch (e) {
+ log.appendChild(document.createElementNS(xhtml_ns, "p"))
+ .textContent = "Setting innerHTML for the log threw an exception.";
+ log.appendChild(document.createElementNS(xhtml_ns, "pre"))
+ .textContent = html;
+ }
+ };
+
+ var output = new Output();
+ add_start_callback(function (properties) {output.init(properties);});
+ add_result_callback(function (test) {output.show_status(tests);});
+ add_completion_callback(function (tests, harness_status) {output.show_results(tests, harness_status);});
+
+ /*
+ * Template code
+ *
+ * A template is just a javascript structure. An element is represented as:
+ *
+ * [tag_name, {attr_name:attr_value}, child1, child2]
+ *
+ * the children can either be strings (which act like text nodes), other templates or
+ * functions (see below)
+ *
+ * A text node is represented as
+ *
+ * ["{text}", value]
+ *
+ * String values have a simple substitution syntax; ${foo} represents a variable foo.
+ *
+ * It is possible to embed logic in templates by using a function in a place where a
+ * node would usually go. The function must either return part of a template or null.
+ *
+ * In cases where a set of nodes are required as output rather than a single node
+ * with children it is possible to just use a list
+ * [node1, node2, node3]
+ *
+ * Usage:
+ *
+ * render(template, substitutions) - take a template and an object mapping
+ * variable names to parameters and return either a DOM node or a list of DOM nodes
+ *
+ * substitute(template, substitutions) - take a template and variable mapping object,
+ * make the variable substitutions and return the substituted template
+ *
+ */
+
+ function is_single_node(template)
+ {
+ return typeof template[0] === "string";
+ }
+
+ function substitute(template, substitutions)
+ {
+ if (typeof template === "function") {
+ var replacement = template(substitutions);
+ if (replacement)
+ {
+ var rv = substitute(replacement, substitutions);
+ return rv;
+ }
+ else
+ {
+ return null;
+ }
+ }
+ else if (is_single_node(template))
+ {
+ return substitute_single(template, substitutions);
+ }
+ else
+ {
+ return filter(map(template, function(x) {
+ return substitute(x, substitutions);
+ }), function(x) {return x !== null;});
+ }
+ }
+
+ function substitute_single(template, substitutions)
+ {
+ var substitution_re = /\${([^ }]*)}/g;
+
+ function do_substitution(input) {
+ var components = input.split(substitution_re);
+ var rv = [];
+ for (var i=0; i<components.length; i+=2)
+ {
+ rv.push(components[i]);
+ if (components[i+1])
+ {
+ rv.push(String(substitutions[components[i+1]]));
+ }
+ }
+ return rv;
+ }
+
+ var rv = [];
+ rv.push(do_substitution(String(template[0])).join(""));
+
+ if (template[0] === "{text}") {
+ substitute_children(template.slice(1), rv);
+ } else {
+ substitute_attrs(template[1], rv);
+ substitute_children(template.slice(2), rv);
+ }
+
+ function substitute_attrs(attrs, rv)
+ {
+ rv[1] = {};
+ for (var name in template[1])
+ {
+ if (attrs.hasOwnProperty(name))
+ {
+ var new_name = do_substitution(name).join("");
+ var new_value = do_substitution(attrs[name]).join("");
+ rv[1][new_name] = new_value;
+ };
+ }
+ }
+
+ function substitute_children(children, rv)
+ {
+ for (var i=0; i<children.length; i++)
+ {
+ if (children[i] instanceof Object) {
+ var replacement = substitute(children[i], substitutions);
+ if (replacement !== null)
+ {
+ if (is_single_node(replacement))
+ {
+ rv.push(replacement);
+ }
+ else
+ {
+ extend(rv, replacement);
+ }
+ }
+ }
+ else
+ {
+ extend(rv, do_substitution(String(children[i])));
+ }
+ }
+ return rv;
+ }
+
+ return rv;
+ }
+
+ function make_dom_single(template, doc)
+ {
+ var output_document = doc || document;
+ if (template[0] === "{text}")
+ {
+ var element = output_document.createTextNode("");
+ for (var i=1; i<template.length; i++)
+ {
+ element.data += template[i];
+ }
+ }
+ else
+ {
+ var element = output_document.createElementNS(xhtml_ns, template[0]);
+ for (var name in template[1]) {
+ if (template[1].hasOwnProperty(name))
+ {
+ element.setAttribute(name, template[1][name]);
+ }
+ }
+ for (var i=2; i<template.length; i++)
+ {
+ if (template[i] instanceof Object)
+ {
+ var sub_element = make_dom(template[i]);
+ element.appendChild(sub_element);
+ }
+ else
+ {
+ var text_node = output_document.createTextNode(template[i]);
+ element.appendChild(text_node);
+ }
+ }
+ }
+
+ return element;
+ }
+
+
+
+ function make_dom(template, substitutions, output_document)
+ {
+ if (is_single_node(template))
+ {
+ return make_dom_single(template, output_document);
+ }
+ else
+ {
+ return map(template, function(x) {
+ return make_dom_single(x, output_document);
+ });
+ }
+ }
+
+ function render(template, substitutions, output_document)
+ {
+ return make_dom(substitute(template, substitutions), output_document);
+ }
+
+ /*
+ * Utility funcions
+ */
+ function assert(expected_true, function_name, description, error, substitutions)
+ {
+ if (expected_true !== true)
+ {
+ throw new AssertionError(make_message(function_name, description,
+ error, substitutions));
+ }
+ }
+
+ function AssertionError(message)
+ {
+ this.message = message;
+ }
+
+ function make_message(function_name, description, error, substitutions)
+ {
+ for (var p in substitutions) {
+ if (substitutions.hasOwnProperty(p)) {
+ substitutions[p] = format_value(substitutions[p]);
+ }
+ }
+ var node_form = substitute(["{text}", "${function_name}: ${description}" + error],
+ merge({function_name:function_name,
+ description:(description?description + " ":"")},
+ substitutions));
+ return node_form.slice(1).join("");
+ }
+
+ function filter(array, callable, thisObj) {
+ var rv = [];
+ for (var i=0; i<array.length; i++)
+ {
+ if (array.hasOwnProperty(i))
+ {
+ var pass = callable.call(thisObj, array[i], i, array);
+ if (pass) {
+ rv.push(array[i]);
+ }
+ }
+ }
+ return rv;
+ }
+
+ function map(array, callable, thisObj)
+ {
+ var rv = [];
+ rv.length = array.length;
+ for (var i=0; i<array.length; i++)
+ {
+ if (array.hasOwnProperty(i))
+ {
+ rv[i] = callable.call(thisObj, array[i], i, array);
+ }
+ }
+ return rv;
+ }
+
+ function extend(array, items)
+ {
+ Array.prototype.push.apply(array, items);
+ }
+
+ function forEach (array, callback, thisObj)
+ {
+ for (var i=0; i<array.length; i++)
+ {
+ if (array.hasOwnProperty(i))
+ {
+ callback.call(thisObj, array[i], i, array);
+ }
+ }
+ }
+
+ function merge(a,b)
+ {
+ var rv = {};
+ var p;
+ for (p in a)
+ {
+ rv[p] = a[p];
+ }
+ for (p in b) {
+ rv[p] = b[p];
+ }
+ return rv;
+ }
+
+ function expose(object, name)
+ {
+ var components = name.split(".");
+ var target = window;
+ for (var i=0; i<components.length - 1; i++)
+ {
+ if (!(components[i] in target))
+ {
+ target[components[i]] = {};
+ }
+ target = target[components[i]];
+ }
+ target[components[components.length - 1]] = object;
+ }
+
+ function forEach_windows(callback) {
+ // Iterate of the the windows [self ... top, opener]. The callback is passed
+ // two objects, the first one is the windows object itself, the second one
+ // is a boolean indicating whether or not its on the same origin as the
+ // current window.
+ var cache = forEach_windows.result_cache;
+ if (!cache) {
+ cache = [[self, true]];
+ var w = self;
+ var i = 0;
+ var so;
+ var origins = location.ancestorOrigins;
+ while (w != w.parent)
+ {
+ w = w.parent;
+ // In WebKit, calls to parent windows' properties that aren't on the same
+ // origin cause an error message to be displayed in the error console but
+ // don't throw an exception. This is a deviation from the current HTML5
+ // spec. See: https://bugs.webkit.org/show_bug.cgi?id=43504
+ // The problem with WebKit's behavior is that it pollutes the error console
+ // with error messages that can't be caught.
+ //
+ // This issue can be mitigated by relying on the (for now) proprietary
+ // `location.ancestorOrigins` property which returns an ordered list of
+ // the origins of enclosing windows. See:
+ // http://trac.webkit.org/changeset/113945.
+ if(origins) {
+ so = (location.origin == origins[i]);
+ }
+ else
+ {
+ so = is_same_origin(w);
+ }
+ cache.push([w, so]);
+ i++;
+ }
+ w = window.opener;
+ if(w)
+ {
+ // window.opener isn't included in the `location.ancestorOrigins` prop.
+ // We'll just have to deal with a simple check and an error msg on WebKit
+ // browsers in this case.
+ cache.push([w, is_same_origin(w)]);
+ }
+ forEach_windows.result_cache = cache;
+ }
+
+ forEach(cache,
+ function(a)
+ {
+ callback.apply(null, a);
+ });
+ }
+
+ function is_same_origin(w) {
+ try {
+ 'random_prop' in w;
+ return true;
+ } catch(e) {
+ return false;
+ }
+ }
+
+ function supports_post_message(w)
+ {
+ var supports;
+ var type;
+ // Given IE implements postMessage across nested iframes but not across
+ // windows or tabs, you can't infer cross-origin communication from the presence
+ // of postMessage on the current window object only.
+ //
+ // Touching the postMessage prop on a window can throw if the window is
+ // not from the same origin AND post message is not supported in that
+ // browser. So just doing an existence test here won't do, you also need
+ // to wrap it in a try..cacth block.
+ try
+ {
+ type = typeof w.postMessage;
+ if (type === "function")
+ {
+ supports = true;
+ }
+ // IE8 supports postMessage, but implements it as a host object which
+ // returns "object" as its `typeof`.
+ else if (type === "object")
+ {
+ supports = true;
+ }
+ // This is the case where postMessage isn't supported AND accessing a
+ // window property across origins does NOT throw (e.g. old Safari browser).
+ else
+ {
+ supports = false;
+ }
+ }
+ catch(e) {
+ // This is the case where postMessage isn't supported AND accessing a
+ // window property across origins throws (e.g. old Firefox browser).
+ supports = false;
+ }
+ return supports;
+ }
+})();
+// vim: set expandtab shiftwidth=4 tabstop=4:
--- /dev/null
+/*
+ * This file is intended for vendors to implement
+ * code needed to integrate testharness.js tests with their own test systems.
+ *
+ * The default implementation extracts metadata from the tests and validates
+ * it against the cached version that should be present in the test source
+ * file. If the cache is not found or is out of sync, source code suitable for
+ * caching the metadata is optionally generated.
+ *
+ * The cached metadata is present for extraction by test processing tools that
+ * are unable to execute javascript.
+ *
+ * Metadata is attached to tests via the properties parameter in the test
+ * constructor. See testharness.js for details.
+ *
+ * Typically test system integration will attach callbacks when each test has
+ * run, using add_result_callback(callback(test)), or when the whole test file
+ * has completed, using
+ * add_completion_callback(callback(tests, harness_status)).
+ *
+ * For more documentation about the callback functions and the
+ * parameters they are called with see testharness.js
+ */
+
+
+
+var metadata_generator = {
+
+ currentMetadata: {},
+ cachedMetadata: false,
+ metadataProperties: ['help', 'assert', 'author'],
+
+ error: function(message) {
+ var messageElement = document.createElement('p');
+ messageElement.setAttribute('class', 'error');
+ this.appendText(messageElement, message);
+
+ var summary = document.getElementById('summary');
+ if (summary) {
+ summary.parentNode.insertBefore(messageElement, summary);
+ }
+ else {
+ document.body.appendChild(messageElement);
+ }
+ },
+
+ /**
+ * Ensure property value has contact information
+ */
+ validateContact: function(test, propertyName) {
+ var result = true;
+ var value = test.properties[propertyName];
+ var values = Array.isArray(value) ? value : [value];
+ for (var index = 0; index < values.length; index++) {
+ value = values[index];
+ var re = /(\S+)(\s*)<(.*)>(.*)/;
+ if (! re.test(value)) {
+ re = /(\S+)(\s+)(http[s]?:\/\/)(.*)/
+ if (! re.test(value)) {
+ this.error('Metadata property "' + propertyName +
+ '" for test: "' + test.name +
+ '" must have name and contact information ' +
+ '("name <email>" or "name http(s)://")');
+ result = false;
+ }
+ }
+ }
+ return result;
+ },
+
+ /**
+ * Extract metadata from test object
+ */
+ extractFromTest: function(test) {
+ var testMetadata = {};
+ // filter out metadata from other properties in test
+ for (var metaIndex = 0; metaIndex < this.metadataProperties.length;
+ metaIndex++) {
+ var meta = this.metadataProperties[metaIndex];
+ if (test.properties.hasOwnProperty(meta)) {
+ if ('author' == meta) {
+ this.validateContact(test, meta);
+ }
+ testMetadata[meta] = test.properties[meta];
+ }
+ }
+ return testMetadata;
+ },
+
+ /**
+ * Compare cached metadata to extracted metadata
+ */
+ validateCache: function() {
+ for (var testName in this.currentMetadata) {
+ if (! this.cachedMetadata.hasOwnProperty(testName)) {
+ return false;
+ }
+ var testMetadata = this.currentMetadata[testName];
+ var cachedTestMetadata = this.cachedMetadata[testName];
+ delete this.cachedMetadata[testName];
+
+ for (var metaIndex = 0; metaIndex < this.metadataProperties.length;
+ metaIndex++) {
+ var meta = this.metadataProperties[metaIndex];
+ if (cachedTestMetadata.hasOwnProperty(meta) &&
+ testMetadata.hasOwnProperty(meta)) {
+ if (Array.isArray(cachedTestMetadata[meta])) {
+ if (! Array.isArray(testMetadata[meta])) {
+ return false;
+ }
+ if (cachedTestMetadata[meta].length ==
+ testMetadata[meta].length) {
+ for (var index = 0;
+ index < cachedTestMetadata[meta].length;
+ index++) {
+ if (cachedTestMetadata[meta][index] !=
+ testMetadata[meta][index]) {
+ return false;
+ }
+ }
+ }
+ else {
+ return false;
+ }
+ }
+ else {
+ if (Array.isArray(testMetadata[meta])) {
+ return false;
+ }
+ if (cachedTestMetadata[meta] != testMetadata[meta]) {
+ return false;
+ }
+ }
+ }
+ else if (cachedTestMetadata.hasOwnProperty(meta) ||
+ testMetadata.hasOwnProperty(meta)) {
+ return false;
+ }
+ }
+ }
+ for (var testName in this.cachedMetadata) {
+ return false;
+ }
+ return true;
+ },
+
+ appendText: function(elemement, text) {
+ elemement.appendChild(document.createTextNode(text));
+ },
+
+ jsonifyArray: function(arrayValue, indent) {
+ var output = '[';
+
+ if (1 == arrayValue.length) {
+ output += JSON.stringify(arrayValue[0]);
+ }
+ else {
+ for (var index = 0; index < arrayValue.length; index++) {
+ if (0 < index) {
+ output += ',\n ' + indent;
+ }
+ output += JSON.stringify(arrayValue[index]);
+ }
+ }
+ output += ']';
+ return output;
+ },
+
+ jsonifyObject: function(objectValue, indent) {
+ var output = '{';
+
+ var count = 0;
+ for (var property in objectValue) {
+ ++count;
+ if (Array.isArray(objectValue[property]) ||
+ ('object' == typeof(value))) {
+ ++count;
+ }
+ }
+ if (1 == count) {
+ for (var property in objectValue) {
+ output += ' "' + property + '": '
+ + JSON.stringify(objectValue[property])
+ + ' ';
+ }
+ }
+ else {
+ var first = true;
+ for (var property in objectValue) {
+ if (! first) {
+ output += ',';
+ }
+ first = false;
+ output += '\n ' + indent + '"' + property + '": ';
+ var value = objectValue[property];
+ if (Array.isArray(value)) {
+ output += this.jsonifyArray(value, indent +
+ ' '.substr(0, 5 + property.length));
+ }
+ else if ('object' == typeof(value)) {
+ output += this.jsonifyObject(value, indent + ' ');
+ }
+ else {
+ output += JSON.stringify(value);
+ }
+ }
+ if (1 < output.length) {
+ output += '\n' + indent;
+ }
+ }
+ output += '}';
+ return output;
+ },
+
+ /**
+ * Generate javascript source code for captured metadata
+ * Metadata is in pretty-printed JSON format
+ */
+ generateSource: function() {
+ var source =
+ '<script id="metadata_cache">/*\n' +
+ this.jsonifyObject(this.currentMetadata, '') + '\n' +
+ '*/</script>\n';
+ return source;
+ },
+
+ /**
+ * Add element containing metadata source code
+ */
+ addSourceElement: function(event) {
+ var sourceWrapper = document.createElement('div');
+ sourceWrapper.setAttribute('id', 'metadata_source');
+
+ var instructions = document.createElement('p');
+ if (this.cachedMetadata) {
+ this.appendText(instructions,
+ 'Replace the existing <script id="metadata_cache"> element ' +
+ 'in the test\'s <head> with the following:');
+ }
+ else {
+ this.appendText(instructions,
+ 'Copy the following into the <head> element of the test ' +
+ 'or the test\'s metadata sidecar file:');
+ }
+ sourceWrapper.appendChild(instructions);
+
+ var sourceElement = document.createElement('pre');
+ this.appendText(sourceElement, this.generateSource());
+
+ sourceWrapper.appendChild(sourceElement);
+
+ var messageElement = document.getElementById('metadata_issue');
+ messageElement.parentNode.insertBefore(sourceWrapper,
+ messageElement.nextSibling);
+ messageElement.parentNode.removeChild(messageElement);
+
+ (event.preventDefault) ? event.preventDefault() :
+ event.returnValue = false;
+ },
+
+ /**
+ * Extract the metadata cache from the cache element if present
+ */
+ getCachedMetadata: function() {
+ var cacheElement = document.getElementById('metadata_cache');
+
+ if (cacheElement) {
+ var cacheText = cacheElement.firstChild.nodeValue;
+ var openBrace = cacheText.indexOf('{');
+ var closeBrace = cacheText.lastIndexOf('}');
+ if ((-1 < openBrace) && (-1 < closeBrace)) {
+ cacheText = cacheText.slice(openBrace, closeBrace + 1);
+ try {
+ this.cachedMetadata = JSON.parse(cacheText);
+ }
+ catch (exc) {
+ this.cachedMetadata = 'Invalid JSON in Cached metadata. ';
+ }
+ }
+ else {
+ this.cachedMetadata = 'Metadata not found in cache element. ';
+ }
+ }
+ },
+
+ /**
+ * Main entry point, extract metadata from tests, compare to cached version
+ * if present.
+ * If cache not present or differs from extrated metadata, generate an error
+ */
+ process: function(tests, harness_status) {
+ for (var index = 0; index < tests.length; index++) {
+ var test = tests[index];
+ if (this.currentMetadata.hasOwnProperty(test.name)) {
+ this.error('Duplicate test name: ' + test.name);
+ }
+ else {
+ this.currentMetadata[test.name] = this.extractFromTest(test);
+ }
+ }
+
+ this.getCachedMetadata();
+
+ var message = null;
+ var messageClass = 'warning';
+ var showSource = false;
+
+ if (0 == tests.length) {
+ if (this.cachedMetadata) {
+ message = 'Cached metadata present but no tests. ';
+ }
+ }
+ else if (1 == tests.length) {
+ if (this.cachedMetadata) {
+ message = 'Single test files should not have cached metadata. ';
+ }
+ else {
+ var testMetadata = this.currentMetadata[tests[0].name];
+ var hasMetadata = false;
+ for (var meta in testMetadata) {
+ hasMetadata |= testMetadata.hasOwnProperty(meta);
+ }
+ if (hasMetadata) {
+ message = 'Single tests should not have metadata. ' +
+ 'Move metadata to <head>. ';
+ }
+ }
+ }
+ else {
+ if (this.cachedMetadata) {
+ messageClass = 'error';
+ if ('string' == typeof(this.cachedMetadata)) {
+ message = this.cachedMetadata;
+ showSource = true;
+ }
+ else if (! this.validateCache()) {
+ message = 'Cached metadata out of sync. ';
+ showSource = true;
+ }
+ }
+ }
+
+ if (message) {
+ var messageElement = document.createElement('p');
+ messageElement.setAttribute('id', 'metadata_issue');
+ messageElement.setAttribute('class', messageClass);
+ this.appendText(messageElement, message);
+
+ if (showSource) {
+ var link = document.createElement('a');
+ this.appendText(link, 'Click for source code.');
+ link.setAttribute('href', '#');
+ link.setAttribute('onclick',
+ 'metadata_generator.addSourceElement(event)');
+ messageElement.appendChild(link);
+ }
+
+ var summary = document.getElementById('summary');
+ if (summary) {
+ summary.parentNode.insertBefore(messageElement, summary);
+ }
+ else {
+ var log = document.getElementById('log');
+ if (log) {
+ log.appendChild(messageElement);
+ }
+ }
+ }
+ },
+
+ setup: function() {
+ add_completion_callback(
+ function (tests, harness_status) {
+ metadata_generator.process(tests, harness_status)
+ });
+ }
+}
+
+metadata_generator.setup();
+// vim: set expandtab shiftwidth=4 tabstop=4:
--- /dev/null
+Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+Copyright (c) 2012 Intel Corporation.
+Except as noted, this software is licensed under Apache License, Version 2 or BSD-3-Clause License.
+Please, see the LICENSE.Apache-2.0 file for Apache License, Version 2 terms and conditions
+or the LICENSE.BSD-3 file for BSD-3-Clause License.
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Samsung Electronics 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.
+
+Authors:
+ Choi, Jongheon <j-h.choi@samsung.com>
+
+-->
+<html>
+<head>
+<meta charset="utf-8" />
+<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+<link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+<script src="../../js/thirdparty/jquery.js"></script>
+<script src="../../js/thirdparty/jquery.mobile.js"></script>
+<script src="../../js/tests.js"></script>
+<script src="js/main.js"></script>
+</head>
+<body>
+ <div data-role="page" id="main">
+ <div data-role="header" data-position="fixed" data-tap-toggle="false">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div id="content">
+ <ul data-role="listview" id="list">
+ <li data-role="list-divider">Bluetooth Select(Server or Client)</li>
+ <li><div data-role="button" id="server">Server</div></li>
+ <li><div data-role="button" id="client">Client</div></li>
+ <li data-role="list-divider">Write Message</li>
+ <li><input type="text" id="wmsg" value=""/></li>
+ <li><div data-role="button" id="send">Send Message</div></li>
+ <li data-role="list-divider">Receive Message</li>
+ <li><label id="rmsg">Receive : </label></li>
+ <li data-role="list-divider">Bluetooth Disconnect</li>
+ <li><div data-role="button" id="disconnect">Disconnect</div></li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font style="font-size:85%">
+ <p>Check if Bluetooth communication between devices supported</p><br>
+ <p>1. You must install the TCT-behavior Test both on the Server device and the Client device</p>
+ <p>2. The one side device selects a Server and the other side device selects a Client</p>
+ <p>3. Establishing a connection between two Bluetooth devices</p>
+ <p>4. Fill in Message and Click Send Message</p>
+ <p>5. Check the message on the other device</p>
+ <p>6. Click the Disconnect button and Check if the Bluetooth disconnected</p>
+ </font>
+ </div>
+ </div>
+</body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Samsung Electronics 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.
+
+Authors:
+ Choi, Jongheon <j-h.choi@samsung.com>
+
+ */
+
+var serverConnected = false;
+var clientConnected = false;
+var globalSocket = null;
+var adapter = null;
+var type = null;
+
+$(document).delegate("#main", "pageinit", function() {
+ $("#server").bind("vclick", function() {
+ setListener();
+ startServer();
+ $("#client").addClass("ui-disabled");
+ $("#disconnect").removeClass("ui-disabled");
+ type = "server";
+ });
+ $("#client").bind("vclick", function() {
+ setListener();
+ connectToServer();
+ $("#server").addClass("ui-disabled");
+ $("#disconnect").removeClass("ui-disabled");
+ type = "client";
+ });
+ $("#send").bind("vclick", function() {
+ if(type == "server")
+ sendMsgS();
+ if(type == "client")
+ sendMsgC();
+ });
+ $("#disconnect").bind("vclick", function() {
+ adapter.unsetChangeListener();
+ disconnect();
+ serverConnected = false;
+ clientConnected = false;
+ type = null;
+ $("#server").removeClass("ui-disabled");
+ $("#client").removeClass("ui-disabled");
+ $("#disconnect").addClass("ui-disabled");
+ $("#send").addClass("ui-disabled");
+ });
+ $("#send").addClass("ui-disabled");
+ $("#disconnect").addClass("ui-disabled");
+});
+
+function setListener() {
+ var changeListener = {
+ onstatechanged: function(powered) {
+ console.log ("Power state is changed into: " + powered);
+ },
+ onnamechanged: function(name) {
+ console.log("Name is changed to: " + name);
+ },
+ onvisibilitychanged: function(visible) {
+ console.log("Visibility is changed into: " + visible);
+ }
+ };
+ adapter = tizen.bluetooth.getDefaultAdapter();
+ adapter.setChangeListener(changeListener);
+}
+
+function startServer() {
+ if (clientConnected) {
+ alert("Already connected");
+ return;
+ }
+ adapter = tizen.bluetooth.getDefaultAdapter();
+ console.log("StartServer Name : " + "BehaviorBT");
+ function registerSuccessCallback(handler) {
+ chatServiceHandler = handler;
+ alert("Wait for client...");
+ console.log("Chat service register success");
+ chatServiceHandler.onconnect = function(socket) {
+ globalSocket = socket;
+ var peerDevice = socket.peer;
+ alert("Socket state:" + socket.state + " [" + peerDevice.name + "(" + peerDevice.address + ")]");
+ console.log("Server connented address(" + socket.peer.address + ")" + " connected service uuid: " + socket.uuid);
+ clientConnected = true;
+ $("#send").removeClass("ui-disabled");
+ socket.onmessage = function() {
+ var data = socket.readData();
+ var recvmsg = "";
+ for (var i = 0; i < data.length;i++) {
+ recvmsg += String.fromCharCode(data[i]);
+ }
+ recvmsg = decodeURIComponent(recvmsg);
+ document.getElementById("rmsg").innerHTML = "Client : " + recvmsg;
+ alert("Client : " + recvmsg);
+ };
+ socket.onerror = function(e) {
+ console.log("Socket error");
+ clientConnected = false;
+ socket.close();
+ };
+ socket.onclose = function() {
+ clientConnected = false;
+ console.log("Socket disconnected");
+ };
+ };
+ };
+ function onError(e) {
+ console.log("Operation error");
+ clientConnected = false;
+ }
+ function setVisibleAndRegister() {
+ adapter.setVisible(true, function() {
+ adapter.registerRFCOMMServiceByUUID(
+ "5BCE9431-6C75-32AB-AFE0-2EC108A30860",
+ "My service",
+ registerSuccessCallback,
+ onError
+ );
+ });
+ }
+ function setNameWithTimer() {
+ adapter.setName("BehaviorBT", function() {
+ console.log("Set name ok");
+ setVisibleAndRegister();
+ }, onError);
+ }
+ function onSuccess() {
+ console.log("Turn on success");
+ setTimeout(setNameWithTimer, 3000);
+ }
+ adapter.setPowered(true, onSuccess, function() {
+ console.log("Device is busy");
+ onError();
+ });
+}
+
+function connectToServer() {
+ if (serverConnected) {
+ alert("Already connected");
+ return;
+ }
+ console.log("Connect to Server " + "BehaviorBT");
+ adapter = tizen.bluetooth.getDefaultAdapter();
+ function onSocketConnected(socket) {
+ globalSocket = socket;
+ var peerDevice = socket.peer;
+ alert("Socket state:" + socket.state + " [" + peerDevice.name + "(" + peerDevice.address + ")]");
+ console.log("Server connented address(" + socket.peer.address + ")" + " connected service uuid: " + socket.uuid);
+ serverConnected = true;
+ $("#send").removeClass("ui-disabled");
+ socket.onmessage = function() {
+ var data = socket.readData();
+ var recvmsg = "";
+ for (var i = 0; i < data.length;i++) {
+ recvmsg += String.fromCharCode(data[i]);
+ }
+ recvmsg = decodeURIComponent(recvmsg);
+ document.getElementById("rmsg").innerHTML = "Server : " + recvmsg;
+ alert("Server : " + recvmsg);
+ };
+ socket.onerror = function(e) {
+ console.log("Socket error");
+ serverConnected = false;
+ socket.close();
+ };
+ socket.onclose = function() {
+ serverConnected = false;
+ console.log("Socket disconnected");
+ };
+ }
+ function onSocketError(e) {
+ console.log("Socket error: " + e.message);
+ serverConnected = false;
+ }
+ function onError(e) {
+ console.log("Operation error");
+ serverConnected = false;
+ }
+ function getDeviceSuccessCB(device) {
+ if (device != null) {
+ console.log("Get device and then try to connect: " + "5BCE9431-6C75-32AB-AFE0-2EC108A30860");
+ device.connectToServiceByUUID("5BCE9431-6C75-32AB-AFE0-2EC108A30860", onSocketConnected, onSocketError);
+ }
+ else
+ console.log("Get device infomration error");
+ }
+ function bondSuccess(device) {
+ console.log("Bond success!");
+ adapter.getDevice(device.address, getDeviceSuccessCB, onError);
+ }
+ var discoverDevicesSuccessCallback = {
+ onstarted : function() {
+ alert("Device discovery start!");
+ },
+ ondevicefound: function (device) {
+ var msg = device.name + "("+ device.address + ")";
+ if (device.name == "BehaviorBT") {
+ adapter.stopDiscovery(function() {});
+ console.log("Try to connect");
+ if (device.isBonded == true) {
+ console.log("Try to get device information");
+ adapter.getDevice(device.address, getDeviceSuccessCB, onError);
+ }
+ else {
+ console.log("Try to bond");
+ adapter.createBonding(device.address, bondSuccess, onError);
+ }
+ }
+ else
+ console.log(msg + " found");
+ },
+ ondevicedisappeared: function(device) {},
+ onfinished : function (devices) {
+ alert("Discovery finished");
+ }
+ };
+ function onSuccess() {
+ console.log("Turn on success");
+ adapter.discoverDevices(discoverDevicesSuccessCallback, onError);
+ }
+ console.log("Try to turn on");
+ adapter.setPowered(true, onSuccess, onError);
+}
+
+function sendMsgS() {
+ var inputText = document.getElementById("wmsg");
+ var textmsg = inputText.value;
+ if(textmsg.length != 0){
+ var sendtextmsg = new Array();
+ textmsg = encodeURIComponent(textmsg);
+ for (var i = 0; i < textmsg.length; i++)
+ sendtextmsg[i] = textmsg.charCodeAt(i);
+ if (globalSocket != null && clientConnected == true) {
+ var length = globalSocket.writeData(sendtextmsg);
+ if (length != 0)
+ console.log("writeData");
+ else
+ console.log("writeData fail");
+ }
+ else
+ console.log("socket is not set");
+ }
+ else
+ alert("Fill in Send Message");
+}
+
+function sendMsgC() {
+ var inputText = document.getElementById("wmsg");
+ var textmsg = inputText.value;
+ if(textmsg.length != 0){
+ var sendtextmsg = new Array();
+ textmsg = encodeURIComponent(textmsg);
+ for (var i = 0; i < textmsg.length; i++)
+ sendtextmsg[i] = textmsg.charCodeAt(i);
+ if (globalSocket != null && serverConnected == true) {
+ var length = globalSocket.writeData(sendtextmsg);
+ if (length != 0)
+ console.log("writeData");
+ else
+ console.log("writeData fail");
+ }
+ else
+ console.log("socket is not set");
+ }
+ else
+ alert("Fill in Send Message");
+}
+
+function disconnect() {
+ if (serverConnected == true && globalSocket != null) {
+ try {
+ globalSocket.close();
+ alert("Disconnected");
+ }
+ catch(e) {
+ console.log(e.message);
+ }
+ }
+ try {
+ if (adapter != null)
+ adapter.setPowered(
+ false,
+ function() {
+ alert("Bluetooth Power Off");
+ globalSocket = null;
+ serverConnected = false;
+ clientConnected = false;
+ adapter = null;
+ type = null;
+ }, function(e) {
+ console.log(e.message);
+ }
+ );
+ }
+ catch(e) {
+ console.log(e.message);
+ }
+}
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+ Xu, Kang <kangx.xu@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../css/main.css" />
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/tests.js"></script>
+ <script src="../../js/main.js"></script>
+ <script src="js/main.js"></script>
+ </head>
+ <body>
+ <input type="hidden" id="sub_test"/>
+ <div data-role="page" id="main">
+ <div data-role="header" data-position="fixed" data-tap-toggle="false">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div id="content">
+ <ul data-role="listview" id="cspList" data-divider-theme="b" data-inset="true">
+ <li data-role="list-divider" role="heading">Test common directives</li>
+ <li id="csp-none">
+ <a href="javascript:runApp('res/csp-none.html')" data-transition="slide" style="">
+ <h2>csp-none</h2>
+ </a>
+ </li>
+ <li id="csp-self">
+ <a href="javascript:runApp('res/csp-self.html')" data-transition="slide" style="">
+ <h2>csp-self</h2>
+ </a>
+ </li>
+ <li data-role="list-divider" role="heading">Test default-src directive</li>
+ <li id="default-src_none">
+ <a href="javascript:runApp('res/default-src_none.html')" data-transition="slide" style="">
+ <h2>default-src_none</h2>
+ </a>
+ </li>
+ <li id="default-src_asterisk">
+ <a href="javascript:runApp('res/default-src_asterisk.html')" data-transition="slide" style="">
+ <h2>default-src_asterisk</h2>
+ </a>
+ </li>
+ <li data-role="list-divider" role="heading">Test sandbox directive</li>
+ <li id="sandbox-empty-ext">
+ <a href="javascript:runApp('res/sandbox-empty-ext.html')" data-transition="slide" style="">
+ <h2>sandbox-empty-ext</h2>
+ </a>
+ </li>
+ <li id="sandbox-empty-int">
+ <a href="javascript:runApp('res/sandbox-empty-int.html')" data-transition="slide" style="">
+ <h2>sandbox-empty-int</h2>
+ </a>
+ </li>
+ <li id="sandbox-empty-inline">
+ <a href="javascript:runApp('res/sandbox-empty-inline.html')" data-transition="slide" style="">
+ <h2>sandbox-empty-inline</h2>
+ </a>
+ </li>
+ <li id="sandbox-same-origin-allow-scripts">
+ <a href="javascript:runApp('res/sandbox-same-origin-allow-scripts.html')" data-transition="slide" style="">
+ <h2>sandbox-same-origin-allow-scripts</h2>
+ </a>
+ </li>
+ <li data-role="list-divider" role="heading">Test script-src directive</li>
+ <li id="script-src_none">
+ <a href="javascript:runApp('res/script-src_none.html')" data-transition="slide" style="">
+ <h2>script-src_none</h2>
+ </a>
+ </li>
+ <li data-role="list-divider" role="heading">Test style-src directive</li>
+ <li id="style-src_self">
+ <a href="javascript:runApp('res/style-src_self.html')" data-transition="slide" style="">
+ <h2>style-src_self</h2>
+ </a>
+ </li>
+ <li data-role="list-divider" role="heading">Clean all the installed packages</li>
+ <li>
+ <div data-role="button" id="wgtClean" class="wgtButton">Clean all test applications</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Note: </p>
+ <p>Verifies the functionality of CSP worked well.</p>
+ <p>Test Pre-condition: </p>
+ <p>Tinyweb server launched with the command: "tinyweb -ssl_certificate /usr/share/tinyweb/server.pem -document_root / -listening_ports 80,8080,8081,8082,8083,8443s".</p>
+ <p>Test Purpose: </p>
+ <p>Verifies the functionality of CSP worked well when script-src, object-src, style-src, img-src, media-src, frame-src, font-src, connect-src directives set different values.</p>
+ <p>Expected Result: </p>
+ <p>Test passes if all sub-tests pass.</p>
+ </font>
+ </div>
+ </div>
+ <div data-role="page" id="test_ui">
+ <iframe id="test_frame" width="100%" frameborder="no" border="0" src=""></iframe>
+ </div>
+ </body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.sandbox
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+*/
+var allId=new Array('beh1csp001',
+ 'beh1csp002',
+ 'beh1csp003',
+ 'beh1csp004',
+ 'beh1csp005',
+ 'beh1csp006',
+ 'beh1csp007',
+ 'beh1csp008',
+ 'beh1csp009',
+ 'beh1csp010',
+ 'beh1csp011',
+ 'beh1csp012',
+ 'beh1csp013',
+ 'beh1csp014',
+ 'beh1csp015',
+ 'beh1csp016',
+ 'beh1csp017');
+
+var installedId = new Array();
+var resultXML, tests;
+var MOUDLE_NAME = "CSP";
+var RESULT_FILE_NAME = "tct-behavior-child.csp.result.xml";
+
+$(document).delegate("#main", "pageinit", function() {
+ DisablePassButton();
+ $("#wgtClean").bind("vclick", function() {
+ showTotalBar();
+ });
+});
+
+function showTotalBar(){
+ $.each(allId,function(key,val){
+ try {
+ var packageInfo = tizen.package.getPackageInfo(val);
+ console.log("Current Package ID : " + packageInfo.id);
+ } catch (e) {
+ //alert("Exception: " + e.message);
+ }
+ if(packageInfo != "" && packageInfo != undefined){
+ installedId.push(val);
+ }
+ });
+ checkInstalledPackage();
+}
+
+function checkInstalledPackage(){
+ if(installedId.length > 0){
+ setTimeout(function() {
+ uninstall(installedId[0]);
+ }, 1000);
+ } else {
+ $.mobile.hidePageLoadingMsg();
+ alert("All widgets is uninstalled!");
+ if (checkIfAllPackagePass()) {
+ EnablePassButton();
+ }
+ }
+}
+
+function checkIfAllPackagePass() {
+ var result = true;
+
+ tests.each(function() {
+ if ($(this).attr('result') != "PASS") {
+ result = false;
+ }
+ });
+ return result;
+}
+
+function uninstall(val) {
+ installedId.shift();
+ var totalBar = Math.floor((allId.length - installedId.length - 1) / allId.length * 100);
+
+ var onUninstallationSuccess = {
+
+ onprogress: function(packageId, percentage)
+ {
+ console.log("On uninstallation(" + packageId + "): progress(" + percentage + ")");
+ $.mobile.showPageLoadingMsg();
+ },
+ oncomplete: function(packageId)
+ {
+ console.log("Uninstallation(" + packageId + ") Complete");
+ alert("The package " + packageId + " is uninstalled");
+ checkInstalledPackage();
+ }
+ }
+
+ var onError = function (err) {
+ $.mobile.hidePageLoadingMsg();
+ if (err.name != "UnknownError") {
+ alert("Error occured on uninstallation : " + err.name);
+ }
+ }
+
+ try {
+ tizen.package.uninstall(val, onUninstallationSuccess, onError);
+ } catch (e) {
+ alert("Exception: " + e.name);
+ }
+}
+
+function recordResultToXML(test_name, result){
+ tests.each(
+ function() {
+ if($(this).attr('id') == test_name){
+ $(this).attr('result', result);
+ }
+ }
+ );
+}
+
+function initTests() {
+ loadTests();
+ window.addEventListener('message', function(e) {
+ console.log(e.data);
+ var jsonData = eval("(" + e.data + ")");
+ if(jsonData.length > 0){
+ if(jsonData[0].testname != "" && jsonData[0].result != ""){
+ recordResultToXML(jsonData[0].testname, jsonData[0].result);
+ updateAppDecoration();
+ exportTmpResult();
+ }
+ }
+ }, false);
+}
+
+function exportTmpResult() {
+ writeFile(RESULT_FILE_NAME, (new XMLSerializer()).serializeToString(resultXML), false);
+}
+
+function writeFile(filename, content, need_exit) {
+ successCallback = function(fs) {
+ fs.write(content);
+ fs.close();
+ if (need_exit)
+ exitTest();
+ };
+
+ onsuccess = function(dir) {
+ dir.deleteFile(dir.fullPath + "/" + filename);
+
+ file = dir.createFile(filename);
+ file.openStream("rw", successCallback, onerror, "UTF-8");
+ };
+
+ onerror = function(error) {
+ alert("Export result fail: " + error);
+ };
+
+ try {
+ tizen.filesystem.resolve('documents', onsuccess, onerror, "rw");
+ } catch (err) {
+ alert("Write file fail: " + err.message);
+ }
+}
+
+function loadTests() {
+ $.ajax({
+ async : false,
+ type : "GET",
+ url : "../../subtestresult.xml",
+ dataType : "xml",
+ success : function(xml){
+ resultXML = xml;
+ $(xml).find("set").each(
+ function(){
+ if($(this).attr("name") == MOUDLE_NAME){
+ tests = $(this).find("testcase");
+ }
+ }
+ );
+ loadTmpResult();
+ }
+ });
+}
+
+function loadTmpResult(){
+ successCallback = function(files) {
+ for(var i = 0; i < files.length; i++){
+ if (files[i].name == RESULT_FILE_NAME) {
+ if (confirm("Continue last test?")) {
+ files[i].readAsText(
+ function(xml){
+ _mergeResult($(xml).find("set"));
+ updateAppDecoration();
+ }, function(err){
+ console.log("read tmp result error: " + err.message);
+ }, "UTF-8"
+ );
+ return;
+ }
+ else break;
+ }
+ }
+ };
+
+ onsuccess = function(dir) {
+ dir.listFiles(successCallback, onerror);
+ };
+
+ onerror = function(error) {
+ console.log(error);
+ updateAppDecoration();
+ };
+
+ try {
+ tizen.filesystem.resolve('documents', onsuccess, onerror, "rw");
+ } catch (err) {
+ console.log("Load tmp result fail: " + err.message);
+ updateAppDecoration();
+ }
+}
+
+function _mergeResult(tmpResult) {
+ tests.each(
+ function(index, item) {
+ tmpResult.each(
+ function(order1, tmpItem1){
+ if($(tmpItem1).attr("name") == MOUDLE_NAME){
+ $(tmpItem1).find("testcase").each(
+ function(order, tmpItem){
+ if ($(item).attr("id") === $(tmpItem).attr("id")) {
+ $(item).attr("result", $(tmpItem).attr("result"));
+ }
+ }
+ );
+ }
+ }
+ );
+ }
+ );
+}
+
+function updateAppDecoration() {
+ $(resultXML).find("set").each(
+ function(){
+ if($(this).attr("name") == MOUDLE_NAME){
+ $(this).find("testcase").each(
+ function() {
+ if($(this).attr("result") == "PASS"){
+ $("#"+$(this).attr("id")).find("h2").css("color","green");
+ }else if($(this).attr("result") == "FAIL"){
+ $("#"+$(this).attr("id")).find("h2").css("color","red");
+ }
+ }
+ );
+ }
+ }
+ );
+ $("#cspList").listview( "refresh" );
+}
+
+window.addEventListener('load', initTests, false);
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.sandbox
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+*/
+
+var installUrl;
+var wgt_name;
+var app_id;
+var package_id;
+
+$(document).ready(function(){
+ updateFooterButton();
+ DisablePassButton();
+
+ wgt_name = $("#wgt_name").val();
+ app_id = $("#app_id").val();
+ package_id = $("#package_id").val();
+
+ $("#install").bind("vclick", function() {
+ install();
+ });
+ $("#launch").bind("vclick", function() {
+ launch(app_id);
+ $('#uninstall').removeClass("ui-disabled");
+ });
+ $("#uninstall").bind("vclick", function() {
+ uninstall(package_id);
+ });
+ try {
+ tizen.package.setPackageInfoEventListener(packageEventCallback);
+ } catch (e) {
+ alert("Exception: " + e.message);
+ }
+
+ packagePre(wgt_name);
+ $('#uninstall').addClass("ui-disabled");
+ $('#launch').addClass("ui-disabled");
+
+ if(checkInstalledPkg(package_id)) {
+ $('#install').addClass("ui-disabled");
+ $('#launch').removeClass("ui-disabled");
+ }
+});
+
+var packageEventCallback = {
+ oninstalled: function(packageInfo) {
+ $.mobile.hidePageLoadingMsg();
+ alert("The package " + packageInfo.name + " is installed");
+ },
+ onupdated: function(packageInfo) {
+ $.mobile.hidePageLoadingMsg();
+ alert("The package " + packageInfo.name + " is updated");
+ },
+ onuninstalled: function(packageId) {
+ $.mobile.hidePageLoadingMsg();
+ alert("The package " + packageId + " is uninstalled");
+ }
+}
+
+function fileURI(wgt_name) {
+ var documentsDir;
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ if(files[i].name == wgt_name+".wgt")
+ {
+ var Url1 = files[i].toURI();
+ installUrl = Url1.replace("file:///", "/");
+ }
+ }
+ }
+
+ function onerror(error) {
+ alert("The error " + error.message + " occurred when listing the files in the selected folder");
+ }
+
+ tizen.filesystem.resolve(
+ 'documents',
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error" + e.message);
+ }, "r"
+ );
+}
+
+function install() {
+ var onInstallationSuccess = {
+ onprogress: function(packageId, percentage)
+ {
+ console.log("On installation(" + packageId + "): progress(" + percentage + ")");
+ $.mobile.showPageLoadingMsg();
+ },
+ oncomplete: function(packageId)
+ {
+ console.log("Installation(" + packageId + ") Complete");
+ if(checkInstalledPkg(package_id)) {
+ $('#install').addClass("ui-disabled");
+ $('#launch').removeClass("ui-disabled");
+ }
+ }
+ }
+
+ var onError = function (err) {
+ alert("Error occured on installation : " + err.message);
+ $.mobile.hidePageLoadingMsg();
+ }
+
+ try {
+ tizen.package.install(installUrl, onInstallationSuccess, onError);
+ } catch(e) {
+ alert("Exception: " + e.name);
+ }
+}
+
+function uninstall(package_id) {
+ var onUninstallationSuccess = {
+
+ onprogress: function(packageId, percentage)
+ {
+ console.log("On uninstallation(" + packageId + "): progress(" + percentage + ")");
+ $.mobile.showPageLoadingMsg();
+ },
+ oncomplete: function(packageId)
+ {
+ console.log("Uninstallation(" + packageId + ") Complete");
+ $('#launch').addClass("ui-disabled");
+ $('#uninstall').addClass("ui-disabled");
+ EnablePassButton();
+ }
+ }
+
+ var onError = function (err) {
+ alert("Error occured on uninstallation : " + err.name);
+ $.mobile.hidePageLoadingMsg();
+ }
+
+ try {
+ tizen.package.uninstall(package_id, onUninstallationSuccess, onError);
+ } catch (e) {
+ alert("Exception: " + e.name);
+ }
+}
+
+function launch(app_id) {
+ function onSuccess() {
+ console.log(id + " launched successfully!");
+ }
+
+ function onError(err) {
+ alert("launch failed : " + err.message);
+ }
+
+ try {
+ tizen.application.launch(app_id, onSuccess, onError);
+ } catch (exc) {
+ alert("launch exc:" + exc.message);
+ }
+}
+
+function packagePre(wgt_name) {
+
+ var documentsDir;
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ if(files[i].name == wgt_name+".wgt")
+ {
+ documentsDir.copyTo(
+ files[i].fullPath,
+ "documents/"+wgt_name+".wgt",
+ true,
+ function() {
+ console.log(wgt_name+" Precondition Success!");
+ });
+ }
+ }
+ fileURI(wgt_name);
+ }
+
+ function onerror(error) {
+ alert("The error " + error.message + " occurred when listing the files in the selected folder");
+ }
+
+ tizen.filesystem.resolve(
+ 'wgt-package/tests/CSP/res/',
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error" + e.message);
+ }, "r"
+ );
+}
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="csp-asterisk">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="csp-asterisk"/>
+ <input type="hidden" id="app_id" value="beh1csp001.cspasterisk"/>
+ <input type="hidden" id="package_id" value="beh1csp001"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if all "TestN", N=1...7, pass.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="csp-cross-origin">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="csp-cross-origin"/>
+ <input type="hidden" id="app_id" value="beh1csp002.cspcrossorigin"/>
+ <input type="hidden" id="package_id" value="beh1csp002"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if all "TestN", N=1...8, pass.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="csp-none">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="csp-none"/>
+ <input type="hidden" id="app_id" value="beh1csp003.cspnone"/>
+ <input type="hidden" id="package_id" value="beh1csp003"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if all "TestN", N=1...7, pass.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="csp-self">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="csp-self"/>
+ <input type="hidden" id="app_id" value="beh1csp004.cspself"/>
+ <input type="hidden" id="package_id" value="beh1csp004"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if all "TestN", N=1...7, pass.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="default-policy-by-directives-csp">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="default-policy-by-directives-csp"/>
+ <input type="hidden" id="app_id" value="beh1csp016.DefaultPolicyByDirectivesCsp"/>
+ <input type="hidden" id="package_id" value="beh1csp016"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if all "TestN", N=1...6, pass.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="default-policy-by-directives-report-only">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="default-policy-by-directives-report-only"/>
+ <input type="hidden" id="app_id" value="beh1csp017.DefaultPolicyByDirectivesReportOnly"/>
+ <input type="hidden" id="package_id" value="beh1csp017"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if all "TestN", N=1...6, pass.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="default-src_asterisk">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="default-src_asterisk"/>
+ <input type="hidden" id="app_id" value="beh1csp015.defaultSrcAsterisk"/>
+ <input type="hidden" id="package_id" value="beh1csp015"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if there is a "PASS" displayed.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="default-src_cross_origin">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="default-src_cross_origin"/>
+ <input type="hidden" id="app_id" value="beh1csp014.defaultSrcCrossOrigin"/>
+ <input type="hidden" id="package_id" value="beh1csp014"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if all "TestN", N=1...2, pass.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="default-src_none">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="default-src_none"/>
+ <input type="hidden" id="app_id" value="beh1csp013.defaultSrcNone"/>
+ <input type="hidden" id="package_id" value="beh1csp013"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if there is a "PASS" displayed.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="default-src_self">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="default-src_self"/>
+ <input type="hidden" id="app_id" value="beh1csp012.defaultSrcSelf"/>
+ <input type="hidden" id="package_id" value="beh1csp012"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if all "TestN", N=1...5, pass.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="sandbox-empty-ext">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="sandbox-empty-ext"/>
+ <input type="hidden" id="app_id" value="beh1csp011.sandboxemptyext"/>
+ <input type="hidden" id="package_id" value="beh1csp011"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if there is no text "FAIL" displayed.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="sandbox-empty-inline">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="sandbox-empty-inline"/>
+ <input type="hidden" id="app_id" value="beh1csp010.sandboxemptyinline"/>
+ <input type="hidden" id="package_id" value="beh1csp010"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if there is no text "FAIL" displayed.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="sandbox-empty-int">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="sandbox-empty-int"/>
+ <input type="hidden" id="app_id" value="beh1csp009.sandboxemptyint"/>
+ <input type="hidden" id="package_id" value="beh1csp009"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if there is no text "FAIL" displayed.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="sandbox-same-origin-allow-scripts">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="sandbox-same-origin-allow-scripts"/>
+ <input type="hidden" id="app_id" value="beh1csp008.sandboxsameoriginallowscripts"/>
+ <input type="hidden" id="package_id" value="beh1csp008"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if there are three "Pass" displayed.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="script-src_inline_eval">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="script-src_inline_eval"/>
+ <input type="hidden" id="app_id" value="beh1csp006.scriptSrcInlineEval"/>
+ <input type="hidden" id="package_id" value="beh1csp006"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if there is a "PASS" displayed.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="script-src_none">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="script-src_none"/>
+ <input type="hidden" id="app_id" value="beh1csp007.scriptSrcNone"/>
+ <input type="hidden" id="package_id" value="beh1csp007"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if there is a "PASS" displayed.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="style-src_self">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="style-src_self"/>
+ <input type="hidden" id="app_id" value="beh1csp005.styleSrcSelf"/>
+ <input type="hidden" id="package_id" value="beh1csp005"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if there is a "PASS" under a blue square.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ li, cici <cici.x.li@intel.com>
+
+*/
+
+@keyframes cssAnimate
+{
+0% {-webkit-transform: rotate(0deg);left:0px; }
+10% {-webkit-transform: rotate(20deg);left:0px;background:; }
+20% {-webkit-transform: rotate(0deg);left:80%;background:pink;}
+40% {-webkit-transform: rotateY(0deg);left:80%;background:#1ec7e6; border-radius:5px;}
+60% {-webkit-transform: rotate(-360deg);left:0px; background: green;}
+80% {-webkit-transform: rotate(360deg);left:0px; background:red;}
+100% {-webkit-transform: rotate(360deg);left:0px;border-radius:100%;}
+}
+
+@-webkit-keyframes cssAnimate /* Safari and Chrome */
+{
+0% {-webkit-transform: rotate(0deg);left:0px; }
+10% {-webkit-transform: rotate(20deg);left:0px; }
+20% {-webkit-transform: rotate(0deg);left:80%;background:pink;}
+40% {-webkit-transform: rotate(0deg);left:80%;background:#1ec7e6; border-radius:5px;}
+60% {-webkit-transform: rotate(-180deg);left:0px; background: green;}
+80% {-webkit-transform: rotate(360deg);left:0px;background:red;}
+100% {-webkit-transform: rotate(360deg);left:0px;border-radius:100%;}
+}
+
+@-moz-keyframes cssAnimate /* Firefox */
+{
+0% {-webkit-transform: rotate(0deg);left:0px; }
+10% {-webkit-transform: rotate(20deg);left:0px; }
+20% {-webkit-transform: rotate(0deg);left:80%;background: pink;}
+40% {-webkit-transform: rotateY(0deg);left:80%;background:#1ec7e6; border-radius:5px;}
+60% {-webkit-transform: rotate(-360deg);left:0px; background: green;}
+80% {-webkit-transform: rotate(360deg);left:0px; background: red}
+100% {-webkit-transform: rotate(360deg);left:0px;border-radius:100%;}
+}
+
+@-o-keyframes cssAnimate /* Opera */
+{
+0% {-webkit-transform: rotate(0deg);left:0px; }
+10% {-webkit-transform: rotate(20deg);left:0px;; }
+20% {-webkit-transform: rotate(0deg);left:80%;background: pink;}
+40% {-webkit-transform: rotateY(0deg);left:80%;background:#1ec7e6; border-radius:5px;}
+60% {-webkit-transform: rotate(-360deg);left:0px; background: green;}
+80% {-webkit-transform: rotate(360deg);left:0px; background: red}
+100% {-webkit-transform: rotate(360deg);left:0px;border-radius:100%;}
+}
+
+@keyframes cssAnimate2
+{
+0% {-webkit-transform: rotateY(0deg);left:0px; }
+10% {-webkit-transform: rotateY(20deg);left:0px; }
+20% {-webkit-transform: rotateY(0deg);left:80%;background:pink; }
+40% {-webkit-transform: rotateY(0deg);left:80%;background:#1ec7e6; }
+60% {-webkit-transform: rotateY(-360deg);left:0px;background: green;}
+80% {-webkit-transform: rotateY(360deg);left:0px;background:red;}
+100% {-webkit-transform: rotateY(360deg);left:0px;border-radius:5px;}
+}
+
+@-webkit-keyframes cssAnimate2 /* Safari and Chrome */
+{
+0% {-webkit-transform: rotateY(0deg);left:0px; }
+10% {-webkit-transform: rotate(20deg);left:0px; }
+20% {-webkit-transform: rotateY(0deg);left:80%;background:pink;}
+40% {-webkit-transform: rotateY(0deg);left:80%;background:#1ec7e6; }
+60% {-webkit-transform: rotateY(-180deg);left:0px;background: green;}
+80% {-webkit-transform: rotateY(360deg);left:0px;background:red;}
+100% {-webkit-transform: rotateY(360deg);left:0px;border-radius:5px;}
+}
+
+@-moz-keyframes cssAnimate2 /* Firefox */
+{
+0% {-webkit-transform: rotateY(0deg);left:0px; }
+10% {-webkit-transform: rotateY(20deg);left:0px;}
+20% {-webkit-transform: rotateY(0deg);left:80%;background:pink;}
+40% {-webkit-transform: rotateY(0deg);left:80%;background:#1ec7e6; }
+60% {-webkit-transform: rotateY(-360deg);left:0px;background: green;}
+80% {-webkit-transform: rotateY(360deg);left:0px;background:red;}
+100% {-webkit-transform: rotateY(360deg);left:0px;border-radius:5px;}
+}
+
+@-o-keyframes cssAnimate2 /* Opera */
+{
+0% {-webkit-transform: rotateY(0deg);left:0px; }
+10% {-webkit-transform: rotateY(20deg);left:0px;}
+20% {-webkit-transform: rotateY(0deg);left:80%;background:pink;}
+40% {-webkit-transform: rotateY(0deg);left:80%;background:#1ec7e6; }
+60% {-webkit-transform: rotateY(-360deg);left:0px;background: green}
+80% {-webkit-transform: rotateY(360deg);left:0px;background:red;}
+100% {-webkit-transform: rotateY(360deg);left:0px;border-radius:5px;}
+}
+
+#testbox1
+{
+ width:25px;
+ height:25px;
+ background:#92B901;
+ color:#ffffff;
+ position:relative;
+ font-weight:bold;
+ font:bold 8px Verdana, Arial, Helvetica, sans-serif;
+ padding:20px 10px 0px 10px;
+
+ animation:cssAnimate 10s 1;
+ -webkit-animation:cssAnimate 10s 1; /* Safari and Chrome */
+ -moz-animation:cssAnimate 10s 1; /* Firefox */
+ -o-animation:cssAnimate 10s 1; /* Opera */
+ border-radius:5px;
+ -webkit-border-radius:5px;
+}
+
+#testbox2
+{
+ width:25px;
+ height:25px;
+ background:#92B901;
+ color:#ffffff;
+ position:relative;
+ font-weight:bold;
+ font:bold 8px Verdana, Arial, Helvetica, sans-serif;
+ padding:20px 10px 0px 10px;
+
+ animation:cssAnimate2 10s 1;
+ -webkit-animation:cssAnimate2 10s 1; /* Safari and Chrome */
+ -moz-animation:cssAnimate2 10s 1; /* Firefox */
+ -o-animation:cssAnimate2 10s 1; /* Opera */
+ border-radius:15px;
+ -webkit-border-radius:100px;
+}
+
+#box {
+ height: 100%;
+ width: 80%;
+ margin: 5px auto;
+ box-shadow: 10px 10px 5px #888888;
+ border:5px #92B901 outset;
+ border-radius:20px;
+ transition: border 1s linear;
+ -webkit-transition: border 1s linear;
+}
+
+#box.final {
+ border: 7px dashed rgb(0, 0, 255);
+}
+
+/* Test Display Box */
+.display_box {
+ width: 100%;
+ height: 300px;
+ padding: 30px 0px;
+ border: 3px #000;
+}
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Li, cici <cici.x.li@intel.com>
+
+-->
+
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width">
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="css/style.css" />
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/tests.js"></script>
+ <script type="text/javascript">
+ function reloadTest() {
+ document.location.reload();
+ }
+ </script>
+
+ </head>
+
+ <body>
+ <div data-role="header">
+ <h1 id="main_page_title"></h1>
+ </div>
+
+ <div data-role="content">
+ <div class="display_box">
+ <div id="box">
+ <div id="testbox1" style="color:black; top:25%"> SQUARE </div>
+ <div id="testbox2" style="color:white; top:25%"> CIRCLE </div>
+ </div>
+ </div>
+ <p><a href="javascript: reloadTest();" data-role="button">Test Again</a></p>
+ </div>
+
+ <div data-role="footer" data-position="fixed">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font style="font-size:85%">
+ <p>Test Purpose: </p>
+ <p>Verifies the CSS two boxes: </p>
+ <p>1. Color is changing in order of green, pink, blue, green, red, green; </p>
+ <p>2. Square/Circle move with 20 degree direction from left to right; </p>
+ <p>3. About rotate direction from left to right, square is rotate in 2D(180degree), circle is rotate in 3D(Y-axis); </p>
+ <p>4. Square/circle is transfering between square/circle when moving from right to left; </p>
+ <p>5. About font type, "SQUARE" is black, "CIRCLE" is white, both are 8 px size; </p>
+ <p>6. About frame box border, style is outset in green, with gray shadow. </p>
+ <p>Expected Result: </p>
+ <p>This test PASS only if the transformation and animation function well follow above 6 rules.</p>
+ </font>
+ </div>
+ </body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Lin, Wanming <wanmingx.lin@intel.com>
+
+*/
+
+@-webkit-keyframes sample {
+ from {
+ background-color: red;
+ left: 0px;
+ }
+ 50% {
+ background-color: green;
+ left: 180px;
+ }
+ to {
+ background-color: blue;
+ left: 0px;
+ }
+}
+@-moz-keyframes sample {
+ from {
+ background-color: red;
+ left: 0px;
+ }
+ 50% {
+ background-color: green;
+ left: 180px;
+ }
+ to {
+ background-color: blue;
+ left: 0px;
+ }
+}
+@keyframes sample {
+ from {
+ background-color: red;
+ left: 0px;
+ }
+ 50% {
+ background-color: green;
+ left: 180px;
+ }
+ to {
+ background-color: blue;
+ left: 0px;
+ }
+}
+
+#testBox {
+ background-color: red;
+ width: 100px;
+ height: 100px;
+ position: relative;
+ margin: 20px 8px;
+ border: 3px solid yellow;
+ /* Transition */
+ -webkit-transition-duration: 5s;
+ -webkit-transition-timing-function: linear;
+
+ color: Yellow;
+ text-align: center;
+ vertical-align: middle;
+
+ -webkit-animation-name: sample;
+ -webkit-animation-duration: 10s;
+ -webkit-animation-timing-function: ease;
+ -webkit-animation-delay: 2s;
+ -webkit-animation-play-state: running;
+ -webkit-animation-iteration-count: 10;
+ -webkit-animation-direction: normal;
+
+ -moz-animation-name: sample;
+ -moz-animation-duration: 10s;
+ -moz-animation-timing-function: ease;
+ -moz-animation-delay: 2s;
+ -moz-animation-play-state: running;
+ -moz-animation-iteration-count: 10;
+ -moz-animation-direction: normal;
+
+ animation-name: sample;
+ animation-duration: 10s;
+ animation-timing-function: ease;
+ animation-delay: 2s;
+ animation-play-state: running;
+ animation-iteration-count: 10;
+ animation-direction: normal;
+}
+
+#testBox.final {
+ border-radius: 50px;
+ -webkit-border-radius: 50px;
+ transition-delay: 2s;
+ -webkit-transition-delay: 2s;
+}
+
+#box {
+ height: 150px;
+ width: 300px;
+ margin: 0px auto;
+ background-color: #ccc;
+ border: 0px solid rgb(0, 0, 255);
+ transition: border 1s linear;
+ -webkit-transition: border 1s linear;
+}
+
+#box.final {
+ border: 7px dashed rgb(0, 0, 255);
+}
+
+/* Test Display Box */
+.display_box {
+ width: 100%;
+ height: 180px;
+ padding: 30px 0px;
+ border: 1px solid #000;
+}
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Li, Hao <haox.li@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width">
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../css/main.css" />
+ <link rel="stylesheet" type="text/css" href="css/style.css" />
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/tests.js"></script>
+ <script src="js/transition-test-helpers.js"></script>
+ <script type="text/javascript">
+ var test_box;
+ var box_txt = "1";
+ function init() {
+ test_box = document.getElementById("testBox");
+ test_box.addEventListener("webkitAnimationIteration", start_f, true);
+ test_box.addEventListener("animationiteration", start_f, true);
+ }
+ function start_f() {
+ try {
+ box_txt = test_box.innerText;
+ test_box.innerText = parseInt(box_txt) + 1;
+ if (test_box.innerText % 2 == 0)
+ $("#testBox").removeClass("final");
+ else
+ $("#testBox").addClass("final");
+ } catch (err) {
+ test_box.innerText = box_txt;
+ }
+ }
+
+ function reloadTest() {
+ document.location.reload();
+ }
+
+ const expectedValues = [
+ // [time, element-id, property, expected-value, tolerance]
+ // [0.25, 'box', 'border-top-left-radius', 25, 5],
+ [0.25, 'testBox', 'border-radius', 25, 500]
+ ];
+
+ const expectedValues2 = [
+ [0.5, 'box', 'border-top-color', [128, 0, 128], 300],
+ [0.5, 'box', 'border-right-color', [128, 0, 128], 300],
+ [0.5, 'box', 'border-bottom-color', [128, 0, 128], 300],
+ [0.5, 'box', 'border-left-color', [128, 0, 128], 300],
+ [0.5, 'box', 'border-top-width', 10, 200],
+ [0.5, 'box', 'border-right-width', 10, 200],
+ [0.5, 'box', 'border-bottom-width', 10, 200],
+ [0.5, 'box', 'border-left-width', 10, 200]
+ ];
+ function setupTest() {
+ document.getElementById('testBox').className = 'testBox final';
+ }
+ function setupTest2() {
+ var box = document.getElementById('box');
+ box.className = 'final';
+ }
+ runTransitionTest(expectedValues, setupTest, usePauseAPI);
+ runTransitionTest(expectedValues2, setupTest2, usePauseAPI);
+ </script>
+ </head>
+ <body onload="init()">
+ <div data-role="header">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div data-role="content">
+ <div class="display_box">
+ <div id="box">
+ <div id="testBox">1</div>
+ </div>
+ </div>
+ <p><a href="javascript: reloadTest();" data-role="button">Test Again</a></p>
+ </div>
+ <div data-role="footer" data-position="fixed">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font class="fontSize">
+ <p>Test Purpose: </p>
+ <p>Verifies the CSS box is transferring between square and circle when moving from left to right, its background color is changing in the order of red, green and blue, and the counter record the times of CSS animation from 1 to 10.</p>
+ <p>Expected Result: </p>
+ <p>Test passes if the transformation and animation functions all work well.</p>
+ </font>
+ </div>
+ </body>
+</html>
--- /dev/null
+The code of main.js comes from
+http://svn.webkit.org/repository/webkit/trunk/LayoutTests/transitions/resources/transition-test-helpers.js
+without modification.
+
+These resources are under BSD Two Clause License:
+http://trac.webkit.org/browser/trunk/Source/WebKit/LICENSE
--- /dev/null
+/* This is the helper function to run transition tests:
+
+Test page requirements:
+- The body must contain an empty div with id "result"
+- Call this function directly from the <script> inside the test page
+
+Function parameters:
+ expected [required]: an array of arrays defining a set of CSS properties that must have given values at specific times (see below)
+ callback [optional]: a function to be executed just before the test starts (none by default)
+
+ Each sub-array must contain these items in this order:
+ - the time in seconds at which to snapshot the CSS property
+ - the id of the element on which to get the CSS property value
+ - the name of the CSS property to get [1]
+ - the expected value for the CSS property
+ - the tolerance to use when comparing the effective CSS property value with its expected value
+
+ [1] If the CSS property name is "-webkit-transform", expected value must be an array of 1 or more numbers corresponding to the matrix elements,
+ or a string which will be compared directly (useful if the expected value is "none")
+ If the CSS property name is "-webkit-transform.N", expected value must be a number corresponding to the Nth element of the matrix
+
+*/
+
+const usePauseAPI = true;
+const dontUsePauseAPI = false;
+
+const shouldBeTransitioning = true;
+const shouldNotBeTransitioning = false;
+
+function roundNumber(num, decimalPlaces)
+{
+ return Math.round(num * Math.pow(10, decimalPlaces)) / Math.pow(10, decimalPlaces);
+}
+
+function isCloseEnough(actual, desired, tolerance)
+{
+ var diff = Math.abs(actual - desired);
+ return diff <= tolerance;
+}
+
+function isShadow(property)
+{
+ return (property == '-webkit-box-shadow' || property == 'text-shadow');
+}
+
+function getShadowXY(cssValue)
+{
+ var text = cssValue.cssText;
+ // Shadow cssText looks like "rgb(0, 0, 255) 0px -3px 10px 0px"
+ var shadowPositionRegExp = /\)\s*(-?\d+)px\s*(-?\d+)px/;
+ var result = shadowPositionRegExp.exec(text);
+ return [parseInt(result[1]), parseInt(result[2])];
+}
+
+function compareRGB(rgb, expected, tolerance)
+{
+ return (isCloseEnough(parseInt(rgb[0]), expected[0], tolerance) &&
+ isCloseEnough(parseInt(rgb[1]), expected[1], tolerance) &&
+ isCloseEnough(parseInt(rgb[2]), expected[2], tolerance));
+}
+
+function parseCrossFade(s)
+{
+ var matches = s.match("-webkit-cross-fade\\((.*)\\s*,\\s*(.*)\\s*,\\s*(.*)\\)");
+
+ if (!matches)
+ return null;
+
+ return {"from": matches[1], "to": matches[2], "percent": parseFloat(matches[3])}
+}
+
+function checkExpectedValue(expected, index)
+{
+ var time = expected[index][0];
+ var elementId = expected[index][1];
+ var property = expected[index][2];
+ var expectedValue = expected[index][3];
+ var tolerance = expected[index][4];
+ var postCompletionCallback = expected[index][5];
+
+ var computedValue;
+ var pass = false;
+ var transformRegExp = /^-webkit-transform(\.\d+)?$/;
+ if (transformRegExp.test(property)) {
+ computedValue = window.getComputedStyle(document.getElementById(elementId)).webkitTransform;
+ if (typeof expectedValue == "string")
+ pass = (computedValue == expectedValue);
+ else if (typeof expectedValue == "number") {
+ var m = computedValue.split("(");
+ var m = m[1].split(",");
+ pass = isCloseEnough(parseFloat(m[parseInt(property.substring(18))]), expectedValue, tolerance);
+ } else {
+ var m = computedValue.split("(");
+ var m = m[1].split(",");
+ for (i = 0; i < expectedValue.length; ++i) {
+ pass = isCloseEnough(parseFloat(m[i]), expectedValue[i], tolerance);
+ if (!pass)
+ break;
+ }
+ }
+ } else if (property == "fill" || property == "stroke") {
+ computedValue = window.getComputedStyle(document.getElementById(elementId)).getPropertyCSSValue(property).rgbColor;
+ if (compareRGB([computedValue.red.cssText, computedValue.green.cssText, computedValue.blue.cssText], expectedValue, tolerance))
+ pass = true;
+ else {
+ // We failed. Make sure computed value is something we can read in the error message
+ computedValue = window.getComputedStyle(document.getElementById(elementId)).getPropertyCSSValue(property).cssText;
+ }
+ } else if (property == "stop-color" || property == "flood-color" || property == "lighting-color") {
+ computedValue = window.getComputedStyle(document.getElementById(elementId)).getPropertyCSSValue(property);
+ // The computedValue cssText is rgb(num, num, num)
+ var components = computedValue.cssText.split("(")[1].split(")")[0].split(",");
+ if (compareRGB(components, expectedValue, tolerance))
+ pass = true;
+ else {
+ // We failed. Make sure computed value is something we can read in the error message
+ computedValue = computedValue.cssText;
+ }
+ } else if (property == "lineHeight") {
+ computedValue = parseInt(window.getComputedStyle(document.getElementById(elementId)).lineHeight);
+ pass = isCloseEnough(computedValue, expectedValue, tolerance);
+ } else if (property == "background-image"
+ || property == "border-image-source"
+ || property == "border-image"
+ || property == "list-style-image"
+ || property == "-webkit-mask-image"
+ || property == "-webkit-mask-box-image") {
+ if (property == "border-image" || property == "-webkit-mask-image" || property == "-webkit-mask-box-image")
+ property += "-source";
+
+ computedValue = window.getComputedStyle(document.getElementById(elementId)).getPropertyCSSValue(property).cssText;
+ computedCrossFade = parseCrossFade(computedValue);
+
+ if (!computedCrossFade) {
+ pass = false;
+ } else {
+ pass = isCloseEnough(computedCrossFade.percent, expectedValue, tolerance);
+ }
+ } else {
+ var computedStyle = window.getComputedStyle(document.getElementById(elementId)).getPropertyCSSValue(property);
+ if (computedStyle.cssValueType == CSSValue.CSS_VALUE_LIST) {
+ var values = [];
+ for (var i = 0; i < computedStyle.length; ++i) {
+ switch (computedStyle[i].cssValueType) {
+ case CSSValue.CSS_PRIMITIVE_VALUE:
+ values.push(computedStyle[i].getFloatValue(CSSPrimitiveValue.CSS_NUMBER));
+ break;
+ case CSSValue.CSS_CUSTOM:
+ // arbitrarily pick shadow-x and shadow-y
+ if (isShadow) {
+ var shadowXY = getShadowXY(computedStyle[i]);
+ values.push(shadowXY[0]);
+ values.push(shadowXY[1]);
+ } else
+ values.push(computedStyle[i].cssText);
+ break;
+ }
+ }
+ computedValue = values.join(',');
+ pass = true;
+ for (var i = 0; i < values.length; ++i)
+ pass &= isCloseEnough(values[i], expectedValue[i], tolerance);
+ } else if (computedStyle.cssValueType == CSSValue.CSS_PRIMITIVE_VALUE) {
+ switch (computedStyle.primitiveType) {
+ case CSSPrimitiveValue.CSS_STRING:
+ case CSSPrimitiveValue.CSS_IDENT:
+ computedValue = computedStyle.getStringValue();
+ pass = computedValue == expectedValue;
+ break;
+ case CSSPrimitiveValue.CSS_RGBCOLOR:
+ var rgbColor = computedStyle.getRGBColorValue();
+ computedValue = [rgbColor.red.getFloatValue(CSSPrimitiveValue.CSS_NUMBER),
+ rgbColor.green.getFloatValue(CSSPrimitiveValue.CSS_NUMBER),
+ rgbColor.blue.getFloatValue(CSSPrimitiveValue.CSS_NUMBER)]; // alpha is not exposed to JS
+ pass = true;
+ for (var i = 0; i < 3; ++i)
+ pass &= isCloseEnough(computedValue[i], expectedValue[i], tolerance);
+ break;
+ case CSSPrimitiveValue.CSS_RECT:
+ computedValue = computedStyle.getRectValue();
+ computedValue = [computedValue.top.getFloatValue(CSSPrimitiveValue.CSS_NUMBER),
+ computedValue.right.getFloatValue(CSSPrimitiveValue.CSS_NUMBER),
+ computedValue.bottom.getFloatValue(CSSPrimitiveValue.CSS_NUMBER),
+ computedValue.left.getFloatValue(CSSPrimitiveValue.CSS_NUMBER)];
+ pass = true;
+ for (var i = 0; i < 4; ++i)
+ pass &= isCloseEnough(computedValue[i], expectedValue[i], tolerance);
+ break;
+ case CSSPrimitiveValue.CSS_PERCENTAGE:
+ computedValue = parseFloat(computedStyle.cssText);
+ pass = isCloseEnough(computedValue, expectedValue, tolerance);
+ break;
+ default:
+ computedValue = computedStyle.getFloatValue(CSSPrimitiveValue.CSS_NUMBER);
+ pass = isCloseEnough(computedValue, expectedValue, tolerance);
+ }
+ }
+ }
+
+ if (pass)
+ result += "PASS - \"" + property + "\" property for \"" + elementId + "\" element at " + time + "s saw something close to: " + expectedValue + "<br>";
+ else
+ result += "FAIL - \"" + property + "\" property for \"" + elementId + "\" element at " + time + "s expected: " + expectedValue + " but saw: " + computedValue + "<br>";
+
+ if (postCompletionCallback)
+ result += postCompletionCallback();
+}
+
+function endTest()
+{
+ document.getElementById('result').innerHTML = result;
+
+ if (window.testRunner)
+ testRunner.notifyDone();
+}
+
+function checkExpectedValueCallback(expected, index)
+{
+ return function() { checkExpectedValue(expected, index); };
+}
+
+function runTest(expected, usePauseAPI)
+{
+ var maxTime = 0;
+ for (var i = 0; i < expected.length; ++i) {
+ var time = expected[i][0];
+ var elementId = expected[i][1];
+ var property = expected[i][2];
+ if (!property.indexOf("-webkit-transform."))
+ property = "-webkit-transform";
+
+ var tryToPauseTransition = expected[i][6];
+ if (tryToPauseTransition === undefined)
+ tryToPauseTransition = shouldBeTransitioning;
+
+ if (hasPauseTransitionAPI && usePauseAPI) {
+ if (tryToPauseTransition) {
+ var element = document.getElementById(elementId);
+ if (!internals.pauseTransitionAtTimeOnElement(property, time, element))
+ window.console.log("Failed to pause '" + property + "' transition on element '" + elementId + "'");
+ }
+ checkExpectedValue(expected, i);
+ } else {
+ if (time > maxTime)
+ maxTime = time;
+
+ window.setTimeout(checkExpectedValueCallback(expected, i), time * 1000);
+ }
+ }
+
+ if (maxTime > 0)
+ window.setTimeout(endTest, maxTime * 1000 + 50);
+ else
+ endTest();
+}
+
+function waitForAnimationStart(callback, delay)
+{
+ var delayTimeout = delay ? 1000 * delay + 10 : 0;
+ // Why the two setTimeouts? Well, for hardware animations we need to ensure that the hardware animation
+ // has started before we try to pause it, and timers fire before animations get committed in the runloop.
+ window.setTimeout(function() {
+ window.setTimeout(function() {
+ callback();
+ }, 0);
+ }, delayTimeout);
+}
+
+function startTest(expected, usePauseAPI, callback)
+{
+ if (callback)
+ callback();
+
+ waitForAnimationStart(function() {
+ runTest(expected, usePauseAPI);
+ });
+}
+
+var result = "";
+var hasPauseTransitionAPI;
+
+function runTransitionTest(expected, callback, usePauseAPI, doPixelTest)
+{
+ hasPauseTransitionAPI = 'internals' in window;
+
+ if (window.testRunner) {
+ if (!doPixelTest)
+ testRunner.dumpAsText();
+ testRunner.waitUntilDone();
+ }
+
+ if (!expected)
+ throw("Expected results are missing!");
+
+ window.addEventListener("load", function() { startTest(expected, usePauseAPI, callback); }, false);
+}
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Cui, Jieqiong <jieqiongx.cui@intel.com>
+
+*/
+
+#d{
+ width: 100%;
+ height: 330px;
+ border: 1px solid #000;
+ margin-bottom: 20px;
+}
+#text-div{
+ background: #fff;
+ font-family: Georgia, "Times New Roman", Times, serif;
+ margin: 35px auto;
+ outline: #bed742 dotted 5px;
+ outline-offset: 5px;
+ width: 280px;
+ height: 230px;
+ opacity: 1;
+ overflow: auto;
+}
+h3{
+ font-family: TestFont, Georgia, "Times New Roman", Times, serif;
+ text-align: center;
+}
+#p{
+ background: url("../../../res/images/csswg/1x1-white.png") 40%/10em repeat fixed border-box;
+ word-wrap: break-word;
+ font-size: 14px;
+ white-space: normal;
+ text-indent: 30px;
+}
+
+#p:first-letter {
+ position: relative;
+ font-size: 24px;
+ color: red;
+ color: rgb(255, 0, 0%);
+ color: rgb(100%, 0%, 0);
+ color: rgb(100%, 1, 0);
+ color: rgb(254, 255%, 0);
+}
+
+/* CSS font */
+@font-face {
+ font-family: TestFont;
+ font-style: normal;
+ font-weight: bolder;
+ src: url(../../../res/font/w3c/CanvasTest.ttf);
+}
+.text-font {
+ font-family: TestFont;
+ font-size: xx-large;
+ font-weight: bolder;
+}
+
+/* CSS Multicolumn */
+.text-multi{
+ columns: 3;
+ column-rule: 10px groove orange;
+ column-gap: 2em;
+ -webkit-columns: 3;
+ -webkit-column-rule: 10px groove orange;
+ -webkit-column-gap: 2em;
+}
+.text-h{
+ column-span: all;
+ -webkit-column-span: all;
+}
+
+/* CSS Color */
+.text-red{
+ color: rgb(255 ,0 , 0);
+}
+.text-green{
+ color: rgb(0%, 100%, 0%);
+}
+.text-blue{
+ color: blue;
+ color: #f;
+ color: #ff00;
+ color: #ff000000;
+}
+
+/* CSS Text Transform */
+.text-upper{
+ text-transform: uppercase;
+}
+.text-lower{
+ text-transform: lowercase;
+}
+
+/* CSS Text Shadow */
+.text-shadow1{
+ text-shadow: -3px -3px 0 rgba(106,90,205,0.5);
+}
+.text-shadow2{
+ text-shadow: 3px 3px 0 rgba(106,90,205,0.5);
+}
+
+/* CSS Box Shadow */
+.box-shadow1{
+ box-shadow: -15px -15px 10px hsla(150, 20%, 30%, 0.5);
+}
+.box-shadow2{
+ box-shadow: 15px 15px 10px hsla(150, 20%, 30%, 0.5);
+}
+
+/* CSS Border */
+.border1{
+ border-image: url(../../../res/images/webkit/ring.png) 10% 15% 10% 15% / 5px repeat stretch;
+ -webkit-border-image: url(../../../res/images/webkit/ring.png) 10% 15% 10% 15% / 5px repeat stretch;
+}
+.border2{
+ border: 5px groove rgb(135,206,235);
+ border-radius: 20px 20px;
+}
+
+
+/* CSS Transparency */
+.ui-slider .ui-btn-inner {
+ padding: 6px 0 0 0 !important;
+ font-size:.7em;
+}
+.ui-slider-popup {
+ position: absolute !important;
+ width: 64px;
+ height: 64px;
+ text-align: center;
+ font-size: 36px;
+ padding-top: 14px;
+ z-index: 100;
+ opacity: 0.8;
+}
+
+.text-on{
+ background:#5393c5;
+}
+
+div.ui-slider {
+ margin: 0 2% 0 0px;
+ width:96%;
+}
+
+.content .ui-controlgroup-controls{
+ width: 100%;
+}
+
+.q{
+ margin-left: 2%;
+}
+
+.u{
+ margin-left: 2%;
+}
+
+.s{
+ margin-left: 2%;
+}
+ .q .ui-corner-right{
+
+}
+
+ .q .ui-corner-left{
+
+}
+
+.u .ui-corner-right{
+
+}
+
+.u .ui-corner-left{
+
+}
+
+.u .ui-btn-up-c{
+ width: 32%;
+}
+
+.u .ui-btn-down-c{
+ width: 32%;
+}
+
+.u .ui-btn-hover-c{
+ width: 32%
+}
+
+.q .ui-btn-up-c{
+ width: 48%;
+}
+
+.q .ui-btn-down-c{
+ width: 48%;
+}
+
+.q .ui-btn-hover-c{
+ width: 48%;
+}
+
+.u .ui-btn-inner, .q .ui-btn-inner{
+ padding: .6em 5px;
+ overflow: visible;
+}
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Cui, Jieqiong <jieqiongx.cui@intel.com>
+
+-->
+
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width">
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../css/main.css" />
+ <link rel="stylesheet" type="text/css" href="css/style.css" />
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/tests.js"></script>
+ <script src="js/main.js"></script>
+ <script src="js/jquery/slider.tooltip.js"></script>
+ <style>
+ .normalSpan {
+ display:none;
+ color:red;
+ }
+ .columnSpan {
+ visibility:hidden;
+ color:red;
+ }
+ </style>
+ </head>
+ <body>
+ <div data-role="header">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div data-role="content" class="content">
+ <div id="d">
+ <div id="text-div">
+ <div id="p"><span class="normalSpan">A</span>
+ By using functionality described in this document, style sheets can declare that the content of an element is to be laid out in multiple columns.
+ <h3 id="h"><span class="columnSpan">A</span>column span</h3>
+ The main benefit of using CSS-based columns is flexibility; content can flow from one column to another.
+ </div>
+ </div>
+ </div>
+ <div data-role="controlgroup" data-type="horizontal" class="q">
+ <label for="slider-1">Mulcolumn</label>
+ <a id="on" data-role="button">On</a>
+ <a id="off" data-role="button">Off</a>
+ </div>
+ <div data-role="controlgroup" class="s">
+ <label for="slider-1">Transparency</label>
+ <input name="slider-1" id="slider-1" min="0" max="1" step=".01" value="1" data-highlight="true" data-show-value="true" type="range">
+ </div>
+ <div data-role="controlgroup" data-type="horizontal" class="u">
+ <label for="slider-1">Font Color</label>
+ <a id="red" data-role="button">Red</a>
+ <a id="green" data-role="button">Green</a>
+ <a id="blue" data-role="button">Blue</a>
+ </div>
+ <div data-role="controlgroup" data-type="horizontal" class="q">
+ <label for="slider-1">Text Transform</label>
+ <a id="upper" data-role="button">Uppercase</a>
+ <a id="lower" data-role="button">Lowercase</a>
+ </div>
+ <div data-role="controlgroup" data-type="horizontal" class="q">
+ <label for="slider-1">Text Shadow</label>
+ <a id="shadow1" data-role="button">Shadow1</a>
+ <a id="shadow2" data-role="button">Shadow2</a>
+ </div>
+ <div data-role="controlgroup" data-type="horizontal" class="q">
+ <label for="slider-1">Box Shadow</label>
+ <a id="box-shadow1" data-role="button">Shadow1</a>
+ <a id="box-shadow2" data-role="button">Shadow2</a>
+ </div>
+ <div data-role="controlgroup" class="s">
+ <label for="slider-2">Outline offset</label>
+ <input name="slider-2" id="slider-2" min="0" max="15" step="1" value="5" data-highlight="true" data-show-value="true" type="range">
+ </div>
+ <div data-role="controlgroup" data-type="horizontal" class="q">
+ <label for="slider-1">Border</label>
+ <a id="border1" data-role="button">Border1</a>
+ <a id="border2" data-role="button">Border2</a>
+ </div>
+ </div>
+ <div data-role="footer" data-position="fixed">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font class="fontSize">
+ <p>Test Purpose: </p>
+ <p>Verifies</p>
+ <ul>
+ <li>the dotted line box has a white background, red first letter, green dotted border.</li>
+ <li>the general description uses default font in browser.</li>
+ <li>the functionality of all the text color in red, green or blue, background transparence from 0% to 100%, outline offset from 0 to 15, multicolumn enabling and disabling.</li>
+ <li>the text in uppercase or lowercase, text and box shadow in two effects.</li>
+ <li>the "column span" text shows in random code when using uppercase.</li>
+ </ul>
+ <p>Expected Result: </p>
+ <p>Test passes if all the check points work well in the dotted line box.</p>
+ </font>
+ </div>
+ </body>
+</html>
--- /dev/null
+Copyright (c) 2013 Intel Corporation.
+Except as noted, this software is licensed under BSD-3-Clause License.
+Please, see the LICENSE.BSD-3 file for the BSD-3-Clause License.
+
+Following resources are licensed under its own license.
+
+slider.tooltip.js:
+The above file is licensed under jQuery MIT License:
+From https://github.com/jquery/jquery-mobile
+Please see the LICENSE.MIT for the MIT terms and conditions.
--- /dev/null
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Slider tooltip extension
+//>>label: Slidertooltip
+//>>group: Forms
+//>>css.theme: ../css/themes/default/jquery.mobile.theme.css
+//>>css.structure: ../css/structure/jquery.mobile.slider.tooltip.css
+
+//define( [ "jquery", "./slider" ], function( $ ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, undefined ) {
+
+$.widget( "mobile.slider", $.mobile.slider, {
+ options: {
+ popupEnabled: false,
+ showValue: false
+ },
+
+ _create: function() {
+ var o = this.options,
+ popup = $( "<div></div>", {
+ class: "ui-slider-popup ui-shadow ui-corner-all ui-body-" + ( o.theme ? o.theme : $.mobile.getInheritedTheme( this.element, "c" ) )
+ });
+
+ this._super();
+
+ $.extend( this, {
+ _currentValue: null,
+ _popup: popup,
+ _popupVisible: false,
+ _handleText: this.handle.find( ".ui-btn-text" )
+ });
+
+ this.slider.before( popup );
+ popup.hide();
+
+ this._on( this.handle, { "vmousedown" : "_showPopup" } );
+ this._on( this.slider.add( $.mobile.document ), { "vmouseup" : "_hidePopup" } );
+ this._refresh();
+ },
+
+ // position the popup centered 5px above the handle
+ _positionPopup: function() {
+ var dstOffset = this.handle.offset();
+ this._popup.offset( {
+ left: dstOffset.left + ( this.handle.width() - this._popup.width() ) / 2,
+ top: dstOffset.top - this._popup.outerHeight() - 5
+ });
+ },
+
+ _setOption: function( key, value ) {
+ this._super( key, value );
+
+ if ( key === "showValue" ) {
+ if ( value ) {
+ this._handleText.html( this._value() ).show();
+ } else {
+ this._handleText.hide();
+ }
+ }
+ },
+
+ // show value on the handle and in popup
+ refresh: function() {
+ this._super.apply( this, arguments );
+
+ // necessary because slider's _create() calls refresh(), and that lands
+ // here before our own _create() has even run
+ if ( !this._popup ) {
+ return;
+ }
+
+ this._refresh();
+ },
+
+ _refresh: function() {
+ var o = this.options, newValue;
+
+ if ( o.popupEnabled ) {
+ // remove the title attribute from the handle (which is
+ // responsible for the annoying tooltip); NB we have
+ // to do it here as the jqm slider sets it every time
+ // the slider's value changes :(
+ this.handle.removeAttr( 'title' );
+ }
+
+ newValue = this._value();
+ if ( newValue === this._currentValue ) {
+ return;
+ }
+ this._currentValue = newValue;
+
+ var ID = this.element[0].id;
+ if (ID == "slider-1") {
+ if ( o.showValue ) {
+ this._handleText.html(Math.round(newValue*100)+"%");
+ $("#p").css("opacity", newValue);
+ if(newValue != 1){
+ testFlag.Transparency = true;
+ status();
+ }
+ }
+ }else if(ID == "slider-2"){
+ if ( o.showValue ) {
+ this._handleText.html(Math.round(newValue));
+ $("#text-div").css("outline-offset", newValue);
+ if(newValue != 5){
+ testFlag.Outline = true;
+ status();
+ }
+ }
+ }
+
+ //if ( o.popupEnabled ) {
+ // this._positionPopup();
+ // this._popup.html( newValue );
+ //}
+
+ //if ( o.showValue ) {
+ // this._handleText.html( newValue );
+ //}
+ },
+
+ _showPopup: function() {
+ if ( this.options.popupEnabled && !this._popupVisible ) {
+ this._handleText.hide();
+ this._popup.show();
+ this._positionPopup();
+ this._popupVisible = true;
+ }
+ },
+
+ _hidePopup: function() {
+ if ( this.options.popupEnabled && this._popupVisible ) {
+ this._handleText.show();
+ this._popup.hide();
+ this._popupVisible = false;
+ }
+ }
+});
+
+})( jQuery );
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Cui,Jieqiong <jieqiongx.cui@intel.com>
+
+*/
+
+var testFlag={
+ Mulcolumn: false,
+ Transparency: false,
+ Color: false,
+ Transform: false,
+ TextShadow: false,
+ BoxShadow: false,
+ Outline: false,
+ Border: false
+ };
+
+function status(){
+ if(testFlag.Mulcolumn && testFlag.Transparency && testFlag.Color && testFlag.Transform && testFlag.TextShadow && testFlag.BoxShadow && testFlag.Outline && testFlag.Border)
+ EnablePassButton();
+}
+
+$(document).ready(function(){
+ DisablePassButton();
+ /** CSS Multicolumn */
+ $("#on").click(function(){
+ $("#off").removeClass("text-on");
+ $("#on").addClass("text-on");
+ $("#p").addClass("text-multi");
+ $("#h").addClass("text-h");
+ testFlag.Mulcolumn = true;
+ status();
+ });
+ $("#off").click(function(){
+ $("#on").removeClass("text-on");
+ $("#off").addClass("text-on");
+ $("#p").removeClass("text-multi");
+ $("#h").removeClass("text-h");
+ testFlag.Mulcolumn = true;
+ status();
+ });
+
+ /** CSS Color */
+ $("#red").click(function(){
+ var $p = $("#p");
+ $("#green").removeClass("text-on");
+ $("#blue").removeClass("text-on");
+ $("#red").toggleClass("text-on");
+ // remove text-green and text-blue style
+ if($p.hasClass("text-green")) $p.removeClass("text-green");
+ if($p.hasClass("text-blue")) $p.removeClass("text-blue");
+ // add/remove text-red style
+ $p.toggleClass("text-red");
+ testFlag.Color = true;
+ status();
+ });
+ $("#green").click(function(){
+ var $p = $("#p");
+ $("#red").removeClass("text-on");
+ $("#blue").removeClass("text-on");
+ $("#green").toggleClass("text-on");
+ // remove text-red and text-blue style
+ if($p.hasClass("text-red")) $p.removeClass("text-red");
+ if($p.hasClass("text-blue")) $p.removeClass("text-blue");
+ // add/remove text-green style
+ $p.toggleClass("text-green");
+ testFlag.Color = true;
+ status();
+ });
+ $("#blue").click(function(){
+ var $p = $("#p");
+ $("#green").removeClass("text-on");
+ $("#red").removeClass("text-on");
+ $("#blue").toggleClass("text-on");
+ // remove text-red and text-green style
+ if($p.hasClass("text-red")) $p.removeClass("text-red");
+ if($p.hasClass("text-green")) $p.removeClass("text-green");
+ // add/remove text-blue style
+ $p.toggleClass("text-blue");
+ testFlag.Color = true;
+ status();
+ });
+
+ /** CSS Text Transform */
+ $("#upper").click(function(){
+ $("#lower").removeClass("text-on");
+ $("#upper").toggleClass("text-on");
+ $("#p").removeClass("text-lower");
+ $("#p").toggleClass("text-upper");
+ testFlag.Transform = true;
+ status();
+ });
+ $("#lower").click(function(){
+ $("#upper").removeClass("text-on");
+ $("#lower").toggleClass("text-on");
+ $("#p").removeClass("text-upper");
+ $("#p").toggleClass("text-lower");
+ testFlag.Transform = true;
+ status();
+ });
+
+ /** CSS Text Shadow */
+ $("#shadow1").click(function(){
+ $("#shadow2").removeClass("text-on");
+ $("#shadow1").toggleClass("text-on");
+ $("#p").removeClass("text-shadow2");
+ $("#p").toggleClass("text-shadow1");
+ testFlag.TextShadow = true;
+ status();
+ });
+ $("#shadow2").click(function(){
+ $("#shadow1").removeClass("text-on");
+ $("#shadow2").toggleClass("text-on");
+ $("#p").removeClass("text-shadow1");
+ $("#p").toggleClass("text-shadow2");
+ testFlag.TextShadow = true;
+ status();
+ });
+
+ /** CSS Box Shadow */
+ $("#box-shadow1").click(function(){
+ $("#box-shadow2").removeClass("text-on");
+ $("#box-shadow1").toggleClass("text-on");
+ $("#text-div").removeClass("box-shadow2");
+ $("#text-div").toggleClass("box-shadow1");
+ testFlag.BoxShadow = true;
+ status();
+ });
+ $("#box-shadow2").click(function(){
+ $("#box-shadow1").removeClass("text-on");
+ $("#box-shadow2").toggleClass("text-on");
+ $("#text-div").removeClass("box-shadow1");
+ $("#text-div").toggleClass("box-shadow2");
+ testFlag.BoxShadow = true;
+ status();
+ });
+
+ /** CSS Border */
+ $("#border1").click(function(){
+ $("#border2").removeClass("text-on");
+ $("#border1").toggleClass("text-on");
+ $("#text-div").removeClass("border2");
+ $("#text-div").toggleClass("border1");
+ testFlag.Border = true;
+ status();
+ });
+ $("#border2").click(function(){
+ $("#border1").removeClass("text-on");
+ $("#border2").toggleClass("text-on");
+ $("#text-div").removeClass("border1");
+ $("#text-div").toggleClass("border2");
+ testFlag.Border = true;
+ status();
+ });
+
+
+ /* Hide input*/
+ $("#slider-1").hide();
+ $("#slider-2").hide();
+});
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Xin, liu <xinx.liu@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width">
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../css/main.css" />
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/tests.js"></script>
+ <script src="js/main.js"></script>
+ <style>
+ #observateEare {
+ border: black solid 1px;
+ height: 300px;
+ }
+ #photoShow {
+ height: 210px;
+ line-height:210px;
+ }
+ </style>
+ </head>
+ <body>
+ <div data-role="header">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div data-role="content">
+ <div id="observateEare" align="center">
+ <p id="filename"></p>
+ <div id="photoShow" align="center"></div>
+ </div>
+ <input type="file" id="files" accept="image/*" capture="camera" class="hideButton" />
+ <div align="center">
+ <input id="button" type="button" value="Launch camera to take a photo" />
+ </div>
+ </div>
+ <div data-role="footer" data-position="fixed">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font class="fontSize">
+ <p>Test Purpose: </p>
+ <p>Verifies the functionality of Camera. Opens a device camera, previews the image automatically, then presents the captured photo after clicking the "capture" button.</p>
+ <p>Test Step: </p>
+ <p>Click the "Launch camera to take a photo" button to launch the camera preview.</p>
+ <p>Expected Result: </p>
+ <p>Test passes if the camera preview and capture work well.</p>
+ </font>
+ </div>
+ </body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Xin, liu <xinx.liu@intel.com>
+
+*/
+
+function drawOnCanvas(file) {
+ var reader = new FileReader();
+
+ reader.onload = function (e) {
+ var dataURL = e.target.result;
+ var c = document.createElement("Canvas");
+ ctx = c.getContext('2d');
+ img = new Image();
+
+ img.onload = function() {
+ c.width = img.width;
+ c.height = img.height;
+
+ var fheight = 180;
+ var fwidth = fheight / img.height * img.width
+ ctx.drawImage(img, 0, 0, fwidth, fheight);
+ };
+ img.src = dataURL;
+ $('#photoShow').html(c);
+ };
+
+ reader.readAsDataURL(file);
+}
+
+$(document).ready(function(){
+ DisablePassButton();
+ $("#photoShow").html("No photo");
+ $("#files")[0].onchange = function(evt) {
+ try {
+ // loading
+ $.mobile.showPageLoadingMsg();
+
+ var files = evt.target.files; // FileList object
+ $("#filename").html(files[0].name);
+ drawOnCanvas(files[0]);
+
+ $.mobile.hidePageLoadingMsg();
+ EnablePassButton();
+ } catch(err) {
+ $.mobile.hidePageLoadingMsg();
+ $("#filename").html(err);
+ }
+ }
+
+ $("#button")[0].onclick = function() {
+ var ie = navigator.appName == "Microsoft Internet Explorer" ? true : false;
+ if(ie){
+ $("#files")[0].click();
+ $("#button")[0].value = $("#files")[0].value;
+ }else{
+ var evt = document.createEvent("MouseEvents");
+ evt.initEvent("click", true, true);
+ $("#files")[0].dispatchEvent(evt);
+ }
+ }
+
+});
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Xin, liu <xinx.liu@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width">
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../css/main.css" />
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/tests.js"></script>
+ <script src="js/main.js"></script>
+ <style>
+ #observateEare {
+ border: black solid 1px;
+ height: 330px;
+ line-height:330px;
+ }
+ </style>
+ </head>
+ <body>
+ <div data-role="header">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div data-role="content">
+ <div id="observateEare" align="center">
+ <p id="errormassage"></p>
+ <div align="center">
+ <video width="330px" height="330px" id="localView" autoplay="autoplay"></video>
+ </div>
+ </div>
+ <div align="center">
+ <input id="getUserMeida" type="button" value="Start camera preview" />
+ <input id="stopUserMeida" type="button" value="Stop camera preview" />
+ </div>
+ </div>
+ <div data-role="footer" data-position="fixed">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font class="fontSize">
+ <p>Test Purpose: </p>
+ <p>Verifies the functionality of enabling and disabling the Camera preview.</p>
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Start camera preview" button to launch the preview.</li>
+ <li>Click the "Stop camera preview" button to close the preview.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if the Camera preview works well.</p>
+ </font>
+ </div>
+ </body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Xin, liu <xinx.liu@intel.com>
+
+*/
+$(document).ready(function(){
+ DisablePassButton();
+ $("#errormassage").html("No video");
+ //getUserMedia
+ $("#getUserMeida")[0].onclick = function() {
+ try {
+ navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia;
+ navigator.getUserMedia({video: true}, function(s){
+ var url = webkitURL.createObjectURL(s);
+ $("#localView")[0].src = url;
+ $("#localView").show();
+ $("#errormassage").hide();
+ EnablePassButton();
+ }, function(error){
+ $("#errormassage").show();
+ $("#errormassage").html("Get user media occur error:<font color='red'>PERMISSION DENIED</font>");
+ });
+ } catch (e) {
+ $("#localView").hide();
+ $("#errormassage").html("Get usr media occur error,with error message:<font color='red'>"+e.message+"</font>");
+ }
+ }
+
+ //stop getUserMedia
+ $("#stopUserMeida")[0].onclick = function() {
+ try {
+ navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia;
+ navigator.getUserMedia();
+ $("#errormassage").show();
+ $("#errormassage").html("No video");
+ } catch (e) {
+ $("#localView").hide();
+ $("#errormassage").show();
+ $("#errormassage").html("No video");
+ }
+ }
+});
--- /dev/null
+flowser.png
+
+This file is created by Intel test developers under 3-Clause BSD License.
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Li, cici <cici.x.li@intel.com>
+
+-->
+
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/tests.js"></script>
+ <script src="js/main.js"></script>
+ <script type="text/javascript">
+ function reloadTest() {
+ document.location.reload();
+ }
+ </script>
+ </head>
+
+<body>
+ <div data-role="header">
+ <h1 id="main_page_title"></h1>
+ </div>
+
+ <h3>Original Picture</p>
+ <img id="flowser" src="./flowser.png" alt="flowser" />
+
+ <p>Target Picture</p>
+ <canvas id="myCanvas" width="300" height="240" style="border:1px solid #c3c3c3;">
+ Your browser does not support the canvas element.
+ </canvas>
+
+ <script type="text/javascript">
+ var c=document.getElementById("myCanvas");
+ var cxt=c.getContext("2d");
+ var img=new Image()
+ img.src="./flowser.png"
+ cxt.drawImage(img,0,0);
+ </script>
+
+ <div data-role="content">
+ <button onclick="rotate()">Rotate Pic</button>
+ <button onclick="scale()">Scale Pic</button>
+ <button onclick="transform()">Transform Pic</button>
+ <button onclick="to_blackWhite()">Vampix Pic</button>
+ <p><a href="javascript: reloadTest();" data-role="button">Test Again</a></p>
+ </div>
+
+ <div data-role="footer" data-position="fixed">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font style="font-size:85%">
+ <p>Test Purpose: </p>
+ <p>Verifies picture management with HTML5 Canvas: </p>
+ <p>1.click "Rotate Pic" button to rotate pic with 20 degree, then click "Test Again" button; </p>
+ <p>2.click "Scale Pic" to enlarger with 1.5 scale, click 2 or many times to enlarge continuously, then click "Test Again" button; </p>
+ <p>3.click "Transform Pic" to check pic transformation, then click "Test Again" button; </p>
+ <p>4.click "Vampix Pic" to change pic to "black white", then click "Test Again" button; </p>
+ <p>5.Do combination test, click "Rotate Pic" + "Scale Pic" + "Vampix Pic" in order, then click "Test Again" button; </p>
+ <p>Expected Result: </p>
+ <p>This test PASS only if the pic could be rotated,scaled,transformed, vampixed well.</p>
+ </font>
+ </div>
+</body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Li, cici <cici.x.li@intel.com>
+*/
+
+function rotate()
+{
+ cxt.rotate(20*Math.PI/180);
+ cxt.clearRect(0,0,500,500);
+ cxt.drawImage(img,0,0);
+}
+function scale()
+{
+ cxt.scale(1.5,1.5);
+ cxt.drawImage(img,0,0);
+}
+/*
+function translate()
+{
+ cxt.translate(70,70);
+ cxt.drawImage(img,0,0);
+}*/
+
+function transform()
+{
+ cxt.transform(0.8,0.5,0.5,1,10,0);
+ cxt.drawImage(img,0,0);
+}
+
+function to_blackWhite()
+{
+ cxt.drawImage(img,0,0);
+ var imgData = cxt.getImageData(0, 0, c.width, c.height);
+ var imgD = imgData.data;
+ for(var i=0, n=imgD.length; i<n; i+=4){
+ var gray = imgD[i] * 0.3 + imgD[i+1] * 0.59 + imgD[i+2] * 0.11;
+ imgD[i] = gray;
+ imgD[i+1] = gray;
+ imgD[i+2] = gray;
+ }
+ cxt.putImageData(imgData, 0, 0);
+}
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Tan, Shiyou <shiyoux.tan@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width">
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../css/main.css" />
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/tests.js"></script>
+ <script src="js/main.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="main">
+ <div data-role="header">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div id="content">
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch1" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font class="fontSize">
+ <p>Test Purpose: </p>
+ <p>Verifies the device supports clipboard to copy, cut and paste texts. Tests the functionality by long pressing the selected text, choose the "Copy", "Cut" and "Paste" in popup menu.</p>
+ <p>Pre-condition: </p>
+ <p>Ensure the copy and paste test widget is installed successfully.</p>
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if the copy, cut and paste functions all work well.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Tan, Shiyou <shiyoux.tan@intel.com>
+*/
+
+var installUrl;
+$(document).delegate("#main", "pageinit", function() {
+ DisablePassButton();
+
+ $("#install").bind("vclick", function() {
+ install(installUrl, "install");
+ });
+ $("#launch1").bind("vclick", function() {
+ launch();
+ $("#uninstall").removeClass("ui-disabled");
+ });
+ $("#uninstall").bind("vclick", function() {
+ uninstall();
+ });
+ try {
+ tizen.package.setPackageInfoEventListener(packageEventCallback);
+ } catch (e) {
+ alert("Exception: " + e.message);
+ }
+ packagePre();
+ $("#launch1").addClass("ui-disabled");
+ $("#uninstall").addClass("ui-disabled");
+
+ if(checkInstalledPkg("bclipboard")) {
+ $("#install").addClass("ui-disabled");
+ $("#launch1").removeClass("ui-disabled");
+ }
+});
+
+var packageEventCallback = {
+ oninstalled: function(packageInfo) {
+ hideProcess();
+ alert("The application " + packageInfo.name + " is installed");
+ },
+ onuninstalled: function(packageId) {
+ hideProcess();
+ alert("The Clipboard application is uninstalled");
+ }
+};
+
+function fileURI() {
+ var documentsDir;
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ if(files[i].name == "Clipboard.wgt")
+ {
+ var Url1 = files[i].toURI();
+ installUrl = Url1.replace("file:///", "/");
+ }
+ }
+ }
+
+ function onerror(error) {
+ alert("The error " + error.message + " occurred when listing the files in the selected folder");
+ }
+
+ tizen.filesystem.resolve(
+ 'documents',
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error" + e.message);
+ }, "r"
+ );
+}
+
+function install(url, type) {
+ var onInstallationSuccess = {
+ onprogress: function(packageId, percentage)
+ {
+ console.log("On installation(" + packageId + "): progress(" + percentage + ")");
+ showProcess();
+ },
+ oncomplete: function(packageId)
+ {
+ console.log("Installation(" + packageId + ") Complete");
+ $("#install").addClass("ui-disabled");
+ $("#launch1").removeClass("ui-disabled");
+ }
+ }
+
+ var onError = function (err) {
+ alert("Error occured on installation : " + err.message);
+ $.mobile.hidePageLoadingMsg();
+ }
+
+ try {
+ tizen.package.install(url, onInstallationSuccess, onError);
+ } catch (e) {
+ alert("Exception: " + e.name);
+ }
+}
+
+function uninstall() {
+
+ var onUninstallationSuccess = {
+
+ onprogress: function(packageId, percentage)
+ {
+ showProcess();
+ console.log("On uninstallation(" + packageId + "): progress(" + percentage + ")");
+ },
+ oncomplete: function(packageId)
+ {
+ console.log("Uninstallation(" + packageId + ") Complete");
+ $("#launch1").addClass("ui-disabled");
+ $("#uninstall").addClass("ui-disabled");
+ EnablePassButton();
+ }
+ }
+
+ var onError = function (err) {
+ alert("Error occured on uninstallation : " + err.name);
+ $.mobile.hidePageLoadingMsg();
+ }
+
+ try {
+ tizen.package.uninstall("bclipboard", onUninstallationSuccess, onError);
+ } catch (e) {
+ alert("Exception: " + e.name);
+ }
+}
+
+function launch() {
+ function onSuccess() {
+ console.log(id + " launched successfully!");
+ }
+
+ function onError(err) {
+ alert("launch failed : Clipboard application is already uninstalled or not installed");
+ }
+
+ try {
+ tizen.application.launch("bclipboard.clipboard", onSuccess, onError);
+ } catch (exc) {
+ alert("launch exc:" + exc.message);
+ }
+}
+
+function packagePre() {
+ var documentsDir;
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ if(files[i].name == "Clipboard")
+ {
+ documentsDir.copyTo(
+ files[i].fullPath,
+ "documents/Clipboard.wgt",
+ true,
+ function() {
+ console.log("Clipboard Precondition Success(2)!");
+ });
+ }
+ }
+ fileURI();
+ }
+
+ function onerror(error) {
+ alert("The error " + error.message + " occurred when listing the files in the selected folder");
+ }
+
+ tizen.filesystem.resolve(
+ 'wgt-package/tests/Clipboard/res/',
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error" + e.message);
+ }, "r"
+ );
+}
+
+function hideProcess() {
+ $.mobile.hidePageLoadingMsg();
+ $("#popup_info-screen").addClass("ui-screen-hidden");
+ $("#popup_info-screen").removeClass("in");
+}
+
+function showProcess() {
+ $.mobile.showPageLoadingMsg();
+ $("#popup_info-screen").removeClass("ui-screen-hidden");
+ $("#popup_info-screen").addClass("in");
+}
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+ Xu, Kang <kangx.xu@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../css/main.css" />
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/tests.js"></script>
+ <script src="../../js/main.js"></script>
+ <script src="js/main.js"></script>
+ </head>
+ <body>
+ <input type="hidden" id="sub_test"/>
+ <div data-role="page" id="main">
+ <div data-role="header" data-position="fixed" data-tap-toggle="false">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div id="content">
+ <ul data-role="listview" id="cspList" data-divider-theme="b" data-inset="true">
+ <li data-role="list-divider" role="heading">Test src content</li>
+ <li id="application-content">
+ <a href="javascript:runApp('res/application-content.html')" data-transition="slide" style="">
+ <h2>application-content</h2>
+ </a>
+ </li>
+ <li id="application-content-crosswalksite">
+ <a href="javascript:runApp('res/application-content-crosswalksite.html')" data-transition="slide" style="">
+ <h2>application-content-crosswalksite</h2>
+ </a>
+ </li>
+ <li data-role="list-divider" role="heading">Test background support</li>
+ <li id="setting-bs-disable">
+ <a href="javascript:runApp('res/setting-bs-disable.html')" data-transition="slide" style="">
+ <h2>setting-bs-disable</h2>
+ </a>
+ </li>
+ <li data-role="list-divider" role="heading">Test context menu</li>
+ <li id="setting-cm-disable">
+ <a href="javascript:runApp('res/setting-cm-disable.html')" data-transition="slide" style="">
+ <h2>setting-cm-disable</h2>
+ </a>
+ </li>
+ <li id="setting-cm-enable">
+ <a href="javascript:runApp('res/setting-cm-enable.html')" data-transition="slide" style="">
+ <h2>setting-cm-enable</h2>
+ </a>
+ </li>
+ <li data-role="list-divider" role="heading">Test encryption</li>
+ <li id="setting-encrypt-disable">
+ <a href="javascript:runApp('res/setting-encrypt-disable.html')" data-transition="slide" style="">
+ <h2>setting-encrypt-disable</h2>
+ </a>
+ </li>
+ <li id="setting-encrypt-enable">
+ <a href="javascript:runApp('res/setting-encrypt-enable.html')" data-transition="slide" style="">
+ <h2>setting-encrypt-enable</h2>
+ </a>
+ </li>
+ <li data-role="list-divider" role="heading">Test hwkey</li>
+ <li id="setting-hwkey-default">
+ <a href="javascript:runApp('res/setting-hwkey-default.html')" data-transition="slide" style="">
+ <h2>setting-hwkey-default</h2>
+ </a>
+ </li>
+ <li id="setting-hwkey-disable">
+ <a href="javascript:runApp('res/setting-hwkey-disable.html')" data-transition="slide" style="">
+ <h2>setting-hwkey-disable</h2>
+ </a>
+ </li>
+ <li id="setting-hwkey-enable">
+ <a href="javascript:runApp('res/setting-hwkey-enable.html')" data-transition="slide" style="">
+ <h2>setting-hwkey-enable</h2>
+ </a>
+ </li>
+ <li data-role="list-divider" role="heading">Clean all the installed packages</li>
+ <li>
+ <div data-role="button" id="wgtClean" class="wgtButton">Clean all test applications</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Note: </p>
+ <p>Verifies the functionality of tizen-specific widget configuration extension and w3c widget configuration extension.</p>
+ <p>Test Purpose: </p>
+ <p>Verifies WRT MUST support additional configuration elements that are not included in W3C Widget Packaging and XML Configuration, like "<tizen:application>", "<tizen:privilege>", "<tizen:setting>" etc.</p>
+ <p>Expected Result: </p>
+ <p>Test passes if all sub-tests pass.</p>
+ </font>
+ </div>
+ </div>
+ <div data-role="page" id="test_ui">
+ <iframe id="test_frame" width="100%" frameborder="no" border="0" src=""></iframe>
+ </div>
+ </body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.sandbox
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+*/
+var allId=new Array('wrt2apc001',
+ 'wrt2sam045',
+ 'wrt2sao044',
+ 'wrt2saz043',
+ 'wrt2sod031',
+ 'wrt2sbd024',
+ 'wrt2scd026',
+ 'wrt2sce027',
+ 'wrt2shd044',
+ 'wrt2skd041',
+ 'wrt2ske042',
+ 'wrt2sed028',
+ 'wrt2see029',
+ 'wrt2apc002');
+
+var installedId = new Array();
+var resultXML, tests;
+var MOUDLE_NAME = "ConfigurationExtension";
+var RESULT_FILE_NAME = "tct-behavior-child.ce.result.xml";
+
+$(document).delegate("#main", "pageinit", function() {
+ DisablePassButton();
+ $("#wgtClean").bind("vclick", function() {
+ showTotalBar();
+ });
+});
+
+function showTotalBar(){
+ $.each(allId,function(key,val){
+ try {
+ var packageInfo = tizen.package.getPackageInfo(val);
+ console.log("Current Package ID : " + packageInfo.id);
+ } catch (e) {
+ //alert("Exception: " + e.message);
+ }
+ if(packageInfo != "" && packageInfo != undefined){
+ installedId.push(val);
+ }
+ });
+ checkInstalledPackage();
+}
+
+function checkInstalledPackage(){
+ if(installedId.length > 0){
+ setTimeout(function() {
+ uninstall(installedId[0]);
+ }, 1000);
+ } else {
+ $.mobile.hidePageLoadingMsg();
+ alert("All widgets is uninstalled!");
+ if (checkIfAllPackagePass()) {
+ EnablePassButton();
+ }
+ }
+}
+
+function checkIfAllPackagePass() {
+ var result = true;
+
+ tests.each(function() {
+ if ($(this).attr('result') != "PASS") {
+ result = false;
+ }
+ });
+ return result;
+}
+
+function uninstall(val) {
+ installedId.shift();
+ var totalBar = Math.floor((allId.length - installedId.length - 1) / allId.length * 100);
+
+ var onUninstallationSuccess = {
+
+ onprogress: function(packageId, percentage)
+ {
+ console.log("On uninstallation(" + packageId + "): progress(" + percentage + ")");
+ $.mobile.showPageLoadingMsg();
+ },
+ oncomplete: function(packageId)
+ {
+ console.log("Uninstallation(" + packageId + ") Complete");
+ alert("The package " + packageId + " is uninstalled");
+ checkInstalledPackage();
+ }
+ }
+
+ var onError = function (err) {
+ $.mobile.hidePageLoadingMsg();
+ if (err.name != "UnknownError") {
+ alert("Error occured on uninstallation : " + err.name);
+ }
+ }
+
+ try {
+ tizen.package.uninstall(val, onUninstallationSuccess, onError);
+ } catch (e) {
+ alert("Exception: " + e.name);
+ }
+}
+
+function recordResultToXML(test_name, result){
+ tests.each(
+ function() {
+ if($(this).attr('id') == test_name){
+ $(this).attr('result', result);
+ }
+ }
+ );
+}
+
+function initTests() {
+ loadTests();
+ window.addEventListener('message', function(e) {
+ console.log(e.data);
+ var jsonData = eval("(" + e.data + ")");
+ if(jsonData.length > 0){
+ if(jsonData[0].testname != "" && jsonData[0].result != ""){
+ recordResultToXML(jsonData[0].testname, jsonData[0].result);
+ updateAppDecoration();
+ exportTmpResult();
+ }
+ }
+ }, false);
+}
+
+function exportTmpResult() {
+ writeFile(RESULT_FILE_NAME, (new XMLSerializer()).serializeToString(resultXML), false);
+}
+
+function writeFile(filename, content, need_exit) {
+ successCallback = function(fs) {
+ fs.write(content);
+ fs.close();
+ if (need_exit)
+ exitTest();
+ };
+
+ onsuccess = function(dir) {
+ dir.deleteFile(dir.fullPath + "/" + filename);
+
+ file = dir.createFile(filename);
+ file.openStream("rw", successCallback, onerror, "UTF-8");
+ };
+
+ onerror = function(error) {
+ alert("Export result fail: " + error);
+ };
+
+ try {
+ tizen.filesystem.resolve('documents', onsuccess, onerror, "rw");
+ } catch (err) {
+ alert("Write file fail: " + err.message);
+ }
+}
+
+function loadTests() {
+ $.ajax({
+ async : false,
+ type : "GET",
+ url : "../../subtestresult.xml",
+ dataType : "xml",
+ success : function(xml){
+ resultXML = xml;
+ $(xml).find("set").each(
+ function(){
+ if($(this).attr("name") == MOUDLE_NAME){
+ tests = $(this).find("testcase");
+ }
+ }
+ );
+ loadTmpResult();
+ }
+ });
+}
+
+function loadTmpResult(){
+ successCallback = function(files) {
+ for(var i = 0; i < files.length; i++){
+ if (files[i].name == RESULT_FILE_NAME) {
+ if (confirm("Continue last test?")) {
+ files[i].readAsText(
+ function(xml){
+ _mergeResult($(xml).find("set"));
+ updateAppDecoration();
+ }, function(err){
+ console.log("read tmp result error: " + err.message);
+ }, "UTF-8"
+ );
+ return;
+ }
+ else break;
+ }
+ }
+ };
+
+ onsuccess = function(dir) {
+ dir.listFiles(successCallback, onerror);
+ };
+
+ onerror = function(error) {
+ console.log(error);
+ updateAppDecoration();
+ };
+
+ try {
+ tizen.filesystem.resolve('documents', onsuccess, onerror, "rw");
+ } catch (err) {
+ console.log("Load tmp result fail: " + err.message);
+ updateAppDecoration();
+ }
+}
+
+function _mergeResult(tmpResult) {
+ tests.each(
+ function(index, item) {
+ tmpResult.each(
+ function(order1, tmpItem1){
+ if($(tmpItem1).attr("name") == MOUDLE_NAME){
+ $(tmpItem1).find("testcase").each(
+ function(order, tmpItem){
+ if ($(item).attr("id") === $(tmpItem).attr("id")) {
+ $(item).attr("result", $(tmpItem).attr("result"));
+ }
+ }
+ );
+ }
+ }
+ );
+ }
+ );
+}
+
+function updateAppDecoration() {
+ $(resultXML).find("set").each(
+ function(){
+ if($(this).attr("name") == MOUDLE_NAME){
+ $(this).find("testcase").each(
+ function() {
+ if($(this).attr("result") == "PASS"){
+ $("#"+$(this).attr("id")).find("h2").css("color","green");
+ }else if($(this).attr("result") == "FAIL"){
+ $("#"+$(this).attr("id")).find("h2").css("color","red");
+ }
+ }
+ );
+ }
+ }
+ );
+ $("#cspList").listview( "refresh" );
+}
+
+window.addEventListener('load', initTests, false);
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.sandbox
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+*/
+
+var installUrl;
+var wgt_name;
+var app_id;
+var package_id;
+var nolaunch_wgt = new Array('setting-encrypt-enable','setting-encrypt-disable');
+
+$(document).ready(function(){
+ updateFooterButton();
+ DisablePassButton();
+
+ wgt_name = $("#wgt_name").val();
+ app_id = $("#app_id").val();
+ package_id = $("#package_id").val();
+
+ $("#install").bind("vclick", function() {
+ install();
+ });
+ $("#launch").bind("vclick", function() {
+ launch(app_id);
+ $('#uninstall').removeClass("ui-disabled");
+ });
+ $("#uninstall").bind("vclick", function() {
+ uninstall(package_id);
+ });
+ if(jQuery.inArray(wgt_name, nolaunch_wgt) != -1){
+ $('#launch').hide();
+ $('#launch_divider').hide();
+ }
+ try {
+ tizen.package.setPackageInfoEventListener(packageEventCallback);
+ } catch (e) {
+ alert("Exception: " + e.message);
+ }
+
+ packagePre(wgt_name);
+ $('#uninstall').addClass("ui-disabled");
+ $('#launch').addClass("ui-disabled");
+
+ if(checkInstalledPkg(package_id)) {
+ $('#install').addClass("ui-disabled");
+ if(jQuery.inArray(wgt_name, nolaunch_wgt) != -1){
+ $('#uninstall').removeClass("ui-disabled");
+ } else {
+ $('#launch').removeClass("ui-disabled");
+ }
+ }
+});
+
+var packageEventCallback = {
+ oninstalled: function(packageInfo) {
+ $.mobile.hidePageLoadingMsg();
+ alert("The package " + packageInfo.name + " is installed");
+ },
+ onupdated: function(packageInfo) {
+ $.mobile.hidePageLoadingMsg();
+ alert("The package " + packageInfo.name + " is updated");
+ },
+ onuninstalled: function(packageId) {
+ $.mobile.hidePageLoadingMsg();
+ alert("The package " + packageId + " is uninstalled");
+ }
+}
+
+function fileURI(wgt_name) {
+ var documentsDir;
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ if(files[i].name == wgt_name+".wgt")
+ {
+ var Url1 = files[i].toURI();
+ installUrl = Url1.replace("file:///", "/");
+ }
+ }
+ }
+
+ function onerror(error) {
+ alert("The error " + error.message + " occurred when listing the files in the selected folder");
+ }
+
+ tizen.filesystem.resolve(
+ 'documents',
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error" + e.message);
+ }, "r"
+ );
+}
+
+function install() {
+ var onInstallationSuccess = {
+ onprogress: function(packageId, percentage)
+ {
+ console.log("On installation(" + packageId + "): progress(" + percentage + ")");
+ $.mobile.showPageLoadingMsg();
+ },
+ oncomplete: function(packageId)
+ {
+ console.log("Installation(" + packageId + ") Complete");
+ $('#install').addClass("ui-disabled");
+ if(jQuery.inArray(wgt_name, nolaunch_wgt) != -1){
+ $('#uninstall').removeClass("ui-disabled");
+ } else {
+ $('#launch').removeClass("ui-disabled");
+ }
+ }
+ }
+
+ var onError = function (err) {
+ alert("Error occured on installation : " + err.message);
+ $.mobile.hidePageLoadingMsg();
+ }
+
+ try {
+ tizen.package.install(installUrl, onInstallationSuccess, onError);
+ } catch(e) {
+ alert("Exception: " + e.name);
+ }
+}
+
+function uninstall(package_id) {
+ var onUninstallationSuccess = {
+
+ onprogress: function(packageId, percentage)
+ {
+ console.log("On uninstallation(" + packageId + "): progress(" + percentage + ")");
+ $.mobile.showPageLoadingMsg();
+ },
+ oncomplete: function(packageId)
+ {
+ console.log("Uninstallation(" + packageId + ") Complete");
+ $('#launch').addClass("ui-disabled");
+ $('#uninstall').addClass("ui-disabled");
+ EnablePassButton();
+ }
+ }
+
+ var onError = function (err) {
+ alert("Error occured on uninstallation : " + err.name);
+ $.mobile.hidePageLoadingMsg();
+ }
+
+ try {
+ tizen.package.uninstall(package_id, onUninstallationSuccess, onError);
+ } catch (e) {
+ alert("Exception: " + e.name);
+ }
+}
+
+function launch(app_id) {
+ function onSuccess() {
+ console.log(id + " launched successfully!");
+ }
+
+ function onError(err) {
+ alert("launch failed : " + err.message);
+ }
+
+ try {
+ tizen.application.launch(app_id, onSuccess, onError);
+ } catch (exc) {
+ alert("launch exc:" + exc.message);
+ }
+}
+
+function packagePre(wgt_name) {
+ var documentsDir;
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ if(files[i].name == wgt_name+".wgt")
+ {
+ documentsDir.copyTo(
+ files[i].fullPath,
+ "documents/"+wgt_name+".wgt",
+ true,
+ function() {
+ console.log(wgt_name+" Precondition Success!");
+ });
+ }
+ }
+ fileURI(wgt_name);
+ }
+
+ function onerror(error) {
+ alert("The error " + error.message + " occurred when listing the files in the selected folder");
+ }
+
+ tizen.filesystem.resolve(
+ 'wgt-package/tests/ConfigurationExtension/res/',
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error" + e.message);
+ }, "r"
+ );
+}
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="application-content">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="application-content-crosswalksite"/>
+ <input type="hidden" id="app_id" value="wrt2apc002.ApplicationContent"/>
+ <input type="hidden" id="package_id" value="wrt2apc002"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Pre-condition: </p>
+ <p>Make sure the device can access to Internet.</p>
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if the widget redirect the start page to "https://www.crosswalk-project.org/".</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="application-content">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="application-content"/>
+ <input type="hidden" id="app_id" value="wrt2apc001.ApplicationContent"/>
+ <input type="hidden" id="package_id" value="wrt2apc001"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Pre-condition: </p>
+ <p>Make sure the device can access to Internet.</p>
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if the widget redirect the start page to "http://www.google.com".</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="setting-bs-disable">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="setting-bs-disable"/>
+ <input type="hidden" id="app_id" value="wrt2sbd024.SettingBsDisable"/>
+ <input type="hidden" id="package_id" value="wrt2sbd024"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if the counter on the page doesn't change when the widget is running background.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="setting-cm-disable">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="setting-cm-disable"/>
+ <input type="hidden" id="app_id" value="wrt2scd026.SettingCmDisable"/>
+ <input type="hidden" id="package_id" value="wrt2scd026"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>No popup menu after release the press.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="setting-cm-enable">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="setting-cm-enable"/>
+ <input type="hidden" id="app_id" value="wrt2sce027.SettingCmEnable"/>
+ <input type="hidden" id="package_id" value="wrt2sce027"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>There is a popup menu after release the press.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="setting-encrypt-disable">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="setting-encrypt-disable"/>
+ <input type="hidden" id="app_id" value="wrt2sed028.SettingEncryptDisable"/>
+ <input type="hidden" id="package_id" value="wrt2sed028"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider" id="launch_divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Pre-condition: </p>
+ <p>Confirm the widget application is not encrypted.</p>
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Use the command: "app_launcher -l" in "app" user to get the app id of setting-encrypt-disable.</li>
+ <li>Use the command: "vi /home/app/.config/xwalk-service/applications/'app-id'/index.html" to show the content of index.html in terminal.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if the content of "index.html" is a normal text.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="setting-encrypt-enable">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="setting-encrypt-enable"/>
+ <input type="hidden" id="app_id" value="wrt2see029.SettingEncryptEnable"/>
+ <input type="hidden" id="package_id" value="wrt2see029"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider" id="launch_divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Pre-condition: </p>
+ <p>Confirm the widget application is encrypted.</p>
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Use the command: "app_launcher -l" in "app" user to get the app id of setting-encrypt-enable.</li>
+ <li>Use the command: "vi /home/app/.config/xwalk-service/applications/'app-id'/index.html" to show the content of index.html in terminal.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if the content of "index.html" is messy code.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="setting-hwkey-default">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="setting-hwkey-default"/>
+ <input type="hidden" id="app_id" value="wrt2shd044.settinghwkeydefault"/>
+ <input type="hidden" id="package_id" value="wrt2shd044"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if the "Fail" is changed by "Pass --- menu event is invoked" or "Pass --- back event is invoked".</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="setting-hwkey-disable">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="setting-hwkey-disable"/>
+ <input type="hidden" id="app_id" value="wrt2skd041.settinghwkeydisable"/>
+ <input type="hidden" id="package_id" value="wrt2skd041"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if there are two "Pass" displayed and no change on the screen when click the menu or back key.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="setting-hwkey-enable">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="setting-hwkey-enable"/>
+ <input type="hidden" id="app_id" value="wrt2ske042.settinghwkeyenable"/>
+ <input type="hidden" id="package_id" value="wrt2ske042"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if the "Fail" is changed by "Pass --- menu event is invoked" or "Pass --- back event is invoked".</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+Copyright (c) 2012 Intel Corporation.
+Except as noted, this software is licensed under Apache License, Version 2 or BSD-3-Clause License.
+Please, see the LICENSE.Apache-2.0 file for Apache License, Version 2 terms and conditions
+or the LICENSE.BSD-3 file for BSD-3-Clause License.
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Samsung Electronics 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.
+
+Authors:
+ Choi, Jongheon <j-h.choi@samsung.com>
+
+-->
+<html>
+<head>
+<meta charset="utf-8" />
+<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+<link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+<script src="../../js/thirdparty/jquery.js"></script>
+<script src="../../js/thirdparty/jquery.mobile.js"></script>
+<script src="../../js/tests.js"></script>
+<script src="js/main.js"></script>
+</head>
+<body>
+ <div data-role="header" data-position="fixed" data-tap-toggle="false">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div id="content">
+ <ul data-role="listview">
+ <li data-role="list-divider">OMA DS(Data Synchronization) Server</li>
+ <li>
+ <input type="url" id="url" value="" />
+ </li>
+ <li data-role="list-divider">OMA DS Server ID</li>
+ <li>
+ <input type="text" id="account" value="" />
+ </li>
+ <li data-role="list-divider">OMA DS Server Password</li>
+ <li>
+ <input type="password" id="passwd" value="" />
+ </li>
+ <li data-role="list-divider">OMA DS Server Database URI</li>
+ <li>
+ <input type="text" id="database" value="" />
+ </li>
+ <li data-role="list-divider">OMA DS Server Connect</li>
+ <li>
+ <div data-role="button" onclick="addProfile();">Add Profile</div>
+ </li>
+ <li data-role="list-divider">Contacts Sync</li>
+ <li>
+ <div data-role="button" onclick="startSync();">Start Sync</div>
+ </li>
+ <li data-role="list-divider">Contacts List</li>
+ </ul>
+ <ul data-role="listview" id="contactsList"></ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font style="font-size:85%">
+ <p>Check if data is successfully synchronized with an OMA DS server</p><br>
+ <p>Precondition: Pick one in <Sample OMA DS Server List> and add test contacts</p>
+ <p><Sample OMA DS Server List></p>
+ <p>- http://my.funambol.com/sync</p>
+ <p>- https://www.everdroid.com/web</p>
+ <p>- OMA DS 1.2 protocol Server</p><br>
+ <p>1. Fill in preset OMA DS Server, ID, Password and Database URI containing data to sync.<br>
+For the Database URI field "OMA DS Server Database URI",<br>
+- if you choose funambol OMA DS Server for this test, a tester needs to fill "card" string to the URI field.<br>
+- if you choose everdroid OMA DS Server for this test, a tester needs to fill "con" string to the URI field.<br>
+- if you are using other OMA DS Servers, then you need to go to the web page of the OMA DS Server which you use for the test.</p>
+ <p>2. Click Add Profile</p>
+ <p>3. Click Start Sync</p>
+ <p>4. Check the contacts are synchronized with the OMA DS server</p>
+ </font>
+ </div>
+</body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Samsung Electronics 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.
+
+Authors:
+ Choi, Jongheon <j-h.choi@samsung.com>
+
+*/
+
+var profileId = null;
+var account, passwd, url, database;
+
+var init = function () {
+ serverGuide();
+};
+
+function serverGuide() {
+ //alert("<Sample OMA DS Server List>\n1. http://my.funambol.com/sync \n2. https://www.everdroid.com/web \n3. OMA DS 1.2 protocol Server\n*Recommend the 1st server");
+}
+
+function addProfile() {
+ try {
+ account = $("#account").val();
+ passwd = $("#passwd").val();
+ url = $("#url").val();
+ database = $("#database").val();
+
+ // Create a sync info.
+ var syncInfo = new tizen.SyncInfo(url, account, passwd, "MANUAL", "REFRESH_FROM_SERVER");
+
+ // Sync both contacts and events.
+ var contactInfo = new tizen.SyncServiceInfo(true, "CONTACT", database);
+ var serviceInfo = [contactInfo];
+
+ // Adds a profile to sync.
+ var profile = new tizen.SyncProfileInfo("MyProfile", syncInfo, serviceInfo);
+ tizen.datasync.add(profile);
+
+ profileId = profile.profileId;
+ alert("Add Profile ID : " + profileId);
+ } catch(err) {
+ alert(err.message);
+ }
+}
+
+function startSync() {
+ var total;
+ var syncProgressCallback = {
+ onprogress: function (profileId, serviceType, isFromServer, totalPerType, syncedPerType) {
+ console.log('Total: ' + totalPerType + ', synced: ' + syncedPerType + ', for the sync type: ' + serviceType);
+ total = totalPerType;
+ },
+ onstopped: function (profileId) {
+ removeProfile();
+ },
+ onfailed: function (profileId, error) {
+ alert('Please try again in a few minutes.');
+ console.log('Failed with id: ' + profileId + ', error name: ' + error.name);
+ },
+ oncompleted: function (profileId) {
+ console.log("Completed with id" + profileId);
+ alert("Sync Completed - " + total + " Contacts");
+ contactList();
+ }
+ };
+
+ try {
+ tizen.datasync.startSync(profileId, syncProgressCallback);
+ alert("Contact sync start\n(OMA DS Server - Device)");
+ } catch(err) {
+ alert(err.message);
+ }
+}
+
+function removeProfile() {
+ try {
+ tizen.datasync.remove(profileId);
+ console.log("Removed ProfileId.");
+ } catch(err) {
+ alert(err.message);
+ }
+}
+
+function stopSync() {
+ try {
+ tizen.datasync.stopSync(profileId);
+ console.log("Stopped.");
+ } catch(err) {
+ alert(err.message);
+ }
+}
+
+/*function getLastSyncStatistics() {
+ try {
+ // Gets the sync statistics information with the given id.
+ var statistics = tizen.datasync.getLastSyncStatistics(profileId);
+ alert("Num statistics: " + statistics.length);
+ for(i in statistics) {
+ alert("syncStatus: " + statistics[i].syncStatus + ", serviceType: " + statistics[i].serviceType + ", lastSyncTime: " + statistics[i].lastSyncTime);
+ alert("serverToClientTotal: " + statistics[i].serverToClientTotal + ", serverToClientAdded: " + statistics[i].serverToClientAdded + ", serverToClientUpdated: " + statistics[i].serverToClientUpdated + ", serverToClientRemoved: " + statistics[i].serverToClientRemoved);
+ alert("clientToServerTotal: " + statistics[i].clientToServerTotal + ", clientToServerAdded: " + statistics[i].clientToServerAdded + ", clientToServerUpdated: " + statistics[i].clientToServerUpdated + ", clientToServerRemoved: " + statistics[i].clientToServerRemoved);
+ }
+ } catch(err) {
+ console.log(err.message);
+ }
+}*/
+
+function contactList() {
+ function successCallback(contacts) {
+ var str = "";
+
+ if(contacts.length > 0)
+ {
+ for (var i = 0; i < contacts.length; i++)
+ {
+ str += '<li>' + contacts[i].name.displayName + ' (' + contacts[i].phoneNumbers[0].number + ')</li>';
+ }
+ $("#contactsList").html(str).trigger("create").listview("refresh");
+ }
+ else
+ {
+ alert("Not found Contacts");
+ }
+ removeProfile();
+ }
+
+ function errorCallback(err) {
+ alert("An error occurred: " + err.message);
+ }
+
+ var filter = new tizen.AttributeFilter("lastUpdated", "EXISTS", null);
+
+ try {
+ tizen.contact.getDefaultAddressBook().find(successCallback, errorCallback, filter);
+ } catch(err) {
+ alert('The following error occurred while finding: ' + err.name);
+ }
+}
+$(document).bind('pageinit', init);
\ No newline at end of file
--- /dev/null
+Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+Copyright (c) 2012 Intel Corporation.
+Except as noted, this software is licensed under Apache License, Version 2 or BSD-3-Clause License.
+Please, see the LICENSE.Apache-2.0 file for Apache License, Version 2 terms and conditions
+or the LICENSE.BSD-3 file for BSD-3-Clause License.
--- /dev/null
+/* progress bar container */
+#progressbar {
+ border: 1px solid black;
+ width: 328px;
+ height: 18px;
+ position: relative;
+ text-align: center;
+ color: white;
+ -webkit-border-radius: 8px;
+}
+/* color bar */
+#progressbar div.progress {
+ position: absolute;
+ width: 0;
+ height: 100%;
+ overflow: hidden;
+ background-color: #369;
+ -webkit-border-radius: 8px;
+}
+/* text off bar */
+#progressbar div.text {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ text-align: center;
+ -webkit-border-radius: 8px;
+}
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Samsung Electronics 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.
+
+Authors:
+ Choi, Jongheon <j-h.choi@samsung.com>
+
+-->
+<html>
+<head>
+<meta charset="utf-8" />
+<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+<link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+<link rel="stylesheet" type="text/css" href="css/style.css" />
+<script src="../../js/thirdparty/jquery.js"></script>
+<script src="../../js/thirdparty/jquery.mobile.js"></script>
+<script src="js/jqueryprogressbar.js" type="text/javascript"></script>
+<script src="../../js/tests.js"></script>
+<script src="js/main.js"></script>
+</head>
+<body>
+ <div data-role="page" id="main">
+ <div data-role="header" data-position="fixed" data-tap-toggle="false">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div id="content">
+ <ul data-role="listview" id="list">
+ <li data-role="list-divider">Download URL</li>
+ <li>
+ <input type="url" id="url" value="http://download.tizen.org/tct/tct-download-tizen-tests-image-hq.png" />
+ </li>
+ <li data-role="list-divider">Progress Bar</li>
+ <li>
+ <div data-role="none" id="progressbar"></div>
+ </li>
+ <li data-role="list-divider">Download</li>
+ <li>
+ <div data-role="button" id="download">Download</div>
+ <div data-role="button" id="pause">Pause</div>
+ <div data-role="button" id="resume">Resume</div>
+ <div data-role="button" id="cancel">Cancel</div>
+ </li>
+ <li data-role="list-divider">Download folder</li>
+ </ul>
+ <ul data-role="listview">
+ <li data-role="list-divider">Download list delete</li>
+ <li>
+ <div data-role="button" id="delete">Delete all</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font style="font-size:85%">
+ <p>Check if the file is successfully downloaded</p><br>
+ <p>1. Fill in Download URL field (or use the default)</p>
+ <p>2. Click Download button and check the Progress Bar updated</p>
+ <p>3. Click Cancel, Pause, Download buttons to verify the functionalities</p>
+ <p>4. Check a download directory if the file successfully downloaded</p>
+ </font>
+ </div>
+ </div>
+</body>
+</html>
--- /dev/null
+/*
+ * Copyright (c) 2007 Josh Bush (digitalbush.com)
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * Progress Bar Plugin for jQuery
+ * Version: Alpha 2
+ * Release: 2007-02-26
+ */
+
+(function($) {
+ //Main Method
+ $.fn.reportprogress = function(val,maxVal) {
+ var max=100;
+ if(maxVal)
+ max=maxVal;
+ return this.each(
+ function(){
+ var div=$(this);
+ var innerdiv=div.find(".progress");
+
+ if(innerdiv.length!=1){
+ innerdiv=$("<div class='progress'></div>");
+ div.append("<div class='text'> </div>");
+ $("<span class='text'> </span>").css("width",div.width()).appendTo(innerdiv);
+ div.append(innerdiv);
+ }
+ var width=Math.round(val/max*100);
+ innerdiv.css("width",width+"%");
+ div.find(".text").html(width+" %");
+ }
+ );
+ };
+})(jQuery);
--- /dev/null
+/*
+Copyright (c) 2013 Samsung Electronics 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.
+
+Authors:
+ Choi, Jongheon <j-h.choi@samsung.com>
+
+*/
+
+var gDownloadId, gDocumentsDir, gFiles;
+
+$(document).delegate("#main", "pageinit", function() {
+ $("#list").delegate("div", "vclick", function() {
+ deleteFileFromFolder($(this).parent().data("id"));
+ return false;
+ });
+
+ $("#download").bind("vclick", function() {
+ if (gDownloadId != undefined) {
+ var state = tizen.download.getState(gDownloadId);
+
+ if (state == "DOWNLOADING") {
+ alert("Already downloading");
+ } else {
+ alert("Another download in progress");
+ }
+ } else {
+ download();
+ }
+ return false;
+ });
+
+ $("#resume").bind("vclick", function() {
+ if (gDownloadId != undefined) {
+ var state = tizen.download.getState(gDownloadId);
+
+ if (state == "PAUSED") {
+ try {
+ tizen.download.resume(gDownloadId);
+ alert("Resumed");
+ } catch (exc) {
+ alert("download.resume failed: " + exc.message);
+ }
+ } else {
+ alert("Another download in progress");
+ }
+ } else {
+ alert("No download in progress");
+ }
+ return false;
+ });
+
+ $("#pause").bind("vclick", function() {
+ if (gDownloadId == undefined) {
+ alert("No download in progress");
+ return false;
+ }
+
+ var state = tizen.download.getState(gDownloadId);
+
+ if (state == "PAUSED") {
+ alert("Already paused");
+ } else {
+ try {
+ tizen.download.pause(gDownloadId);
+ alert("Paused");
+ } catch (exc) {
+ alert("download.pause failed: " + exc.message);
+ }
+ }
+ return false;
+ });
+
+ $("#cancel").bind("vclick", function() {
+ if (gDownloadId == undefined) {
+ alert("No download in progress");
+ return false;
+ }
+
+ try {
+ tizen.download.cancel(gDownloadId);
+ } catch (exc) {
+ alert("download.cancel failed: " + exc.message);
+ }
+ return false;
+ });
+
+ $("#delete").bind("vclick", function() {
+ deleteAllFile();
+ return false;
+ });
+ prepareDirsAndFiles();
+});
+
+function onError(err) {
+ alert("Error: " + err.message);
+}
+
+function prepareDirsAndFiles() {
+ try {
+ tizen.filesystem.resolve("downloads", function(dir) {
+ gDocumentsDir = dir;
+ showFileList();
+ }, onError, "rw");
+ } catch (exc) {
+ alert("tizen.filesystem.resolve(\"downloads\") exc: " + exc.message);
+ }
+}
+
+function makeFileList(files) {
+ var str = "";
+
+ gFiles = files;
+ $("#list>li[data-id]").remove();
+
+ for (var i = 0; i < files.length; i++) {
+ if (files[i].isDirectory == false) {
+ str += '<li class="ui-li-text-ellipsis" data-id="'
+ + i
+ + '">'
+ + files[i].name
+ + '<div data-role="button" data-inline="true">Delete</div></li>';
+ }
+ }
+ $("#list").append(str).trigger("create").listview("refresh");
+}
+
+function showFileList() {
+ if(gDocumentsDir) {
+ gDocumentsDir.listFiles(function(files) {
+ makeFileList(files);
+ }, onError);
+ }
+}
+
+function deleteFileFromFolder(id) {
+ if (id == null) {
+ return;
+ }
+
+ try {
+ gDocumentsDir.deleteFile(gFiles[Number(id)].fullPath, showFileList, onError);
+ alert("Download delete");
+ } catch (exc) {
+ alert("deleteFile exc: " + exc.message);
+ }
+}
+
+function deleteAllFile() {
+ alert("Download delete all");
+ if(gFiles.length > 0)
+ for(var i = 0; i < gFiles.length; i++)
+ if(gFiles[i].isFile == true)
+ gDocumentsDir.deleteFile(gFiles[i].fullPath, showFileList, onError);
+}
+
+function download() {
+ var url = $("#url").val();
+
+ if (url == "") {
+ alert("Input target URL");
+ return;
+ }
+
+ var downloadRequest = new tizen.DownloadRequest(url, "downloads"),
+ listener = {
+ onprogress: function(id, receivedSize, totalSize) {
+ //$("#progressbar").progressbar("option", "value", receivedSize/totalSize*100);
+ if(receivedSize > 0)
+ $("#progressbar").reportprogress(receivedSize/totalSize*100);
+ console.log('Received with id: ' + id + ', ' + receivedSize + '/' + totalSize);
+ },
+ onpaused: function(id) {
+ console.log('Paused with id: ' + id);
+ //showFileList();
+ },
+ oncanceled: function(id) {
+ alert("Canceled");
+ //showFileList();
+ console.log(id);
+ gDownloadId = undefined;
+ $("#progressbar").reportprogress(0);
+ },
+ oncompleted: function(id, fullPath) {
+ alert("Completed! Full path: " + fullPath);
+ showFileList();
+ gDownloadId = undefined;
+ },
+ onfailed: function(id, error) {
+ alert("Failed! Err: " + error.name);
+ //showFileList();
+ gDownloadId = undefined;
+ $("#progressbar").reportprogress(0);
+ }
+ };
+
+ //$("#progressbar").progressbar("option", "value", 0);
+ $("#progressbar").reportprogress(0);
+
+ try {
+ gDownloadId = tizen.download.start(downloadRequest, listener);
+ alert("Download");
+ } catch (exc) {
+ alert("download.start failed : " + exc.message);
+ }
+}
+
+var pct=0;
+var handle=0;
+function update(){
+ $("#progressbar").reportprogress(++pct);
+ if(pct==100){
+ clearInterval(handle);
+ $("#run").val("start");
+ pct=0;
+ }
+}
+jQuery(function($){
+ $("#run").click(function(){
+ if(this.value=="start"){
+ handle=setInterval("update()",100);
+ this.value="stop";
+ }else{
+ clearInterval(handle);
+ this.value="start";
+ }
+ });
+ $("#reset").click(function(){
+ pct=0;
+ $("#progressbar").reportprogress(0);
+ });
+});
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Tan, Shiyou <shiyoux.tan@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../css/main.css" />
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/tests.js"></script>
+ <script src="js/main.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="main">
+ <div data-role="header" data-position="fixed" data-tap-toggle="false">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div id="content">
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch1" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Purpose: </p>
+ <p>Verifies the device supports drag and drop functions.</p>
+ <p>Pre-condition: </p>
+ <p>Ensure the drag and drop test widget is installed successfully.</p>
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if the blue rectangle could be drag and drop to the white box.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Tan, Shiyou <shiyoux.tan@intel.com>
+*/
+
+var installUrl;
+$(document).delegate("#main", "pageinit", function() {
+ DisablePassButton();
+
+ $("#install").bind("vclick", function() {
+ install(installUrl, "install");
+ });
+ $("#launch1").bind("vclick", function() {
+ launch();
+ $("#uninstall").removeClass("ui-disabled");
+ });
+ $("#uninstall").bind("vclick", function() {
+ uninstall();
+ });
+ try {
+ tizen.package.setPackageInfoEventListener(packageEventCallback);
+ } catch (e) {
+ alert("Exception: " + e.message);
+ }
+
+ packagePre();
+ $("#launch1").addClass("ui-disabled");
+ $("#uninstall").addClass("ui-disabled");
+
+ if(checkInstalledPkg("bhdragdrop")) {
+ $("#install").addClass("ui-disabled");
+ $("#launch1").removeClass("ui-disabled");
+ }
+});
+
+var packageEventCallback = {
+ oninstalled: function(packageInfo) {
+ hideProcess();
+ alert("The application " + packageInfo.name + " is installed");
+ },
+ onuninstalled: function(packageId) {
+ hideProcess();
+ alert("The application DragandDrop is uninstalled");
+ }
+};
+
+function fileURI() {
+ var documentsDir;
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ if(files[i].name == "DragandDrop.wgt")
+ {
+ var Url1 = files[i].toURI();
+ installUrl = Url1.replace("file:///", "/");
+ }
+ }
+ }
+
+ function onerror(error) {
+ alert("The error " + error.message + " occurred when listing the files in the selected folder");
+ }
+
+ tizen.filesystem.resolve(
+ 'documents',
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error" + e.message);
+ }, "r"
+ );
+}
+
+function install(url, type) {
+ var onInstallationSuccess = {
+ onprogress: function(packageId, percentage)
+ {
+ console.log("On installation(" + packageId + "): progress(" + percentage + ")");
+ showProcess();
+ },
+ oncomplete: function(packageId)
+ {
+ console.log("Installation(" + packageId + ") Complete");
+ if(checkInstalledPkg("bhdragdrop")) {
+ $("#install").addClass("ui-disabled");
+ $("#launch1").removeClass("ui-disabled");
+ }
+ }
+ }
+
+ var onError = function (err) {
+ alert("Error occured on installation : " + err.message);
+ $.mobile.hidePageLoadingMsg();
+ }
+
+ try {
+ tizen.package.install(url, onInstallationSuccess, onError);
+ } catch(e) {
+ alert("Exception: " + e.name);
+ }
+}
+
+function uninstall() {
+
+ var onUninstallationSuccess = {
+
+ onprogress: function(packageId, percentage)
+ {
+ showProcess();
+ console.log("On uninstallation(" + packageId + "): progress(" + percentage + ")");
+ },
+ oncomplete: function(packageId)
+ {
+ console.log("Uninstallation(" + packageId + ") Complete");
+ $("#launch1").addClass("ui-disabled");
+ $("#uninstall").addClass("ui-disabled");
+ EnablePassButton();
+ }
+ }
+
+ var onError = function (err) {
+ alert("Error occured on uninstallation : " + err.name);
+ $.mobile.hidePageLoadingMsg();
+ }
+
+ try {
+ tizen.package.uninstall("bhdragdrop", onUninstallationSuccess, onError);
+ } catch (e) {
+ alert("Exception: " + e.name);
+ }
+}
+
+function launch() {
+ function onSuccess() {
+ console.log(id + " launched successfully!");
+ }
+
+ function onError(err) {
+ alert("launch failed : DragandDrop application is already uninstalled or not installed");
+ }
+ try {
+ tizen.application.launch("bhdragdrop.DragandDrop", onSuccess, onError);
+ } catch (exc) {
+ alert("launch exc:" + exc.message);
+ }
+}
+
+function packagePre() {
+ var documentsDir;
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ if(files[i].name == "DragandDrop")
+ {
+ documentsDir.copyTo(
+ files[i].fullPath,
+ "documents/DragandDrop.wgt",
+ true,
+ function() {
+ console.log("DragandDrop Precondition Success(2)!");
+ });
+ }
+ }
+ fileURI();
+ }
+
+ function onerror(error) {
+ alert("The error " + error.message + " occurred when listing the files in the selected folder");
+ }
+
+ tizen.filesystem.resolve(
+ 'wgt-package/tests/DragandDrop/res/',
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error" + e.message);
+ }, "r"
+ );
+}
+
+function hideProcess() {
+ $.mobile.hidePageLoadingMsg();
+ $("#popup_info-screen").addClass("ui-screen-hidden");
+ $("#popup_info-screen").removeClass("in");
+}
+
+function showProcess() {
+ $.mobile.showPageLoadingMsg();
+ $("#popup_info-screen").removeClass("ui-screen-hidden");
+ $("#popup_info-screen").addClass("in");
+}
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Hao, Yunfei <yunfeix.hao@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../css/main.css" />
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/tests.js"></script>
+ <script src="js/main.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="main">
+ <div data-role="header" data-position="fixed" data-tap-toggle="false">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div id="content">
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Purpose: </p>
+ <p>Verifies the functionality of DynamicBox application: mouse event and visibility event for DynamicBox.</p>
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button, test step passes if all app widgets installed successfully.</li>
+ <li>Click the "Launch" button to launch the DynamicBox Viewer. After each step below, press "Back" key (soft or hard key) to go forward next step:</li>
+ <ol>
+ <li>Click the "Mouse event false"; press the filled blue square; test step passes if the blue square doesn't change;</li>
+ <li>Click the "Sample"; test step passes if there is a green 'Pass' text;</li>
+ <li>Click the "Dynamic Box"; press the menu button to select size 354x354; then drag down the box; test step passes if there apears a button "Send message to Box", and click the button, "Hello, Dynamic Box" appends into the box;</li>
+ <li>Click the "AppWidget Content mouse event"; press the filled blue square; test step passes if the blue square changes to green;</li>
+ <li>Click the "AppWidget Load event"; test step passes if there is a green 'Pass' text;</li>
+ <li>Click the "Visibility widget"; test step passes if there is a green 'Pass' text, and after drag down the 'Pass' there appears 'PD index.html';</li>
+ <li>Click the "Size Decoration"; press the menu button to select box size; test step passes if the box in '354x354' size has different frame decoration from those in '175x175' and '345x175' sizes;</li>
+ <li>Click the "Size Preview"; press the menu button; test step passes if there are icons in the size list.</li>
+ </ol>
+ <li>Click the "Uninstall" button, test step passes if all app widgets uninstalled successfully.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if all the test steps pass.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.sandbox
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Hao, Yunfei <yunfeix.hao@intel.com>
+
+*/
+var installUrl;
+var install_number = 0;
+var uninstall_number = 0;
+var launch_tpk = "";
+var wgt_names = new Array('app-widget-mouse-event-false.wgt',
+ 'app-widget-sample.wgt',
+ 'app-widget-box-appwidgetready-event.wgt',
+ 'app-widget-mouse-event-true.wgt',
+ 'app-widget-load-event.wgt',
+ 'app-widget-visibility-event.wgt',
+ 'app-widget-box-size-decoration.wgt',
+ 'app-widget-box-size-preview.wgt');
+
+var package_ids = new Array('wrt6awi014',
+ 'wrt6app001',
+ 'wrt6awb006',
+ 'wrt6awi013',
+ 'wrt6aws016',
+ 'wrt6aws018',
+ 'wrt6awb003',
+ 'wrt6awb005');
+
+var id_maps = {'rMLtTXzQr2-2.0.0-arm.tpk': 'rMLtTXzQr2',
+ 'SD2nFxbyeA-2.0.0-i386.tpk': 'SD2nFxbyeA',
+ 'app-widget-mouse-event-false.wgt': 'wrt6awi014',
+ 'app-widget-sample.wgt': 'wrt6app001',
+ 'app-widget-box-appwidgetready-event.wgt': 'wrt6awb006',
+ 'app-widget-mouse-event-true.wgt': 'wrt6awi013',
+ 'app-widget-load-event.wgt': 'wrt6aws016',
+ 'app-widget-visibility-event.wgt': 'wrt6aws018',
+ 'app-widget-box-size-decoration.wgt': 'wrt6awb003',
+ 'app-widget-box-size-preview.wgt': 'wrt6awb005'};
+
+$(document).delegate("#main", "pageinit", function() {
+ DisablePassButton();
+
+ $("#install").bind("vclick", function() {
+ install();
+ });
+ $("#launch").bind("vclick", function() {
+ launch(launch_tpk);
+ $("#uninstall").removeClass("ui-disabled");
+ });
+ $("#uninstall").bind("vclick", function() {
+ uninstall(package_ids[uninstall_number]);
+ });
+ try {
+ tizen.package.setPackageInfoEventListener(packageEventCallback);
+ } catch (e) {
+ alert("Exception: " + e.message);
+ }
+ gettpkInfoByPlatForm();
+ packagePre(wgt_names[install_number]);
+
+ $("#launch").addClass("ui-disabled");
+ $("#uninstall").addClass("ui-disabled");
+});
+
+var packageEventCallback = {
+ oninstalled: function(packageInfo) {
+ $.mobile.loading('hide');
+ alert("The package " + packageInfo.name + " is installed");
+ },
+ onupdated: function(packageInfo) {
+ $.mobile.loading('hide');
+ alert("The package " + packageInfo.name + " is updated");
+ },
+ onuninstalled: function(packageId) {
+ $.mobile.loading('hide');
+ alert("The package " + packageId + " is uninstalled");
+ }
+};
+
+function gettpkInfoByPlatForm(){
+ var deviceCapabilities = tizen.systeminfo.getCapabilities();
+ if(deviceCapabilities.platformCoreCpuArch=="armv7"){
+ wgt_names.unshift("rMLtTXzQr2-2.0.0-arm.tpk");
+ package_ids.unshift("rMLtTXzQr2");
+ launch_tpk = "rMLtTXzQr2.DBV";
+ }else if(deviceCapabilities.platformCoreCpuArch=="x86"){
+ wgt_names.unshift("SD2nFxbyeA-2.0.0-i386.tpk");
+ package_ids.unshift("SD2nFxbyeA");
+ launch_tpk = "SD2nFxbyeA.DBV";
+ }
+}
+
+function fileURI(wgt_name) {
+ var documentsDir;
+
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ if(files[i].name == wgt_name)
+ {
+ var Url = files[i].toURI();
+ installUrl = Url.replace("file:///", "/");
+ if(install_number != 0){
+ install();
+ }
+ }
+ }
+ }
+
+ function onerror(error) {
+ alert("The error " + error.message + " occurred when listing the files in the selected folder");
+ }
+
+ tizen.filesystem.resolve(
+ 'documents',
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error" + e.message);
+ }, "r"
+ );
+}
+
+function checkWgtName(filePath) {
+ var name = "";
+ wgt_names.forEach(function (wgt_name) {
+ if (filePath.indexOf(wgt_name) != -1) {
+ name = wgt_name;
+ }
+ });
+
+ return name;
+}
+
+function install() {
+ var totalBar = Math.floor(install_number / wgt_names.length * 100);
+ var onInstallationSuccess = {
+ onprogress: function(packageId, percentage)
+ {
+ console.log("On installation(" + packageId + "): progress(" + percentage + ")");
+ $.mobile.loading('show', {
+ text: 'Installing...' + totalBar + '%',
+ textVisible: true,
+ theme: 'a',
+ textonly: false,
+ html: ""
+ });
+ },
+ oncomplete: function(packageId)
+ {
+ console.log("Installation(" + packageId + ") Complete");
+ install_number++;
+ if(install_number < wgt_names.length){
+ setTimeout(function() {
+ packagePre(wgt_names[install_number]);
+ }, 500);
+ }else{
+ install_number = 0;
+ $.mobile.loading('hide');
+ alert("All widgets is installed!");
+ $("#launch").removeClass("ui-disabled");
+ }
+ }
+ }
+
+ var onError = function (err) {
+ $.mobile.loading('hide');
+ if (err.name != "UnknownError") {
+ alert("Error occured on installation : " + err.name);
+ }
+ if (install_number < package_ids.length) {
+ $("#install").removeClass("ui-disabled");
+ }
+ }
+
+ $("#install").addClass("ui-disabled");
+ try {
+ var wgt_name = checkWgtName(installUrl);
+ if (wgt_name && checkInstalledPkg(id_maps[wgt_name])) {
+ install_number++;
+ if(install_number < wgt_names.length){
+ packagePre(wgt_names[install_number]);
+ } else {
+ install_number = 0;
+ $.mobile.loading('hide');
+ alert("All widgets is installed!");
+ $("#install").addClass("ui-disabled");
+ $("#launch").removeClass("ui-disabled");
+ }
+ } else {
+ tizen.package.install(installUrl, onInstallationSuccess, onError);
+ }
+ } catch (e) {
+ alert("Exception: " + e.name);
+ }
+}
+
+function uninstall(package_id) {
+ var totalBar = Math.floor(uninstall_number / package_ids.length * 100);
+ var onUninstallationSuccess = {
+
+ onprogress: function(packageId, percentage)
+ {
+ console.log("On uninstallation(" + packageId + "): progress(" + percentage + ")");
+ $.mobile.loading('show', {
+ text: 'Uninstalling...' + totalBar + '%',
+ textVisible: true,
+ theme: 'a',
+ textonly: false,
+ html: ""
+ });
+ },
+ oncomplete: function(packageId)
+ {
+ console.log("Uninstallation(" + packageId + ") Complete");
+ uninstall_number++;
+ if(uninstall_number < package_ids.length){
+ setTimeout(function() {
+ uninstall(package_ids[uninstall_number]);
+ }, 1000);
+ }else{
+ uninstall_number = 0;
+ $.mobile.loading('hide');
+ alert("All widgets is uninstalled!");
+ EnablePassButton();
+ }
+ }
+ }
+
+ var onError = function (err) {
+ $.mobile.loading('hide');
+ if (err.name != "UnknownError") {
+ alert("Error occured on uninstallation : " + err.name);
+ }
+ if (uninstall_number < package_ids.length) {
+ $("#uninstall").removeClass("ui-disabled");
+ }
+ }
+
+ $("#launch").addClass("ui-disabled");
+ $("#uninstall").addClass("ui-disabled");
+ try {
+ tizen.package.uninstall(package_id, onUninstallationSuccess, onError);
+ } catch (e) {
+ alert("Exception: " + e.name);
+ }
+}
+
+function launch(launch_tpk) {
+ function onSuccess() {
+ console.log(id + " launched successfully!");
+ }
+
+ function onError(err) {
+ $.mobile.loading('hide');
+ alert("launch failed : " + err.message);
+ }
+ try {
+ tizen.application.launch(launch_tpk, onSuccess, onError);
+ } catch (exc) {
+ alert("launch exc:" + exc.message);
+ }
+}
+
+function packagePre(wgt_name) {
+ var documentsDir;
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ if(files[i].name == wgt_name)
+ {
+ documentsDir.copyTo(
+ files[i].fullPath,
+ "documents/" + wgt_name,
+ true,
+ function() {
+ console.log(wgt_name + " Precondition Success(1)!");
+ });
+ }
+ }
+ fileURI(wgt_name);
+ }
+
+ function onerror(error) {
+ alert("The error " + error.message + " occurred when listing the files in the selected folder");
+ }
+
+ tizen.filesystem.resolve(
+ 'wgt-package/tests/DynamicBox/res/',
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error" + e.message);
+ }, "r"
+ );
+}
--- /dev/null
+Flora License
+
+Version 1.1, April, 2013
+
+http://floralicense.org/license/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+"License" shall mean the terms and conditions for use, reproduction,
+and distribution as defined by Sections 1 through 9 of this document.
+
+"Licensor" shall mean the copyright owner or entity authorized by
+the copyright owner that is granting the License.
+
+"Legal Entity" shall mean the union of the acting entity and
+all other entities that control, are controlled by, or are
+under common control with that entity. For the purposes of
+this definition, "control" means (i) the power, direct or indirect,
+to cause the direction or management of such entity,
+whether by contract or otherwise, or (ii) ownership of fifty percent (50%)
+or more of the outstanding shares, or (iii) beneficial ownership of
+such entity.
+
+"You" (or "Your") shall mean an individual or Legal Entity
+exercising permissions granted by this License.
+
+"Source" form shall mean the preferred form for making modifications,
+including but not limited to software source code, documentation source,
+and configuration files.
+
+"Object" form shall mean any form resulting from mechanical
+transformation or translation of a Source form, including but
+not limited to compiled object code, generated documentation,
+and conversions to other media types.
+
+"Work" shall mean the work of authorship, whether in Source or Object form,
+made available under the License, as indicated by a copyright notice
+that is included in or attached to the work (an example is provided
+in the Appendix below).
+
+"Derivative Works" shall mean any work, whether in Source or Object form,
+that is based on (or derived from) the Work and for which the editorial
+revisions, annotations, elaborations, or other modifications represent,
+as a whole, an original work of authorship. For the purposes of this License,
+Derivative Works shall not include works that remain separable from,
+or merely link (or bind by name) to the interfaces of, the Work and
+Derivative Works thereof.
+
+"Contribution" shall mean any work of authorship, including the original
+version of the Work and any modifications or additions to that Work or
+Derivative Works thereof, that is intentionally submitted to Licensor
+for inclusion in the Work by the copyright owner or by an individual or
+Legal Entity authorized to submit on behalf of the copyright owner.
+For the purposes of this definition, "submitted" means any form of
+electronic, verbal, or written communication sent to the Licensor or
+its representatives, including but not limited to communication on
+electronic mailing lists, source code control systems, and issue
+tracking systems that are managed by, or on behalf of, the Licensor
+for the purpose of discussing and improving the Work, but excluding
+communication that is conspicuously marked or otherwise designated
+in writing by the copyright owner as "Not a Contribution."
+
+"Contributor" shall mean Licensor and any individual or Legal Entity
+on behalf of whom a Contribution has been received by Licensor and
+subsequently incorporated within the Work.
+
+"Tizen Certified Platform" shall mean a software platform that complies
+with the standards set forth in the Tizen Compliance Specification
+and passes the Tizen Compliance Tests as defined from time to time
+by the Tizen Technical Steering Group and certified by the Tizen
+Association or its designated agent.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+this License, each Contributor hereby grants to You a perpetual,
+worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+copyright license to reproduce, prepare Derivative Works of,
+publicly display, publicly perform, sublicense, and distribute the
+Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+this License, each Contributor hereby grants to You a perpetual,
+worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+(except as stated in this section) patent license to make, have made,
+use, offer to sell, sell, import, and otherwise transfer the Work
+solely as incorporated into a Tizen Certified Platform, where such
+license applies only to those patent claims licensable by such
+Contributor that are necessarily infringed by their Contribution(s)
+alone or by combination of their Contribution(s) with the Work solely
+as incorporated into a Tizen Certified Platform to which such
+Contribution(s) was submitted. If You institute patent litigation
+against any entity (including a cross-claim or counterclaim
+in a lawsuit) alleging that the Work or a Contribution incorporated
+within the Work constitutes direct or contributory patent infringement,
+then any patent licenses granted to You under this License for that
+Work shall terminate as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+Work or Derivative Works thereof pursuant to the copyright license
+above, in any medium, with or without modifications, and in Source or
+Object form, provided that You meet the following conditions:
+
+ 1. You must give any other recipients of the Work or Derivative Works
+ a copy of this License; and
+ 2. You must cause any modified files to carry prominent notices stating
+ that You changed the files; and
+ 3. You must retain, in the Source form of any Derivative Works that
+ You distribute, all copyright, patent, trademark, and attribution
+ notices from the Source form of the Work, excluding those notices
+ that do not pertain to any part of the Derivative Works; and
+ 4. If the Work includes a "NOTICE" text file as part of its distribution,
+ then any Derivative Works that You distribute must include a readable
+ copy of the attribution notices contained within such NOTICE file,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works, in at least one of the following places:
+ within a NOTICE text file distributed as part of the Derivative Works;
+ within the Source form or documentation, if provided along with the
+ Derivative Works; or, within a display generated by the Derivative Works,
+ if and wherever such third-party notices normally appear.
+ The contents of the NOTICE file are for informational purposes only
+ and do not modify the License. You may add Your own attribution notices
+ within Derivative Works that You distribute, alongside or as an addendum
+ to the NOTICE text from the Work, provided that such additional attribution
+ notices cannot be construed as modifying the License. You may add Your own
+ copyright statement to Your modifications and may provide additional or
+ different license terms and conditions for use, reproduction, or
+ distribution of Your modifications, or for any such Derivative Works
+ as a whole, provided Your use, reproduction, and distribution of
+ the Work otherwise complies with the conditions stated in this License
+ and your own copyright statement or terms and conditions do not conflict
+ the conditions stated in the License including section 3.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+any Contribution intentionally submitted for inclusion in the Work
+by You to the Licensor shall be under the terms and conditions of
+this License, without any additional terms or conditions.
+Notwithstanding the above, nothing herein shall supersede or modify
+the terms of any separate license agreement you may have executed
+with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+names, trademarks, service marks, or product names of the Licensor,
+except as required for reasonable and customary use in describing the
+origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+agreed to in writing, Licensor provides the Work (and each
+Contributor provides its Contributions) on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+implied, including, without limitation, any warranties or conditions
+of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+PARTICULAR PURPOSE. You are solely responsible for determining the
+appropriateness of using or redistributing the Work and assume any
+risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+whether in tort (including negligence), contract, or otherwise,
+unless required by applicable law (such as deliberate and grossly
+negligent acts) or agreed to in writing, shall any Contributor be
+liable to You for damages, including any direct, indirect, special,
+incidental, or consequential damages of any character arising as a
+result of this License or out of the use or inability to use the
+Work (including but not limited to damages for loss of goodwill,
+work stoppage, computer failure or malfunction, or any and all
+other commercial damages or losses), even if such Contributor
+has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+the Work or Derivative Works thereof, You may choose to offer,
+and charge a fee for, acceptance of support, warranty, indemnity,
+or other liability obligations and/or rights consistent with this
+License. However, in accepting such obligations, You may act only
+on Your own behalf and on Your sole responsibility, not on behalf
+of any other Contributor, and only if You agree to indemnify,
+defend, and hold each Contributor harmless for any liability
+incurred by, or claims asserted against, such Contributor by reason
+of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Flora License to your work
+
+To apply the Flora License to your work, attach the following
+boilerplate notice, with the fields enclosed by brackets "[]"
+replaced with your own identifying information. (Don't include
+the brackets!) The text should be enclosed in the appropriate
+comment syntax for the file format. We also recommend that a
+file or class name and description of purpose be included on the
+same "printed page" as the copyright notice for easier
+identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Flora License, Version 1.1 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://floralicense.org/license/
+
+ 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.
+
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Li, Hao <haox.li@intel.com>
+
+*/
+
+/* Message Div */
+#messageInfo {
+ margin: 10px;
+}
+.errorMessage {
+ color: red;
+}
+
+/* File List */
+#filesList {
+ table-layout: fixed;
+}
+
+#filesList tr td {
+ padding: 5px;
+ font-size: large;
+ word-break: break-all;
+ word-wrap:break-word;
+}
+
+#filePreview {
+ margin-top: 10px;
+ text-align: center;
+ border: 1px solid black;
+ width: 100%;
+ height: 300px;
+ overflow: auto;
+}
+
+#fileContent {
+ position:relative;
+ top:40%;
+}
+
+#uploadButton {
+ margin-top: 20px;
+}
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Li,Hao <haox.li@intel.com>
+
+-->
+
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width">
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../css/main.css" />
+ <link rel="stylesheet" type="text/css" href="css/style.css" />
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/tests.js"></script>
+ <script src="js/main.js"></script>
+ </head>
+ <body>
+ <div data-role="header">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div data-role="content">
+ <input id="fileUpload" type="file" multiple size="80" onchange="getFileList()" hidden/>
+ <div id="messageInfo">Upload: 0 file</div>
+ <table id="filesList" border="1" width="100%" align="center">
+ <tr id="example"><td width='70%'>No file selected</td><td width='30%'>0KB</td></tr>
+ </table>
+ <div align="center"><div id="filePreview"><p id="fileContent">No file data</p></div></div>
+ <div id="uploadButton" data-role="button">Open files</div>
+ </div>
+ <div data-role="footer" data-position="fixed">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font class="fontSize">
+ <p>Test Purpose: </p>
+ <p>Verifies the functionality of File Reader. Tests the functionality of loading one or multiple files, opening the files one by one by clicking the hyperlink in file name.</p>
+ <p>Test Pre-configuration: </p>
+ <p>Ensure at least one txt file is located in the device.</p>
+ <p>Expected Result: </p>
+ <ul>
+ <li>File upload successfully.</li>
+ <li>File size show correctly.</li>
+ <li>File content print on the screen.</li>
+ </ul>
+ </font>
+ </div>
+ </body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Li,Hao <haox.li@intel.com>
+
+*/
+$(document).ready(function(){
+ $("#uploadButton").on("click", function() {
+ if (document.createEvent) {
+ var evt = document.createEvent("MouseEvents");
+ evt.initEvent("click", true, true);
+ $("#fileUpload")[0].dispatchEvent(evt);
+ }
+ });
+ DisablePassButton();
+});
+
+function getFileList() {
+ try{
+ // get FileList through input element
+ var filesList = document.getElementById("fileUpload").files;
+ // FileList.length
+ if(filesList && filesList.length > 0){
+ $("#example").remove();
+ $("#messageInfo").html("Upload: " + filesList.length + " file/s");
+ var filesStr = "";
+ for(var i= 0; i < filesList.length; i++) {
+ // FileList.item() to get file items
+ var file = filesList.item(i);
+ // Blob.slice testing
+ file.slice = file.slice || file.webkitSlice || file.mozSlice;
+ var fileBlob = file.slice(0, file.size);
+ // This fileBlob should be the same with the file
+ if(fileBlob.size == file.size){
+ filesStr = filesStr + "<tr><td width='70%'><a href='javascript:startRead(" + i + ")'>" + file.name + "</a></td><td width='30%'>" + Math.round(file.size/1024) + "KB</td>" + "</tr>";
+ }
+ }
+ $("#filesList").show();
+ $("#filesList").html(filesStr);
+ }
+ } catch (err) {
+ $("#messageInfo").addClass("errorMessage");
+ $("#messageInfo").html("Error: " + err.code + " - " + err.message);
+ }
+}
+
+var filetype = "";
+function startRead(index) {
+
+ var file = document.getElementById("fileUpload").files[index];
+ if (file) {
+ var reader = new FileReader();
+ if(file.type.indexOf("text") >= 0) {
+ // readAsText
+ // Read file into memory as UTF-8
+ reader.readAsText(file, "UTF-8");
+ filetype = "text";
+ } else if (file.type.indexOf("image") >= 0) {
+ // readAsDataURL
+ reader.readAsDataURL(file);
+ filetype = "image";
+ } else {
+ try {
+ //try to read other types of file as text.
+ reader.readAsText(file, "UTF-8");
+ filetype = "text";
+ } catch(e) {
+ $.mobile.hidePageLoadingMsg();
+ $("#filePreview").html("Cannot pre-view this type of file!");
+ }
+ }
+ EnablePassButton();
+ // Handle progress, success, and errors
+ reader.onloadstart = loadstart;
+ reader.onload = loaded;
+ reader.onloadend = loadend;
+ reader.onerror = errorHandler;
+ }
+}
+function loadstart(evt) {
+ // loading
+ $.mobile.showPageLoadingMsg();
+}
+
+function loaded(evt) {
+ var reader = evt.target;
+ if (reader && reader.result) {
+ if(filetype == "text") {
+ $("#filePreview").html(reader.result);
+ } else if (filetype == "image") {
+ $("#filePreview").html("<image src='" + reader.result + "'></image>");
+ }
+ }
+}
+
+function loadend(evt) {
+ $.mobile.hidePageLoadingMsg();
+}
+
+function errorHandler(evt) {
+ $("#messageInfo").addClass("errorMessage");
+ $("#messageInfo").html(evt.target.error.name);
+}
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Tan, Shiyou <shiyoux.tan@intel.com>
+
+-->
+
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width">
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../css/main.css" />
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/tests.js"></script>
+ <script src="js/main.js"></script>
+ <style>
+ div:full-screen {
+ opacity: 0;
+ }
+ div:-webkit-full-screen {
+ opacity: 0;
+ }
+ :full-screen-ancestor {
+ opacity: 1;
+ background: green;
+ }
+ :-webkit-full-screen-ancestor {
+ background: green;
+ }
+ </style>
+ </head>
+ <body>
+ <div data-role="header">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div id="content">
+ <ul data-role="listview">
+ <li data-role="list-divider" id="labelFullScreen">FullScreen</li>
+ <li id ="buttonFullScreen">
+ <div data-role="button" id="requestFullScreen">Request</div>
+ <div data-role="button" id="cancelFullScreen" class="hideButton">Cancle FullScreen</div>
+ </li>
+ <li data-role="list-divider" id="labelcssFullScreen">CSS FullScreen</li>
+ <li id ="buttoncssFullScreen">
+ <div data-role="button" id="cssFullScreen">Request</div>
+ <div data-role="button" id="cancelCssFullScreen" class="hideButton">Cancle CSS FullScreen</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font class="fontSize">
+ <p>Test Purpose: </p>
+ <p>Verifies the full screen mode and CSS full screen mode could be enabled and cancelled. The CSS full screen mode is filled with green color in background.</p>
+ <p>Expected Result: </p>
+ <p>Test passes if full screen mode and CSS full screen mode functions all work well.</p>
+ </font>
+ </div>
+ </body>
+ </body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Tan, Shiyou <shiyoux.tan@intel.com>
+*/
+$(document).ready(function () {
+ DisablePassButton();
+ $("#requestFullScreen").on(
+ "click",
+ function(evt) {
+ document.documentElement.webkitRequestFullScreen();
+ requestElement("cancelFullScreen");
+ EnablePassButton();
+ });
+
+ $("#cancelFullScreen").on(
+ "click",
+ function(evt) {
+ document.webkitCancelFullScreen();
+ requestElement("");
+ });
+
+ $("#cssFullScreen").on(
+ "click",
+ function(evt) {
+ if (!document.webkitIsFullScreen) {
+ var element = evt.originalEvent.srcElement;
+ requestElement("cancelCssFullScreen");
+ element.webkitRequestFullScreen();
+ setTimeout(function() {
+ document.documentElement.webkitRequestFullScreen();
+ }, 50);
+ }
+ EnablePassButton();
+ });
+
+ $("#cancelCssFullScreen").on(
+ "click",
+ function(evt) {
+ if (document.webkitIsFullScreen) {
+ document.webkitCancelFullScreen();
+ if ($(document)["context"].styleSheets.length > 2) {
+ $(document)["context"].styleSheets[2].deleteRule(1);
+ }
+ document.documentElement.webkitRequestFullScreen();
+ requestElement("");
+ }
+ });
+});
+
+function requestElement(ID) {
+ var IDs = ["requestFullScreen", "cancelFullScreen", "cssFullScreen", "cancelCssFullScreen", "labelFullScreen", "labelcssFullScreen", "buttonFullScreen", "buttoncssFullScreen"];
+ IDs.forEach(function(entry) {
+ if (ID != entry) {
+ if (ID == "cancelFullScreen" && entry != "labelFullScreen" && entry != "buttonFullScreen") {
+ $("#" + entry).hide();
+ } else if (ID == "cancelCssFullScreen" && entry != "labelcssFullScreen" && entry != "buttoncssFullScreen") {
+ $("#" + entry).hide();
+ }
+ } else {
+ $("#" + entry).css("display", "");
+ $("#" + entry).show();
+ }
+ if (ID == "") {
+ if (entry == IDs[1] || entry == IDs[3]) {
+ $("#" + entry).hide();
+ } else {
+ $("#" + entry).show();
+ }
+ }
+ });
+}
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Xu, Jianfeng <jianfengx.xu@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../css/main.css" />
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/tests.js"></script>
+ <script src="../../js/main.js"></script>
+ </head>
+ <body>
+ <input type="hidden" id="sub_test"/>
+ <div data-role="page" id="main">
+ <div data-role="header" data-position="fixed" data-tap-toggle="false">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div id="content">
+ <ul data-role="listview" id="cspList" data-divider-theme="b" data-inset="true">
+ <li data-role="list-divider" role="heading">Test Gamepad</li>
+ <li id="Crosswalk_WebApp_ScrollIndicators_Default">
+ <a href="javascript:runApp('res/GamePad_basic-manual.html')" data-transition="slide" style="">
+ <h2>Gamepad_basic</h2>
+ </a>
+ </li>
+ <li id="Crosswalk_WebApp_ScrollIndicators_LargeSize">
+ <a href="javascript:runApp('res/GamePad_connected-manual.html')" data-transition="slide" style="">
+ <h2>GamePad_connected</h2>
+ </a>
+ </li>
+ <li id="Crosswalk_WebApp_ScrollIndicators_Default">
+ <a href="javascript:runApp('res/GamePadButton_basic-manual.html')" data-transition="slide" style="">
+ <h2>GamePadButton_basic</h2>
+ </a>
+ </li>
+ <li id="Crosswalk_WebApp_ScrollIndicators_Map">
+ <a href="javascript:runApp('res/GamepadEvent_gamepadconnected-manual.html')" data-transition="slide" style="">
+ <h2>GamepadEvent_gamepadconnected</h2>
+ </a>
+ </li>
+ <li id="Crosswalk_WebApp_ScrollIndicators_Pic">
+ <a href="javascript:runApp('res/GamepadEvent_gamepaddisconnected-manual.html')" data-transition="slide" style="">
+ <h2>GamepadEvent_gamepaddisconnected</h2>
+ </a>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Purpose: </p>
+ <p>Verifies the Gamepad is supported.</p>
+ <p>Expected Result: </p>
+ <p>Test passes if all sub-tests pass.</p>
+ </font>
+ </div>
+ </div>
+ <div data-role="page" id="test_ui">
+ <iframe id="test_frame" width="100%" frameborder="no" border="0" src=""></iframe>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2014 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Jianfeng.Xu <jianfengx.xu@intel.com>
+
+-->
+
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="Crosswalk_WebApp_ScrollIndicators_Default">
+ <div id="content">
+ <p>Please connect and press a button on gamepad.</p>
+ <p>Test Passes if show test result is 'Pass'.</p>
+ <div id = "log"></div>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <p>Connect and press button on gamepad.</p>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test Passes if show test result is 'Pass'.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+<script>
+var text = "";
+function runTest(gamepads) {
+ text = "";
+ for (var j = 0; j < gamepads.length; j++) {
+ var pad = gamepads[j];
+ if(pad) {
+ var gamepadbutton = pad.buttons[0];
+ [
+ ["boolean", "pressed", "readonly"],
+ ["double", "value", "readonly"]
+ ].forEach(function(attr) {
+ var type = attr[0];
+ var name = attr[1];
+ var read = attr[2];
+ text = text + "<br>gamepadbuttonButton_" + name + "_basic Check if the readonly attribute " + name + " in gamepadbuttonButton exists and type of " + type + " ";
+ document.getElementById("log").innerHTML = text;
+ if(!(name in gamepadbutton)) {
+ text = text + name + " does not exist fail</br>";
+ document.getElementById("log").innerHTML = text;
+ } else {
+ var typeResult = true;
+ switch(type) {
+ case "double":
+ if (typeof gamepadbutton[name] != "number") {
+ typeResult = false;
+ }
+ break;
+ case "boolean":
+ if (typeof gamepadbutton[name] != "boolean") {
+ typeResult = false;
+ }
+ break;
+ default:
+ break;
+ }
+ if (!typeResult)
+ {
+ text = text + "The type of " + name +" is not " + type + " fail</br>";
+ document.getElementById("log").innerHTML = text;
+ } else {
+ var readResult = true;
+ switch(type) {
+ case "double":
+ var dc = gamepadbutton[name];
+ gamepadbutton[name] = dc + 1;
+ if (dc != gamepadbutton[name])
+ {
+ readResult = false;
+ }
+ break;
+ case "boolean":
+ var dc = gamepadbutton[name];
+ if (dc)
+ {
+ gamepadbutton[name] = false;
+ }else {
+ gamepadbutton[name] = true;
+ }
+ if (dc != gamepadbutton[name])
+ {
+ readResult = false;
+ }
+ break;
+ break;
+ default:
+ break;
+ }
+ if (!readResult)
+ {
+ text = text + "The " + name +" is not readonly fail</br>";
+ document.getElementById("log").innerHTML = text;
+ } else {
+ text = text + "  pass";
+ document.getElementById("log").innerHTML = text;
+ }
+ }
+ }
+ });
+ }
+ }
+}
+
+function runAnimation() {
+ var gamepads = navigator.getGamepads();
+ if(gamepads.length > 0) {
+ runTest(gamepads);
+ };
+ window.requestAnimationFrame(runAnimation);
+}
+window.requestAnimationFrame(runAnimation);
+</script>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2014 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Jianfeng.Xu <jianfengx.xu@intel.com>
+
+-->
+
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="Crosswalk_WebApp_ScrollIndicators_Default">
+ <div id="content">
+ <p>Please connect and press a button on gamepad.</p>
+ <p>Test Passes if show test result is 'Pass'.</p>
+ <div id = "log"></div>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <p>Connect and press button on gamepad.</p>
+ <p>Expected Result: </p>
+ <p>Test Passes if show test result is 'Pass'.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+<script>
+var text = "";
+function runTest(gamepads) {
+ text = "";
+ for (var j = 0; j < gamepads.length; j++) {
+ var pad = gamepads[j];
+ if(pad) {
+ var gamepad = pad;
+ [
+ ["string", "id", "readonly"],
+ ["long", "index", "readonly"],
+ ["boolean", "connected", "readonly"],
+ ["double", "timestamp", "readonly"],
+ ["string", "mapping", "readonly"],
+ ["object", "axes", "readonly"],
+ ["object", "buttons", "readonly"]
+ ].forEach(function(attr) {
+ var type = attr[0];
+ var name = attr[1];
+ var read = attr[2];
+ text = text + "<br>GamePad_" + name + "_basic Check if the readonly attribute " + name + " in gamepad exists and type of " + type + " ";
+ document.getElementById("log").innerHTML = text;
+ if(!(name in gamepad)) {
+ text = text + name + " does not exist fail</br>";
+ document.getElementById("log").innerHTML = text;
+ } else {
+ var typeResult = true;
+ switch(type) {
+ case "string":
+ if(typeof gamepad[name] != "string") {
+ typeResult = false;
+ }
+ break;
+ case "long":
+ if (typeof gamepad[name] != "number") {
+ typeResult = false;
+ }
+ break;
+ case "double":
+ if (typeof gamepad[name] != "number") {
+ typeResult = false;
+ }
+ break;
+ case "boolean":
+ if (typeof gamepad[name] != "boolean") {
+ typeResult = false;
+ }
+ break;
+ case "object":
+ if (typeof gamepad[name] != "object") {
+ typeResult = false;
+ }
+ break;
+ default:
+ break;
+ }
+ if (!typeResult)
+ {
+ text = text + "The type of " + name +" is not " + type + " fail</br>";
+ document.getElementById("log").innerHTML = text;
+ } else {
+ var readResult = true;
+ switch(type) {
+ case "string":
+ var dc = gamepad[name];
+ gamepad[name] = dc+ "test";
+ if (dc != gamepad[name])
+ {
+ readResult = false;
+ }
+ break;
+ case "long":
+ var dc = gamepad[name];
+ gamepad[name] = dc + 1;
+ if (dc != gamepad[name])
+ {
+ readResult = false;
+ }
+ break;
+ case "double":
+ var dc = gamepad[name];
+ gamepad[name] = dc + 1;
+ if (dc != gamepad[name])
+ {
+ readResult = false;
+ }
+ break;
+ case "boolean":
+ var dc = gamepad[name];
+ if (dc)
+ {
+ gamepad[name] = false;
+ }else {
+ gamepad[name] = true;
+ }
+ if (dc != gamepad[name])
+ {
+ readResult = false;
+ }
+ break;
+ case "object":
+ gamepad[name] = null;
+ if (null == gamepad[name])
+ {
+ readResult = false;
+ }
+ break;
+ default:
+ break;
+ }
+ if (!readResult)
+ {
+ text = text + "The " + name +" is not readonly fail</br>";
+ document.getElementById("log").innerHTML = text;
+ } else {
+ text = text + "  pass";
+ document.getElementById("log").innerHTML = text;
+ }
+ }
+ }
+ });
+ }
+ }
+}
+
+function runAnimation()
+{
+ var gamepads = navigator.getGamepads();
+ if(gamepads.length > 0) {
+ runTest(gamepads);
+ };
+ window.requestAnimationFrame(runAnimation);
+}
+window.requestAnimationFrame(runAnimation);
+</script>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2014 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Jianfeng.Xu <jianfengx.xu@intel.com>
+
+-->
+
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="Crosswalk_WebApp_ScrollIndicators_Default">
+ <div id="content">
+ <p>Please connect and press a button on gamepad.</p>
+ <p>Test Passes if the show result is true.</p>
+ <div id = "log"></div>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <p>Connect and press button on gamepad.</p>
+ <p>Expected Result: </p>
+ <p>Test Passes if the show result is true.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+<script>
+var text = "";
+function runTest(gamepads) {
+ for (var j = 0; j < gamepads.length; j++) {
+ var pad = gamepads[j];
+ if(pad) {
+ text = pad.connected;
+ document.getElementById("log").innerHTML = text;
+ }
+ }
+}
+
+function runAnimation() {
+ var gamepads = navigator.getGamepads();
+ if(gamepads.length > 0) {
+ runTest(gamepads);
+ };
+ window.requestAnimationFrame(runAnimation);
+}
+window.requestAnimationFrame(runAnimation);
+</script>
+</html>
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2014 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Jianfeng.Xu <jianfengx.xu@intel.com>
+
+-->
+
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="Crosswalk_WebApp_ScrollIndicators_Default">
+ <div id="content">
+ <p>Please reconnect gamepad and press button on gamepad.</p>
+ <p>Test Passes if the show result is "[object Gamepad]". </p>
+ <div id="log"></div>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <p>Connect and press button on gamepad.</p>
+ <p>Expected Result: </p>
+ <p>Test Passes if the show result is "[object Gamepad]".</p>
+ </font>
+ </div>
+ </div>
+ </body>
+<script>
+function runTest(e) {
+ var text = "";
+ document.getElementById("log").innerHTML = e.gamepad;
+}
+
+window.addEventListener("gamepadconnected", runTest);
+</script>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2014 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Jianfeng.Xu <jianfengx.xu@intel.com>
+
+-->
+
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="Crosswalk_WebApp_ScrollIndicators_Default">
+ <div id="content">
+ <p>Please remove the gamepad from device.</p>
+ <p>Test Passes if the show result is "pass" when you remove the gamepad. </p>
+ <div id="log"></div>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <p>Please remove the gamepad from device.</p>
+ <p>Expected Result: </p>
+ <p>Test Passes if the show result is "pass" when you remove the gamepad.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+<script>
+function runTest(e) {
+ var text = "";
+ document.getElementById("log").innerHTML = "pass";
+}
+
+window.addEventListener("gamepaddisconnected", runTest);
+</script>
+</html>
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Lin, Wanming <wanmingx.lin@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <title>HybridApplication</title>
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../css/main.css" />
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/tests.js"></script>
+ <script src="js/main.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="main">
+ <div data-role="header" data-position="fixed" data-tap-toggle="false">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div id="content">
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li>
+ <div data-role="button" id="launch1" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Update</li>
+ <li>
+ <div data-role="button" id="update" class="wgtButton">Update</div>
+ </li>
+ <li>
+ <div data-role="button" id="launch2" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ <li>
+ <div data-role="button" id="launch3" class="wgtButton">Try to Launch</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Purpose: </p>
+ <p>Verifies the functionality of hybrid application. Tests the functionality of two hybrid applications installation, uninstallation, launching, update and communicating with the native application by clicking the "START/ STOP" buttons, clearing the messages by clicking the "CLEAR" button. And quit the hybrid application by clicking the "RETURN" button.</p>
+ <ol>
+ <li>Click the "Install" button to install the Hybrid app.</li>
+ <li>Click the "Launch" button to launch the Hybrid app.</li>
+ <li>Click the "Update" button to update the Hybrid app.</li>
+ <li>Click the "Launch" button to launch the Hybrid app.</li>
+ <li>Click the "Uninstall" button to uninstall the Hybrid app.</li>
+ <li>Click the "Try to Launch" button to launch the Hybrid app, it will get an error msg.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if all the test points work well.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Lin, Wanming <wanmingx.lin@intel.com>
+
+*/
+
+var installUrl, updateUrl, platformName, packagePath;
+var opened_flag = false;
+$(document).delegate("#main", "pageinit", function() {
+ DisablePassButton();
+
+ $("#install").bind("vclick", function() {
+ install(installUrl, "install");
+ });
+ $("#launch1").bind("vclick", function() {
+ launch();
+ if (!opened_flag) {
+ opened_flag = true;
+ $("#update").removeClass("ui-disabled");
+ }
+ });
+ $("#update").bind("vclick", function() {
+ install(updateUrl, "update");
+ });
+ $("#launch2").bind("vclick", function() {
+ launch();
+ $("#uninstall").removeClass("ui-disabled");
+ });
+ $("#uninstall").bind("vclick", function() {
+ uninstall();
+ });
+ $("#launch3").bind("vclick", function() {
+ launch();
+ EnablePassButton();
+ });
+ try {
+ tizen.package.setPackageInfoEventListener(packageEventCallback);
+ } catch (e) {
+ alert("Exception: " + e.message);
+ }
+ packagePre();
+ $("#launch1").addClass("ui-disabled");
+ $("#launch2").addClass("ui-disabled");
+ $("#launch3").addClass("ui-disabled");
+ $("#update").addClass("ui-disabled");
+ $("#uninstall").addClass("ui-disabled");
+
+ if(checkInstalledPkg("bhtchybrid")) {
+ $("#install").addClass("ui-disabled");
+ $("#launch1").removeClass("ui-disabled");
+ }
+});
+
+var packageEventCallback = {
+ oninstalled: function(packageInfo) {
+ hideProcess();
+ alert("The application " + packageInfo.name + " is installed");
+ },
+ onupdated: function(packageInfo) {
+ hideProcess();
+ alert("The application " + packageInfo.name + " is updated");
+ $("#update").removeClass("ui-disabled");
+ },
+ onuninstalled: function(packageId) {
+ hideProcess();
+ alert("The Hybrid application is uninstalled");
+ }
+};
+
+function fileURI() {
+ var documentsDir;
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ if(files[i].name == "HybridApp1.wgt")
+ {
+ var Url1 = files[i].toURI();
+ installUrl = Url1.replace("file:///", "/");
+ }
+ if(files[i].name == "HybridApp2.wgt")
+ {
+ var Url2 = files[i].toURI();
+ updateUrl = Url2.replace("file:///", "/");
+ }
+ }
+ }
+
+ function onerror(error) {
+ alert("The error " + error.message + " occurred when listing the files in the selected folder");
+ }
+
+ tizen.filesystem.resolve(
+ 'documents',
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error" + e.message);
+ }, "r"
+ );
+}
+
+function install(url, type) {
+ var onInstallationSuccess = {
+ onprogress: function(packageId, percentage)
+ {
+ console.log("On installation(" + packageId + "): progress(" + percentage + ")");
+ showProcess();
+ },
+ oncomplete: function(packageId)
+ {
+ console.log("Installation(" + packageId + ") Complete");
+ if (type == "install") {
+ $("#install").addClass("ui-disabled");
+ $("#launch1").removeClass("ui-disabled");
+ }
+ if (type == "update") {
+ $("#update").addClass("ui-disabled");
+ $("#launch2").removeClass("ui-disabled");
+ }
+ }
+ }
+
+ var onError = function (err) {
+ console.log("Error occured on installation : " + err.name);
+ $.mobile.hidePageLoadingMsg();
+ }
+
+ try {
+ tizen.package.install(url, onInstallationSuccess, onError);
+ } catch (e) {
+ alert("Exception: " + e.name);
+ }
+}
+
+function uninstall() {
+
+ var onUninstallationSuccess = {
+
+ onprogress: function(packageId, percentage)
+ {
+ console.log("On uninstallation(" + packageId + "): progress(" + percentage + ")");
+ showProcess();
+ },
+ oncomplete: function(packageId)
+ {
+ console.log("Uninstallation(" + packageId + ") Complete");
+ $("#launch1").addClass("ui-disabled");
+ $("#launch2").addClass("ui-disabled");
+ $("#uninstall").addClass("ui-disabled");
+ $("#launch3").removeClass("ui-disabled");
+ }
+ }
+
+ var onError = function (err) {
+ console.log("Error occured on installation : " + err.name);
+ $.mobile.hidePageLoadingMsg();
+ }
+
+ try {
+ tizen.package.uninstall("bhtchybrid", onUninstallationSuccess, onError);
+ } catch (e) {
+ alert("Exception: " + e.name);
+ }
+}
+
+function launch() {
+ function onSuccess() {
+ console.log(id + " launched successfully!");
+ }
+
+ function onError(err) {
+ alert("launch failed : " + err.message);
+ }
+
+ try {
+ tizen.application.launch("bhtchybrid.HybridApp", onSuccess, onError);
+ } catch (exc) {
+ alert("launch exc:" + exc.message);
+ }
+}
+
+function packagePre() {
+ var documentsDir;
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ if(files[i].name == "HybridApp2")
+ {
+ documentsDir.copyTo(
+ files[i].fullPath,
+ "documents/HybridApp2.wgt",
+ true,
+ function() {
+ console.log("HybridApp2 Precondition Success(1)!");
+ });
+ }
+ if(files[i].name == "HybridApp1")
+ {
+ documentsDir.copyTo(
+ files[i].fullPath,
+ "documents/HybridApp1.wgt",
+ true,
+ function() {
+ console.log("HybridApp1 Precondition Success(2)!");
+ });
+ }
+ }
+ fileURI();
+ }
+
+ function onerror(error) {
+ alert("The error " + error.message + " occurred when listing the files in the selected folder");
+ }
+
+ //add corssplatform support
+ var deviceCapabilities = tizen.systeminfo.getCapabilities();
+ platformName = deviceCapabilities.platformCoreCpuArch;
+ if (platformName.indexOf("armv7") >= 0) {
+ packagePath = "wgt-package/tests/HybridApplication/res/armv7/";
+ } else if (platformName.indexOf("x86") >= 0) {
+ packagePath = packagePath + "wgt-package/tests/HybridApplication/res/x86/";
+ } else {
+ alert("Error: Unsupported platform");
+ return;
+ }
+
+ tizen.filesystem.resolve(
+ packagePath,
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error" + e.message);
+ }, "r"
+ );
+}
+
+function hideProcess() {
+ $.mobile.hidePageLoadingMsg();
+ $("#popup_info-screen").addClass("ui-screen-hidden");
+ $("#popup_info-screen").removeClass("in");
+}
+
+function showProcess() {
+ $.mobile.showPageLoadingMsg();
+ $("#popup_info-screen").removeClass("ui-screen-hidden");
+ $("#popup_info-screen").addClass("in");
+}
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Xin, Liu <xinx.liu@intel.com>
+
+*/
+
+.position_font {
+ color: #3399FF;
+ font-size: 20px;
+}
+
+.attribute_show {
+ margin: 2px;
+ margin-left: 5px;
+ margin-right: 5px;
+ height: 40px;
+ line-height:40px;
+ border: #666666 solid thin;
+ background-color: #CCCCCC;
+}
+td {
+ background-color: #996633;
+}
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Xin, Liu <xinx.liu@intel.com>
+
+-->
+
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width">
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../css/main.css" />
+ <link rel="stylesheet" type="text/css" href="css/style.css"/>
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/tests.js"></script>
+ <script src="js/main.js"></script>
+ <style>
+ .observate {
+ border: #000 solid 1px;
+ height: 220px;
+ margin-bottom: 10px;
+ }
+ .display {
+ margin: 3px;
+ }
+ </style>
+ </head>
+ <body onload="initialize()">
+ <div data-role="header">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div data-role="content">
+ <div id="observateEare" class="observate">
+ <ul id="coordinate">
+ <li id="latitudeDiv" class="display">Latitude: n/a</li>
+ <li id="longitudeDiv" class="display">Longitude: n/a</li>
+ <li id="speedDiv" class="display">Speed: n/a</li>
+ </ul>
+ <p id="errormessage"></p>
+ </div>
+ <p class="ui-li-desc">* Make sure GPS is enabled.</p>
+ </div>
+ <div data-role="footer" data-position="fixed">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font class="fontSize">
+ <p>Test Purpose: </p>
+ <p>Verifies the location information of latitude and longitude position can be fetched through GPS.</p>
+ <p>Test Pre-configuration: </p>
+ <p>Ensure device networking is disabled and GPS is enabled.</p>
+ <p>Expected Result: </p>
+ <p>Test passes if both the latitude and longitude return the correct position data.</p>
+ </font>
+ </div>
+ </body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Xin, Liu <xinx.liu@intel.com>
+
+*/
+var html_log;
+html_log = "<b>Html Console:</b><br>";
+
+function html_console(message) {
+ html_log += message + "<br>";
+ jQuery("#htmlConsole").html(html_log);
+}
+// -------------------------------------------
+
+function initialize() {
+ $.mobile.showPageLoadingMsg();
+ DisablePassButton();
+ try {
+ navigator.geolocation.watchPosition(successCallback, errorCallback, { maximumAge: 60000});
+ } catch (err) {
+ $.mobile.hidePageLoadingMsg();
+ jQuery("#errormessage").html("<p>Error Message: <font color='red'>" + err.message + "</font></p>");
+ }
+}
+
+function successCallback (position) {
+ $.mobile.hidePageLoadingMsg();
+ EnablePassButton();
+ var coordinates = position.coords;
+ jQuery("#latitudeDiv").text("Latitude: " + coordinates.latitude);
+ jQuery("#longitudeDiv").text("Longitude: " + coordinates.longitude);
+ jQuery("#speedDiv").text("Speed: " + coordinates.speed);
+}
+
+function errorCallback (error) {
+ $.mobile.hidePageLoadingMsg();
+ var positionError_const =["PERMISSION DENIED", "POSITION UNAVAILABLE", "TIMEOUT"];
+ var index = error.code-0-1;
+ jQuery("#errormessage").html("<p>Error Message: <font color='red'>" + positionError_const[index] + "</font></p>");
+}
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Cui, Jieqiong <jieqiongx.cui@intel.com>
+
+*/
+
+.ui-slider .ui-btn-inner {
+ padding: 6px 0 0 0 !important;
+ font-size:.7em;
+}
+.ui-slider-popup {
+ position: absolute !important;
+ width: 64px;
+ height: 64px;
+ text-align: center;
+ font-size: 36px;
+ padding-top: 14px;
+ z-index: 100;
+ opacity: 0.8;
+}
+div.ui-slider {
+ margin: 0 2% 0 0px;
+ width:100%;
+}
+
+div.ui-slider-bg {
+border: none;
+height: 100%;
+}
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Lin, Wanming <wanmingx.lin@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width">
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../css/main.css" />
+ <link rel="stylesheet" type="text/css" href="css/style.css" />
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/tests.js"></script>
+ <script src="js/main.js"></script>
+ <script src="js/jquery/slider.tooltip.js"></script>
+ </head>
+ <body>
+ <div data-role="header">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div data-role="content">
+ <div id="contentdiv">
+ <video id="MediaPlayback" width="340" height="200" src="" poster="../../res/images/meego/PNG_512x512_318Kb_BBB.png" controls="controls" loop>Not Support ...</video>
+ </div>
+ <div id="volumediv" data-role="controlgroup">
+ <label for="slider-1">Volume</label>
+ <input name="slider-1" id="slider-1" min="0" max="1" step="0.01" value="0.60" data-highlight="true" data-show-value="true" type="range">
+ </div>
+ <div id="buttondiv">
+ <a href="javascript:Previous()" id="previous" data-role="button">Retest Previous Video</a>
+ <a href="javascript:Next()" id="next" data-role="button">Test Next Video</a>
+ </div>
+ </div>
+ <div data-role="footer" data-position="fixed">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font class="fontSize">
+ <p>Test Purpose: </p>
+ <p>Verifies the video playback of 3GP and MP4 files works correctly. And tests the functionality of playback operations including play and pause, volume up and down, time bar sliding forward and backward, full screen and normal screen switching on every video files.</p>
+ <p>Expected Result: </p>
+ <p>Test passes if all the check points work well during the video playback.</p>
+ </font>
+ </div>
+ </body>
+</html>
--- /dev/null
+Copyright (c) 2013 Intel Corporation.
+Except as noted, this software is licensed under BSD-3-Clause License.
+Please, see the LICENSE.BSD-3 file for the BSD-3-Clause License.
+
+Following resources are licensed under its own license.
+
+slider.tooltip.js:
+The above file is licensed under jQuery MIT License:
+From https://github.com/jquery/jquery-mobile
+Please see the LICENSE.MIT for the MIT terms and conditions.
--- /dev/null
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Slider tooltip extension
+//>>label: Slidertooltip
+//>>group: Forms
+//>>css.theme: ../css/themes/default/jquery.mobile.theme.css
+//>>css.structure: ../css/structure/jquery.mobile.slider.tooltip.css
+
+//define( [ "jquery", "./slider" ], function( $ ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, undefined ) {
+
+$.widget( "mobile.slider", $.mobile.slider, {
+ options: {
+ popupEnabled: false,
+ showValue: false
+ },
+
+ _create: function() {
+ var o = this.options,
+ popup = $( "<div></div>", {
+ class: "ui-slider-popup ui-shadow ui-corner-all ui-body-" + ( o.theme ? o.theme : $.mobile.getInheritedTheme( this.element, "c" ) )
+ });
+
+ this._super();
+
+ $.extend( this, {
+ _currentValue: null,
+ _popup: popup,
+ _popupVisible: false,
+ _handleText: this.handle.find( ".ui-btn-text" )
+ });
+
+ this.slider.before( popup );
+ popup.hide();
+
+ this._on( this.handle, { "vmousedown" : "_showPopup" } );
+ this._on( this.slider.add( $.mobile.document ), { "vmouseup" : "_hidePopup" } );
+ this._refresh();
+ },
+
+ // position the popup centered 5px above the handle
+ _positionPopup: function() {
+ var dstOffset = this.handle.offset();
+ this._popup.offset( {
+ left: dstOffset.left + ( this.handle.width() - this._popup.width() ) / 2,
+ top: dstOffset.top - this._popup.outerHeight() - 5
+ });
+ },
+
+ _setOption: function( key, value ) {
+ this._super( key, value );
+
+ if ( key === "showValue" ) {
+ if ( value ) {
+ this._handleText.html( this._value() ).show();
+ } else {
+ this._handleText.hide();
+ }
+ }
+ },
+
+ // show value on the handle and in popup
+ refresh: function() {
+ this._super.apply( this, arguments );
+
+ // necessary because slider's _create() calls refresh(), and that lands
+ // here before our own _create() has even run
+ if ( !this._popup ) {
+ return;
+ }
+
+ this._refresh();
+ },
+
+ _refresh: function() {
+ var o = this.options, newValue;
+
+ if ( o.popupEnabled ) {
+ // remove the title attribute from the handle (which is
+ // responsible for the annoying tooltip); NB we have
+ // to do it here as the jqm slider sets it every time
+ // the slider's value changes :(
+ this.handle.removeAttr( 'title' );
+ }
+
+ newValue = this._value();
+ if ( newValue === this._currentValue ) {
+ return;
+ }
+ this._currentValue = newValue;
+
+ if ( o.popupEnabled ) {
+ this._positionPopup();
+ this._popup.html(Math.round(newValue*100)+"%" );
+ document.getElementById("MediaPlayback").volume = newValue;
+ }
+
+ if ( o.showValue ) {
+ this._handleText.html(Math.round(newValue*100)+"%");
+ document.getElementById("MediaPlayback").volume = newValue;
+ }
+ },
+
+ _showPopup: function() {
+ if ( this.options.popupEnabled && !this._popupVisible ) {
+ this._handleText.hide();
+ this._popup.show();
+ this._positionPopup();
+ this._popupVisible = true;
+ }
+ },
+
+ _hidePopup: function() {
+ if ( this.options.popupEnabled && this._popupVisible ) {
+ this._handleText.show();
+ this._popup.hide();
+ this._popupVisible = false;
+ }
+ }
+});
+
+})( jQuery );
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Cui,Jieqiong <jieqiongx.cui@intel.com>
+
+*/
+
+var videoFileList = new Array("3GP_h263_CIF_30FPS_507Kbps_HE-AAC_Stereo_64Kbps_60sec(4.1Mb)_BBB.3gp", "MP4_h264_CIF_15FPS_387Kbps_MP3_44.1KHz_64Kbps_60sec(3.4Mb)_BBB(hinted).mp4", "MP4_MPEG4_CIF_15FPS_387Kbps_MP3_44.1KHz_64Kbps_60sec(3Mb)_BBB(hinted).mp4");
+var testTarget='';
+
+$(document).ready(function(){
+ $("#previous").addClass("ui-disabled");
+
+ //add contentdiv style
+ $("#contentdiv").css({"width":"340px","margin":"0px auto"});
+ //set default video.src
+ $("#MediaPlayback").attr("src", "../../res/media/meego/" + videoFileList[0]);
+ document.getElementById("MediaPlayback").play();
+
+ document.getElementById("MediaPlayback").volume = 0.6;
+ $("#slider-1").hide();
+ DisablePassButton();
+});
+
+function Previous() {
+ testTarget=document.getElementById("MediaPlayback");
+ var fileName = getFileName(testTarget.src);
+ for(i=0;i<3;i++) {
+ if(fileName != videoFileList[i])
+ continue;
+ else
+ break;
+ }
+ if(i > 1) {
+ testTarget.src="../../res/media/meego/"+videoFileList[i-1];
+ testTarget.play();
+ $("#next").removeClass("ui-disabled");
+ }else {
+ testTarget.src="../../res/media/meego/"+videoFileList[i-1];
+ testTarget.play();
+ $("#previous").addClass("ui-disabled");
+ $("#next").removeClass("ui-disabled");
+ }
+}
+
+function Next() {
+ testTarget=document.getElementById("MediaPlayback");
+ var fileName = getFileName(testTarget.src);
+ for(i=0;i<3;i++) {
+ if(fileName != videoFileList[i])
+ continue;
+ else
+ break;
+ }
+ if(i < 1) {
+ testTarget.src="../../res/media/meego/"+videoFileList[i+1];
+ testTarget.play();
+ $("#previous").removeClass("ui-disabled");
+ }else {
+ testTarget.src="../../res/media/meego/"+videoFileList[i+1];
+ testTarget.play();
+ $("#next").addClass("ui-disabled");
+ $("#previous").removeClass("ui-disabled");
+ EnablePassButton();
+ }
+}
+
+function getFileName(o){
+ var pos=o.lastIndexOf("/");
+ return o.substring(pos+1);
+}
--- /dev/null
+Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+Copyright (c) 2012 Intel Corporation.
+Except as noted, this software is licensed under Apache License, Version 2 or BSD-3-Clause License.
+Please, see the LICENSE.Apache-2.0 file for Apache License, Version 2 terms and conditions
+or the LICENSE.BSD-3 file for BSD-3-Clause License.
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Samsung Electronics 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.
+
+Authors:
+ Choi, Jongheon <j-h.choi@samsung.com>
+
+-->
+<html>
+<head>
+<meta charset="utf-8" />
+<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+<link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+<script src="../../js/thirdparty/jquery.js"></script>
+<script src="../../js/thirdparty/jquery.mobile.js"></script>
+<script src="../../js/tests.js"></script>
+<script src="js/main.js"></script>
+</head>
+<body>
+<div data-role="page">
+ <div data-role="header" data-position="fixed" data-tap-toggle="false">
+ <h1 id="main_page_title"></h1>
+ </div>
+
+ <div id="content">
+ <ul data-role="listview">
+ <!-- <li data-role="list-divider">Email Precondition</li>
+ <li>
+ <div data-role="button" onclick="account();">Email Account Set</div>
+ </li> -->
+ <li data-role="list-divider">Recipient</li>
+ <li>
+ <input id="email" type="email" value="" />
+ </li>
+ <li data-role="list-divider">CC</li>
+ <li>
+ <input id="cc" type="email" value="" />
+ </li>
+ <li data-role="list-divider">BCC</li>
+ <li>
+ <input id="bcc" type="email" value="" />
+ </li>
+ <li data-role="list-divider">Title</li>
+ <li>
+ <input type="text" id="title" value="Behavior_Test E-mail" />
+ </li>
+ <li data-role="list-divider">Email Content</li>
+ <li>
+ <textarea id="emailContent" style="min-height:200px; width:99%;">Behavior_Test_Messaging_Email</textarea>
+ </li>
+ <li data-role="list-divider">Attachments</li>
+ <li>
+ <div data-role="button" id="addAttach">Add attachment</div>
+ </li>
+ </ul>
+ <ul data-role="listview" id="attachmentsList" style="font-size:12pt; word-wrap:break-word;"></ul>
+ <ul data-role="listview">
+ <li data-role="list-divider">Email Send</li>
+ <li>
+ <div data-role="button" id="send">Email Send</div>
+ </li>
+ </ul>
+ </div>
+
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font style="font-size:85%">
+ <p>Check if the email is successfully sent</p><br>
+ <p>1. Fill in Recipient, CC, BCC, Title, Email Content fields</p>
+ <p>2. Select Add attachment and pick an attachment</p>
+ <p>3. Select Email Send</p>
+ <p>4. Check if the email is successfully sent(Check Recipient, CC, BCC accounts to varify the delivery)</p>
+ </font>
+ </div>
+</div>
+</body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Samsung Electronics 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.
+
+Authors:
+ Choi, Jongheon <j-h.choi@samsung.com>
+
+*/
+
+var errorMessage = '',
+ emailReg = /^([\w\-\.]+@([\w\-]+\.)+[\w\-]{2,4})?$/,
+ emailArray = [],
+ numberOfBadEmails = 0,
+ app = {
+ attach: []
+ };
+
+function replaceAll(txt, replace, with_this) {
+ return txt.replace(new RegExp(replace, 'g'), with_this);
+}
+
+function verifyEmail() {
+ var result = false, i, tempEmail, email = $('#email').val(), tab = null;
+
+ if (email === '') {
+ errorMessage = 'Enter email address';
+ } else {
+ numberOfBadEmails = 0;
+ emailArray = [];
+ tab = email.split(/[,; ]/);
+ for (i = 0; i < tab.length; i += 1) {
+ tempEmail = $.trim(tab[i]);
+ if (tempEmail !== '') {
+ if (emailReg.test(tempEmail)) {
+ emailArray.push(tempEmail);
+ } else {
+ numberOfBadEmails += 1;
+ }
+ }
+ }
+ if (emailArray.length > 0 && numberOfBadEmails === 0) {
+ result = true;
+ } else {
+ if (numberOfBadEmails === 1) {
+ errorMessage = 'one email address is incorrect';
+ } else {
+ errorMessage = numberOfBadEmails + ' email addresses are incorrect';
+ }
+ }
+ }
+
+ return result;
+}
+
+function verifyTitle() {
+ var result = false,
+ title = $('#title').val();
+
+ if (title === '') {
+ errorMessage = 'enter email title';
+ } else {
+ result = true;
+ }
+
+ return result;
+}
+
+function verifyContent() {
+ var result = false,
+ content = $('#emailContent').val();
+
+ if (content === '') {
+ errorMessage = 'Enter email content';
+ } else {
+ result = true;
+ }
+
+ return result;
+}
+
+function createAttachList(element) {
+ return ('<li><div>' + element + '</div></li>');
+}
+
+function attachListUpdate() {
+ var fileName = 'filename', size = '0kB', i, len;
+ $('#attachmentsList').replaceWith($('<ul data-role="listview" id="attachmentsList"></ul>'));
+
+ for (i = 0, len = app.attach.length; i < len; i += 1) {
+ $('#attachmentsList').append(createAttachList(app.attach[i]));
+ }
+
+ $('#attachmentsList').trigger('create');
+}
+
+// Define the success callback.
+function messageSent() {
+ app.attach = [];
+ attachListUpdate();
+ alert('Email was sent');
+}
+
+// Define the error callback.
+function messageFailed(error) {
+ alert('Error occured while sending the message!');
+}
+
+// workaround for launch accounts settings;
+function runEmailService() {
+ var apps = "";
+ function onGetInfo(data) {
+ for (var i = 0; i < data.length; i++)
+ {
+ if(data[i].id == "setting-myaccount-efl")
+ apps = data[i].id;
+ }
+ if (apps) {
+ tizen.application.launch(apps);
+ } else {
+ alert('Account settings cannot be launched. Please configure email account by system options.');
+ }
+ }
+ tizen.application.getAppsInfo(onGetInfo);
+}
+
+function virtualAttachmentPath(absolutePath) {
+ absolutePath = absolutePath.replace(/^\/opt\/usr\/media\//, "");
+ var parts = absolutePath.split("/");
+ switch (parts[0]) {
+ case "Images":
+ parts[0] = "images";
+ break;
+ case "Videos":
+ parts[0] = "videos";
+ break;
+ case "Sounds":
+ parts[0] = "music";
+ break;
+ case "Documents":
+ parts[0] = "documents";
+ break;
+ case "Downloads":
+ parts[0] = "downloads";
+ break;
+ default:
+ return null;
+ }
+ return parts.join("/");
+}
+
+// Define the success callback.
+function serviceListCB(services) {
+ var i, len, msgService, email, tmpArray = [], name, vname;
+ function split(str) {
+ return str.split(/[,; ]/).filter(function (item) {
+ return (item.trim() !== '');
+ });
+ }
+
+ if (services.length > 0) {
+ msgService = services[0];
+ alert('Sending an Email(takes about 1 minute)');
+
+ email = new tizen.Message('messaging.email');
+ email.subject = $('#title').val();
+ email.to = split($('#email').val());
+ email.cc = split($('#cc').val());
+ email.bcc = split($('#bcc').val());
+ email.body.plainBody = $('#emailContent').val();
+ email.body.htmlBody = "<div>" + $("#emailContent").val();
+
+ for (i = 0, len = app.attach.length; i < len; i += 1) {
+ name = app.attach[i];
+ vname = virtualAttachmentPath(name);
+ try {
+ tmpArray.push(new tizen.MessageAttachment(vname));
+ } catch (err) {
+ alert("Attachment could not be added:\n" + name);
+ }
+ }
+ email.attachments = tmpArray;
+
+ // Send request
+ msgService.sendMessage(email, messageSent, messageFailed);
+ } else {
+ if (confirm('This application for proper running requires configure email account.\n Do you want configure account now?')) {
+ runEmailService();
+ }
+ }
+}
+
+function serviceListError(e) {
+ alert('err: ' + e.message);
+}
+
+function sendMessage() {
+ try {
+ tizen.messaging.getMessageServices("messaging.email", serviceListCB, serviceListError);
+ } catch (e) {
+ alert('err: ' + e.message);
+ }
+}
+
+function startFileManager() {
+ function getDataFromFileManager(data) {
+ app.attach.push(data[0].value[0]);
+ attachListUpdate();
+ }
+
+ var serviceRequest = new tizen.ApplicationControl('http://tizen.org/appcontrol/operation/pick', null, '*/*');
+
+ var appControlReplyCB = {
+ onsuccess: getDataFromFileManager,
+ onfailure: function() {}
+ };
+
+ try {
+ tizen.application.launchAppControl(serviceRequest, null,
+ function() {
+ console.log("launch appControl succeeded");
+ },
+ function(e) {
+ alert("launch appControl failed. Reason: " + e.message);
+ },
+ appControlReplyCB);
+ } catch(e) {
+ alert("launch appControl error: " + e.message);
+ }
+}
+
+function init() {
+ $('#send').bind('click', function (event) {
+ if (verifyEmail() && verifyTitle() && verifyContent()) {
+ sendMessage();
+ } else {
+ alert(errorMessage);
+ }
+ });
+ $('#addAttach').bind('click', function (event) {
+ startFileManager();
+ });
+}
+
+$(document).ready(init);
\ No newline at end of file
--- /dev/null
+Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+Copyright (c) 2012 Intel Corporation.
+Except as noted, this software is licensed under Apache License, Version 2 or BSD-3-Clause License.
+Please, see the LICENSE.Apache-2.0 file for Apache License, Version 2 terms and conditions
+or the LICENSE.BSD-3 file for BSD-3-Clause License.
+
+Following resources are licensed under its own license.
+
+res/image.png :
+Copyright (c) 2012 Samsung Electronics Co., Ltd. All right reserved.
+The above resource files are licensed under Creative Commons Attribution 3.0.
+Please see the LICENSE.CC-BY-3.0 for Creative Commons Attribution 3.0 terms and conditions.
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Samsung Electronics 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.
+
+Authors:
+ Choi, Jongheon <j-h.choi@samsung.com>
+
+-->
+<html>
+<head>
+<meta charset="utf-8" />
+<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+<link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+<script src="../../js/thirdparty/jquery.js"></script>
+<script src="../../js/thirdparty/jquery.mobile.js"></script>
+<script src="../../js/tests.js"></script>
+<script src="js/main.js"></script>
+</head>
+<body>
+ <div data-role="page" id="main">
+ <div data-role="header" data-position="fixed" data-tap-toggle="false">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div id="content">
+ <ul data-role="listview" id="list">
+ <li data-role="list-divider">Recipient</li>
+ <li><input type="tel" id="tel" value="" /></li>
+ <li data-role="list-divider">Send Message</li>
+ <li><div data-role="button" id="sms">SMS</div></li>
+ <li><div data-role="button" id="mms">MMS</div></li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font style="font-size:85%">
+ <p>Check if SMS/MMS is sent properly</p><br>
+ <p>1. Fill in Recipient</p>
+ <p>2. Select SMS Send</p>
+ <p>3. Select MMS Send</p>
+ <p>4. Check if the SMS/MMS is successfully sent</p>
+ </font>
+ </div>
+ </div>
+</body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Samsung Electronics 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.
+
+Authors:
+ Choi, Jongheon <j-h.choi@samsung.com>
+
+*/
+
+var h, m, s, day, year, month, date;
+var deviceCapabilities;
+
+$(document).delegate("#main", "pageinit", function() {
+ $("#sms").bind("vclick", function() {
+ tizen.messaging.getMessageServices("messaging.sms", smsSuccessCallback, errorCallback);
+ });
+ $("#mms").bind("vclick", function() {
+ tizen.messaging.getMessageServices("messaging.mms", mmsSuccessCallback, errorCallback);
+ });
+ deviceCapabilities = tizen.systeminfo.getCapabilities();
+ if(!deviceCapabilities.telephonyMms) {
+ $("#mms").addClass("ui-disabled");
+ }
+});
+
+function checkTime(i) {
+ if (i < 10) {
+ i = "0" + i;
+ }
+ return i;
+}
+
+function checkDay(i) {
+ switch(i)
+ {
+ case 0:
+ i = "Sunday";
+ break;
+ case 1:
+ i = "Monday";
+ break;
+ case 2:
+ i = "Tuesday";
+ break;
+ case 3:
+ i = "Wednesday";
+ break;
+ case 4:
+ i = "Thursday";
+ break;
+ case 5:
+ i = "Friday";
+ break;
+ case 6:
+ i = "Saturday";
+ break;
+ }
+ return i;
+}
+
+function checkMonth(i) {
+ switch(i)
+ {
+ case 0:
+ i = "January";
+ break;
+ case 1:
+ i = "February";
+ break;
+ case 2:
+ i = "March";
+ break;
+ case 3:
+ i = "April";
+ break;
+ case 4:
+ i = "May";
+ break;
+ case 5:
+ i = "June";
+ break;
+ case 6:
+ i = "July";
+ break;
+ case 7:
+ i = "August";
+ break;
+ case 8:
+ i = "September";
+ break;
+ case 9:
+ i = "October";
+ break;
+ case 10:
+ i = "November";
+ break;
+ case 11:
+ i = "December";
+ break;
+ }
+ return i;
+}
+
+function currentTime() {
+ h = new Date().getHours();
+ m = new Date().getMinutes();
+ s = new Date().getSeconds();
+ day = new Date().getDay();
+ month = new Date().getMonth();
+ date = new Date().getDate();
+ year = new Date().getFullYear();
+ h = checkTime(h);
+ m = checkTime(m);
+ s = checkTime(s);
+ day = checkDay(day);
+ month = checkMonth(month);
+}
+
+function smsSuccessCallback(services) {
+ currentTime();
+ if (services.length > 0) {
+ var sms = new tizen.Message("messaging.sms");
+ sms.body.plainBody = "BehaviorTC SMS Messaging Test\n" + h + ":" + m + ":" + s;
+ sms.to = [$("#tel").val()];
+ services[0].sendMessage(sms, messageSent, messageFailed);
+ }
+}
+
+function mmsSuccessCallback(services) {
+ currentTime();
+ if (services.length > 0) {
+ var mms = new tizen.Message("messaging.mms");
+ mms.body.plainBody = "BehaviorTC MMS Messaging Test\n" + day + ", " + month + " " + date + ", " + year + ". " + h + ":" + m + ":" + s;
+ mms.to = [$("#tel").val()];
+ mms.subject = "BehaviorTC Messaging Test";
+ mms.attachments = [new tizen.MessageAttachment("wgt-package/tests/MessagingSMSMMS/res/image.png", "image/png")];
+ services[0].sendMessage(mms, messageSent, messageFailed);
+ }
+}
+
+function messageSent(recipients) {
+ alert("Message sent successfully to " + recipients.length + " recipients.");
+}
+
+function messageFailed(error) {
+ alert('Error occured while sending the message! ' + error.message);
+}
+
+function errorCallback(error) {
+ alert("Cannot get messaging service " + error.message);
+}
\ No newline at end of file
--- /dev/null
+Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+Copyright (c) 2012 Intel Corporation.
+Except as noted, this software is licensed under Apache License, Version 2 or BSD-3-Clause License.
+Please, see the LICENSE.Apache-2.0 file for Apache License, Version 2 terms and conditions
+or the LICENSE.BSD-3 file for BSD-3-Clause License.
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Samsung Electronics 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.
+
+Authors:
+ Choi, Jongheon <j-h.choi@samsung.com>
+
+-->
+<html>
+<head>
+<meta charset="utf-8" />
+<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+<link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+<script src="../../js/thirdparty/jquery.js"></script>
+<script src="../../js/thirdparty/jquery.mobile.js"></script>
+<script src="../../js/tests.js"></script>
+<script src="js/main.js"></script>
+</head>
+<body>
+ <div data-role="page" id="main">
+ <div data-role="header" data-position="fixed" data-tap-toggle="false">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div id="content">
+ <ul data-role="listview" id="list">
+ <li data-role="list-divider">NFC Write Message</li>
+ <li><input type="text" id="wmsg" value="BehaviorNFC"/></li>
+ <li data-role="list-divider">NFC Tag Test</li>
+ <li><div data-role="button" id="write">Write to card</div></li>
+ <li><div data-role="button" id="read">Read from card</div></li>
+ <li data-role="list-divider">NFC Read Message</li>
+ <li><label id="rmsg">Receive : </label></li>
+ <li data-role="list-divider">NFC Peer Test</li>
+ <li><div data-role="button" id="communicate">Communicate with another device</div></li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font style="font-size:85%">
+ <p>Check NFC communication</p><br>
+ <p>1. Fill in NFC Write Message</p>
+ <p>2. Click Write to card and Place the NFC Tag to device</p>
+ <p>3. Check the Write Message</p>
+ <p>4. Click Read from card and Place the NFC Tag to device</p>
+ <p>5. Check the Read Message</p>
+ <p>6. Click Communicate with another device and Connected two device which are operated NFC</p>
+ <p>7. Check the Receive Message</p>
+ </font>
+ </div>
+ </div>
+</body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Samsung Electronics 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.
+
+Authors:
+ Choi, Jongheon <j-h.choi@samsung.com>
+
+ */
+
+var writeMessage = "", readMessage = "", newMessage = "";
+var nfcFlag;
+
+$(document).delegate("#main", "pageinit", function() {
+ $("#read").bind("vclick", function() {
+ nfcFlag = false;
+ alert("Read NFC Tag\nPlace the NFC Tag to device");
+ });
+ $("#write").bind("vclick", function() {
+ writeMsg();
+ if(writeMessage != "") {
+ nfcFlag = true;
+ alert("Write NFC Tag\nPlace the NFC Tag to device");
+ }
+ });
+ $("#communicate").bind("vclick", function() {
+ writeMsg();
+ if(writeMessage != "")
+ alert("Peer to Peer NFC\nConnected two device which are operated NFC");
+ });
+ try {
+ tizen.nfc.setExclusiveMode(true) ;
+ } catch (err) {
+ console.log (err.name + ": " + err.message);
+ }
+ setPower(function(){
+ setTagListener();
+ setPeerListener();
+ });
+});
+
+function writeMsg() {
+ newMessage = new tizen.NDEFMessage();
+ writeMessage = $("#wmsg").val();
+ if(writeMessage == "") {
+ alert("Fill in NFC Write Message");
+ nfcFlag = null;
+ }
+ else
+ newMessage.records[0] = new tizen.NDEFRecordText(writeMessage, "en-US");
+}
+
+function setPower(onpowered) {
+ var gNfcAdapter;
+ try {
+ gNfcAdapter = tizen.nfc.getDefaultAdapter();
+ if (!gNfcAdapter.powered) {
+ gNfcAdapter.setPowered(
+ true,
+ function () {onpowered();console.log("Power on succeed");},
+ function () {console.log("Power on failed")});
+ } else {
+ onpowered();
+ }
+ } catch (err) {
+ console.log (err.name + ": " + err.message);
+ }
+}
+
+function setTagListener() {
+ var adapter = tizen.nfc.getDefaultAdapter();
+ var onSuccessCB = {
+ onattach : function(nfcTag) {
+ console.log("NFC Tag's type is " + nfcTag.type);
+ if(nfcFlag == false)
+ {
+ try {
+ nfcTag.readNDEF(
+ function(message){
+ readMessage = message.records[0].text;
+ alert("Read message : " + readMessage);
+ document.getElementById("rmsg").innerHTML = readMessage;
+ },
+ function(e){
+ console.log(e.message);
+ });
+ } catch (err) {
+ console.log (err.name + ": " + err.message);
+ }
+ }
+ if(nfcFlag == true)
+ {
+ try {
+ nfcTag.writeNDEF(
+ newMessage,
+ function(){
+ alert("Write message : " + writeMessage);
+ },
+ function(e){
+ console.log(e.message);
+ });
+ } catch (err) {
+ console.log (err.name + ": " + err.message);
+ }
+ }
+ },
+ ondetach : function() {
+ console.log("NFC Tag is detached");
+ }};
+ function unsetListen() {
+ adapter.unsetTagListener();
+ }
+ adapter.setTagListener(onSuccessCB);
+}
+
+function setPeerListener() {
+ var adapter = tizen.nfc.getDefaultAdapter();
+ var onSuccessCB = {
+ onattach : function(nfcPeer) {
+ console.log("NFC Target is detected");
+
+ nfcPeer.setReceiveNDEFListener(
+ function(message){
+ readMessage = message.records[0].text;
+ alert("Receive message : " + readMessage);
+ document.getElementById("rmsg").innerHTML = readMessage;
+ nfcPeer.unsetReceiveNDEFListener();
+ });
+ nfcPeer.sendNDEF(
+ newMessage,
+ function(){
+ console.log("Send message");
+ },
+ function(e){
+ console.log(e.message);
+ });
+ },
+ ondetach : function() {
+ console.log("NFC Target is detached");
+ }};
+ function unsetListen() {
+ adapter.unsetPeerListener();
+ }
+ adapter.setPeerListener(onSuccessCB);
+}
\ No newline at end of file
--- /dev/null
+Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+Copyright (c) 2012 Intel Corporation.
+Except as noted, this software is licensed under Apache License, Version 2 or BSD-3-Clause License.
+Please, see the LICENSE.Apache-2.0 file for Apache License, Version 2 terms and conditions
+or the LICENSE.BSD-3 file for BSD-3-Clause License.
+
+Following resources are licensed under its own license.
+
+res/TestNotification,
+res/noti.png,
+res/noti1,png,
+res/noti2.png,
+res/noti3.png,
+res/noti4.png,
+res/notification.wav :
+Copyright (c) 2012 Samsung Electronics Co., Ltd. All right reserved.
+The above resource files are licensed under Creative Commons Attribution 3.0.
+Please see the LICENSE.CC-BY-3.0 for Creative Commons Attribution 3.0 terms and conditions.
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Samsung Electronics 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.
+
+Authors:
+ Choi, Jongheon <j-h.choi@samsung.com>
+
+-->
+<html>
+<head>
+<meta charset="utf-8" />
+<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+<link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+<script src="../../js/thirdparty/jquery.js"></script>
+<script src="../../js/thirdparty/jquery.mobile.js"></script>
+<script src="../../js/tests.js"></script>
+<script src="js/main.js"></script>
+</head>
+<body>
+ <div data-role="page" id="main">
+ <div data-role="header" data-position="fixed" data-tap-toggle="false">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div id="content">
+ <ul data-role="listview">
+ <li data-role="list-divider">NotificationTest Install</li>
+ <li>
+ <div data-role="button" id="install" style="height:40px; line-height:20px;">NotificationTest Install</div>
+ </li>
+ </ul>
+ <ul data-role="listview">
+ <li data-role="list-divider">Notification Add</li>
+ <li>
+ <div data-role="button" id="noti-type-simple">SIMPLE Notification</div>
+ </li>
+ <li>
+ <div data-role="button" id="noti-type-ongoing">ONGOING Notification</div>
+ </li>
+ <li>
+ <div data-role="button" id="noti-type-progress">PROGRESS Notification</div>
+ </li>
+ <li>
+ <div data-role="button" id="noti-type-thumbnail">THUMBNAIL Notification</div>
+ </li>
+ <li data-role="list-divider">Notification List</li>
+ </ul>
+ <ul data-role="listview" id="noti-list"></ul>
+ <ul data-role="listview">
+ <li data-role="list-divider">Notification Delete</li>
+ <li>
+ <div data-role="button" id="delete-all">Delete All</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font style="font-size:85%">
+ <p>Check if a notification is successfully posted</p><br>
+ <p># Simple Notification</p>
+ <p>1. Install NotificationTest</p>
+ <p>(This application is used to verify AppControl in Notification.)</p>
+ <p>2. Click SIMPLE Notification</p>
+ <p>3. Check notification tray if a simple notification is posted</p>
+ <p>4. Clicks the simple notification and check if a NotificationTest application is launched</p>
+ <p>5. In the mean time, check if the notification is disappeared</p><br>
+ <p># Ongoing Notification</p>
+ <p>1. Click ONGOING Notification</p>
+ <p>2. Check notification tray if a ongoing notification is posted</p>
+ <p>3. Clicks the ongoing notification and check if it is NOT disappeared</p>
+ <p>4. Remove the ongoing notification by clicking Delete in the Notification List</p><br>
+ <p># Progress Notification</p>
+ <p>1. Click PROGRESS Notification</p>
+ <p>2. Check notification tray if a progress notification is posted</p>
+ <p>(The progress notification shows a bar that shows the current progress)</p>
+ <p>3. Clicks the progress notification and check if it is NOT disappeared</p>
+ <p>4. Remove the progress notification by clicking Delete in the Notification List</p><br>
+ <p># Thumbnail Notification</p>
+ <p>1. Click THUMBNAIL Notification</p>
+ <p>2. Check notification tray if a thumbnail notification is posted</p>
+ <p>3. Clicks the thumbnail notification and check if it is disappeared</p>
+ </font>
+ </div>
+ </div>
+</body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Samsung Electronics 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.
+
+Authors:
+ Choi, Jongheon <j-h.choi@samsung.com>
+
+*/
+
+var gCurrentNoti;
+var iconPath, soundPath, thumbnailPath1, thumbnailPath2, thumbnailPath3, thumbnailPath4;
+
+var init = function () {
+ showNotifications();
+ setTimeout(init, 500);
+};
+
+$(document).delegate("#main", "pageinit", function() {
+ $("#noti-list").delegate("div", "vclick", function() {
+ var id = $(this).parent().data("id");
+
+ try {
+ tizen.notification.remove(id);
+ alert("Notification delete");
+ } catch (exc) {
+ alert("notification.remove failed: " + exc.message);
+ }
+ showNotifications();
+ return false;
+ });
+ $("#delete-all").bind("vclick", function() {
+ try {
+ tizen.notification.removeAll();
+ alert("Notification delete all");
+ } catch (exc) {
+ alert("notification.removeAll failed: " + exc.message);
+ }
+ showNotifications();
+ return false;
+ });
+ $("#noti-type-simple").bind("vclick", function() {
+ postNotification("SIMPLE");
+ showNotifications();
+ $("#delete-all").removeClass("ui-disabled");
+ return false;
+ });
+ $("#noti-type-ongoing").bind("vclick", function() {
+ postNotification("ONGOING");
+ showNotifications();
+ $("#delete-all").removeClass("ui-disabled");
+ return false;
+ });
+ $("#noti-type-progress").bind("vclick", function() {
+ postNotification("PROGRESS");
+ showNotifications();
+ $("#delete-all").removeClass("ui-disabled");
+ return false;
+ });
+ $("#noti-type-thumbnail").bind("vclick", function() {
+ postNotification("THUMBNAIL");
+ showNotifications();
+ $("#delete-all").removeClass("ui-disabled");
+ return false;
+ });
+ $("#install").bind("vclick", function() {
+ install(installUrl);
+ $("#noti-type-simple").removeClass("ui-disabled");
+ $("#noti-type-ongoing").removeClass("ui-disabled");
+ $("#noti-type-progress").removeClass("ui-disabled");
+ $("#noti-type-thumbnail").removeClass("ui-disabled");
+ return false;
+ });
+ $("#noti-type-simple").addClass("ui-disabled");
+ $("#noti-type-ongoing").addClass("ui-disabled");
+ $("#noti-type-progress").addClass("ui-disabled");
+ $("#noti-type-thumbnail").addClass("ui-disabled");
+ $("#delete-all").addClass("ui-disabled");
+ try {
+ tizen.package.setPackageInfoEventListener(packageEventCallback);
+ } catch (e) {
+ alert("Exception: " + e.message);
+ }
+ notificationPre();
+});
+
+function showNotifications() {
+ var notiArray, str = "";
+
+ try {
+ notiArray = tizen.notification.getAll();
+ } catch (exc) {
+ alert("notification.getAll failed");
+ return;
+ }
+
+ for (var i = 0; i < notiArray.length; i++) {
+ str += '<li data-id="'
+ + notiArray[i].id
+ + '">'
+ + notiArray[i].title
+ //+ ' ('
+ //+ notiArray[i].statusType
+ //+ ')'
+ + '<div data-role="button" data-inline="true">Delete</div></li>';
+ }
+ $("#noti-list").html(str).trigger("create").listview("refresh");
+}
+
+function postNotification(type) {
+ var title = "";
+ var appControl = new tizen.ApplicationControl("http://tizen.org/appcontrol/operation/view", null, null, null);
+ var notiDict = {
+ iconPath : iconPath,
+ soundPath : soundPath,
+ vibration : true,
+ ledColor : "#4B0082",
+ ledOnPeriod : 1000,
+ ledOffPeriod : 500
+ };
+ if (type == "SIMPLE") {
+ notiDict.content = "A touch to the notification makes it disappeared";
+ title = "SIMPLE_Notification";
+ notiDict.appId = "bhvtcnotif.NotificationTest";
+ }
+ if (type == "PROGRESS") {
+ notiDict.content = "A touch to the notification does not make it disappeared";
+ title = "PROGRESS_Notification";
+ notiDict.progressValue = 20;
+ }
+ if (type == "ONGOING") {
+ notiDict.content = "A touch to the notification does not make it disappeared";
+ title = "ONGOING_Notification";
+ }
+ if (type == "THUMBNAIL") {
+ notiDict.content = "A touch to the notification makes it disappeared";
+ title = "THUMBNAIL_Notification";
+ notiDict.thumbnails = [thumbnailPath1, thumbnailPath2, thumbnailPath3, thumbnailPath4];
+ }
+ try {
+ var noti = new tizen.StatusNotification(type, title, notiDict);
+ tizen.notification.post(noti);
+ alert(type + " Notification Add");
+ setTimeout(update, 3000);
+ } catch (exc) {
+ alert("notification.post failed: " + exc.message);
+ }
+
+ function update() {
+ noti.progressValue = 63;
+ tizen.notification.update(noti);
+ }
+}
+
+function fileURI() {
+ var documentsDir;
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ if(files[i].name == "TestNotification.wgt")
+ {
+ var Url1 = files[i].toURI();
+ installUrl = Url1.replace("file:///", "/");
+ }
+ }
+ }
+
+ function onerror(error) {
+ alert("The error " + error.message + " occurred when listing the files in the selected folder");
+ }
+
+ tizen.filesystem.resolve(
+ 'documents',
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error " + e.message);
+ }, "r"
+ );
+}
+
+function install(url) {
+ var onInstallationSuccess = {
+ onprogress: function(packageId, percentage)
+ {
+ console.log("On installation(" + packageId + "): progress(" + percentage + ")");
+ document.getElementById("install").innerHTML = '<div data-role="button" id="install" style="height:40px; line-height:40px;">Installing... ' + percentage + "%" + '</div>';
+ },
+ oncomplete: function(packageId)
+ {
+ console.log("Installation(" + packageId + ") Complete");
+ document.getElementById("install").innerHTML = '<div data-role="button" id="install" style="height:40px; line-height:40px;">NotificationTest Install</div>';
+ }
+ }
+
+ var onError = function (err) {
+ alert("Error occured on installation : " + err.message);
+ }
+
+ try {
+ tizen.package.install(url, onInstallationSuccess, onError);
+ } catch (e) {
+ alert("Exception: " + e.name);
+ }
+}
+
+var packageEventCallback = {
+ oninstalled: function(packageInfo) {
+ alert("The package " + packageInfo.name + " is installed");
+ },
+ onupdated: function(packageInfo) {
+ alert("The package " + packageInfo.name + " is updated");
+ },
+ onuninstalled: function(packageId) {
+ alert("The package " + packageId + " is uninstalled");
+ }
+};
+
+function notificationPre() {
+ var documentsDir;
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ if(files[i].name == "TestNotification")
+ {
+ documentsDir.copyTo(
+ files[i].fullPath,
+ "documents/TestNotification.wgt",
+ true,
+ function() {
+ console.log("Notification Precondition Success(1)!");
+ });
+ }
+ if(files[i].name == "notification.wav")
+ {
+ soundPath = files[i].toURI();
+ soundPath = soundPath.replace("file:///", "/");
+ }
+ if(files[i].name == "noti.png")
+ {
+ iconPath = files[i].toURI();
+ iconPath = iconPath.replace("file:///", "/");
+ }
+ if(files[i].name == "noti1.png")
+ {
+ thumbnailPath1 = files[i].toURI();
+ thumbnailPath1 = thumbnailPath1.replace("file:///", "/");
+ }
+ if(files[i].name == "noti2.png")
+ {
+ thumbnailPath2 = files[i].toURI();
+ thumbnailPath2 = thumbnailPath2.replace("file:///", "/");
+ }
+ if(files[i].name == "noti3.png")
+ {
+ thumbnailPath3 = files[i].toURI();
+ thumbnailPath3 = thumbnailPath3.replace("file:///", "/");
+ }
+ if(files[i].name == "noti4.png")
+ {
+ thumbnailPath4 = files[i].toURI();
+ thumbnailPath4 = thumbnailPath4.replace("file:///", "/");
+ }
+ }
+ fileURI();
+ }
+
+ function onerror(error) {
+ alert("The error " + error.message + " occurred when listing the files in the selected folder");
+ }
+
+ tizen.filesystem.resolve(
+ 'wgt-package/tests/Notification/res/',
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error " + e.message);
+ }, "r"
+ );
+}
+$(document).bind('pageinit', init);
--- /dev/null
+Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+Copyright (c) 2012 Intel Corporation.
+Except as noted, this software is licensed under Apache License, Version 2 or BSD-3-Clause License.
+Please, see the LICENSE.Apache-2.0 file for Apache License, Version 2 terms and conditions
+or the LICENSE.BSD-3 file for BSD-3-Clause License.
+
+Following resources are licensed under its own license.
+
+res/TestPackage1,
+res/TestPackage2 :
+Copyright (c) 2012 Samsung Electronics Co., Ltd. All right reserved.
+The above resource files are licensed under Creative Commons Attribution 3.0.
+Please see the LICENSE.CC-BY-3.0 for Creative Commons Attribution 3.0 terms and conditions.
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Samsung Electronics 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.
+
+Authors:
+ Choi, Jongheon <j-h.choi@samsung.com>
+
+-->
+<html>
+<head>
+<meta charset="utf-8" />
+<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+<link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+<script src="../../js/thirdparty/jquery.js"></script>
+<script src="../../js/thirdparty/jquery.mobile.js"></script>
+<script src="../../js/tests.js"></script>
+<script src="js/main.js"></script>
+</head>
+<body>
+ <div data-role="page" id="main">
+ <div data-role="header" data-position="fixed" data-tap-toggle="false">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div id="content">
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" style="height:40px; line-height:20px;">TestPackage1 Install</div>
+ </li>
+ <li data-role="list-divider">TestPackage Application Launch</li>
+ <li>
+ <div data-role="button" id="launch1">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Update</li>
+ <li>
+ <div data-role="button" id="update" style="height:40px; line-height:20px;">TestPackage2 Update</div>
+ </li>
+ <li data-role="list-divider">TestPackage Application Launch</li>
+ <li>
+ <div data-role="button" id="launch2">Launch</div>
+ </li>
+ <li data-role="list-divider">Package UnInstall</li>
+ <li>
+ <div data-role="button" id="uninstall" style="height:40px; line-height:20px;">TestPackage UnInstall</div>
+ </li>
+ <li data-role="list-divider">TestPackage Application Launch</li>
+ <li>
+ <div data-role="button" id="launch3">Launch</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font style="font-size:85%">
+ <p>Check if Package is successfully installed, updated and uninstalled</p><br>
+ <p>1. Install TestPackage1</p>
+ <p>2. Launch TestPackage1</p>
+ <p>3. Check if TestPackage is launched successfully</p>
+ <p>4. Automatically write the text('Package_Test') and click the OK button</p>
+ <p>5. Check the PASS text
+ <p>6. Update TestPackage2</p>
+ <p>7. Launch TestPackage2</p>
+ <p>8. Check if TestPackage is updated and launched successfully</p>
+ <p>9. Automatically read the text('Package_Test') and click the OK button</p>
+ <p>10. Check the PASS text
+ <p>11. Uninstall TestPackage</p>
+ <p>12. Launch TestPackage and check it fails</p>
+ </font>
+ </div>
+ </div>
+</body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Samsung Electronics 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.
+
+Authors:
+ Choi, Jongheon <j-h.choi@samsung.com>
+
+ */
+
+var installUrl, updateUrl;
+var flag = false;
+$(document).delegate("#main", "pageinit", function() {
+ $("#install").bind("vclick", function() {
+ install(installUrl, "install");
+ $("#launch1").removeClass("ui-disabled");
+ });
+ $("#uninstall").bind("vclick", function() {
+ uninstall();
+ $("#launch3").removeClass("ui-disabled");
+ $("#launch2").addClass("ui-disabled");
+ });
+ $("#update").bind("vclick", function() {
+ install(updateUrl, "update");
+ $("#launch2").removeClass("ui-disabled");
+ $("#launch1").addClass("ui-disabled");
+ });
+ $("#launch1").bind("vclick", function() {
+ launch();
+ $("#update").removeClass("ui-disabled");
+ });
+ $("#launch2").bind("vclick", function() {
+ launch();
+ $("#uninstall").removeClass("ui-disabled");
+ });
+ $("#launch3").bind("vclick", function() {
+ launch();
+ });
+ try {
+ tizen.package.setPackageInfoEventListener(packageEventCallback);
+ } catch (e) {
+ alert("Exception: " + e.message);
+ }
+ packagePre();
+ $("#launch1").addClass("ui-disabled");
+ $("#launch2").addClass("ui-disabled");
+ $("#launch3").addClass("ui-disabled");
+ $("#uninstall").addClass("ui-disabled");
+ $("#update").addClass("ui-disabled");
+});
+
+var packageEventCallback = {
+ oninstalled: function(packageInfo) {
+ alert("The package " + packageInfo.name + " is installed");
+ flag = true;
+ },
+ onupdated: function(packageInfo) {
+ alert("The package " + packageInfo.name + " is updated");
+ flag = true;
+ },
+ onuninstalled: function(packageId) {
+ alert("The package " + packageId + " is uninstalled");
+ flag = false;
+ }
+};
+
+function fileURI() {
+ var documentsDir;
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ if(files[i].name == "TestPackage1.wgt")
+ {
+ var Url1 = files[i].toURI();
+ installUrl = Url1.replace("file:///", "/");
+ }
+ if(files[i].name == "TestPackage2.wgt")
+ {
+ var Url2 = files[i].toURI();
+ updateUrl = Url2.replace("file:///", "/");
+ }
+ }
+ }
+
+ function onerror(error) {
+ alert("The error " + error.message + " occurred when listing the files in the selected folder");
+ }
+
+ tizen.filesystem.resolve(
+ 'documents',
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error " + e.message);
+ }, "r"
+ );
+}
+
+function install(url, type) {
+ var onInstallationSuccess = {
+ onprogress: function(packageId, percentage)
+ {
+ console.log("On installation(" + packageId + "): progress(" + percentage + ")");
+ if(type == "install")
+ document.getElementById("install").innerHTML = '<div data-role="button" id="install" style="height:40px; line-height:40px;">Installing... ' + percentage + "%" + '</div>';
+ if(type == "update")
+ document.getElementById("update").innerHTML = '<div data-role="button" id="update" style="height:40px; line-height:40px;">Updating... ' + percentage + "%" + '</div>';
+ },
+ oncomplete: function(packageId)
+ {
+ console.log("Installation(" + packageId + ") Complete");
+ if(type == "install"){
+ document.getElementById("install").innerHTML = '<div data-role="button" id="install" style="height:40px; line-height:40px;">TestPackage1 Install</div>';
+ $("#install").addClass("ui-disabled");
+ }
+ if(type == "update") {
+ document.getElementById("update").innerHTML = '<div data-role="button" id="update" style="height:40px; line-height:40px;">TestPackage2 Update</div>';
+ $("#update").addClass("ui-disabled");
+ }
+ }
+ }
+
+ var onError = function (err) {
+ alert("Error occured on installation : " + err.name);
+ }
+
+ try {
+ tizen.package.install(url, onInstallationSuccess, onError);
+ } catch (e) {
+ alert("Exception: " + e.name);
+ }
+}
+
+function uninstall() {
+ var onUninstallationSuccess = {
+ onprogress: function(packageId, percentage)
+ {
+ console.log("On uninstallation(" + packageId + "): progress(" + percentage + ")");
+ document.getElementById("uninstall").innerHTML = '<div data-role="button" id="uninstall" style="height:40px; line-height:40px;">UnInstalling... ' + percentage + "%" + '</div>';
+ },
+ oncomplete: function(packageId)
+ {
+ console.log("Uninstallation(" + packageId + ") Complete");
+ document.getElementById("uninstall").innerHTML = '<div data-role="button" id="uninstall" style="height:40px; line-height:40px;">TestPackage UnInstall</div>';
+ }
+ }
+
+ var onError = function (err) {
+ alert("Error occured on installation : " + err.name);
+ }
+
+ try {
+ if(flag == false)
+ alert("TestPackage is already Uninstalled or not Installed");
+ else
+ tizen.package.uninstall("bhvtcpacka", onUninstallationSuccess, onError);
+ } catch (e) {
+ alert("Exception: " + e.name);
+ }
+}
+
+function launch() {
+ function onSuccess() {
+ console.log("Application launched successfully");
+ }
+
+ function onError(err) {
+ alert("launch failed : " + err.message);
+ }
+
+ try {
+ tizen.application.launch("bhvtcpacka.TestPackage", onSuccess, onError);
+ } catch (exc) {
+ alert("launch exc:" + exc.message);
+ }
+}
+
+function packagePre() {
+ var documentsDir;
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ if(files[i].name == "TestPackage2")
+ {
+ documentsDir.copyTo(
+ files[i].fullPath,
+ "documents/TestPackage2.wgt",
+ true,
+ function() {
+ console.log("Package Precondition Success(1)!");
+ });
+ }
+ if(files[i].name == "TestPackage1")
+ {
+ documentsDir.copyTo(
+ files[i].fullPath,
+ "documents/TestPackage1.wgt",
+ true,
+ function() {
+ console.log("Package Precondition Success(2)!");
+ });
+ }
+ }
+ fileURI();
+ }
+
+ function onerror(error) {
+ alert("The error " + error.message + " occurred when listing the files in the selected folder");
+ }
+
+ tizen.filesystem.resolve(
+ 'wgt-package/tests/Package/res/',
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error " + e.message);
+ }, "r"
+ );
+}
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+ Xu, Kang <kangx.xu@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../css/main.css" />
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/tests.js"></script>
+ <script src="../../js/main.js"></script>
+ <script src="js/main.js"></script>
+ </head>
+ <body>
+ <input type="hidden" id="sub_test"/>
+ <div data-role="page" id="main">
+ <div data-role="header" data-position="fixed" data-tap-toggle="false">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div id="content">
+ <ul data-role="listview" id="cspList" data-divider-theme="b" data-inset="true">
+ <li data-role="list-divider" role="heading">Test PKManagement installation</li>
+ <li id="Sample-widget1">
+ <a href="javascript:runApp('res/Sample-widget1.html')" data-transition="slide" style="">
+ <h2>Sample-widget1</h2>
+ </a>
+ </li>
+ <li id="Sample-widget2">
+ <a href="javascript:runApp('res/Sample-widget2.html')" data-transition="slide" style="">
+ <h2>Sample-widget2</h2>
+ </a>
+ </li>
+ <li id="Sample-widget4">
+ <a href="javascript:runApp('res/Sample-widget4.html')" data-transition="slide" style="">
+ <h2>Sample-widget4</h2>
+ </a>
+ </li>
+ <li id="widget-version-1">
+ <a href="javascript:runApp('res/widget-version-1.html')" data-transition="slide" style="">
+ <h2>widget-version-1</h2>
+ </a>
+ </li>
+ <li data-role="list-divider" role="heading">Clean all the Installed packages</li>
+ <li>
+ <div data-role="button" id="wgtClean" class="wgtButton">Clean all test applications</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Note: </p>
+ <p>Verifies the functionality of installing, updating and uninstalling web applications.</p>
+ <p>Test Purpose: </p>
+ <p>Verifies WRT can manage web applications by installing, updating and uninstalling web applications.</p>
+ <p>Expected Result: </p>
+ <p>Test passes if all sub-tests pass.</p>
+ </font>
+ </div>
+ </div>
+ <div data-role="page" id="test_ui">
+ <iframe id="test_frame" width="100%" frameborder="no" border="0" src=""></iframe>
+ </div>
+ </body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.sandbox
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+*/
+var allId=new Array('wrt1wvt006',
+ 'wrt1smt007',
+ 'wrt1smt008',
+ 'wrt1smt010');
+
+var installedId = new Array();
+var resultXML, tests;
+var MOUDLE_NAME = "PackageManagement";
+var RESULT_FILE_NAME = "tct-behavior-child.pm.result.xml";
+
+$(document).delegate("#main", "pageinit", function() {
+ DisablePassButton();
+ $("#wgtClean").bind("vclick", function() {
+ showTotalBar();
+ });
+});
+
+function showTotalBar(){
+ $.each(allId,function(key,val){
+ try {
+ var packageInfo = tizen.package.getPackageInfo(val);
+ } catch (e) {
+ //alert("Exception: " + e.message);
+ }
+ if(packageInfo != "" && packageInfo != undefined){
+ installedId.push(val);
+ }
+ });
+ checkInstalledPackage();
+}
+
+function checkInstalledPackage(){
+ if(installedId.length > 0){
+ setTimeout(function() {
+ uninstall(installedId[0]);
+ }, 1000);
+ } else {
+ $.mobile.hidePageLoadingMsg();
+ alert("All widgets is uninstalled!");
+ if (checkIfAllPackagePass()) {
+ EnablePassButton();
+ }
+ }
+}
+
+function checkIfAllPackagePass() {
+ var result = true;
+
+ tests.each(function() {
+ if ($(this).attr('result') != "PASS") {
+ result = false;
+ }
+ });
+ return result;
+}
+
+function getPackageInfo(packageId){
+ var packageInfo = tizen.package.getPackageInfo(packageId);
+ console.log("Current Package ID : " + packageInfo.id);
+}
+
+function uninstall(val) {
+ installedId.shift();
+ var totalBar = Math.floor((allId.length - installedId.length - 1) / allId.length * 100);
+
+ var onUninstallationSuccess = {
+
+ onprogress: function(packageId, percentage)
+ {
+ console.log("On uninstallation(" + packageId + "): progress(" + percentage + ")");
+ $.mobile.showPageLoadingMsg();
+ },
+ oncomplete: function(packageId)
+ {
+ console.log("Uninstallation(" + packageId + ") Complete");
+ alert("The package " + packageId + " is uninstalled");
+ checkInstalledPackage();
+ }
+ }
+
+ var onError = function (err) {
+ $.mobile.hidePageLoadingMsg();
+ if (err.name != "UnknownError") {
+ alert("Error occured on uninstallation : " + err.name);
+ }
+ }
+
+ try {
+ tizen.package.uninstall(val, onUninstallationSuccess, onError);
+ } catch (e) {
+ alert("Exception: " + e.name);
+ }
+}
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.sandbox
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+*/
+
+var installUrl;
+var wgt_name;
+var app_id;
+var package_id;
+var update_wgt = new Array('widget-version-1');
+var nolaunch_wgt = new Array('Sample-widget3','Sample-widget4');
+
+$(document).ready(function(){
+ updateFooterButton();
+ DisablePassButton();
+
+ wgt_name = $("#wgt_name").val();
+ app_id = $("#app_id").val();
+ package_id = $("#package_id").val();
+
+ $("#install").bind("vclick", function() {
+ install("install");
+ });
+ if(jQuery.inArray(wgt_name, update_wgt) != -1){
+ $("#launch").bind("vclick", function() {
+ packagePre("widget-version-1-1");
+ install("update");
+ });
+ } else if(jQuery.inArray(wgt_name, nolaunch_wgt) != -1){
+ $('#launch').hide();
+ $('#launch_divider').hide();
+ } else {
+ $("#launch").bind("vclick", function() {
+ launch(app_id);
+ $('#uninstall').removeClass("ui-disabled");
+ });
+ }
+ $("#uninstall").bind("vclick", function() {
+ uninstall(package_id);
+ });
+ try {
+ tizen.package.setPackageInfoEventListener(packageEventCallback);
+ } catch (e) {
+ alert("Exception: " + e.message);
+ }
+
+ packagePre(wgt_name);
+ $('#uninstall').addClass("ui-disabled");
+ $('#launch').addClass("ui-disabled");
+
+ if(checkInstalledPkg(package_id)) {
+ $('#install').addClass("ui-disabled");
+ if(jQuery.inArray(wgt_name, nolaunch_wgt) != -1){
+ $('#uninstall').removeClass("ui-disabled");
+ } else {
+ $('#launch').removeClass("ui-disabled");
+ }
+ }
+});
+
+var packageEventCallback = {
+ oninstalled: function(packageInfo) {
+ $.mobile.hidePageLoadingMsg();
+ alert("The package " + packageInfo.name + " is installed");
+ },
+ onupdated: function(packageInfo) {
+ $.mobile.hidePageLoadingMsg();
+ alert("The package " + packageInfo.name + " is updated");
+ },
+ onuninstalled: function(packageId) {
+ $.mobile.hidePageLoadingMsg();
+ alert("The package " + packageId + " is uninstalled");
+ }
+}
+
+function fileURI(wgt_name) {
+ var documentsDir;
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ if(files[i].name == wgt_name+".wgt")
+ {
+ var Url1 = files[i].toURI();
+ installUrl = Url1.replace("file:///", "/");
+ }
+ }
+ }
+
+ function onerror(error) {
+ alert("The error " + error.message + " occurred when listing the files in the selected folder");
+ }
+
+ tizen.filesystem.resolve(
+ 'documents',
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error" + e.message);
+ }, "r"
+ );
+}
+
+function install(type) {
+ var onInstallationSuccess = {
+ onprogress: function(packageId, percentage)
+ {
+ console.log("On installation(" + packageId + "): progress(" + percentage + ")");
+ $.mobile.showPageLoadingMsg();
+ },
+ oncomplete: function(packageId)
+ {
+ console.log("Installation(" + packageId + ") Complete");
+ $('#install').addClass("ui-disabled");
+ if(jQuery.inArray(wgt_name, update_wgt) != -1 && type == "update"){
+ $('#launch').addClass("ui-disabled");
+ $('#uninstall').removeClass("ui-disabled");
+ } else if(jQuery.inArray(wgt_name, nolaunch_wgt) != -1){
+ $('#uninstall').removeClass("ui-disabled");
+ } else {
+ $('#launch').removeClass("ui-disabled");
+ }
+ }
+ }
+
+ var onError = function (err) {
+ alert("Error occured on installation : " + err.message);
+ $.mobile.hidePageLoadingMsg();
+ }
+
+ try {
+ tizen.package.install(installUrl, onInstallationSuccess, onError);
+ } catch(e) {
+ alert("Exception: " + e.name);
+ }
+}
+
+function uninstall(package_id) {
+ var onUninstallationSuccess = {
+
+ onprogress: function(packageId, percentage)
+ {
+ console.log("On uninstallation(" + packageId + "): progress(" + percentage + ")");
+ $.mobile.showPageLoadingMsg();
+ },
+ oncomplete: function(packageId)
+ {
+ console.log("Uninstallation(" + packageId + ") Complete");
+ $('#launch').addClass("ui-disabled");
+ $('#uninstall').addClass("ui-disabled");
+ EnablePassButton();
+ }
+ }
+
+ var onError = function (err) {
+ alert("Error occured on uninstallation : " + err.name);
+ $.mobile.hidePageLoadingMsg();
+ }
+
+ try {
+ tizen.package.uninstall(package_id, onUninstallationSuccess, onError);
+ } catch (e) {
+ alert("Exception: " + e.name);
+ }
+}
+
+function launch(app_id) {
+ function onSuccess() {
+ console.log(id + " launched successfully!");
+ }
+
+ function onError(err) {
+ alert("launch failed : " + err.message);
+ }
+
+ try {
+ tizen.application.launch(app_id, onSuccess, onError);
+ } catch (exc) {
+ alert("launch exc:" + exc.message);
+ }
+}
+
+function packagePre(wgt_name) {
+ var documentsDir;
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ if(files[i].name == wgt_name+".wgt")
+ {
+ documentsDir.copyTo(
+ files[i].fullPath,
+ "documents/"+wgt_name+".wgt",
+ true,
+ function() {
+ console.log(wgt_name+" Precondition Success!");
+ });
+ }
+ }
+ fileURI(wgt_name);
+ }
+
+ function onerror(error) {
+ alert("The error " + error.message + " occurred when listing the files in the selected folder");
+ }
+
+ tizen.filesystem.resolve(
+ 'wgt-package/tests/PackageManagement/res/',
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error" + e.message);
+ }, "r"
+ );
+}
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="Sample-widget1">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="Sample-widget1"/>
+ <input type="hidden" id="app_id" value="wrt1smt007.Samplewidget1"/>
+ <input type="hidden" id="package_id" value="wrt1smt007"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <ul>
+ <li>There is a widget named "Sample-widget1" on the device screen after the widget installed.</li>
+ <li>When click the "Launch" button, a "PASS" is displayed.</li>
+ </ul>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="Sample-widget2">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="Sample-widget2"/>
+ <input type="hidden" id="app_id" value="wrt1smt008.Samplewidget2"/>
+ <input type="hidden" id="package_id" value="wrt1smt008"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Pre-condition: </p>
+ <p>Make sure the "Sample-widget2" app is not installed.</p>
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget, during the installing power off and power on the device, and make sure the "Sample-widget2" is not installed.</li>
+ <li>Re-open the "pkmanagement-powerfailure-install" test.</li>
+ <li>Click the "Install" button to install the widget again.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if the installation of "Sample-widget2" app can run correctly.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="Sample-widget4">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="Sample-widget4"/>
+ <input type="hidden" id="app_id" value="wrt1smt010.Samplewidget4"/>
+ <input type="hidden" id="package_id" value="wrt1smt010"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider" id="launch_divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Check the widget details information with command: "app_launcher -l" and "pkgcmd -l" in terminal.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if the command line displays: "Name: Sample-widget4", "Version: 1.0.0", " Package ID: wrt1smt010", "App ID: wrt1smt010.Samplewidget4".</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="widget-version-1">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="widget-version-1"/>
+ <input type="hidden" id="app_id" value="wrt1wvt006.widgetversion"/>
+ <input type="hidden" id="package_id" value="wrt1wvt006"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Update</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Update</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Update" button to update the widget, during the updating close the terminal.</li>
+ <li>Re-open this TC, click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <ul>
+ <li>There is <strong>no error message</strong>.</li>
+ <li>There is <strong>no system crash</strong>.</li>
+ </ul>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Ma, Yue <yuex.ma@intel.com>
+
+-->
+
+<html>
+<head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../css/main.css" />
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/tests.js"></script>
+ <script src="js/main.js"></script>
+</head>
+<body>
+ <div data-role="page" id="main">
+ <div data-role="header" data-position="fixed" data-tap-toggle="false">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div data-role="content">
+ <div data-role="collapsible-set" data-inset="false" data-collapsed-icon="arrow-r" data-expanded-icon="arrow-d" data-theme="b">
+ <div data-role="collapsible" data-collapsed="true" data-theme="b">
+ <h3 id="homeList1">Screen-lock State</h3>
+ <ul data-role="listview" data-inset="false">
+ <li class="ui-li ui-li-static" id="lock"></li>
+ </ul>
+ </div>
+ <div data-role="collapsible" data-collapsed="true" data-theme="b">
+ <h3 id="homeList2">Screen-unlock State</h3>
+ <ul data-role="listview" data-inset="false">
+ <li class="ui-li ui-li-static" id="unlock"></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Purpose: </p>
+ <p>Verifies the device is able to handle pageVisible event when lock and unlock the screen by gesture.</p>
+ <p>Expected Result: </p>
+ <p>Test passes if the screen lock and unlock information displayed correctly on screen.</p>
+ </font>
+ </div>
+ </div>
+</body>
+</html>
--- /dev/null
+/*
+ Copyright (c) 2013 Intel Corporation.
+
+ Redistribution and use in source and binary forms, with or without modification,
+ are permitted provided that the following conditions are met:
+
+ * Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ Authors:
+ Ma,Yue <yuex.ma@intel.com>
+
+*/
+
+var visibilitychange = "visibilitychange";
+var array = new Array("webkit", "o", "moz", "ms");
+for(var i = 0; i < array.length; i++) {
+ if(array[i] + "Hidden" in document) {
+ visibilitychange = array[i] + "visibilitychange";
+ }
+}
+
+$(document).delegate("#main", "pageinit", function() {
+ document.addEventListener(visibilitychange, notification);
+ DisablePassButton();
+});
+
+function notification() {
+ EnablePassButton();
+ var doc_hidden = document.hidden | document.webkitHidden | document.oHidden | document.mozHidden | document.msHidden;
+ var visibilitystate = document.visibilityState || document.webkitVisibilityState || document.oVisibilityState || document.mozVisibilityState || document.msVisibilityState;
+ var hidden = doc_hidden == 0 ? false : true;
+ var date = new Date().toString().substr(4, 20);
+ if(visibilitystate === "hidden" && hidden) {
+ $("#lock").html(function(i, origText) {return origText + date + "<br>" + "visibilitystate : " + visibilitystate + "<br>" + " hidden : " + hidden + "<br>"});
+ } else if (visibilitystate === "visible" && !hidden) {
+ $("#unlock").html(function(i, origText) {return origText + date + "<br>" + "visibilitystate : " + visibilitystate + "<br>" + " hidden : " + hidden + "<br>"});
+ }else {
+ $("#lock").html(function(i, origText) {return origText + date + "<br>" + "Fail " + "<br>"});
+ $("#unlock").html(function(i, origText) {return origText + date + "<br>" + "Fail " + "<br>"});
+ }
+}
--- /dev/null
+Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+Copyright (c) 2012 Intel Corporation.
+Except as noted, this software is licensed under Apache License, Version 2 or BSD-3-Clause License.
+Please, see the LICENSE.Apache-2.0 file for Apache License, Version 2 terms and conditions
+or the LICENSE.BSD-3 file for BSD-3-Clause License.
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Samsung Electronics 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.
+
+Authors:
+ Choi, Jongheon <j-h.choi@samsung.com>
+
+-->
+<html>
+<head>
+<meta charset="utf-8" />
+<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+<link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+<script src="../../js/thirdparty/jquery.js"></script>
+<script src="../../js/thirdparty/jquery.mobile.js"></script>
+<script src="../../js/tests.js"></script>
+<script src="js/main.js"></script>
+</head>
+<body>
+ <div data-role="header" data-position="fixed" data-tap-toggle="false">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div id="content">
+ <ul data-role="listview" id="list">
+ <li data-role="list-divider">Request Screen</li>
+ <li>
+ <input type="button" value="Request SCREEN_DIM" onclick="request('SCREEN_DIM');" />
+ </li>
+ <li>
+ <input type="button" value="Request SCREEN_NORMAL" onclick="request('SCREEN_NORMAL');" />
+ </li>
+ <li data-role="list-divider">Release Screen</li>
+ <li>
+ <input type="button" value="Release SCREEN" onclick="release();" />
+ </li>
+ <li data-role="list-divider">Turn Off</li>
+ <li>
+ <input type="button" value="Turn SCREEN_OFF" onclick="turnScreenOff();" />
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font style="font-size:85%">
+ <p>Check if the screen status is successfully changed</p>
+ <p>(Note: Response time varies depends on the system setting)</p><br>
+ <p>* Setting -> Display -> Backlight time : 15 Seconds<p>
+ <p>1. Click Request SCREEN_DIM(After 15 second) : Check if the screen is dim. But Screen doesn't turn off</p>
+ <p>2. Click Request SCREEN_NORMAL(After 15 second) : Check if the screen doesn't dim and turn off</p>
+ <p>3. Click Release SCREEN(After 15 second) : Check the screen resource release(Screen is dim and turn off)</p>
+ <p>4. Click Turn SCREEN_OFF and check the screen is off immediately</p>
+ </font>
+ </div>
+</body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Samsung Electronics 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.
+
+Authors:
+ Choi, Jongheon <j-h.choi@samsung.com>
+
+*/
+
+//request
+function request(screenState){
+ tizen.power.release("SCREEN");
+ try{
+ alert(screenState);
+ tizen.power.request("SCREEN", screenState);
+ }catch(err) {
+ console.log("errorname: " + err.name + ", description: " + err.description + ", messsage: " + err.message);
+ }
+}
+
+// release
+function release(){
+ try{
+ alert("SCREEN_RELEASE");
+ tizen.power.release("SCREEN");
+ }catch(err) {
+ console.log("errorname: " + err.name + ", description: " + err.description + ", messsage: " + err.message);
+ }
+}
+
+//turnScreenOff
+function turnScreenOff(){
+ try{
+ alert("SCREEN_OFF");
+ tizen.power.turnScreenOff();
+ }catch(err) {
+ console.log("errorname: " + err.name + ", description: " + err.description + ", messsage: " + err.message);
+ }
+}
--- /dev/null
+Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+Copyright (c) 2012 Intel Corporation.
+Except as noted, this software is licensed under Apache License, Version 2 or BSD-3-Clause License.
+Please, see the LICENSE.Apache-2.0 file for Apache License, Version 2 terms and conditions
+or the LICENSE.BSD-3 file for BSD-3-Clause License.
+
+Following resources are licensed under its own license.
+
+res/TestPush :
+Copyright (c) 2012 Samsung Electronics Co., Ltd. All right reserved.
+The above resource files are licensed under Creative Commons Attribution 3.0.
+Please see the LICENSE.CC-BY-3.0 for Creative Commons Attribution 3.0 terms and conditions.
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Samsung Electronics 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.
+
+Authors:
+ Choi, Jongheon <j-h.choi@samsung.com>
+
+-->
+<html>
+<head>
+<meta charset="utf-8" />
+<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+<link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+<script src="../../js/thirdparty/jquery.js"></script>
+<script src="../../js/thirdparty/jquery.mobile.js"></script>
+<script src="../../js/tests.js"></script>
+<script src="js/main.js"></script>
+</head>
+<body>
+ <div data-role="page" id="main">
+ <div data-role="header" data-position="fixed" data-tap-toggle="false">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div id="content">
+ <ul data-role="listview">
+ <li data-role="list-divider">PushClient(TestPush) Application Install</li>
+ <li>
+ <div data-role="button" id="install" style="height:40px; line-height:20px;">PushClient Install</div>
+ </li>
+ <li data-role="list-divider">PushClient(TestPush) Application Launch</li>
+ <li>
+ <div data-role="button" id="launch">PushClient Launch</div>
+ </li>
+ <li data-role="list-divider">Push Message</li>
+ <li>
+ <input type="text" id="message" value="Behavior_Test_Push"/>
+ </li>
+ <li data-role="list-divider">Send Message</li>
+ <li>
+ <div data-role="button" id="push">Push</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font style="font-size:85%">
+ <p>Check if PushClient gets messages from the push server</p>
+ <p>A network connection capable of accessing the Internet MUST be established </p><br>
+ <p>1. Install and launch PushClient(TestPush) Application</p>
+ <p> (Make sure the device is online and the applications shows registration success popup.)
+ <p>2. Press Hide in the PushClient</p>
+ <p>3. Back to this page and fill in a push message and click Push button</p>
+ <p>4. Check PushClient becomes foreground showing PASS text</p>
+ <p>5. Exit PushClient</p>
+ <p>6. Back to this page and fill in another message and click Push button</p>
+ <p>7. Check a notification pops up and PushClient launchs with PASS text when the notification is clicked</p>
+ </font>
+ </div>
+ </div>
+</body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Samsung Electronics 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.
+
+Authors:
+ Choi, Jongheon <j-h.choi@samsung.com>
+
+*/
+
+var installUrl;
+var reg;
+
+$(document).delegate("#main", "pageinit", function() {
+ $("#install").bind("vclick", function() {
+ install(installUrl);
+ $("#launch").removeClass("ui-disabled");
+ $("#push").removeClass("ui-disabled");
+ return false;
+ });
+ $("#launch").bind("vclick", function() {
+ launch();
+ return false;
+ });
+ $("#push").bind("vclick", function() {
+ regID();
+ return false;
+ });
+ $("#launch").addClass("ui-disabled");
+ $("#push").addClass("ui-disabled");
+ try {
+ tizen.package.setPackageInfoEventListener(packageEventCallback);
+ } catch (e) {
+ alert("Exception: " + e.message);
+ }
+ pushPre();
+});
+
+var packageEventCallback = {
+ oninstalled: function(packageInfo) {
+ alert("The package " + packageInfo.name + " is installed");
+ },
+ onupdated: function(packageInfo) {
+ alert("The package " + packageInfo.name + " is updated");
+ },
+ onuninstalled: function(packageId) {
+ alert("The package " + packageId + " is uninstalled");
+ }
+};
+
+function fileURI() {
+ var documentsDir;
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ if(files[i].name == "TestPush.wgt")
+ {
+ var Url1 = files[i].toURI();
+ installUrl = Url1.replace("file:///", "/");
+ }
+ }
+ }
+
+ function onerror(error) {
+ alert("The error " + error.message + " occurred when listing the files in the selected folder");
+ }
+
+ tizen.filesystem.resolve(
+ 'documents',
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error " + e.message);
+ }, "r"
+ );
+}
+
+function install(url) {
+ var onInstallationSuccess = {
+ onprogress: function(packageId, percentage)
+ {
+ console.log("On installation(" + packageId + "): progress(" + percentage + ")");
+ document.getElementById("install").innerHTML = '<div data-role="button" id="install" style="height:40px; line-height:40px;">Installing... ' + percentage + "%" + '</div>';
+ },
+ oncomplete: function(packageId)
+ {
+ console.log("Installation(" + packageId + ") Complete");
+ document.getElementById("install").innerHTML = '<div data-role="button" id="install" style="height:40px; line-height:40px;">PushClient Install</div>';
+ $("#install").addClass("ui-disabled");
+ }
+ }
+
+ var onError = function (err) {
+ alert("Error occured on installation : " + err.message);
+ }
+
+ try {
+ tizen.package.install(url, onInstallationSuccess, onError);
+ } catch (e) {
+ alert("Exception: " + e.name);
+ }
+}
+
+function launch() {
+ function onSuccess() {
+ console.log("Application launched successfully");
+ }
+
+ function onError(err) {
+ alert("launch failed : " + err.message);
+ }
+
+ try {
+ tizen.application.launch("bhvtcpush0.PushClient", onSuccess, onError);
+ } catch (exc) {
+ alert("launch exc:" + exc.message);
+ }
+}
+
+function regID() {
+ var documentsDir;
+ var flag = false;
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ if(files[i].name == "PushRegId.txt")
+ {
+ flag = true;
+ files[i].readAsText(
+ function(str){
+ reg = str;
+ send();
+ }, function(e){
+ alert("Error " + e.message);
+ }, "UTF-8"
+ );
+ break;
+ }
+ else
+ flag = false;
+ }
+ if(flag == false)
+ alert("Not found Registration ID.\nPlease TestPush(PushClient) app install and launch or Check network connection.");
+ }
+
+ function onerror(error) {
+ alert("Error " + error.message);
+ }
+
+ tizen.filesystem.resolve(
+ "documents",
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error" + e.message);
+ }, "r"
+ );
+}
+
+function checkNum(i) {
+ if (i < 10) {
+ i = "0" + i;
+ }
+ return i;
+}
+
+function send() {
+ var appId = "bhvtcpush0";
+ var msg = $("#message").val();
+ var sec = "27A91C190007B2E7987627A9392C6291";
+ var h = new Date().getHours();
+ var m = new Date().getMinutes();
+ var s = new Date().getSeconds();
+ h = checkNum(h);
+ m = checkNum(m);
+ s = checkNum(s);
+
+ if(msg == "")
+ {
+ alert("Message is empty");
+ }
+ else if(reg == "")
+ {
+ alert("Registration ID is empty")
+ }
+ else
+ {
+ var request = new XMLHttpRequest();
+ var data = {"regID":reg, "requestID":"000001", "message":"action=ALERT&alertMessage="+msg, "appData":msg+"("+h+":"+m+":"+s+")"};
+ var regID = reg.substring(0, 2);
+ switch(regID)
+ {
+ case "00":
+ request.open("POST", "https://useast.push.samsungosp.com:8088/spp/pns/api/push", true);
+ break;
+ case "01":
+ request.open("POST", "https://uswest.push.samsungosp.com:8088/spp/pns/api/push", true);
+ break;
+ case "02":
+ request.open("POST", "https://apsoutheast.push.samsungosp.com:8088/spp/pns/api/push", true);
+ break;
+ case "03":
+ request.open("POST", "https://euwest.push.samsungosp.com:8088/spp/pns/api/push", true);
+ break;
+ case "04":
+ request.open("POST", "https://apnortheast.push.samsungosp.com:8088/spp/pns/api/push", true);
+ break;
+ case "05":
+ request.open("POST", "https://apkorea.push.samsungosp.com:8088/spp/pns/api/push", true);
+ break;
+ case "06":
+ request.open("POST", "https://apchina.push.samsungosp.com.cn:8088/spp/pns/api/push", true);
+ break;
+ case "7c":
+ request.open("POST", "https://175.41.248.50:8088/spp/pns/api/push", true);
+ }
+ request.setRequestHeader("Content-Type", "application/json");
+ request.setRequestHeader("appID", appId);
+ request.setRequestHeader("appSecret", sec);
+ request.onreadystatechange = function() {
+ if (request.readyState == 4 && request.status == 200) {
+ console.log(request.responseText);
+ alert("Push Success");
+ }
+ };
+ request.send(JSON.stringify(data));
+ }
+}
+
+function pushPre() {
+ var documentsDir;
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ if(files[i].name == "TestPush")
+ {
+ documentsDir.copyTo(
+ files[i].fullPath,
+ "documents/TestPush.wgt",
+ true,
+ function() {
+ console.log("TestPush Precondition Success!");
+ });
+ }
+ }
+ fileURI();
+ }
+
+ function onerror(error) {
+ alert("Error " + error.message);
+ }
+
+ tizen.filesystem.resolve(
+ 'wgt-package/tests/Push/res/',
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error " + e.message);
+ }, "r"
+ );
+}
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Cui, Jieqiong <jieqiongx.cui@intel.com>
+
+-->
+
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width">
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../css/main.css" />
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/tests.js"></script>
+ <style>
+ /* Test Display Box */
+ .display_box {
+ width: 100%;
+ border: 1px solid #000;
+ }
+ </style>
+ </head>
+ <body>
+ <div data-role="header">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div data-role= "content">
+ <svg width="330" height="400" class="display_box">
+ <circle cx="100" cy="50" r="20" fill="blue">
+ <animateTransform attributeName='transform' attributeType='XML' type='rotate' from='180 170 200' to='-360 100 50' dur='10s' additive='sum' fill='freeze' repeatCount='indefinite'/>
+ <animateTransform attributeName='transform' attributeType='XML' type='scale' from='1' to='2' dur='10s' additive='sum' fill='freeze' repeatCount='indefinite'/>
+ <animateTransform attributeName='transform' attributeType='XML' type='skewX' by="30" dur='10s' additive='sum' fill='freeze' repeatCount='indefinite'/>
+ </circle>
+ </svg>
+ <p><a href="javascript: document.location.reload();" data-role="button">Test Again</a></p>
+ </div>
+ <div data-role="footer" data-position="fixed">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font class="fontSize">
+ <p>Test Purpose: </p>
+ <p>Verifies the blue circle could be transferred to ellipse, and rotate along with elliptical patch at the same time.</p>
+ <p>Expected Result: </p>
+ <p>Test passes if the transformation and rotate function well.</p>
+ </font>
+ </div>
+ </body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Lin, Wanming <wanmingx.lin@intel.com>
+
+*/
+
+#content ul ul {
+ padding: 5px 15px;
+}
+
+.containing-element .ui-slider-switch { width: 8em }
+
+/*over write*/
+ul .ui-corner-all {
+ -moz-border-radius: 0 /*{global-radii-blocks}*/;
+ -webkit-border-radius: 0 /*{global-radii-blocks}*/;
+ border-radius: 0 /*{global-radii-blocks}*/;
+}
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Xu, YuhanX <yuhanx.xu@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width">
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../css/main.css" />
+ <link rel="stylesheet" type="text/css" href="css/style.css" />
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/tests.js"></script>
+ <script src="js/main.js"></script>
+ </head>
+ <body>
+ <div data-role="header">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div id="content">
+ <ul data-role="listview">
+ <li data-role="list-divider">Shared Media Directory</li>
+ <li><div data-role="button" id="openMediaBtn">Open /home/app/content directory</div></li>
+ <li><div data-role="button" id="createFileBtn">Create file</div></li>
+ <li data-role="list-divider">File List</li>
+ <ul data-role="listview" id="media" data-inset="true" hidden="true"></ul>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font class="fontSize">
+ <p>Test Purpose: </p>
+ <p>Verifies that (1) this applicaton is running by non-root ID and, (2) it is allowed to read and write files in the shared media directory.</p>
+ <p>Test Step: </p>
+ <ol>
+ <li>Get the "USER" info via cmdline "ps aux|awk 'NR==1;/tctbhtests\.TCTBehaviorTests/'" in console.</li>
+ <li>Open shared media directory.</li>
+ <li>Create and remove files in shared media directory.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <ul>
+ <li>The "USRER" info is NOT root user.</li>
+ <li>There is <strong>no error message</strong> when click buttons under "Shared Media Directory".</li>
+ <li>Only new created files can be removed; opened files in step 2 cannot.</li>
+ </ul>
+ </font>
+ </div>
+ </body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Xu, YuhanX <yuhanx.xu@intel.com>
+
+*/
+
+var SHARED_MEDIA_DIR = "file:///home/app/content",
+ MEDIA_ID = "#media";
+var count = 0, mediaDir;
+var gFiles = [], createdId = [];
+
+$(document).ready(function(){
+ DisablePassButton();
+ $('#createFileBtn').addClass("ui-disabled");
+
+ function onError(err) {
+ alert("Error: " + err.message);
+ }
+
+ function makeFileList(files, selector) {
+ var str = "";
+
+ for (var i = 0; i < files.length; i++) {
+ if (files[i].isDirectory == false) {
+ str += '<li id="'
+ + files[i].name
+ + '"><a href="#"><h4>'
+ + files[i].name
+ + '</h4></a><a href="'
+ + 'javascript:deleteFile('
+ + count
+ + ')" data-icon="delete" data-theme="c">'
+ + '</a></li>';
+ gFiles[count++] = files[i];
+ }
+ }
+ if (str) {
+ $(selector).append(str).trigger("create").listview("refresh");
+ }
+
+ $('#createFileBtn').removeClass("ui-disabled");
+ $('#openMediaBtn').addClass("ui-disabled");
+ }
+
+ function openDirectory(str, selector) {
+ try {
+ tizen.filesystem.resolve(str, function(dir) {
+ dir.listFiles(function(files) {
+ $(MEDIA_ID).show();
+ makeFileList(files, selector);
+ mediaDir = dir;
+ alert("Open Success");
+ }, function(err) {
+ alert("Open Fail: " + err.message);
+ });
+ }, onError, "rw");
+ } catch (exc) {
+ alert("tizen.filesystem.resolve(" + str + ") exc: " + exc.message);
+ }
+ }
+
+ function createFile(dir, selector) {
+ if (!dir) {
+ alert("Create File Error: The directory can not be opened");
+ return;
+ }
+
+ try {
+ var newFile, str = "";
+ var time = new Date().getTime();
+ newFile = dir.createFile("newFile" + time);
+ str += '<li id="'
+ + newFile.name
+ + '"><a href="#"><h4>'
+ + newFile.name
+ + '</h4></a><a href="'
+ + 'javascript:deleteFile('
+ + count
+ + ')" data-icon="delete" data-theme="c">'
+ + '</a></li>';
+ createdId.push(count);
+ gFiles[count++] = newFile;
+ if (str) {
+ $(selector).append(str).trigger("create").listview("refresh");
+ }
+ } catch (exc) {
+ alert("Create File Error: " + exc.message);
+ }
+ }
+
+ $("#openMediaBtn").on("click",function() {
+ if (!mediaDir) {
+ openDirectory(SHARED_MEDIA_DIR, MEDIA_ID);
+ }
+ });
+ $("#createFileBtn").on("click",function() {
+ createFile(mediaDir, MEDIA_ID);
+ EnablePassButton();
+ });
+});
+
+function deleteFile(id) {
+ var dir, selector, index;
+
+ if (id == null) {
+ return;
+ }
+ //Only delete the file by user created.
+ index = createdId.indexOf(id);
+ if (index == -1) {
+ return;
+ }
+
+ try {
+ dir = mediaDir;
+ selector = MEDIA_ID;
+ dir.deleteFile(gFiles[Number(id)].fullPath, function() {
+ //Delete the id in createdId array.
+ createdId.splice(index, 1);
+ $("#" + gFiles[Number(id)].name).remove();
+ $(selector).trigger("create").listview("refresh");
+ }, function (err) {
+ alert("Error: " + err.message);
+ });
+ } catch (exc) {
+ alert("Delete File Error: " + exc.message);
+ }
+}
+
+//function backAppsHome() {
+// createdId.forEach(function(id) {
+// deleteFile(id);
+// });
+//}
--- /dev/null
+Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+Copyright (c) 2012 Intel Corporation.
+Except as noted, this software is licensed under Apache License, Version 2 or BSD-3-Clause License.
+Please, see the LICENSE.Apache-2.0 file for Apache License, Version 2 terms and conditions
+or the LICENSE.BSD-3 file for BSD-3-Clause License.
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Samsung Electronics 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.
+
+Authors:
+ Choi, Jongheon <j-h.choi@samsung.com>
+
+-->
+<html>
+<head>
+<meta charset="utf-8" />
+<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+<link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+<script src="../../js/thirdparty/jquery.js"></script>
+<script src="../../js/thirdparty/jquery.mobile.js"></script>
+<script src="../../js/tests.js"></script>
+<script src="js/main.js"></script>
+</head>
+<body>
+ <div data-role="header" data-position="fixed" data-tap-toggle="false">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div id="content">
+ <ul data-role="listview" id="info-list1"></ul>
+ <ul data-role="listview" id="info-list2"></ul>
+ <ul data-role="listview" id="info-list3"></ul>
+ <ul data-role="listview" id="info-list4"></ul>
+ <ul data-role="listview" id="info-list5"></ul>
+ <ul data-role="listview" id="info-list6"></ul>
+ <ul data-role="listview" id="info-list7"></ul>
+ <ul data-role="listview" id="info-list8"></ul>
+ <ul data-role="listview" id="info-list9"></ul>
+ <ul data-role="listview" id="info-list10"></ul>
+ <ul data-role="listview" id="info-list11"></ul>
+ <ul data-role="listview" id="info-list12"></ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font style="font-size:85%">
+ <p>Check if a SystemInfo reflects current device status</p><br>
+ <p>1. Check WiFi Network Status if it reflects the current device Wi-Fi status</p>
+ <p>2. Change device WiFi status and Check WiFi Network Status again</p>
+ <p>3. Check Device Orientation Status if it displays correct value that fits the current device position</p>
+ <p>4. Rotate the device per 90 degrees and check Device Orientation shows the correct status</p>
+ <p>5. Check Battery Status</p>
+ <p>6. Check the Brightness if it changes the current device brightness</p>
+ <p>7. Check the Resolution</p>
+ <p>8. Check the Dots per inch</p>
+ <p>9. Check the Physical size</p>
+ <p>10. Check the Storage Status</p>
+ <p>11. Check the CPU Status</p>
+ <p>12. Check the Build Status</p>
+ <p>13. Check the Locale Status</p>
+ <p>14. Check the Network Status</p>
+ <p>15. Check the Cellular Network Status</p>
+ <p>16. Check the Sim Status</p>
+ <p>17. Check the Peripheral Status</p>
+ </font>
+ </div>
+</body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Samsung Electronics 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.
+
+Authors:
+ Choi, Jongheon <j-h.choi@samsung.com>
+
+*/
+var gInfo;
+var init = function () {
+ try {
+ tizen.systeminfo.addPropertyValueChangeListener("WIFI_NETWORK", onWifiNetworkSuccess);
+ tizen.systeminfo.addPropertyValueChangeListener("DEVICE_ORIENTATION", onDeviceOrientationSuccess);
+ tizen.systeminfo.addPropertyValueChangeListener("DISPLAY", onDisplaySuccess);
+ tizen.systeminfo.addPropertyValueChangeListener("BATTERY", onBatterySuccess);
+ tizen.systeminfo.addPropertyValueChangeListener("STORAGE", onStorageSuccess);
+ tizen.systeminfo.addPropertyValueChangeListener("CPU", onCpuSuccess);
+ tizen.systeminfo.addPropertyValueChangeListener("BUILD", onBuildSuccess);
+ tizen.systeminfo.addPropertyValueChangeListener("LOCALE", onLocaleSuccess);
+ tizen.systeminfo.addPropertyValueChangeListener("NETWORK", onNetworkSuccess);
+ tizen.systeminfo.addPropertyValueChangeListener("CELLULAR_NETWORK", onCellularNetworkSuccess);
+ tizen.systeminfo.addPropertyValueChangeListener("SIM", onSimSuccess);
+ tizen.systeminfo.addPropertyValueChangeListener("PERIPHERAL", onPeripheralSuccess);
+ } catch (e) {
+ alert("Exception: " + e.message);
+ }
+ getPropertyValue();
+};
+
+function getPropertyValue() {
+ try {
+ tizen.systeminfo.getPropertyValue("WIFI_NETWORK", onWifiNetworkSuccess);
+ tizen.systeminfo.getPropertyValue("DEVICE_ORIENTATION", onDeviceOrientationSuccess);
+ tizen.systeminfo.getPropertyValue("DISPLAY", onDisplaySuccess);
+ tizen.systeminfo.getPropertyValue("BATTERY", onBatterySuccess);
+ tizen.systeminfo.getPropertyValue("STORAGE", onStorageSuccess);
+ tizen.systeminfo.getPropertyValue("CPU", onCpuSuccess);
+ tizen.systeminfo.getPropertyValue("BUILD", onBuildSuccess);
+ tizen.systeminfo.getPropertyValue("LOCALE", onLocaleSuccess);
+ tizen.systeminfo.getPropertyValue("NETWORK", onNetworkSuccess);
+ tizen.systeminfo.getPropertyValue("CELLULAR_NETWORK", onCellularNetworkSuccess);
+ tizen.systeminfo.getPropertyValue("SIM", onSimSuccess);
+ tizen.systeminfo.getPropertyValue("PERIPHERAL", onPeripheralSuccess);
+ } catch (e) {
+ alert("Exception: " + e.message);
+ }
+}
+
+function onError(e) {
+ alert("Error: " + e.message);
+}
+
+function make1lineListItem(value) {
+ return '<li>' + value + '</li>';
+}
+
+function makeDividerListItem(value) {
+ return '<li data-role="list-divider">' + value + '</li>';
+}
+
+function onWifiNetworkSuccess(wifi) {
+ gInfo = makeDividerListItem("WIFI_NETWORK Status")
+ + make1lineListItem("Stauts : " + wifi.status)
+ + make1lineListItem("SSID : " + wifi.ssid)
+ + make1lineListItem("IPAddress : " + wifi.ipAddress)
+ + make1lineListItem("IPv6Address : " + wifi.ipv6Address)
+ + make1lineListItem("SignalStrength : " + wifi.signalStrength);
+ $("#info-list1").html(gInfo).trigger("create").listview("refresh");
+}
+
+function onDeviceOrientationSuccess(orientation) {
+ gInfo = makeDividerListItem("DEVICE_ORIENTATION Status")
+ + make1lineListItem("Status : " + orientation.status)
+ + make1lineListItem("AutoRotation : " + (orientation.isAutoRotation == true ? "Yes" : "No"));
+ $("#info-list2").html(gInfo).trigger("create").listview("refresh");
+}
+
+function onDisplaySuccess(display) {
+ gInfo = makeDividerListItem("DISPLAY Status")
+ + make1lineListItem("Brightness : " + (display.brightness * 100) + "%")
+ + makeDividerListItem("Resolution")
+ + make1lineListItem("Width : " + display.resolutionWidth)
+ + make1lineListItem("Height : " + display.resolutionHeight)
+ + makeDividerListItem("Dots per inch")
+ + make1lineListItem("Horizontal : " + display.dotsPerInchWidth)
+ + make1lineListItem("Vertical : " + display.dotsPerInchHeight)
+ + makeDividerListItem("Physical size")
+ + make1lineListItem("Width : " + display.physicalWidth)
+ + make1lineListItem("Height : " + display.physicalHeight);
+ $("#info-list4").html(gInfo).trigger("create").listview("refresh");
+}
+
+function onBatterySuccess(battery) {
+ gInfo = makeDividerListItem("BATTERY Status")
+ + make1lineListItem("Level : " + (battery.level * 100) + "%")
+ + make1lineListItem("Charging : " + (battery.isCharging == true ? "Yes" : "No"));
+ $("#info-list3").html(gInfo).trigger("create").listview("refresh");
+}
+
+function onStorageSuccess(storages) {
+ gInfo = makeDividerListItem("STORAGE Status")
+ + make1lineListItem("Storage : " + storages.units.length);
+ for (var i = 0; i < storages.units.length; i++) {
+ gInfo += makeDividerListItem("Type : " + storages.units[i].type)
+ + make1lineListItem("Capacity : " + Math.floor(storages.units[i].capacity / 1000000) + " MB")
+ + make1lineListItem("Available capacity : " + Math.floor(storages.units[i].availableCapacity / 1000000) + " MB")
+ + make1lineListItem("Removable : " + (storages.units[i].isRemovable == true ? "Yes" : "No"));
+ }
+ $("#info-list5").html(gInfo).trigger("create").listview("refresh");
+}
+
+function onCpuSuccess(cpu) {
+ gInfo = makeDividerListItem("CPU Status")
+ + make1lineListItem("Load : " + cpu.load);
+ $("#info-list6").html(gInfo).trigger("create").listview("refresh");
+}
+
+function onBuildSuccess(build) {
+ gInfo = makeDividerListItem("BUILD Status")
+ + make1lineListItem("Model : " + build.model)
+ + make1lineListItem("Manufacturer : " + build.manufacturer)
+ + make1lineListItem("BuildVersion : " + build.buildVersion);
+ $("#info-list7").html(gInfo).trigger("create").listview("refresh");
+}
+
+function onLocaleSuccess(locale) {
+ gInfo = makeDividerListItem("LOCALE Status")
+ + make1lineListItem("Language : " + locale.language)
+ + make1lineListItem("Country : " + locale.country);
+ $("#info-list8").html(gInfo).trigger("create").listview("refresh");
+}
+
+function onNetworkSuccess(network) {
+ gInfo = makeDividerListItem("NETWORK Status")
+ + make1lineListItem("NetworkType : " + network.networkType);
+ $("#info-list9").html(gInfo).trigger("create").listview("refresh");
+}
+
+function onCellularNetworkSuccess(cellular) {
+ gInfo = makeDividerListItem("CELLULAR_NETWORK Status")
+ + make1lineListItem("Status : " + cellular.status)
+ + make1lineListItem("Apn : " + cellular.apn)
+ + make1lineListItem("IPAddress : " + cellular.ipAddress)
+ + make1lineListItem("IPv6Address : " + cellular.ipv6Address)
+ + make1lineListItem("Mcc : " + cellular.mcc)
+ + make1lineListItem("Mnc : " + cellular.mnc)
+ + make1lineListItem("CellId : " + cellular.cellId)
+ + make1lineListItem("Lac : " + cellular.lac)
+ + make1lineListItem("IsRoaming : " + cellular.isRoaming)
+ + make1lineListItem("IsFlightMode : " + cellular.isFlightMode)
+ + make1lineListItem("IMEI : " + cellular.imei);
+ $("#info-list10").html(gInfo).trigger("create").listview("refresh");
+}
+
+function onSimSuccess(sim) {
+ gInfo = makeDividerListItem("SIM Status")
+ + make1lineListItem("State : " + sim.state)
+ + make1lineListItem("OperatorName : " + sim.operatorName)
+ + make1lineListItem("Msisdn : " + sim.msisdn)
+ + make1lineListItem("Iccid : " + sim.iccid)
+ + make1lineListItem("Mcc : " + sim.mcc)
+ + make1lineListItem("Mnc : " + sim.mnc)
+ + make1lineListItem("Msin : " + sim.msin)
+ + make1lineListItem("Spn : " + sim.spn);
+ $("#info-list11").html(gInfo).trigger("create").listview("refresh");
+}
+
+function onPeripheralSuccess(peripheral) {
+ gInfo = makeDividerListItem("PERIPHERAL Status")
+ + make1lineListItem("IsVideoOutputOn : " + peripheral.isVideoOutputOn);
+ $("#info-list12").html(gInfo).trigger("create").listview("refresh");
+}
+
+$(document).bind("pageinit", init);
--- /dev/null
+Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+Copyright (c) 2012 Intel Corporation.
+Except as noted, this software is licensed under Apache License, Version 2 or BSD-3-Clause License.
+Please, see the LICENSE.Apache-2.0 file for Apache License, Version 2 terms and conditions
+or the LICENSE.BSD-3 file for BSD-3-Clause License.
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Samsung Electronics 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.
+
+Authors:
+ Choi, Jongheon <j-h.choi@samsung.com>
+
+-->
+<html>
+<head>
+<meta charset="utf-8" />
+<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+<link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+<script src="../../js/thirdparty/jquery.js"></script>
+<script src="../../js/thirdparty/jquery.mobile.js"></script>
+<script src="../../js/tests.js"></script>
+<script src="js/main.js"></script>
+</head>
+<body>
+ <div data-role="page" id="main">
+ <div data-role="header" data-position="fixed" data-tap-toggle="false">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div id="content">
+ <ul data-role="listview">
+ <li data-role="list-divider">Set Call Ringtone</li>
+ </ul>
+ <ul data-role="listview" id="ringtone"></ul>
+ <ul data-role="listview">
+ <li data-role="list-divider">Get Call Ringtone</li>
+ <li><div data-role="button" id="tone">Get Ringtone & Play Sound</div></li>
+ </ul>
+ <audio data-controls="true" style="width:100%;" id="MyAudio"></audio>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font style="font-size:85%">
+ <p>Check if the ringtone is successfully changed</p><br>
+ <p>1. Click Set ringtone</p>
+ <p>2. Make a call to the device and check if the ringtone is successfully changed</p>
+ <p>3. Proceed the checking for other ringtones</p>
+ <p>Note. you may want to add more ringtone files in 'ringtones' virtual root</p>
+ </font>
+ </div>
+ </div>
+</body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Samsung Electronics 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.
+
+Authors:
+ Choi, Jongheon <j-h.choi@samsung.com>
+
+*/
+
+var path;
+
+$(document).delegate("#main", "pageinit", function() {
+ $("#ringtone").delegate("li", "vclick", function() {
+ path = $(this).data("url");
+ setSystemProperty("INCOMING_CALL", path, onIncomingCallSetSuccess);
+ return false;
+ });
+ $("#tone").bind("vclick", function() {
+ getSystemProperty("INCOMING_CALL", onIncomingCallGetSuccess);
+ return false;
+ });
+ fileAudio();
+});
+
+function onError(e) {
+ alert("Error: " + e.message);
+}
+
+function onIncomingCallSetSuccess() {
+ alert("Change of INCOMING_CALL ringtone");
+}
+
+function onIncomingCallGetSuccess(value) {
+ alert("Sound(Get) path : " + value);
+ var audio = document.getElementById("MyAudio");
+ audio.src = value;
+ audio.type = "audio/*";
+ audio.play();
+}
+
+function setSystemProperty(property, path, onSuccess) {
+ try {
+ tizen.systemsetting.setProperty(property, path, onSuccess, onError);
+ console.log(path);
+ } catch (e) {
+ console.log("Exception: " + e.message);
+ }
+}
+
+function getSystemProperty(property, onSuccess) {
+ try {
+ tizen.systemsetting.getProperty(property, onSuccess, onError);
+ } catch (e) {
+ console.log("Exception: " + e.message);
+ }
+}
+
+function fileAudio() {
+ var documentsDir, length = 0, str = "";
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ if(files[i].isFile == true)
+ {
+ var Url = files[i].toURI();
+ Url = Url.replace("file:///", "/");
+ str += '<li data-url="' + Url + '">' + files[i].name + '</li>';
+ length++;
+ if(length >= 9)
+ break;
+ }
+ }
+ if(length == 0)
+ alert("Not found Sound files\nPlease add sound files.\nAdd Path: " + documentsDir.toURI() + "/");
+ $("#ringtone").html(str).trigger("create").listview("refresh");
+ }
+
+ function onerror(error) {
+ console.log("The error " + error.message + " occurred when listing the files in the selected folder");
+ }
+
+ tizen.filesystem.resolve(
+ 'ringtones',
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error " + e.message);
+ }, "r"
+ );
+}
--- /dev/null
+Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+Copyright (c) 2012 Intel Corporation.
+Except as noted, this software is licensed under Apache License, Version 2 or BSD-3-Clause License.
+Please, see the LICENSE.Apache-2.0 file for Apache License, Version 2 terms and conditions
+or the LICENSE.BSD-3 file for BSD-3-Clause License.
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Samsung Electronics 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.
+
+Authors:
+ Choi, Jongheon <j-h.choi@samsung.com>
+
+-->
+<html>
+<head>
+<meta charset="utf-8" />
+<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+<link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+<script src="../../js/thirdparty/jquery.js"></script>
+<script src="../../js/thirdparty/jquery.mobile.js"></script>
+<script src="../../js/tests.js"></script>
+<script src="js/main.js"></script>
+<style type="text/css">
+#imageHS ul, li {list-style:none;}
+#imageLS ul, li {list-style:none;}
+#imageHS img {margin:5px; width:65px; height:70px}
+#imageLS img {margin:5px; width:65px; height:70px}
+</style>
+</head>
+<body>
+ <div data-role="page" id="main">
+ <div data-role="header" data-position="fixed" data-tap-toggle="false">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div id="content">
+ <ul data-role="listview">
+ <li data-role="list-divider">Set HomeScreen Image</li>
+ </ul>
+ <ul data-role="listview" id="imageHS"></ul>
+ <ul data-role="listview">
+ <li data-role="list-divider">Set LockScreen Image</li>
+ </ul>
+ <ul data-role="listview" id="imageLS"></ul>
+ <ul data-role="listview">
+ <li data-role="list-divider">Get HomeScreen Image</li>
+ <li><div data-role="button" id="imageHG">HomeScreen Image</div></li>
+ <li data-role="list-divider">Get LockScreen Image</li>
+ <li><div data-role="button" id="imageLG">LockScreen Image</div></li>
+ <li data-role="list-divider">Canvas Image</li>
+ </ul>
+ <canvas id="canvas" style="width:100%; height:200px;"></canvas>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font style="font-size:85%">
+ <p>Check if the home/lock screen image is successfully changed</p><br>
+ <p>1. Click Home/LockScreen Image</p>
+ <p>2. Select an image for the home/lock screen background</p>
+ <p>3. Check if your selection is set as a home/lock screen background with the naked eye</p>
+ <p>4. Click HomeScreen Image and LockScreen Image to verify the background images are retrieved.</p>
+ </font>
+ </div>
+ </div>
+</body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Samsung Electronics 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.
+
+Authors:
+ Choi, Jongheon <j-h.choi@samsung.com>
+
+*/
+
+var path;
+
+$(document).delegate("#main", "pageinit", function() {
+ $("#imageHS").delegate("li", "vclick", function() {
+ path = $(this).data("url");
+ setSystemProperty("HOME_SCREEN", path, onScreenSetSuccess);
+ });
+ $("#imageLS").delegate("li", "vclick", function() {
+ path = $(this).data("url");
+ setSystemProperty("LOCK_SCREEN", path, onScreenSetSuccess);
+ });
+ $("#imageHG").bind("vclick", function() {
+ getSystemProperty("HOME_SCREEN", onScreenGetSuccess);
+ return false;
+ });
+ $("#imageLG").bind("vclick", function() {
+ getSystemProperty("LOCK_SCREEN", onScreenGetSuccess);
+ return false;
+ });
+ fileImage();
+});
+
+function onError(e) {
+ alert("Error: " + e.message);
+}
+
+function onScreenSetSuccess() {
+ alert("Change of SCREEN image");
+}
+
+function onScreenGetSuccess(value) {
+ alert("Image(Get) path : " + value);
+ var canvas = document.getElementById("canvas");
+ var cx = canvas.getContext("2d");
+ var image = new Image();
+ image.src = value;
+ cx.drawImage(image, 0, 0, 350, 200);
+}
+
+function setSystemProperty(property, path, onSuccess) {
+ try {
+ tizen.systemsetting.setProperty(property, path, onSuccess, onError);
+ console.log(path);
+ } catch (e) {
+ alert("Exception: " + e.message);
+ }
+}
+
+function getSystemProperty(property, onSuccess) {
+ try {
+ tizen.systemsetting.getProperty(property, onSuccess, onError);
+ } catch (e) {
+ alert("Exception: " + e.message);
+ }
+}
+
+function fileImage() {
+ var documentsDir, length = 0, str = "";
+ var len, last, ext;
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ if(files[i].isFile == true)
+ {
+ len = files[i].name.length;
+ last = files[i].name.lastIndexOf(".");
+ ext = files[i].name.substring(last, len);
+ if(ext == ".jpg" || ext == ".jpeg" || ext == ".bmp" || ext == ".png" || ext == ".gif")
+ {
+ var Url = files[i].toURI();
+ Url = Url.replace("file:///", "/");
+ str += '<li data-url="' + Url + '"><img src="' + files[i].toURI() + '" alt="" />' + " " + files[i].name + '</li>';
+ length++;
+ if(length >= 6)
+ break;
+ }
+ }
+ }
+ if(length == 0)
+ alert("Not found Image files.\nPlease add image files.\nAdd Path: " + documentsDir.toURI() + "/");
+ $("#imageHS").html(str).trigger("create").listview("refresh");
+ $("#imageLS").html(str).trigger("create").listview("refresh");
+ }
+
+ function onerror(error) {
+ console.log("The error " + error.message + " occurred when listing the files in the selected folder");
+ }
+
+ tizen.filesystem.resolve(
+ 'images',
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error " + e.message);
+ }, "r"
+ );
+}
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2014 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Liu, yun <yunx.liu@intel.com>
+
+-->
+
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../css/main.css" />
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/tests.js"></script>
+ <script src="js/main.js"></script>
+ <style>
+ #consolelog {
+ width: 98%;
+ height: 250px;
+ overflow: auto;
+ border: 1px solid;
+ margin: 0px auto;
+ }
+ </style>
+ </head>
+ <body>
+ <div data-role="header">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div data-role="content">
+ <div id="consolelog">
+ </div>
+ <div id="contentbutton">
+ <div class="ui-grid-c">
+ <div class="ui-block-a"><a id="add_service_listener_btn" data-role="button">Add Service Listeners</a></div>
+ <div class="ui-block-b"><a id="add_call_listeners_btn" data-role="button">Add Call Listeners</a></div>
+ <div class="ui-block-c"><a id="services_btn" data-role="button">Get Services</a></div>
+ <div class="ui-block-d"><a id="get_dservice_btn" data-role="button">Get Default Service</a></div>
+ </div>
+ <div class="ui-grid-d">
+ <div class="ui-block-a"><a id="active_call_btn" data-role="button">Get Active Call</a></div>
+ <div class="ui-block-b"><a id="get_calls_btn" data-role="button">Get All Calls</a></div>
+ <div class="ui-block-c"><a id="dial_btn" data-role="button">Dial</a></div>
+ <div class="ui-block-d" style="text-align: right; padding-top:20px;">Number: </div>
+ <div class="ui-block-e"><input type="text" id="dial_input"/></div>
+ </div>
+ <div class="ui-grid-d">
+ <div class="ui-block-a"><a id="conf_btn" data-role="button">Create Conference</a></div>
+ <div class="ui-block-b"><a id="conf_parties_btn" data-role="button">Get Conference Participants</a></div>
+ <div class="ui-block-c"><a id="split_btn" data-role="button">Split</a></div>
+ <div class="ui-block-d" style="text-align: right; padding-top:20px;">Call Id: </div>
+ <div class="ui-block-e"><input type="text" id="split_input"/></div>
+ </div>
+ <div class="ui-grid-c">
+ <div class="ui-block-a"><a id="disconnect_btn" data-role="button">Disconnect Active Call</a></div>
+ <div class="ui-block-b"><a id="disconnect_all_btn" data-role="button">Disconnect All Calls</a></div>
+ <div class="ui-block-c"><a id="hold_btn" data-role="button">Hold Active Call</a></div>
+ <div class="ui-block-d"><a id="resume_btn" data-role="button">Resume Held Call</a></div>
+ </div>
+ <div class="ui-grid-c">
+ <div class="ui-block-a"><a id="accept_btn" data-role="button">Accept Incoming/Waiting Call</a></div>
+ <div class="ui-block-b"><a id="deflect_btn" data-role="button">Deflect Incoming/Waiting Call</a></div>
+ <div class="ui-block-c" style="text-align: right; padding-top:20px;">To Number: </div>
+ <div class="ui-block-d"><input type="text" id="deflect_input"/></div>
+ </div>
+ <div class="ui-grid-c">
+ <div class="ui-block-a"><a id="transfer_btn" data-role="button">Transfer Incoming/Waiting call</a></div>
+ <div class="ui-block-b"><a id="emerg_nr_btn" data-role="button">Get Emergency Numbers</a></div>
+ <div class="ui-block-c"><a id="remove_call_listeners_btn" data-role="button">Remove Call Listeners</a></div>
+ <div class="ui-block-d"><a id="remove_service_listeners_btn" data-role="button">Remove Service Listeners</a></div>
+ </div>
+ <div class="ui-grid-d">
+ <div class="ui-block-a"><a id="sendtones_btn" data-role="button">Send Tones</a></div>
+ <div class="ui-block-b" style="text-align: right; padding-top:20px;">[0..9, A..F, p]: </div>
+ <div class="ui-block-c"><input type="text" id="tones_input"/></div>
+ <div class="ui-block-d"><a id="starttone_btn" data-role="button">Start Tone</a></div>
+ <div class="ui-block-e"><a id="endtone_btn" data-role="button">End Tone</a></div>
+ </div>
+ <div class="ui-grid-c">
+ <div class="ui-block-a" style="text-align: right; padding-top:20px;">Service Id: </div>
+ <div class="ui-block-b"><input type="text" id="service_id_input"/></div>
+ <div class="ui-block-c"><a id="get_service_btn" data-role="button">Show</a></div>
+ <div class="ui-block-d"><a id="set_dservice_btn" data-role="button">Set As Default</a></div>
+ </div>
+ <div class="ui-grid-b">
+ <div class="ui-block-a"><a id="enable_service_btn" data-role="button">Enable Service</a></div>
+ <div class="ui-block-b"><a id="disable_service_btn" data-role="button">Disable Service</a></div>
+ <div class="ui-block-c"><a id="clearconsole_btn" data-role="button">Clear Console Output</a></div>
+ </div>
+ </div>
+ </div>
+ <div data-role="footer" data-position="fixed">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font style="font-size:85%">
+ <p>Test Purpose: </p>
+ <p>Verifies the telephony is supported and valid</p>
+ <p>Test Steps: </p>
+ <ol>
+ <li>Click the "Add Service Listeners"</li>
+ <li>Click the "Add Call Listeners"</li>
+ <li>Click the "Get Services"</li>
+ <li>Click the "Get Default Service"</li>
+ <li>Click the "Get Active Call"</li>
+ <li>Click the "Get All Calls"</li>
+ <li>Click the "Dial"</li>
+ <li>Click the "Create Conference"</li>
+ <li>Click the "Get Conference Participants"</li>
+ <li>Click the "Split"</li>
+ <li>Click the "Disconnect Active Call"</li>
+ <li>Click the "Disconnect All Calls\'</li>
+ <li>Click the "Hold Active Call"</li>
+ <li>Click the "Resume Held Call"</li>
+ <li>Click the "Accept Incoming/Waiting Call"</li>
+ <li>Click the "Deflect Incoming/Waiting Call"</li>
+ <li>Click the "Transfer Incoming/Waiting call"</li>
+ <li>Click the "Get Emergency Numbers"</li>
+ <li>Click the "Remove Call Listeners"</li>
+ <li>Click the "Remove Service Listeners"</li>
+ <li>Click the "Send Tones"</li>
+ <li>Click the "Start Tone"</li>
+ <li>Click the "End Tone"</li>
+ <li>Click the "Show"</li>
+ <li>Click the "Set As Default"</li>
+ <li>Click the "Enable Service"</li>
+ <li>Click the "Disable Service"</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if get telephony services and operate telephony successfully</p>
+ </font>
+ </div>
+ </body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2014 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Liu, yun <yunx.liu@intel.com>
+
+*/
+
+var telephony = tizen.telephony;
+var output = document.getElementById("consolelog");
+
+function onError(error, text) {
+ var t, en, em;
+ if (error) {
+ en = ':' + error.name;
+ em = ';' + error.message;
+ } else {
+ em = en = '';
+ }
+ if (text)
+ t = '[' + text + ']';
+ else
+ t = null;
+ print('Error' + t + en + em);
+ return null;
+}
+
+function print(message) {
+ $("#consolelog").html("<p>" + message + "</p>" + $("#consolelog").html());
+}
+
+function printVal(thing, depth) {
+ var out, key;
+ if (thing instanceof Function) {
+ out += '{}';
+ } else if (thing instanceof Array) {
+ out = '[ ';
+ for (key in thing)
+ out += printVal(thing[key], depth + 1) + ', ';
+ out += ']';
+ } else if (thing instanceof Object) {
+ var tabs = '';
+ for (var i = 0; i < depth; i++)
+ tabs += '\t';
+ out = '\n' + tabs + '{';
+ for (key in thing) {
+ if (!(thing[key] instanceof Function))
+ out += '\n' + tabs + '\t' + key + ': ' +
+ printVal(thing[key], depth + 1);
+ }
+ out += '\n' + tabs + '}';
+ } else {
+ out = thing;
+ }
+ return out;
+}
+
+function displayEntryList(array) {
+ $("#consolelog").html("<p>List count = " + array.length + "; " + printVal(array, 0) + "</p>" + $("#consolelog").html());
+}
+
+function readStringField(name) {
+ var input = document.getElementById(name);
+ if (input)
+ return input.value || null;
+ return onError(null, "Invalid " + name + ": " + id);
+}
+
+function getServiceIds() {
+ print("Getting telephony service id's...");
+ tizen.telephony.getServiceIds().then(
+ function(list) {
+ displayEntryList(list);
+ },
+ function(err) {
+ onError(err, 'getServiceIds');
+ });
+}
+
+function readService() {
+ var id = readStringField('service_id_input');
+ var s = tizen.telephony.getService(id);
+ if (!s)
+ return onError(null, "No service for id: " + id);
+ return s;
+}
+
+function setDefaultService() {
+ var id = readStringField('service_id_input');
+ tizen.telephony.setDefaultServiceId(id).then(
+ function() {
+ print('Default telephony service id set to ' + id);
+ },
+ function(err) {
+ onError(err, 'setDefaultService');
+ });
+}
+
+function getDefaultService() {
+ print("Default service id: " + tizen.telephony.defaultServiceId);
+}
+
+function getService() {
+ var service = readService();
+ if (service)
+ print('service[' + id + ']: ' + printVal(service));
+}
+
+function enableService() {
+ var service = readService();
+ if (service) {
+ service.setEnabled(true).then(
+ function() {
+ print('Enabled service id ' + service.serviceId);
+ },
+ function(err) {
+ onError(err, 'enableService');
+ });
+ }
+}
+
+function disableService() {
+ var service = readService();
+ if (service) {
+ service.setEnabled(false).then(
+ function() {
+ print('Disabled service id ' + service.serviceId);
+ },
+ function(err) {
+ onError(err, 'disableService');
+ });
+ }
+}
+
+function onServiceAdded(evt) {
+ print("onServiceAdded: " + printVal(evt.service));
+}
+
+function onServiceRemoved(evt) {
+ print("onServiceRemoved: " + printVal(evt.service));
+}
+
+function onDefaultServiceChanged(evt) {
+ print("onDefaultServiceChanged: " + printVal(evt.service));
+}
+
+function onCallAdded(evt) {
+ print("onCallAdded: " + printVal(evt.call));
+}
+
+function onCallRemoved(evt) {
+ print("onCallRemoved: " + printVal(evt.call));
+}
+
+function onActiveCallChanged(evt) {
+ print("onActiveCallChanged to: " + evt.call ? evt.call.callId : "null");
+}
+
+function onCallStateChanged(evt) {
+ print("onCallStateChanged: " + printVal(evt.call));
+}
+
+function addServiceListeners() {
+ if (!telephony) {
+ return onError(null, "telephony not supported");
+ }
+ tizen.telephony.addEventListener('serviceadded', onServiceAdded, false);
+ tizen.telephony.addEventListener('serviceremoved', onServiceRemoved, false);
+ tizen.telephony.addEventListener('defaultservicechanged', onDefaultServiceChanged, false);
+ print("Event listeners added for 'serviceadded', 'serviceremoved', 'defaultservicechanged'.");
+}
+
+function removeServiceListeners() {
+ if (!telephony) {
+ return onError(null, "telephony not supported");
+ }
+ tizen.telephony.removeEventListener('serviceadded', onServiceAdded, false);
+ tizen.telephony.removeEventListener('serviceremoved', onServiceRemoved, false);
+ tizen.telephony.removeEventListener('defaultservicechanged', onDefaultServiceChanged, false);
+ print("Event listeners removed for 'serviceadded', 'serviceremoved', 'defaultservicechanged'.");
+}
+
+function addCallListeners() {
+ if (!telephony) {
+ return onError(null, "telephony not supported");
+ }
+ tizen.telephony.addEventListener('calladded', onCallAdded, false);
+ tizen.telephony.addEventListener('callremoved', onCallRemoved, false);
+ tizen.telephony.addEventListener('activecallchanged', onActiveCallChanged, false);
+ tizen.telephony.addEventListener('callstatechanged', onCallStateChanged, false);
+ print("Event listeners added for 'calladded', 'callremoved', 'activecallchanged', 'callstatechanged'.");
+}
+
+function removeCallListeners() {
+ if (!telephony) {
+ return onError(null, "telephony not supported");
+ }
+ tizen.telephony.removeEventListener('calladded', onCallAdded, false);
+ tizen.telephony.removeEventListener('callremoved', onCallRemoved, false);
+ tizen.telephony.removeEventListener('activecallchanged', onActiveCallChanged, false);
+ tizen.telephony.removeEventListener('callstatechanged', onCallStateChanged, false);
+ print("Event listeners added for 'calladded', 'callremoved', 'activecallchanged', 'callstatechanged'.");
+}
+
+function getActiveCall() {
+ var ac = tizen.telephony.activeCall;
+ if (!ac)
+ print("No active call");
+ else
+ print("Active call: " + printVal(ac));
+}
+
+function getCalls() {
+ print('Getting telephony calls...');
+ tizen.telephony.getCalls().then(
+ function(list) {
+ displayEntryList(list);
+ },
+ function(err) {
+ onError(err, 'getCalls');
+ });
+}
+
+function hangupAllCalls() {
+ print("Disconnecting all calls...");
+ tizen.telephony.getCalls().then(
+ function(list) {
+ var found = false;
+ list.forEach(function(call) {
+ if (call.state == 'held' || call.state == 'active') {
+ found = true;
+ call.disconnect().then(
+ function(){
+ print("Call " + call.callId + " disconnected.");
+ },
+ function(err) {
+ onError(err, 'disconnect');
+ });
+ }
+ });
+ if (!found)
+ print('No calls.');
+ },
+ function(err) {
+ onError(err, 'getCalls');
+ });
+}
+
+function createConference() {
+ print("Creating conference call...");
+ if (!tizen.telephony.activeCall) {
+ print("No active call.");
+ return;
+ }
+ tizen.telephony.createConference().then(
+ function(confCall) {
+ print('Conference call created: ' + printVal(confCall));
+ },
+ function(err) {
+ onError(err, 'createConference');
+ });
+}
+
+function getParticipants() {
+ print("Getting participants of active conference call...");
+ var ac = tizen.telephony.activeCall;
+ if (!ac) {
+ print("No active call.");
+ } else if (!ac.conferenceId) {
+ print("Active call not a conference. Remote party: " + ac.remoteParty);
+ return;
+ }
+ tizen.telephony.getParticipants(id).then(
+ function(list) {
+ print('Conference participant calls: ');
+ displayEntryList(list);
+ },
+ function(err) {
+ onError(err, 'getParticipants');
+ });
+}
+
+function split() {
+ var id = readStringField('split_input');
+ print("Splitting call id " + id + ' from its conference call');
+ tizen.telephony.split(id).then(
+ function() {
+ print('Call id ' + id + ' split from conference and activated');
+ },
+ function(err) {
+ onError(err, 'split');
+ });
+}
+
+function dial() {
+ var number = readStringField('dial_input');
+ if (number) {
+ print('Dialing ' + number);
+ tizen.telephony.dial(number).then(
+ function() {
+ print('Dialing ' + number + ' successful.');
+ },
+ function(err) {
+ onError(err, 'dial');
+ });
+ }
+}
+
+function accept() {
+ print("Accepting incoming/waiting call...");
+ tizen.telephony.getCalls().then(
+ function(list) {
+ var found = false;
+ list.forEach(function(call) {
+ if (call.state == 'incoming' || call.state == 'waiting') {
+ var state = call.state;
+ found = true;
+ call.accept().then(
+ function(){
+ print("Accepted " + state + " call: ");
+ print(call);
+ },
+ function(err) {
+ onError(err, 'accept');
+ });
+ }
+ });
+ if (!found)
+ print("No incoming or waiting calls")
+ },
+ function(err) {
+ onError(err, 'getCalls');
+ });
+}
+
+function disconnect() {
+ print("Disconnecting active call...");
+ if (!tizen.telephony.activeCall) {
+ print("No active calls");
+ return;
+ }
+ var id = tizen.telephony.activeCall.callId;
+ tizen.telephony.activeCall.disconnect().then(
+ function() {
+ print('Disconnected call id ' + id);
+ },
+ function(err) {
+ onError(err, 'disconnect');
+ });
+}
+
+function hold() {
+ print("Holding active call...");
+ if (!tizen.telephony.activeCall) {
+ print("No active calls");
+ return;
+ }
+ var call = tizen.telephony.activeCall;
+ call.hold().then(
+ function() {
+ print('Held call id ' + call.callId);
+ },
+ function(err) {
+ onError(err, 'hold');
+ });
+}
+
+function resume() {
+ print("Resuming held call...");
+ tizen.telephony.getCalls().then(
+ function(list) {
+ var found = false;
+ list.forEach(function(call) {
+ if (call.state == 'held') {
+ found = true;
+ call.resume().then(
+ function(){
+ print("Resumed call: " + call.callId);
+ },
+ function(err) {
+ onError(err, 'resume');
+ });
+ }
+ });
+ if (!found)
+ print("No held calls")
+ },
+ function(err) {
+ onError(err, 'getCalls');
+ });
+}
+
+function deflect() {
+ print("Deflecting incoming/waiting call...");
+ var number = readStringField('deflect_input');
+ if (!number)
+ return;
+ tizen.telephony.getCalls().then(
+ function(list) {
+ var found = false;
+ list.forEach(function(call) {
+ if (call.state == 'incoming' || call.state == 'waiting') {
+ var state = call.state;
+ found = true;
+ call.deflect(number).then(
+ function(){
+ print("Deflected " + state + " call: " + call.callId);
+ },
+ function(err) {
+ onError(err, 'deflect');
+ });
+ }
+ });
+ if (!found)
+ print("No incoming or waiting calls")
+ },
+ function(err) {
+ onError(err, 'getCalls');
+ });
+}
+
+function transfer() {
+ print("Transfer: joining the active and held calls, then disconnect...");
+ if (!tizen.telephony.activeCall) {
+ print("No active call");
+ return;
+ }
+ // not checking the held calls now, the system will signal error anyway
+ tizen.telephony.transfer().then(
+ function(){
+ print("Transferred " + state + " call: " + call.callId);
+ },
+ function(err) {
+ onError(err, 'transfer');
+ });
+}
+
+function sendTones() {
+ var tones = readStringField('tones_input');
+ if (!tones)
+ return;
+ tizen.telephony.sendTones(tones).then(
+ function() {
+ print('Tones sent: ' + tones);
+ },
+ function(err) {
+ onError(err, 'sendTones');
+ });
+}
+
+function startTone() {
+ var tones = readStringField('tones_input');
+ if (!tones)
+ return;
+ tizen.telephony.startTone(tones).then(
+ function() {
+ print('Tone started: ' + tones);
+ },
+ function(err) {
+ onError(err, 'startTone');
+ });
+}
+
+function stopTone() {
+ var tones = readStringField('tones_input');
+ if (!tones)
+ return;
+ tizen.telephony.stopTone(tones).then(
+ function() {
+ print('Tone stopped: ' + tones);
+ },
+ function(err) {
+ onError(err, 'stopTone');
+ });
+}
+
+function getEmergencyNumbers() {
+ tizen.telephony.getEmergencyNumbers().then(
+ function(list) {
+ print('Emergency number list: ');
+ displayEntryList(list);
+ },
+ function(err) {
+ onError(err, 'getEmergencyNumbers');
+ });
+}
+
+function clearConsole() {
+ $("#consolelog").html("");
+}
+
+$(document).ready(function() {
+ $("#consolelog").html("");
+ $("#add_service_listener_btn").click(addServiceListeners);
+ $("#add_call_listeners_btn").click(addCallListeners);
+ $("#services_btn").click(getServiceIds);
+ $("#get_dservice_btn").click(getDefaultService);
+ $("#active_call_btn").click(getActiveCall);
+ $("#get_calls_btn").click(getCalls);
+ $("#dial_btn").click(dial);
+ $("#conf_btn").click(createConference);
+ $("#conf_parties_btn").click(getParticipants);
+ $("#split_btn").click(split);
+ $("#disconnect_btn").click(disconnect);
+ $("#disconnect_all_btn").click(hangupAllCalls);
+ $("#hold_btn").click(hold);
+ $("#resume_btn").click(resume);
+ $("#accept_btn").click(accept);
+ $("#deflect_btn").click(deflect);
+ $("#transfer_btn").click(transfer);
+ $("#emerg_nr_btn").click(getEmergencyNumbers);
+ $("#remove_call_listeners_btn").click(removeCallListeners);
+ $("#remove_service_listeners_btn").click(removeServiceListeners);
+ $("#sendtones_btn").click(sendTones);
+ $("#starttone_btn").click(startTone);
+ $("#endtone_btn").click(stopTone);
+ $("#get_service_btn").click(getService);
+ $("#set_dservice_btn").click(setDefaultService);
+ $("#enable_service_btn").click(enableService);
+ $("#disable_service_btn").click(disableService);
+ $("#clearconsole_btn").click(clearConsole);
+});
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Lin, Wanming <wanmingx.lin@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width">
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/tests.js"></script>
+ </head>
+
+ <body>
+ <div data-role="header">
+ <h1 id="main_page_title"></h1>
+ </div>
+
+ <div id="content">
+ Hello World !
+ </div>
+ <div data-role="footer" data-position="fixed">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <p>Test Info</p>
+ </div>
+ </body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Lin, Wanming <wanmingx.lin@intel.com>
+
+*/
+
+.scroll_eare {
+ background: #eee;
+ border: 1px solid #ccc;
+ height: 230px;
+ font-weight: bold;
+ text-shadow: 0 1px 0 #fff;
+ margin-bottom: 10px;
+ background-image: -webkit-gradient(linear,left top,left bottom,from( #fff ),to( #f1f1f1 ));
+ background-image: -webkit-linear-gradient( #fff,#f1f1f1 );
+ background-image: -moz-linear-gradient( #fff,#f1f1f1 );
+ background-image: -ms-linear-gradient( #fff,#f1f1f1 );
+ background-image: -o-linear-gradient( #fff,#f1f1f1 );
+ background-image: linear-gradient( #fff,#f1f1f1 );
+}
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Xin, liu <xinx.liu@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width">
+ <link rel="stylesheet" type="text/css" href="css/style.css"/>
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../css/main.css" />
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/tests.js"></script>
+ <script src="js/main.js"></script>
+ <style>
+ .target {
+ left: 145px;
+ top:300px;
+ position: absolute;
+ }
+ </style>
+ </head>
+ <body>
+ <div data-role="header">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div data-role="content">
+ <table id="tabletouch" cellpadding="5">
+ <tr>
+ <td><img id="image1" src="img/btn_up.png" height="100" width="100" /></td>
+ <td><img id="image2" src="img/btn_up.png" height="100" width="100" /></td>
+ <td><img id="image3" src="img/btn_up.png" height="100" width="100" /></td>
+ </tr>
+ </table>
+ <p id="testresult">Touch info: no button touched</p>
+ <div id="scrollEare" class="scroll_eare">
+ <div id="scrollTarget" class="target"><img id="imageScroll" src="img/scroll.png" height="80" width="80" /></div>
+ </div>
+ <p class="ui-li-desc">* Drag this red button in above eare.</p>
+ <p id="errormessage"></p>
+ </div>
+ <div data-role="footer" data-position="fixed">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font class="fontSize">
+ <p>Test Purpose: </p>
+ <p>Verifies the device supports single touch, two fingers touch and three fingers touch by clicking the blue buttons, and supports move touch by dragging the red button.</p>
+ <p>Expected Result: </p>
+ <p>Test passes if all the tips "one button touched, two buttons touched at one time, three buttons touched at one time" show and the red button can be dragged.</p>
+ </font>
+ </div>
+ </body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Xin, liu <xinx.liu@intel.com>
+
+*/
+
+jQuery(document).ready(function() {
+ try {
+ DisablePassButton();
+ var scrollTarget = $("#scrollTarget")[0];
+ var step1 = false; var step2 = false; var step3 = false;
+ //touchstart event
+ document.getElementById("tabletouch").addEventListener('touchstart', function (event){
+ var images = new Array("image1","image2","image3");
+ var touches = event.touches;
+ var resultMessage =["one button touched", "two buttons touched at one time", "three buttons touched at one time"];
+ if(touches.length ==1){
+ step1 = true;
+ }
+ if(touches.length ==2){
+ step2 = true;
+ }
+ if(touches.length ==3){
+ step3 = true;
+ }
+ $("#testresult").html("Touch info: " + resultMessage[touches.length-1]);
+ for(var k=0;k<touches.length;k++){
+ var touch = touches.item(k);
+ for(var i=0;i<images.length;i++){
+ image = $("#"+images[i])[0];
+ if(touch.clientX > getLeft(image) && touch.clientX <getLeft(image)+100 && touch.clientY > getTop(image) & touch.clientY <getTop(image)+100){
+ image.src = "img/btn_down.png";
+ }
+ }
+ }
+ }, false);
+
+ //touchmove event
+ document.getElementById("scrollTarget").addEventListener('touchmove', function (event){
+ var image = $("#imageScroll")[0];
+ image.src = "img/btn_down.png";
+ var changedTouches = event.changedTouches;
+ if(changedTouches.item(0).clientX <= getLeft($("#scrollEare")[0])+40){
+ scrollTarget.style.left = getLeft($("#scrollEare")[0])+"px";
+ }else if(changedTouches.item(0).clientX >= getLeft($("#scrollEare")[0])+250){
+ scrollTarget.style.left = getLeft($("#scrollEare")[0])+250 +"px";
+ }else{
+ scrollTarget.style.left = changedTouches.item(0).clientX-40 +"px";
+ }
+ if(changedTouches.item(0).clientY <= getTop($("#scrollEare")[0])+40){
+ scrollTarget.style.top =getTop($("#scrollEare")[0]) +"px";
+ } else if(changedTouches.item(0).clientY >= getTop($("#scrollEare")[0])+150){
+ scrollTarget.style.top =getTop($("#scrollEare")[0])+150 +"px";
+ } else{
+ scrollTarget.style.top = changedTouches.item(0).clientY-40 +"px";
+ }
+ }, false);
+
+ //touchend event
+ document.getElementById("scrollTarget").addEventListener('touchcancel', function (event){
+ var image = $("#imageScroll")[0];
+ image.src = "img/scroll.png";
+ }, false);
+
+ document.getElementById("scrollTarget").addEventListener('touchend', function (event){
+ var image = $("#imageScroll")[0];
+ if(image.src.toString().indexOf("scroll.png") == -1){
+ $("#errormessage").html("touchcancel event can not be fired");
+ }
+ }, false);
+
+ //touchend event
+ document.getElementById("tabletouch").addEventListener('touchend', function (event){
+ if(step1 && step2 && step3){
+ EnablePassButton();
+ }
+ var images = new Array("image1","image2","image3");
+ for(var i=0;i<images.length;i++){
+ image = $("#"+images[i])[0];
+ image.src = "img/btn_up.png";
+ }
+ }, false);
+ } catch (err) {
+ jQuery("#testresult").html("Html Console:" + err.message);
+ }
+
+ function getTop(e){
+ var offset=e.offsetTop;
+ if(e.offsetParent!=null) offset+=getTop(e.offsetParent);
+ return offset;
+ }
+
+ function getLeft(e){
+ var offset=e.offsetLeft;
+ if(e.offsetParent!=null) offset+=getLeft(e.offsetParent);
+ return offset;
+ }
+});
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Li, Hao <haox.li@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../css/main.css" />
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/tests.js"></script>
+ <script>
+ $(document).ready(function(){
+ jQuery("#user-agent-string").text(navigator.userAgent);
+ var agent_string = navigator.userAgent;
+ var tizen_platform_ver = agent_string.substring(agent_string.indexOf("(")+1, agent_string.indexOf(")"));
+ var khtml = agent_string.substring(agent_string.lastIndexOf("(")+1, agent_string.lastIndexOf(")"));
+ agent_string = agent_string.replace("("+tizen_platform_ver+")","");
+ agent_string = agent_string.replace("("+khtml+")","");
+ agent_string = agent_string.replace(" ", " ");
+ agent_string = agent_string.replace(" ", " ");
+ var platform_ver_array = tizen_platform_ver.split(";");
+
+ if(platform_ver_array.length == 3){ // tizen
+ jQuery("#user-platform-ver").text(platform_ver_array[1]);
+ jQuery("#user-model-string").text(platform_ver_array[2]);
+ } else if(platform_ver_array.length == 2){ // chrome
+ jQuery("#user-platform-ver").text(platform_ver_array[1]);
+ jQuery("#user-model-string").text("N/A");
+ } else if(platform_ver_array.length == 4){ //firefox
+ jQuery("#user-platform-ver").text(platform_ver_array[2]);
+ jQuery("#user-model-string").text("N/A");
+ }
+
+ var agent_string_array = agent_string.split(" ");
+ if(agent_string_array.length == 6){ //chrome
+ jQuery("#user-apple-webkit-ver").text(agent_string_array[1].substr(agent_string_array[1].indexOf("\/")+1));
+ jQuery("#user-app-name").text(agent_string_array[4].substring(0, agent_string_array[4].indexOf("\/")));
+ jQuery("#user-app-ver").text(agent_string_array[4].substr(agent_string_array[4].indexOf("\/")+1));
+ } else if(agent_string_array.length == 5){ //tizen
+ jQuery("#user-apple-webkit-ver").text(agent_string_array[1].substr(agent_string_array[1].indexOf("\/")+1));
+ jQuery("#user-app-name").text(agent_string_array[2].substring(0, agent_string_array[2].indexOf("\/")));
+ jQuery("#user-app-ver").text(agent_string_array[2].substr(agent_string_array[2].indexOf("\/")+1));
+ }
+ });
+ </script>
+ <style type="text/css">
+ .d{
+ border: 1px solid #000;
+ width:100%;
+ height:280px;
+ }
+ .d li{
+ margin: 10px 5px;
+
+ }
+ #user-agent-string {
+ list-style : none;
+ }
+ .tips{
+ color: red;
+ }
+ </style>
+ </head>
+ <body>
+ <div data-role="header">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div data-role="content">
+ <div class="d">
+ <ul>
+ <li>User-Agent:</li>
+ <li id="user-agent-string"><span class="tips">Failed to get user agent string</span></li>
+ <li>PLATFORM_VER: <span id="user-platform-ver"></span></li>
+ <li>MODEL: <span id="user-model-string"></span></li>
+ <li>APPLE_WEBKIT_VER: <span id="user-apple-webkit-ver"></span></li>
+ <li>APP_NAME: <span id="user-app-name"></span></li>
+ <li>APP_VER: <span id="user-app-ver"></span></li>
+ </ul>
+ </div>
+ </div>
+ <div data-role="footer" data-position="fixed">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font class="fontSize">
+ <p>Test Purpose: </p>
+ <p>Verifies the user agent string follow correct format.</p>
+ <p>Expected Result: </p>
+ <p>Test passes if the user agent string reported by the Web View follow this format:</p>
+ <p>Mozilla/5.0 (Linux; Tizen PLATFORM_VER; MODEL) AppleWebKit/APPLE_WEBKIT_VER (KHTML, like Gecko) APP_NAME/APP_VER Mobile Safari/APPLE_WEBKIT_VER</p>
+ <ul>
+ <li>The value of the PLATFORM_VER string MUST be the platform version of the device.</li>
+ <li>The value of the MODEL string SHOULD be the same as the name of the device.</li>
+ <li>The value of the APPLE_WEBKIT_VER string MUST be "537.3".</li>
+ <li>The value of the APP_NAME string SHOULD be the same as the name of the application.</li>
+ <li>The value of the APP_VER string SHOULD be the same as the version of the application.</li>
+ <li>Device implementations MAY omit the word “Mobile” from the user agent string.</li>
+ </ul>
+ </font>
+ </div>
+ </body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Liu, Xin <xinx.liu@intel.com>
+
+*/
+.ui-slider .ui-btn-inner {
+ padding: 6px 0 0 0 !important;
+ font-size:.9em;
+}
+div.ui-slider {
+ margin: 0 2% 10px 0px;
+ width: 100%;
+}
+
+.containing-element {
+ padding-top: 20px;
+}
+
+.containing-element .ui-slider-switch { width: 100% }
+
+.containing-element .ui-controlgroup-controls { width: 100% }
+
+.ui-radio { width: 50% }
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Lin, Wanming <wanmingx.lin@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width">
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../css/main.css" />
+ <link rel="stylesheet" type="text/css" href="css/style.css" />
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/tests.js"></script>
+ <script src="js/main.js"></script>
+ <script src="js/jquery/slider.tooltip.js"></script>
+ <style>
+ .vibration {
+ text-align: left
+ }
+ .opt {
+ text-align: left
+ }
+ </style>
+ </head>
+ <body>
+ <div data-role="header">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div data-role="content">
+ <div class="containing-element">
+ <label for="slider-1" class="vibration">Vibration Time(s)</label>
+ <input type="range" name="slider-1" id="slider-1" data-highlight="true" min="0.50" max="3" step="0.10" value="1" data-show-value="true" class="hideButton">
+ <label for="slider-1" class="vibration">Vibration Periods(s)</label>
+ <input type="range" name="slider-2" id="slider-2" data-highlight="true" min="0.10" max="2" step="0.10" value="0.50" data-show-value="true" class="hideButton">
+ <label for="slider-1" class="vibration">Vibration Number</label>
+ <input type="range" name="slider-3" id="slider-3" data-highlight="true" min="1" max="20" value="2" data-show-value="true" class="hideButton">
+ <p><a href="javascript:startVibration()" id="start" data-role="button" class="opt">Start Vibration</a></p>
+ <a href="javascript:stopVibration()" id="stop" data-role="button" class="opt">Stop Vibration</a>
+ </div>
+ </div>
+ <div data-role="footer" data-position="fixed">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font class="fontSize">
+ <p>Test Purpose: </p>
+ <p>Verifies the vibration is able to adjust vibration time from 500ms to 3000ms, vibration period from 100ms to 2000ms, and vibration number from 1 to 20. E.g, if vibration time is 1000ms, vibration period is 2000ms and vibration number is 3, then the test device vibrates 3 times in 6 seconds, and vibrates 1 second a time.</p>
+ <p>Expected Result: </p>
+ <p>Test passes if the vibration functions work well.</p>
+ </font>
+ </div>
+ </body>
+</html>
--- /dev/null
+Copyright (c) 2013 Intel Corporation.
+Except as noted, this software is licensed under BSD-3-Clause License.
+Please, see the LICENSE.BSD-3 file for the BSD-3-Clause License.
+
+Following resources are licensed under its own license.
+
+slider.tooltip.js:
+The above file is licensed under jQuery MIT License:
+From https://github.com/jquery/jquery-mobile
+Please see the LICENSE.MIT for the MIT terms and conditions.
--- /dev/null
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Slider tooltip extension
+//>>label: Slidertooltip
+//>>group: Forms
+//>>css.theme: ../css/themes/default/jquery.mobile.theme.css
+//>>css.structure: ../css/structure/jquery.mobile.slider.tooltip.css
+
+//define( [ "jquery", "./slider" ], function( $ ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, undefined ) {
+
+$.widget( "mobile.slider", $.mobile.slider, {
+ options: {
+ popupEnabled: false,
+ showValue: false
+ },
+
+ _create: function() {
+ var o = this.options,
+ popup = $( "<div></div>", {
+ class: "ui-slider-popup ui-shadow ui-corner-all ui-body-" + ( o.theme ? o.theme : $.mobile.getInheritedTheme( this.element, "c" ) )
+ });
+
+ this._super();
+
+ $.extend( this, {
+ _currentValue: null,
+ _popup: popup,
+ _popupVisible: false,
+ _handleText: this.handle.find( ".ui-btn-text" )
+ });
+
+ this.slider.before( popup );
+ popup.hide();
+
+ this._on( this.handle, { "vmousedown" : "_showPopup" } );
+ this._on( this.slider.add( $.mobile.document ), { "vmouseup" : "_hidePopup" } );
+ this._refresh();
+ },
+
+ // position the popup centered 5px above the handle
+ _positionPopup: function() {
+ var dstOffset = this.handle.offset();
+ this._popup.offset( {
+ left: dstOffset.left + ( this.handle.width() - this._popup.width() ) / 2,
+ top: dstOffset.top - this._popup.outerHeight() - 5
+ });
+ },
+
+ _setOption: function( key, value ) {
+ this._super( key, value );
+
+ if ( key === "showValue" ) {
+ if ( value ) {
+ this._handleText.html( this._value() ).show();
+ } else {
+ this._handleText.hide();
+ }
+ }
+ },
+
+ // show value on the handle and in popup
+ refresh: function() {
+ this._super.apply( this, arguments );
+
+ // necessary because slider's _create() calls refresh(), and that lands
+ // here before our own _create() has even run
+ if ( !this._popup ) {
+ return;
+ }
+
+ this._refresh();
+ },
+
+ _refresh: function() {
+ var o = this.options, newValue;
+
+ if ( o.popupEnabled ) {
+ // remove the title attribute from the handle (which is
+ // responsible for the annoying tooltip); NB we have
+ // to do it here as the jqm slider sets it every time
+ // the slider's value changes :(
+ this.handle.removeAttr( 'title' );
+ }
+
+ newValue = this._value();
+ if ( newValue === this._currentValue ) {
+ return;
+ }
+ this._currentValue = newValue;
+
+ var ID = this.element[0].id;
+ if (ID == "slider-1") {
+ vibration_time = Number($("#slider-1").val())*1000;
+ } else if (ID == "slider-2") {
+ vibration_periods = Number($("#slider-2").val())*1000;
+ } else if (ID == "slider-3") {
+ vibration_number = $("#slider-3").val();
+ }
+
+ if ( o.popupEnabled ) {
+ this._positionPopup();
+ this._popup.html( newValue );
+ }
+
+ if ( o.showValue ) {
+ this._handleText.html( newValue );
+ }
+ },
+
+ _showPopup: function() {
+ if ( this.options.popupEnabled && !this._popupVisible ) {
+ this._handleText.hide();
+ this._popup.show();
+ this._positionPopup();
+ this._popupVisible = true;
+ }
+ },
+
+ _hidePopup: function() {
+ if ( this.options.popupEnabled && this._popupVisible ) {
+ this._handleText.show();
+ this._popup.hide();
+ this._popupVisible = false;
+ }
+ }
+});
+
+})( jQuery );
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Liu, Xin <xinx.liu@intel.com>
+
+*/
+
+var vibration_time, vibration_periods, vibration_number;
+
+jQuery(document).ready(function() {
+ DisablePassButton();
+ // style setting
+ $(':jqmData(role=content)').css("text-align", "center");
+ $(':jqmData(role=content)').find(':jqmData(role=button) > span:first-child').css('padding', '15px 30px');
+
+ vibration_time = Number($("#slider-1").val())*1000;
+ vibration_periods = Number($("#slider-2").val())*1000;
+ vibration_number = $("#slider-3").val();
+});
+
+function startVibration() {
+ $("#start").addClass("ui-disabled");
+ var time_value=(Number(vibration_time)+Number(vibration_periods)) * Number(vibration_number);
+ setTimeout(function(){
+ $("#start").removeClass("ui-disabled");}, time_value);
+ var pattern = [];
+ for(var i=0; i<2*vibration_number ;i++){
+ if(i%2==0){
+ pattern.push(vibration_time-0);
+ } else {
+ pattern.push(vibration_periods-0);
+ }
+ }
+ navigator.vibrate(pattern);
+ EnablePassButton();
+}
+
+function stopVibration() {
+ navigator.vibrate(0);
+ $("#start").removeClass("ui-disabled");
+}
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<widget xmlns="http://www.w3.org/ns/widgets" xmlns:tizen="http://tizen.org/ns/widgets" id="http://tizen.org/test/ViewportTest" version="0.1" viewmodes="">
+ <icon src="icon.png" height="117" width="117"/>
+ <name>ViewportTest</name>
+ <tizen:application id="sanitytest.ViewportTest" package="sanitytest" required_version="2.2"/>
+ <tizen:setting screen-orientation="landscape"/>
+</widget>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2014 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Li, Hao <haox.li@intel.com>
+
+-->
+
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Viewport</title>
+ <link rel="stylesheet" type="text/css" href="style.css" />
+ <script src="support.js"></script>
+ </head>
+ <body onload="run()">
+ <div id="test">The initial page is no viewport, and maybe same with the viewport setting device-width and device-height, but scalable to smaller if device support the scale</div>
+ <div id="contorl">
+ <button id="btn2">width=device-width, height=device-height</button>
+ <button id="btn3">initial-scale=2.0, user-scalable=no</button>
+ <button id="btn4">minimum-scale=1.0, maximum-scale=3.0, user-scalable=yes</button>
+ <button id="back">Complete Test</button>
+ </div>
+ </body>
+</html>
+
--- /dev/null
+{
+ "version": "0.0.1",
+ "name": "ViewportTest",
+ "permissions": ["tabs", "unlimited_storage", "notifications", "http://*/*", "https://*/*"],
+ "description": "ViewportTest",
+ "file_name": "manifest.json",
+ "app": {
+ "launch": {
+ "local_path": "index.html"
+ }
+ },
+ "icons": {
+ "128": "icon.png"
+ }
+}
--- /dev/null
+/*
+Copyright (c) 2014 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+Li, Hao <haox.li@intel.com>
+
+*/
+
+body {
+ margin: 0px;
+ padding: 0px;
+}
+
+#test {
+ border: 1px solid black;
+ height: 100px;
+ padding: 5px;
+ margin: 5px;
+ width: 290px;
+}
+
+#contorl {
+ margin: 5px;
+ width: 300px;
+}
+
+#contorl button {
+ background: #eee;
+ border: 1px solid #ccc;
+ border-radius: 3px;
+ font-weight: bold;
+ font-size: 15px;
+ padding: 5px;
+ margin: 5px 0px;
+ width: 100%;
+}
+
--- /dev/null
+/*
+Copyright (c) 2014 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+Li, Hao <haox.li@intel.com>
+
+*/
+
+function addViewport(content) {
+ var viewport = document.querySelector("meta[name=viewport]");
+ if(!viewport) {
+ viewport = document.createElement("meta");
+ viewport.setAttribute("name", "viewport");
+ document.querySelector("head").insertBefore(viewport);
+ }
+
+ if(content != "") {
+ viewport.setAttribute("content", content);
+ }
+}
+
+function result(expected) {
+ document.getElementById("test").innerText = expected;
+}
+
+function run() {
+ document.getElementById("btn2").onclick = function () {
+ addViewport(this.innerText);
+ result("The width and height of page should be same as the device, and not scale more smaller");
+ }
+ document.getElementById("btn3").onclick = function () {
+ addViewport(this.innerText);
+ result("The page will be scaled to bigger than the initial page, and not scalable");
+ }
+ document.getElementById("btn4").onclick = function () {
+ addViewport(this.innerText);
+ result("The page is scalable for 1~3 times if device support the scale");
+ }
+ document.getElementById("back").onclick = function () {
+ window.close();
+ }
+}
+
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Tan, Shiyou <shiyoux.tan@intel.com>
+ Li, Hao <haox.li@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width">
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../css/main.css" />
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/main.js"></script>
+ <script src="../../js/tests.js"></script>
+ <style>
+ ol ul li {
+ margin: 5px 0px;
+ }
+ </style>
+ </head>
+ <body>
+ <input type="hidden" id="sub_test"/>
+ <div data-role="header">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div id="content">
+ <ol>
+ <li>Launch sub app "ViewportTest"</li>
+ <ul>
+ <li>On IVI:</li>
+ <ol>
+ <li>Swith to "app" user: su app</li>
+ <li>Get "ViewportTest" app id: app-launcher -l</li>
+ <li>Launch "ViewportTest": app-launcher -s <app-id></li>
+ </ol>
+ </ul>
+ <li>Click the button in "ViewportTest" to test Viewport</li>
+ </ol>
+ </div>
+ <div data-role="footer" data-position="fixed">
+ </div>
+ <div data-role="popup" id="popup_info">
+ <font class="fontSize">
+ <p>Test Purpose: </p>
+ <p>Verifies the functionalities of viewport. Tests the functionality of setting device height and width, scale, enabling or disabling user scalable to allow or disallow zoom in/out screen, sliding the screen by figure.</p>
+ <p>Expected Result: </p>
+ <p>Test passes if all the check points work well.</p>
+ </font>
+ </div>
+ </body>
+ </body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2014 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Xie,Yunxiao <yunxiaox.xie@intel.com>
+
+*/
+
+.text{
+ width: 100%;
+ height: 200px;
+ border: 1px solid #000;
+ margin-bottom: 20px;
+}
+.text .text-div{
+ margin: 35px;
+ width: 330px;
+ height: 150px;
+ font-size: 4em;
+}
+
+/* CSS font */
+@font-face {
+ font-family: TestFont;
+ font-style: normal;
+ src: url(../../../res/font/webkit/Ahem.woff) format("woff");
+}
+.text-font {
+ font-family: TestFont;
+}
+
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2014 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Xie,Yunxiao <yunxiaox.xie@intel.com>
+
+-->
+
+<meta charset="utf-8">
+<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width">
+<link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css">
+<link rel="stylesheet" type="text/css" href="../../css/main.css">
+<link rel="stylesheet" type="text/css" href="css/style.css">
+<script src="../../js/thirdparty/jquery.js"></script>
+<script src="../../js/thirdparty/jquery.mobile.js"></script>
+<script src="../../js/tests.js"></script>
+<div data-role="header">
+ <h1 id="main_page_title"></h1>
+</div>
+<div data-role="content" class="content">
+ <div class="text">
+ <div class="text-div">
+ <div class="text-font">Failure</div>
+ </div>
+ </div>
+</div>
+<div data-role="footer" data-position="fixed">
+</div>
+<div data-role="popup" id="popup_info">
+ <font class="fontSize">
+ <p>Test Purpose: </p>
+ <p>Verifies WOFF font works well.</p>
+ <p>Expected Result:</p>
+ <p>Test passes if the text above should be a series of black boxes.</p>
+ </font>
+</div>
+
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+ Xu, Kang <kangx.xu@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../css/main.css" />
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/tests.js"></script>
+ <script src="../../js/main.js"></script>
+ <script src="js/main.js"></script>
+ </head>
+ <body>
+ <input type="hidden" id="sub_test"/>
+ <div data-role="page" id="main">
+ <div data-role="header" data-position="fixed" data-tap-toggle="false">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div id="content">
+ <ul data-role="listview" id="cspList" data-divider-theme="b" data-inset="true">
+ <li data-role="list-divider" role="heading">Test localization</li>
+ <li id="other-localization">
+ <a href="javascript:runApp('res/other-localization.html')" data-transition="slide" style="">
+ <h2>other-localization</h2>
+ </a>
+ </li>
+ <li data-role="list-divider" role="heading">Test unload event</li>
+ <li id="lifecycle-unload-event">
+ <a href="javascript:runApp('res/lifecycle-unload-event.html')" data-transition="slide" style="">
+ <h2>lifecycle-unload-event</h2>
+ </a>
+ </li>
+ <li data-role="list-divider" role="heading">Test access policy</li>
+ <li id="other-widget-access-policy">
+ <a href="javascript:runApp('res/other-widget-access-policy.html')" data-transition="slide" style="">
+ <h2>other-widget-access-policy</h2>
+ </a>
+ </li>
+ <li data-role="list-divider" role="heading">Test uri schemes</li>
+ <li id="other-uri-schemes">
+ <a href="javascript:runApp('res/other-uri-schemes.html')" data-transition="slide" style="">
+ <h2>other-uri-schemes</h2>
+ </a>
+ </li>
+ <li id="other-uri-schemes-mailto">
+ <a href="javascript:runApp('res/other-uri-schemes-mailto.html')" data-transition="slide" style="">
+ <h2>other-uri-schemes-mailto</h2>
+ </a>
+ </li>
+ <li data-role="list-divider" role="heading">Test access multiple</li>
+ <li id="url-access-multi">
+ <a href="javascript:runApp('res/url-access-multi.html')" data-transition="slide" style="">
+ <h2>url-access-multi</h2>
+ </a>
+ </li>
+ <li id="url-access-multi-all">
+ <a href="javascript:runApp('res/url-access-multi-all.html')" data-transition="slide" style="">
+ <h2>url-access-multi-all</h2>
+ </a>
+ </li>
+ <li id="url-access-multi-subdomains">
+ <a href="javascript:runApp('res/url-access-multi-subdomains.html')" data-transition="slide" style="">
+ <h2>url-access-multi-subdomains</h2>
+ </a>
+ </li>
+ <li data-role="list-divider" role="heading">Test security permission and encryption</li>
+ <li id="security-policy">
+ <a href="javascript:runApp('res/security-policy.html')" data-transition="slide" style="">
+ <h2>security-policy</h2>
+ </a>
+ </li>
+ <li id="protection-encryption-check">
+ <a href="javascript:runApp('res/protection-encryption-check.html')" data-transition="slide" style="">
+ <h2>protection-encryption-check</h2>
+ </a>
+ </li>
+ <li data-role="list-divider" role="heading">Clean all the installed packages</li>
+ <li>
+ <div data-role="button" id="wgtClean" class="wgtButton">Clean all test applications</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Note: </p>
+ <p>Verifies the functionality of uri scheme support.</p>
+ <p>Test Purpose: </p>
+ <p>Verifies WRT MUST support at least the following URI schemes: "sms://", "mmsto://", "mailto://", "<mailto:>" and support localization funxtionality.</p>
+ <p>Expected Result: </p>
+ <p>Test passes if all sub-tests pass.</p>
+ </font>
+ </div>
+ </div>
+ <div data-role="page" id="test_ui">
+ <iframe id="test_frame" width="100%" frameborder="no" border="0" src=""></iframe>
+ </div>
+ </body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.sandbox
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+*/
+var allId=new Array('wrt3lue021',
+ 'wrt3olo022',
+ 'wrt3ous027',
+ 'wrt3ous125',
+ 'wrt3owa028',
+ 'wrt3uam046',
+ 'wrt3uam047',
+ 'wrt3uam048',
+ 'wrt5pec002',
+ 'wrt5pec119');
+
+var installedId = new Array();
+var resultXML, tests;
+var MOUDLE_NAME = "WRTSupport";
+var RESULT_FILE_NAME = "tct-behavior-child.wrts.result.xml";
+
+$(document).delegate("#main", "pageinit", function() {
+ DisablePassButton();
+ $("#wgtClean").bind("vclick", function() {
+ showTotalBar();
+ });
+});
+
+function showTotalBar(){
+ $.each(allId,function(key,val){
+ try {
+ var packageInfo = tizen.package.getPackageInfo(val);
+ console.log("Current Package ID : " + packageInfo.id);
+ } catch (e) {
+ //alert("Exception: " + e.message);
+ }
+ if(packageInfo != "" && packageInfo != undefined){
+ installedId.push(val);
+ }
+ });
+ checkInstalledPackage();
+}
+
+function checkInstalledPackage(){
+ if(installedId.length > 0){
+ setTimeout(function() {
+ uninstall(installedId[0]);
+ }, 1000);
+ } else {
+ $.mobile.hidePageLoadingMsg();
+ alert("All widgets is uninstalled!");
+ if (checkIfAllPackagePass()) {
+ EnablePassButton();
+ }
+ }
+}
+
+function checkIfAllPackagePass() {
+ var result = true;
+
+ tests.each(function() {
+ if ($(this).attr('result') != "PASS") {
+ result = false;
+ }
+ });
+ return result;
+}
+
+function uninstall(val) {
+ installedId.shift();
+ var totalBar = Math.floor((allId.length - installedId.length - 1) / allId.length * 100);
+
+ var onUninstallationSuccess = {
+
+ onprogress: function(packageId, percentage)
+ {
+ console.log("On uninstallation(" + packageId + "): progress(" + percentage + ")");
+ $.mobile.showPageLoadingMsg();
+ },
+ oncomplete: function(packageId)
+ {
+ console.log("Uninstallation(" + packageId + ") Complete");
+ alert("The package " + packageId + " is uninstalled");
+ checkInstalledPackage();
+ }
+ }
+
+ var onError = function (err) {
+ $.mobile.hidePageLoadingMsg();
+ if (err.name != "UnknownError") {
+ alert("Error occured on uninstallation : " + err.name);
+ }
+ }
+
+ try {
+ tizen.package.uninstall(val, onUninstallationSuccess, onError);
+ } catch (e) {
+ alert("Exception: " + e.name);
+ }
+}
+
+function recordResultToXML(test_name, result){
+ tests.each(
+ function() {
+ if($(this).attr('id') == test_name){
+ $(this).attr('result', result);
+ }
+ }
+ );
+}
+
+function initTests() {
+ loadTests();
+ window.addEventListener('message', function(e) {
+ console.log(e.data);
+ var jsonData = eval("(" + e.data + ")");
+ if(jsonData.length > 0){
+ if(jsonData[0].testname != "" && jsonData[0].result != ""){
+ recordResultToXML(jsonData[0].testname, jsonData[0].result);
+ updateAppDecoration();
+ exportTmpResult();
+ }
+ }
+ }, false);
+}
+
+function exportTmpResult() {
+ writeFile(RESULT_FILE_NAME, (new XMLSerializer()).serializeToString(resultXML), false);
+}
+
+function writeFile(filename, content, need_exit) {
+ successCallback = function(fs) {
+ fs.write(content);
+ fs.close();
+ if (need_exit)
+ exitTest();
+ };
+
+ onsuccess = function(dir) {
+ dir.deleteFile(dir.fullPath + "/" + filename);
+
+ file = dir.createFile(filename);
+ file.openStream("rw", successCallback, onerror, "UTF-8");
+ };
+
+ onerror = function(error) {
+ alert("Export result fail: " + error);
+ };
+
+ try {
+ tizen.filesystem.resolve('documents', onsuccess, onerror, "rw");
+ } catch (err) {
+ alert("Write file fail: " + err.message);
+ }
+}
+
+function loadTests() {
+ $.ajax({
+ async : false,
+ type : "GET",
+ url : "../../subtestresult.xml",
+ dataType : "xml",
+ success : function(xml){
+ resultXML = xml;
+ $(xml).find("set").each(
+ function(){
+ if($(this).attr("name") == MOUDLE_NAME){
+ tests = $(this).find("testcase");
+ }
+ }
+ );
+ loadTmpResult();
+ }
+ });
+}
+
+function loadTmpResult(){
+ successCallback = function(files) {
+ for(var i = 0; i < files.length; i++){
+ if (files[i].name == RESULT_FILE_NAME) {
+ if (confirm("Continue last test?")) {
+ files[i].readAsText(
+ function(xml){
+ _mergeResult($(xml).find("set"));
+ updateAppDecoration();
+ }, function(err){
+ console.log("read tmp result error: " + err.message);
+ }, "UTF-8"
+ );
+ return;
+ }
+ else break;
+ }
+ }
+ };
+
+ onsuccess = function(dir) {
+ dir.listFiles(successCallback, onerror);
+ };
+
+ onerror = function(error) {
+ console.log(error);
+ updateAppDecoration();
+ };
+
+ try {
+ tizen.filesystem.resolve('documents', onsuccess, onerror, "rw");
+ } catch (err) {
+ console.log("Load tmp result fail: " + err.message);
+ updateAppDecoration();
+ }
+}
+
+function _mergeResult(tmpResult) {
+ tests.each(
+ function(index, item) {
+ tmpResult.each(
+ function(order1, tmpItem1){
+ if($(tmpItem1).attr("name") == MOUDLE_NAME){
+ $(tmpItem1).find("testcase").each(
+ function(order, tmpItem){
+ if ($(item).attr("id") === $(tmpItem).attr("id")) {
+ $(item).attr("result", $(tmpItem).attr("result"));
+ }
+ }
+ );
+ }
+ }
+ );
+ }
+ );
+}
+
+function updateAppDecoration() {
+ $(resultXML).find("set").each(
+ function(){
+ if($(this).attr("name") == MOUDLE_NAME){
+ $(this).find("testcase").each(
+ function() {
+ if($(this).attr("result") == "PASS"){
+ $("#"+$(this).attr("id")).find("h2").css("color","green");
+ }else if($(this).attr("result") == "FAIL"){
+ $("#"+$(this).attr("id")).find("h2").css("color","red");
+ }
+ }
+ );
+ }
+ }
+ );
+ $("#cspList").listview( "refresh" );
+}
+
+window.addEventListener('load', initTests, false);
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.sandbox
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+*/
+
+var installUrl;
+var wgt_name;
+var app_id;
+var package_id;
+var install_wgt = new Array('debug-web-inspector-windows7','debug-web-inspector-ubuntu');
+
+$(document).ready(function(){
+ updateFooterButton();
+
+ wgt_name = $("#wgt_name").val();
+ if(jQuery.inArray(wgt_name, install_wgt) == -1) {
+ DisablePassButton();
+
+ app_id = $("#app_id").val();
+ package_id = $("#package_id").val();
+
+ $("#install").bind("vclick", function() {
+ install();
+ });
+ $("#launch").bind("vclick", function() {
+ launch(app_id);
+ $('#uninstall').removeClass("ui-disabled");
+ });
+ $("#uninstall").bind("vclick", function() {
+ uninstall(package_id);
+ });
+ try {
+ tizen.package.setPackageInfoEventListener(packageEventCallback);
+ } catch (e) {
+ alert("Exception: " + e.message);
+ }
+
+ packagePre(wgt_name);
+ $('#uninstall').addClass("ui-disabled");
+ $('#launch').addClass("ui-disabled");
+
+ if(checkInstalledPkg(package_id)) {
+ $('#install').addClass("ui-disabled");
+ $('#launch').removeClass("ui-disabled");
+ }
+ }
+});
+
+var packageEventCallback = {
+ oninstalled: function(packageInfo) {
+ $.mobile.hidePageLoadingMsg();
+ alert("The package " + packageInfo.name + " is installed");
+ },
+ onupdated: function(packageInfo) {
+ $.mobile.hidePageLoadingMsg();
+ alert("The package " + packageInfo.name + " is updated");
+ },
+ onuninstalled: function(packageId) {
+ $.mobile.hidePageLoadingMsg();
+ alert("The package " + packageId + " is uninstalled");
+ }
+}
+
+function fileURI(wgt_name) {
+ var documentsDir;
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ if(files[i].name == wgt_name+".wgt")
+ {
+ var Url1 = files[i].toURI();
+ installUrl = Url1.replace("file:///", "/");
+ //install();
+ }
+ }
+ }
+
+ function onerror(error) {
+ alert("The error " + error.message + " occurred when listing the files in the selected folder");
+ }
+
+ tizen.filesystem.resolve(
+ 'documents',
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error" + e.message);
+ }, "r"
+ );
+}
+
+function install() {
+ var onInstallationSuccess = {
+ onprogress: function(packageId, percentage)
+ {
+ console.log("On installation(" + packageId + "): progress(" + percentage + ")");
+ $.mobile.showPageLoadingMsg();
+ },
+ oncomplete: function(packageId)
+ {
+ console.log("Installation(" + packageId + ") Complete");
+ $('#install').addClass("ui-disabled");
+ $('#launch').removeClass("ui-disabled");
+ }
+ }
+
+ var onError = function (err) {
+ alert("Error occured on installation : " + err.message);
+ $.mobile.hidePageLoadingMsg();
+ }
+
+ try {
+ tizen.package.install(installUrl, onInstallationSuccess, onError);
+ } catch(e) {
+ alert("Exception: " + e.name);
+ }
+}
+
+function uninstall(package_id) {
+ var onUninstallationSuccess = {
+
+ onprogress: function(packageId, percentage)
+ {
+ console.log("On uninstallation(" + packageId + "): progress(" + percentage + ")");
+ $.mobile.showPageLoadingMsg();
+ },
+ oncomplete: function(packageId)
+ {
+ console.log("Uninstallation(" + packageId + ") Complete");
+ $('#launch').addClass("ui-disabled");
+ $('#uninstall').addClass("ui-disabled");
+ EnablePassButton();
+ }
+ }
+
+ var onError = function (err) {
+ alert("Error occured on uninstallation : " + err.name);
+ $.mobile.hidePageLoadingMsg();
+ }
+
+ try {
+ tizen.package.uninstall(package_id, onUninstallationSuccess, onError);
+ } catch (e) {
+ alert("Exception: " + e.name);
+ }
+}
+
+function launch(app_id) {
+ function onSuccess() {
+ console.log(id + " launched successfully!");
+ }
+
+ function onError(err) {
+ alert("launch failed : " + err.message);
+ }
+
+ try {
+ tizen.application.launch(app_id, onSuccess, onError);
+ } catch (exc) {
+ alert("launch exc:" + exc.message);
+ }
+}
+
+function packagePre(wgt_name) {
+ var documentsDir;
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ if(files[i].name == wgt_name+".wgt")
+ {
+ documentsDir.copyTo(
+ files[i].fullPath,
+ "documents/"+wgt_name+".wgt",
+ true,
+ function() {
+ console.log(wgt_name+" Precondition Success!");
+ });
+ }
+ }
+ fileURI(wgt_name);
+ }
+
+ function onerror(error) {
+ alert("The error " + error.message + " occurred when listing the files in the selected folder");
+ }
+
+ tizen.filesystem.resolve(
+ 'wgt-package/tests/WRTSupport/res/',
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error" + e.message);
+ }, "r"
+ );
+}
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="lifecycle-unload-event">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="lifecycle-unload-event"/>
+ <input type="hidden" id="app_id" value="wrt3lue021.LifecycleUnloadEvent"/>
+ <input type="hidden" id="package_id" value="wrt3lue021"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>est passes if there is a text "unload event called" display.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="other-localization">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="other-localization"/>
+ <input type="hidden" id="app_id" value="wrt3olo022.OtherLocalization"/>
+ <input type="hidden" id="package_id" value="wrt3olo022"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Pre-condition: </p>
+ <p>Make sure the local language is English (check the installed widget's name on the device screen, it should be "english-ol").</p>
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if there is a dialog with "default description." popup on the screen.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="other-uri-schemes-mailto">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="other-uri-schemes-mailto"/>
+ <input type="hidden" id="app_id" value="wrt3ous125.OtherUriSchemesMailto"/>
+ <input type="hidden" id="package_id" value="wrt3ous125"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <ul>
+ <li>The email with your wrote contents(cc account, bcc account, body content, groups account, subject content) are displayed on the screen when click the "send email" button.</li>
+ <li>The telephone call is displayed on the screen when click the "call" button.</li>
+ </ul>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="other-uri-schemes">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="other-uri-schemes"/>
+ <input type="hidden" id="app_id" value="wrt3ous027.otherurischemes"/>
+ <input type="hidden" id="package_id" value="wrt3ous027"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if the sms module, mms module and email module of the device are requested when click the links "sms", "mmsto" and "mailto".</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="other-widget-access-policy">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="other-widget-access-policy"/>
+ <input type="hidden" id="app_id" value="wrt3owa028.otherwidgetaccesspolicy"/>
+ <input type="hidden" id="package_id" value="wrt3owa028"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Pre-condition: </p>
+ <p>Make sure the device can connect to the Internet.</p>
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <ul>
+ <li>Click the link of "www.baidu.com", it opens the home page of "www.baidu.com".</li>
+ <li>Close the widget and launch again, it cannot open the home page of "www.163.com".</li>
+ <li>Click the link of "www.163.com", it opens the home page of "www.163.com" in the default browser.</li>
+ </ul>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="protection-encryption-check">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="protection-encryption-check"/>
+ <input type="hidden" id="app_id" value="wrt5pec002.protectionencryptioncheck"/>
+ <input type="hidden" id="package_id" value="wrt5pec002"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Pre-condition: </p>
+ <p>Confirm the widget application is encrypted.The resources(js, CSS, HTML files) of protection-encryption-check application is encrypted.For example: </p>
+ <li>Use the command: "app_launcher -l" in "app" user to get the app id of protection-encryption-check.</li>
+ <p>use the command: "vi /home/app/.config/xwalk-service/applications/'app-id'/index.html" to show the content of "index.html" in terminal, the content of "index.html" is encrypted.</p>
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if "js code ok" and a image which same as this widget icon are displayed.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="security-policy">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="security-policy"/>
+ <input type="hidden" id="app_id" value="wrt5pec119.securitypolicy"/>
+ <input type="hidden" id="package_id" value="wrt5pec119"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if the screen show "PASS".</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="url-access-multi-all">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="url-access-multi-all"/>
+ <input type="hidden" id="app_id" value="wrt3uam047.UrlAccessMultiAll"/>
+ <input type="hidden" id="package_id" value="wrt3uam047"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Pre-condition: </p>
+ <p>Make sure the device can connect to the Internet.</p>
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <ul>
+ <li>Click the link "http://www.baidu.com". It opens in the widget successfully.</li>
+ <li>Click the link "http://www.neusoft.com". It opens in the widget successfully.</li>
+ <li>Click the link "http://www.163.com". It opens in the widget successfully.</li>
+ </ul>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="url-access-multi-subdomains">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="url-access-multi-subdomains"/>
+ <input type="hidden" id="app_id" value="wrt3uam048.UrlAccessMultiSubdomains"/>
+ <input type="hidden" id="package_id" value="wrt3uam048"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Pre-condition: </p>
+ <p>Make sure the device can connect to the Internet.</p>
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <ul>
+ <li>Click the link "http://www.baidu.com". It opens in the widget successfully.</li>
+ <li>Click the link "http://www.baidu.com/gaoji/preferences.html". It opens in the widget successfully.</li>
+ <li>Click the link "http://www.neusoft.com". It opens in the widget successfully.</li>
+ <li>Click the link "http://www.neusoft.com/cn". It opens in the widget successfully.</li>
+ </ul>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="url-access-multi">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="url-access-multi"/>
+ <input type="hidden" id="app_id" value="wrt3uam046.UrlAccessMulti"/>
+ <input type="hidden" id="package_id" value="wrt3uam046"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Pre-condition: </p>
+ <p>Make sure the device can connect to the Internet.</p>
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <ul>
+ <li>Click the link "http://www.baidu.com". It opens in the widget successfully.</li>
+ <li>Click the link "http://www.neusoft.com". It opens in the widget successfully.</li>
+ <li>Click the link "http://www.163.com". It doesn't open in the widget, it opens in the default browser.</li>
+ </ul>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+ Xu, Kang <kangx.xu@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../css/main.css" />
+ <script src="../../js/thirdparty/jquery.js"></script>
+ <script src="../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../js/tests.js"></script>
+ <script src="../../js/main.js"></script>
+ <script src="js/main.js"></script>
+ </head>
+ <body>
+ <input type="hidden" id="sub_test"/>
+ <div data-role="page" id="main">
+ <div data-role="header" data-position="fixed" data-tap-toggle="false">
+ <h1 id="main_page_title"></h1>
+ </div>
+ <div id="content">
+ <ul data-role="listview" id="cspList" data-divider-theme="b" data-inset="true">
+ <li data-role="list-divider" role="heading">Test multiple browsing</li>
+ <li id="multiple-browsing-context">
+ <a href="javascript:runApp('res/multiple-browsing-context.html')" data-transition="slide" style="">
+ <h2>multiple-browsing-context</h2>
+ </a>
+ </li>
+ <li data-role="list-divider" role="heading">Test rotation</li>
+ <li id="view-mode-maximized-rotation">
+ <a href="javascript:runApp('res/view-mode-maximized-rotation.html')" data-transition="slide" style="">
+ <h2>view-mode-maximized-rotation</h2>
+ </a>
+ </li>
+ <li id="view-mode-fullscreen-rotation">
+ <a href="javascript:runApp('res/view-mode-fullscreen-rotation.html')" data-transition="slide" style="">
+ <h2>view-mode-fullscreen-rotation</h2>
+ </a>
+ </li>
+ <li data-role="list-divider" role="heading">Clean all the installed packages</li>
+ <li>
+ <div data-role="button" id="wgtClean" class="wgtButton">Clean all test applications</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Note: </p>
+ <p>Verifies the functionality of view mode and multiple browsing context support.</p>
+ <p>Test Purpose: </p>
+ <p>Verifies WRT support two view modes: “maximized” and “fullscreen” of W3C 'view-mode' Media Feature.</p>
+ <p>Expected Result: </p>
+ <p>Test passes if all sub-tests pass.</p>
+ </font>
+ </div>
+ </div>
+ <div data-role="page" id="test_ui">
+ <iframe id="test_frame" width="100%" frameborder="no" border="0" src=""></iframe>
+ </div>
+ </body>
+</html>
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.sandbox
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+*/
+var allId=new Array('wrt4ars001',
+ 'wrt4vmm015',
+ 'wrt4mbc004',
+ 'wrt4vmf013');
+
+var installedId = new Array();
+var resultXML, tests;
+var MOUDLE_NAME = "WRTUI";
+var RESULT_FILE_NAME = "tct-behavior-child.wrtui.result.xml";
+
+$(document).delegate("#main", "pageinit", function() {
+ DisablePassButton();
+ $("#wgtClean").bind("vclick", function() {
+ showTotalBar();
+ });
+});
+
+function showTotalBar(){
+ $.each(allId,function(key,val){
+ try {
+ var packageInfo = tizen.package.getPackageInfo(val);
+ console.log("Current Package ID : " + packageInfo.id);
+ } catch (e) {
+ //alert("Exception: " + e.message);
+ }
+ if(packageInfo != "" && packageInfo != undefined){
+ installedId.push(val);
+ }
+ });
+ checkInstalledPackage();
+}
+
+function checkInstalledPackage(){
+ if(installedId.length > 0){
+ setTimeout(function() {
+ uninstall(installedId[0]);
+ }, 1000);
+ } else {
+ $.mobile.hidePageLoadingMsg();
+ alert("All widgets is uninstalled!");
+ if (checkIfAllPackagePass()) {
+ EnablePassButton();
+ }
+ }
+}
+
+function checkIfAllPackagePass() {
+ var result = true;
+
+ tests.each(function() {
+ if ($(this).attr('result') != "PASS") {
+ result = false;
+ }
+ });
+ return result;
+}
+
+function uninstall(val) {
+ installedId.shift();
+ var totalBar = Math.floor((allId.length - installedId.length - 1) / allId.length * 100);
+
+ var onUninstallationSuccess = {
+
+ onprogress: function(packageId, percentage)
+ {
+ console.log("On uninstallation(" + packageId + "): progress(" + percentage + ")");
+ $.mobile.showPageLoadingMsg();
+ },
+ oncomplete: function(packageId)
+ {
+ console.log("Uninstallation(" + packageId + ") Complete");
+ alert("The package " + packageId + " is uninstalled");
+ checkInstalledPackage();
+ }
+ }
+
+ var onError = function (err) {
+ $.mobile.hidePageLoadingMsg();
+ if (err.name != "UnknownError") {
+ alert("Error occured on uninstallation : " + err.name);
+ }
+ }
+
+ try {
+ tizen.package.uninstall(val, onUninstallationSuccess, onError);
+ } catch (e) {
+ alert("Exception: " + e.name);
+ }
+}
+
+function recordResultToXML(test_name, result){
+ tests.each(
+ function() {
+ if($(this).attr('id') == test_name){
+ $(this).attr('result', result);
+ }
+ }
+ );
+}
+
+function initTests() {
+ loadTests();
+ window.addEventListener('message', function(e) {
+ console.log(e.data);
+ var jsonData = eval("(" + e.data + ")");
+ if(jsonData.length > 0){
+ if(jsonData[0].testname != "" && jsonData[0].result != ""){
+ recordResultToXML(jsonData[0].testname, jsonData[0].result);
+ updateAppDecoration();
+ exportTmpResult();
+ }
+ }
+ }, false);
+}
+
+function exportTmpResult() {
+ writeFile(RESULT_FILE_NAME, (new XMLSerializer()).serializeToString(resultXML), false);
+}
+
+function writeFile(filename, content, need_exit) {
+ successCallback = function(fs) {
+ fs.write(content);
+ fs.close();
+ if (need_exit)
+ exitTest();
+ };
+
+ onsuccess = function(dir) {
+ dir.deleteFile(dir.fullPath + "/" + filename);
+
+ file = dir.createFile(filename);
+ file.openStream("rw", successCallback, onerror, "UTF-8");
+ };
+
+ onerror = function(error) {
+ alert("Export result fail: " + error);
+ };
+
+ try {
+ tizen.filesystem.resolve('documents', onsuccess, onerror, "rw");
+ } catch (err) {
+ alert("Write file fail: " + err.message);
+ }
+}
+
+function loadTests() {
+ $.ajax({
+ async : false,
+ type : "GET",
+ url : "../../subtestresult.xml",
+ dataType : "xml",
+ success : function(xml){
+ resultXML = xml;
+ $(xml).find("set").each(
+ function(){
+ if($(this).attr("name") == MOUDLE_NAME){
+ tests = $(this).find("testcase");
+ }
+ }
+ );
+ loadTmpResult();
+ }
+ });
+}
+
+function loadTmpResult(){
+ successCallback = function(files) {
+ for(var i = 0; i < files.length; i++){
+ if (files[i].name == RESULT_FILE_NAME) {
+ if (confirm("Continue last test?")) {
+ files[i].readAsText(
+ function(xml){
+ _mergeResult($(xml).find("set"));
+ updateAppDecoration();
+ }, function(err){
+ console.log("read tmp result error: " + err.message);
+ }, "UTF-8"
+ );
+ return;
+ }
+ else break;
+ }
+ }
+ };
+
+ onsuccess = function(dir) {
+ dir.listFiles(successCallback, onerror);
+ };
+
+ onerror = function(error) {
+ console.log(error);
+ updateAppDecoration();
+ };
+
+ try {
+ tizen.filesystem.resolve('documents', onsuccess, onerror, "rw");
+ } catch (err) {
+ console.log("Load tmp result fail: " + err.message);
+ updateAppDecoration();
+ }
+}
+
+function _mergeResult(tmpResult) {
+ tests.each(
+ function(index, item) {
+ tmpResult.each(
+ function(order1, tmpItem1){
+ if($(tmpItem1).attr("name") == MOUDLE_NAME){
+ $(tmpItem1).find("testcase").each(
+ function(order, tmpItem){
+ if ($(item).attr("id") === $(tmpItem).attr("id")) {
+ $(item).attr("result", $(tmpItem).attr("result"));
+ }
+ }
+ );
+ }
+ }
+ );
+ }
+ );
+}
+
+function updateAppDecoration() {
+ $(resultXML).find("set").each(
+ function(){
+ if($(this).attr("name") == MOUDLE_NAME){
+ $(this).find("testcase").each(
+ function() {
+ if($(this).attr("result") == "PASS"){
+ $("#"+$(this).attr("id")).find("h2").css("color","green");
+ }else if($(this).attr("result") == "FAIL"){
+ $("#"+$(this).attr("id")).find("h2").css("color","red");
+ }
+ }
+ );
+ }
+ }
+ );
+ $("#cspList").listview( "refresh" );
+}
+
+window.addEventListener('load', initTests, false);
--- /dev/null
+/*
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.sandbox
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+*/
+
+var installUrl;
+var wgt_name;
+var app_id;
+var package_id;
+
+$(document).ready(function(){
+ updateFooterButton();
+ DisablePassButton();
+
+ wgt_name = $("#wgt_name").val();
+ app_id = $("#app_id").val();
+ package_id = $("#package_id").val();
+
+ $("#install").bind("vclick", function() {
+ install();
+ });
+ $("#launch").bind("vclick", function() {
+ launch(app_id);
+ $('#uninstall').removeClass("ui-disabled");
+ });
+ $("#uninstall").bind("vclick", function() {
+ uninstall(package_id);
+ });
+ try {
+ tizen.package.setPackageInfoEventListener(packageEventCallback);
+ } catch (e) {
+ alert("Exception: " + e.message);
+ }
+
+ packagePre(wgt_name);
+ $('#uninstall').addClass("ui-disabled");
+ $('#launch').addClass("ui-disabled");
+
+ if(checkInstalledPkg(package_id)) {
+ $('#install').addClass("ui-disabled");
+ $('#launch').removeClass("ui-disabled");
+ }
+});
+
+var packageEventCallback = {
+ oninstalled: function(packageInfo) {
+ $.mobile.hidePageLoadingMsg();
+ alert("The package " + packageInfo.name + " is installed");
+ },
+ onupdated: function(packageInfo) {
+ $.mobile.hidePageLoadingMsg();
+ alert("The package " + packageInfo.name + " is updated");
+ },
+ onuninstalled: function(packageId) {
+ $.mobile.hidePageLoadingMsg();
+ alert("The package " + packageId + " is uninstalled");
+ }
+}
+
+function fileURI(wgt_name) {
+ var documentsDir;
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ if(files[i].name == wgt_name+".wgt")
+ {
+ var Url1 = files[i].toURI();
+ installUrl = Url1.replace("file:///", "/");
+ //install();
+ }
+ }
+ }
+
+ function onerror(error) {
+ alert("The error " + error.message + " occurred when listing the files in the selected folder");
+ }
+
+ tizen.filesystem.resolve(
+ 'documents',
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error" + e.message);
+ }, "r"
+ );
+}
+
+function install() {
+ var onInstallationSuccess = {
+ onprogress: function(packageId, percentage)
+ {
+ console.log("On installation(" + packageId + "): progress(" + percentage + ")");
+ $.mobile.showPageLoadingMsg();
+ },
+ oncomplete: function(packageId)
+ {
+ console.log("Installation(" + packageId + ") Complete");
+ $('#install').addClass("ui-disabled");
+ $('#launch').removeClass("ui-disabled");
+ }
+ }
+
+ var onError = function (err) {
+ alert("Error occured on installation : " + err.message);
+ $.mobile.hidePageLoadingMsg();
+ }
+
+ try {
+ tizen.package.install(installUrl, onInstallationSuccess, onError);
+ } catch(e) {
+ alert("Exception: " + e.name);
+ }
+}
+
+function uninstall(package_id) {
+ var onUninstallationSuccess = {
+
+ onprogress: function(packageId, percentage)
+ {
+ console.log("On uninstallation(" + packageId + "): progress(" + percentage + ")");
+ $.mobile.showPageLoadingMsg();
+ },
+ oncomplete: function(packageId)
+ {
+ console.log("Uninstallation(" + packageId + ") Complete");
+ $('#uninstall').addClass("ui-disabled");
+ $('#launch').addClass("ui-disabled");
+ EnablePassButton();
+ }
+ }
+
+ var onError = function (err) {
+ alert("Error occured on uninstallation : " + err.name);
+ $.mobile.hidePageLoadingMsg();
+ }
+
+ try {
+ tizen.package.uninstall(package_id, onUninstallationSuccess, onError);
+ } catch (e) {
+ alert("Exception: " + e.name);
+ }
+}
+
+function launch(app_id) {
+ function onSuccess() {
+ console.log(id + " launched successfully!");
+ }
+
+ function onError(err) {
+ alert("launch failed : " + err.message);
+ }
+
+ try {
+ tizen.application.launch(app_id, onSuccess, onError);
+ } catch (exc) {
+ alert("launch exc:" + exc.message);
+ }
+}
+
+function packagePre(wgt_name) {
+
+ var documentsDir;
+ function onsuccess(files) {
+ for (var i = 0; i < files.length; i++)
+ {
+ if(files[i].name == wgt_name+".wgt")
+ {
+ documentsDir.copyTo(
+ files[i].fullPath,
+ "documents/"+wgt_name+".wgt",
+ true,
+ function() {
+ console.log(wgt_name+" Precondition Success!");
+ });
+ }
+ }
+ fileURI(wgt_name);
+ }
+
+ function onerror(error) {
+ alert("The error " + error.message + " occurred when listing the files in the selected folder");
+ }
+
+ tizen.filesystem.resolve(
+ 'wgt-package/tests/WRTUI/res/',
+ function(dir){
+ documentsDir = dir;
+ dir.listFiles(onsuccess, onerror);
+ }, function(e) {
+ alert("Error" + e.message);
+ }, "r"
+ );
+}
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="multiple-browsing-context">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="multiple-browsing-context"/>
+ <input type="hidden" id="app_id" value="wrt4mbc004.multiplebrowsingcontext"/>
+ <input type="hidden" id="package_id" value="wrt4mbc004"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if a new page with "index2.html" can be opened when click the "open window" button on the page.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="view-mode-fullscreen-rotation">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="view-mode-fullscreen-rotation"/>
+ <input type="hidden" id="app_id" value="wrt4vmf013.viewmodefullscreenrotation"/>
+ <input type="hidden" id="package_id" value="wrt4vmf013"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if the screen is landscape and fullscreen.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2013 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Feng, GangX <gangx.feng@intel.com>
+
+-->
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, width=device-width" />
+ <link rel="stylesheet" type="text/css" href="../../../css/jquery.mobile.css" />
+ <link rel="stylesheet" type="text/css" href="../../../css/main.css" />
+ <script src="../../../js/thirdparty/jquery.js"></script>
+ <script src="../../../js/thirdparty/jquery.mobile.js"></script>
+ <script src="../../../js/tests.js"></script>
+ <script src="../js/tests.js"></script>
+ </head>
+ <body>
+ <div data-role="page" id="view-mode-maximized-rotation">
+ <div id="content">
+ <div>
+ <input type="hidden" id="wgt_name" value="view-mode-maximized-rotation"/>
+ <input type="hidden" id="app_id" value="wrt4vmm015.viewmodemaximizedrotation"/>
+ <input type="hidden" id="package_id" value="wrt4vmm015"/>
+ </div>
+ <ul data-role="listview">
+ <li data-role="list-divider">Package Install</li>
+ <li>
+ <div data-role="button" id="install" class="wgtButton">Install</div>
+ </li>
+ <li data-role="list-divider">Package Launch</li>
+ <li>
+ <div data-role="button" id="launch" class="wgtButton">Launch</div>
+ </li>
+ <li data-role="list-divider">Package Uninstall</li>
+ <li>
+ <div data-role="button" id="uninstall" class="wgtButton">Uninstall</div>
+ </li>
+ </ul>
+ </div>
+ <div data-role="footer" data-position="fixed" data-tap-toggle="false">
+ </div>
+ <div data-role="popup" id="popup_info" data-theme="a">
+ <font class="fontSize">
+ <p>Test Step: </p>
+ <ol>
+ <li>Click the "Install" button to install the widget.</li>
+ <li>Click the "Launch" button to launch the widget.</li>
+ <li>Click the "Uninstall" button to uninstall the widget.</li>
+ </ol>
+ <p>Expected Result: </p>
+ <p>Test passes if the screen is landscape and maximized.</p>
+ </font>
+ </div>
+ </div>
+ </body>
+</html>
--- /dev/null
+#!/usr/bin/env python
+#
+# Copyright (c) 2014 Intel Corporation.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# * Redistributions of works must retain the original copyright notice, this
+# list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the original copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# * Neither the name of Intel Corporation nor the names of its contributors
+# may be used to endorse or promote products derived from this work without
+# specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# Authors:
+# Fan, Yugang <yugang.fan@intel.com>
+
+import os
+import shutil
+import glob
+import time
+import sys
+import stat
+import random
+import json
+import logging
+import zipfile
+import signal
+import subprocess
+from optparse import OptionParser
+
+reload(sys)
+sys.setdefaultencoding('utf8')
+
+TOOL_VERSION = "v0.1"
+VERSION_FILE = "VERSION"
+DEFAULT_CMD_TIMEOUT = 600
+PKG_TYPES = ["apk", "xpk", "wgt", "apk-aio", "cordova-aio", "cordova", "embeddingapi"]
+PKG_MODES = ["shared", "embedded"]
+PKG_ARCHS = ["x86", "arm"]
+PKG_BLACK_LIST = []
+PKG_NAME = None
+BUILD_PARAMETERS = None
+BUILD_ROOT = None
+BUILD_ROOT_SRC = None
+BUILD_ROOT_SRC_PKG = None
+BUILD_ROOT_SRC_PKG_APP = None
+BUILD_ROOT_SRC_SUB_APP = None
+BUILD_ROOT_PKG = None
+BUILD_ROOT_PKG_APP = None
+LOG = None
+LOG_LEVEL = logging.DEBUG
+
+
+class ColorFormatter(logging.Formatter):
+
+ def __init__(self, msg):
+ logging.Formatter.__init__(self, msg)
+
+ def format(self, record):
+ red, green, yellow, blue = range(4)
+ colors = {'INFO': green, 'DEBUG': blue,
+ 'WARNING': yellow, 'ERROR': red}
+ msg = record.msg
+ if msg[0] == "+":
+ msg = "\33[01m" + msg[1:] + "\033[0m"
+ elif msg[0] == "=":
+ msg = "\33[07m" + msg + "\033[0m"
+ levelname = record.levelname
+ if levelname in colors:
+ msg_color = "\033[0;%dm" % (
+ 31 + colors[levelname]) + msg + "\033[0m"
+ record.msg = msg_color
+
+ return logging.Formatter.format(self, record)
+
+
+def pidExists(pid):
+ if pid < 0:
+ return False
+ try:
+ os.kill(pid, 0)
+ except OSError:
+ return False
+ else:
+ return True
+
+
+def isWindows():
+ return sys.platform == "cygwin" or sys.platform.startswith("win")
+
+
+def killProcesses(ppid=None):
+ if isWindows():
+ subprocess.check_call("TASKKILL /F /PID %s /T" % ppid)
+ else:
+ ppid = str(ppid)
+ pidgrp = []
+
+ def GetChildPids(ppid):
+ command = "ps -ef | awk '{if ($3 ==%s) print $2;}'" % str(ppid)
+ pids = os.popen(command).read()
+ pids = pids.split()
+ return pids
+
+ pidgrp.extend(GetChildPids(ppid))
+ for pid in pidgrp:
+ pidgrp.extend(GetChildPids(pid))
+
+ pidgrp.insert(0, ppid)
+ while len(pidgrp) > 0:
+ pid = pidgrp.pop()
+ try:
+ os.kill(int(pid), signal.SIGKILL)
+ return True
+ except OSError:
+ try:
+ os.popen("kill -9 %d" % int(pid))
+ return True
+ except Exception:
+ return False
+
+
+def safelyGetValue(origin_json=None, key=None):
+ if origin_json and key and key in origin_json:
+ return origin_json[key]
+ return None
+
+
+def checkContains(origin_str=None, key_str=None):
+ if origin_str.upper().find(key_str.upper()) >= 0:
+ return True
+ return False
+
+
+def getRandomStr():
+ str_pool = list("abcdefghijklmnopqrstuvwxyz1234567890")
+ random_str = ""
+ for i in range(15):
+ index = random.randint(0, len(str_pool) - 1)
+ random_str = random_str + str_pool[index]
+
+ return random_str
+
+
+def zipDir(dir_path, zip_file):
+ try:
+ if os.path.exists(zip_file):
+ if not doRemove([zip_file]):
+ return False
+ if not os.path.exists(os.path.dirname(zip_file)):
+ os.makedirs(os.path.dirname(zip_file))
+ z_file = zipfile.ZipFile(zip_file, "w")
+ orig_dir = os.getcwd()
+ os.chdir(dir_path)
+ for root, dirs, files in os.walk("."):
+ for i_file in files:
+ LOG.info("zip %s" % os.path.join(root, i_file))
+ z_file.write(os.path.join(root, i_file))
+ z_file.close()
+ os.chdir(orig_dir)
+ except Exception as e:
+ LOG.error("Fail to pack %s to %s: %s" % (dir_path, zip_file, e))
+ return False
+ LOG.info("Done to zip %s to %s" % (dir_path, zip_file))
+ return True
+
+
+def overwriteCopy(src, dest, symlinks=False, ignore=None):
+ if not os.path.exists(dest):
+ os.makedirs(dest)
+ shutil.copystat(src, dest)
+ sub_list = os.listdir(src)
+ if ignore:
+ excl = ignore(src, sub_list)
+ sub_list = [x for x in sub_list if x not in excl]
+ for i_sub in sub_list:
+ s_path = os.path.join(src, i_sub)
+ d_path = os.path.join(dest, i_sub)
+ if symlinks and os.path.islink(s_path):
+ if os.path.lexists(d_path):
+ os.remove(d_path)
+ os.symlink(os.readlink(s_path), d_path)
+ try:
+ s_path_s = os.lstat(s_path)
+ s_path_mode = stat.S_IMODE(s_path_s.st_mode)
+ os.lchmod(d_path, s_path_mode)
+ except Exception:
+ pass
+ elif os.path.isdir(s_path):
+ overwriteCopy(s_path, d_path, symlinks, ignore)
+ else:
+ shutil.copy2(s_path, d_path)
+
+
+def doCopy(src_item=None, dest_item=None):
+ LOG.info("Copying %s to %s" % (src_item, dest_item))
+ try:
+ if os.path.isdir(src_item):
+ overwriteCopy(src_item, dest_item, symlinks=True)
+ else:
+ if not os.path.exists(os.path.dirname(dest_item)):
+ LOG.info("Create non-existent dir: %s" %
+ os.path.dirname(dest_item))
+ os.makedirs(os.path.dirname(dest_item))
+ shutil.copy2(src_item, dest_item)
+ except Exception as e:
+ LOG.error("Fail to copy file %s: %s" % (src_item, e))
+ return False
+
+ return True
+
+
+def doRemove(target_file_list=None):
+ for i_file in target_file_list:
+ LOG.info("Removing %s" % i_file)
+ try:
+ if os.path.isdir(i_file):
+ shutil.rmtree(i_file)
+ else:
+ os.remove(i_file)
+ except Exception as e:
+ LOG.error("Fail to remove file %s: %s" % (i_file, e))
+ return False
+ return True
+
+
+def updateCopylistPrefix(src_default, dest_default, src_sub, dest_sub):
+ src_new = ""
+ dest_new = ""
+ PACK_TOOL_TAG = "PACK-TOOL-ROOT"
+
+ if src_sub[0:len(PACK_TOOL_TAG)] == PACK_TOOL_TAG:
+ src_new = src_sub.replace(PACK_TOOL_TAG, BUILD_PARAMETERS.pkgpacktools)
+ else:
+ src_new = os.path.join(src_default, src_sub)
+
+ if dest_sub[0:len(PACK_TOOL_TAG)] == PACK_TOOL_TAG:
+ dest_new = dest_sub.replace(PACK_TOOL_TAG, BUILD_ROOT)
+ else:
+ dest_new = os.path.join(dest_default, dest_sub)
+
+ return (src_new, dest_new)
+
+
+def buildSRC(src=None, dest=None, build_json=None):
+ if not os.path.exists(src):
+ LOG.info("+Src dir does not exist, skip build src process ...")
+ return True
+ if not doCopy(src, dest):
+ return False
+ if "blacklist" in build_json:
+ if build_json["blacklist"].count("") > 0:
+ build_json["blacklist"].remove("")
+ black_file_list = []
+ for i_black in build_json["blacklist"]:
+ black_file_list = black_file_list + \
+ glob.glob(os.path.join(dest, i_black))
+
+ black_file_list = list(set(black_file_list))
+ if not doRemove(black_file_list):
+ return False
+
+ if "copylist" in build_json:
+ for i_s_key in build_json["copylist"].keys():
+ if i_s_key and build_json["copylist"][i_s_key]:
+ (src_updated, dest_updated) = updateCopylistPrefix(
+ src, dest, i_s_key, build_json["copylist"][i_s_key])
+ if not doCopy(src_updated, dest_updated):
+ return False
+
+ return True
+
+
+def exitHandler(return_code=1):
+ LOG.info("+Cleaning build root folder ...")
+ if not BUILD_PARAMETERS.bnotclean and os.path.exists(BUILD_ROOT):
+ if not doRemove([BUILD_ROOT]):
+ LOG.error("Fail to clean build root, exit ...")
+ sys.exit(1)
+
+ if return_code == 0:
+ LOG.info("================ DONE ================")
+ else:
+ LOG.error(
+ "================ Found Something Wrong !!! ================")
+ sys.exit(return_code)
+
+
+def prepareBuildRoot():
+ LOG.info("+Preparing build root folder ...")
+ global BUILD_ROOT
+ global BUILD_ROOT_SRC
+ global BUILD_ROOT_SRC_PKG
+ global BUILD_ROOT_SRC_PKG_APP
+ global BUILD_ROOT_SRC_SUB_APP
+ global BUILD_ROOT_PKG
+ global BUILD_ROOT_PKG_APP
+
+ while True:
+ BUILD_ROOT = os.path.join("/tmp", getRandomStr())
+ if os.path.exists(BUILD_ROOT):
+ continue
+ else:
+ break
+
+ BUILD_ROOT_SRC = os.path.join(BUILD_ROOT, PKG_NAME)
+ BUILD_ROOT_SRC_PKG = os.path.join(BUILD_ROOT, "pkg")
+ BUILD_ROOT_SRC_PKG_APP = os.path.join(BUILD_ROOT, "pkg-app")
+ BUILD_ROOT_SRC_SUB_APP = os.path.join(BUILD_ROOT, "sub-app")
+ BUILD_ROOT_PKG = os.path.join(BUILD_ROOT, "pkg", "opt", PKG_NAME)
+ BUILD_ROOT_PKG_APP = os.path.join(BUILD_ROOT, "pkg-app", "opt", PKG_NAME)
+
+ if not doCopy(BUILD_PARAMETERS.srcdir, BUILD_ROOT_SRC):
+ return False
+ if not doRemove(
+ glob.glob(os.path.join(BUILD_ROOT_SRC, "%s*.zip" % PKG_NAME))):
+ return False
+
+ return True
+
+
+def doCMD(cmd, time_out=DEFAULT_CMD_TIMEOUT, no_check_return=False):
+ LOG.info("Doing CMD: [ %s ]" % cmd)
+ pre_time = time.time()
+ cmd_proc = subprocess.Popen(args=cmd, shell=True)
+ while True:
+ cmd_exit_code = cmd_proc.poll()
+ elapsed_time = time.time() - pre_time
+ if cmd_exit_code is None:
+ if elapsed_time >= time_out:
+ killProcesses(ppid=cmd_proc.pid)
+ LOG.error("Timeout to exe CMD")
+ return False
+ else:
+ if not no_check_return and cmd_exit_code != 0:
+ LOG.error("Fail to exe CMD")
+ return False
+ break
+ time.sleep(2)
+ return True
+
+
+def doCMDWithOutput(cmd, time_out=DEFAULT_CMD_TIMEOUT):
+ LOG.info("Doing CMD: [ %s ]" % cmd)
+ pre_time = time.time()
+ output = []
+ cmd_return_code = 1
+ cmd_proc = subprocess.Popen(
+ cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
+
+ while True:
+ output_line = cmd_proc.stdout.readline().strip("\r\n")
+ cmd_return_code = cmd_proc.poll()
+ elapsed_time = time.time() - pre_time
+ if cmd_return_code is None:
+ if elapsed_time >= time_out:
+ killProcesses(ppid=cmd_proc.pid)
+ LOG.error("Timeout to exe CMD")
+ return False
+ elif output_line == '' and cmd_return_code is not None:
+ break
+
+ sys.stdout.write("%s\n" % output_line)
+ sys.stdout.flush()
+ output.append(output_line)
+ if cmd_return_code != 0:
+ LOG.error("Fail to exe CMD")
+
+ return (cmd_return_code, output)
+
+
+def packXPK(build_json=None, app_src=None, app_dest=None, app_name=None):
+ pack_tool = os.path.join(BUILD_ROOT, "make_xpk.py")
+ if not os.path.exists(pack_tool):
+ if not doCopy(
+ os.path.join(BUILD_PARAMETERS.pkgpacktools, "make_xpk.py"),
+ pack_tool):
+ return False
+ orig_dir = os.getcwd()
+ os.chdir(BUILD_ROOT)
+ if os.path.exists("key.file"):
+ if not doRemove(["key.file"]):
+ os.chdir(orig_dir)
+ return False
+
+ key_file = safelyGetValue(build_json, "key-file")
+ if key_file == "key.file":
+ LOG.error(
+ "\"key.file\" is reserved name for default key file, "
+ "pls change the key file name ...")
+ os.chdir(orig_dir)
+ return False
+ if key_file:
+ pack_cmd = "python make_xpk.py %s %s -o %s" % (
+ app_src, key_file, os.path.join(app_dest, "%s.xpk" % app_name))
+ else:
+ pack_cmd = "python make_xpk.py %s key.file -o %s" % (
+ app_src, os.path.join(app_dest, "%s.xpk" % app_name))
+ if not doCMD(pack_cmd, DEFAULT_CMD_TIMEOUT):
+ os.chdir(orig_dir)
+ return False
+
+ os.chdir(orig_dir)
+ return True
+
+
+def packWGT(build_json=None, app_src=None, app_dest=None, app_name=None):
+ if not zipDir(app_src, os.path.join(app_dest, "%s.wgt" % app_name)):
+ return False
+
+ if BUILD_PARAMETERS.signature == True:
+ if safelyGetValue(build_json, "sign-flag") == "true":
+ if not os.path.exists(os.path.join(BUILD_ROOT, "signing")):
+ if not doCopy(
+ os.path.join(BUILD_PARAMETERS.pkgpacktools, "signing"),
+ os.path.join(BUILD_ROOT, "signing")):
+ return False
+ signing_cmd = "%s --dist platform %s" % (
+ os.path.join(BUILD_ROOT, "signing", "sign-widget.sh"),
+ os.path.join(app_dest, "%s.wgt" % app_name))
+ if not doCMD(signing_cmd, DEFAULT_CMD_TIMEOUT):
+ return False
+
+ return True
+
+
+def packAPK(build_json=None, app_src=None, app_dest=None, app_name=None):
+ app_name = app_name.replace("-", "_")
+
+ if not os.path.exists(os.path.join(BUILD_ROOT, "crosswalk")):
+ if not doCopy(
+ os.path.join(BUILD_PARAMETERS.pkgpacktools, "crosswalk"),
+ os.path.join(BUILD_ROOT, "crosswalk")):
+ return False
+
+ files = glob.glob(os.path.join(BUILD_ROOT, "crosswalk", "*.apk"))
+ if files:
+ if not doRemove(files):
+ return False
+
+ ext_opt = ""
+ cmd_opt = ""
+ url_opt = ""
+ mode_opt = ""
+ arch_opt = ""
+ icon_opt = ""
+
+ common_opts = safelyGetValue(build_json, "apk-common-opts")
+ if common_opts is None:
+ common_opts = ""
+
+ tmp_opt = safelyGetValue(build_json, "apk-ext-opt")
+ if tmp_opt:
+ ext_opt = "--extensions='%s'" % os.path.join(BUILD_ROOT_SRC, tmp_opt)
+
+ tmp_opt = safelyGetValue(build_json, "apk-cmd-opt")
+ if tmp_opt:
+ cmd_opt = "--xwalk-command-line='%s'" % tmp_opt
+
+ tmp_opt = safelyGetValue(build_json, "apk-url-opt")
+ if tmp_opt:
+ url_opt = "--app-url='%s'" % tmp_opt
+
+ tmp_opt = safelyGetValue(build_json, "apk-mode-opt")
+ if tmp_opt:
+ if tmp_opt in PKG_MODES:
+ mode_opt = "--mode=%s" % tmp_opt
+ else:
+ LOG.error("Got wrong app mode: %s" % tmp_opt)
+ return False
+ else:
+ mode_opt = "--mode=%s" % BUILD_PARAMETERS.pkgmode
+
+ tmp_opt = safelyGetValue(build_json, "apk-arch-opt")
+ if tmp_opt:
+ if tmp_opt in PKG_ARCHS:
+ arch_opt = "--arch=%s" % tmp_opt
+ else:
+ LOG.error("Got wrong app arch: %s" % tmp_opt)
+ return False
+ else:
+ arch_opt = "--arch=%s" % BUILD_PARAMETERS.pkgarch
+
+ tmp_opt = safelyGetValue(build_json, "apk-icon-opt")
+ if tmp_opt:
+ icon_opt = "--icon=%s" % tmp_opt
+ elif tmp_opt == "":
+ icon_opt = ""
+ else:
+ icon_opt = "--icon=%s/icon.png" % app_src
+
+ if safelyGetValue(build_json, "apk-type") == "MANIFEST":
+ pack_cmd = "python make_apk.py --package=org.xwalk.%s " \
+ "--manifest=%s/manifest.json %s %s %s %s %s" % (
+ app_name, app_src, mode_opt, arch_opt,
+ ext_opt, cmd_opt, common_opts)
+ elif safelyGetValue(build_json, "apk-type") == "HOSTEDAPP":
+ if not url_opt:
+ LOG.error(
+ "Fail to find the key \"apk-url-opt\" for hosted APP packing")
+ return False
+ pack_cmd = "python make_apk.py --package=org.xwalk.%s --name=%s %s " \
+ "%s %s %s %s %s" % (
+ app_name, app_name, mode_opt, arch_opt, ext_opt,
+ cmd_opt, url_opt, common_opts)
+ else:
+ pack_cmd = "python make_apk.py --package=org.xwalk.%s --name=%s " \
+ "--app-root=%s --app-local-path=index.html %s %s " \
+ "%s %s %s %s" % (
+ app_name, app_name, app_src, icon_opt, mode_opt,
+ arch_opt, ext_opt, cmd_opt, common_opts)
+
+ orig_dir = os.getcwd()
+ os.chdir(os.path.join(BUILD_ROOT, "crosswalk"))
+ if not doCMD(pack_cmd, DEFAULT_CMD_TIMEOUT):
+ os.chdir(orig_dir)
+ return False
+
+ files = glob.glob(os.path.join(BUILD_ROOT, "crosswalk", "*.apk"))
+ if files:
+ if not doCopy(files[0], os.path.join(app_dest, "%s.apk" % app_name)):
+ os.chdir(orig_dir)
+ return False
+ else:
+ LOG.error("Fail to find the apk file")
+ os.chdir(orig_dir)
+ return False
+
+ os.chdir(orig_dir)
+ return True
+
+
+def packCordova(build_json=None, app_src=None, app_dest=None, app_name=None):
+ pack_tool = os.path.join(BUILD_ROOT, "cordova")
+ app_name = app_name.replace("-", "_")
+ if not os.path.exists(pack_tool):
+ if not doCopy(
+ os.path.join(BUILD_PARAMETERS.pkgpacktools, "cordova"),
+ pack_tool):
+ return False
+
+ plugin_tool = os.path.join(BUILD_ROOT, "cordova_plugins")
+ if not os.path.exists(plugin_tool):
+ if not doCopy(
+ os.path.join(BUILD_PARAMETERS.pkgpacktools, "cordova_plugins"),
+ plugin_tool):
+ return False
+
+ orig_dir = os.getcwd()
+ os.chdir(pack_tool)
+ pack_cmd = "bin/create %s org.xwalk.%s %s" % (
+ app_name, app_name, app_name)
+ if not doCMD(pack_cmd, DEFAULT_CMD_TIMEOUT):
+ os.chdir(orig_dir)
+ return False
+
+ os.chdir(os.path.join(pack_tool, app_name))
+ plugin_dirs = os.listdir(plugin_tool)
+ for i_dir in plugin_dirs:
+ i_plugin_dir = os.path.join(plugin_tool, i_dir)
+ plugin_install_cmd = "plugman install --platform android --project " \
+ "./ --plugin %s" % i_plugin_dir
+ if not doCMD(plugin_install_cmd, DEFAULT_CMD_TIMEOUT):
+ os.chdir(orig_dir)
+ return False
+ os.chdir(pack_tool)
+
+ if not doCopy(app_src, os.path.join(pack_tool, app_name, "assets", "www")):
+ os.chdir(orig_dir)
+ return False
+ os.chdir(os.path.join(BUILD_ROOT, "cordova", app_name))
+ pack_cmd = "./cordova/build"
+ if not doCMD(pack_cmd, DEFAULT_CMD_TIMEOUT):
+ os.chdir(orig_dir)
+ return False
+
+ if not doCopy(os.path.join(
+ BUILD_ROOT, "cordova", app_name, "bin", "%s-debug.apk" %
+ app_name),
+ os.path.join(app_dest, "%s.apk" % app_name)):
+ os.chdir(orig_dir)
+ return False
+ os.chdir(orig_dir)
+ return True
+
+
+def packEmbeddingAPI(
+ build_json=None, app_src=None, app_dest=None, app_name=None):
+ app_name = app_name.replace("-", "_")
+
+ library_dir_name = safelyGetValue(build_json, "embeddingapi-library-name")
+ if not library_dir_name:
+ LOG.error("Fail to get embeddingapi-library-name ...")
+ return False
+
+ new_library_dir_name = "core_library"
+ pack_tool = os.path.join(app_src, "..", new_library_dir_name)
+
+ if os.path.exists(pack_tool):
+ if not doRemove([pack_tool]):
+ return False
+
+ if not doCopy(
+ os.path.join(BUILD_PARAMETERS.pkgpacktools, library_dir_name),
+ pack_tool):
+ return False
+
+ if os.path.exists(os.path.join(pack_tool, "bin", "res", "crunch")):
+ if not doRemove([os.path.join(pack_tool, "bin", "res", "crunch")]):
+ return False
+
+ orig_dir = os.getcwd()
+ android_project_path = os.path.join(app_src, "android-project")
+ try:
+ os.makedirs(android_project_path)
+ except Exception as e:
+ LOG.error("Fail to create tmp project dir: %s" % e)
+ return False
+
+ (return_code, output) = doCMDWithOutput("android list target")
+ api_level = ""
+ for line in output:
+ if "API level" in line:
+ api_level = line.split(":")[1].strip()
+ break
+ if not api_level:
+ LOG.error("Fail to get Android API Level")
+ os.chdir(orig_dir)
+ return False
+
+ android_project_cmd = "android create project --name %s --target " \
+ "android-%s --path %s --package com.%s " \
+ "--activity MainActivity" % (
+ app_name, api_level, android_project_path, app_name)
+ if not doCMD(android_project_cmd):
+ os.chdir(orig_dir)
+ return False
+
+ try:
+ update_file = open(
+ os.path.join(android_project_path, "project.properties"), "a+")
+ update_file.writelines(
+ "{0}\n".format(
+ "android.library.reference.1=../%s" %
+ new_library_dir_name))
+ update_file.close()
+ except Exception as e:
+ LOG.error(
+ "Fail to update %s: %s" %
+ (os.path.join(
+ android_project_path,
+ "project.properties"),
+ e))
+ os.chdir(orig_dir)
+ return False
+
+ if not doCopy(os.path.join(android_project_path, "build.xml"),
+ os.path.join(app_src, "build.xml")):
+ os.chdir(orig_dir)
+ return False
+
+ if not doCopy(
+ os.path.join(android_project_path, "project.properties"),
+ os.path.join(app_src, "project.properties")):
+ os.chdir(orig_dir)
+ return False
+
+ if not doCopy(
+ os.path.join(android_project_path, "local.properties"),
+ os.path.join(app_src, "local.properties")):
+ os.chdir(orig_dir)
+ return False
+
+ if not doCopy(
+ os.path.join(android_project_path, "local.properties"),
+ os.path.join(pack_tool, "local.properties")):
+ os.chdir(orig_dir)
+ return False
+
+ os.chdir(app_src)
+ if not doCMD("ant debug"):
+ os.chdir(orig_dir)
+ return False
+
+ if not doCopy(
+ os.path.join(app_src, "bin", "%s-debug.apk" % app_name),
+ os.path.join(app_dest, "%s.apk" % app_name)):
+ os.chdir(orig_dir)
+ return False
+ os.chdir(orig_dir)
+ return True
+
+
+def packAPP(build_json=None, app_src=None, app_dest=None, app_name=None):
+ LOG.info("Packing %s(%s)" % (app_name, app_src))
+ if not os.path.exists(app_dest):
+ try:
+ os.makedirs(app_dest)
+ except Exception as e:
+ LOG.error("Fail to init package install dest dir: %s" % e)
+ return False
+
+ if checkContains(BUILD_PARAMETERS.pkgtype, "XPK"):
+ if not packXPK(build_json, app_src, app_dest, app_name):
+ return False
+ elif checkContains(BUILD_PARAMETERS.pkgtype, "WGT"):
+ if not packWGT(build_json, app_src, app_dest, app_name):
+ return False
+ elif checkContains(BUILD_PARAMETERS.pkgtype, "APK"):
+ if not packAPK(build_json, app_src, app_dest, app_name):
+ return False
+ elif checkContains(BUILD_PARAMETERS.pkgtype, "CORDOVA"):
+ if not packCordova(build_json, app_src, app_dest, app_name):
+ return False
+ elif checkContains(BUILD_PARAMETERS.pkgtype, "EMBEDDINGAPI"):
+ if not packEmbeddingAPI(build_json, app_src, app_dest, app_name):
+ return False
+ else:
+ LOG.error("Got wrong pkg type: %s" % BUILD_PARAMETERS.pkgtype)
+ return False
+
+ LOG.info("Success to pack APP: %s" % app_name)
+ return True
+
+
+def createIndexFile(index_file_path=None, hosted_app=None):
+ try:
+ if hosted_app:
+ index_url = "http://127.0.0.1/opt/%s/webrunner/index.html?" \
+ "testsuite=../tests.xml&testprefix=../../.." % PKG_NAME
+ else:
+ index_url = "opt/%s/webrunner/index.html?testsuite=../tests.xml" \
+ "&testprefix=../../.." % PKG_NAME
+ html_content = "<!doctype html><head><meta http-equiv='Refresh' " \
+ "content='1; url=%s'></head>" % index_url
+ index_file = open(index_file_path, "w")
+ index_file.write(html_content)
+ index_file.close()
+ except Exception as e:
+ LOG.error("Fail to create index.html for top-app: %s" % e)
+ return False
+ LOG.info("Success to create index file %s" % index_file_path)
+ return True
+
+
+def buildSubAPP(app_dir=None, build_json=None, app_dest_default=None):
+ app_dir_inside = safelyGetValue(build_json, "app-dir")
+ if app_dir_inside:
+ app_dir = app_dir_inside
+ LOG.info("+Building sub APP(s) from %s ..." % app_dir)
+ app_dir = os.path.join(BUILD_ROOT_SRC, app_dir)
+ app_name = safelyGetValue(build_json, "app-name")
+ if not app_name:
+ app_name = os.path.basename(app_dir)
+
+ app_src = os.path.join(BUILD_ROOT_SRC_SUB_APP, app_name)
+ if buildSRC(app_dir, app_src, build_json):
+ app_dest = safelyGetValue(build_json, "install-path")
+ if app_dest:
+ app_dest = os.path.join(app_dest_default, app_dest)
+ else:
+ app_dest = app_dest_default
+
+ if safelyGetValue(build_json, "all-apps") == "true":
+ app_dirs = os.listdir(app_src)
+ apps_num = 0
+ for i_app_dir in app_dirs:
+ if os.path.isdir(os.path.join(app_src, i_app_dir)):
+ i_app_name = os.path.basename(i_app_dir)
+ if not packAPP(
+ build_json, os.path.join(app_src, i_app_name),
+ app_dest, i_app_name):
+ return False
+ else:
+ apps_num = apps_num + 1
+ if apps_num > 0:
+ LOG.info("Totally packed %d apps in %s" % (apps_num, app_dir))
+ return True
+ else:
+ return packAPP(build_json, app_src, app_dest, app_name)
+ return False
+
+
+def buildPKGAPP(build_json=None):
+ LOG.info("+Building package APP ...")
+ if not doCopy(os.path.join(BUILD_ROOT_SRC, "icon.png"),
+ os.path.join(BUILD_ROOT_SRC_PKG_APP, "icon.png")):
+ return False
+
+ if checkContains(BUILD_PARAMETERS.pkgtype, "XPK"):
+ if not doCopy(
+ os.path.join(BUILD_ROOT_SRC, "manifest.json"),
+ os.path.join(BUILD_ROOT_SRC_PKG_APP, "manifest.json")):
+ return False
+ elif checkContains(BUILD_PARAMETERS.pkgtype, "WGT"):
+ if not doCopy(os.path.join(BUILD_ROOT_SRC, "config.xml"),
+ os.path.join(BUILD_ROOT_SRC_PKG_APP, "config.xml")):
+ return False
+
+ hosted_app = False
+ if safelyGetValue(build_json, "hosted-app") == "true":
+ hosted_app = True
+ if not createIndexFile(
+ os.path.join(BUILD_ROOT_SRC_PKG_APP, "index.html"), hosted_app):
+ return False
+
+ if not hosted_app:
+ if "blacklist" not in build_json:
+ build_json.update({"blacklist": []})
+ build_json["blacklist"].extend(PKG_BLACK_LIST)
+ if not buildSRC(BUILD_ROOT_SRC, BUILD_ROOT_PKG_APP, build_json):
+ return False
+
+ if "subapp-list" in build_json:
+ for i_sub_app in build_json["subapp-list"].keys():
+ if not buildSubAPP(
+ i_sub_app, build_json["subapp-list"][i_sub_app],
+ BUILD_ROOT_PKG_APP):
+ return False
+
+ if not packAPP(
+ build_json, BUILD_ROOT_SRC_PKG_APP, BUILD_ROOT_PKG, PKG_NAME):
+ return False
+
+ return True
+
+
+def buildPKG(build_json=None):
+ if "blacklist" not in build_json:
+ build_json.update({"blacklist": []})
+ build_json["blacklist"].extend(PKG_BLACK_LIST)
+ if not buildSRC(BUILD_ROOT_SRC, BUILD_ROOT_PKG, build_json):
+ return False
+
+ if "subapp-list" in build_json:
+ for i_sub_app in build_json["subapp-list"].keys():
+ if not buildSubAPP(
+ i_sub_app, build_json["subapp-list"][i_sub_app],
+ BUILD_ROOT_PKG):
+ return False
+
+ if "pkg-app" in build_json:
+ if not buildPKGAPP(build_json["pkg-app"]):
+ return False
+
+ return True
+
+
+def main():
+ global LOG
+ LOG = logging.getLogger("pack-tool")
+ LOG.setLevel(LOG_LEVEL)
+ stream_handler = logging.StreamHandler()
+ stream_handler.setLevel(LOG_LEVEL)
+ stream_formatter = ColorFormatter("[%(asctime)s] %(message)s")
+ stream_handler.setFormatter(stream_formatter)
+ LOG.addHandler(stream_handler)
+
+ try:
+ usage = "Usage: ./pack.py -t apk -m shared -a x86"
+ opts_parser = OptionParser(usage=usage)
+ opts_parser.add_option(
+ "-c",
+ "--cfg",
+ dest="pkgcfg",
+ help="specify the path of config json file")
+ opts_parser.add_option(
+ "-t",
+ "--type",
+ dest="pkgtype",
+ help="specify the pkg type, e.g. apk, xpk, wgt ...")
+ opts_parser.add_option(
+ "-m",
+ "--mode",
+ dest="pkgmode",
+ help="specify the apk mode, e.g. shared, embedded")
+ opts_parser.add_option(
+ "-a",
+ "--arch",
+ dest="pkgarch",
+ help="specify the apk arch, e.g. x86, arm")
+ opts_parser.add_option(
+ "-d",
+ "--dest",
+ dest="destdir",
+ help="specify the installation folder for packed package")
+ opts_parser.add_option(
+ "-s",
+ "--src",
+ dest="srcdir",
+ help="specify the path of pkg resource for packing")
+ opts_parser.add_option(
+ "--tools",
+ dest="pkgpacktools",
+ help="specify the parent folder of pack tools")
+ opts_parser.add_option(
+ "--notclean",
+ dest="bnotclean",
+ action="store_true",
+ help="disable the build root clean after the packing")
+ opts_parser.add_option(
+ "--sign",
+ dest="signature",
+ action="store_true",
+ help="signature operation will be done when packing wgt")
+ opts_parser.add_option(
+ "-v",
+ "--version",
+ dest="bversion",
+ action="store_true",
+ help="show this tool's version")
+ opts_parser.add_option(
+ "--pkg-version",
+ dest="pkgversion",
+ help="specify the pkg version, e.g. 0.0.0.1")
+
+ if len(sys.argv) == 1:
+ sys.argv.append("-h")
+
+ global BUILD_PARAMETERS
+ (BUILD_PARAMETERS, args) = opts_parser.parse_args()
+ except Exception as e:
+ LOG.error("Got wrong options: %s, exit ..." % e)
+ sys.exit(1)
+
+ if BUILD_PARAMETERS.bversion:
+ print "Version: %s" % TOOL_VERSION
+ sys.exit(0)
+
+ if not BUILD_PARAMETERS.srcdir:
+ BUILD_PARAMETERS.srcdir = os.getcwd()
+ BUILD_PARAMETERS.srcdir = os.path.expanduser(BUILD_PARAMETERS.srcdir)
+
+ if not os.path.exists(
+ os.path.join(BUILD_PARAMETERS.srcdir, "..", "..", VERSION_FILE)):
+ if not os.path.exists(
+ os.path.join(BUILD_PARAMETERS.srcdir, "..", VERSION_FILE)):
+ if not os.path.exists(
+ os.path.join(BUILD_PARAMETERS.srcdir, VERSION_FILE)):
+ LOG.info(
+ "Not found pkg version file, try to use option --pkg-version")
+ pkg_version_file_path = None
+ else:
+ pkg_version_file_path = os.path.join(
+ BUILD_PARAMETERS.srcdir, VERSION_FILE)
+ else:
+ pkg_version_file_path = os.path.join(
+ BUILD_PARAMETERS.srcdir, "..", VERSION_FILE)
+ else:
+ pkg_version_file_path = os.path.join(
+ BUILD_PARAMETERS.srcdir, "..", "..", VERSION_FILE)
+
+ try:
+ pkg_main_version = 0
+ pkg_release_version = 1
+ if BUILD_PARAMETERS.pkgversion:
+ LOG.info("Using %s as pkg version " % BUILD_PARAMETERS.pkgversion)
+ pkg_main_version = BUILD_PARAMETERS.pkgversion
+ else:
+ if pkg_version_file_path is not None:
+ LOG.info("Using pkg version file: %s" % pkg_version_file_path)
+ with open(pkg_version_file_path, "rt") as pkg_version_file:
+ pkg_version_raw = pkg_version_file.read()
+ pkg_version_file.close()
+ pkg_version_json = json.loads(pkg_version_raw)
+ pkg_main_version = pkg_version_json["main-version"]
+ pkg_release_version = pkg_version_json["release-version"]
+ except Exception as e:
+ LOG.error("Fail to read pkg version file: %s, exit ..." % e)
+ sys.exit(1)
+
+ if not BUILD_PARAMETERS.pkgtype:
+ LOG.error("No pkg type provided, exit ...")
+ sys.exit(1)
+ elif not BUILD_PARAMETERS.pkgtype in PKG_TYPES:
+ LOG.error("Wrong pkg type, only support: %s, exit ..." %
+ PKG_TYPES)
+ sys.exit(1)
+
+ if BUILD_PARAMETERS.pkgtype == "apk" or \
+ BUILD_PARAMETERS.pkgtype == "apk-aio":
+ if not BUILD_PARAMETERS.pkgmode:
+ LOG.error("No pkg mode option provided, exit ...")
+ sys.exit(1)
+ elif not BUILD_PARAMETERS.pkgmode in PKG_MODES:
+ LOG.error(
+ "Wrong pkg mode option provided, only support:%s, exit ..." %
+ PKG_MODES)
+ sys.exit(1)
+
+ if not BUILD_PARAMETERS.pkgarch:
+ LOG.error("No pkg arch option provided, exit ...")
+ sys.exit(1)
+ elif not BUILD_PARAMETERS.pkgarch in PKG_ARCHS:
+ LOG.error(
+ "Wrong pkg arch option provided, only support:%s, exit ..." %
+ PKG_ARCHS)
+ sys.exit(1)
+
+ if BUILD_PARAMETERS.pkgtype == "apk-aio" or \
+ BUILD_PARAMETERS.pkgtype == "cordova-aio":
+ if not BUILD_PARAMETERS.destdir or not os.path.exists(
+ BUILD_PARAMETERS.destdir):
+ LOG.error("No all-in-one installation dest dir found, exit ...")
+ sys.exit(1)
+
+ elif not BUILD_PARAMETERS.destdir:
+ BUILD_PARAMETERS.destdir = BUILD_PARAMETERS.srcdir
+ BUILD_PARAMETERS.destdir = os.path.expanduser(BUILD_PARAMETERS.destdir)
+
+ if not BUILD_PARAMETERS.pkgpacktools:
+ BUILD_PARAMETERS.pkgpacktools = os.path.join(
+ BUILD_PARAMETERS.srcdir, "..", "..", "tools")
+ BUILD_PARAMETERS.pkgpacktools = os.path.expanduser(
+ BUILD_PARAMETERS.pkgpacktools)
+
+ config_json = None
+ if BUILD_PARAMETERS.pkgcfg:
+ config_json_file_path = BUILD_PARAMETERS.pkgcfg
+ else:
+ config_json_file_path = os.path.join(
+ BUILD_PARAMETERS.srcdir, "suite.json")
+ try:
+ LOG.info("Using config json file: %s" % config_json_file_path)
+ with open(config_json_file_path, "rt") as config_json_file:
+ config_raw = config_json_file.read()
+ config_json_file.close()
+ config_json = json.loads(config_raw)
+ except Exception as e:
+ LOG.error("Fail to read config json file: %s, exit ..." % e)
+ sys.exit(1)
+
+ global PKG_NAME
+ PKG_NAME = safelyGetValue(config_json, "pkg-name")
+ if not PKG_NAME:
+ PKG_NAME = os.path.basename(BUILD_PARAMETERS.srcdir)
+ LOG.warning(
+ "Fail to read pkg name from json, "
+ "using src dir name as pkg name ...")
+
+ LOG.info("================= %s (%s-%s) ================" %
+ (PKG_NAME, pkg_main_version, pkg_release_version))
+
+ if not safelyGetValue(config_json, "pkg-list"):
+ LOG.error("Fail to read pkg-list, exit ...")
+ sys.exit(1)
+
+ pkg_json = None
+ for i_pkg in config_json["pkg-list"].keys():
+ i_pkg_list = i_pkg.replace(" ", "").split(",")
+ if BUILD_PARAMETERS.pkgtype in i_pkg_list:
+ pkg_json = config_json["pkg-list"][i_pkg]
+
+ if not pkg_json:
+ LOG.error("Fail to read pkg json, exit ...")
+ sys.exit(1)
+
+ if not prepareBuildRoot():
+ exitHandler(1)
+
+ if "pkg-blacklist" in config_json:
+ PKG_BLACK_LIST.extend(config_json["pkg-blacklist"])
+
+ if not buildPKG(pkg_json):
+ exitHandler(1)
+
+ LOG.info("+Building package ...")
+ if BUILD_PARAMETERS.pkgtype == "apk-aio" or \
+ BUILD_PARAMETERS.pkgtype == "cordova-aio":
+ pkg_file_list = os.listdir(os.path.join(BUILD_ROOT, "pkg"))
+ for i_file in pkg_file_list:
+ if not doCopy(
+ os.path.join(BUILD_ROOT, "pkg", i_file),
+ os.path.join(BUILD_PARAMETERS.destdir, i_file)):
+ exitHandler(1)
+ else:
+ pkg_file = os.path.join(
+ BUILD_PARAMETERS.destdir,
+ "%s-%s-%s.%s.zip" %
+ (PKG_NAME,
+ pkg_main_version,
+ pkg_release_version,
+ BUILD_PARAMETERS.pkgtype))
+
+ if not zipDir(os.path.join(BUILD_ROOT, "pkg"), pkg_file):
+ exitHandler(1)
+
+if __name__ == "__main__":
+ main()
+ exitHandler(0)
--- /dev/null
+#!/usr/bin/python
+#!encoding:utf-8
+
+import os
+import sys
+import re
+import commands
+import glob
+import fnmatch
+import string
+from xml.etree import ElementTree as ET
+from optparse import OptionParser
+
+
+def iterfindfiles (path, fnexp):
+ for root, dirs, files in os.walk(path):
+ for filename in fnmatch.filter(files, fnexp):
+ yield os.path.join(root, filename)
+
+def count_upstream (string = None, str_entry=None ):
+ if string.find('/%s/' % str_entry) >= 0:
+ return 1
+ else:
+ return 0
+
+def analy_test_file(file_path = None):
+ total_number = 0
+ total_auto = 0
+ total_auto_webdriver = 0
+ total_manual = 0
+ p0_number = 0
+ p0_auto = 0
+ p0_auto_webdriver = 0
+ p0_manual = 0
+ p1_number = 0
+ p1_auto = 0
+ p1_auto_webdriver = 0
+ p1_manual = 0
+ p2_number = 0
+ p2_auto = 0
+ p2_auto_webdriver = 0
+ p2_manual = 0
+ p3_number = 0
+ p3_auto = 0
+ p3_auto_webdriver = 0
+ p3_manual = 0
+ try:
+ suite_name = os.path.basename(os.path.dirname(file_path))
+ tree = ET.parse(file_path)
+ root = tree.getroot()
+ for set_node in root.findall('suite/set'):
+ flag = 0
+ s_type = set_node.get('type')
+ if s_type == 'ref' or s_type == 'script' :
+ if os.path.split(file_path)[0].split('/')[-1].find("wrt") > -1:
+ flag = 0
+ else:
+ flag = 1
+ for tc_node in set_node.findall('testcase'):
+ subcase = 1
+ s_status = tc_node.get('status')
+ s_subcase = tc_node.get('subcase')
+ s_priority = tc_node.get('priority')
+ s_execution_type = tc_node.get('execution_type')
+ if s_status == 'designed' :
+ continue
+ if s_subcase:
+ subcase = string.atoi(s_subcase)
+ if s_priority == 'P0' :
+ if s_execution_type == "auto" :
+ p0_auto += 1*subcase
+ if flag == 1:
+ p0_auto_webdriver += 1*subcase
+ else:
+ p0_manual += 1*subcase
+ elif s_priority == 'P1' :
+ if s_execution_type == "auto" :
+ p1_auto += 1*subcase
+ if flag == 1:
+ p1_auto_webdriver += 1*subcase
+ else:
+ p1_manual += 1*subcase
+ elif s_priority == 'P2' :
+ if s_execution_type == "auto" :
+ p2_auto += 1*subcase
+ if flag == 1:
+ p2_auto_webdriver += 1*subcase
+ else:
+ p2_manual += 1*subcase
+ elif s_priority == 'P3' :
+ if s_execution_type == "auto" :
+ p3_auto += 1*subcase
+ if flag == 1:
+ p3_auto_webdriver += 1*subcase
+ else:
+ p3_manual += 1*subcase
+ except Exception, e:
+ print "Got error when analy test files: %s" % e
+ print file_path
+
+ p0_number = p0_auto + p0_manual
+ p1_number = p1_auto + p1_manual
+ p2_number = p2_auto + p2_manual
+ p3_number = p3_auto + p3_manual
+ total_auto = p0_auto + p1_auto + p2_auto + p3_auto
+ total_auto_webdriver = p0_auto_webdriver + p1_auto_webdriver + p2_auto_webdriver + p3_auto_webdriver
+ total_manual = p0_manual + p1_manual + p2_manual + p3_manual
+ total_number = total_auto + total_manual
+
+ case_message = suite_name + " " + str(total_number) + " " + str(total_auto) + " " + str(total_auto_webdriver) + " " + str(total_manual) + " " + str(p0_number) + " " + str(p0_auto) + " " + str(p0_auto_webdriver) + " " + str(p0_manual) + " " + str(p1_number) + " " + str(p1_auto) + " " + str(p1_auto_webdriver) + " " + str(p1_manual) + " " + str(p2_number) + " " + str(p2_auto) + " " + str(p2_auto_webdriver) + " " + str(p2_manual) + " " + str(p3_number) + " " + str(p3_auto) + " " + str(p3_auto_webdriver) + " " + str(p3_manual) + " "
+
+ return case_message
+
+def get_upstream(file_path):
+ n_upstream = 0
+ upstream_name = ["w3c","csswg","webkit","khronos","blink","ecmascript_simd"]
+ exist_upstream = []
+ try:
+ suite_name = os.path.basename(os.path.dirname(file_path))
+ tree = ET.parse(file_path)
+ root = tree.getroot()
+ for entry_node in root.findall('suite/set/testcase/description/test_script_entry'):
+ for element in upstream_name :
+ if count_upstream(entry_node.text, element) == 1:
+ n_upstream += 1
+ if element not in exist_upstream :
+ exist_upstream.append(element)
+ except Exception, e:
+ print e
+
+ upstream = ""
+ for element in exist_upstream:
+ upstream += element + "/"
+ return str(n_upstream) + " " + upstream[: -1]
+
+
+def get_case_status(file_path):
+
+ if "tct-widget02-w3c-tests" in file_path:
+ return
+ if "tct-testconfig" in file_path:
+ return
+ if "xwalk-system-tests" in file_path:
+ return
+
+ try:
+ case_message = analy_test_file(file_path)
+ upstream = get_upstream(file_path)
+ content = case_message + upstream
+ fp = open("analy_result.csv",'a')
+ fp.write(content)
+ fp.write("\n")
+ fp.close()
+ except Exception, e:
+ print "Got error when get case status: %s" % e
+
+def init_result_file():
+ title = "Suite_name,Total,Total_auto,Total_auto_webdriver,Total_manual,P0,P0_auto,P0_auto_webdriver,P0_manual,P1,P1_auto,\
+P1_auto_webdriver,P1_manual,P2,P2_auto,P2_auto_webdriver,P2_manual,P3,P3_auto,P3_auto_webdriver,P3_manual,\
+Integrated_Upstream_TCs,Upstream_Resource"
+ try:
+ file_path = os.getcwd() + "/analy_result.csv"
+ if os.path.exists(file_path):
+ os.remove(file_path)
+ fp = open("analy_result.csv",'a')
+ fp.write(title)
+ fp.write("\n")
+ fp.close()
+ except Exception, e:
+ print "Got error when init analy file : %s" % e
+
+def main():
+ try:
+ usage = "./stats.py -f ../../webapi/tct-2dtransforms-css3-tests/tests.full.xml"
+ opts_parser = OptionParser(usage=usage)
+ opts_parser.add_option(
+ "-r",
+ dest="suitesdir",
+ help="specify the path of folder which tests.full.xml located in.")
+ opts_parser.add_option(
+ "-f",
+ dest="xmlfile",
+ help="specify the path of tests.full.xml file")
+
+ init_result_file()
+ if len(sys.argv) == 1:
+ sys.argv.append("-h")
+ (PARAMETERS, args) = opts_parser.parse_args()
+ if PARAMETERS.suitesdir:
+ for filename in iterfindfiles("%s" % PARAMETERS.suitesdir, "tests.full.xml"):
+ get_case_status(filename)
+
+ if PARAMETERS.xmlfile:
+ get_case_status(PARAMETERS.xmlfile)
+ except Exception as e:
+ print "Got error: %s, exit" % e
+
+if __name__ == '__main__':
+ main()
+
--- /dev/null
+## Introduction
+
+This `crosswalk` tool is used to pack .apk test suite.
+
+Please get the latest scripts from
+https://origin-download.01.org/crosswalk/releases/crosswalk/android/canary/
+
+## Authors:
+* Xiong, Jiehua <jiehuax.xiong@intel.com>
+
+## License
+
+Copyright (c) 2014 Intel Corporation. All rights reserved.
+Use of this source code is governed by a BSD-style license that can be
+found in the `LICENSE` file.
--- /dev/null
+#!/usr/bin/env python
+#
+# Copyright (c) 2014 Intel Corporation.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# * Redistributions of works must retain the original copyright notice, this
+# list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the original copyright notice
+# , this list of conditions and the following disclaimer in the documentation
+# and/or other materials provided with the distribution.
+# * Neither the name of Intel Corporation nor the names of its contributors
+# may be used to endorse or promote products derived from this work without
+# specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# Authors:
+# Fan, Yugang <yugang.fan@intel.com>
+
+import sys
+import os
+import json
+import logging
+from optparse import OptionParser
+
+VERSION = "v0.1"
+LOG = None
+LOG_LEVEL = logging.DEBUG
+FORMAT_ERROR_STATUS = False
+
+
+class color_formatter(logging.Formatter):
+
+ def __init__(self, msg):
+ logging.Formatter.__init__(self, msg)
+
+ def format(self, record):
+ red, green, yellow, blue = range(4)
+ colors = {'INFO': green, 'DEBUG': blue,
+ 'WARNING': yellow, 'ERROR': red}
+ msg = record.msg
+ levelname = record.levelname
+ if levelname in colors:
+ msg_color = "\033[0;%dm" % (
+ 31 + colors[levelname]) + msg + "\033[0m"
+ record.msg = msg_color
+
+ return logging.Formatter.format(self, record)
+
+
+def get_file_list(format_list=None, recursive=False, symlinks=True):
+ global FORMAT_ERROR_STATUS
+ file_list = []
+ for format_item in format_list:
+ if not os.path.exists(format_item):
+ LOG.error("%s is not existing" % format_item)
+ FORMAT_ERROR_STATUS = True
+ continue
+ elif os.path.islink(format_item):
+ if symlinks:
+ format_item = os.path.join(
+ os.path.dirname(format_item),
+ os.readlink(format_item))
+ else:
+ LOG.warning("%s is link, skip it" % format_item)
+ continue
+
+ if os.path.isdir(format_item):
+ if not recursive:
+ LOG.error("%s is not a file" % format_item)
+ FORMAT_ERROR_STATUS = True
+ continue
+ for dirpath, dirnames, files in os.walk(format_item):
+ for i_file in files:
+ if i_file.endswith(".json"):
+ i_file_path = os.path.join(dirpath, i_file)
+ if os.path.islink(i_file_path):
+ if symlinks:
+ file_list = file_list + [
+ os.path.join(
+ os.path.dirname(i_file_path),
+ os.readlink(i_file_path))]
+ else:
+ LOG.warning(
+ "%s is link, skip it" %
+ i_file_path)
+ continue
+ else:
+ file_list = file_list + [i_file_path]
+ else:
+ file_list = file_list + [format_item]
+
+ if not file_list:
+ LOG.error("No json file found for formatting ...")
+ return file_list
+
+
+def main():
+ global LOG
+ global FORMAT_ERROR_STATUS
+
+ LOG = logging.getLogger("json-formater")
+ LOG.setLevel(LOG_LEVEL)
+ stream_handler = logging.StreamHandler()
+ stream_handler.setLevel(LOG_LEVEL)
+ stream_formatter = color_formatter("%(message)s")
+ stream_handler.setFormatter(stream_formatter)
+ LOG.addHandler(stream_handler)
+
+ try:
+ usage = "Usage: \n\tjson_formatter -i file.json\n\t" \
+ "json_formatter -r json_dir\n\tjson_formatter file.json"
+ opts_parser = OptionParser(usage=usage, version=VERSION)
+ opts_parser.add_option(
+ "-i",
+ "--in-place",
+ dest="inplace",
+ action="store_true",
+ help="make changes to json files in place")
+ opts_parser.add_option(
+ "-r",
+ "--recursive",
+ dest="recursive",
+ action="store_true",
+ help="run recursively over directories, "
+ "force the formatter to use \"--in-place\"")
+ opts_parser.add_option(
+ "-n",
+ "--indent",
+ dest="indent",
+ action="store",
+ type="int",
+ help="json indent, default value is 4")
+ opts_parser.add_option(
+ "-u",
+ "--unsort-keys",
+ dest="unsortkeys",
+ action="store_true",
+ help="not sort json keys")
+ opts_parser.add_option(
+ "-s",
+ "--symlinks",
+ dest="symlinks",
+ action="store_true",
+ help="follow symlinks")
+
+ if len(sys.argv) == 1:
+ sys.argv.append("-h")
+ (options, args) = opts_parser.parse_args()
+ except Exception as e:
+ LOG.error("Got options error: %s" % e)
+ sys.exit(1)
+
+ files_list = []
+ format_list = [os.getcwd()]
+
+ if options.symlinks:
+ follow_symlinks = True
+ else:
+ follow_symlinks = False
+
+ if args:
+ format_list = args
+
+ if options.recursive:
+ options.inplace = True
+ follow_recursive = True
+ else:
+ follow_recursive = False
+
+ json_indent = 4
+ if options.indent:
+ json_indent = options.indent
+
+ json_sort = True
+ if options.unsortkeys:
+ json_sort = False
+
+ files_list = get_file_list(
+ format_list,
+ recursive=follow_recursive,
+ symlinks=follow_symlinks)
+ for i_file in files_list:
+ LOG.info("-->> Formatting %s" % i_file)
+ try:
+ with open(i_file, "rt") as original_json_file:
+ original_json_raw = original_json_file.read()
+ original_json_file.close()
+ original_json = json.loads(original_json_raw)
+ updated_json_tmp = json.dumps(
+ original_json,
+ indent=json_indent,
+ sort_keys=json_sort)
+ updated_json = None
+ for i_line in updated_json_tmp.splitlines():
+ i_line = i_line.rstrip()
+ if i_line:
+ if updated_json:
+ updated_json = "%s\n%s" % (updated_json, i_line)
+ else:
+ updated_json = i_line
+ if not updated_json:
+ LOG.error("Got empty json string from %s" % i_file)
+ FORMAT_ERROR_STATUS = True
+ continue
+ if options.inplace:
+ os.rename(i_file, "%s.json-formatter" % i_file)
+ try:
+ with open(i_file, "w") as original_json_file:
+ original_json_file.write(updated_json)
+ original_json_file.close()
+ os.remove("%s.json-formatter" % i_file)
+ except Exception as e:
+ LOG.error("Fail to format %s: %s" % (i_file, e))
+ FORMAT_ERROR_STATUS = True
+ if os.path.exists(i_file):
+ os.remove(i_file)
+ os.rename("%s.json-formatter" % i_file, i_file)
+ else:
+ print updated_json
+ except Exception as e:
+ LOG.error("Fail to format %s: %s" % (i_file, e))
+ FORMAT_ERROR_STATUS = True
+ continue
+ LOG.info("Done")
+
+ if FORMAT_ERROR_STATUS:
+ sys.exit(1)
+ else:
+ sys.exit(0)
+
+if __name__ == "__main__":
+ main()
--- /dev/null
+#!/usr/bin/env python
+
+# Copyright (c) 2013 Intel Corporation. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""
+Generate XPK package from package resources and the author private key.
+"""
+import argparse
+import os
+from Crypto.PublicKey import RSA
+from Crypto import Random
+from Crypto.Signature import PKCS1_v1_5
+from Crypto.Hash import SHA
+import traceback
+import zipfile
+import struct
+
+class XPKGenerator(object):
+ def __init__(self, source_dir, key_file, output_file):
+ """
+ source_dir : the path to package resource directory.
+ key_file : the path to RSA private key file, if the file is invalid,
+ generator will create it automatically.
+ output_file : the output XPK file path.
+ """
+ self.source_dir_ = source_dir
+ self.output_file_ = output_file
+ if not os.path.exists(key_file):
+ try:
+ print('Start to generate RSA key')
+ rng = Random.new().read
+ self.RSAkey = RSA.generate(1024, rng)
+ kfile = open(key_file,'w')
+ kfile.write(self.RSAkey.exportKey('PEM'))
+ kfile.close()
+ print('Finished generating RSA key, saved as %s' % key_file)
+ except IOError:
+ if os.path.exists(key_file):
+ os.remove(key_file)
+ traceback.print_exc()
+ else:
+ self.RSAkey = RSA.importKey(open(key_file, 'r').read())
+ self.pubkey = self.RSAkey.publickey().exportKey('DER')
+
+ def Generate(self):
+ if not os.path.exists(self.source_dir_):
+ print("The source directory %s is invalid." % self.source_dir_)
+ return
+ try:
+ zip_file = '%s.tmp' % self.output_file_
+ self.__Compress(self.source_dir_, zip_file)
+ signer = PKCS1_v1_5.new(self.RSAkey)
+ zfile = open(zip_file, 'rb')
+ sha = SHA.new(zfile.read())
+ signature = signer.sign(sha)
+ xpk = open(self.output_file_, 'wb')
+ zfile.seek(0)
+ print('Generating XPK package: %s' % self.output_file_)
+ xpk.write('\x43\x72\x57\x6B')
+ xpk.write(struct.pack('<I', len(self.pubkey)))
+ xpk.write(struct.pack('<I', len(signature)))
+ xpk.write(self.pubkey)
+ xpk.write(signature)
+ xpk.write(zfile.read())
+ zfile.close()
+ xpk.close()
+ print('Generated new XPK package %s successfully.'
+ % self.output_file_)
+ except IOError:
+ if os.path.exists(self.output_file_):
+ os.remove(self.output_file_)
+ traceback.print_exc()
+ finally:
+ if os.path.exists(zip_file):
+ os.remove(zip_file)
+
+ @classmethod
+ def __Compress(cls, src, dst):
+ try:
+ print('Adding resources from %s into package.' % src)
+ zfile = zipfile.ZipFile(dst, 'w')
+ abs_src = os.path.abspath(src)
+ for dirname, _, files in os.walk(src):
+ for filename in files:
+ absname = os.path.abspath(os.path.join(dirname, filename))
+ relativename = absname[len(abs_src) + 1:]
+ zfile.write(absname, relativename)
+ zfile.close()
+ print('Generated package successfully.')
+ except IOError:
+ if os.path.exists(dst):
+ os.remove(dst)
+ traceback.print_exc()
+
+def main():
+ parser = argparse.ArgumentParser(
+ description='XPKGenerator arguments parser')
+ parser.add_argument('input',
+ help='Directory path to Crosswalk package resources')
+ parser.add_argument(
+ 'key',
+ help='Path to private key file, a new private ' \
+ 'key file will be generated if it is invalid.')
+ parser.add_argument(
+ '-o', '--output',
+ help='Path to generated XPK file',
+ default='default')
+ args = parser.parse_args()
+
+ output_file = args.output
+ if output_file == 'default':
+ head, tail = os.path.split(args.input)
+ while len(tail) == 0:
+ head, tail = os.path.split(head)
+ output_file = tail + '.xpk'
+ generator = XPKGenerator(args.input, args.key, output_file)
+ generator.Generate()
+
+if __name__ == '__main__':
+ main()
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2014 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Your, Name <youremail@intel.com>
+
+-->
+
+<meta charset="utf-8">
+<title>[Test Area] Reference File</title>
+<link rel="author" title="Intel" href="http://www.intel.com">
+<style>
+ [CSS for test]
+</style>
+<body>
+ <p>Test passes if [description of pass condition].</p>
+ [Content of test]
+</body>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2014 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Your, Name <youremail@intel.com>
+
+-->
+
+<meta charset="utf-8">
+<title>[Test Area]: [Title/Scope of Test]</title>
+<link rel="author" title="Intel" href="http://www.intel.com">
+<link rel="help" href="http://www.w3.org/TR/[direct link to tested section]">
+<link rel="match" href="[path to reference file]">
+<meta name="flags" content="[requirement flags]">
+<meta name="assert" content="Test checks that [explanation of what you're trying to test].">
+<style>
+ [CSS for test]
+</style>
+<body>
+ <p>Test passes if [description of pass condition].</p>
+ [Content of test]
+</body>
--- /dev/null
+<!DOCTYPE html>
+<!--
+Copyright (c) 2014 Intel Corporation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+ Your, Name <youremail@intel.com>
+
+-->
+
+<meta charset="utf-8">
+<title>[Test Area]: [Title/Scope of Test]</title>
+<link rel="author" title="Intel" href="http://www.intel.com">
+<link rel="help" href="http://www.w3.org/TR/[direct link to tested section]">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="log"></div>
+<script>
+
+test(function() {
+ // [body of test function - must include at least one assert*() function]
+}, [Test Name]);
+
+// Include as many test() functions as you need
+
+</script>
--- /dev/null
+## Introduction
+
+This directory contains tools for verifying tests.full.xml and converting xml to csv or csv to xml.
+
+## Command
+
+To convert tests.full.xml to csv file with command:
+ python xml2csv.py -c /path/to/tests.full.xml
+
+
+To convert csv file to tests.full.xml and tests.xml with command:
+ python csv2xml.py -c /path/***.csv
+
+
+To verify case path, id, purpose and set type are right with command:
+ python xmlverifier.py -v /path/***
--- /dev/null
+#!/usr/bin/python
+#encoding:utf-8
+
+# Copyright (c) 2014 Intel Corporation.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# * Redistributions of works must retain the original copyright notice, this
+# list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the original copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# * Neither the name of Intel Corporation nor the names of its contributors
+# may be used to endorse or promote products derived from this work without
+# specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# Authors:
+# Liu, xin <xinx.liu@intel.com>
+
+import os
+import csv
+import re
+import sys
+import platform
+import logging
+import logging.handlers
+from xml.etree import ElementTree
+
+LOG = None
+LOG_LEVEL = logging.DEBUG
+
+class ColorFormatter(logging.Formatter):
+
+ def __init__(self, msg):
+ logging.Formatter.__init__(self, msg)
+
+ def format(self, record):
+ red, green, yellow, blue = range(4)
+ colors = {'INFO': green, 'DEBUG': blue,
+ 'WARNING': yellow, 'ERROR': red}
+ msg = record.msg
+ if msg[0] == "+":
+ msg = "\33[01m" + msg[1:] + "\033[0m"
+ elif msg[0] == "=":
+ msg = "\33[07m" + msg + "\033[0m"
+ levelname = record.levelname
+ if levelname in colors:
+ msg_color = "\033[0;%dm" % (
+ 31 + colors[levelname]) + msg + "\033[0m"
+ record.msg = msg_color
+
+ return logging.Formatter.format(self, record)
+
+def csv2full(csv_path, split_sign):
+ if not os.path.isfile(csv_path):
+ print '%s is not a file' % csv_path
+ return
+ name, ext = os.path.splitext(csv_path)
+ if not ext == '.csv':
+ print '%s is not a csv' % csv_path
+ return
+ LOG.info("+Convert csv to xml start ...")
+ csv_file = file(csv_path, 'rb')
+ csv_file.readline()
+ reader = csv.reader(csv_file)
+ csv_content = []
+ for line in reader:
+ csv_content.append(line)
+
+ csv_file.close()
+ suite_name = csv_content[0][16].split('/')[2]
+ category_name = csv_content[0][12]
+ set_name = name.split(split_sign)[-1]
+ folder = os.path.dirname(csv_path)
+ full_test_path = '%s%stests.full(%s).xml' % (folder, split_sign, set_name)
+ make_full_test(csv_content, full_test_path, suite_name, set_name, category_name)
+ LOG.info('General %s' % full_test_path)
+ test_path = '%s%stests(%s).xml' % (folder, split_sign, set_name)
+ make_test(csv_content, test_path, suite_name, set_name, category_name)
+ LOG.info('General %s' % test_path)
+ LOG.info("== Convert csv to xml finish==")
+
+def make_full_test(csv_content, full_test_name, suite_name, set_name, category_name):
+ full_test_file = open(full_test_name, 'w')
+ content = '<?xml version="1.0" encoding="UTF-8"?>\n<?xml-stylesheet type="text/xsl" href="./testcase.xsl"?>\n<test_definition>\n <suite name="%s" launcher="WRTLauncher" category="%s">\n <set name="%s">' % (suite_name, category_name, set_name)
+ for line in csv_content:
+ content += '\n <testcase purpose="%s" type="%s" status="%s" component="%s" execution_type="%s" priority="%s" id="%s">\n <description>\n <test_script_entry>%s</test_script_entry>\n </description>\n <specs>\n <spec>\n <spec_assertion element_type="%s" element_name="%s" interface="%s" specification="%s" section="%s" category="%s"/>\n <spec_url>%s</spec_url>\n <spec_statement/>\n </spec>\n </specs>\n </testcase>' % (line[1],
+ line[17],
+ line[15],
+ line[2],
+ line[4],
+ line[6],
+ line[0],
+ line[16],
+ line[7],
+ line[8],
+ line[9],
+ line[10],
+ line[11],
+ line[12],
+ line[13])
+
+ content += '\n </set>\n </suite>\n</test_definition>'
+ full_test_file.seek(0)
+ full_test_file.truncate()
+ full_test_file.write(content)
+ full_test_file.close()
+
+def make_test(csv_content, test_name, suite_name, set_name, category_name):
+ test_file = open(test_name, 'w')
+ content = '<?xml version="1.0" encoding="UTF-8"?>\n<?xml-stylesheet type="text/xsl" href="./testcase.xsl"?>\n<test_definition>\n <suite name="%s" category="%s" launcher="WRTLauncher">\n <set name="%s">' % (suite_name, category_name, set_name)
+ for line in csv_content:
+ content += '\n <testcase component="%s" execution_type="%s" id="%s" purpose="%s">\n <description>\n <test_script_entry>%s</test_script_entry>\n </description>\n </testcase>' % (line[2],
+ line[4],
+ line[0],
+ line[1],
+ line[16])
+
+ content += '\n </set>\n </suite>\n</test_definition>'
+ test_file.seek(0)
+ test_file.truncate()
+ test_file.write(content)
+ test_file.close()
+
+def echo_about():
+ """
+ This function will print the user guide and stop toolkit.
+ """
+ about = 'csv2xml V1.0\n-c <path> | Convert csv file to tests.full.xml and tests.xml\n'
+ print about
+ sys.exit()
+
+def main():
+ """
+ main function will call different functions according to the command line argvs followed the toolkit.
+ """
+ global LOG
+ LOG = logging.getLogger("pack-tool")
+ LOG.setLevel(LOG_LEVEL)
+ stream_handler = logging.StreamHandler()
+ stream_handler.setLevel(LOG_LEVEL)
+ stream_formatter = ColorFormatter("[%(asctime)s] %(message)s")
+ stream_handler.setFormatter(stream_formatter)
+ LOG.addHandler(stream_handler)
+
+ sys_name = platform.system()
+ if sys_name == 'Windows':
+ split_sign = '\\'
+ elif sys_name == 'Linux':
+ split_sign = '/'
+ if len(sys.argv) != 3:
+ print 'Error: No enough argv!'
+ echo_about()
+ else:
+ {'-c': lambda : csv2full(sys.argv[2], split_sign)}[sys.argv[1]]()
+
+if __name__ == '__main__':
+ main()
--- /dev/null
+#!/usr/bin/python
+#encoding:utf-8
+
+# Copyright (c) 2014 Intel Corporation.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# * Redistributions of works must retain the original copyright notice, this
+# list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the original copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# * Neither the name of Intel Corporation nor the names of its contributors
+# may be used to endorse or promote products derived from this work without
+# specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# Authors:
+# Liu, xin <xinx.liu@intel.com>
+
+import os
+import csv
+import re
+import sys
+import platform
+import logging
+import logging.handlers
+from xml.etree import ElementTree
+
+LOG = None
+LOG_LEVEL = logging.DEBUG
+
+class ColorFormatter(logging.Formatter):
+
+ def __init__(self, msg):
+ logging.Formatter.__init__(self, msg)
+
+ def format(self, record):
+ red, green, yellow, blue = range(4)
+ colors = {'INFO': green, 'DEBUG': blue,
+ 'WARNING': yellow, 'ERROR': red}
+ msg = record.msg
+ if msg[0] == "+":
+ msg = "\33[01m" + msg[1:] + "\033[0m"
+ elif msg[0] == "=":
+ msg = "\33[07m" + msg + "\033[0m"
+ levelname = record.levelname
+ if levelname in colors:
+ msg_color = "\033[0;%dm" % (
+ 31 + colors[levelname]) + msg + "\033[0m"
+ record.msg = msg_color
+
+ return logging.Formatter.format(self, record)
+
+def xml2csv(xml_path, split_sign):
+ if not os.path.isfile(xml_path):
+ print '%s is not a file' % xml_path
+ return
+ name, ext = os.path.splitext(xml_path)
+
+ if not ext == '.xml':
+ print '%s is not a xml' % xml_path
+ return
+ if not name.split(split_sign)[-1] == 'tests.full':
+ print name
+ print '%s is not tests.full.xml' % xml_path
+ return
+ LOG.info("+Convert xml to csv start ...")
+ folder = os.path.dirname(xml_path)
+ csv_path = folder + split_sign
+ make_csv(xml_path, csv_path)
+ LOG.info("===Convert xml to csv finish===")
+
+def make_csv(xml_path, csv_path):
+ root_node = ElementTree.parse(xml_path)
+ set_node = root_node.find('suite/set')
+ csv_file_name = set_node.attrib['name']
+ csv_path += csv_file_name + '.csv'
+ LOG.info("General: %s" % csv_path)
+ writer = csv.writer(file(csv_path, 'wb'))
+ writer.writerow(['Name',
+ 'Description',
+ 'Component',
+ 'Onload_Delay',
+ 'Execution_Type',
+ 'Package',
+ 'Priority',
+ 'ElementType',
+ 'ElementName',
+ 'Interface',
+ 'Specification',
+ 'Section',
+ 'Category',
+ 'SpecURL',
+ 'SpecStatement',
+ 'Status',
+ 'Test_Script_Entry',
+ 'Type',
+ 'PreCondition',
+ 'PostCondition',
+ 'StepNumber',
+ 'StepDescription',
+ 'StepExpectedResult'])
+ case_nodes = set_node.findall('testcase')
+ for case_node in case_nodes:
+ spec_assertion = case_node.find('specs/spec/spec_assertion')
+ element_type = ''
+ if 'element_type' in spec_assertion.attrib:
+ element_type = spec_assertion.attrib['element_type']
+ else:
+ element_type = 'true'
+ element_name = ''
+ if 'element_name' in spec_assertion.attrib:
+ element_name = spec_assertion.attrib['element_name']
+ writer.writerow([case_node.attrib['id'],
+ case_node.attrib['purpose'],
+ case_node.attrib['component'],
+ '',
+ case_node.attrib['execution_type'],
+ '',
+ case_node.attrib['priority'],
+ element_type,
+ element_name,
+ spec_assertion.attrib['interface'],
+ spec_assertion.attrib['specification'],
+ spec_assertion.attrib['section'],
+ spec_assertion.attrib['category'],
+ case_node.find('specs/spec/spec_url').text,
+ '',
+ case_node.attrib['status'],
+ case_node.find('description/test_script_entry').text,
+ case_node.attrib['type'],
+ '',
+ '',
+ '1',
+ '',
+ 'pass'])
+
+def echo_about():
+ """
+ This function will print the user guide and stop toolkit.
+ """
+ about = 'xml2csv V1.0\n-c <path> | Convert tests.full.xml to csv file\n'
+ print about
+ sys.exit()
+
+def main():
+ """
+ main function will call different functions according to the command line argvs followed the toolkit.
+ """
+ global LOG
+ LOG = logging.getLogger("pack-tool")
+ LOG.setLevel(LOG_LEVEL)
+ stream_handler = logging.StreamHandler()
+ stream_handler.setLevel(LOG_LEVEL)
+ stream_formatter = ColorFormatter("[%(asctime)s] %(message)s")
+ stream_handler.setFormatter(stream_formatter)
+ LOG.addHandler(stream_handler)
+
+ sys_name = platform.system()
+ if sys_name == 'Windows':
+ split_sign = '\\'
+ elif sys_name == 'Linux':
+ split_sign = '/'
+ if len(sys.argv) != 3:
+ print 'Error: No enough argv!'
+ echo_about()
+ else:
+ {
+ '-c': lambda : xml2csv(sys.argv[2], split_sign)}[sys.argv[1]]()
+
+if __name__ == '__main__':
+ main()
--- /dev/null
+#!/usr/bin/python
+#encoding:utf-8
+
+# Copyright (c) 2014 Intel Corporation.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# * Redistributions of works must retain the original copyright notice, this
+# list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the original copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# * Neither the name of Intel Corporation nor the names of its contributors
+# may be used to endorse or promote products derived from this work without
+# specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# Authors:
+# Liu, xin <xinx.liu@intel.com>
+
+import os
+import csv
+import re
+import sys
+import platform
+import logging
+import logging.handlers
+from xml.etree import ElementTree
+
+LOG = None
+LOG_LEVEL = logging.DEBUG
+
+class ColorFormatter(logging.Formatter):
+
+ def __init__(self, msg):
+ logging.Formatter.__init__(self, msg)
+
+ def format(self, record):
+ red, green, yellow, blue = range(4)
+ colors = {'INFO': green, 'DEBUG': blue,
+ 'WARNING': yellow, 'ERROR': red}
+ msg = record.msg
+ if msg[0] == "+":
+ msg = "\33[01m" + msg[1:] + "\033[0m"
+ elif msg[0] == "=":
+ msg = "\33[07m" + msg + "\033[0m"
+ levelname = record.levelname
+ if levelname in colors:
+ msg_color = "\033[0;%dm" % (
+ 31 + colors[levelname]) + msg + "\033[0m"
+ record.msg = msg_color
+
+ return logging.Formatter.format(self, record)
+
+
+def verify_xml(xml_dir, split_sign):
+ if not os.path.isdir(xml_dir):
+ if not os.path.isfile(xml_dir):
+ LOG.error("Not dir and not file error")
+ return
+ else:
+ name, ext = os.path.splitext(xml_dir)
+ if not ext == '.xml':
+ print '%s is not a xml' % xml_path
+ return
+ else:
+ verify_path(xml_dir, split_sign)
+
+ paths = [ item for item in os.walk(xml_dir) ]
+ for path, dirs, files in paths:
+ for filename in files:
+ if filename == "tests.full.xml":
+ verify_path(path + split_sign + filename, split_sign)
+
+def verify_path(xml_path, split_sign):
+ LOG.info("+Verify xml: " + xml_path)
+ try:
+ root_node = ElementTree.parse(xml_path)
+ except Exception as e:
+ LOG.error("xml parse error")
+ return False
+ suite_node = root_node.find('suite')
+ set_nodes = suite_node.findall('set')
+ id_list = []
+ purpose_list = []
+ set_type = ['js', 'wrt', 'ref', 'qunit', 'script', 'pyunit', 'androidunit']
+ for set_node in set_nodes:
+ try:
+ if set_node.attrib['type'] not in set_type:
+ LOG.info("set wrong type: " + set_node.attrib['name'])
+ break
+ except Exception as e:
+ LOG.error("set no type: " + set_node.attrib['name'])
+ return False
+ if set_node.attrib['type'] == 'script':
+ break
+ case_nodes = set_node.findall('testcase')
+ for case_node in case_nodes:
+ verify_path = os.path.dirname(xml_path)
+ casepath = case_node.find('description/test_script_entry').text
+ if casepath is None:
+ break
+ id_list.append(case_node.attrib['id'])
+ purpose_list.append(case_node.attrib['purpose'])
+ arraypath = casepath.split('?')[0].split(split_sign)
+ if len(arraypath) < 3:
+ break
+ if arraypath.count('http:') > 0:
+ del arraypath[0:5]
+ else:
+ del arraypath[0:3]
+ for i in range(len(arraypath)):
+ verify_path += split_sign + arraypath[i]
+
+ if not os.path.exists(verify_path):
+ LOG.info("path no found: " + verify_path)
+ temp_array = []
+ for xid in range(len(id_list)):
+ if id_list.count(id_list[xid]) > 1 and id_list[xid] not in temp_array:
+ LOG.info(str(id_list.count(id_list[xid])) + " same id : " + id_list[xid])
+ temp_array.append(id_list[xid])
+ del temp_array[:]
+ for xpurpose in range(len(purpose_list)):
+ if purpose_list.count(purpose_list[xpurpose]) > 1 and purpose_list[xpurpose] not in temp_array:
+ LOG.info(str(purpose_list.count(purpose_list[xpurpose])) + " same purpose: " + purpose_list[xpurpose])
+ temp_array.append(purpose_list[xpurpose])
+ del temp_array[:]
+ LOG.info("===Verify case path, id and purpose finish===")
+
+def echo_about():
+ """
+ This function will print the user guide and stop toolkit.
+ """
+ about = 'xmlverifier V1.0\n-v <path> | Verify case path, id, purpose and set type are right\n'
+ print about
+ sys.exit()
+
+def main():
+ """
+ main function will call different functions according to the command line argvs followed the toolkit.
+ """
+ global LOG
+ LOG = logging.getLogger("pack-tool")
+ LOG.setLevel(LOG_LEVEL)
+ stream_handler = logging.StreamHandler()
+ stream_handler.setLevel(LOG_LEVEL)
+ stream_formatter = ColorFormatter("[%(asctime)s] %(message)s")
+ stream_handler.setFormatter(stream_formatter)
+ LOG.addHandler(stream_handler)
+
+ sys_name = platform.system()
+ if sys_name == 'Windows':
+ split_sign = '\\'
+ elif sys_name == 'Linux':
+ split_sign = '/'
+ if len(sys.argv) != 3:
+ print 'Error: No enough argv!'
+ echo_about()
+ else:
+ {'-v': lambda : verify_xml(sys.argv[2], split_sign)}[sys.argv[1]]()
+
+if __name__ == '__main__':
+ main()