mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-24 13:21:05 +00:00
Bug 1580832 - Remove robocop test and support files; r=snorp
Removes all the robocop test files and most robocop support. @RobocopTarget annotations and some build configuration is intentionally left untouched at this time, in case there is additional risk involved; a good task for follow-up. Differential Revision: https://phabricator.services.mozilla.com/D45671 --HG-- extra : moz-landing-system : lando
This commit is contained in:
parent
28b566cf8f
commit
bd569c8e85
@ -27,8 +27,6 @@ module.exports = {
|
||||
"components/extensions/**",
|
||||
// Bug 1425034.
|
||||
"modules/WebsiteMetadata.jsm",
|
||||
// Bug 1425051.
|
||||
"tests/browser/robocop/**",
|
||||
],
|
||||
rules: {
|
||||
"no-unused-vars": "off",
|
||||
|
@ -29,8 +29,6 @@ android {
|
||||
manifestPlaceholders = project.ext.manifestPlaceholders
|
||||
|
||||
applicationId mozconfig.substs.ANDROID_PACKAGE_NAME
|
||||
testApplicationId 'org.mozilla.roboexample.test'
|
||||
testInstrumentationRunner 'org.mozilla.gecko.FennecInstrumentationTestRunner'
|
||||
// Used by Robolectric based tests; see TestRunner.
|
||||
buildConfigField 'String', 'BUILD_DIR', "\"${project.buildDir}\"".tr(File.separator, "/")
|
||||
|
||||
@ -80,7 +78,6 @@ android {
|
||||
// shrinkResources true
|
||||
minifyEnabled true
|
||||
proguardFile "${topsrcdir}/mobile/android/config/proguard/proguard.cfg"
|
||||
testProguardFile "${topsrcdir}/mobile/android/config/proguard/proguard-robocop.cfg"
|
||||
}
|
||||
release configureMinifyClosure
|
||||
if (mozconfig.substs.MOZILLA_OFFICIAL) {
|
||||
@ -90,7 +87,6 @@ android {
|
||||
def isDebuggable = (!mozconfig.substs.MOZILLA_OFFICIAL) || (mozconfig.substs.NIGHTLY_BUILD && mozconfig.substs.MOZ_DEBUG)
|
||||
debug {
|
||||
debuggable isDebuggable
|
||||
multiDexKeepProguard file("${topsrcdir}/mobile/android/config/proguard/debug-robocop-keeps.cfg")
|
||||
}
|
||||
release {
|
||||
debuggable isDebuggable
|
||||
@ -189,17 +185,10 @@ android {
|
||||
|
||||
androidTest {
|
||||
java {
|
||||
srcDir "${topsrcdir}/mobile/android/tests/browser/robocop/src"
|
||||
// Bug 1229149 tracks pushing this into a :services Gradle project.
|
||||
srcDir "${topsrcdir}/mobile/android/services/src/androidTest/java"
|
||||
srcDir "${topsrcdir}/mobile/android/tests/browser/junit3/src"
|
||||
}
|
||||
res {
|
||||
srcDir "${topsrcdir}/mobile/android/tests/browser/robocop/res"
|
||||
}
|
||||
assets {
|
||||
srcDir "${topsrcdir}/mobile/android/tests/browser/robocop/assets"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -269,9 +258,6 @@ dependencies {
|
||||
testImplementation 'org.robolectric:robolectric:4.3'
|
||||
testImplementation 'org.simpleframework:simple-http:6.0.1'
|
||||
testImplementation 'org.mockito:mockito-core:1.10.19'
|
||||
|
||||
// Including the Robotium JAR directly can cause issues with dexing.
|
||||
androidTestImplementation 'com.jayway.android.robotium:robotium-solo:5.5.4'
|
||||
}
|
||||
|
||||
// TODO: (bug 1261486): This impl is not robust -
|
||||
|
@ -1,62 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="org.mozilla.roboexample.test"
|
||||
android:sharedUserId="${MOZ_ANDROID_SHARED_ID}"
|
||||
android:versionCode="1"
|
||||
android:versionName="1.0" >
|
||||
|
||||
<uses-sdk android:minSdkVersion="${MOZ_ANDROID_MIN_SDK_VERSION}"
|
||||
android:targetSdkVersion="${ANDROID_TARGET_SDK}"/>
|
||||
<!-- TODO: re-instate maxSdkVersion. -->
|
||||
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||
|
||||
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
|
||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||
|
||||
<instrumentation
|
||||
android:name="org.mozilla.gecko.FennecInstrumentationTestRunner"
|
||||
android:targetPackage="${ANDROID_PACKAGE_NAME}" />
|
||||
|
||||
<application
|
||||
android:label="@string/app_name">
|
||||
|
||||
<uses-library android:name="android.test.runner"
|
||||
android:required="false" />
|
||||
|
||||
<!-- Fake handlers to ensure that we have some share intents to show in our share handler list -->
|
||||
<activity android:name="org.mozilla.gecko.RobocopShare1"
|
||||
android:label="Robocop fake activity">
|
||||
|
||||
<intent-filter android:label="Fake robocop share handler 1">
|
||||
<action android:name="android.intent.action.SEND" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="text/*" />
|
||||
<data android:mimeType="image/*" />
|
||||
</intent-filter>
|
||||
|
||||
</activity>
|
||||
|
||||
<activity android:name="org.mozilla.gecko.RobocopShare2"
|
||||
android:label="Robocop fake activity 2">
|
||||
|
||||
<intent-filter android:label="Fake robocop share handler 2">
|
||||
<action android:name="android.intent.action.SEND" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="text/*" />
|
||||
<data android:mimeType="image/*" />
|
||||
</intent-filter>
|
||||
|
||||
</activity>
|
||||
|
||||
<activity android:name="org.mozilla.gecko.LaunchFennecWithConfigurationActivity"
|
||||
android:label="Robocop Fennec">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
</application>
|
||||
|
||||
</manifest>
|
@ -1,2 +0,0 @@
|
||||
-keep class org.mozilla.gecko.** { *; }
|
||||
-keep class com.robotium.solo.** { *; }
|
@ -1,2 +0,0 @@
|
||||
# Android issue #77785017: Desugar runtime not in Proguard libraryjars for test variants
|
||||
-dontwarn com.google.devtools.build.android.desugar.runtime.**
|
@ -10,13 +10,4 @@ with Files('**'):
|
||||
with Files('chrome/**'):
|
||||
BUG_COMPONENT = ('Firefox for Android', 'Testing')
|
||||
|
||||
# Ideally split this up, but testing catches many files
|
||||
with Files('robocop/**'):
|
||||
BUG_COMPONENT = ('Firefox for Android', 'Testing')
|
||||
|
||||
MOCHITEST_CHROME_MANIFESTS += ['chrome/chrome.ini']
|
||||
|
||||
TEST_DIRS += [
|
||||
'robocop/roboextender',
|
||||
'robocop',
|
||||
]
|
||||
|
@ -1,68 +0,0 @@
|
||||
#filter substitution
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="org.mozilla.roboexample.test"
|
||||
#ifdef MOZ_ANDROID_SHARED_ID
|
||||
android:sharedUserId="@MOZ_ANDROID_SHARED_ID@"
|
||||
#endif
|
||||
android:versionCode="1"
|
||||
android:versionName="1.0" >
|
||||
|
||||
<uses-sdk android:minSdkVersion="@MOZ_ANDROID_MIN_SDK_VERSION@"
|
||||
#ifdef MOZ_ANDROID_MAX_SDK_VERSION
|
||||
android:maxSdkVersion="@MOZ_ANDROID_MAX_SDK_VERSION@"
|
||||
#endif
|
||||
android:targetSdkVersion="@ANDROID_TARGET_SDK@"/>
|
||||
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||
|
||||
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
|
||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||
|
||||
<instrumentation
|
||||
android:name="org.mozilla.gecko.FennecInstrumentationTestRunner"
|
||||
android:targetPackage="@ANDROID_PACKAGE_NAME@" />
|
||||
|
||||
<application
|
||||
android:label="@string/app_name"
|
||||
android:debuggable="true">
|
||||
|
||||
<uses-library android:name="android.test.runner"
|
||||
android:required="false" />
|
||||
|
||||
<!-- Fake handlers to ensure that we have some share intents to show in our share handler list -->
|
||||
<activity android:name="org.mozilla.gecko.RobocopShare1"
|
||||
android:label="Robocop fake activity">
|
||||
|
||||
<intent-filter android:label="Fake robocop share handler 1">
|
||||
<action android:name="android.intent.action.SEND" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="text/*" />
|
||||
<data android:mimeType="image/*" />
|
||||
</intent-filter>
|
||||
|
||||
</activity>
|
||||
|
||||
<activity android:name="org.mozilla.gecko.RobocopShare2"
|
||||
android:label="Robocop fake activity 2">
|
||||
|
||||
<intent-filter android:label="Fake robocop share handler 2">
|
||||
<action android:name="android.intent.action.SEND" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="text/*" />
|
||||
<data android:mimeType="image/*" />
|
||||
</intent-filter>
|
||||
|
||||
</activity>
|
||||
|
||||
<activity android:name="org.mozilla.gecko.LaunchFennecWithConfigurationActivity"
|
||||
android:label="Robocop Fennec">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
</application>
|
||||
|
||||
</manifest>
|
Binary file not shown.
Before Width: | Height: | Size: 9.5 KiB |
@ -1,12 +0,0 @@
|
||||
Robocop is a Mozilla project which uses Robotium to test Firefox on Android devices.
|
||||
|
||||
Robotium is an open source tool licensed under the Apache 2.0 license and the original
|
||||
source can be found here:
|
||||
https://github.com/RobotiumTech/robotium
|
||||
|
||||
We are including robotium-solo-5.5.4.jar as a binary and are not modifying it in any way
|
||||
from the original download found at:
|
||||
https://github.com/RobotiumTech/robotium/wiki/Downloads
|
||||
|
||||
Firefox for Android developers should read the documentation in
|
||||
mobile/android/tests/browser/robocop/README.rst.
|
@ -1,61 +0,0 @@
|
||||
Robocop Mochitest
|
||||
=================
|
||||
|
||||
*Robocop Mochitest* is a Mozilla project which uses Robotium to test
|
||||
Firefox on Android devices.
|
||||
|
||||
*Robocop Mochitest* tests run on Native Android builds marked with an
|
||||
'rc' on treeherder. These are Java based tests which run from the mochitest
|
||||
harness and generate similar log files. These are designed for
|
||||
testing the native UI of Android devices by sending events to the
|
||||
front end.
|
||||
|
||||
See the documentation at
|
||||
https://wiki.mozilla.org/Auto-tools/Projects/Robocop/WritingTests for
|
||||
details.
|
||||
|
||||
Development cycle
|
||||
-----------------
|
||||
|
||||
To deploy the robocop APK to your device and start the robocop test
|
||||
suite, use::
|
||||
|
||||
mach robocop
|
||||
|
||||
To run a specific test case, such as ``testLoad``::
|
||||
|
||||
mach robocop testLoad
|
||||
|
||||
The Java files in ``mobile/android/tests/browser/robocop`` are dependencies of the
|
||||
robocop APK built by ``build/mobile/robocop``. If you modify Java files
|
||||
in ``mobile/android/tests/browser/robocop``, you need to rebuild the robocop APK
|
||||
with::
|
||||
|
||||
mach build build/mobile/robocop
|
||||
|
||||
Changes to ``.html``, ``.css``, ``.sjs``, and ``.js`` files in
|
||||
``mobile/android/tests/browser/robocop`` do not require rebuilding the robocop
|
||||
APK -- these changes are always 'live', since they are served by the
|
||||
mochitest HTTP server and downloaded each test run by your device.
|
||||
|
||||
``mach package`` does build and sign a robocop APK, but ``mach
|
||||
robocop`` does not use it. (This signed APK is used to test
|
||||
signed releases on the buildbots).
|
||||
|
||||
As always, changes to ``mobile/android/base``, ``mobile/android/chrome``,
|
||||
``mobile/android/modules``, etc., require::
|
||||
|
||||
mach build mobile/android/base && mach package && mach install
|
||||
|
||||
as usual.
|
||||
|
||||
Licensing
|
||||
---------
|
||||
|
||||
Robotium is an open source tool licensed under the Apache 2.0 license and the original
|
||||
source can be found here:
|
||||
https://github.com/RobotiumTech/robotium
|
||||
|
||||
We are including robotium-solo-5.5.4.jar as a binary and are not modifying it in any way
|
||||
from the original download found at:
|
||||
https://github.com/RobotiumTech/robotium/wiki/Downloads
|
@ -1,22 +0,0 @@
|
||||
{
|
||||
"manifest_version": 2,
|
||||
|
||||
"name": "Theme test",
|
||||
"version": "1.0",
|
||||
|
||||
"applications": {
|
||||
"gecko": {
|
||||
"id": "theme-image@tests.mozilla.org"
|
||||
}
|
||||
},
|
||||
|
||||
"theme": {
|
||||
"images": {
|
||||
"theme_frame": "testImage.png"
|
||||
},
|
||||
"colors": {
|
||||
"frame": "#000000",
|
||||
"tab_background_text": "#ffffff"
|
||||
}
|
||||
}
|
||||
}
|
Binary file not shown.
Before Width: | Height: | Size: 188 B |
@ -1,4 +0,0 @@
|
||||
You can place test assets in this file.
|
||||
They can be read as raw InputStreams with the getAsset() method in OldBaseTest.
|
||||
|
||||
(This file is a placeholder to ensure that the assets/ directory exists, as it is referenced in the robocop Makefile.)
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Before Width: | Height: | Size: 40 KiB |
Binary file not shown.
Before Width: | Height: | Size: 17 KiB |
Binary file not shown.
Before Width: | Height: | Size: 25 KiB |
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,444 +0,0 @@
|
||||
04-24 15:00:54.643 I/System.out( 5517): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=398.44662, y[0]=528.4731, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25865746, downTime=25865746, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:54.675 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=400.44385, y[0]=527.4739, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25865774, downTime=25865746, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:54.683 I/System.out( 5517): MotionEvent { action=ACTION_UP, id[0]=0, x[0]=400.44385, y[0]=527.4739, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25865782, downTime=25865746, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:54.784 I/System.out( 5517): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=396.44937, y[0]=471.51758, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25865889, downTime=25865889, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:54.831 I/System.out( 5517): MotionEvent { action=ACTION_UP, id[0]=0, x[0]=396.44937, y[0]=471.51758, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25865936, downTime=25865889, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:56.026 I/System.out( 5517): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=460.36063, y[0]=166.75565, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25867126, downTime=25867126, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:56.073 I/System.out( 5517): MotionEvent { action=ACTION_UP, id[0]=0, x[0]=460.36063, y[0]=166.75565, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25867173, downTime=25867126, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:56.190 I/System.out( 5517): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=451.3731, y[0]=205.72522, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25867289, downTime=25867289, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:56.245 I/System.out( 5517): MotionEvent { action=ACTION_UP, id[0]=0, x[0]=451.3731, y[0]=205.72522, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25867346, downTime=25867289, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:57.253 I/System.out( 5517): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=406.43552, y[0]=447.53632, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25868355, downTime=25868355, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:57.261 I/System.out( 5517): MotionEvent { action=ACTION_POINTER_DOWN(1), id[0]=0, x[0]=406.43552, y[0]=447.53632, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=325.54785, y[1]=612.4075, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=0, eventTime=25868364, downTime=25868355, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:57.284 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=407.43414, y[0]=446.5371, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=325.54785, y[1]=612.4075, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=0, eventTime=25868374, downTime=25868355, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:57.300 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=407.43414, y[0]=446.5371, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=323.55063, y[1]=614.40594, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=0, eventTime=25868393, downTime=25868355, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:57.323 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=409.43137, y[0]=439.54254, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=317.55896, y[1]=622.39966, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25868413, downTime=25868355, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:57.339 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=412.4272, y[0]=430.54956, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=305.5756, y[1]=636.38873, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25868432, downTime=25868355, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:57.362 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=415.42303, y[0]=419.55817, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=291.595, y[1]=652.3763, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25868451, downTime=25868355, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:57.378 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=419.41748, y[0]=407.5675, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=276.6158, y[1]=667.36456, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25868471, downTime=25868355, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:57.393 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=423.41193, y[0]=393.57843, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=265.63107, y[1]=682.35284, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25868490, downTime=25868355, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:57.417 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=432.39944, y[0]=373.59406, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=252.64911, y[1]=697.3411, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25868509, downTime=25868355, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:57.433 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=442.3856, y[0]=354.6089, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=241.66437, y[1]=712.3294, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25868529, downTime=25868355, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:57.448 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=455.36755, y[0]=331.62686, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=234.67407, y[1]=722.3216, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25868548, downTime=25868355, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:57.472 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=467.35092, y[0]=310.64325, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=227.68378, y[1]=732.31384, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25868567, downTime=25868355, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:57.487 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=482.3301, y[0]=289.65964, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=220.69348, y[1]=741.30676, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25868586, downTime=25868355, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:57.511 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=496.3107, y[0]=265.67838, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=213.7032, y[1]=750.29974, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25868606, downTime=25868355, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:57.526 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=509.29266, y[0]=243.69556, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=206.7129, y[1]=758.2935, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25868625, downTime=25868355, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:57.542 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=521.276, y[0]=221.71274, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=201.71983, y[1]=765.288, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25868644, downTime=25868355, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:57.565 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=533.2594, y[0]=204.72598, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=197.72539, y[1]=772.2826, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25868664, downTime=25868355, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:57.581 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=541.2483, y[0]=192.73535, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=193.73093, y[1]=778.2779, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25868684, downTime=25868355, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:57.604 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=545.24274, y[0]=186.74005, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=191.7337, y[1]=781.2756, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=0, eventTime=25868693, downTime=25868355, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:57.620 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=551.23444, y[0]=177.74707, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=187.73926, y[1]=787.2709, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25868713, downTime=25868355, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:57.643 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=555.2289, y[0]=171.75177, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=185.74203, y[1]=789.26935, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25868732, downTime=25868355, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:57.659 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=557.2261, y[0]=167.75488, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=183.7448, y[1]=792.26697, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25868752, downTime=25868355, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:57.683 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=558.2247, y[0]=165.75644, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=181.74757, y[1]=795.26465, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=0, eventTime=25868761, downTime=25868355, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:57.698 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=560.2219, y[0]=163.758, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=179.75035, y[1]=797.26306, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=0, eventTime=25868781, downTime=25868355, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:57.714 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=560.2219, y[0]=163.758, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=178.75174, y[1]=799.26154, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=0, eventTime=25868800, downTime=25868355, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:57.737 I/System.out( 5517): MotionEvent { action=ACTION_POINTER_UP(0), id[0]=0, x[0]=560.2219, y[0]=163.758, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=178.75174, y[1]=799.26154, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=0, eventTime=25868828, downTime=25868355, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:57.745 I/System.out( 5517): MotionEvent { action=ACTION_UP, id[0]=1, x[0]=178.75174, y[0]=799.26154, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25868835, downTime=25868355, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:58.362 I/System.out( 5517): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=454.36893, y[0]=663.3677, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25869459, downTime=25869459, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:58.378 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=452.3717, y[0]=650.3778, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25869469, downTime=25869459, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:58.393 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=447.37866, y[0]=588.4262, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25869488, downTime=25869459, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:58.417 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=445.38144, y[0]=498.49646, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25869507, downTime=25869459, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:58.433 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=449.3759, y[0]=381.58783, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25869526, downTime=25869459, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:58.456 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=466.3523, y[0]=241.69711, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25869545, downTime=25869459, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:58.472 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=497.3093, y[0]=82.82123, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25869564, downTime=25869459, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:58.472 I/System.out( 5517): MotionEvent { action=ACTION_UP, id[0]=0, x[0]=497.3093, y[0]=82.82123, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25869573, downTime=25869459, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:59.800 I/System.out( 5517): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=453.37033, y[0]=646.3809, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25870898, downTime=25870898, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:59.815 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=451.3731, y[0]=614.40594, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25870907, downTime=25870898, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:59.831 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=454.36893, y[0]=506.49023, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25870926, downTime=25870898, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:59.854 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=473.3426, y[0]=344.6167, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25870946, downTime=25870898, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:59.870 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=509.29266, y[0]=151.76736, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25870964, downTime=25870898, deviceId=6, source=0x1002 }
|
||||
04-24 15:00:59.870 I/System.out( 5517): MotionEvent { action=ACTION_UP, id[0]=0, x[0]=509.29266, y[0]=151.76736, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25870973, downTime=25870898, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:00.690 I/System.out( 5517): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=262.63522, y[0]=677.35675, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25871790, downTime=25871790, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:00.706 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=272.62137, y[0]=671.36145, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25871799, downTime=25871790, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:00.729 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=323.55063, y[0]=647.3802, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25871819, downTime=25871790, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:00.745 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=391.45633, y[0]=626.39655, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25871838, downTime=25871790, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:00.768 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=460.36063, y[0]=615.40515, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25871857, downTime=25871790, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:00.784 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=530.26355, y[0]=605.41296, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25871876, downTime=25871790, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:00.800 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=591.17896, y[0]=601.4161, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25871895, downTime=25871790, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:00.823 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=650.0971, y[0]=598.4184, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25871914, downTime=25871790, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:00.839 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=678.0583, y[0]=597.4192, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25871933, downTime=25871790, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:00.862 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=688.0444, y[0]=595.4208, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25871943, downTime=25871790, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:00.862 I/System.out( 5517): MotionEvent { action=ACTION_UP, id[0]=0, x[0]=688.0444, y[0]=595.4208, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25871952, downTime=25871790, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:01.198 I/System.out( 5517): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=551.23444, y[0]=146.77127, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25872298, downTime=25872298, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:01.214 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=549.2372, y[0]=150.76816, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25872317, downTime=25872298, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:01.237 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=546.24133, y[0]=162.75879, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25872327, downTime=25872298, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:01.253 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=538.25244, y[0]=222.71194, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25872346, downTime=25872298, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:01.276 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=536.2552, y[0]=333.6253, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25872365, downTime=25872298, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:01.292 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=543.2455, y[0]=484.5074, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25872384, downTime=25872298, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:01.308 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=557.2261, y[0]=640.3856, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25872403, downTime=25872298, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:01.331 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=572.20526, y[0]=788.2701, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25872423, downTime=25872298, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:01.347 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=584.18866, y[0]=851.22095, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25872432, downTime=25872298, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:01.347 I/System.out( 5517): MotionEvent { action=ACTION_UP, id[0]=0, x[0]=584.18866, y[0]=851.22095, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25872441, downTime=25872298, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:02.151 I/System.out( 5517): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=556.2275, y[0]=204.72598, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25873238, downTime=25873238, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:02.159 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=552.23303, y[0]=225.7096, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25873248, downTime=25873238, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:02.175 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=544.24414, y[0]=316.63855, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25873267, downTime=25873238, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:02.198 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=548.2386, y[0]=437.54413, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25873286, downTime=25873238, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:02.214 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=555.2289, y[0]=558.44965, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25873305, downTime=25873238, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:02.229 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=562.2192, y[0]=659.3708, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25873324, downTime=25873238, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:02.253 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=570.20807, y[0]=738.30914, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25873345, downTime=25873238, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:02.268 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=583.19, y[0]=798.26227, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25873363, downTime=25873238, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:02.276 I/System.out( 5517): MotionEvent { action=ACTION_UP, id[0]=0, x[0]=583.19, y[0]=798.26227, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25873372, downTime=25873238, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:02.706 I/System.out( 5517): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=656.0888, y[0]=237.70023, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25873804, downTime=25873804, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:02.722 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=654.09155, y[0]=236.70102, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25873823, downTime=25873804, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:02.745 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=650.0971, y[0]=237.70023, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25873842, downTime=25873804, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:02.761 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=640.11096, y[0]=242.69632, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25873852, downTime=25873804, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:02.776 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=613.14844, y[0]=261.6815, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25873871, downTime=25873804, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:02.800 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=578.19696, y[0]=293.65652, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25873890, downTime=25873804, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:02.815 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=540.2497, y[0]=332.62607, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25873910, downTime=25873804, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:02.839 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=494.31348, y[0]=381.58783, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25873929, downTime=25873804, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:02.854 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=433.39807, y[0]=446.5371, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25873948, downTime=25873804, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:02.870 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=367.4896, y[0]=522.4777, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25873968, downTime=25873804, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:02.893 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=302.57974, y[0]=604.41376, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25873986, downTime=25873804, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:02.933 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=244.6602, y[0]=679.35516, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25874006, downTime=25873804, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:02.933 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=200.72122, y[0]=735.31146, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25874025, downTime=25873804, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:02.948 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=165.76978, y[0]=783.274, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25874044, downTime=25873804, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:02.972 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=137.80861, y[0]=813.2506, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25874063, downTime=25873804, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:02.987 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=117.83634, y[0]=838.2311, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25874082, downTime=25873804, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:03.011 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=104.85437, y[0]=853.21936, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25874101, downTime=25873804, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:03.026 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=97.86408, y[0]=862.21234, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25874121, downTime=25873804, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:03.042 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=93.86963, y[0]=867.20844, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25874140, downTime=25873804, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:03.065 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=92.87102, y[0]=869.20685, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25874149, downTime=25873804, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:03.081 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=91.8724, y[0]=871.2053, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25874169, downTime=25873804, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:03.104 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=90.87379, y[0]=873.20374, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25874188, downTime=25873804, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:03.112 I/System.out( 5517): MotionEvent { action=ACTION_UP, id[0]=0, x[0]=90.87379, y[0]=873.20374, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25874215, downTime=25873804, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:03.448 I/System.out( 5517): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=632.1221, y[0]=63.83606, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25874552, downTime=25874552, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:03.472 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=629.1262, y[0]=64.83528, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25874572, downTime=25874552, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:03.487 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=622.1359, y[0]=70.8306, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25874581, downTime=25874552, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:03.511 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=601.16504, y[0]=103.80484, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25874600, downTime=25874552, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:03.526 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=569.2095, y[0]=163.758, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25874619, downTime=25874552, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:03.542 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=528.2663, y[0]=241.69711, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25874639, downTime=25874552, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:03.565 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=491.31763, y[0]=315.63934, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25874658, downTime=25874552, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:03.581 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=447.37866, y[0]=382.58704, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25874677, downTime=25874552, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:03.604 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=394.45215, y[0]=458.5277, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25874696, downTime=25874552, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:03.620 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=344.5215, y[0]=525.4754, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25874716, downTime=25874552, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:03.643 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=299.58392, y[0]=582.4309, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25874735, downTime=25874552, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:03.659 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=267.6283, y[0]=632.3919, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25874754, downTime=25874552, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:03.675 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=244.6602, y[0]=675.35834, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25874773, downTime=25874552, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:03.698 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=224.68794, y[0]=711.3302, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25874792, downTime=25874552, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:03.722 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=210.70735, y[0]=743.30524, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25874811, downTime=25874552, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:03.737 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=194.72955, y[0]=771.2834, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25874831, downTime=25874552, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:03.753 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=180.74896, y[0]=799.26154, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25874850, downTime=25874552, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:03.776 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=166.76839, y[0]=829.2381, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25874869, downTime=25874552, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:03.792 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=153.7864, y[0]=852.22015, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25874888, downTime=25874552, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:03.808 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=150.79057, y[0]=860.21387, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25874897, downTime=25874552, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:03.815 I/System.out( 5517): MotionEvent { action=ACTION_UP, id[0]=0, x[0]=150.79057, y[0]=860.21387, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25874906, downTime=25874552, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:04.183 I/System.out( 5517): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=615.1456, y[0]=187.73926, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25875281, downTime=25875281, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:04.198 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=606.15814, y[0]=198.73068, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25875291, downTime=25875281, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:04.214 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=570.20807, y[0]=249.69086, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25875310, downTime=25875281, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:04.237 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=517.28156, y[0]=324.63232, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25875329, downTime=25875281, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:04.253 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=455.36755, y[0]=415.56128, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25875348, downTime=25875281, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:04.276 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=394.45215, y[0]=510.48712, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25875367, downTime=25875281, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:04.292 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=325.54785, y[0]=599.41766, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25875387, downTime=25875281, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:04.308 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=267.6283, y[0]=676.35754, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25875406, downTime=25875281, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:04.331 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=217.69765, y[0]=745.30365, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25875425, downTime=25875281, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:04.347 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=174.75728, y[0]=807.25525, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25875444, downTime=25875281, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:04.370 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=148.79335, y[0]=860.21387, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25875463, downTime=25875281, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:04.370 I/System.out( 5517): MotionEvent { action=ACTION_UP, id[0]=0, x[0]=148.79335, y[0]=860.21387, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25875472, downTime=25875281, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:04.940 I/System.out( 5517): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=219.69487, y[0]=771.2834, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25876039, downTime=25876039, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:04.956 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=221.6921, y[0]=767.2865, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25876058, downTime=25876039, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:04.979 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=224.68794, y[0]=762.2904, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25876068, downTime=25876039, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:04.995 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=240.66574, y[0]=740.30756, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25876087, downTime=25876039, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.011 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=268.62692, y[0]=702.3372, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25876106, downTime=25876039, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.034 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=309.57004, y[0]=653.3755, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25876125, downTime=25876039, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.050 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=351.5118, y[0]=605.41296, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25876144, downTime=25876039, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.073 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=395.45078, y[0]=559.44885, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25876164, downTime=25876039, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.089 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=432.39944, y[0]=522.4777, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25876183, downTime=25876039, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.112 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=463.35645, y[0]=495.49884, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25876202, downTime=25876039, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.128 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=488.32178, y[0]=474.5152, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25876221, downTime=25876039, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.143 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=504.2996, y[0]=459.52692, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25876241, downTime=25876039, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.167 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=513.2871, y[0]=453.53162, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25876260, downTime=25876039, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.183 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=518.28015, y[0]=449.53473, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25876279, downTime=25876039, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.198 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=520.2774, y[0]=448.53552, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25876289, downTime=25876039, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.222 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=522.27466, y[0]=446.5371, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25876308, downTime=25876039, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.237 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=524.27185, y[0]=445.53784, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25876327, downTime=25876039, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.315 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=526.2691, y[0]=445.53784, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25876413, downTime=25876039, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.331 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=529.2649, y[0]=447.53632, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25876432, downTime=25876039, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.347 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=533.2594, y[0]=450.53394, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25876442, downTime=25876039, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.370 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=547.2399, y[0]=461.5254, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25876461, downTime=25876039, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.386 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=570.20807, y[0]=479.5113, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25876480, downTime=25876039, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.409 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=599.16785, y[0]=499.49573, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25876499, downTime=25876039, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.425 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=642.1082, y[0]=520.4793, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25876518, downTime=25876039, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.440 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=674.06384, y[0]=534.4684, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25876537, downTime=25876039, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.464 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=694.0361, y[0]=544.4606, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25876556, downTime=25876039, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.479 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=706.0194, y[0]=551.45514, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25876575, downTime=25876039, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.495 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=710.01385, y[0]=554.45276, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25876585, downTime=25876039, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.495 I/System.out( 5517): MotionEvent { action=ACTION_UP, id[0]=0, x[0]=710.01385, y[0]=554.45276, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25876594, downTime=25876039, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.839 I/System.out( 5517): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=248.65465, y[0]=765.288, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25876941, downTime=25876941, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.862 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=249.65326, y[0]=761.2912, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25876950, downTime=25876941, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.878 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=264.63245, y[0]=730.31537, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25876969, downTime=25876941, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.893 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=301.58115, y[0]=665.3661, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25876988, downTime=25876941, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.917 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=352.5104, y[0]=582.4309, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25877008, downTime=25876941, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.933 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=411.4286, y[0]=483.50818, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25877027, downTime=25876941, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.948 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=481.33148, y[0]=363.60187, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25877046, downTime=25876941, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.972 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=547.2399, y[0]=241.69711, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25877065, downTime=25876941, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.987 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=604.1609, y[0]=149.76892, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25877084, downTime=25876941, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:05.995 I/System.out( 5517): MotionEvent { action=ACTION_UP, id[0]=0, x[0]=604.1609, y[0]=149.76892, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25877093, downTime=25876941, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:06.745 I/System.out( 5517): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=592.17755, y[0]=115.79547, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25877844, downTime=25877844, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:06.761 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=589.1817, y[0]=116.79468, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25877864, downTime=25877844, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:06.776 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=585.18726, y[0]=120.791565, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25877874, downTime=25877844, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:06.776 I/System.out( 5517): MotionEvent { action=ACTION_POINTER_DOWN(1), id[0]=0, x[0]=585.18726, y[0]=120.791565, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=350.51318, y[1]=860.21387, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=0, eventTime=25877874, downTime=25877844, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:06.792 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=580.1942, y[0]=127.7861, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=354.50763, y[1]=850.2217, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=0, eventTime=25877883, downTime=25877844, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:06.808 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=573.2039, y[0]=151.76736, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=373.4813, y[1]=810.2529, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25877903, downTime=25877844, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:06.831 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=565.21497, y[0]=190.73694, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=396.44937, y[1]=771.2834, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25877921, downTime=25877844, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:06.847 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=558.2247, y[0]=227.70804, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=414.4244, y[1]=740.30756, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25877940, downTime=25877844, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:06.870 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=550.2358, y[0]=262.68073, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=427.4064, y[1]=714.3279, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25877959, downTime=25877844, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:06.886 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=541.2483, y[0]=307.6456, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=437.39252, y[1]=691.3458, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25877978, downTime=25877844, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:06.909 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=532.26074, y[0]=366.59955, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=450.37448, y[1]=664.3669, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25877997, downTime=25877844, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:06.925 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=523.27325, y[0]=420.55737, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=460.36063, y[1]=644.3825, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25878017, downTime=25877844, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:06.948 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=520.2774, y[0]=447.53632, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=465.3537, y[1]=635.3895, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25878036, downTime=25877844, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:06.964 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=516.28296, y[0]=461.5254, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=468.34952, y[1]=630.39343, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25878055, downTime=25877844, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:06.979 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=513.2871, y[0]=468.5199, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=468.34952, y[1]=628.395, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25878074, downTime=25877844, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:07.003 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=511.2899, y[0]=470.51837, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=468.34952, y[1]=625.39734, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=0, eventTime=25878083, downTime=25877844, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:07.003 I/System.out( 5517): MotionEvent { action=ACTION_POINTER_UP(0), id[0]=0, x[0]=511.2899, y[0]=470.51837, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=468.34952, y[1]=623.3989, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=0, eventTime=25878092, downTime=25877844, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:07.011 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=1, x[0]=469.34814, y[0]=621.40045, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25878101, downTime=25877844, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:07.011 I/System.out( 5517): MotionEvent { action=ACTION_UP, id[0]=1, x[0]=469.34814, y[0]=621.40045, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25878110, downTime=25877844, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:07.667 I/System.out( 5517): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=175.7559, y[0]=484.5074, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25878767, downTime=25878767, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:07.683 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=188.73787, y[0]=484.5074, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25878783, downTime=25878767, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:07.706 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=224.68794, y[0]=485.50665, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25878802, downTime=25878767, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:07.722 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=278.61304, y[0]=486.50586, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25878821, downTime=25878767, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:07.745 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=336.5326, y[0]=487.50507, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25878840, downTime=25878767, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:07.761 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=391.45633, y[0]=486.50586, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25878859, downTime=25878767, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:07.776 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=439.38974, y[0]=484.5074, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25878879, downTime=25878767, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:07.800 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=478.33566, y[0]=484.5074, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25878898, downTime=25878767, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:07.815 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=495.31207, y[0]=485.50665, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25878907, downTime=25878767, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:07.839 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=538.25244, y[0]=486.50586, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=2, eventTime=25878936, downTime=25878767, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:07.854 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=559.2233, y[0]=489.50354, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25878955, downTime=25878767, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:07.878 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=571.20667, y[0]=491.50195, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25878974, downTime=25878767, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:07.893 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=580.1942, y[0]=494.49963, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25878993, downTime=25878767, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:07.909 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=582.1914, y[0]=494.49963, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25879002, downTime=25878767, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:07.917 I/System.out( 5517): MotionEvent { action=ACTION_UP, id[0]=0, x[0]=582.1914, y[0]=494.49963, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25879013, downTime=25878767, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:08.136 I/System.out( 5517): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=534.258, y[0]=201.72833, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25879233, downTime=25879233, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:08.151 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=531.26215, y[0]=210.72131, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25879243, downTime=25879233, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:08.167 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=520.2774, y[0]=254.68695, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25879262, downTime=25879233, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:08.190 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=509.29266, y[0]=318.637, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25879281, downTime=25879233, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:08.206 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=500.30515, y[0]=399.5738, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25879300, downTime=25879233, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:08.229 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=493.31485, y[0]=485.50665, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25879320, downTime=25879233, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:08.245 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=488.32178, y[0]=568.44183, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25879339, downTime=25879233, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:08.268 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=484.32733, y[0]=650.3778, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25879358, downTime=25879233, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:08.284 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=484.32733, y[0]=723.32086, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25879377, downTime=25879233, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:08.300 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=488.32178, y[0]=756.2951, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25879387, downTime=25879233, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:08.308 I/System.out( 5517): MotionEvent { action=ACTION_UP, id[0]=0, x[0]=488.32178, y[0]=756.2951, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25879396, downTime=25879233, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:09.104 I/System.out( 5517): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=147.79474, y[0]=671.36145, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25880205, downTime=25880205, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:09.128 I/System.out( 5517): MotionEvent { action=ACTION_UP, id[0]=0, x[0]=147.79474, y[0]=671.36145, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25880231, downTime=25880205, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:09.245 I/System.out( 5517): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=163.77254, y[0]=667.36456, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25880346, downTime=25880346, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:09.292 I/System.out( 5517): MotionEvent { action=ACTION_UP, id[0]=0, x[0]=163.77254, y[0]=667.36456, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25880393, downTime=25880346, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:09.722 I/System.out( 5517): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=453.37033, y[0]=804.2576, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25880826, downTime=25880826, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:09.745 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=452.3717, y[0]=796.26385, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25880835, downTime=25880826, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:09.761 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=447.37866, y[0]=749.30054, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25880855, downTime=25880826, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:09.784 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=443.3842, y[0]=670.36224, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25880874, downTime=25880826, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:09.800 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=443.3842, y[0]=577.4348, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25880893, downTime=25880826, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:09.815 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=445.38144, y[0]=470.51837, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25880912, downTime=25880826, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:09.839 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=453.37033, y[0]=357.60657, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25880931, downTime=25880826, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:09.854 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=467.35092, y[0]=235.70178, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25880951, downTime=25880826, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:09.878 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=490.319, y[0]=99.80797, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25880970, downTime=25880826, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:09.893 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=500.30515, y[0]=46.849335, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25880979, downTime=25880826, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:09.893 I/System.out( 5517): MotionEvent { action=ACTION_UP, id[0]=0, x[0]=500.30515, y[0]=46.849335, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25880989, downTime=25880826, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:11.026 I/System.out( 5517): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=562.2192, y[0]=813.2506, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25882131, downTime=25882131, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:11.050 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=562.2192, y[0]=801.25995, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25882140, downTime=25882131, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:11.065 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=568.2108, y[0]=728.31696, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25882159, downTime=25882131, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:11.089 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=580.1942, y[0]=627.3958, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25882178, downTime=25882131, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:11.104 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=593.17615, y[0]=516.4824, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25882198, downTime=25882131, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:11.120 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=600.16644, y[0]=398.57452, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25882217, downTime=25882131, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:11.143 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=608.15533, y[0]=263.67993, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25882236, downTime=25882131, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:11.143 I/System.out( 5517): MotionEvent { action=ACTION_UP, id[0]=0, x[0]=608.15533, y[0]=263.67993, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25882245, downTime=25882131, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:11.956 I/System.out( 5517): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=544.24414, y[0]=599.41766, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25883053, downTime=25883053, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:11.972 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=480.3329, y[0]=615.40515, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25883071, downTime=25883053, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:11.987 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=392.45493, y[0]=650.3778, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25883090, downTime=25883053, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:12.011 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=296.58807, y[0]=703.3364, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25883109, downTime=25883053, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:12.026 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=227.68378, y[0]=767.2865, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25883128, downTime=25883053, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:12.034 I/System.out( 5517): MotionEvent { action=ACTION_UP, id[0]=0, x[0]=227.68378, y[0]=767.2865, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25883137, downTime=25883053, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:12.597 I/System.out( 5517): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=519.2788, y[0]=114.796265, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25883695, downTime=25883695, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:12.612 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=516.28296, y[0]=120.791565, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25883704, downTime=25883695, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:12.636 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=505.29822, y[0]=150.76816, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25883724, downTime=25883695, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:12.651 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=486.32455, y[0]=212.71976, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25883743, downTime=25883695, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:12.667 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=471.34537, y[0]=308.6448, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25883762, downTime=25883695, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:12.690 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=464.35507, y[0]=424.55426, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25883781, downTime=25883695, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:12.706 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=467.35092, y[0]=567.4426, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25883800, downTime=25883695, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:12.729 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=481.33148, y[0]=731.3146, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25883819, downTime=25883695, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:12.729 I/System.out( 5517): MotionEvent { action=ACTION_UP, id[0]=0, x[0]=481.33148, y[0]=731.3146, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25883828, downTime=25883695, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:13.956 I/System.out( 5517): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=472.34396, y[0]=407.5675, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25885059, downTime=25885059, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:13.972 I/System.out( 5517): MotionEvent { action=ACTION_POINTER_DOWN(1), id[0]=0, x[0]=472.34396, y[0]=407.5675, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=363.49515, y[1]=698.34033, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=0, eventTime=25885059, downTime=25885059, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:13.979 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=472.34396, y[0]=405.5691, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=354.50763, y[1]=708.3326, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25885078, downTime=25885059, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:13.995 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=472.34396, y[0]=402.5714, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=334.53537, y[1]=734.31226, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25885097, downTime=25885059, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.018 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=472.34396, y[0]=400.573, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=322.55203, y[1]=749.30054, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=0, eventTime=25885107, downTime=25885059, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.034 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=472.34396, y[0]=395.5769, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=301.58115, y[1]=779.2771, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25885126, downTime=25885059, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.050 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=476.33844, y[0]=383.58624, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=285.60333, y[1]=804.2576, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25885146, downTime=25885059, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.073 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=482.3301, y[0]=367.59875, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=272.62137, y[1]=823.2428, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25885165, downTime=25885059, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.089 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=490.319, y[0]=351.61124, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=262.63522, y[1]=837.2319, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25885185, downTime=25885059, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.112 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=500.30515, y[0]=334.6245, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=253.64772, y[1]=849.2225, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25885204, downTime=25885059, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.128 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=510.29126, y[0]=317.6378, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=247.65604, y[1]=858.21545, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25885223, downTime=25885059, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.143 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=519.2788, y[0]=304.64792, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=243.66159, y[1]=866.2092, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25885243, downTime=25885059, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.167 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=526.2691, y[0]=294.65573, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=240.66574, y[1]=871.2053, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25885262, downTime=25885059, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.183 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=531.26215, y[0]=286.662, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=237.6699, y[1]=876.2014, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25885281, downTime=25885059, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.206 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=533.2594, y[0]=283.66434, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=235.67268, y[1]=878.1998, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25885300, downTime=25885059, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.222 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=536.2552, y[0]=278.6682, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=233.67546, y[1]=880.19824, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25885320, downTime=25885059, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.245 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=536.2552, y[0]=276.6698, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=232.67685, y[1]=882.1968, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=0, eventTime=25885339, downTime=25885059, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.261 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=536.2552, y[0]=276.6698, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=232.67685, y[1]=884.1952, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=0, eventTime=25885358, downTime=25885059, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.276 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=536.2552, y[0]=276.6698, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=232.67685, y[1]=886.1936, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=0, eventTime=25885377, downTime=25885059, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.300 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=536.2552, y[0]=274.67136, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=232.67685, y[1]=888.192, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=0, eventTime=25885397, downTime=25885059, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.308 I/System.out( 5517): MotionEvent { action=ACTION_POINTER_UP(0), id[0]=0, x[0]=536.2552, y[0]=274.67136, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=232.67685, y[1]=888.192, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=0, eventTime=25885406, downTime=25885059, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.323 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=1, x[0]=232.67685, y[0]=890.1904, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25885413, downTime=25885059, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.323 I/System.out( 5517): MotionEvent { action=ACTION_UP, id[0]=1, x[0]=232.67685, y[0]=890.1904, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25885421, downTime=25885059, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.511 I/System.out( 5517): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=145.7975, y[0]=924.16394, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25885609, downTime=25885609, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.518 I/System.out( 5517): MotionEvent { action=ACTION_POINTER_DOWN(1), id[0]=0, x[0]=145.7975, y[0]=924.16394, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=562.2192, y[1]=95.81108, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=0, eventTime=25885619, downTime=25885609, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.534 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=145.7975, y[0]=924.16394, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=559.2233, y[1]=99.80797, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=0, eventTime=25885629, downTime=25885609, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.558 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=145.7975, y[0]=924.16394, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=544.24414, y[1]=126.786896, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25885649, downTime=25885609, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.573 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=155.78363, y[0]=916.17017, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=519.2788, y[1]=176.74786, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25885669, downTime=25885609, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.597 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=178.75174, y[0]=894.1874, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=491.31763, y[1]=231.70493, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25885688, downTime=25885609, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.612 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=217.69765, y[0]=860.21387, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=465.3537, y[1]=288.66043, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25885707, downTime=25885609, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.628 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=255.64494, y[0]=825.2412, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=444.3828, y[1]=343.6175, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25885726, downTime=25885609, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.651 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=295.58948, y[0]=789.26935, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=427.4064, y[1]=402.5714, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25885745, downTime=25885609, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.667 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=333.53677, y[0]=755.29584, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=417.42026, y[1]=457.5285, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25885764, downTime=25885609, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.706 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=364.49377, y[0]=733.31305, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=413.4258, y[1]=507.48944, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=1, eventTime=25885783, downTime=25885609, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.706 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=373.4813, y[0]=726.3185, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=412.4272, y[1]=519.4801, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=0, eventTime=25885792, downTime=25885609, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.722 I/System.out( 5517): MotionEvent { action=ACTION_POINTER_UP(1), id[0]=0, x[0]=385.46463, y[0]=696.3419, toolType[0]=TOOL_TYPE_FINGER, id[1]=1, x[1]=412.4272, y[1]=519.4801, toolType[1]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=2, historySize=0, eventTime=25885801, downTime=25885609, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.745 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=387.46185, y[0]=695.3427, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25885810, downTime=25885609, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:14.753 I/System.out( 5517): MotionEvent { action=ACTION_UP, id[0]=0, x[0]=387.46185, y[0]=695.3427, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25885819, downTime=25885609, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:15.081 I/System.out( 5517): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=304.577, y[0]=508.4887, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25886184, downTime=25886184, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:15.104 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=308.57144, y[0]=509.4879, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25886194, downTime=25886184, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:15.120 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=330.54092, y[0]=518.4809, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25886213, downTime=25886184, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:15.143 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=367.4896, y[0]=532.47, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25886232, downTime=25886184, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:15.159 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=418.41888, y[0]=548.45746, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25886251, downTime=25886184, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:15.175 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=468.34952, y[0]=561.4473, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25886271, downTime=25886184, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:15.198 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=516.28296, y[0]=575.4364, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25886290, downTime=25886184, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:15.214 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=557.2261, y[0]=587.427, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25886309, downTime=25886184, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:15.237 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=589.1817, y[0]=593.4223, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25886328, downTime=25886184, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:15.237 I/System.out( 5517): MotionEvent { action=ACTION_UP, id[0]=0, x[0]=589.1817, y[0]=593.4223, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25886337, downTime=25886184, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:15.472 I/System.out( 5517): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=428.405, y[0]=394.5777, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25886568, downTime=25886568, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:15.487 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=424.41055, y[0]=415.56128, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25886587, downTime=25886568, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:15.503 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=420.4161, y[0]=434.54645, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25886597, downTime=25886568, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:15.526 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=412.4272, y[0]=491.50195, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25886616, downTime=25886568, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:15.542 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=408.43274, y[0]=555.45197, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25886635, downTime=25886568, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:15.565 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=405.4369, y[0]=618.40283, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25886654, downTime=25886568, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:15.581 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=403.43967, y[0]=678.35596, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25886674, downTime=25886568, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:15.597 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=403.43967, y[0]=722.3216, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25886693, downTime=25886568, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:15.620 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=407.43414, y[0]=765.288, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25886712, downTime=25886568, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:15.636 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=415.42303, y[0]=805.25684, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25886731, downTime=25886568, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:15.636 I/System.out( 5517): MotionEvent { action=ACTION_UP, id[0]=0, x[0]=415.42303, y[0]=805.25684, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25886740, downTime=25886568, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.042 I/System.out( 5517): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=635.1179, y[0]=388.58234, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25887144, downTime=25887144, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.058 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=633.12067, y[0]=387.58313, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25887153, downTime=25887144, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.081 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=629.1262, y[0]=386.58392, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25887173, downTime=25887144, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.097 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=617.1429, y[0]=387.58313, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25887192, downTime=25887144, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.120 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=587.1845, y[0]=394.5777, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25887211, downTime=25887144, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.136 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=550.2358, y[0]=409.56598, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25887230, downTime=25887144, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.159 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=508.29404, y[0]=430.54956, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25887249, downTime=25887144, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.175 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=465.3537, y[0]=451.5332, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25887269, downTime=25887144, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.190 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=421.4147, y[0]=472.51678, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25887288, downTime=25887144, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.214 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=376.4771, y[0]=493.50037, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25887307, downTime=25887144, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.229 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=331.53955, y[0]=516.4824, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25887326, downTime=25887144, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.253 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=294.59085, y[0]=536.4668, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25887345, downTime=25887144, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.268 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=267.6283, y[0]=551.45514, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25887364, downTime=25887144, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.292 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=247.65604, y[0]=562.44653, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25887384, downTime=25887144, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.308 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=235.67268, y[0]=568.44183, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25887403, downTime=25887144, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.323 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=230.67961, y[0]=572.4387, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25887423, downTime=25887144, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.347 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=229.681, y[0]=574.43713, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25887432, downTime=25887144, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.347 I/System.out( 5517): MotionEvent { action=ACTION_UP, id[0]=0, x[0]=229.681, y[0]=574.43713, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25887440, downTime=25887144, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.659 I/System.out( 5517): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=400.44385, y[0]=803.25836, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25887758, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.675 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=396.44937, y[0]=802.25916, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25887767, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.698 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=375.47852, y[0]=789.26935, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25887787, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.714 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=347.51733, y[0]=767.2865, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25887806, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.729 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=313.5645, y[0]=730.31537, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25887825, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.753 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=281.6089, y[0]=686.34973, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25887844, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.768 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=256.64355, y[0]=643.3833, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25887863, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.792 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=237.6699, y[0]=607.4114, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25887883, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.808 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=226.68517, y[0]=566.4434, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25887902, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.823 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=227.68378, y[0]=518.4809, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25887921, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.847 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=248.65465, y[0]=455.53003, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25887941, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.862 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=286.60196, y[0]=392.57922, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25887960, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.886 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=334.53537, y[0]=338.6214, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25887979, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.901 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=381.47018, y[0]=302.6495, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25887998, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.917 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=425.40915, y[0]=279.66745, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888017, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.940 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=465.3537, y[0]=270.67447, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888036, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.956 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=500.30515, y[0]=270.67447, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888055, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.979 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=530.26355, y[0]=280.66666, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888075, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:16.995 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=553.2316, y[0]=300.65106, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888094, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.018 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=562.2192, y[0]=332.62607, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888113, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.034 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=557.2261, y[0]=377.59094, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888132, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.058 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=540.2497, y[0]=431.54877, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888151, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.073 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=513.2871, y[0]=490.50275, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888170, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.089 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=485.32596, y[0]=542.46216, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888190, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.112 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=454.36893, y[0]=587.427, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888209, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.128 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=424.41055, y[0]=617.40356, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888228, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.151 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=393.45355, y[0]=639.3864, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888247, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.167 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=368.48822, y[0]=644.3825, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888266, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.183 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=339.52844, y[0]=635.3895, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888286, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.206 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=308.57144, y[0]=607.4114, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888305, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.222 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=286.60196, y[0]=564.44495, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888324, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.245 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=278.61304, y[0]=510.48712, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888343, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.261 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=277.61444, y[0]=457.5285, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888362, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.284 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=279.61166, y[0]=433.54724, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25888372, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.300 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=286.60196, y[0]=389.5816, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888391, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.315 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=300.58252, y[0]=352.61047, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888410, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.339 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=319.55618, y[0]=327.62997, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888430, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.339 I/System.out( 5517): MotionEvent { action=ACTION_UP, id[0]=0, x[0]=319.55618, y[0]=327.62997, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25888439, downTime=25887758, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.597 I/System.out( 5517): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=351.5118, y[0]=866.2092, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25888698, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.620 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=341.52567, y[0]=859.21466, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25888708, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.636 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=312.5659, y[0]=831.2365, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888727, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.659 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=278.61304, y[0]=797.26306, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888747, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.675 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=245.65881, y[0]=761.2912, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888766, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.690 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=217.69765, y[0]=722.3216, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888785, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.714 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=194.72955, y[0]=675.35834, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888805, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.729 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=178.75174, y[0]=617.40356, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888823, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.753 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=171.76144, y[0]=550.4559, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888842, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.768 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=173.75867, y[0]=488.50427, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888862, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.784 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=188.73787, y[0]=422.5558, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888880, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.808 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=210.70735, y[0]=364.6011, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888900, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.823 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=245.65881, y[0]=314.64014, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888919, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.847 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=287.60056, y[0]=277.669, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888938, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.862 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=326.54648, y[0]=251.6893, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888957, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.878 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=368.48822, y[0]=240.6979, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888976, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.901 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=410.42996, y[0]=238.69946, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25888996, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.917 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=456.36618, y[0]=248.69165, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889015, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.933 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=497.3093, y[0]=275.67056, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889034, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.956 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=528.2663, y[0]=320.63544, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889053, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.972 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=546.24133, y[0]=374.59326, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889072, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:17.995 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=546.24133, y[0]=436.54486, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889092, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.011 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=530.26355, y[0]=504.49182, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889111, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.034 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=498.30792, y[0]=576.4356, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889130, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.050 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=454.36893, y[0]=633.3911, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889149, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.065 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=411.4286, y[0]=671.36145, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889168, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.089 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=364.49377, y[0]=695.3427, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889187, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.104 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=325.54785, y[0]=701.338, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889207, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.128 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=288.59918, y[0]=693.34424, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889227, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.143 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=256.64355, y[0]=669.363, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889245, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.167 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=236.6713, y[0]=622.39966, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889264, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.183 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=233.67546, y[0]=561.4473, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889283, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.198 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=237.6699, y[0]=526.4746, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25889293, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.222 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=256.64355, y[0]=454.53082, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889312, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.237 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=280.61026, y[0]=395.5769, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889332, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.261 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=306.57422, y[0]=354.6089, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889351, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.276 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=335.534, y[0]=323.6331, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889370, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.300 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=366.491, y[0]=306.64636, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889389, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.315 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=401.44244, y[0]=301.65027, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889408, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.339 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=439.38974, y[0]=312.6417, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889428, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.354 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=473.3426, y[0]=343.6175, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889447, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.370 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=493.31485, y[0]=382.58704, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889466, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.393 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=496.3107, y[0]=425.55347, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889485, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.409 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=480.3329, y[0]=478.5121, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889504, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.433 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=445.38144, y[0]=528.4731, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889524, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.448 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=398.44662, y[0]=566.4434, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889543, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.464 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=344.5215, y[0]=595.4208, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889562, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.487 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=295.58948, y[0]=611.40826, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889581, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.503 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=251.6505, y[0]=617.40356, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889600, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.526 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=213.7032, y[0]=614.40594, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889619, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.542 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=178.75174, y[0]=596.42, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889639, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.558 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=155.78363, y[0]=570.4403, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889658, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.581 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=143.80028, y[0]=533.4692, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889677, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.597 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=144.79889, y[0]=489.50354, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889696, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.620 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=155.78363, y[0]=438.54333, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889715, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.636 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=168.76561, y[0]=395.5769, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889735, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.651 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=184.74342, y[0]=358.60577, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25889754, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.675 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=192.73232, y[0]=336.62296, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25889763, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:18.675 I/System.out( 5517): MotionEvent { action=ACTION_UP, id[0]=0, x[0]=192.73232, y[0]=336.62296, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25889772, downTime=25888698, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:19.081 I/System.out( 5517): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=485.32596, y[0]=768.2857, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25890185, downTime=25890185, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:19.104 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=483.32874, y[0]=757.2943, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25890195, downTime=25890185, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:19.120 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=477.33704, y[0]=718.32477, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25890214, downTime=25890185, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:19.143 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=470.34674, y[0]=659.3708, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25890233, downTime=25890185, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:19.159 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=466.3523, y[0]=600.4169, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25890252, downTime=25890185, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:19.183 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=464.35507, y[0]=533.4692, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25890272, downTime=25890185, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:19.198 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=464.35507, y[0]=461.5254, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25890291, downTime=25890185, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:19.222 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=465.3537, y[0]=398.57452, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25890310, downTime=25890185, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:19.237 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=466.3523, y[0]=343.6175, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=25890329, downTime=25890185, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:19.253 I/System.out( 5517): MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=464.35507, y[0]=316.63855, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25890339, downTime=25890185, deviceId=6, source=0x1002 }
|
||||
04-24 15:01:19.253 I/System.out( 5517): MotionEvent { action=ACTION_UP, id[0]=0, x[0]=464.35507, y[0]=316.63855, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=25890347, downTime=25890185, deviceId=6, source=0x1002 }
|
Binary file not shown.
Binary file not shown.
@ -1,8 +0,0 @@
|
||||
function handleRequest(request, response)
|
||||
{
|
||||
let page = "<!DOCTYPE html><html><head><script>window.opener = null; location.replace('" + request.queryString + "')</script></head><body><p>Redirecting...</p></body></html>";
|
||||
|
||||
response.setStatusLine("1.0", 200, "OK");
|
||||
response.setHeader("Content-Type", "text/html; charset=utf-8", false);
|
||||
response.write(page);
|
||||
}
|
Binary file not shown.
@ -1,8 +0,0 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<head id="linkparent">
|
||||
<title>Autodiscovery Test</title>
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
@ -1,55 +0,0 @@
|
||||
# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
|
||||
# vim: set filetype=python:
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
for var in ('ANDROID_PACKAGE_NAME',
|
||||
'ANDROID_TARGET_SDK'):
|
||||
DEFINES[var] = CONFIG[var]
|
||||
|
||||
for var in ('MOZ_ANDROID_MIN_SDK_VERSION',
|
||||
'MOZ_ANDROID_MAX_SDK_VERSION'):
|
||||
if CONFIG[var]:
|
||||
DEFINES[var] = CONFIG[var]
|
||||
|
||||
TEST_HARNESS_FILES.testing.mochitest += [
|
||||
'robocop.ini',
|
||||
]
|
||||
TEST_HARNESS_FILES.testing.mochitest.tests.robocop += [
|
||||
'*.html',
|
||||
'*.jpg',
|
||||
'*.mp4',
|
||||
'*.ogg',
|
||||
'*.sjs',
|
||||
'*.swf',
|
||||
'*.webm',
|
||||
'*.xml',
|
||||
'/mobile/android/tests/browser/chrome/head.js',
|
||||
'addons/**',
|
||||
'reader_mode_pages/**', # The ** preserves directory structure.
|
||||
'robocop*.js',
|
||||
'test*.js',
|
||||
]
|
||||
|
||||
DEFINES['MOZ_ANDROID_SHARED_ID'] = CONFIG['MOZ_ANDROID_SHARED_ID']
|
||||
OBJDIR_PP_FILES.mobile.android.tests.browser.robocop += [
|
||||
'AndroidManifest.xml.in',
|
||||
]
|
||||
|
||||
addons = [
|
||||
'browser_theme_image_file',
|
||||
]
|
||||
|
||||
output_dir = OBJDIR_FILES._tests.testing.mochitest.tests.robocop.addons
|
||||
|
||||
for addon in addons:
|
||||
indir = 'addons/%s' % addon
|
||||
xpi = '%s.xpi' % indir
|
||||
|
||||
GENERATED_FILES += [xpi]
|
||||
GENERATED_FILES[xpi].script = '/toolkit/mozapps/extensions/test/create_xpi.py'
|
||||
GENERATED_FILES[xpi].inputs = [indir]
|
||||
|
||||
output_dir += ['!%s' % xpi]
|
||||
|
Binary file not shown.
@ -1,16 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Article title</title>
|
||||
<meta name="description" content="This is the article description." />
|
||||
</head>
|
||||
<body>
|
||||
<header>Site header</header>
|
||||
<div>
|
||||
<h1>Article title</h1>
|
||||
<h2 class="author">by Jane Doe</h2>
|
||||
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Donec et mollis dolor. Praesent et diam eget libero egestas mattis sit amet vitae augue. Nam tincidunt congue enim, ut porta lorem lacinia consectetur. Donec ut libero sed arcu vehicula ultricies a non tortor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean ut gravida lorem. Ut turpis felis, pulvinar a semper sed, adipiscing id dolor. Pellentesque auctor nisi id magna consequat sagittis. Curabitur dapibus enim sit amet elit pharetra tincidunt feugiat nisl imperdiet. Ut convallis libero in urna ultrices accumsan. Donec sed odio eros. Donec viverra mi quis quam pulvinar at malesuada arcu rhoncus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In rutrum accumsan ultricies. Mauris vitae nisi at sem facilisis semper ac in est.</p>
|
||||
<p>Vivamus fermentum semper porta. Nunc diam velit, adipiscing ut tristique vitae, sagittis vel odio. Maecenas convallis ullamcorper ultricies. Curabitur ornare, ligula semper consectetur sagittis, nisi diam iaculis velit, id fringilla sem nunc vel mi. Nam dictum, odio nec pretium volutpat, arcu ante placerat erat, non tristique elit urna et turpis. Quisque mi metus, ornare sit amet fermentum et, tincidunt et orci. Fusce eget orci a orci congue vestibulum. Ut dolor diam, elementum et vestibulum eu, porttitor vel elit. Curabitur venenatis pulvinar tellus gravida ornare. Sed et erat faucibus nunc euismod ultricies ut id justo. Nullam cursus suscipit nisi, et ultrices justo sodales nec. Fusce venenatis facilisis lectus ac semper. Aliquam at massa ipsum. Quisque bibendum purus convallis nulla ultrices ultricies. Nullam aliquam, mi eu aliquam tincidunt, purus velit laoreet tortor, viverra pretium nisi quam vitae mi. Fusce vel volutpat elit. Nam sagittis nisi dui.</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -1,373 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en-US" dir="ltr" id="developer-mozilla-org" xmlns:fb="http://www.facebook.com/2008/fbml" xmlns:og="http://ogp.me/ns#">
|
||||
<head>
|
||||
<title>Building XULRunner | MDN</title>
|
||||
|
||||
<meta charset="utf-8">
|
||||
<meta name="robots" content="index, follow">
|
||||
<link rel="home" href="https://developer.mozilla.org/en-US/">
|
||||
<link rel="copyright" href="Build_Instructions.html#copyright">
|
||||
<link rel="shortcut icon" href="../../media/img/favicon.ico">
|
||||
|
||||
<!--[if !IE 6]><!-->
|
||||
<link rel="stylesheet" media="screen,projection,tv" href="../../media/css/mdn-min.css%3Fbuild=f424781.css" />
|
||||
<link rel="stylesheet" media="screen,projection,tv" href="../../media/css/wiki-min.css%3Fbuild=f424781.css" />
|
||||
<!--<![endif]-->
|
||||
<!--[if IE]><link rel="stylesheet" type="text/css" media="all" href="//developer.mozilla.org/media/css/mdn-ie.css"><![endif]-->
|
||||
<!--[if lte IE 7]><link rel="stylesheet" type="text/css" media="all" href="//developer.mozilla.org/media/css/mdn-ie7.css"><![endif]-->
|
||||
<!--[if lte IE 6]><link rel="stylesheet" type="text/css" media="all" href="//developer.mozilla.org/media/css/mdn-ie6.css"><![endif]-->
|
||||
<link rel="stylesheet" type="text/css" media="print" href="../../media/css/mdn-print.css">
|
||||
<link rel="stylesheet" href="../../../www.mozilla.org/tabzilla/media/css/tabzilla.css">
|
||||
|
||||
<link rel="stylesheet" media="print" href="../../media/css/wiki-print-min.css%3Fbuild=f424781.css" />
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="../../en-US/docs/Template:CustomCSS%3Fraw=1.css" />
|
||||
|
||||
<!--[if IE]>
|
||||
<meta http-equiv="imagetoolbar" content="no">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
|
||||
<script src="//developer.mozilla.org/media/js/html5.js"></script>
|
||||
<![endif]-->
|
||||
|
||||
<link rel="alternate" type="application/json" href="https://developer.mozilla.org/en-US/docs/XULRunner/Build_Instructions$json" />
|
||||
<link rel="canonical" href="Build_Instructions.html" />
|
||||
|
||||
<meta property="og:title" content="Building XULRunner"/>
|
||||
<meta property="og:type" content="website"/>
|
||||
<meta property="og:image" content="https://developer.mozilla.org/media/img/mdn-logo-sm.png"/>
|
||||
<meta property="og:site_name" content="Mozilla Developer Network"/>
|
||||
|
||||
<meta property="og:description" content="XULRunner is built using basically the same process as Firefox or other applications. Please read and follow the general Build Documentation for instructions on how to get sources and set up build prerequisites."/>
|
||||
<meta name="description" content="XULRunner is built using basically the same process as Firefox or other applications. Please read and follow the general Build Documentation for instructions on how to get sources and set up build prerequisites." />
|
||||
</head>
|
||||
|
||||
<body id="" class="html-ltr document" role="document">
|
||||
<!--[if lte IE 8]>
|
||||
<noscript><div class="global-notice">
|
||||
<p><strong>Warning:</strong> The Mozilla Developer Network website employs emerging web standards that may not be fully supported in some versions of MicroSoft Internet Explorer. You can improve your experience of this website by enabling JavaScript.</p>
|
||||
</div></noscript>
|
||||
<![endif]-->
|
||||
<header id="masthead" class="minor">
|
||||
<div class="wrap">
|
||||
<ul id="nav-access">
|
||||
<li><a href="Build_Instructions.html#language">Select language</a></li>
|
||||
<li><a href="Build_Instructions.html#q">Skip to search</a></li>
|
||||
<li><a href="Build_Instructions.html#content">Skip to main content</a></li>
|
||||
</ul>
|
||||
|
||||
<div id="branding">
|
||||
<div id="logo"><a href="https://developer.mozilla.org/en-US/"><img src="../../media/img/mdn-logo-sm.png" alt="Mozilla Developer Network" title="Mozilla Developer Network" width="62" height="71"> Mozilla Developer Network</a></div>
|
||||
</div>
|
||||
|
||||
|
||||
<nav id="nav">
|
||||
<ul id="nav-main" role="menubar">
|
||||
<li id="nav-main-topics" class="menu" role="menuitem"><a href="Build_Instructions.html#nav-sub-topics" class="toggle" aria-haspopup="true" aria-labelledby="nav-main-topics" title="Explore other parts of MDN">Topics</a>
|
||||
<ul id="nav-sub-topics" class="sub-menu" aria-hidden="true">
|
||||
<li id="nav-sub-web"><a href="https://developer.mozilla.org/en-US/web">Web</a></li>
|
||||
<li id="nav-sub-apps"><a href="https://developer.mozilla.org/en-US/apps">Apps</a></li>
|
||||
<li id="nav-sub-mobile"><a href="https://developer.mozilla.org/en-US/mobile">Mobile</a></li>
|
||||
<li id="nav-sub-addons"><a href="https://developer.mozilla.org/en-US/addons">Add-ons</a></li>
|
||||
<li id="nav-sub-mozilla"><a href="https://developer.mozilla.org/en-US/mozilla">Mozilla</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li id="nav-main-docs" class="menu" role="menuitem">
|
||||
<a href="https://developer.mozilla.org/en-US/docs" class="docs toggle" aria-haspopup="true" aria-labelledby="nav-main-docs">Docs</a>
|
||||
<div id="nav-sub-docs" class="sub-menu" aria-hidden="true">
|
||||
<ul>
|
||||
<li>
|
||||
<ul>
|
||||
<li><a href="https://developer.mozilla.org/en-US/docs/HTML">HTML</a></li>
|
||||
<li><a href="https://developer.mozilla.org/en-US/docs/DOM">DOM</a></li>
|
||||
<li><a href="https://developer.mozilla.org/en-US/docs/Using_HTML5_audio_and_video_in_Firefox">Video</a></li>
|
||||
<li><a href="https://developer.mozilla.org/en-US/docs/Using_HTML5_audio_and_video_in_Firefox">Audio</a></li>
|
||||
<li><a href="https://developer.mozilla.org/en-US/docs/SVG">SVG</a></li>
|
||||
<li><a href="https://developer.mozilla.org/en-US/docs/WebGL">WebGL</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<ul>
|
||||
<li><a href="https://developer.mozilla.org/en-US/docs/HTML/HTML5">HTML5</a></li>
|
||||
<li><a href="https://developer.mozilla.org/en-US/docs/WebSockets">WebSockets</a></li>
|
||||
<li><a href="https://developer.mozilla.org/en-US/docs/HTML/Using_the_application_cache">Offline Cache</a></li>
|
||||
<li><a href="https://developer.mozilla.org/en-US/docs/DOM/Storage">Local Storage</a></li>
|
||||
<li><a href="https://developer.mozilla.org/en-US/docs/IndexedDB">IndexedDB</a></li>
|
||||
<li><a href="https://developer.mozilla.org/en-US/docs/Using_files_from_web_applications">File API</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<ul>
|
||||
<li><a href="https://developer.mozilla.org/en-US/docs/CSS">CSS</a></li>
|
||||
<li><a href="https://developer.mozilla.org/en-US/docs/CSS/Using_CSS_gradients">Gradients</a></li>
|
||||
<li><a href="https://developer.mozilla.org/en-US/docs/CSS/Using_CSS_transforms">Transforms</a></li>
|
||||
<li><a href="https://developer.mozilla.org/en-US/docs/CSS/Using_CSS_transitions">Transitions</a></li>
|
||||
<li><a href="https://developer.mozilla.org/en-US/docs/CSS/Using_CSS_animations">Animations</a></li>
|
||||
<li><a href="https://developer.mozilla.org/en-US/docs/CSS/Media_queries">Media Queries</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<ul>
|
||||
<li><a href="https://developer.mozilla.org/en-US/docs/JavaScript">JavaScript</a></li>
|
||||
<li><a href="https://developer.mozilla.org/en-US/docs/AJAX">AJAX</a></li>
|
||||
<li><a href="https://developer.mozilla.org/en-US/docs/HTML/Canvas">Canvas</a></li>
|
||||
<li><a href="https://developer.mozilla.org/en-US/docs/Using_geolocation">Geolocation</a></li>
|
||||
<li><a href="https://developer.mozilla.org/en-US/docs/DragDrop/Drag_and_Drop">Drag & Drop</a></li>
|
||||
<li><a href="https://developer.mozilla.org/en-US/docs/DOM/Using_web_workers">Web Workers</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<p><a href="https://developer.mozilla.org/en-US/docs">More docs…</a></p>
|
||||
</div>
|
||||
</li>
|
||||
<li id="nav-main-demos" role="menuitem"><a href="https://developer.mozilla.org/en-US/demos/" class="demos">Demos</a></li>
|
||||
<li id="nav-main-learning" role="menuitem"><a href="https://developer.mozilla.org/en-US/learn" class="learning">Learning</a></li>
|
||||
<li id="nav-main-community" class="menu" role="menuitem"><a href="Build_Instructions.html#nav-sub-community" class="community toggle" aria-haspopup="true" aria-labelledby="nav-main-community">Community</a>
|
||||
<ul id="nav-sub-community" class="sub-menu">
|
||||
<li><a href="https://developer.mozilla.org/en-US/events">Events</a></li>
|
||||
<li><a href="https://developer.mozilla.org/en-US/discussions">Discussions</a></li>
|
||||
<li><a href="https://developer.mozilla.org/en-US/promote">Promote</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<ul class="user-state signed-out">
|
||||
<li class="user-signin menu">
|
||||
<form class="browserid" action="https://developer.mozilla.org/en-US/users/browserid_verify" method="POST"><div style='display:none;'><input type='hidden' id='csrfmiddlewaretoken' name='csrfmiddlewaretoken' value='c92fde167c4768ad483a05412bede68c' /></div>
|
||||
<input id="next" name="next" type="hidden" value="/en-US/docs/XULRunner/Build_Instructions"/>
|
||||
<input required="required" type="hidden" name="assertion" id="id_assertion" />
|
||||
<a href="Build_Instructions.html#" target="_blank" class="browserid-signin toggle" aria-haspopup="true" title="Sign in with Persona">Sign in</a>
|
||||
<div class="browserid-info sub-menu" aria-hidden="true">
|
||||
<h3>What's this?</h3> <p>MDN has switched to <a href="https://persona.org/" target="_blank" rel="external">Persona</a>, a safe and simple way to sign in with just your e-mail address. <a href="http://identity.mozilla.com/post/12950196039/deploying-browserid-at-mozilla" rel="external">Learn more about why Mozilla is using Persona</a>.</p> <p><strong>Returning members:</strong> sign in with Persona and you'll be connected to your MDN profile (all your information is still here).</p> <p><strong>New members:</strong> sign in with Persona first, then you'll be able to set up your new MDN profile.</p> <p><a href="Build_Instructions.html#" target="_blank" class="browserid-signin" title="Sign in with Persona">Sign in</a></p>
|
||||
</div>
|
||||
</form>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<form id="site-search" method="get" action="http://www.google.com/search"
|
||||
data-url="/en-US/search">
|
||||
<p>
|
||||
<input type="text" role="search" placeholder="Search MDN" id="q" name="q" value="">
|
||||
<noscript><button type="submit">Search</button></noscript>
|
||||
</p>
|
||||
<input type="hidden" name="sitesearch" value="developer.mozilla.org">
|
||||
<div id="site-search-gg"></div>
|
||||
</form>
|
||||
|
||||
<a href="http://www.mozilla.org/" id="tabzilla">mozilla</a>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
|
||||
|
||||
<!-- top toolbar -->
|
||||
<section id="nav-toolbar"><div><div class="wrap">
|
||||
<!-- right floated navigation -->
|
||||
<nav id="tool-menus" role="navigation">
|
||||
<ul id="tools">
|
||||
<li class="menu">
|
||||
<a href="Build_Instructions.html#page-tools" class="toggle">This page</a>
|
||||
<ul id="page-tools" class="sub-menu">
|
||||
<li class="page-print"> <a href="Build_Instructions.html#" onclick="return window.print();" title="Print page">Print page</a></li>
|
||||
<li><a href="https://developer.mozilla.org/en-US/docs/new?parent=15078">New sub-page</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="menu">
|
||||
<a href="Build_Instructions.html#" class="toggle">Languages</a>
|
||||
<ul id="translations">
|
||||
<li><a rel="internal" href="https://developer.mozilla.org/ja/docs/XULRunner/Build_Instructions" title="Building XULRunner">日本語</a></li>
|
||||
|
||||
<li><a href="https://developer.mozilla.org/en-US/docs/XULRunner/Build_Instructions$locales">Add translation</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<!-- left crumb navigation -->
|
||||
<nav class="crumbs" role="navigation">
|
||||
<ol>
|
||||
<li class="crumb"><a href="https://developer.mozilla.org/en-US/docs/en">MDN</a></li>
|
||||
<li class="crumb"><a href="https://developer.mozilla.org/en-US/docs/XULRunner">XULRunner</a></li>
|
||||
<li class="crumb">Building XULRunner</li>
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
</div></div></section>
|
||||
|
||||
|
||||
|
||||
<section id="content">
|
||||
<div class="wrap">
|
||||
<div id="content-main" class="full">
|
||||
<article class="article" role="main"
|
||||
data-current-revision="129041"
|
||||
data-refresh-message="Your changes were merged. However, something else has been edited, so this page will be refreshed to reflect the changes."
|
||||
data-cancel-edit-message="Abort editing in progress? Your unsaved changes will be discarded.">
|
||||
<header id="article-head">
|
||||
<div class="title">
|
||||
<h1 class="page-title">Building XULRunner</h1>
|
||||
</div>
|
||||
<ul id="page-buttons">
|
||||
<li class="page-history"><a href="https://developer.mozilla.org/en-US/docs/XULRunner/Build_Instructions$history">History</a></li>
|
||||
<li class="page-edit"><a href="https://developer.mozilla.org/en-US/docs/XULRunner/Build_Instructions$edit">Edit</a></li>
|
||||
</ul>
|
||||
|
||||
|
||||
</header>
|
||||
|
||||
|
||||
|
||||
|
||||
<div id="wikiArticle" class="page-content boxed">
|
||||
<div id="article-nav">
|
||||
<div class="page-toc">
|
||||
<h2>Table of Contents</h2>
|
||||
<ol>
|
||||
<code></code><li><ol><li><a href="Build_Instructions.html#CVS_tags_and_XULRunner_versions" rel="internal">CVS tags and XULRunner versions</a><li><a href="Build_Instructions.html#Fetching_Sources_from_Mercurial" rel="internal">Fetching Sources from Mercurial</a></ol></li>
|
||||
</ol>
|
||||
</div>
|
||||
<ul class="page-anchors">
|
||||
<li class="anchor-tags">
|
||||
<a href="Build_Instructions.html#page-tags">Tags</a>
|
||||
</li>
|
||||
<li class="anchor-files">
|
||||
<span title="This document has no attachments">Files</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<p> </p>
|
||||
<p><a href="https://developer.mozilla.org/en/XULRunner" title="en/XULRunner">XULRunner</a> is built using basically the same process as Firefox or other applications. Please read and follow the general <a href="https://developer.mozilla.org/En/Developer_Guide/Build_Instructions" title="En/Developer_Guide/Build_Instructions">Build Documentation</a> for instructions on how to get sources and set up build prerequisites.</p>
|
||||
<p>By default, XULRunner is built with <a href="https://developer.mozilla.org/en/JavaXPCOM" title="en/JavaXPCOM">JavaXPCOM</a> support; the build system must be able to find an appropriate JDK on the system; see the instructions on <a href="https://developer.mozilla.org/En/Developer_Guide/Build_Instructions/Building_JavaXPCOM" title="En/Developer_Guide/Build_Instructions/Building_JavaXPCOM">Building JavaXPCOM</a> for more details. If you do not want to build JavaXPCOM support, specify <code>--disable-javaxpcom</code> in your configuration.</p>
|
||||
<p>On Mac, XULRunner requires Mac OS X 10.3 or higher and XCode 1.5 or higher to build properly. The runtime requirement is Mac OS X 10.2.</p>
|
||||
<p>A basic minimal <a href="https://developer.mozilla.org/en/Configuring_Build_Options#Using_a_.mozconfig_Configuration_File" title="en/Configuring_Build_Options#Using_a_.mozconfig_Configuration_File">mozconfig</a> which will build a release configuration of XULRunner is:</p>
|
||||
<pre class="eval">mk_add_options MOZ_CO_PROJECT=xulrunner
|
||||
mk_add_options MOZ_OBJDIR=@topsrcdir@/obj-xulrunner
|
||||
|
||||
ac_add_options --enable-application=xulrunner
|
||||
#Uncomment the following line if you don't want to build JavaXPCOM:
|
||||
#ac_add_options --disable-javaxpcom
|
||||
</pre>
|
||||
<h3 id="CVS_tags_and_XULRunner_versions">CVS tags and XULRunner versions</h3>
|
||||
<p>Older XULRunner releases where tagged in CVS with (for instance XULRUNNER_1_8_0_5_RELEASE ) up to version 1.8.0.5</p>
|
||||
<p>The CVS repository does not have specific tags for XULRunner anymore. Instead a XULRunner build is a just special build made from the Firefox/Mozilla tree, using the same tag as a Firefox build. There is a convention where a certain XULRunner version maps to a certain tag in the CVS.</p>
|
||||
<p>For instance XULRunner 1.8.1.3, the corresponding tag is CVS is : FIREFOX_2_0_0_3_RELEASE</p>
|
||||
<p>To find out how those Firefox tags and XULRunner version maps, check out the file mozilla/config/milestone.txt .</p>
|
||||
<p>You can also check the User Agent string in Firefox Help/About menu to get the mapping from a certain binary Firefox version to the corresponding XULRunner version. For instance, in Firefox 2.0.0.9 you will get :</p>
|
||||
<pre class="eval">Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9
|
||||
</pre>
|
||||
<p>Therefore the XULRunner version for this Firefox version is : 1.8.1.9</p>
|
||||
<h3 id="Fetching_Sources_from_Mercurial">Fetching Sources from Mercurial</h3>
|
||||
<p>As with all other Mozilla products, one would fetch recent sources from Mercurial. For example, to build XULRunner with the top of the tree:</p>
|
||||
<pre>hg clone https://hg.mozilla.org/mozilla-central/ src
|
||||
cd src
|
||||
echo ". \$topsrcdir/xulrunner/config/mozconfig" > .mozconfig
|
||||
make -f client.mk build
|
||||
</pre>
|
||||
<p><span>Interwiki Language Links</span></p>
|
||||
<p></p>
|
||||
</div>
|
||||
<section class="page-meta">
|
||||
|
||||
<section id="page-tags">
|
||||
<h2>Tags (4)</h2>
|
||||
<div id="deki-page-tags">
|
||||
<ul class="tags tagit ui-widget ui-widget-content">
|
||||
<li class="tagit-choice ui-widget-content ui-state-default">
|
||||
<a class="text tagit-label" href="https://developer.mozilla.org/en-US/docs/tag/Developing%20Mozilla">Developing Mozilla</a>
|
||||
</li>
|
||||
<li class="tagit-choice ui-widget-content ui-state-default">
|
||||
<a class="text tagit-label" href="https://developer.mozilla.org/en-US/docs/tag/XUL">XUL</a>
|
||||
</li>
|
||||
<li class="tagit-choice ui-widget-content ui-state-default">
|
||||
<a class="text tagit-label" href="https://developer.mozilla.org/en-US/docs/tag/XULRunner">XULRunner</a>
|
||||
</li>
|
||||
<li class="tagit-choice ui-widget-content ui-state-default">
|
||||
<a class="text tagit-label" href="https://developer.mozilla.org/en-US/docs/tag/Build%20documentation">Build documentation</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
<section id="doc-contributors">
|
||||
Contributors to this page: <a href="https://developer.mozilla.org/en-US/profiles/Kray2">Kray2</a>, <a href="https://developer.mozilla.org/en-US/profiles/Taken">Taken</a>, <a href="https://developer.mozilla.org/en-US/profiles/Kozawa">Kozawa</a>, <a href="https://developer.mozilla.org/en-US/profiles/Benjamin%20Smedberg">Benjamin Smedberg</a>, <a href="https://developer.mozilla.org/en-US/profiles/Nickolay">Nickolay</a>, <a href="https://developer.mozilla.org/en-US/profiles/NickolayBot">NickolayBot</a>, <a href="https://developer.mozilla.org/en-US/profiles/Pombredanne">Pombredanne</a>
|
||||
<br />
|
||||
Last updated by:
|
||||
<a href="https://developer.mozilla.org/en-US/profiles/Taken">Taken</a>,
|
||||
<time datetime="2009-10-08T15:16:43-07:00">Oct 8, 2009 3:16:43 PM</time>
|
||||
</section>
|
||||
</section>
|
||||
</article>
|
||||
<form id="wiki-page-edit" class="editing" method="post" action="https://developer.mozilla.org/en-US/docs/XULRunner/Build_Instructions$edit"><div style='display:none;'><input type='hidden' name='csrfmiddlewaretoken' value='c92fde167c4768ad483a05412bede68c' /></div>
|
||||
<input type="hidden" name="form" id="form" value="rev" />
|
||||
<input type="hidden" name="content" id="content" value="" />
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="footbar">
|
||||
<div class="wrap">
|
||||
<p>
|
||||
What do you think of the new MDN? Please <a href="http://mdn.uservoice.com/forums/51389-mdn-website-feedback-http-developer-mozilla-org">share your feedback</a> with us. <a id="dev-mdc-link" href="https://lists.mozilla.org/listinfo/dev-mdc">Join our mailing list</a> to discuss ways to help create great documentation. </p>
|
||||
</div>
|
||||
</section>
|
||||
<footer id="site-info" class="footer" role="contentinfo">
|
||||
<div class="wrap">
|
||||
<div id="legal">
|
||||
<img src="../../media/img/mdn-logo-tiny.png" alt="" width="42" height="48">
|
||||
<p id="copyright">© 2005 - 2012 Mozilla Developer Network and individual contributors</p>
|
||||
<p>
|
||||
Content is available under <a href="https://developer.mozilla.org/en-US/docs/Project:Copyrights">these licenses</a> • <a href="https://developer.mozilla.org/en-US/docs/Project:About">About MDN</a> •
|
||||
<a href="http://www.mozilla.org/en-US/privacy">Privacy Policy</a> •
|
||||
<a href="https://developer.mozilla.org/discussions">Help</a></p>
|
||||
</div>
|
||||
<ul class="user-state signed-out">
|
||||
<li class="user-signin menu">
|
||||
<form class="browserid" action="https://developer.mozilla.org/en-US/users/browserid_verify" method="POST"><div style='display:none;'><input type='hidden' name='csrfmiddlewaretoken' value='c92fde167c4768ad483a05412bede68c' /></div>
|
||||
<input id="next" name="next" type="hidden" value="/en-US/docs/XULRunner/Build_Instructions"/>
|
||||
<input required="required" type="hidden" name="assertion" id="id_assertion" />
|
||||
<a href="Build_Instructions.html#" target="_blank" class="browserid-signin toggle" aria-haspopup="true" title="Sign in with Persona">Sign in</a>
|
||||
<div class="browserid-info sub-menu" aria-hidden="true">
|
||||
<h3>What's this?</h3> <p>MDN has switched to <a href="https://persona.org/" target="_blank" rel="external">Persona</a>, a safe and simple way to sign in with just your e-mail address. <a href="http://identity.mozilla.com/post/12950196039/deploying-browserid-at-mozilla" rel="external">Learn more about why Mozilla is using Persona</a>.</p> <p><strong>Returning members:</strong> sign in with Persona and you'll be connected to your MDN profile (all your information is still here).</p> <p><strong>New members:</strong> sign in with Persona first, then you'll be able to set up your new MDN profile.</p> <p><a href="Build_Instructions.html#" target="_blank" class="browserid-signin" title="Sign in with Persona">Sign in</a></p>
|
||||
</div>
|
||||
</form>
|
||||
</li>
|
||||
</ul>
|
||||
<form class="languages go" method="get" action="https://developer.mozilla.org/en-US/docs">
|
||||
<label for="language">Other languages:</label>
|
||||
<select id="language" class="wiki-l10n" name="next" dir="ltr">
|
||||
<option value="/en-US/docs/XULRunner/Build_Instructions" selected>
|
||||
English (US)
|
||||
</option>
|
||||
<option value="/ja/docs/XULRunner/Build_Instructions">
|
||||
日本語
|
||||
</option> </select>
|
||||
<noscript><button type="submit">Go</button></noscript>
|
||||
</form>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="../../en-US/jsi18n/build:f424781"></script>
|
||||
<script src="../../../www.google.com/jsapi" type="text/javascript"></script>
|
||||
<script src="../../../login.persona.org/include.js" type="text/javascript" async></script>
|
||||
<script src="../../../www.mozilla.org/tabzilla/media/js/tabzilla.js" async></script>
|
||||
<script src="../../media/js/mdn-min.js%3Fbuild=f424781"></script>
|
||||
<script src="../../media/js/wiki-min.js%3Fbuild=f424781"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
// <![CDATA[
|
||||
var _tag = new WebTrends();
|
||||
_tag.dcsGetId();
|
||||
// ]]>>
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
// <![CDATA[
|
||||
_tag.dcsCollect();
|
||||
// ]]>>
|
||||
</script>
|
||||
<noscript>
|
||||
<div><img alt="DCSIMG" id="DCSIMG" width="1" height="1" src="../../../statse.webtrendslive.com/dcs8yrjuavz5bdaun34r2o8bi_8o8x/njs.gif%3Fdcsuri=%252Fnojavascript&WT.js=No&WT.tv=8.6.2"/></div>
|
||||
</noscript>
|
||||
</body>
|
||||
</html>
|
@ -1,43 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en-US" class="no-js">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
|
||||
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no" media="(device-height: 568px)">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
|
||||
|
||||
<!-- Don't index mobile optimized pages -->
|
||||
<meta name="robots" content="noindex" />
|
||||
|
||||
<title>Firefox for Android | Mozilla Support</title>
|
||||
|
||||
<link rel="icon" type="image/png" sizes="512x512" href="//support.cdn.mozilla.net/static/img/firefox-512.png?v=1">
|
||||
<link rel="icon" type="image/png" sizes="256x256" href="//support.cdn.mozilla.net/static/img/firefox-256.png?v=1">
|
||||
<link rel="icon" type="image/png" sizes="128x128" href="//support.cdn.mozilla.net/static/img/firefox-128.png?v=1">
|
||||
<link rel="icon" type="image/png" sizes="64x64" href="//support.cdn.mozilla.net/static/img/firefox-64.png?v=1">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="//support.cdn.mozilla.net/static/img/firefox-32.png?v=1">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="//support.cdn.mozilla.net/static/img/firefox-16.png?v=1">
|
||||
|
||||
|
||||
<link rel="search" type="application/opensearchdescription+xml" title="Mozilla Support" href="/en-US/search/xml"/>
|
||||
|
||||
<link rel="stylesheet" media="screen,projection,tv" href="//support.cdn.mozilla.net/static/css/mobile/common-min.css?build=beb7c1e" />
|
||||
<link rel="stylesheet" media="screen,projection,tv" href="//support.cdn.mozilla.net/static/css/mobile/products-min.css?build=beb7c1e" />
|
||||
|
||||
</head>
|
||||
<body class=""
|
||||
data-readonly="false"
|
||||
data-static-url="//support.cdn.mozilla.net/static/"
|
||||
data-orientation="right"
|
||||
data-ga-push="[]"
|
||||
data-usernames-api="/en-US/users/api/usernames"
|
||||
>
|
||||
|
||||
|
||||
<script src="//support.cdn.mozilla.net/static/jsi18n/en-us/javascript.js?beb7c1e"></script>
|
||||
|
||||
<script src="//support.cdn.mozilla.net/static/js/mobile/common-min.js?build=beb7c1e"></script>
|
||||
|
||||
</body>
|
||||
</html>
|
@ -1,9 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||
|
||||
<resources>
|
||||
<string name="app_name">Roboexample</string>
|
||||
|
||||
</resources>
|
@ -1,163 +0,0 @@
|
||||
[default]
|
||||
subsuite = robocop
|
||||
|
||||
support-files =
|
||||
addons/browser_theme_image_file.xpi
|
||||
|
||||
generated-files =
|
||||
addons/browser_theme_image_file.xpi
|
||||
|
||||
[src/org/mozilla/gecko/tests/testGeckoProfile.java]
|
||||
[src/org/mozilla/gecko/tests/testAboutPage.java]
|
||||
[src/org/mozilla/gecko/tests/testActivityStreamContextMenu.java]
|
||||
[src/org/mozilla/gecko/tests/testAddonManager.java]
|
||||
# disabled on 4.3, bug 1144918
|
||||
skip-if = android_version == "18"
|
||||
[src/org/mozilla/gecko/tests/testAddSearchEngine.java]
|
||||
# disabled on 4.3, bug 1120759
|
||||
skip-if = android_version == "18"
|
||||
[src/org/mozilla/gecko/tests/testANRReporter.java]
|
||||
[src/org/mozilla/gecko/tests/testAssistIntentNewIntent.java]
|
||||
[src/org/mozilla/gecko/tests/testAssistIntentStartup.java]
|
||||
[src/org/mozilla/gecko/tests/testAudioFocus.java]
|
||||
# fails with code coverage, see bug 1475256
|
||||
skip-if = debug
|
||||
[src/org/mozilla/gecko/tests/testMediaControl.java]
|
||||
skip-if = android_version < "23"
|
||||
[src/org/mozilla/gecko/tests/testAxisLocking.java]
|
||||
skip-if = true # Bug 1390059
|
||||
[src/org/mozilla/gecko/tests/testBookmark.java]
|
||||
disabled=see bug 915350
|
||||
[src/org/mozilla/gecko/tests/testBookmarksPanel.java]
|
||||
# disabled on 4.3, bug 987930
|
||||
skip-if = android_version == "18"
|
||||
[src/org/mozilla/gecko/tests/testBookmarkFolders.java]
|
||||
# disabled on 4.3, bug 1144921
|
||||
skip-if = android_version == "18"
|
||||
[src/org/mozilla/gecko/tests/testBookmarklets.java]
|
||||
[src/org/mozilla/gecko/tests/testBookmarkKeyword.java]
|
||||
disabled=see bug 915350
|
||||
[src/org/mozilla/gecko/tests/testBrowserProvider.java]
|
||||
[src/org/mozilla/gecko/tests/testBrowserSearchVisibility.java]
|
||||
[src/org/mozilla/gecko/tests/testDBUtils.java]
|
||||
[src/org/mozilla/gecko/tests/testDistribution.java]
|
||||
[src/org/mozilla/gecko/tests/testDoorHanger.java]
|
||||
# disabled on 4.3, bug 1144924
|
||||
skip-if = android_version == "18"
|
||||
[src/org/mozilla/gecko/tests/testFilterOpenTab.java]
|
||||
[src/org/mozilla/gecko/tests/testFindInPage.java]
|
||||
disabled=bug 1128287
|
||||
[src/org/mozilla/gecko/tests/testFlingCorrectness.java]
|
||||
skip-if = true # Bug 1390059
|
||||
[src/org/mozilla/gecko/tests/testFormHistory.java]
|
||||
[src/org/mozilla/gecko/tests/testGetUserMedia.java]
|
||||
# failures across the board, bug 1092202 & bug 1144926
|
||||
skip-if = true
|
||||
[src/org/mozilla/gecko/tests/testHistory.java]
|
||||
disabled=see bug 915350
|
||||
[src/org/mozilla/gecko/tests/testHomeBanner.java]
|
||||
[src/org/mozilla/gecko/tests/testIdnSupport.java]
|
||||
# fails with code coverage, see bug 1475256
|
||||
skip-if = debug
|
||||
[src/org/mozilla/gecko/tests/testInputUrlBar.java]
|
||||
[src/org/mozilla/gecko/tests/testIntentUri.java]
|
||||
[src/org/mozilla/gecko/tests/testJarReader.java]
|
||||
[src/org/mozilla/gecko/tests/testLinkContextMenu.java]
|
||||
# fails with code coverage, see bug 1475256
|
||||
skip-if = debug
|
||||
[src/org/mozilla/gecko/tests/testHomeListsProvider.java]
|
||||
disabled=see bug 952310
|
||||
[src/org/mozilla/gecko/tests/testLoad.java]
|
||||
skip-if = true # Bug 1390059
|
||||
[src/org/mozilla/gecko/tests/testMailToContextMenu.java]
|
||||
# fails with code coverage, see bug 1475256
|
||||
skip-if = debug
|
||||
[src/org/mozilla/gecko/tests/testNewTab.java]
|
||||
[src/org/mozilla/gecko/tests/testPanCorrectness.java]
|
||||
skip-if = true # Bug 1390059
|
||||
[src/org/mozilla/gecko/tests/testPasswordEncrypt.java]
|
||||
disabled=see bug 824067
|
||||
[src/org/mozilla/gecko/tests/testPasswordProvider.java]
|
||||
# fails on debug builds, see bug 1481834
|
||||
skip-if = debug
|
||||
[src/org/mozilla/gecko/tests/testPermissions.java]
|
||||
disabled=see bug 757475
|
||||
[src/org/mozilla/gecko/tests/testPictureLinkContextMenu.java]
|
||||
[src/org/mozilla/gecko/tests/testPrefsObserver.java]
|
||||
[src/org/mozilla/gecko/tests/testPrivateBrowsing.java]
|
||||
[src/org/mozilla/gecko/tests/testPromptGridInput.java]
|
||||
# bug 1001657
|
||||
skip-if = android_version == "18"
|
||||
[src/org/mozilla/gecko/tests/testSearchHistoryProvider.java]
|
||||
[src/org/mozilla/gecko/tests/testSearchSuggestions.java]
|
||||
# disabled on 4.3, bug 1145867
|
||||
skip-if = android_version == "18"
|
||||
[src/org/mozilla/gecko/tests/testSessionFilePreservation.java]
|
||||
[src/org/mozilla/gecko/tests/testSessionOOMSave.java]
|
||||
[src/org/mozilla/gecko/tests/testSessionOOMRestore.java]
|
||||
[src/org/mozilla/gecko/tests/testSessionPrivateBrowsing.java]
|
||||
[src/org/mozilla/gecko/tests/testSettingsPages.java]
|
||||
[src/org/mozilla/gecko/tests/testShareLink.java]
|
||||
disabled=see bug 915897
|
||||
[src/org/mozilla/gecko/tests/testThumbnails.java]
|
||||
disabled=see bug 813107
|
||||
[src/org/mozilla/gecko/tests/testViewPageSource.java]
|
||||
[src/org/mozilla/gecko/tests/testVkbOverlap.java]
|
||||
disabled=see bug 907274
|
||||
|
||||
# Using JavascriptTest
|
||||
# (If your test can be written entirely in Javascript, consider writing
|
||||
# it as a chrome test instead. See mobile/android/tests/browser/chrome.)
|
||||
[src/org/mozilla/gecko/tests/testBrowserDiscovery.java]
|
||||
[src/org/mozilla/gecko/tests/testFilePicker.java]
|
||||
# fails with code coverage, see bug 1475256; also bug 1449196
|
||||
skip-if = true
|
||||
[src/org/mozilla/gecko/tests/testHistoryService.java]
|
||||
[src/org/mozilla/gecko/tests/testOSLocale.java]
|
||||
# disabled on 4.3: Bug 1124494
|
||||
skip-if = android_version == "18"
|
||||
[src/org/mozilla/gecko/tests/testReadingListCache.java]
|
||||
[src/org/mozilla/gecko/tests/testRestrictions.java]
|
||||
[src/org/mozilla/gecko/tests/testSnackbarAPI.java]
|
||||
[src/org/mozilla/gecko/tests/testThemeInstall.java]
|
||||
[src/org/mozilla/gecko/tests/testTrackingProtection.java]
|
||||
[src/org/mozilla/gecko/tests/testUITelemetry.java]
|
||||
[src/org/mozilla/gecko/tests/testBug1217581.java]
|
||||
[src/org/mozilla/gecko/tests/testVideoControls.java]
|
||||
# disabled on 4.3, bug 1098532
|
||||
skip-if = android_version == "18"
|
||||
[src/org/mozilla/gecko/tests/testAndroidCastDeviceProvider.java]
|
||||
|
||||
# Using UITest
|
||||
[src/org/mozilla/gecko/tests/testAboutHomePageNavigation.java]
|
||||
disabled=see bug 947550, bug 979038 and bug 977952
|
||||
[src/org/mozilla/gecko/tests/testAboutHomeVisibility.java]
|
||||
[src/org/mozilla/gecko/tests/testActivityStreamPocketReferrer.java]
|
||||
# fails on debug builds, see bug 1481834
|
||||
skip-if = debug || android_version == "18"
|
||||
[src/org/mozilla/gecko/tests/testAppMenuPathways.java]
|
||||
[src/org/mozilla/gecko/tests/testBackButtonInEditMode.java]
|
||||
[src/org/mozilla/gecko/tests/testBrowserDatabaseHelperUpgrades.java]
|
||||
[src/org/mozilla/gecko/tests/testEventDispatcher.java]
|
||||
[src/org/mozilla/gecko/tests/testInputConnection.java]
|
||||
[src/org/mozilla/gecko/tests/testJavascriptBridge.java]
|
||||
[src/org/mozilla/gecko/tests/testReaderCacheMigration.java]
|
||||
[src/org/mozilla/gecko/tests/testReadingListToBookmarksMigration.java]
|
||||
[src/org/mozilla/gecko/tests/testNativeCrypto.java]
|
||||
[src/org/mozilla/gecko/tests/testReaderModeTitle.java]
|
||||
[src/org/mozilla/gecko/tests/testReorderTabs.java]
|
||||
# fails on debug builds, see bug 1481834
|
||||
skip-if = debug
|
||||
[src/org/mozilla/gecko/tests/testSessionHistory.java]
|
||||
[src/org/mozilla/gecko/tests/testStateWhileLoading.java]
|
||||
[src/org/mozilla/gecko/tests/testTabStrip.java]
|
||||
[src/org/mozilla/gecko/tests/testUnifiedTelemetryClientId.java]
|
||||
|
||||
[src/org/mozilla/gecko/tests/testAccessibleCarets.java]
|
||||
|
||||
# testStumblerSetting disabled on Android 4.3, bug 1145846
|
||||
[src/org/mozilla/gecko/tests/testStumblerSetting.java]
|
||||
skip-if = android_version == "18"
|
||||
|
||||
[src/org/mozilla/gecko/tests/testLoginsProvider.java]
|
||||
[src/org/mozilla/gecko/tests/testICODecoder.java]
|
@ -1,28 +0,0 @@
|
||||
/**
|
||||
* Used with testThumbnails.
|
||||
* On the first visit, the page is green.
|
||||
* On subsequent visits, the page is red.
|
||||
*/
|
||||
|
||||
function handleRequest(request, response) {
|
||||
let type = request.queryString.match(/^type=(.*)$/)[1];
|
||||
let state = "thumbnails." + type;
|
||||
let color = "#0f0";
|
||||
let status = 200;
|
||||
|
||||
if (getState(state)) {
|
||||
color = "#f00";
|
||||
if (type == "do404")
|
||||
status = 404;
|
||||
} else {
|
||||
setState(state, "1");
|
||||
}
|
||||
|
||||
response.setStatusLine(request.httpVersion, status, null);
|
||||
response.setHeader("Content-Type", "text/html", false);
|
||||
response.setHeader("Cache-Control", "no-cache", false);
|
||||
response.write('<html>');
|
||||
response.write('<head><title>' + type + '</title> <meta charset="utf-8"> </head>');
|
||||
response.write('<body style="background-color: ' + color + '"></body>');
|
||||
response.write('</html>');
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Big Link</title>
|
||||
<link rel="shortcut icon" href="data:image/gif;base64,R0lGODlhCwALAIAAAAAA3pn/ZiH5BAEAAAEALAAAAAALAAsAAAIUhA+hkcuO4lmNVindo7qyrIXiGBYAOw==" />
|
||||
<meta name="viewport" content="initial-scale=1.0"/>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body style="margin: 0; padding: 0">
|
||||
<div style="text-align: center; margin: 0; padding: 0">
|
||||
<a style="font-size: 60px" href="robocop_blank_01.html">Browser Blank Page</a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -1,13 +0,0 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Big Mailto</title>
|
||||
<link rel="shortcut icon" href="data:image/gif;base64,R0lGODlhCwALAIAAAAAA3pn/ZiH5BAEAAAEALAAAAAALAAsAAAIUhA+hkcuO4lmNVindo7qyrIXiGBYAOw==" />
|
||||
<meta name="viewport" content="initial-scale=1.0"/>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body style="margin: 0; padding: 0">
|
||||
<div style="text-align: center; margin: 0; padding: 0">
|
||||
<a style="font-size: 60px" href="mailto:foo.bar@example.com">Email Foo.Bar</a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -1,7 +0,0 @@
|
||||
<html>
|
||||
<meta charset="utf-8">
|
||||
<title>Browser Blank Page 01</title>
|
||||
<body>
|
||||
<p>Browser Blank Page 01</p>
|
||||
</body>
|
||||
</html>
|
@ -1,8 +0,0 @@
|
||||
<html>
|
||||
<meta charset="utf-8">
|
||||
<title>Browser Blank Page 02</title>
|
||||
<link rel="shortcut icon" href="data:image/gif;base64,R0lGODlhCwALAIAAAAAA3pn/ZiH5BAEAAAEALAAAAAALAAsAAAIUhA+hkcuO4lmNVindo7qyrIXiGBYAOw==" />
|
||||
<body>
|
||||
<p>Browser Blank Page 02</p>
|
||||
</body>
|
||||
</html>
|
@ -1,7 +0,0 @@
|
||||
<html>
|
||||
<meta charset="utf-8">
|
||||
<title>Browser Blank Page 03</title>
|
||||
<body>
|
||||
<p>Browser Blank Page 03</p>
|
||||
</body>
|
||||
</html>
|
@ -1,7 +0,0 @@
|
||||
<html>
|
||||
<meta charset="utf-8">
|
||||
<title>Browser Blank Page 04</title>
|
||||
<body>
|
||||
<p>Browser Blank Page 04</p>
|
||||
</body>
|
||||
</html>
|
@ -1,7 +0,0 @@
|
||||
<html>
|
||||
<meta charset="utf-8">
|
||||
<title>Browser Blank Page 05</title>
|
||||
<body>
|
||||
<p>Browser Blank Page 05</p>
|
||||
</body>
|
||||
</html>
|
@ -1,43 +0,0 @@
|
||||
<!--
|
||||
DO NOT MODIFY THIS FILE UNLESS YOU KNOW WHAT YOU ARE DOING!
|
||||
|
||||
This file is specifically designed to create a page larger than
|
||||
any screen fennec could run on (to allow panning in both axes).
|
||||
It is filled with 100x100 pixel boxes that are of unique colour,
|
||||
so that we can identify exactly what part of the page we are
|
||||
rendering at any given time. The colours are specifically chosen
|
||||
so that adjacent boxes have a fairly large variation in colour,
|
||||
and so that errors due to 565/888 conversion are minimised. This
|
||||
is done by dropping the bottom few bits on each color channel,
|
||||
so that conversion from 888->565 is pretty much lossless, and any
|
||||
variation only comes in from however the drivers do 565->888.
|
||||
|
||||
A lot of the tests depend on this behaviour, so ensure that all
|
||||
the tests pass (on a variety of screen sizes) when making any
|
||||
changes to this file.
|
||||
-->
|
||||
<html style="margin: 0; padding: 0">
|
||||
<head>
|
||||
<title>Browser Box test</title>
|
||||
<meta name="viewport" content="initial-scale=1.0"/>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body style="margin: 0; padding: 0">
|
||||
<script type="text/javascript">
|
||||
for (var y = 0; y < 2000; y += 100) {
|
||||
document.write("<div style='width: 2000px; height: 100px; margin: 0; padding: 0; border: none'>\n");
|
||||
for (var x = 0; x < 2000; x += 100) {
|
||||
var r = (Math.floor(x / 3) % 256);
|
||||
r = r & 0xF8;
|
||||
var g = (x + y) % 256;
|
||||
g = g & 0xFC;
|
||||
var b = (Math.floor(y / 3) % 256);
|
||||
b = b & 0xF8;
|
||||
// eslint-disable-next-line no-unsanitized/method
|
||||
document.write("<div style='float: left; width: 100px; height: 100px; margin: 0; padding: 0; border: none; background-color: rgb(" + r + "," + g + "," + b + ")'> </div>\n");
|
||||
}
|
||||
document.write("</div>\n");
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
@ -1,18 +0,0 @@
|
||||
/**
|
||||
* Dynamically generated page whose title matches the given id.
|
||||
*/
|
||||
|
||||
function handleRequest(request, response) {
|
||||
let id = request.queryString.match(/^id=(.*)$/)[1];
|
||||
let key = "dynamic." + id;
|
||||
|
||||
response.setStatusLine(request.httpVersion, 200, null);
|
||||
response.setHeader("Content-Type", "text/html", false);
|
||||
response.setHeader("Cache-Control", "no-cache", false);
|
||||
response.write('<html>');
|
||||
response.write('<head><title>' + id + '</title><meta charset="utf-8"></head>');
|
||||
response.write('<body>');
|
||||
response.write('<h1>' + id + '</h1>');
|
||||
response.write('</body>');
|
||||
response.write('</html>');
|
||||
}
|
@ -1,20 +0,0 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Geolocation Test Page</title>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body>
|
||||
<script>
|
||||
function clb(position) {
|
||||
// Show a green background if permission is granted
|
||||
document.body.style.background = "#008000";
|
||||
}
|
||||
function err(error) {
|
||||
// Show a red background if permission is denied
|
||||
if (error.code == error.PERMISSION_DENIED)
|
||||
document.body.style.background = "#FF0000";
|
||||
}
|
||||
navigator.geolocation.getCurrentPosition(clb, err, {timeout: 0});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
@ -1,86 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html><head>
|
||||
<title>gUM Test Page</title>
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8" charset="utf-8">
|
||||
</head>
|
||||
<body>
|
||||
<div id="content"></div>
|
||||
<script type="application/javascript">
|
||||
var video_status = false;
|
||||
var video = document.createElement("video");
|
||||
video.setAttribute("width", 640);
|
||||
video.setAttribute("height", 480);
|
||||
|
||||
var audio_status = false;
|
||||
var audio = document.createElement("audio");
|
||||
audio.setAttribute("controls", true);
|
||||
|
||||
var content = document.getElementById("content");
|
||||
document.title = "gUM Test Page";
|
||||
|
||||
startAudioVideo();
|
||||
|
||||
function startAudioVideo() {
|
||||
video_status = true;
|
||||
audio_status = true;
|
||||
mediaConstraints = {
|
||||
video: {
|
||||
mozMediaSource: "browser",
|
||||
mediaSource: "browser",
|
||||
},
|
||||
audio: true,
|
||||
};
|
||||
startMedia(mediaConstraints);
|
||||
}
|
||||
|
||||
function stopMedia() {
|
||||
if (video_status) {
|
||||
video.srcObject.getTracks().forEach(t => t.stop());
|
||||
video.srcObject = null;
|
||||
content.removeChild(video);
|
||||
capturing = false;
|
||||
video_status = false;
|
||||
}
|
||||
if (audio_status) {
|
||||
audio.srcObject.getTracks().forEach(t => t.stop());
|
||||
audio.srcObject = null;
|
||||
content.removeChild(audio);
|
||||
audio_status = false;
|
||||
}
|
||||
}
|
||||
|
||||
function startMedia(param) {
|
||||
try {
|
||||
window.navigator.mozGetUserMedia(param, function(stream) {
|
||||
if (video_status) {
|
||||
content.appendChild(video);
|
||||
video.srcObject = stream;
|
||||
video.play();
|
||||
}
|
||||
if (audio_status) {
|
||||
content.appendChild(audio);
|
||||
audio.srcObject = stream;
|
||||
audio.play();
|
||||
}
|
||||
var audioTracks = stream.getAudioTracks();
|
||||
var videoTracks = stream.getVideoTracks();
|
||||
document.title = "";
|
||||
if (audioTracks.length > 0) {
|
||||
document.title += "audio";
|
||||
}
|
||||
if (videoTracks.length > 0) {
|
||||
document.title += "video";
|
||||
}
|
||||
document.title += " gumtest";
|
||||
audio.srcObject.getTracks().forEach(t => t.stop());
|
||||
video.srcObject.getTracks().forEach(t => t.stop());
|
||||
}, function(err) {
|
||||
document.title = "failed gumtest";
|
||||
stopMedia();
|
||||
});
|
||||
} catch (e) {
|
||||
stopMedia();
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</body></html>
|
@ -1,83 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html><head>
|
||||
<title>gUM Test Page</title>
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8" charset="utf-8">
|
||||
</head>
|
||||
<body>
|
||||
<div id="content"></div>
|
||||
<script type="application/javascript">
|
||||
var video_status = false;
|
||||
var video = document.createElement("video");
|
||||
video.setAttribute("width", 640);
|
||||
video.setAttribute("height", 480);
|
||||
|
||||
var audio_status = false;
|
||||
var audio = document.createElement("audio");
|
||||
audio.setAttribute("controls", true);
|
||||
|
||||
var content = document.getElementById("content");
|
||||
document.title = "gUM Test Page";
|
||||
|
||||
startAudioVideo();
|
||||
|
||||
function startAudioVideo() {
|
||||
video_status = true;
|
||||
audio_status = true;
|
||||
mediaConstraints = {
|
||||
video: true,
|
||||
audio: true,
|
||||
};
|
||||
startMedia(mediaConstraints);
|
||||
}
|
||||
|
||||
function stopMedia() {
|
||||
if (video_status) {
|
||||
video.srcObject.getTracks().forEach(t => t.stop());
|
||||
video.srcObject = null;
|
||||
content.removeChild(video);
|
||||
capturing = false;
|
||||
video_status = false;
|
||||
}
|
||||
if (audio_status) {
|
||||
audio.srcObject.getTracks().forEach(t => t.stop());
|
||||
audio.srcObject = null;
|
||||
content.removeChild(audio);
|
||||
audio_status = false;
|
||||
}
|
||||
}
|
||||
|
||||
function startMedia(param) {
|
||||
try {
|
||||
window.navigator.mozGetUserMedia(param, function(stream) {
|
||||
if (video_status) {
|
||||
content.appendChild(video);
|
||||
video.srcObject = stream;
|
||||
video.play();
|
||||
}
|
||||
if (audio_status) {
|
||||
content.appendChild(audio);
|
||||
audio.srcObject = stream;
|
||||
audio.play();
|
||||
}
|
||||
var audioTracks = stream.getAudioTracks();
|
||||
var videoTracks = stream.getVideoTracks();
|
||||
document.title = "";
|
||||
if (audioTracks.length > 0) {
|
||||
document.title += "audio";
|
||||
}
|
||||
if (videoTracks.length > 0) {
|
||||
document.title += "video";
|
||||
}
|
||||
document.title += " gumtest";
|
||||
audio.srcObject.getTracks().forEach(t => t.stop());
|
||||
video.srcObject.getTracks().forEach(t => t.stop());
|
||||
}, function(err) {
|
||||
document.title = "failed gumtest";
|
||||
stopMedia();
|
||||
});
|
||||
} catch (e) {
|
||||
stopMedia();
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</body></html>
|
@ -1,985 +0,0 @@
|
||||
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
||||
/* vim:set ts=2 sw=2 sts=2 et: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
// The test js is shared between sandboxed (which has no SpecialPowers object)
|
||||
// and content mochitests (where the |Components| object is accessible only as
|
||||
// SpecialPowers.Components). Expose Components if necessary here to make things
|
||||
// work everywhere.
|
||||
//
|
||||
// Even if the real |Components| doesn't exist, we might shim in a simple JS
|
||||
// placebo for compat. An easy way to differentiate this from the real thing
|
||||
// is whether the property is read-only or not.
|
||||
{
|
||||
let c = Object.getOwnPropertyDescriptor(this, "Components");
|
||||
if ((!c || !c.value || c.writable) && typeof SpecialPowers === "object") {
|
||||
// eslint-disable-next-line no-global-assign
|
||||
Components = SpecialPowers.wrap(SpecialPowers.Components);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* This file contains common code that is loaded before each test file(s).
|
||||
* See http://developer.mozilla.org/en/docs/Writing_xpcshell-based_unit_tests
|
||||
* for more information.
|
||||
*/
|
||||
|
||||
/* eslint-disable mozilla/use-cc-etc */
|
||||
/* eslint-disable mozilla/use-chromeutils-import */
|
||||
/* eslint-disable mozilla/use-chromeutils-generateqi */
|
||||
/* eslint-disable mozilla/use-services */
|
||||
|
||||
var _quit = false;
|
||||
var _tests_pending = 0;
|
||||
var _pendingTimers = [];
|
||||
var _cleanupFunctions = [];
|
||||
|
||||
function _dump(str) {
|
||||
let start = /^TEST-/.test(str) ? "\n" : "";
|
||||
dump(start + str);
|
||||
}
|
||||
|
||||
// Disable automatic network detection, so tests work correctly when
|
||||
// not connected to a network.
|
||||
{
|
||||
let ios = Components.classes["@mozilla.org/network/io-service;1"].getService(
|
||||
Components.interfaces.nsIIOService
|
||||
);
|
||||
ios.manageOfflineStatus = false;
|
||||
ios.offline = false;
|
||||
}
|
||||
|
||||
// Determine if we're running on parent or child
|
||||
var runningInParent = true;
|
||||
try {
|
||||
runningInParent =
|
||||
Components.classes["@mozilla.org/xre/runtime;1"].getService(
|
||||
Components.interfaces.nsIXULRuntime
|
||||
).processType == Components.interfaces.nsIXULRuntime.PROCESS_TYPE_DEFAULT;
|
||||
} catch (e) {}
|
||||
|
||||
try {
|
||||
if (runningInParent) {
|
||||
let prefs = Components.classes[
|
||||
"@mozilla.org/preferences-service;1"
|
||||
].getService(Components.interfaces.nsIPrefBranch);
|
||||
|
||||
// disable necko IPC security checks for xpcshell, as they lack the
|
||||
// docshells needed to pass them
|
||||
prefs.setBoolPref("network.disable.ipc.security", true);
|
||||
|
||||
// Disable IPv6 lookups for 'localhost' on windows.
|
||||
if ("@mozilla.org/windows-registry-key;1" in Components.classes) {
|
||||
prefs.setCharPref("network.dns.ipv4OnlyDomains", "localhost");
|
||||
}
|
||||
}
|
||||
} catch (e) {}
|
||||
|
||||
// Enable crash reporting, if possible
|
||||
// We rely on the Python harness to set MOZ_CRASHREPORTER_NO_REPORT
|
||||
// and handle checking for minidumps.
|
||||
// Note that if we're in a child process, we don't want to init the
|
||||
// crashreporter component.
|
||||
try {
|
||||
// nsIXULRuntime is not available in some configurations.
|
||||
if (
|
||||
runningInParent &&
|
||||
"@mozilla.org/toolkit/crash-reporter;1" in Components.classes
|
||||
) {
|
||||
// Remember to update </toolkit/crashreporter/test/unit/test_crashreporter.js>
|
||||
// too if you change this initial setting.
|
||||
let crashReporter = Components.classes[
|
||||
"@mozilla.org/toolkit/crash-reporter;1"
|
||||
].getService(Components.interfaces.nsICrashReporter);
|
||||
crashReporter.enabled = true;
|
||||
crashReporter.minidumpPath = do_get_cwd();
|
||||
}
|
||||
} catch (e) {}
|
||||
|
||||
/**
|
||||
* Date.now() is not necessarily monotonically increasing (insert sob story
|
||||
* about times not being the right tool to use for measuring intervals of time,
|
||||
* robarnold can tell all), so be wary of error by erring by at least
|
||||
* _timerFuzz ms.
|
||||
*/
|
||||
const _timerFuzz = 15;
|
||||
|
||||
function _Timer(func, delay) {
|
||||
delay = Number(delay);
|
||||
if (delay < 0) {
|
||||
do_throw("do_timeout() delay must be nonnegative");
|
||||
}
|
||||
|
||||
if (typeof func !== "function") {
|
||||
do_throw("string callbacks no longer accepted; use a function!");
|
||||
}
|
||||
|
||||
this._func = func;
|
||||
this._start = Date.now();
|
||||
this._delay = delay;
|
||||
|
||||
var timer = Components.classes["@mozilla.org/timer;1"].createInstance(
|
||||
Components.interfaces.nsITimer
|
||||
);
|
||||
timer.initWithCallback(this, delay + _timerFuzz, timer.TYPE_ONE_SHOT);
|
||||
|
||||
// Keep timer alive until it fires
|
||||
_pendingTimers.push(timer);
|
||||
}
|
||||
|
||||
_Timer.prototype = {
|
||||
QueryInterface: function(iid) {
|
||||
if (
|
||||
iid.equals(Components.interfaces.nsITimerCallback) ||
|
||||
iid.equals(Components.interfaces.nsISupports)
|
||||
) {
|
||||
return this;
|
||||
}
|
||||
|
||||
throw Components.results.NS_ERROR_NO_INTERFACE;
|
||||
},
|
||||
|
||||
notify: function(timer) {
|
||||
_pendingTimers.splice(_pendingTimers.indexOf(timer), 1);
|
||||
|
||||
// The current nsITimer implementation can undershoot, but even if it
|
||||
// couldn't, paranoia is probably a virtue here given the potential for
|
||||
// random orange on tinderboxen.
|
||||
var end = Date.now();
|
||||
var elapsed = end - this._start;
|
||||
if (elapsed >= this._delay) {
|
||||
try {
|
||||
this._func.call(null);
|
||||
} catch (e) {
|
||||
do_throw("exception thrown from do_timeout callback: " + e);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Timer undershot, retry with a little overshoot to try to avoid more
|
||||
// undershoots.
|
||||
var newDelay = this._delay - elapsed;
|
||||
do_timeout(newDelay, this._func);
|
||||
},
|
||||
};
|
||||
|
||||
function _do_quit() {
|
||||
_dump("TEST-INFO | (robocop_head.js) | exiting test\n");
|
||||
|
||||
_quit = true;
|
||||
}
|
||||
|
||||
function _dump_exception_stack(stack) {
|
||||
stack.split("\n").forEach(function(frame) {
|
||||
if (!frame) {
|
||||
return;
|
||||
}
|
||||
// frame is of the form "fname(args)@file:line"
|
||||
let frame_regexp = new RegExp("(.*)\\(.*\\)@(.*):(\\d*)", "g");
|
||||
let parts = frame_regexp.exec(frame);
|
||||
if (parts) {
|
||||
dump(
|
||||
"JS frame :: " +
|
||||
parts[2] +
|
||||
" :: " +
|
||||
(parts[1] ? parts[1] : "anonymous") +
|
||||
" :: line " +
|
||||
parts[3] +
|
||||
"\n"
|
||||
);
|
||||
} /* Could be a -e (command line string) style location. */ else {
|
||||
dump("JS frame :: " + frame + "\n");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/** ************ Functions to be used from the tests **************/
|
||||
|
||||
/**
|
||||
* Prints a message to the output log.
|
||||
*/
|
||||
function do_print(msg) {
|
||||
var caller_stack = Components.stack.caller;
|
||||
_dump("TEST-INFO | " + caller_stack.filename + " | " + msg + "\n");
|
||||
}
|
||||
|
||||
/**
|
||||
* Calls the given function at least the specified number of milliseconds later.
|
||||
* The callback will not undershoot the given time, but it might overshoot --
|
||||
* don't expect precision!
|
||||
*
|
||||
* @param delay : uint
|
||||
* the number of milliseconds to delay
|
||||
* @param callback : function() : void
|
||||
* the function to call
|
||||
*/
|
||||
function do_timeout(delay, func) {
|
||||
new _Timer(func, Number(delay));
|
||||
}
|
||||
|
||||
function do_execute_soon(callback) {
|
||||
do_test_pending();
|
||||
var tm = Components.classes["@mozilla.org/thread-manager;1"].getService(
|
||||
Components.interfaces.nsIThreadManager
|
||||
);
|
||||
|
||||
tm.dispatchToMainThread({
|
||||
run: function() {
|
||||
try {
|
||||
callback();
|
||||
} catch (e) {
|
||||
// do_check failures are already logged and set _quit to true and throw
|
||||
// NS_ERROR_ABORT. If both of those are true it is likely this exception
|
||||
// has already been logged so there is no need to log it again. It's
|
||||
// possible that this will mask an NS_ERROR_ABORT that happens after a
|
||||
// do_check failure though.
|
||||
if (!_quit || e != Components.results.NS_ERROR_ABORT) {
|
||||
_dump("TEST-UNEXPECTED-FAIL | (robocop_head.js) | " + e);
|
||||
if (e.stack) {
|
||||
dump(" - See following stack:\n");
|
||||
_dump_exception_stack(e.stack);
|
||||
} else {
|
||||
dump("\n");
|
||||
}
|
||||
_do_quit();
|
||||
}
|
||||
} finally {
|
||||
do_test_finished();
|
||||
}
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
function do_throw(text, stack) {
|
||||
if (!stack) {
|
||||
stack = Components.stack.caller;
|
||||
}
|
||||
|
||||
_dump(
|
||||
"TEST-UNEXPECTED-FAIL | " +
|
||||
stack.filename +
|
||||
" | " +
|
||||
text +
|
||||
" - See following stack:\n"
|
||||
);
|
||||
var frame = Components.stack;
|
||||
while (frame != null) {
|
||||
_dump(frame + "\n");
|
||||
frame = frame.caller;
|
||||
}
|
||||
|
||||
_do_quit();
|
||||
throw Components.results.NS_ERROR_ABORT;
|
||||
}
|
||||
|
||||
function do_throw_todo(text, stack) {
|
||||
if (!stack) {
|
||||
stack = Components.stack.caller;
|
||||
}
|
||||
|
||||
_dump(
|
||||
"TEST-UNEXPECTED-PASS | " +
|
||||
stack.filename +
|
||||
" | " +
|
||||
text +
|
||||
" - See following stack:\n"
|
||||
);
|
||||
var frame = Components.stack;
|
||||
while (frame != null) {
|
||||
_dump(frame + "\n");
|
||||
frame = frame.caller;
|
||||
}
|
||||
|
||||
_do_quit();
|
||||
throw Components.results.NS_ERROR_ABORT;
|
||||
}
|
||||
|
||||
function do_report_unexpected_exception(ex, text) {
|
||||
var caller_stack = Components.stack.caller;
|
||||
text = text ? text + " - " : "";
|
||||
var caller_filename = caller_stack ? caller_stack.filename : "unknown file";
|
||||
|
||||
_dump(
|
||||
"TEST-UNEXPECTED-FAIL | " +
|
||||
caller_filename +
|
||||
" | " +
|
||||
text +
|
||||
"Unexpected exception " +
|
||||
ex +
|
||||
", see following stack:\n" +
|
||||
ex.stack +
|
||||
"\n"
|
||||
);
|
||||
|
||||
_do_quit();
|
||||
throw Components.results.NS_ERROR_ABORT;
|
||||
}
|
||||
|
||||
function do_note_exception(ex, text) {
|
||||
var caller_stack = Components.stack.caller;
|
||||
text = text ? text + " - " : "";
|
||||
|
||||
_dump(
|
||||
"TEST-INFO | " +
|
||||
caller_stack.filename +
|
||||
" | " +
|
||||
text +
|
||||
"Swallowed exception " +
|
||||
ex +
|
||||
", see following stack:\n" +
|
||||
ex.stack +
|
||||
"\n"
|
||||
);
|
||||
}
|
||||
|
||||
function _do_check_neq(left, right, stack, todo) {
|
||||
if (!stack) {
|
||||
stack = Components.stack.caller;
|
||||
}
|
||||
|
||||
var text = left + " != " + right;
|
||||
if (left == right) {
|
||||
if (!todo) {
|
||||
do_throw(text, stack);
|
||||
} else {
|
||||
_dump(
|
||||
"TEST-KNOWN-FAIL | " +
|
||||
stack.filename +
|
||||
" | [" +
|
||||
stack.name +
|
||||
" : " +
|
||||
stack.lineNumber +
|
||||
"] " +
|
||||
text +
|
||||
"\n"
|
||||
);
|
||||
}
|
||||
} else if (!todo) {
|
||||
_dump(
|
||||
"TEST-PASS | " +
|
||||
stack.filename +
|
||||
" | [" +
|
||||
stack.name +
|
||||
" : " +
|
||||
stack.lineNumber +
|
||||
"] " +
|
||||
text +
|
||||
"\n"
|
||||
);
|
||||
} else {
|
||||
do_throw_todo(text, stack);
|
||||
}
|
||||
}
|
||||
|
||||
function do_check_neq(left, right, stack) {
|
||||
if (!stack) {
|
||||
stack = Components.stack.caller;
|
||||
}
|
||||
|
||||
_do_check_neq(left, right, stack, false);
|
||||
}
|
||||
|
||||
function todo_check_neq(left, right, stack) {
|
||||
if (!stack) {
|
||||
stack = Components.stack.caller;
|
||||
}
|
||||
|
||||
_do_check_neq(left, right, stack, true);
|
||||
}
|
||||
|
||||
function do_report_result(passed, text, stack, todo) {
|
||||
if (passed) {
|
||||
if (todo) {
|
||||
do_throw_todo(text, stack);
|
||||
} else {
|
||||
_dump(
|
||||
"TEST-PASS | " +
|
||||
stack.filename +
|
||||
" | [" +
|
||||
stack.name +
|
||||
" : " +
|
||||
stack.lineNumber +
|
||||
"] " +
|
||||
text +
|
||||
"\n"
|
||||
);
|
||||
}
|
||||
} else if (todo) {
|
||||
_dump(
|
||||
"TEST-KNOWN-FAIL | " +
|
||||
stack.filename +
|
||||
" | [" +
|
||||
stack.name +
|
||||
" : " +
|
||||
stack.lineNumber +
|
||||
"] " +
|
||||
text +
|
||||
"\n"
|
||||
);
|
||||
} else {
|
||||
do_throw(text, stack);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks for a true condition, with a success message.
|
||||
*/
|
||||
function ok(condition, msg) {
|
||||
do_report_result(condition, msg, Components.stack.caller, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks for a condition equality, with a success message.
|
||||
*/
|
||||
function is(left, right, msg) {
|
||||
do_report_result(
|
||||
left === right,
|
||||
"[ " + left + " === " + right + " ] " + msg,
|
||||
Components.stack.caller,
|
||||
false
|
||||
);
|
||||
}
|
||||
|
||||
function _do_check_eq(left, right, stack, todo) {
|
||||
if (!stack) {
|
||||
stack = Components.stack.caller;
|
||||
}
|
||||
|
||||
var text = left + " == " + right;
|
||||
do_report_result(left == right, text, stack, todo);
|
||||
}
|
||||
|
||||
function do_check_eq(left, right, stack) {
|
||||
if (!stack) {
|
||||
stack = Components.stack.caller;
|
||||
}
|
||||
|
||||
_do_check_eq(left, right, stack, false);
|
||||
}
|
||||
|
||||
function todo_check_eq(left, right, stack) {
|
||||
if (!stack) {
|
||||
stack = Components.stack.caller;
|
||||
}
|
||||
|
||||
_do_check_eq(left, right, stack, true);
|
||||
}
|
||||
|
||||
function do_check_true(condition, stack) {
|
||||
if (!stack) {
|
||||
stack = Components.stack.caller;
|
||||
}
|
||||
|
||||
do_check_eq(condition, true, stack);
|
||||
}
|
||||
|
||||
function todo_check_true(condition, stack) {
|
||||
if (!stack) {
|
||||
stack = Components.stack.caller;
|
||||
}
|
||||
|
||||
todo_check_eq(condition, true, stack);
|
||||
}
|
||||
|
||||
function do_check_false(condition, stack) {
|
||||
if (!stack) {
|
||||
stack = Components.stack.caller;
|
||||
}
|
||||
|
||||
do_check_eq(condition, false, stack);
|
||||
}
|
||||
|
||||
function todo_check_false(condition, stack) {
|
||||
if (!stack) {
|
||||
stack = Components.stack.caller;
|
||||
}
|
||||
|
||||
todo_check_eq(condition, false, stack);
|
||||
}
|
||||
|
||||
function do_check_null(condition, stack = Components.stack.caller) {
|
||||
do_check_eq(condition, null, stack);
|
||||
}
|
||||
|
||||
function todo_check_null(condition, stack = Components.stack.caller) {
|
||||
todo_check_eq(condition, null, stack);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check that |value| matches |pattern|.
|
||||
*
|
||||
* A |value| matches a pattern |pattern| if any one of the following is true:
|
||||
*
|
||||
* - |value| and |pattern| are both objects; |pattern|'s enumerable
|
||||
* properties' values are valid patterns; and for each enumerable
|
||||
* property |p| of |pattern|, plus 'length' if present at all, |value|
|
||||
* has a property |p| whose value matches |pattern.p|. Note that if |j|
|
||||
* has other properties not present in |p|, |j| may still match |p|.
|
||||
*
|
||||
* - |value| and |pattern| are equal string, numeric, or boolean literals
|
||||
*
|
||||
* - |pattern| is |undefined| (this is a wildcard pattern)
|
||||
*
|
||||
* - typeof |pattern| == "function", and |pattern(value)| is true.
|
||||
*
|
||||
* For example:
|
||||
*
|
||||
* do_check_matches({x:1}, {x:1}) // pass
|
||||
* do_check_matches({x:1}, {}) // fail: all pattern props required
|
||||
* do_check_matches({x:1}, {x:2}) // fail: values must match
|
||||
* do_check_matches({x:1}, {x:1, y:2}) // pass: extra props tolerated
|
||||
*
|
||||
* // Property order is irrelevant.
|
||||
* do_check_matches({x:"foo", y:"bar"}, {y:"bar", x:"foo"}) // pass
|
||||
*
|
||||
* do_check_matches({x:undefined}, {x:1}) // pass: 'undefined' is wildcard
|
||||
* do_check_matches({x:undefined}, {x:2})
|
||||
* do_check_matches({x:undefined}, {y:2}) // fail: 'x' must still be there
|
||||
*
|
||||
* // Patterns nest.
|
||||
* do_check_matches({a:1, b:{c:2,d:undefined}}, {a:1, b:{c:2,d:3}})
|
||||
*
|
||||
* // 'length' property counts, even if non-enumerable.
|
||||
* do_check_matches([3,4,5], [3,4,5]) // pass
|
||||
* do_check_matches([3,4,5], [3,5,5]) // fail; value doesn't match
|
||||
* do_check_matches([3,4,5], [3,4,5,6]) // fail; length doesn't match
|
||||
*
|
||||
* // functions in patterns get applied.
|
||||
* do_check_matches({foo:v => v.length == 2}, {foo:"hi"}) // pass
|
||||
* do_check_matches({foo:v => v.length == 2}, {bar:"hi"}) // fail
|
||||
* do_check_matches({foo:v => v.length == 2}, {foo:"hello"}) // fail
|
||||
*
|
||||
* // We don't check constructors, prototypes, or classes. However, if
|
||||
* // pattern has a 'length' property, we require values to match that as
|
||||
* // well, even if 'length' is non-enumerable in the pattern. So arrays
|
||||
* // are useful as patterns.
|
||||
* do_check_matches({0:0, 1:1, length:2}, [0,1]) // pass
|
||||
* do_check_matches({0:1}, [1,2]) // pass
|
||||
* do_check_matches([0], {0:0, length:1}) // pass
|
||||
*
|
||||
* Notes:
|
||||
*
|
||||
* The 'length' hack gives us reasonably intuitive handling of arrays.
|
||||
*
|
||||
* This is not a tight pattern-matcher; it's only good for checking data
|
||||
* from well-behaved sources. For example:
|
||||
* - By default, we don't mind values having extra properties.
|
||||
* - We don't check for proxies or getters.
|
||||
* - We don't check the prototype chain.
|
||||
* However, if you know the values are, say, JSON, which is pretty
|
||||
* well-behaved, and if you want to tolerate additional properties
|
||||
* appearing on the JSON for backward-compatibility, then do_check_matches
|
||||
* is ideal. If you do want to be more careful, you can use function
|
||||
* patterns to implement more stringent checks.
|
||||
*/
|
||||
function do_check_matches(
|
||||
pattern,
|
||||
value,
|
||||
stack = Components.stack.caller,
|
||||
todo = false
|
||||
) {
|
||||
var matcher = pattern_matcher(pattern);
|
||||
var text = "VALUE: " + uneval(value) + "\nPATTERN: " + uneval(pattern) + "\n";
|
||||
var diagnosis = [];
|
||||
if (matcher(value, diagnosis)) {
|
||||
do_report_result(true, "value matches pattern:\n" + text, stack, todo);
|
||||
} else {
|
||||
text =
|
||||
"value doesn't match pattern:\n" +
|
||||
text +
|
||||
"DIAGNOSIS: " +
|
||||
format_pattern_match_failure(diagnosis[0]) +
|
||||
"\n";
|
||||
do_report_result(false, text, stack, todo);
|
||||
}
|
||||
}
|
||||
|
||||
function todo_check_matches(pattern, value, stack = Components.stack.caller) {
|
||||
do_check_matches(pattern, value, stack, true);
|
||||
}
|
||||
|
||||
// Return a pattern-matching function of one argument, |value|, that
|
||||
// returns true if |value| matches |pattern|.
|
||||
//
|
||||
// If the pattern doesn't match, and the pattern-matching function was
|
||||
// passed its optional |diagnosis| argument, the pattern-matching function
|
||||
// sets |diagnosis|'s '0' property to a JSON-ish description of the portion
|
||||
// of the pattern that didn't match, which can be formatted legibly by
|
||||
// format_pattern_match_failure.
|
||||
function pattern_matcher(pattern) {
|
||||
function explain(diagnosis, reason) {
|
||||
if (diagnosis) {
|
||||
diagnosis[0] = reason;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
if (typeof pattern == "function") {
|
||||
return pattern;
|
||||
} else if (typeof pattern == "object" && pattern) {
|
||||
var matchers = [];
|
||||
for (let p in pattern) {
|
||||
matchers.push([p, pattern_matcher(pattern[p])]);
|
||||
}
|
||||
// Kludge: include 'length', if not enumerable. (If it is enumerable,
|
||||
// we picked it up in the array comprehension, above.
|
||||
ld = Object.getOwnPropertyDescriptor(pattern, "length");
|
||||
if (ld && !ld.enumerable) {
|
||||
matchers.push(["length", pattern_matcher(pattern.length)]);
|
||||
}
|
||||
return function(value, diagnosis) {
|
||||
if (!(value && typeof value == "object")) {
|
||||
return explain(diagnosis, "value not object");
|
||||
}
|
||||
for (let [p, m] of matchers) {
|
||||
var element_diagnosis = [];
|
||||
if (!(p in value && m(value[p], element_diagnosis))) {
|
||||
return explain(diagnosis, {
|
||||
property: p,
|
||||
diagnosis: element_diagnosis[0],
|
||||
});
|
||||
}
|
||||
}
|
||||
return true;
|
||||
};
|
||||
} else if (pattern === undefined) {
|
||||
return function(value) {
|
||||
return true;
|
||||
};
|
||||
}
|
||||
return function(value, diagnosis) {
|
||||
if (value !== pattern) {
|
||||
return explain(
|
||||
diagnosis,
|
||||
"pattern " + uneval(pattern) + " not === to value " + uneval(value)
|
||||
);
|
||||
}
|
||||
return true;
|
||||
};
|
||||
}
|
||||
|
||||
// Format an explanation for a pattern match failure, as stored in the
|
||||
// second argument to a matching function.
|
||||
function format_pattern_match_failure(diagnosis, indent = "") {
|
||||
var a;
|
||||
if (!diagnosis) {
|
||||
a = "Matcher did not explain reason for mismatch.";
|
||||
} else if (typeof diagnosis == "string") {
|
||||
a = diagnosis;
|
||||
} else if (diagnosis.property) {
|
||||
a = "Property " + uneval(diagnosis.property) + " of object didn't match:\n";
|
||||
a += format_pattern_match_failure(diagnosis.diagnosis, indent + " ");
|
||||
}
|
||||
return indent + a;
|
||||
}
|
||||
|
||||
function do_test_pending() {
|
||||
++_tests_pending;
|
||||
|
||||
_dump(
|
||||
"TEST-INFO | (robocop_head.js) | test " + _tests_pending + " pending\n"
|
||||
);
|
||||
}
|
||||
|
||||
function do_test_finished() {
|
||||
_dump(
|
||||
"TEST-INFO | (robocop_head.js) | test " + _tests_pending + " finished\n"
|
||||
);
|
||||
|
||||
if (--_tests_pending == 0) {
|
||||
_do_execute_cleanup();
|
||||
_do_quit();
|
||||
}
|
||||
}
|
||||
|
||||
function do_get_file(path, allowNonexistent) {
|
||||
try {
|
||||
let lf = Components.classes["@mozilla.org/file/directory_service;1"]
|
||||
.getService(Components.interfaces.nsIProperties)
|
||||
.get("CurWorkD", Components.interfaces.nsIFile);
|
||||
|
||||
let bits = path.split("/");
|
||||
for (let i = 0; i < bits.length; i++) {
|
||||
if (bits[i]) {
|
||||
if (bits[i] == "..") {
|
||||
lf = lf.parent;
|
||||
} else {
|
||||
lf.append(bits[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!allowNonexistent && !lf.exists()) {
|
||||
// Not using do_throw(): caller will continue.
|
||||
var stack = Components.stack.caller;
|
||||
_dump(
|
||||
"TEST-UNEXPECTED-FAIL | " +
|
||||
stack.filename +
|
||||
" | [" +
|
||||
stack.name +
|
||||
" : " +
|
||||
stack.lineNumber +
|
||||
"] " +
|
||||
lf.path +
|
||||
" does not exist\n"
|
||||
);
|
||||
}
|
||||
|
||||
return lf;
|
||||
} catch (ex) {
|
||||
do_throw(ex.toString(), Components.stack.caller);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
// do_get_cwd() isn't exactly self-explanatory, so provide a helper
|
||||
function do_get_cwd() {
|
||||
return do_get_file("");
|
||||
}
|
||||
|
||||
function do_load_manifest(path) {
|
||||
var lf = do_get_file(path);
|
||||
const nsIComponentRegistrar = Components.interfaces.nsIComponentRegistrar;
|
||||
do_check_true(Components.manager instanceof nsIComponentRegistrar);
|
||||
Components.manager.autoRegister(lf);
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a function that will run when the test harness is done running all
|
||||
* tests.
|
||||
*
|
||||
* @param aFunction
|
||||
* The function to be called when the test harness has finished running.
|
||||
*/
|
||||
function do_register_cleanup(func) {
|
||||
_dump(
|
||||
"TEST-INFO | " +
|
||||
_TEST_FILE +
|
||||
" | " +
|
||||
(_gRunningTest ? _gRunningTest.name + " " : "") +
|
||||
"registering cleanup function."
|
||||
);
|
||||
|
||||
_cleanupFunctions.push(func);
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute a function when the test harness is done running all tests.
|
||||
*/
|
||||
function _do_execute_cleanup() {
|
||||
let func;
|
||||
while ((func = _cleanupFunctions.pop())) {
|
||||
_dump("TEST-INFO | " + _TEST_FILE + " | executing cleanup function.");
|
||||
func();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a test function to the list of tests that are to be run asynchronously.
|
||||
*
|
||||
* Each test function must call run_next_test() when it's done. Test files
|
||||
* should call run_next_test() in their run_test function to execute all
|
||||
* async tests.
|
||||
*
|
||||
* @return the test function that was passed in.
|
||||
*/
|
||||
var _gTests = [];
|
||||
function add_test(func) {
|
||||
_gTests.push([false, func]);
|
||||
return func;
|
||||
}
|
||||
|
||||
// We lazy import Task.jsm so we don't incur a run-time penalty for all tests.
|
||||
var _Task;
|
||||
|
||||
/**
|
||||
* Add a test function which is a Task function.
|
||||
*
|
||||
* Task functions are functions fed into Task.jsm's Task.spawn(). They are
|
||||
* generators that emit promises.
|
||||
*
|
||||
* If an exception is thrown, a do_check_* comparison fails, or if a rejected
|
||||
* promise is yielded, the test function aborts immediately and the test is
|
||||
* reported as a failure.
|
||||
*
|
||||
* Unlike add_test(), there is no need to call run_next_test(). The next test
|
||||
* will run automatically as soon the task function is exhausted. To trigger
|
||||
* premature (but successful) termination of the function, simply return or
|
||||
* throw a Task.Result instance.
|
||||
*
|
||||
* Example usage:
|
||||
*
|
||||
* add_task(function* test() {
|
||||
* let result = yield Promise.resolve(true);
|
||||
*
|
||||
* do_check_true(result);
|
||||
*
|
||||
* let secondary = yield someFunctionThatReturnsAPromise(result);
|
||||
* do_check_eq(secondary, "expected value");
|
||||
* });
|
||||
*
|
||||
* add_task(function* test_early_return() {
|
||||
* let result = yield somethingThatReturnsAPromise();
|
||||
*
|
||||
* if (!result) {
|
||||
* // Test is ended immediately, with success.
|
||||
* return;
|
||||
* }
|
||||
*
|
||||
* do_check_eq(result, "foo");
|
||||
* });
|
||||
*/
|
||||
function add_task(func) {
|
||||
if (!_Task) {
|
||||
let ns = {};
|
||||
_Task = Components.utils.import("resource://testing-common/Task.jsm", ns)
|
||||
.Task;
|
||||
}
|
||||
|
||||
_gTests.push([true, func]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs the next test function from the list of async tests.
|
||||
*/
|
||||
var _gRunningTest = null;
|
||||
var _gTestIndex = 0; // The index of the currently running test.
|
||||
function run_next_test() {
|
||||
function _run_next_test() {
|
||||
if (_gTestIndex < _gTests.length) {
|
||||
do_test_pending();
|
||||
let _isTask;
|
||||
[_isTask, _gRunningTest] = _gTests[_gTestIndex++];
|
||||
_dump("TEST-INFO | " + _TEST_FILE + " | Starting " + _gRunningTest.name);
|
||||
|
||||
if (_isTask) {
|
||||
_Task
|
||||
.spawn(_gRunningTest)
|
||||
.then(run_next_test, do_report_unexpected_exception);
|
||||
} else {
|
||||
// Exceptions do not kill asynchronous tests, so they'll time out.
|
||||
try {
|
||||
_gRunningTest();
|
||||
} catch (e) {
|
||||
do_throw(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// For sane stacks during failures, we execute this code soon, but not now.
|
||||
// We do this now, before we call do_test_finished(), to ensure the pending
|
||||
// counter (_tests_pending) never reaches 0 while we still have tests to run
|
||||
// (do_execute_soon bumps that counter).
|
||||
do_execute_soon(_run_next_test);
|
||||
|
||||
if (_gRunningTest !== null) {
|
||||
// Close the previous test do_test_pending call.
|
||||
do_test_finished();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* End of code adapted from xpcshell head.js
|
||||
*/
|
||||
|
||||
/**
|
||||
* JavaBridge facilitates communication between Java and JS. See
|
||||
* JavascriptBridge.java for the corresponding JavascriptBridge and docs.
|
||||
*/
|
||||
|
||||
function JavaBridge(obj) {
|
||||
this._EVENT_TYPE = "Robocop:JS";
|
||||
this._JAVA_EVENT_TYPE = "Robocop:Java";
|
||||
this._target = obj;
|
||||
// The number of replies needed to answer all outstanding sync calls.
|
||||
this._repliesNeeded = 0;
|
||||
this._EventDispatcher.registerListener(this, this._EVENT_TYPE);
|
||||
|
||||
this._sendMessage("notify-loaded", []);
|
||||
}
|
||||
|
||||
JavaBridge.prototype = {
|
||||
_Services: Components.utils.import("resource://gre/modules/Services.jsm", {})
|
||||
.Services,
|
||||
|
||||
_EventDispatcher: Components.utils.import(
|
||||
"resource://gre/modules/Messaging.jsm",
|
||||
{}
|
||||
).EventDispatcher.instance,
|
||||
|
||||
_getArgs: function(args) {
|
||||
let out = {
|
||||
length: Math.max(0, args.length - 1),
|
||||
};
|
||||
for (let i = 1; i < args.length; i++) {
|
||||
out[i - 1] = args[i];
|
||||
}
|
||||
return out;
|
||||
},
|
||||
|
||||
_sendMessage: function(innerType, args) {
|
||||
this._EventDispatcher.dispatch(this._JAVA_EVENT_TYPE, {
|
||||
innerType: innerType,
|
||||
method: args[0],
|
||||
args: this._getArgs(args),
|
||||
});
|
||||
},
|
||||
|
||||
onEvent: function(event, message, callback) {
|
||||
if (typeof SpecialPowers === "object") {
|
||||
message = SpecialPowers.wrap(message);
|
||||
}
|
||||
if (message.innerType === "sync-reply") {
|
||||
// Reply to our Javascript-to-Java sync call
|
||||
this._repliesNeeded--;
|
||||
return;
|
||||
}
|
||||
// Call the corresponding method on the target
|
||||
try {
|
||||
this._target[message.method].apply(this._target, message.args);
|
||||
} catch (e) {
|
||||
do_report_unexpected_exception(e, "Failed to call " + message.method);
|
||||
}
|
||||
if (message.innerType === "sync-call") {
|
||||
// Reply for sync message
|
||||
this._sendMessage("sync-reply", [message.method]);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Synchronously call a method in Java,
|
||||
* given the method name followed by a list of arguments.
|
||||
*/
|
||||
syncCall: function(methodName /* , ... */) {
|
||||
this._sendMessage("sync-call", arguments);
|
||||
let thread = this._Services.tm.currentThread;
|
||||
let initialReplies = this._repliesNeeded;
|
||||
// Need one more reply to answer the current sync call.
|
||||
this._repliesNeeded++;
|
||||
// Wait for the reply to arrive. Normally we would not want to
|
||||
// spin the event loop, but here we're in a test and our API
|
||||
// specifies a synchronous call, so we spin the loop to wait for
|
||||
// the call to finish.
|
||||
this._Services.tm.spinEventLoopUntil(
|
||||
() => this._repliesNeeded <= initialReplies
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Asynchronously call a method in Java,
|
||||
* given the method name followed by a list of arguments.
|
||||
*/
|
||||
asyncCall: function(methodName /* , ... */) {
|
||||
this._sendMessage("async-call", arguments);
|
||||
},
|
||||
|
||||
/**
|
||||
* Disconnect with Java.
|
||||
*/
|
||||
disconnect: function() {
|
||||
this._EventDispatcher.unregisterListener(this, this._EVENT_TYPE);
|
||||
},
|
||||
};
|
@ -1,254 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Robocop Input</title>
|
||||
</head>
|
||||
<body>
|
||||
<p>Input: <input id="input" type="text"></p>
|
||||
<p>Text area: <textarea id="text-area"></textarea></p>
|
||||
<p>Content editable: <div id="content-editable" contentEditable="true"></div></p>
|
||||
<p>Design mode: <iframe id="design-mode" srcdoc="<html><body></body></html>"></iframe></p>
|
||||
<p>Resetting input: <input id="resetting-input" type="text"></p>
|
||||
<p>Hiding input: <input id="hiding-input" type="text"></p>
|
||||
<script type="application/javascript" src="robocop_head.js"></script>
|
||||
<script type="application/javascript">
|
||||
let input = document.getElementById("input");
|
||||
let textArea = document.getElementById("text-area");
|
||||
let contentEditable = document.getElementById("content-editable");
|
||||
|
||||
let designMode = document.getElementById("design-mode");
|
||||
try {
|
||||
designMode.contentDocument.designMode = "on";
|
||||
} catch (e) {
|
||||
// Setting designMode above sometimes fails, so try again later.
|
||||
setTimeout(function() { designMode.contentDocument.designMode = "on"; }, 0);
|
||||
}
|
||||
|
||||
// Add key listeners to trigger dummy key synthesis.
|
||||
input.addEventListener("keydown", function() {});
|
||||
textArea.addEventListener("keydown", function() {});
|
||||
contentEditable.addEventListener("keydown", function() {});
|
||||
|
||||
// An input that resets the editor on every input by resetting the value property.
|
||||
let resetting_input = document.getElementById("resetting-input");
|
||||
resetting_input.addEventListener("input", function() {
|
||||
this.value = this.value;
|
||||
});
|
||||
|
||||
// An input that hides on input.
|
||||
let hiding_input = document.getElementById("hiding-input");
|
||||
hiding_input.addEventListener("keydown", function(e) {
|
||||
if (e.key === "!") { // '!' key event as sent by testInputConnection.java.
|
||||
this.value = "";
|
||||
this.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
let getEditor, setValue, setSelection;
|
||||
|
||||
let events_log;
|
||||
function log_event(event) {
|
||||
switch (event.type) {
|
||||
case "compositionstart":
|
||||
events_log += "<";
|
||||
break;
|
||||
case "compositionupdate":
|
||||
events_log += "=";
|
||||
break;
|
||||
case "compositionend":
|
||||
events_log += ">";
|
||||
break;
|
||||
case "selectionchange":
|
||||
events_log += "|";
|
||||
break;
|
||||
default:
|
||||
events_log += "?";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
let key_log;
|
||||
function get_key_metastate(event) {
|
||||
return (event.ctrlKey ? "C" : "c") +
|
||||
(event.altKey ? "A" : "a") +
|
||||
(event.shiftKey ? "S" : "s") +
|
||||
(event.metaKey ? "M" : "m");
|
||||
}
|
||||
|
||||
function log_key(event) {
|
||||
switch (event.type) {
|
||||
case "keydown":
|
||||
case "keypress":
|
||||
case "keyup":
|
||||
key_log += `${event.type}:${event.key},${get_key_metastate(event)};`;
|
||||
break;
|
||||
default:
|
||||
key_log += "unknown;";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
function get_event_target() {
|
||||
var editor = getEditor();
|
||||
var parent = SpecialPowers.unwrap(editor.rootElement.parentElement);
|
||||
if (parent instanceof HTMLInputElement || parent instanceof HTMLTextAreaElement) {
|
||||
// "selectionchange" is only dispatched to the element itself,
|
||||
// so use the element as the target instead of using the document.
|
||||
return parent;
|
||||
}
|
||||
return editor.document;
|
||||
}
|
||||
|
||||
let test = {
|
||||
focus_input: function(value) {
|
||||
getEditor = function() {
|
||||
return SpecialPowers.wrap(input).editor;
|
||||
};
|
||||
setValue = function(val) {
|
||||
input.value = val;
|
||||
};
|
||||
setSelection = function(pos) {
|
||||
input.setSelectionRange(pos, pos);
|
||||
};
|
||||
setValue(value);
|
||||
input.focus();
|
||||
},
|
||||
|
||||
focus_text_area: function(value) {
|
||||
getEditor = function() {
|
||||
return SpecialPowers.wrap(textArea).editor;
|
||||
};
|
||||
setValue = function(val) {
|
||||
textArea.value = val;
|
||||
};
|
||||
setSelection = function(pos) {
|
||||
textArea.setSelectionRange(pos, pos);
|
||||
};
|
||||
setValue(value);
|
||||
textArea.focus();
|
||||
},
|
||||
|
||||
focus_content_editable: function(value) {
|
||||
getEditor = function() {
|
||||
return SpecialPowers.wrap(window).docShell.editor;
|
||||
};
|
||||
setValue = function(val) {
|
||||
// eslint-disable-next-line no-unsanitized/property
|
||||
contentEditable.innerHTML = val;
|
||||
};
|
||||
setSelection = function(pos) {
|
||||
window.getSelection().collapse(contentEditable.firstChild, pos);
|
||||
};
|
||||
setValue(value);
|
||||
contentEditable.focus();
|
||||
},
|
||||
|
||||
focus_design_mode: function(value) {
|
||||
getEditor = function() {
|
||||
return SpecialPowers.wrap(designMode.contentWindow).docShell.editor;
|
||||
};
|
||||
setValue = function(val) {
|
||||
// eslint-disable-next-line no-unsanitized/property
|
||||
designMode.contentDocument.body.innerHTML = val;
|
||||
};
|
||||
setSelection = function(pos) {
|
||||
designMode.contentWindow.getSelection().collapse(
|
||||
designMode.contentDocument.body.firstChild, pos);
|
||||
};
|
||||
setValue(value);
|
||||
designMode.contentWindow.focus();
|
||||
designMode.contentDocument.body.focus();
|
||||
},
|
||||
|
||||
test_reflush_changes: function() {
|
||||
do_check_true(getEditor().composing);
|
||||
|
||||
// Ending the composition then setting the input value triggers the bug.
|
||||
getEditor().forceCompositionEnd();
|
||||
setValue("good"); // Value that testInputConnection.java expects.
|
||||
setSelection(4);
|
||||
},
|
||||
|
||||
test_set_selection: function() {
|
||||
do_check_true(getEditor().composing);
|
||||
|
||||
// Ending the composition then setting the selection triggers the bug.
|
||||
getEditor().forceCompositionEnd();
|
||||
setSelection(3); // Offsets that testInputConnection.java expects.
|
||||
},
|
||||
|
||||
start_events_log: function() {
|
||||
// Reset the log
|
||||
events_log = "";
|
||||
|
||||
let target = get_event_target();
|
||||
target.addEventListener("compositionstart", log_event);
|
||||
target.addEventListener("compositionupdate", log_event);
|
||||
target.addEventListener("compositionend", log_event);
|
||||
target.addEventListener("selectionchange", log_event);
|
||||
},
|
||||
|
||||
end_events_log: function() {
|
||||
java.asyncCall("setEventsLog", events_log);
|
||||
|
||||
let target = get_event_target();
|
||||
target.removeEventListener("compositionstart", log_event);
|
||||
target.removeEventListener("compositionupdate", log_event);
|
||||
target.removeEventListener("compositionend", log_event);
|
||||
target.removeEventListener("selectionchange", log_event);
|
||||
},
|
||||
|
||||
start_key_log: function() {
|
||||
// Reset the log
|
||||
key_log = "";
|
||||
|
||||
let target = get_event_target();
|
||||
target.addEventListener("keydown", log_key);
|
||||
target.addEventListener("keypress", log_key);
|
||||
target.addEventListener("keyup", log_key);
|
||||
},
|
||||
|
||||
end_key_log: function() {
|
||||
java.asyncCall("setKeyLog", key_log);
|
||||
|
||||
let target = get_event_target();
|
||||
target.removeEventListener("keydown", log_key);
|
||||
target.removeEventListener("keypress", log_key);
|
||||
target.removeEventListener("keyup", log_key);
|
||||
},
|
||||
|
||||
test_bug1123514: function() {
|
||||
document.activeElement.addEventListener("input", function() {
|
||||
// Only works on input and textarea.
|
||||
if (this.value === "b") {
|
||||
this.value = "abc";
|
||||
}
|
||||
}, {once: true});
|
||||
},
|
||||
|
||||
focus_resetting_input: function(val) {
|
||||
resetting_input.value = val;
|
||||
resetting_input.focus();
|
||||
},
|
||||
|
||||
focus_hiding_input: function(val) {
|
||||
hiding_input.value = val;
|
||||
hiding_input.style.display = "";
|
||||
hiding_input.focus();
|
||||
},
|
||||
|
||||
blur_hiding_input: function() {
|
||||
hiding_input.blur();
|
||||
},
|
||||
|
||||
finish_test: function() {
|
||||
java.disconnect();
|
||||
},
|
||||
};
|
||||
|
||||
var java = new JavaBridge(test);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
@ -1,20 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Mochitest Robotium Javascript Test Harness</title>
|
||||
<link rel="author" title="nalexander" href="mailto:nalexander@mozilla.com">
|
||||
<script type="application/javascript" src="robocop_testharness.js"></script>
|
||||
<script>
|
||||
var param = /[&?]path=([^&]+)/.exec(location.search);
|
||||
if (param) {
|
||||
// We encode so that absolute URLs can be provided. Since the
|
||||
// encoding of a relative filename is just the filename, no special
|
||||
// processing is needed for the most common case.
|
||||
var src = decodeURIComponent(param[1]);
|
||||
document.title = src;
|
||||
|
||||
// Provided by robocop_testharness.js.
|
||||
testOneFile(src);
|
||||
}
|
||||
</script>
|
||||
</head>
|
@ -1,12 +0,0 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Link</title>
|
||||
<meta name="viewport" content="initial-scale=1.0"/>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body style="margin: 0; padding: 0">
|
||||
<div style="text-align: center; margin: 0; padding: 0">
|
||||
<a style="font-size: 60px" href="robocop_slow_loading.html">Slow Loading Page</a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -1,21 +0,0 @@
|
||||
<html>
|
||||
<script>
|
||||
function login() {
|
||||
document.login.username.value = "Test1";
|
||||
document.login.password.value = "Test2";
|
||||
document.getElementById("submit").click();
|
||||
}
|
||||
</script>
|
||||
<head>
|
||||
<title>Robocop Login</title>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body onload="login()">
|
||||
<h2>User Login </h2>
|
||||
<form name="login" method="post" action="robocop_blank_01.html">
|
||||
Username: <input type="text" name="username" id="username"><br>
|
||||
Password: <input type="password" name="password" id="password"><br>
|
||||
<input type="submit" id="submit" name="submit" value="Login!">
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
@ -1,21 +0,0 @@
|
||||
<html>
|
||||
<script>
|
||||
function login() {
|
||||
document.login.username.value = "Test2";
|
||||
document.login.password.value = "Test2";
|
||||
document.getElementById("submit").click();
|
||||
}
|
||||
</script>
|
||||
<head>
|
||||
<title>Robocop Login</title>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body onload="login()">
|
||||
<h2>User Login </h2>
|
||||
<form name="login" method="post" action="robocop_blank_02.html">
|
||||
Username: <input type="text" name="username" id="username"><br>
|
||||
Password: <input type="password" name="password" id="password"><br>
|
||||
<input type="submit" id="submit" name="submit" value="Login!">
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
@ -1,51 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<audio id="testAudio" src="audio.ogg" loop></audio>
|
||||
<video id="testMediaWithSilentAudioTrack" src="silent_audio_track.webm" loop></audio>
|
||||
<video id="testMediaWithoutAudioTrack" src="no_audio_track.webm" loop></audio>
|
||||
<script type="application/javascript" src="robocop_head.js"></script>
|
||||
<script type="text/javascript">
|
||||
var audio = document.getElementById("testAudio");
|
||||
var mediaWithSilentAudioTrack = document.getElementById("testMediaWithSilentAudioTrack");
|
||||
var mediaWithoutAudioTrack = document.getElementById("testMediaWithoutAudioTrack");
|
||||
|
||||
let test = {
|
||||
play_audio: function() {
|
||||
audio.play();
|
||||
},
|
||||
|
||||
pause_audio: function() {
|
||||
audio.pause();
|
||||
},
|
||||
|
||||
adjust_audio_volume: function(volume) {
|
||||
audio.volume = volume;
|
||||
},
|
||||
|
||||
adjust_audio_muted: function(muted) {
|
||||
audio.muted = muted;
|
||||
},
|
||||
|
||||
finish_test: function() {
|
||||
java.disconnect();
|
||||
},
|
||||
|
||||
play_media_with_silent_audio_track: function() {
|
||||
mediaWithSilentAudioTrack.play();
|
||||
},
|
||||
|
||||
pause_media_with_silent_audio_track: function() {
|
||||
mediaWithSilentAudioTrack.pause();
|
||||
},
|
||||
|
||||
play_media_without_audio_track: function() {
|
||||
mediaWithoutAudioTrack.play();
|
||||
},
|
||||
|
||||
pause_media_without_audio_track: function() {
|
||||
mediaWithoutAudioTrack.pause();
|
||||
},
|
||||
};
|
||||
|
||||
var java = new JavaBridge(test);
|
||||
|
||||
</script>
|
@ -1,9 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<audio id="testAudio" src="audio.ogg" loop></audio>
|
||||
<script type="text/javascript">
|
||||
var audio = document.getElementById("testAudio");
|
||||
audio.oncanplay = function() {
|
||||
audio.oncanplay = null;
|
||||
audio.play();
|
||||
};
|
||||
</script>
|
@ -1,8 +0,0 @@
|
||||
<html manifest="robocop_offline">
|
||||
<head>
|
||||
<title>Robocop offline storage</title>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
@ -1,13 +0,0 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Picture Link</title>
|
||||
<link rel="shortcut icon" href="data:image/gif;base64,R0lGODlhCwALAIAAAAAA3pn/ZiH5BAEAAAEALAAAAAALAAsAAAIUhA+hkcuO4lmNVindo7qyrIXiGBYAOw==" />
|
||||
<meta name="viewport" content="initial-scale=1.0"/>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body style="margin: 0; padding: 0">
|
||||
<div style="text-align: center; margin: 0; padding: 0">
|
||||
<a style="font-size: 60px" href="robocop_blank_02.html"><img src="Firefox.jpg"></img></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -1,12 +0,0 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Page creating a popup</title>
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript">
|
||||
window.open("data:text/plain;charset=utf-8,a", "a");
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
@ -1,11 +0,0 @@
|
||||
<html>
|
||||
<header>
|
||||
<title> Robocop Search Engine </title>
|
||||
</header>
|
||||
<body>
|
||||
<form method="get" action="http://www.google.com/search">
|
||||
<input type="text" name="q" style="width:300px; height:500px;" maxlength="255" value="" />
|
||||
<input type="submit" value="Google Search" />
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
@ -1,23 +0,0 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Slow Loading</title>
|
||||
<meta name="viewport" content="initial-scale=1.0"/>
|
||||
<meta charset="utf-8">
|
||||
<script type="text/javascript">
|
||||
|
||||
// Busy wait (There's no sleep function in JavaScript)
|
||||
var waitForMilliseconds = 10000;
|
||||
var start = new Date();
|
||||
var now = null;
|
||||
do {
|
||||
now = new Date();
|
||||
} while (now - start < waitForMilliseconds);
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body style="margin: 0; padding: 0">
|
||||
<div style="text-align: center; margin: 0; padding: 0">
|
||||
<h1>This page is loading very slow.</h1>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -1,32 +0,0 @@
|
||||
/**
|
||||
* Used with testSearchSuggestions.
|
||||
* Returns a set of pre-defined suggestions for given prefixes.
|
||||
*/
|
||||
|
||||
function handleRequest(request, response) {
|
||||
let query = request.queryString.match(/^query=(.*)$/)[1];
|
||||
query = decodeURIComponent(query).replace(/\+/g, " ");
|
||||
|
||||
let suggestMap = {
|
||||
"f": ["facebook", "fandango", "frys", "forever 21", "fafsa"],
|
||||
"fo": ["forever 21", "food network", "fox news", "foothill college", "fox"],
|
||||
"foo": ["food network", "foothill college", "foot locker", "footloose", "foo fighters"],
|
||||
"foo ": ["foo fighters", "foo bar", "foo bat", "foo bay"],
|
||||
"foo b": ["foo bar", "foo bat", "foo bay"],
|
||||
"foo ba": ["foo bar", "foo bat", "foo bay"],
|
||||
"foo bar": ["foo bar"]
|
||||
};
|
||||
|
||||
let suggestions = suggestMap[query];
|
||||
if (!suggestions)
|
||||
suggestions = [];
|
||||
suggestions = [query, suggestions];
|
||||
|
||||
/*
|
||||
* Sample result:
|
||||
* ["foo",["food network","foothill college","foot locker",...]]
|
||||
*/
|
||||
response.setHeader("Content-Type", "text/json", false);
|
||||
response.setHeader("Cache-Control", "no-cache", false);
|
||||
response.write(JSON.stringify(suggestions));
|
||||
}
|
@ -1,107 +0,0 @@
|
||||
// -*- indent-tabs-mode: nil; js-indent-level: 2 -*-
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
if (!("SpecialPowers" in window)) {
|
||||
dump(
|
||||
"Robocop robocop_testharness.js found SpecialPowers unavailable: reloading...\n"
|
||||
);
|
||||
setTimeout(() => {
|
||||
window.location.reload();
|
||||
}, 1000);
|
||||
}
|
||||
|
||||
function sendMessageToJava(message) {
|
||||
SpecialPowers.Services.androidBridge.dispatch(message.type, message);
|
||||
}
|
||||
|
||||
function _evalURI(uri, sandbox) {
|
||||
// We explicitly allow Cross-Origin requests, since it is useful for
|
||||
// testing, but we allow relative URLs by maintaining our baseURI.
|
||||
let req = new XMLHttpRequest();
|
||||
|
||||
let baseURI = SpecialPowers.Services.io.newURI(
|
||||
window.document.baseURI,
|
||||
window.document.characterSet
|
||||
);
|
||||
let theURI = SpecialPowers.Services.io.newURI(
|
||||
uri,
|
||||
window.document.characterSet,
|
||||
baseURI
|
||||
);
|
||||
|
||||
// We append a random slug to avoid caching: see
|
||||
// https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest#Bypassing_the_cache.
|
||||
req.open(
|
||||
"GET",
|
||||
theURI.spec +
|
||||
(/\?/.test(theURI.spec) ? "&slug=" : "?slug=") +
|
||||
new Date().getTime(),
|
||||
false
|
||||
);
|
||||
req.setRequestHeader("Cache-Control", "no-cache");
|
||||
req.setRequestHeader("Pragma", "no-cache");
|
||||
req.send();
|
||||
|
||||
return SpecialPowers.Cu.evalInSandbox(
|
||||
req.responseText,
|
||||
sandbox,
|
||||
"1.8",
|
||||
uri,
|
||||
1
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the Javascript file at `uri` in a testing sandbox populated
|
||||
* with the Javascript test harness.
|
||||
*
|
||||
* `uri` should be a String, relative (to window.document.baseURI) or
|
||||
* absolute.
|
||||
*
|
||||
* The Javascript test harness sends all output to Java via
|
||||
* Robocop:Java messages.
|
||||
*/
|
||||
function testOneFile(uri) {
|
||||
let HEAD_JS = ["head.js", "robocop_head.js"];
|
||||
|
||||
// System principal. This is dangerous, but this is test code that
|
||||
// should only run on developer and build farm machines, and the
|
||||
// test harness needs access to a lot of the Components API,
|
||||
// including Components.stack. Wrapping Components.stack in
|
||||
// SpecialPowers magic obfuscates stack traces wonderfully,
|
||||
// defeating much of the point of the test harness.
|
||||
let principal = SpecialPowers.Cc[
|
||||
"@mozilla.org/systemprincipal;1"
|
||||
].createInstance(SpecialPowers.Ci.nsIPrincipal);
|
||||
|
||||
let testScope = SpecialPowers.Cu.Sandbox(principal, {
|
||||
sandboxName: uri,
|
||||
wantGlobalProperties: ["ChromeUtils"],
|
||||
});
|
||||
|
||||
// Populate test environment with test harness prerequisites.
|
||||
testScope.SpecialPowers = SpecialPowers;
|
||||
testScope.Components = SpecialPowers.Components;
|
||||
testScope._TEST_FILE = uri;
|
||||
|
||||
// Output from robocop_head.js is fed, line by line, to this function.
|
||||
// We send any such output back to the Java Robocop harness.
|
||||
testScope.dump = function(str) {
|
||||
let message = { type: "Robocop:Java", innerType: "progress", message: str };
|
||||
sendMessageToJava(message);
|
||||
};
|
||||
|
||||
// Populate test environment with test harness. The symbols defined
|
||||
// above must be present before executing the test harness.
|
||||
for (script of HEAD_JS) {
|
||||
_evalURI(script, testScope);
|
||||
}
|
||||
|
||||
// Required to make tests/browser/chrome/head.js not notice that it isn't
|
||||
// running in a real Mochitest environment.
|
||||
testScope.info = testScope.do_print;
|
||||
|
||||
return _evalURI(uri, testScope);
|
||||
}
|
@ -1,27 +0,0 @@
|
||||
<html>
|
||||
<head>
|
||||
<title> Robocop Text Page </title>
|
||||
<meta name="viewport" content="initial-scale=1.0"/>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body>
|
||||
<p>Text taken from Wikipedia.org</p>
|
||||
<p> <b>Will be searching for this string:</b> Robocop 1 </p>
|
||||
<p>Mozilla is a free software community best known for producing the Firefox web browser. The Mozilla community uses, develops, spreads and supports Mozilla products and works to advance the goals of the Open Web described in the Mozilla Manifesto.[1] The community is supported institutionally by the Mozilla Foundation and its tax-paying subsidiary, the Mozilla Corporation.[2] </p>
|
||||
<div style='float: left; width: 100%; height: 500px; margin: 0; padding: 0; border: none'> </div>
|
||||
<p> <b>Will be searching for this string:</b> Robocop 2 </p>
|
||||
<p>In addition to the Firefox browser, Mozilla also produces Firefox Mobile, the Firefox OS mobile operating system, the bug tracking system Bugzilla and a number of other projects.</p>
|
||||
<div style='float: left; width: 200%; height: 500px; margin: 0; padding: 0; border: none'> </div>
|
||||
<p> <b>Will be searching for this string:</b> Robocop 3 </p>
|
||||
<p>On February 23, 1998, Netscape Communications Corporation created a project called Mozilla (after the original code name of the Netscape Navigator browser which — according to Pascal Finette — is a mashup of "Mosaic Killer") to co-ordinate the development of the Mozilla Application Suite, the open source version of Netscape's internet software, Netscape Communicator.[3][4] Jamie Zawinski says he came up with the name "Mozilla" at a Netscape staff meeting.[5][6] A small group of Netscape employees were tasked with coordination of the new community.<p>
|
||||
<div style='float: left; width: 100%; height: 500px; margin: 0; padding: 0; border: none'> </div>
|
||||
<p> <b>Will be searching for this string:</b> Robocop </p>
|
||||
<p>Originally, Mozilla aimed to be a technology provider for companies, such as Netscape, who would commercialize their open source code.[7] When AOL (Netscape's parent company) drastically scaled back its involvement with Mozilla in July 2003, the Mozilla Foundation was launched as the legal steward of the project.[8] Soon after, Mozilla deprecated the Mozilla Suite in favor of creating independent applications for each function, primarily the Firefox web browser and the Thunderbird email client, and moved to supply them direct to the public.[9]<p>
|
||||
<div style='float: left; width: 100%; height: 200px; margin: 0; padding: 0; border: none'> </div>
|
||||
<p> <b>Will be searching for this string:</b> Robocop </p>
|
||||
<p>Recently, Mozilla's activities have expanded to include Firefox on mobile platforms (primarily Android),[10] a mobile OS called Firefox OS,[11] a web-based identity system called Mozilla Persona and a marketplace for HTML5 applications.[12]</p>
|
||||
<div style='float: left; width: 100%; height: 200px; margin: 0; padding: 0; border: none'> </div>
|
||||
<p> <b>Will be searching for this string:</b> Robocop </p>
|
||||
<p>In a report released in November of 2012, Mozilla reported that their total revenue for 2011 was $163 million, which was up 33% from $123 million in 2010. Mozilla noted that roughly 85% of their revenue comes from their contract with Google. [13]</p>
|
||||
</body>
|
||||
</html>
|
@ -1,31 +0,0 @@
|
||||
const { EventDispatcher } = ChromeUtils.import(
|
||||
"resource://gre/modules/Messaging.jsm"
|
||||
);
|
||||
const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
|
||||
|
||||
this.roboextender = class extends ExtensionAPI {
|
||||
onStartup() {
|
||||
let aomStartup = Cc[
|
||||
"@mozilla.org/addons/addon-manager-startup;1"
|
||||
].getService(Ci.amIAddonManagerStartup);
|
||||
const manifestURI = Services.io.newURI(
|
||||
"manifest.json",
|
||||
null,
|
||||
this.extension.rootURI
|
||||
);
|
||||
const targetURL = this.extension.rootURI.resolve("base/");
|
||||
this.chromeHandle = aomStartup.registerChrome(manifestURI, [
|
||||
["content", "roboextender", targetURL],
|
||||
]);
|
||||
|
||||
EventDispatcher.instance.registerListener(function(event, data, callback) {
|
||||
dump("Robocop:Quit received -- requesting quit");
|
||||
Services.startup.quit(Ci.nsIAppStartup.eForceQuit);
|
||||
}, "Robocop:Quit");
|
||||
}
|
||||
|
||||
onShutdown() {
|
||||
this.chromeHandle.destruct();
|
||||
this.chromeHandle = null;
|
||||
}
|
||||
};
|
@ -1,37 +0,0 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>HomeBanner test page</title>
|
||||
<meta name="viewport" content="initial-scale=1.0"/>
|
||||
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script>
|
||||
<script type="application/javascript">
|
||||
const {EventDispatcher} = ChromeUtils.import("resource://gre/modules/Messaging.jsm");
|
||||
ChromeUtils.import("resource://gre/modules/Services.jsm");
|
||||
const {Home} = ChromeUtils.import("resource://gre/modules/Home.jsm");
|
||||
|
||||
const TEXT = "The quick brown fox jumps over the lazy dog.";
|
||||
|
||||
function start() {
|
||||
var test = location.hash.substring(1);
|
||||
window[test]();
|
||||
}
|
||||
|
||||
var messageId;
|
||||
|
||||
function addMessage() {
|
||||
messageId = Home.banner.add({
|
||||
text: TEXT,
|
||||
onshown: function() {
|
||||
EventDispatcher.instance.sendRequest({ type: "TestHomeBanner:MessageShown" });
|
||||
},
|
||||
ondismiss: function() {
|
||||
EventDispatcher.instance.sendRequest({ type: "TestHomeBanner:MessageDismissed" });
|
||||
},
|
||||
});
|
||||
EventDispatcher.instance.sendRequest({ type: "TestHomeBanner:MessageAdded" });
|
||||
}
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body onload="start();">
|
||||
</body>
|
||||
</html>
|
@ -1,51 +0,0 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>IconGrid test page</title>
|
||||
<meta name="viewport" content="initial-scale=1.0"/>
|
||||
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script>
|
||||
<script type="application/javascript">
|
||||
ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||
ChromeUtils.import("resource://gre/modules/Services.jsm");
|
||||
const {Prompt} = ChromeUtils.import("resource://gre/modules/Prompt.jsm");
|
||||
|
||||
function start() {
|
||||
var test = location.hash.substring(1);
|
||||
window[test]();
|
||||
}
|
||||
|
||||
function test1() {
|
||||
var p = new Prompt({
|
||||
title: "Prompt 1",
|
||||
buttons: [
|
||||
"OK",
|
||||
],
|
||||
}).addIconGrid({
|
||||
items: [
|
||||
{ iconUri: "drawable://alert_camera", name: "Icon 1", selected: true },
|
||||
{ iconUri: "drawable://alert_download", name: "Icon 2" },
|
||||
{ iconUri: "drawable://icon", name: "Icon 3" },
|
||||
{ iconUri: "drawable://icon", name: "Icon 4" },
|
||||
{ iconUri: "drawable://icon", name: "Icon 5" },
|
||||
{ iconUri: "drawable://icon", name: "Icon 6" },
|
||||
{ iconUri: "drawable://icon", name: "Icon 7" },
|
||||
{ iconUri: "drawable://icon", name: "Icon 8" },
|
||||
{ iconUri: "drawable://icon", name: "Icon 9" },
|
||||
{ iconUri: "drawable://icon", name: "Icon 10" },
|
||||
{ iconUri: "drawable://icon", name: "Icon 11" },
|
||||
],
|
||||
});
|
||||
p.show(function(data) {
|
||||
sendResult(data.icongrid0 == 10, "Got result " + data.icongrid0);
|
||||
});
|
||||
}
|
||||
|
||||
function sendResult(pass, message) {
|
||||
setTimeout(function() {
|
||||
alert((pass ? "PASS " : "FAIL ") + message);
|
||||
}, 1000);
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<body onload="start();">
|
||||
</body>
|
||||
</html>
|
@ -1,22 +0,0 @@
|
||||
{
|
||||
"manifest_version": 2,
|
||||
"name": "Robocop Extender",
|
||||
"version": "2.0",
|
||||
|
||||
"applications": {
|
||||
"gecko": {
|
||||
"id": "roboextender@mozilla.org"
|
||||
}
|
||||
},
|
||||
"permissions": [],
|
||||
"experiment_apis": {
|
||||
"roboextender": {
|
||||
"schema": "schema.json",
|
||||
"parent": {
|
||||
"scopes": ["addon_parent"],
|
||||
"script": "api.js",
|
||||
"events": ["startup"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,12 +0,0 @@
|
||||
# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
|
||||
# vim: set filetype=python:
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
TEST_HARNESS_FILES.testing.mochitest.extensions['roboextender@mozilla.org'] += [
|
||||
'api.js',
|
||||
'base/**',
|
||||
'manifest.json',
|
||||
'schema.json',
|
||||
]
|
@ -1 +0,0 @@
|
||||
[]
|
Binary file not shown.
@ -1,5 +0,0 @@
|
||||
function handleRequest(request, response)
|
||||
{
|
||||
response.setStatusLine(request.httpVersion, 301, "Moved Permanently");
|
||||
response.setHeader("Location", request.queryString, false);
|
||||
}
|
@ -1,164 +0,0 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
package org.mozilla.gecko;
|
||||
|
||||
import org.mozilla.gecko.util.GeckoBundle;
|
||||
|
||||
import android.database.Cursor;
|
||||
|
||||
public interface Actions {
|
||||
|
||||
/** Special keys supported by sendSpecialKey() */
|
||||
public enum SpecialKey {
|
||||
DOWN,
|
||||
UP,
|
||||
LEFT,
|
||||
RIGHT,
|
||||
ENTER,
|
||||
MENU,
|
||||
DELETE,
|
||||
}
|
||||
|
||||
public interface EventExpecter {
|
||||
/** Blocks until the event has been received. Subsequent calls will return immediately. */
|
||||
public void blockForEvent();
|
||||
public void blockForEvent(long millis, boolean failOnTimeout);
|
||||
|
||||
/** Blocks until the event has been received and returns data associated with the event. */
|
||||
public String blockForEventData();
|
||||
|
||||
/** Blocks until the event has been received and returns data associated with the event. */
|
||||
public GeckoBundle blockForBundle();
|
||||
|
||||
/**
|
||||
* Blocks until the event has been received, or until the timeout has been exceeded.
|
||||
* Returns the data associated with the event, if applicable.
|
||||
*/
|
||||
public String blockForEventDataWithTimeout(long millis);
|
||||
|
||||
/**
|
||||
* Blocks until the event has been received, or until the timeout has been exceeded.
|
||||
* Returns the data associated with the event, if applicable.
|
||||
*/
|
||||
public GeckoBundle blockForBundleWithTimeout(long millis);
|
||||
|
||||
/** Polls to see if the event has been received. Once this returns true, subsequent calls will also return true. */
|
||||
public boolean eventReceived();
|
||||
|
||||
/** Stop listening for events. */
|
||||
public void unregisterListener();
|
||||
}
|
||||
|
||||
public interface RepeatedEventExpecter extends EventExpecter {
|
||||
/** Blocks until at least one event has been received, and no events have been received in the last <code>millis</code> milliseconds. */
|
||||
public void blockUntilClear(long millis);
|
||||
}
|
||||
|
||||
public enum EventType {
|
||||
GECKO,
|
||||
UI,
|
||||
BACKGROUND
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends an event to the global EventDispatcher instance.
|
||||
*
|
||||
* @param event The event type
|
||||
* @param data Data associated with the event
|
||||
*/
|
||||
void sendGlobalEvent(String event, GeckoBundle data);
|
||||
|
||||
/**
|
||||
* Sends an event to the GeckoApp-specific EventDispatcher instance.
|
||||
*
|
||||
* @param event The event type
|
||||
* @param data Data associated with the event
|
||||
*/
|
||||
void sendWindowEvent(String event, GeckoBundle data);
|
||||
|
||||
public interface PrefWaiter {
|
||||
boolean isFinished();
|
||||
void waitForFinish();
|
||||
void waitForFinish(long timeoutMillis, boolean failOnTimeout);
|
||||
}
|
||||
|
||||
public abstract static class PrefHandlerBase implements PrefsHelper.PrefHandler {
|
||||
/* package */ Assert asserter;
|
||||
|
||||
@Override // PrefsHelper.PrefHandler
|
||||
public void prefValue(String pref, boolean value) {
|
||||
asserter.ok(false, "Unexpected pref callback", "");
|
||||
}
|
||||
|
||||
@Override // PrefsHelper.PrefHandler
|
||||
public void prefValue(String pref, int value) {
|
||||
asserter.ok(false, "Unexpected pref callback", "");
|
||||
}
|
||||
|
||||
@Override // PrefsHelper.PrefHandler
|
||||
public void prefValue(String pref, String value) {
|
||||
asserter.ok(false, "Unexpected pref callback", "");
|
||||
}
|
||||
|
||||
@Override // PrefsHelper.PrefHandler
|
||||
public void finish() {
|
||||
}
|
||||
}
|
||||
|
||||
PrefWaiter getPrefs(String[] prefNames, PrefHandlerBase handler);
|
||||
void setPref(String pref, Object value, boolean flush);
|
||||
PrefWaiter addPrefsObserver(String[] prefNames, PrefHandlerBase handler);
|
||||
void removePrefsObserver(PrefWaiter handler);
|
||||
|
||||
/**
|
||||
* Listens for an event on the global EventDispatcher instance.
|
||||
* The returned object can be used to test if the event has been
|
||||
* received. Note that only one event is listened for.
|
||||
*
|
||||
* @param type The thread type for the event
|
||||
* @param event The name for the event
|
||||
*/
|
||||
RepeatedEventExpecter expectGlobalEvent(EventType type, String event);
|
||||
|
||||
/**
|
||||
* Listens for an event on the global EventDispatcher instance.
|
||||
* The returned object can be used to test if the event has been
|
||||
* received. Note that only one event is listened for.
|
||||
*
|
||||
* @param type The thread type for the event
|
||||
* @param event The name for the event
|
||||
*/
|
||||
RepeatedEventExpecter expectWindowEvent(EventType type, String event);
|
||||
|
||||
/**
|
||||
* Listens for a paint event. Note that calling expectPaint() will
|
||||
* invalidate the event expecters returned from any previous calls
|
||||
* to expectPaint(); calling any methods on those invalidated objects
|
||||
* will result in undefined behaviour.
|
||||
*/
|
||||
RepeatedEventExpecter expectPaint();
|
||||
|
||||
/**
|
||||
* Send a string to the application
|
||||
*
|
||||
* @param keysToSend The string to send
|
||||
*/
|
||||
void sendKeys(String keysToSend);
|
||||
|
||||
/**
|
||||
* Send a special keycode to the element
|
||||
*
|
||||
* @param key The special key to send
|
||||
*/
|
||||
void sendSpecialKey(SpecialKey key);
|
||||
void sendKeyCode(int keyCode);
|
||||
|
||||
void drag(int startingX, int endingX, int startingY, int endingY);
|
||||
|
||||
/**
|
||||
* Run a sql query on the specified database
|
||||
*/
|
||||
public Cursor querySql(String dbPath, String sql);
|
||||
}
|
@ -1,25 +0,0 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
package org.mozilla.gecko;
|
||||
|
||||
public interface Assert {
|
||||
void dumpLog(String message);
|
||||
void dumpLog(String message, Throwable t);
|
||||
void setLogFile(String filename);
|
||||
void setTestName(String testName);
|
||||
void endTest();
|
||||
|
||||
void ok(boolean condition, String name, String diag);
|
||||
void is(Object actual, Object expected, String name);
|
||||
void isnot(Object actual, Object notExpected, String name);
|
||||
void todo(boolean condition, String name, String diag);
|
||||
void todo_is(Object actual, Object expected, String name);
|
||||
void todo_isnot(Object actual, Object notExpected, String name);
|
||||
void info(String name, String message);
|
||||
|
||||
// robocop-specific asserts
|
||||
void ispixel(int actual, int r, int g, int b, String name);
|
||||
void isnotpixel(int actual, int r, int g, int b, String name);
|
||||
}
|
@ -1,44 +0,0 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
package org.mozilla.gecko;
|
||||
|
||||
import android.app.Activity;
|
||||
|
||||
public interface Driver {
|
||||
/**
|
||||
* Find the first Element using the given method.
|
||||
*
|
||||
* @param activity The activity the element belongs to
|
||||
* @param id The resource id of the element
|
||||
* @return The first matching element on the current context, or null if not found.
|
||||
*/
|
||||
Element findElement(Activity activity, int id);
|
||||
|
||||
/**
|
||||
* Sets up scroll handling so that data is received from the extension.
|
||||
*/
|
||||
void setupScrollHandling();
|
||||
|
||||
int getPageHeight();
|
||||
int getScrollHeight();
|
||||
int getHeight();
|
||||
int getGeckoTop();
|
||||
int getGeckoLeft();
|
||||
int getGeckoWidth();
|
||||
int getGeckoHeight();
|
||||
|
||||
void startFrameRecording();
|
||||
int stopFrameRecording();
|
||||
|
||||
void startCheckerboardRecording();
|
||||
float stopCheckerboardRecording();
|
||||
|
||||
/**
|
||||
* Get a copy of the painted content region.
|
||||
* @return A 2-D array of pixels (indexed by y, then x). The pixels
|
||||
* are in ARGB-8888 format.
|
||||
*/
|
||||
PaintedSurface getPaintedSurface();
|
||||
}
|
@ -1,27 +0,0 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
package org.mozilla.gecko;
|
||||
|
||||
/**
|
||||
* Element provides access to a specific UI view (android.view.View).
|
||||
* See also Driver.findElement().
|
||||
*/
|
||||
public interface Element {
|
||||
|
||||
/** Click on the element's view. Returns true on success. */
|
||||
boolean click();
|
||||
|
||||
/** Returns true if the element is currently displayed */
|
||||
boolean isDisplayed();
|
||||
|
||||
/**
|
||||
* Returns the text currently displayed on the element, or null
|
||||
* if the text cannot be retrieved.
|
||||
*/
|
||||
String getText();
|
||||
|
||||
/** Returns the view ID */
|
||||
Integer getId();
|
||||
}
|
@ -1,81 +0,0 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
package org.mozilla.gecko;
|
||||
|
||||
import android.app.KeyguardManager;
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.os.PowerManager;
|
||||
import android.support.multidex.MultiDex;
|
||||
import android.test.InstrumentationTestRunner;
|
||||
import android.util.Log;
|
||||
|
||||
import static android.os.PowerManager.ACQUIRE_CAUSES_WAKEUP;
|
||||
import static android.os.PowerManager.FULL_WAKE_LOCK;
|
||||
import static android.os.PowerManager.ON_AFTER_RELEASE;
|
||||
|
||||
public class FennecInstrumentationTestRunner extends InstrumentationTestRunner {
|
||||
private static Bundle sArguments;
|
||||
private PowerManager.WakeLock wakeLock;
|
||||
private KeyguardManager.KeyguardLock keyguardLock;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle arguments) {
|
||||
MultiDex.install(getTargetContext());
|
||||
sArguments = arguments;
|
||||
if (sArguments == null) {
|
||||
Log.e("Robocop", "FennecInstrumentationTestRunner.onCreate got null bundle");
|
||||
}
|
||||
super.onCreate(arguments);
|
||||
}
|
||||
|
||||
// unfortunately we have to make this static because test classes that don't extend
|
||||
// from ActivityInstrumentationTestCase2 can't get a reference to this class.
|
||||
public static Bundle getFennecArguments() {
|
||||
if (sArguments == null) {
|
||||
Log.e("Robocop", "FennecInstrumentationTestCase.getFennecArguments returns null bundle");
|
||||
}
|
||||
return sArguments;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
final Context context = getContext(); // The Robocop package itself has DISABLE_KEYGUARD and WAKE_LOCK.
|
||||
if (context != null) {
|
||||
try {
|
||||
String name = FennecInstrumentationTestRunner.class.getSimpleName();
|
||||
// Unlock the device so that the tests can input keystrokes.
|
||||
final KeyguardManager keyguard = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
|
||||
// Deprecated in favour of window flags, which aren't appropriate here.
|
||||
keyguardLock = keyguard.newKeyguardLock(name);
|
||||
keyguardLock.disableKeyguard();
|
||||
|
||||
// Wake up the screen.
|
||||
final PowerManager power = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
|
||||
wakeLock = power.newWakeLock(FULL_WAKE_LOCK | ACQUIRE_CAUSES_WAKEUP | ON_AFTER_RELEASE, name);
|
||||
wakeLock.acquire();
|
||||
} catch (SecurityException e) {
|
||||
Log.w("GeckoInstTestRunner", "Got SecurityException: not disabling keyguard and not taking wakelock.");
|
||||
}
|
||||
} else {
|
||||
Log.w("GeckoInstTestRunner", "Application target context is null: not disabling keyguard and not taking wakelock.");
|
||||
}
|
||||
|
||||
super.onStart();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
|
||||
if (wakeLock != null) {
|
||||
wakeLock.release();
|
||||
}
|
||||
if (keyguardLock != null) {
|
||||
// Deprecated in favour of window flags, which aren't appropriate here.
|
||||
keyguardLock.reenableKeyguard();
|
||||
}
|
||||
}
|
||||
}
|
@ -1,254 +0,0 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
package org.mozilla.gecko;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import java.io.StringWriter;
|
||||
import java.io.Writer;
|
||||
|
||||
import android.os.SystemClock;
|
||||
|
||||
public class FennecMochitestAssert implements Assert {
|
||||
// Internal state variables to make logging match up with existing mochitests
|
||||
private int mPassed = 0;
|
||||
private int mFailed = 0;
|
||||
private int mTodo = 0;
|
||||
|
||||
// Used to write the first line of the test file
|
||||
private boolean mLogStarted = false;
|
||||
|
||||
// Used to write the test-start/test-end log lines
|
||||
private String mLogTestName = "";
|
||||
|
||||
// Measure the time it takes to run test case
|
||||
private long mStartTime = 0;
|
||||
|
||||
// Structured logger
|
||||
private StructuredLogger mLogger;
|
||||
|
||||
/** Write information to a logfile and logcat */
|
||||
public void dumpLog(String message) {
|
||||
mLogger.info(message);
|
||||
}
|
||||
|
||||
public void dumpLog(String message, Throwable t) {
|
||||
Writer sw = new StringWriter();
|
||||
PrintWriter pw = new PrintWriter(sw);
|
||||
t.printStackTrace(pw);
|
||||
mLogger.error(message + " - " + sw.toString());
|
||||
}
|
||||
|
||||
/** Write information to a logfile and logcat */
|
||||
static class DumpLogCallback implements StructuredLogger.LoggerCallback {
|
||||
public void call(String output) {
|
||||
FennecNativeDriver.log(FennecNativeDriver.LogLevel.INFO, output);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public FennecMochitestAssert() {
|
||||
mLogger = new StructuredLogger("robocop", new DumpLogCallback());
|
||||
}
|
||||
|
||||
/** Set the filename used for dumpLog. */
|
||||
public void setLogFile(String filename) {
|
||||
FennecNativeDriver.setLogFile(filename);
|
||||
|
||||
String message;
|
||||
if (!mLogStarted) {
|
||||
mLogger.info("SimpleTest START");
|
||||
mLogStarted = true;
|
||||
}
|
||||
|
||||
if (mLogTestName != "") {
|
||||
long diff = SystemClock.uptimeMillis() - mStartTime;
|
||||
mLogger.testEnd(mLogTestName, "OK", "finished in " + diff + "ms");
|
||||
}
|
||||
}
|
||||
|
||||
public void setTestName(String testName) {
|
||||
String[] nameParts = testName.split("\\.");
|
||||
mLogTestName = nameParts[nameParts.length - 1];
|
||||
mStartTime = SystemClock.uptimeMillis();
|
||||
|
||||
mLogger.testStart(mLogTestName);
|
||||
}
|
||||
|
||||
class testInfo {
|
||||
public boolean mResult;
|
||||
public String mName;
|
||||
public String mDiag;
|
||||
public boolean mTodo;
|
||||
public boolean mInfo;
|
||||
public testInfo(boolean r, String n, String d, boolean t, boolean i) {
|
||||
mResult = r;
|
||||
mName = n;
|
||||
mDiag = d;
|
||||
mTodo = t;
|
||||
mInfo = i;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/** Used to log a subtest's result.
|
||||
* test represents the subtest (an assertion).
|
||||
* passStatus and passExpected are the actual status and the expected status if the assertion is true.
|
||||
* failStatus and failExpected are the actual status and the expected status otherwise.
|
||||
*/
|
||||
private void _logMochitestResult(testInfo test, String passStatus, String passExpected, String failStatus, String failExpected) {
|
||||
boolean isError = true;
|
||||
if (test.mResult || test.mTodo) {
|
||||
isError = false;
|
||||
}
|
||||
if (test.mResult)
|
||||
{
|
||||
mLogger.testStatus(mLogTestName, test.mName, passStatus, passExpected, test.mDiag);
|
||||
} else {
|
||||
mLogger.testStatus(mLogTestName, test.mName, failStatus, failExpected, test.mDiag);
|
||||
}
|
||||
|
||||
if (test.mInfo) {
|
||||
// do not count TEST-INFO messages
|
||||
} else if (test.mTodo) {
|
||||
mTodo++;
|
||||
} else if (isError) {
|
||||
mFailed++;
|
||||
} else {
|
||||
mPassed++;
|
||||
}
|
||||
if (isError) {
|
||||
String message = "TEST-UNEXPECTED-" + failStatus + " | " + mLogTestName + " | "
|
||||
+ test.mName + " - " + test.mDiag;
|
||||
junit.framework.Assert.fail(message);
|
||||
}
|
||||
}
|
||||
|
||||
public void endTest() {
|
||||
String message;
|
||||
|
||||
if (mLogTestName != "") {
|
||||
long diff = SystemClock.uptimeMillis() - mStartTime;
|
||||
mLogger.testEnd(mLogTestName, "OK", "finished in " + diff + "ms");
|
||||
}
|
||||
|
||||
mLogger.info("TEST-START | Shutdown");
|
||||
mLogger.info("Passed: " + Integer.toString(mPassed));
|
||||
mLogger.info("Failed: " + Integer.toString(mFailed));
|
||||
mLogger.info("Todo: " + Integer.toString(mTodo));
|
||||
mLogger.info("SimpleTest FINISHED");
|
||||
}
|
||||
|
||||
public void ok(boolean condition, String name, String diag) {
|
||||
testInfo test = new testInfo(condition, name, diag, false, false);
|
||||
_logMochitestResult(test, "PASS", "PASS", "FAIL", "PASS");
|
||||
}
|
||||
|
||||
public void is(Object actual, Object expected, String name) {
|
||||
boolean pass = checkObjectsEqual(actual, expected);
|
||||
ok(pass, name, getEqualString(actual, expected, pass));
|
||||
}
|
||||
|
||||
public void isnot(Object actual, Object notExpected, String name) {
|
||||
boolean pass = checkObjectsNotEqual(actual, notExpected);
|
||||
ok(pass, name, getNotEqualString(actual, notExpected, pass));
|
||||
}
|
||||
|
||||
public void ispixel(int actual, int r, int g, int b, String name) {
|
||||
int aAlpha = ((actual >> 24) & 0xFF);
|
||||
int aR = ((actual >> 16) & 0xFF);
|
||||
int aG = ((actual >> 8) & 0xFF);
|
||||
int aB = (actual & 0xFF);
|
||||
boolean pass = checkPixel(actual, r, g, b);
|
||||
ok(pass, name, "Color rgba(" + aR + "," + aG + "," + aB + "," + aAlpha + ")" + (pass ? " " : " not") + " close enough to expected rgb(" + r + "," + g + "," + b + ")");
|
||||
}
|
||||
|
||||
public void isnotpixel(int actual, int r, int g, int b, String name) {
|
||||
int aAlpha = ((actual >> 24) & 0xFF);
|
||||
int aR = ((actual >> 16) & 0xFF);
|
||||
int aG = ((actual >> 8) & 0xFF);
|
||||
int aB = (actual & 0xFF);
|
||||
boolean pass = checkPixel(actual, r, g, b);
|
||||
ok(!pass, name, "Color rgba(" + aR + "," + aG + "," + aB + "," + aAlpha + ")" + (!pass ? " is" : " is not") + " different enough from rgb(" + r + "," + g + "," + b + ")");
|
||||
}
|
||||
|
||||
private boolean checkPixel(int actual, int r, int g, int b) {
|
||||
// When we read GL pixels the GPU has already processed them and they
|
||||
// are usually off by a little bit. For example a CSS-color pixel of color #64FFF5
|
||||
// was turned into #63FFF7 when it came out of glReadPixels. So in order to compare
|
||||
// against the expected value, we use a little fuzz factor. For the alpha we just
|
||||
// make sure it is always 0xFF. There is also bug 691354 which crops up every so
|
||||
// often just to make our lives difficult. However the individual color components
|
||||
// should never be off by more than 8.
|
||||
int aAlpha = ((actual >> 24) & 0xFF);
|
||||
int aR = ((actual >> 16) & 0xFF);
|
||||
int aG = ((actual >> 8) & 0xFF);
|
||||
int aB = (actual & 0xFF);
|
||||
boolean pass = (aAlpha == 0xFF) /* alpha */
|
||||
&& (Math.abs(aR - r) <= 8) /* red */
|
||||
&& (Math.abs(aG - g) <= 8) /* green */
|
||||
&& (Math.abs(aB - b) <= 8); /* blue */
|
||||
if (pass) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public void todo(boolean condition, String name, String diag) {
|
||||
testInfo test = new testInfo(condition, name, diag, true, false);
|
||||
_logMochitestResult(test, "PASS", "FAIL", "FAIL", "FAIL");
|
||||
}
|
||||
|
||||
public void todo_is(Object actual, Object expected, String name) {
|
||||
boolean pass = checkObjectsEqual(actual, expected);
|
||||
todo(pass, name, getEqualString(actual, expected, pass));
|
||||
}
|
||||
|
||||
public void todo_isnot(Object actual, Object notExpected, String name) {
|
||||
boolean pass = checkObjectsNotEqual(actual, notExpected);
|
||||
todo(pass, name, getNotEqualString(actual, notExpected, pass));
|
||||
}
|
||||
|
||||
private boolean checkObjectsEqual(Object a, Object b) {
|
||||
if (a == null || b == null) {
|
||||
if (a == null && b == null) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
} else {
|
||||
return a.equals(b);
|
||||
}
|
||||
}
|
||||
|
||||
private String getEqualString(Object a, Object b, boolean pass) {
|
||||
if (pass) {
|
||||
return a + " should equal " + b;
|
||||
}
|
||||
return "got " + a + ", expected " + b;
|
||||
}
|
||||
|
||||
private boolean checkObjectsNotEqual(Object a, Object b) {
|
||||
if (a == null || b == null) {
|
||||
if ((a == null && b != null) || (a != null && b == null)) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
return !a.equals(b);
|
||||
}
|
||||
}
|
||||
|
||||
private String getNotEqualString(Object a, Object b, boolean pass) {
|
||||
if(pass) {
|
||||
return a + " should not equal " + b;
|
||||
}
|
||||
return "didn't expect " + a + ", but got it";
|
||||
}
|
||||
|
||||
public void info(String name, String message) {
|
||||
mLogger.info(name + " | " + message);
|
||||
}
|
||||
}
|
@ -1,545 +0,0 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
package org.mozilla.gecko;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.concurrent.BlockingQueue;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.mozilla.gecko.FennecNativeDriver.LogLevel;
|
||||
import org.mozilla.gecko.mozglue.GeckoLoader;
|
||||
import org.mozilla.gecko.sqlite.SQLiteBridge;
|
||||
import org.mozilla.gecko.util.BundleEventListener;
|
||||
import org.mozilla.gecko.util.EventCallback;
|
||||
import org.mozilla.gecko.util.GeckoBundle;
|
||||
import org.mozilla.geckoview.GeckoView;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.Instrumentation;
|
||||
import android.database.Cursor;
|
||||
import android.os.SystemClock;
|
||||
import android.text.TextUtils;
|
||||
import android.view.KeyEvent;
|
||||
|
||||
import com.robotium.solo.Solo;
|
||||
|
||||
public class FennecNativeActions implements Actions {
|
||||
private static final String LOGTAG = "FennecNativeActions";
|
||||
|
||||
private Solo mSolo;
|
||||
private Instrumentation mInstr;
|
||||
private Assert mAsserter;
|
||||
|
||||
public FennecNativeActions(Activity activity, Solo robocop, Instrumentation instrumentation, Assert asserter) {
|
||||
mSolo = robocop;
|
||||
mInstr = instrumentation;
|
||||
mAsserter = asserter;
|
||||
|
||||
GeckoLoader.loadSQLiteLibs(activity);
|
||||
}
|
||||
|
||||
class GeckoEventExpecter implements RepeatedEventExpecter {
|
||||
private static final int MAX_WAIT_MS = 180000;
|
||||
|
||||
private volatile boolean mIsRegistered;
|
||||
|
||||
private final EventDispatcher mDispatcher;
|
||||
private final EventType mType;
|
||||
private final String mGeckoEvent;
|
||||
private final BlockingQueue<Object> mEventDataQueue;
|
||||
private final BundleEventListener mBundleListener;
|
||||
|
||||
private volatile boolean mEventEverReceived;
|
||||
private Object mEventData;
|
||||
|
||||
GeckoEventExpecter(final EventDispatcher dispatcher, final EventType type,
|
||||
final String geckoEvent) {
|
||||
if (TextUtils.isEmpty(geckoEvent)) {
|
||||
throw new IllegalArgumentException("geckoEvent must not be empty");
|
||||
}
|
||||
|
||||
mDispatcher = dispatcher;
|
||||
mType = type;
|
||||
mGeckoEvent = geckoEvent;
|
||||
mEventDataQueue = new LinkedBlockingQueue<>();
|
||||
mIsRegistered = true;
|
||||
|
||||
mBundleListener = new BundleEventListener() {
|
||||
@Override
|
||||
public void handleMessage(final String event, final GeckoBundle message,
|
||||
final EventCallback callback) {
|
||||
FennecNativeDriver.log(FennecNativeDriver.LogLevel.DEBUG,
|
||||
"handleMessage called for: " + event + "; expecting: " + mGeckoEvent);
|
||||
mAsserter.is(event, mGeckoEvent,
|
||||
"Given message occurred for registered event: " + message);
|
||||
|
||||
// Because we cannot put null into the queue, we have to use an empty
|
||||
// bundle if we don't have a message.
|
||||
notifyOfEvent(message != null ? message : new GeckoBundle(0));
|
||||
}
|
||||
};
|
||||
|
||||
if (type == EventType.GECKO) {
|
||||
dispatcher.registerGeckoThreadListener(mBundleListener, geckoEvent);
|
||||
} else if (type == EventType.UI) {
|
||||
dispatcher.registerUiThreadListener(mBundleListener, geckoEvent);
|
||||
} else if (type == EventType.BACKGROUND) {
|
||||
dispatcher.registerBackgroundThreadListener(mBundleListener, geckoEvent);
|
||||
} else {
|
||||
throw new IllegalArgumentException("Unsupported thread type");
|
||||
}
|
||||
}
|
||||
|
||||
public void blockForEvent() {
|
||||
blockForEvent(MAX_WAIT_MS, true);
|
||||
}
|
||||
|
||||
public void blockForEvent(long millis, boolean failOnTimeout) {
|
||||
if (!mIsRegistered) {
|
||||
throw new IllegalStateException("listener not registered");
|
||||
}
|
||||
|
||||
try {
|
||||
mEventData = mEventDataQueue.poll(millis, TimeUnit.MILLISECONDS);
|
||||
} catch (InterruptedException ie) {
|
||||
FennecNativeDriver.log(LogLevel.ERROR, ie);
|
||||
}
|
||||
if (mEventData == null) {
|
||||
if (failOnTimeout) {
|
||||
FennecNativeDriver.logAllStackTraces(FennecNativeDriver.LogLevel.ERROR);
|
||||
mAsserter.ok(false, "GeckoEventExpecter",
|
||||
"blockForEvent timeout: "+mGeckoEvent);
|
||||
} else {
|
||||
FennecNativeDriver.log(FennecNativeDriver.LogLevel.DEBUG,
|
||||
"blockForEvent timeout: "+mGeckoEvent);
|
||||
}
|
||||
} else {
|
||||
FennecNativeDriver.log(FennecNativeDriver.LogLevel.DEBUG,
|
||||
"unblocked on expecter for " + mGeckoEvent);
|
||||
}
|
||||
}
|
||||
|
||||
public void blockUntilClear(long millis) {
|
||||
if (!mIsRegistered) {
|
||||
throw new IllegalStateException("listener not registered");
|
||||
}
|
||||
if (millis <= 0) {
|
||||
throw new IllegalArgumentException("millis must be > 0");
|
||||
}
|
||||
|
||||
// wait for at least one event
|
||||
try {
|
||||
mEventData = mEventDataQueue.poll(MAX_WAIT_MS, TimeUnit.MILLISECONDS);
|
||||
} catch (InterruptedException ie) {
|
||||
FennecNativeDriver.log(LogLevel.ERROR, ie);
|
||||
}
|
||||
if (mEventData == null) {
|
||||
FennecNativeDriver.logAllStackTraces(FennecNativeDriver.LogLevel.ERROR);
|
||||
mAsserter.ok(false, "GeckoEventExpecter", "blockUntilClear timeout");
|
||||
return;
|
||||
}
|
||||
// now wait for a period of millis where we don't get an event
|
||||
while (true) {
|
||||
try {
|
||||
mEventData = mEventDataQueue.poll(millis, TimeUnit.MILLISECONDS);
|
||||
} catch (InterruptedException ie) {
|
||||
FennecNativeDriver.log(LogLevel.INFO, ie);
|
||||
}
|
||||
if (mEventData == null) {
|
||||
// success
|
||||
break;
|
||||
}
|
||||
}
|
||||
FennecNativeDriver.log(FennecNativeDriver.LogLevel.DEBUG,
|
||||
"unblocked on expecter for " + mGeckoEvent);
|
||||
}
|
||||
|
||||
public String blockForEventData() {
|
||||
blockForEvent();
|
||||
return (String) mEventData;
|
||||
}
|
||||
|
||||
public String blockForEventDataWithTimeout(long millis) {
|
||||
blockForEvent(millis, false);
|
||||
return (String) mEventData;
|
||||
}
|
||||
|
||||
public GeckoBundle blockForBundle() {
|
||||
blockForEvent();
|
||||
return (GeckoBundle) mEventData;
|
||||
}
|
||||
|
||||
public GeckoBundle blockForBundleWithTimeout(long millis) {
|
||||
blockForEvent(millis, false);
|
||||
return (GeckoBundle) mEventData;
|
||||
}
|
||||
|
||||
public void unregisterListener() {
|
||||
if (!mIsRegistered) {
|
||||
throw new IllegalStateException("listener not registered");
|
||||
}
|
||||
|
||||
FennecNativeDriver.log(LogLevel.INFO,
|
||||
"EventExpecter: no longer listening for " + mGeckoEvent);
|
||||
|
||||
if (mType == EventType.GECKO) {
|
||||
mDispatcher.unregisterGeckoThreadListener(mBundleListener, mGeckoEvent);
|
||||
} else if (mType == EventType.UI) {
|
||||
mDispatcher.unregisterUiThreadListener(mBundleListener, mGeckoEvent);
|
||||
} else if (mType == EventType.BACKGROUND) {
|
||||
mDispatcher.unregisterBackgroundThreadListener(mBundleListener, mGeckoEvent);
|
||||
} else {
|
||||
throw new IllegalArgumentException("Unsupported thread type");
|
||||
}
|
||||
mIsRegistered = false;
|
||||
}
|
||||
|
||||
public boolean eventReceived() {
|
||||
return mEventEverReceived;
|
||||
}
|
||||
|
||||
/* package */ void notifyOfEvent(final Object data) {
|
||||
FennecNativeDriver.log(FennecNativeDriver.LogLevel.DEBUG,
|
||||
"received event " + mGeckoEvent);
|
||||
|
||||
mEventEverReceived = true;
|
||||
|
||||
try {
|
||||
mEventDataQueue.put(data);
|
||||
} catch (InterruptedException e) {
|
||||
FennecNativeDriver.log(LogLevel.ERROR,
|
||||
"EventExpecter dropped event: " + data, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public RepeatedEventExpecter expectGlobalEvent(final EventType type, final String geckoEvent) {
|
||||
FennecNativeDriver.log(FennecNativeDriver.LogLevel.DEBUG, "waiting for " + geckoEvent);
|
||||
return new GeckoEventExpecter(EventDispatcher.getInstance(), type, geckoEvent);
|
||||
}
|
||||
|
||||
public RepeatedEventExpecter expectWindowEvent(final EventType type, final String geckoEvent) {
|
||||
FennecNativeDriver.log(FennecNativeDriver.LogLevel.DEBUG, "waiting for " + geckoEvent);
|
||||
return new GeckoEventExpecter(
|
||||
((GeckoApp) mSolo.getCurrentActivity()).getAppEventDispatcher(),
|
||||
type, geckoEvent);
|
||||
}
|
||||
|
||||
public void sendGlobalEvent(final String event, final GeckoBundle data) {
|
||||
EventDispatcher.getInstance().dispatch(event, data);
|
||||
}
|
||||
|
||||
public void sendWindowEvent(final String event, final GeckoBundle data) {
|
||||
((GeckoApp) mSolo.getCurrentActivity()).getAppEventDispatcher().dispatch(event, data);
|
||||
}
|
||||
|
||||
public static final class PrefProxy implements PrefsHelper.PrefHandler, PrefWaiter {
|
||||
public static final int MAX_WAIT_MS = 180000;
|
||||
|
||||
/* package */ final PrefHandlerBase target;
|
||||
private final String[] expectedPrefs;
|
||||
private final ArrayList<String> seenPrefs = new ArrayList<>();
|
||||
private boolean finished = false;
|
||||
|
||||
/* package */ PrefProxy(PrefHandlerBase target, String[] expectedPrefs, Assert asserter) {
|
||||
this.target = target;
|
||||
this.expectedPrefs = expectedPrefs;
|
||||
target.asserter = asserter;
|
||||
}
|
||||
|
||||
@Override // PrefsHelper.PrefHandler
|
||||
public void prefValue(String pref, boolean value) {
|
||||
target.prefValue(pref, value);
|
||||
seenPrefs.add(pref);
|
||||
}
|
||||
|
||||
@Override // PrefsHelper.PrefHandler
|
||||
public void prefValue(String pref, int value) {
|
||||
target.prefValue(pref, value);
|
||||
seenPrefs.add(pref);
|
||||
}
|
||||
|
||||
@Override // PrefsHelper.PrefHandler
|
||||
public void prefValue(String pref, String value) {
|
||||
target.prefValue(pref, value);
|
||||
seenPrefs.add(pref);
|
||||
}
|
||||
|
||||
@Override // PrefsHelper.PrefHandler
|
||||
public synchronized void finish() {
|
||||
target.finish();
|
||||
|
||||
for (String pref : expectedPrefs) {
|
||||
target.asserter.ok(seenPrefs.remove(pref), "Checking pref was seen", pref);
|
||||
}
|
||||
target.asserter.ok(seenPrefs.isEmpty(), "Checking unexpected prefs",
|
||||
TextUtils.join(", ", seenPrefs));
|
||||
|
||||
finished = true;
|
||||
this.notifyAll();
|
||||
}
|
||||
|
||||
@Override // PrefWaiter
|
||||
public synchronized boolean isFinished() {
|
||||
return finished;
|
||||
}
|
||||
|
||||
@Override // PrefWaiter
|
||||
public void waitForFinish() {
|
||||
waitForFinish(MAX_WAIT_MS, /* failOnTimeout */ true);
|
||||
}
|
||||
|
||||
@Override // PrefWaiter
|
||||
public synchronized void waitForFinish(long timeoutMillis, boolean failOnTimeout) {
|
||||
final long startTime = System.nanoTime();
|
||||
while (!finished) {
|
||||
if (System.nanoTime() - startTime
|
||||
>= timeoutMillis * 1e6 /* ns per ms */) {
|
||||
final String prefsLog = "expected " +
|
||||
TextUtils.join(", ", expectedPrefs) + "; got " +
|
||||
TextUtils.join(", ", seenPrefs.toArray()) + ".";
|
||||
if (failOnTimeout) {
|
||||
FennecNativeDriver.logAllStackTraces(FennecNativeDriver.LogLevel.ERROR);
|
||||
target.asserter.ok(false, "Timeout waiting for pref", prefsLog);
|
||||
} else {
|
||||
FennecNativeDriver.log(FennecNativeDriver.LogLevel.DEBUG,
|
||||
"Pref timeout (" + prefsLog + ")");
|
||||
}
|
||||
break;
|
||||
}
|
||||
try {
|
||||
this.wait(1000); // Wait for 1 second at a time.
|
||||
} catch (final InterruptedException e) {
|
||||
// Attempt waiting again.
|
||||
}
|
||||
}
|
||||
finished = false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override // Actions
|
||||
public PrefWaiter getPrefs(String[] prefNames, PrefHandlerBase handler) {
|
||||
final PrefProxy proxy = new PrefProxy(handler, prefNames, mAsserter);
|
||||
PrefsHelper.getPrefs(prefNames, proxy);
|
||||
return proxy;
|
||||
}
|
||||
|
||||
@Override // Actions
|
||||
public void setPref(String pref, Object value, boolean flush) {
|
||||
PrefsHelper.setPref(pref, value, flush);
|
||||
}
|
||||
|
||||
@Override // Actions
|
||||
public PrefWaiter addPrefsObserver(String[] prefNames, PrefHandlerBase handler) {
|
||||
final PrefProxy proxy = new PrefProxy(handler, prefNames, mAsserter);
|
||||
PrefsHelper.addObserver(prefNames, proxy);
|
||||
return proxy;
|
||||
}
|
||||
|
||||
@Override // Actions
|
||||
public void removePrefsObserver(PrefWaiter proxy) {
|
||||
PrefsHelper.removeObserver((PrefProxy) proxy);
|
||||
}
|
||||
|
||||
class PaintExpecter implements RepeatedEventExpecter {
|
||||
private static final int MAX_WAIT_MS = 90000;
|
||||
|
||||
private boolean mPaintDone;
|
||||
private boolean mListening;
|
||||
|
||||
private final GeckoView mGeckoView;
|
||||
private final Runnable mDrawCallback;
|
||||
|
||||
PaintExpecter() {
|
||||
final PaintExpecter expecter = this;
|
||||
mGeckoView = (GeckoView) mSolo.getView(R.id.layer_view);
|
||||
mDrawCallback = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
FennecNativeDriver.log(FennecNativeDriver.LogLevel.DEBUG,
|
||||
"Received drawFinished notification");
|
||||
expecter.notifyOfEvent();
|
||||
}
|
||||
};
|
||||
mGeckoView.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
mGeckoView.getSession().getCompositorController().addDrawCallback(mDrawCallback);
|
||||
}
|
||||
});
|
||||
mListening = true;
|
||||
}
|
||||
|
||||
private synchronized void notifyOfEvent() {
|
||||
mPaintDone = true;
|
||||
this.notifyAll();
|
||||
}
|
||||
|
||||
public synchronized void blockForEvent(long millis, boolean failOnTimeout) {
|
||||
if (!mListening) {
|
||||
throw new IllegalStateException("draw listener not registered");
|
||||
}
|
||||
long startTime = SystemClock.uptimeMillis();
|
||||
long endTime = 0;
|
||||
while (!mPaintDone) {
|
||||
try {
|
||||
this.wait(millis);
|
||||
} catch (InterruptedException ie) {
|
||||
FennecNativeDriver.log(LogLevel.ERROR, ie);
|
||||
break;
|
||||
}
|
||||
endTime = SystemClock.uptimeMillis();
|
||||
if (!mPaintDone && (endTime - startTime >= millis)) {
|
||||
if (failOnTimeout) {
|
||||
FennecNativeDriver.logAllStackTraces(FennecNativeDriver.LogLevel.ERROR);
|
||||
mAsserter.ok(false, "PaintExpecter", "blockForEvent timeout");
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized void blockForEvent() {
|
||||
blockForEvent(MAX_WAIT_MS, true);
|
||||
}
|
||||
|
||||
public synchronized String blockForEventData() {
|
||||
blockForEvent();
|
||||
return null;
|
||||
}
|
||||
|
||||
public synchronized String blockForEventDataWithTimeout(long millis) {
|
||||
blockForEvent(millis, false);
|
||||
return null;
|
||||
}
|
||||
|
||||
public GeckoBundle blockForBundle() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public GeckoBundle blockForBundleWithTimeout(long millis) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public synchronized boolean eventReceived() {
|
||||
return mPaintDone;
|
||||
}
|
||||
|
||||
public synchronized void blockUntilClear(long millis) {
|
||||
if (!mListening) {
|
||||
throw new IllegalStateException("draw listener not registered");
|
||||
}
|
||||
if (millis <= 0) {
|
||||
throw new IllegalArgumentException("millis must be > 0");
|
||||
}
|
||||
// wait for at least one event
|
||||
long startTime = SystemClock.uptimeMillis();
|
||||
long endTime = 0;
|
||||
while (!mPaintDone) {
|
||||
try {
|
||||
this.wait(MAX_WAIT_MS);
|
||||
} catch (InterruptedException ie) {
|
||||
FennecNativeDriver.log(LogLevel.ERROR, ie);
|
||||
break;
|
||||
}
|
||||
endTime = SystemClock.uptimeMillis();
|
||||
if (!mPaintDone && (endTime - startTime >= MAX_WAIT_MS)) {
|
||||
FennecNativeDriver.logAllStackTraces(FennecNativeDriver.LogLevel.ERROR);
|
||||
mAsserter.ok(false, "PaintExpecter", "blockUtilClear timeout");
|
||||
return;
|
||||
}
|
||||
}
|
||||
// now wait for a period of millis where we don't get an event
|
||||
startTime = SystemClock.uptimeMillis();
|
||||
while (true) {
|
||||
try {
|
||||
this.wait(millis);
|
||||
} catch (InterruptedException ie) {
|
||||
FennecNativeDriver.log(LogLevel.ERROR, ie);
|
||||
break;
|
||||
}
|
||||
endTime = SystemClock.uptimeMillis();
|
||||
if (endTime - startTime >= millis) {
|
||||
// success
|
||||
break;
|
||||
}
|
||||
|
||||
// we got a notify() before we could wait long enough, so we need to start over
|
||||
// Note, moving the goal post might have us race against a "drawFinished" flood
|
||||
startTime = endTime;
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized void unregisterListener() {
|
||||
if (!mListening) {
|
||||
throw new IllegalStateException("listener not registered");
|
||||
}
|
||||
|
||||
FennecNativeDriver.log(LogLevel.INFO,
|
||||
"PaintExpecter: no longer listening for events");
|
||||
mGeckoView.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
mGeckoView.getSession().getCompositorController().removeDrawCallback(mDrawCallback);
|
||||
}
|
||||
});
|
||||
mListening = false;
|
||||
}
|
||||
}
|
||||
|
||||
public RepeatedEventExpecter expectPaint() {
|
||||
return new PaintExpecter();
|
||||
}
|
||||
|
||||
public void sendSpecialKey(SpecialKey button) {
|
||||
switch(button) {
|
||||
case DOWN:
|
||||
sendKeyCode(Solo.DOWN);
|
||||
break;
|
||||
case UP:
|
||||
sendKeyCode(Solo.UP);
|
||||
break;
|
||||
case LEFT:
|
||||
sendKeyCode(Solo.LEFT);
|
||||
break;
|
||||
case RIGHT:
|
||||
sendKeyCode(Solo.RIGHT);
|
||||
break;
|
||||
case ENTER:
|
||||
sendKeyCode(Solo.ENTER);
|
||||
break;
|
||||
case MENU:
|
||||
sendKeyCode(Solo.MENU);
|
||||
break;
|
||||
case DELETE:
|
||||
sendKeyCode(Solo.DELETE);
|
||||
break;
|
||||
default:
|
||||
mAsserter.ok(false, "sendSpecialKey", "Unknown SpecialKey " + button);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void sendKeyCode(int keyCode) {
|
||||
if (keyCode <= 0 || keyCode > KeyEvent.getMaxKeyCode()) {
|
||||
mAsserter.ok(false, "sendKeyCode", "Unknown keyCode " + keyCode);
|
||||
}
|
||||
mSolo.sendKey(keyCode);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendKeys(String input) {
|
||||
mInstr.sendStringSync(input);
|
||||
}
|
||||
|
||||
public void drag(int startingX, int endingX, int startingY, int endingY) {
|
||||
mSolo.drag(startingX, endingX, startingY, endingY, 10);
|
||||
}
|
||||
|
||||
public Cursor querySql(final String dbPath, final String sql) {
|
||||
return new SQLiteBridge(dbPath).rawQuery(sql, null);
|
||||
}
|
||||
}
|
@ -1,485 +0,0 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
package org.mozilla.gecko;
|
||||
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.FileReader;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.IntBuffer;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.lang.StringBuffer;
|
||||
import java.lang.Math;
|
||||
|
||||
import org.mozilla.gecko.gfx.PanningPerfAPI;
|
||||
import org.mozilla.gecko.util.BundleEventListener;
|
||||
import org.mozilla.gecko.util.EventCallback;
|
||||
import org.mozilla.gecko.util.GeckoBundle;
|
||||
import org.mozilla.gecko.util.StrictModeContext;
|
||||
import org.mozilla.geckoview.GeckoView;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.graphics.Bitmap;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
|
||||
import com.robotium.solo.Solo;
|
||||
|
||||
public class FennecNativeDriver implements Driver {
|
||||
private static final int FRAME_TIME_THRESHOLD = 25; // allow 25ms per frame (40fps)
|
||||
|
||||
private final Activity mActivity;
|
||||
private final Solo mSolo;
|
||||
private final String mRootPath;
|
||||
|
||||
private static String mLogFile;
|
||||
private static LogLevel mLogLevel = LogLevel.INFO;
|
||||
|
||||
public enum LogLevel {
|
||||
DEBUG(1),
|
||||
INFO(2),
|
||||
WARN(3),
|
||||
ERROR(4);
|
||||
|
||||
private final int mValue;
|
||||
LogLevel(int value) {
|
||||
mValue = value;
|
||||
}
|
||||
public boolean isEnabled(LogLevel configuredLevel) {
|
||||
return mValue >= configuredLevel.getValue();
|
||||
}
|
||||
private int getValue() {
|
||||
return mValue;
|
||||
}
|
||||
}
|
||||
|
||||
public FennecNativeDriver(Activity activity, Solo robocop, String rootPath) {
|
||||
mActivity = activity;
|
||||
mSolo = robocop;
|
||||
mRootPath = rootPath;
|
||||
}
|
||||
|
||||
//Information on the location of the Gecko Frame.
|
||||
private boolean mGeckoInfo = false;
|
||||
private int mGeckoTop = 100;
|
||||
private int mGeckoLeft = 0;
|
||||
private int mGeckoHeight= 700;
|
||||
private int mGeckoWidth = 1024;
|
||||
|
||||
private void getGeckoInfo() {
|
||||
View geckoLayout = mActivity.findViewById(R.id.gecko_layout);
|
||||
if (geckoLayout != null) {
|
||||
int[] pos = new int[2];
|
||||
geckoLayout.getLocationOnScreen(pos);
|
||||
mGeckoTop = pos[1];
|
||||
mGeckoLeft = pos[0];
|
||||
mGeckoWidth = geckoLayout.getWidth();
|
||||
mGeckoHeight = geckoLayout.getHeight();
|
||||
mGeckoInfo = true;
|
||||
} else {
|
||||
throw new RoboCopException("Unable to find view gecko_layout");
|
||||
}
|
||||
View toolbarLayout = mActivity.findViewById(R.id.browser_chrome);
|
||||
if (toolbarLayout != null) {
|
||||
// Need to remove the height of the toolbar since the top part of
|
||||
// the gecko_layout is hidden under the toolbar.
|
||||
final int toolbarHeight = toolbarLayout.getHeight();
|
||||
mGeckoTop += toolbarHeight;
|
||||
mGeckoHeight -= toolbarHeight;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getGeckoTop() {
|
||||
if (!mGeckoInfo) {
|
||||
getGeckoInfo();
|
||||
}
|
||||
return mGeckoTop;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getGeckoLeft() {
|
||||
if (!mGeckoInfo) {
|
||||
getGeckoInfo();
|
||||
}
|
||||
return mGeckoLeft;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getGeckoHeight() {
|
||||
if (!mGeckoInfo) {
|
||||
getGeckoInfo();
|
||||
}
|
||||
return mGeckoHeight;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getGeckoWidth() {
|
||||
if (!mGeckoInfo) {
|
||||
getGeckoInfo();
|
||||
}
|
||||
return mGeckoWidth;
|
||||
}
|
||||
|
||||
/** Find the element with given id.
|
||||
*
|
||||
* @return An Element representing the view, or null if the view is not found.
|
||||
*/
|
||||
@Override
|
||||
public Element findElement(Activity activity, int id) {
|
||||
return new FennecNativeElement(id, activity);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void startFrameRecording() {
|
||||
PanningPerfAPI.startFrameTimeRecording();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int stopFrameRecording() {
|
||||
final List<Long> frames = PanningPerfAPI.stopFrameTimeRecording();
|
||||
int badness = 0;
|
||||
for (int i = 1; i < frames.size(); i++) {
|
||||
long frameTime = frames.get(i) - frames.get(i - 1);
|
||||
int delay = (int)(frameTime - FRAME_TIME_THRESHOLD);
|
||||
// for each frame we miss, add the square of the delay. This
|
||||
// makes large delays much worse than small delays.
|
||||
if (delay > 0) {
|
||||
badness += delay * delay;
|
||||
}
|
||||
}
|
||||
|
||||
// Don't do any averaging of the numbers because really we want to
|
||||
// know how bad the jank was at its worst
|
||||
return badness;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void startCheckerboardRecording() {
|
||||
PanningPerfAPI.startCheckerboardRecording();
|
||||
}
|
||||
|
||||
@Override
|
||||
public float stopCheckerboardRecording() {
|
||||
final List<Float> checkerboard = PanningPerfAPI.stopCheckerboardRecording();
|
||||
float total = 0;
|
||||
for (float val : checkerboard) {
|
||||
total += val;
|
||||
}
|
||||
return total * 100.0f;
|
||||
}
|
||||
|
||||
private GeckoView getSurfaceView() {
|
||||
final GeckoView geckoView = mSolo.getView(GeckoView.class, 0);
|
||||
|
||||
if (geckoView == null) {
|
||||
log(LogLevel.WARN, "getSurfaceView could not find GeckoView");
|
||||
for (final View v : mSolo.getViews()) {
|
||||
log(LogLevel.WARN, " View: " + v);
|
||||
}
|
||||
}
|
||||
return geckoView;
|
||||
}
|
||||
|
||||
private volatile boolean mGotPixelsResult;
|
||||
private Bitmap mPixelsResult;
|
||||
|
||||
public synchronized void onPixelsResult(final Bitmap aResult) {
|
||||
mPixelsResult = aResult;
|
||||
mGotPixelsResult = true;
|
||||
notifyAll();
|
||||
}
|
||||
|
||||
private static final int COLOR_DEVIATION = 3;
|
||||
|
||||
// Due to anti-aliasing, border pixels can be blended. This should filter them out.
|
||||
private static boolean differentColor(final int c1, final int c2) {
|
||||
int r1 = c1 & 0xFF;
|
||||
int b1 = (c1 & 0xFF00) >> 8;
|
||||
int g1 = (c1 & 0xFF0000) >> 16;
|
||||
int r2 = c2 & 0xFF;
|
||||
int b2 = (c2 & 0xFF00) >> 8;
|
||||
int g2 = (c2 & 0xFF0000) >> 16;
|
||||
return (Math.abs(r1 - r2) > COLOR_DEVIATION) ||
|
||||
(Math.abs(g1 - g2) > COLOR_DEVIATION) ||
|
||||
(Math.abs(b1 - b2) > COLOR_DEVIATION);
|
||||
}
|
||||
|
||||
private void logPixels(final IntBuffer pixelBuffer, final int w, final int h) {
|
||||
pixelBuffer.position(0);
|
||||
|
||||
int prevFirstRowColor = 0xFF000000; // Color not found in test page.
|
||||
int prevColor = 0xFF000000;
|
||||
StringBuffer sb = null;
|
||||
for (int y = 0; y < h; y++) {
|
||||
for (int x = 0; x < w; x++) {
|
||||
int agbr = pixelBuffer.get();
|
||||
// Starting a new row of squares
|
||||
if ((x == 0) && (prevFirstRowColor != agbr)) {
|
||||
sb = new StringBuffer();
|
||||
prevFirstRowColor = agbr;
|
||||
}
|
||||
|
||||
// the current pixel in this row is a different color than the previous one so log it.
|
||||
if ((sb != null) && differentColor(prevColor, agbr)) {
|
||||
sb.append(String.format("(%3d,%3d,%3d) ", (agbr & 0xFF), (agbr & 0xFF00) >> 8, (agbr & 0xFF0000) >> 16));
|
||||
}
|
||||
prevColor = agbr;
|
||||
}
|
||||
if (sb != null) {
|
||||
// Add what row is being logged.
|
||||
sb.append("h:").append(h - y);
|
||||
log(LogLevel.INFO,sb.toString());
|
||||
sb = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public PaintedSurface getPaintedSurface() {
|
||||
final GeckoView view = getSurfaceView();
|
||||
if (view == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
view.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
view.capturePixels().then( value -> {
|
||||
FennecNativeDriver.this.onPixelsResult(value);
|
||||
return null;
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
synchronized (this) {
|
||||
while (!mGotPixelsResult) {
|
||||
try {
|
||||
wait();
|
||||
} catch (InterruptedException ie) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
final ByteBuffer pixelBuffer = ByteBuffer.allocate(mPixelsResult.getByteCount());
|
||||
mPixelsResult.copyPixelsToBuffer(pixelBuffer);
|
||||
int w = mPixelsResult.getWidth();
|
||||
int h = mPixelsResult.getHeight();
|
||||
|
||||
mGotPixelsResult = false;
|
||||
mPixelsResult = null;
|
||||
|
||||
|
||||
if ((pixelBuffer == null) || (w == 0) || (h == 0)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// The page used in robocop tests is a grid of different colored squares.
|
||||
// The function will log the color of each square found in the screen capture.
|
||||
// This allows the screen capture to be examined in the log output in a human
|
||||
// readable format.
|
||||
// logPixels(pixelBuffer, w, h);
|
||||
|
||||
pixelBuffer.position(0);
|
||||
String mapFile = mRootPath + "/pixels.map";
|
||||
|
||||
FileOutputStream fos = null;
|
||||
BufferedOutputStream bos = null;
|
||||
DataOutputStream dos = null;
|
||||
try {
|
||||
fos = new FileOutputStream(mapFile);
|
||||
bos = new BufferedOutputStream(fos);
|
||||
dos = new DataOutputStream(bos);
|
||||
dos.write(pixelBuffer.array());
|
||||
} catch (IOException e) {
|
||||
throw new RoboCopException("exception with pixel writer on file: " + mapFile);
|
||||
} finally {
|
||||
try {
|
||||
if (dos != null) {
|
||||
dos.flush();
|
||||
dos.close();
|
||||
}
|
||||
// closing dos automatically closes bos
|
||||
if (fos != null) {
|
||||
fos.flush();
|
||||
fos.close();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
log(LogLevel.ERROR, e);
|
||||
throw new RoboCopException("exception closing pixel writer on file: " + mapFile);
|
||||
}
|
||||
}
|
||||
return new PaintedSurface(mapFile, w, h);
|
||||
}
|
||||
|
||||
public int mHeight=0;
|
||||
public int mScrollHeight=0;
|
||||
public int mPageHeight=10;
|
||||
|
||||
@Override
|
||||
public int getScrollHeight() {
|
||||
return mScrollHeight;
|
||||
}
|
||||
@Override
|
||||
public int getPageHeight() {
|
||||
return mPageHeight;
|
||||
}
|
||||
@Override
|
||||
public int getHeight() {
|
||||
return mHeight;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setupScrollHandling() {
|
||||
EventDispatcher.getInstance().registerGeckoThreadListener(new BundleEventListener() {
|
||||
@Override
|
||||
public void handleMessage(final String event, final GeckoBundle message,
|
||||
final EventCallback callback) {
|
||||
mScrollHeight = message.getInt("y");
|
||||
mHeight = message.getInt("cheight");
|
||||
// We don't want a height of 0. That means it's a bad response.
|
||||
if (mHeight > 0) {
|
||||
mPageHeight = message.getInt("height");
|
||||
}
|
||||
}
|
||||
}, "Robocop:Scroll");
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes a filename, loads the file, and returns a string version of the entire file.
|
||||
*/
|
||||
public static String getFile(String filename)
|
||||
{
|
||||
StringBuilder text = new StringBuilder();
|
||||
|
||||
BufferedReader br = null;
|
||||
try {
|
||||
br = new BufferedReader(new FileReader(filename));
|
||||
String line;
|
||||
|
||||
while ((line = br.readLine()) != null) {
|
||||
text.append(line);
|
||||
text.append('\n');
|
||||
}
|
||||
} catch (IOException e) {
|
||||
log(LogLevel.ERROR, e);
|
||||
} finally {
|
||||
try {
|
||||
if (br != null) {
|
||||
br.close();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
}
|
||||
}
|
||||
return text.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes a string of "key=value" pairs split by \n and creates a hash table.
|
||||
*/
|
||||
public static Map<String, String> convertTextToTable(String data)
|
||||
{
|
||||
HashMap<String, String> retVal = new HashMap<String, String>();
|
||||
|
||||
String[] lines = data.split("\n");
|
||||
for (int i = 0; i < lines.length; i++) {
|
||||
String[] parts = lines[i].split("=", 2);
|
||||
retVal.put(parts[0].trim(), parts[1].trim());
|
||||
}
|
||||
return retVal;
|
||||
}
|
||||
|
||||
public static void logAllStackTraces(LogLevel level) {
|
||||
StringBuffer sb = new StringBuffer();
|
||||
sb.append("Dumping ALL the threads!\n");
|
||||
Map<Thread, StackTraceElement[]> allStacks = Thread.getAllStackTraces();
|
||||
for (Thread t : allStacks.keySet()) {
|
||||
sb.append(t.toString()).append('\n');
|
||||
for (StackTraceElement ste : allStacks.get(t)) {
|
||||
sb.append(ste.toString()).append('\n');
|
||||
}
|
||||
sb.append('\n');
|
||||
}
|
||||
log(level, sb.toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the filename used for logging. If the file already exists, delete it
|
||||
* as a safe-guard against accidentally appending to an old log file.
|
||||
*/
|
||||
public static void setLogFile(String filename) {
|
||||
mLogFile = filename;
|
||||
File file = new File(mLogFile);
|
||||
if (file.exists()) {
|
||||
file.delete();
|
||||
}
|
||||
}
|
||||
|
||||
public static void setLogLevel(LogLevel level) {
|
||||
mLogLevel = level;
|
||||
}
|
||||
|
||||
public static void log(LogLevel level, String message) {
|
||||
log(level, message, null);
|
||||
}
|
||||
|
||||
public static void log(LogLevel level, Throwable t) {
|
||||
log(level, null, t);
|
||||
}
|
||||
|
||||
@SuppressWarnings("try")
|
||||
public static void log(LogLevel level, String message, Throwable t) {
|
||||
if (mLogFile == null) {
|
||||
throw new RuntimeException(
|
||||
"No log file specified!\n" +
|
||||
"(If you are running this test from an IDE don't forget to before run \"robocop --serve\")");
|
||||
}
|
||||
|
||||
if (level.isEnabled(mLogLevel)) {
|
||||
PrintWriter pw = null;
|
||||
try (StrictModeContext unused = StrictModeContext.allowDiskWrites()) {
|
||||
try {
|
||||
pw = new PrintWriter(new FileWriter(mLogFile, true));
|
||||
if (message != null) {
|
||||
pw.println(message);
|
||||
}
|
||||
if (t != null) {
|
||||
t.printStackTrace(pw);
|
||||
}
|
||||
} catch (IOException ioe) {
|
||||
Log.e("Robocop", "exception with file writer on: " + mLogFile);
|
||||
} finally {
|
||||
if (pw != null) {
|
||||
pw.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// PrintWriter doesn't throw IOE but sets an error flag instead,
|
||||
// so check for that
|
||||
if (pw != null && pw.checkError()) {
|
||||
Log.e("Robocop", "exception with file writer on: " + mLogFile);
|
||||
}
|
||||
}
|
||||
|
||||
if (level == LogLevel.INFO) {
|
||||
Log.i("Robocop", message, t);
|
||||
} else if (level == LogLevel.DEBUG) {
|
||||
Log.d("Robocop", message, t);
|
||||
} else if (level == LogLevel.WARN) {
|
||||
Log.w("Robocop", message, t);
|
||||
} else if (level == LogLevel.ERROR) {
|
||||
Log.e("Robocop", message, t);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,117 +0,0 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
package org.mozilla.gecko;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.EditText;
|
||||
import android.widget.TextView;
|
||||
|
||||
import org.mozilla.gecko.toolbar.TabCounter;
|
||||
|
||||
public class FennecNativeElement implements Element {
|
||||
private final Activity mActivity;
|
||||
private final Integer mId;
|
||||
private final String mName;
|
||||
|
||||
public FennecNativeElement(Integer id, Activity activity) {
|
||||
mId = id;
|
||||
mActivity = activity;
|
||||
mName = activity.getResources().getResourceName(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer getId() {
|
||||
return mId;
|
||||
}
|
||||
|
||||
private boolean mClickSuccess;
|
||||
|
||||
@Override
|
||||
public boolean click() {
|
||||
mClickSuccess = false;
|
||||
RobocopUtils.runOnUiThreadSync(mActivity,
|
||||
new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
View view = mActivity.findViewById(mId);
|
||||
if (view != null) {
|
||||
if (view.performClick()) {
|
||||
mClickSuccess = true;
|
||||
} else {
|
||||
FennecNativeDriver.log(FennecNativeDriver.LogLevel.WARN,
|
||||
"Robocop called click on an element with no listener " + mId + " " + mName);
|
||||
}
|
||||
} else {
|
||||
FennecNativeDriver.log(FennecNativeDriver.LogLevel.ERROR,
|
||||
"click: unable to find view " + mId + " " + mName);
|
||||
}
|
||||
}
|
||||
});
|
||||
return mClickSuccess;
|
||||
}
|
||||
|
||||
private Object mText;
|
||||
|
||||
@Override
|
||||
public String getText() {
|
||||
mText = null;
|
||||
RobocopUtils.runOnUiThreadSync(mActivity,
|
||||
new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
View v = mActivity.findViewById(mId);
|
||||
if (v instanceof EditText) {
|
||||
EditText et = (EditText)v;
|
||||
mText = et.getEditableText();
|
||||
} else if (v instanceof TabCounter) {
|
||||
TabCounter tc = (TabCounter)v;
|
||||
mText = tc.getText();
|
||||
} else if (v instanceof ViewGroup) {
|
||||
ViewGroup vg = (ViewGroup)v;
|
||||
for (int i = 0; i < vg.getChildCount(); i++) {
|
||||
if (vg.getChildAt(i) instanceof TextView) {
|
||||
mText = ((TextView)vg.getChildAt(i)).getText();
|
||||
}
|
||||
}
|
||||
} else if (v instanceof TextView) {
|
||||
mText = ((TextView)v).getText();
|
||||
} else if (v == null) {
|
||||
FennecNativeDriver.log(FennecNativeDriver.LogLevel.ERROR,
|
||||
"getText: unable to find view " + mId + " " + mName);
|
||||
} else {
|
||||
FennecNativeDriver.log(FennecNativeDriver.LogLevel.ERROR,
|
||||
"getText: unhandled type for view " + mId + " " + mName);
|
||||
}
|
||||
} // end of run() method definition
|
||||
} // end of anonymous Runnable object instantiation
|
||||
);
|
||||
if (mText == null) {
|
||||
FennecNativeDriver.log(FennecNativeDriver.LogLevel.WARN,
|
||||
"getText: Text is null for view " + mId + " " + mName);
|
||||
return null;
|
||||
}
|
||||
return mText.toString();
|
||||
}
|
||||
|
||||
private boolean mDisplayed;
|
||||
|
||||
@Override
|
||||
public boolean isDisplayed() {
|
||||
mDisplayed = false;
|
||||
RobocopUtils.runOnUiThreadSync(mActivity,
|
||||
new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
View view = mActivity.findViewById(mId);
|
||||
if (view != null) {
|
||||
mDisplayed = true;
|
||||
}
|
||||
}
|
||||
});
|
||||
return mDisplayed;
|
||||
}
|
||||
}
|
@ -1,74 +0,0 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
package org.mozilla.gecko;
|
||||
|
||||
|
||||
public class FennecTalosAssert implements Assert {
|
||||
|
||||
public FennecTalosAssert() { }
|
||||
|
||||
/**
|
||||
* Write information to a logfile and logcat
|
||||
*/
|
||||
public void dumpLog(String message) {
|
||||
FennecNativeDriver.log(FennecNativeDriver.LogLevel.INFO, message);
|
||||
}
|
||||
|
||||
/** Write information to a logfile and logcat */
|
||||
public void dumpLog(String message, Throwable t) {
|
||||
FennecNativeDriver.log(FennecNativeDriver.LogLevel.INFO, message, t);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the filename used for dumpLog.
|
||||
*/
|
||||
public void setLogFile(String filename) {
|
||||
FennecNativeDriver.setLogFile(filename);
|
||||
}
|
||||
|
||||
public void setTestName(String testName) { }
|
||||
|
||||
public void endTest() { }
|
||||
|
||||
public void ok(boolean condition, String name, String diag) {
|
||||
if (!condition) {
|
||||
dumpLog("__FAIL" + name + ": " + diag + "__FAIL");
|
||||
}
|
||||
}
|
||||
|
||||
public void is(Object actual, Object expected, String name) {
|
||||
boolean pass = (actual == null ? expected == null : actual.equals(expected));
|
||||
ok(pass, name, "got " + actual + ", expected " + expected);
|
||||
}
|
||||
|
||||
public void isnot(Object actual, Object notExpected, String name) {
|
||||
boolean fail = (actual == null ? notExpected == null : actual.equals(notExpected));
|
||||
ok(!fail, name, "got " + actual + ", expected not " + notExpected);
|
||||
}
|
||||
|
||||
public void ispixel(int actual, int r, int g, int b, String name) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public void isnotpixel(int actual, int r, int g, int b, String name) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public void todo(boolean condition, String name, String diag) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public void todo_is(Object actual, Object expected, String name) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public void todo_isnot(Object actual, Object notExpected, String name) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public void info(String name, String message) {
|
||||
dumpLog(name + ": " + message);
|
||||
}
|
||||
}
|
@ -1,40 +0,0 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
package org.mozilla.gecko;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import org.mozilla.gecko.tests.BaseRobocopTest;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
|
||||
/**
|
||||
* An Activity that extracts Robocop settings from robotium.config, launches
|
||||
* Fennec with the Robocop testing parameters, and finishes itself.
|
||||
* <p>
|
||||
* This is intended to be used by local testers using |mach robocop --serve|.
|
||||
*/
|
||||
public class LaunchFennecWithConfigurationActivity extends Activity {
|
||||
@Override
|
||||
public void onCreate(Bundle arguments) {
|
||||
super.onCreate(arguments);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
|
||||
final String configFile = FennecNativeDriver.getFile(BaseRobocopTest.DEFAULT_ROOT_PATH + "/robotium.config");
|
||||
final Map<String, String> config = FennecNativeDriver.convertTextToTable(configFile);
|
||||
final Intent intent = BaseRobocopTest.createActivityIntent(config);
|
||||
|
||||
intent.setClassName(AppConstants.ANDROID_PACKAGE_NAME, AppConstants.MOZ_ANDROID_BROWSER_INTENT_CLASS);
|
||||
|
||||
this.finish();
|
||||
this.startActivity(intent);
|
||||
}
|
||||
}
|
@ -1,105 +0,0 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
package org.mozilla.gecko;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.nio.MappedByteBuffer;
|
||||
import java.nio.channels.FileChannel;
|
||||
|
||||
import android.graphics.Bitmap;
|
||||
import android.util.Base64;
|
||||
import android.util.Base64OutputStream;
|
||||
|
||||
public class PaintedSurface {
|
||||
private String mFileName;
|
||||
private int mWidth;
|
||||
private int mHeight;
|
||||
private FileInputStream mPixelFile;
|
||||
private MappedByteBuffer mPixelBuffer;
|
||||
|
||||
public PaintedSurface(String filename, int width, int height) {
|
||||
mFileName = filename;
|
||||
mWidth = width;
|
||||
mHeight = height;
|
||||
|
||||
try {
|
||||
File f = new File(filename);
|
||||
int pixelSize = (int)f.length();
|
||||
|
||||
mPixelFile = new FileInputStream(filename);
|
||||
mPixelBuffer = mPixelFile.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, pixelSize);
|
||||
} catch (java.io.FileNotFoundException e) {
|
||||
FennecNativeDriver.log(FennecNativeDriver.LogLevel.ERROR, e);
|
||||
} catch (java.io.IOException e) {
|
||||
FennecNativeDriver.log(FennecNativeDriver.LogLevel.ERROR, e);
|
||||
}
|
||||
}
|
||||
|
||||
public final int getWidth() {
|
||||
return mWidth;
|
||||
}
|
||||
|
||||
public final int getHeight() {
|
||||
return mHeight;
|
||||
}
|
||||
|
||||
private int pixelAtIndex(int index) {
|
||||
int b1 = mPixelBuffer.get(index) & 0xFF;
|
||||
int b2 = mPixelBuffer.get(index + 1) & 0xFF;
|
||||
int b3 = mPixelBuffer.get(index + 2) & 0xFF;
|
||||
int b4 = mPixelBuffer.get(index + 3) & 0xFF;
|
||||
int value = (b1 << 24) + (b2 << 16) + (b3 << 8) + (b4 << 0);
|
||||
return value;
|
||||
}
|
||||
|
||||
public final int getPixelAt(int x, int y) {
|
||||
if (mPixelBuffer == null) {
|
||||
throw new RoboCopException("Trying to access PaintedSurface with no active PixelBuffer");
|
||||
}
|
||||
|
||||
if (x >= mWidth || x < 0) {
|
||||
throw new RoboCopException("Trying to access PaintedSurface with invalid x value");
|
||||
}
|
||||
|
||||
if (y >= mHeight || y < 0) {
|
||||
throw new RoboCopException("Trying to access PaintedSurface with invalid y value");
|
||||
}
|
||||
|
||||
// The rows are reversed so row 0 is at the end and we start with the last row.
|
||||
// This is why we do mHeight-y;
|
||||
int index = (x + ((mHeight - y - 1) * mWidth)) * 4;
|
||||
return pixelAtIndex(index);
|
||||
}
|
||||
|
||||
public final String asDataUri() {
|
||||
try {
|
||||
Bitmap bm = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);
|
||||
for (int y = 0; y < mHeight; y++) {
|
||||
for (int x = 0; x < mWidth; x++) {
|
||||
int index = (x + ((mHeight - y - 1) * mWidth)) * 4;
|
||||
bm.setPixel(x, y, pixelAtIndex(index));
|
||||
}
|
||||
}
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||
out.write("data:image/png;base64,".getBytes());
|
||||
Base64OutputStream b64 = new Base64OutputStream(out, Base64.NO_WRAP);
|
||||
bm.compress(Bitmap.CompressFormat.PNG, 100, b64);
|
||||
return new String(out.toByteArray());
|
||||
} catch (Exception e) {
|
||||
FennecNativeDriver.log(FennecNativeDriver.LogLevel.ERROR, e);
|
||||
throw new RoboCopException("Unable to convert surface to a PNG data:uri");
|
||||
}
|
||||
}
|
||||
|
||||
public void close() {
|
||||
try {
|
||||
mPixelFile.close();
|
||||
} catch (Exception e) {
|
||||
FennecNativeDriver.log(FennecNativeDriver.LogLevel.DEBUG, e);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,24 +0,0 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
package org.mozilla.gecko;
|
||||
|
||||
public class RoboCopException extends RuntimeException {
|
||||
|
||||
public RoboCopException() {
|
||||
super();
|
||||
}
|
||||
|
||||
public RoboCopException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
public RoboCopException(Throwable cause) {
|
||||
super(cause);
|
||||
}
|
||||
|
||||
public RoboCopException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
}
|
@ -1,17 +0,0 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
package org.mozilla.gecko;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.FragmentActivity;
|
||||
|
||||
public class RobocopShare1 extends FragmentActivity {
|
||||
private static Bundle sArguments;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle arguments) {
|
||||
super.onCreate(arguments);
|
||||
}
|
||||
}
|
@ -1,17 +0,0 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
package org.mozilla.gecko;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.FragmentActivity;
|
||||
|
||||
public class RobocopShare2 extends FragmentActivity {
|
||||
private static Bundle sArguments;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle arguments) {
|
||||
super.onCreate(arguments);
|
||||
}
|
||||
}
|
@ -1,58 +0,0 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
package org.mozilla.gecko;
|
||||
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import android.app.Activity;
|
||||
|
||||
public final class RobocopUtils {
|
||||
private static final int MAX_WAIT_MS = 20000;
|
||||
|
||||
private RobocopUtils() {}
|
||||
|
||||
public static void runOnUiThreadSync(Activity activity, final Runnable runnable) {
|
||||
final AtomicBoolean sentinel = new AtomicBoolean(false);
|
||||
|
||||
// On the UI thread, run the Runnable, then set sentinel to true and wake this thread.
|
||||
activity.runOnUiThread(
|
||||
new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
runnable.run();
|
||||
|
||||
synchronized (sentinel) {
|
||||
sentinel.set(true);
|
||||
sentinel.notifyAll();
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
// Suspend this thread, until the other thread completes its work or until a timeout is
|
||||
// reached.
|
||||
long startTimestamp = System.currentTimeMillis();
|
||||
|
||||
synchronized (sentinel) {
|
||||
while (!sentinel.get()) {
|
||||
try {
|
||||
sentinel.wait(MAX_WAIT_MS);
|
||||
} catch (InterruptedException e) {
|
||||
FennecNativeDriver.log(FennecNativeDriver.LogLevel.ERROR, e);
|
||||
}
|
||||
|
||||
// Abort if we woke up due to timeout (instead of spuriously).
|
||||
if (System.currentTimeMillis() - startTimestamp >= MAX_WAIT_MS) {
|
||||
FennecNativeDriver.log(FennecNativeDriver.LogLevel.ERROR,
|
||||
"time-out waiting for UI thread");
|
||||
FennecNativeDriver.logAllStackTraces(FennecNativeDriver.LogLevel.ERROR);
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,188 +0,0 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
package org.mozilla.gecko;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.json.JSONObject;
|
||||
|
||||
// This implements the structured logging API described here: https://firefox-source-docs.mozilla.org/mozbase/loggingreporting.html
|
||||
public class StructuredLogger {
|
||||
private final static HashSet<String> validTestStatus = new HashSet<String>(Arrays.asList("PASS", "FAIL", "TIMEOUT", "NOTRUN", "ASSERT"));
|
||||
private final static HashSet<String> validTestEnd = new HashSet<String>(Arrays.asList("PASS", "FAIL", "OK", "ERROR", "TIMEOUT",
|
||||
"CRASH", "ASSERT", "SKIP"));
|
||||
|
||||
private String mName;
|
||||
private String mComponent;
|
||||
private LoggerCallback mCallback;
|
||||
|
||||
static public interface LoggerCallback {
|
||||
public void call(String output);
|
||||
}
|
||||
|
||||
/* A default logger callback that prints the JSON output to stdout.
|
||||
* This is not to be used in robocop as we write to a log file. */
|
||||
static class StandardLoggerCallback implements LoggerCallback {
|
||||
public void call(String output) {
|
||||
System.out.println(output);
|
||||
}
|
||||
}
|
||||
|
||||
public StructuredLogger(String name, String component, LoggerCallback callback) {
|
||||
mName = name;
|
||||
mComponent = component;
|
||||
mCallback = callback;
|
||||
}
|
||||
|
||||
public StructuredLogger(String name, String component) {
|
||||
this(name, component, new StandardLoggerCallback());
|
||||
}
|
||||
|
||||
public StructuredLogger(String name, LoggerCallback callback) {
|
||||
this(name, null, callback);
|
||||
}
|
||||
|
||||
public StructuredLogger(String name) {
|
||||
this(name, null, new StandardLoggerCallback());
|
||||
}
|
||||
|
||||
public void suiteStart(List<String> tests, Map<String, Object> runInfo) {
|
||||
HashMap<String, Object> data = new HashMap<String, Object>();
|
||||
data.put("tests", tests);
|
||||
if (runInfo != null) {
|
||||
data.put("run_info", runInfo);
|
||||
}
|
||||
this.logData("suite_start", data);
|
||||
}
|
||||
|
||||
public void suiteStart(List<String> tests) {
|
||||
this.suiteStart(tests, null);
|
||||
}
|
||||
|
||||
public void suiteEnd() {
|
||||
this.logData("suite_end");
|
||||
}
|
||||
|
||||
public void testStart(String test) {
|
||||
HashMap<String, Object> data = new HashMap<String, Object>();
|
||||
data.put("test", test);
|
||||
this.logData("test_start", data);
|
||||
}
|
||||
|
||||
public void testStatus(String test, String subtest, String status, String expected, String message) {
|
||||
status = status.toUpperCase();
|
||||
if (!StructuredLogger.validTestStatus.contains(status)) {
|
||||
throw new IllegalArgumentException("Unrecognized status: " + status);
|
||||
}
|
||||
|
||||
HashMap<String, Object> data = new HashMap<String, Object>();
|
||||
data.put("test", test);
|
||||
data.put("subtest", subtest);
|
||||
data.put("status", status);
|
||||
|
||||
if (message != null) {
|
||||
data.put("message", message);
|
||||
}
|
||||
if (!expected.equals(status)) {
|
||||
data.put("expected", expected);
|
||||
}
|
||||
|
||||
this.logData("test_status", data);
|
||||
}
|
||||
|
||||
public void testStatus(String test, String subtest, String status, String message) {
|
||||
this.testStatus(test, subtest, status, "PASS", message);
|
||||
}
|
||||
|
||||
public void testEnd(String test, String status, String expected, String message, Map<String, Object> extra) {
|
||||
status = status.toUpperCase();
|
||||
if (!StructuredLogger.validTestEnd.contains(status)) {
|
||||
throw new IllegalArgumentException("Unrecognized status: " + status);
|
||||
}
|
||||
|
||||
HashMap<String, Object> data = new HashMap<String, Object>();
|
||||
data.put("test", test);
|
||||
data.put("status", status);
|
||||
|
||||
if (message != null) {
|
||||
data.put("message", message);
|
||||
}
|
||||
if (extra != null) {
|
||||
data.put("extra", extra);
|
||||
}
|
||||
if (!expected.equals(status) && !status.equals("SKIP")) {
|
||||
data.put("expected", expected);
|
||||
}
|
||||
|
||||
this.logData("test_end", data);
|
||||
}
|
||||
|
||||
public void testEnd(String test, String status, String expected, String message) {
|
||||
this.testEnd(test, status, expected, message, null);
|
||||
}
|
||||
|
||||
public void testEnd(String test, String status, String message) {
|
||||
this.testEnd(test, status, "OK", message, null);
|
||||
}
|
||||
|
||||
|
||||
public void debug(String message) {
|
||||
this.log("debug", message);
|
||||
}
|
||||
|
||||
public void info(String message) {
|
||||
this.log("info", message);
|
||||
}
|
||||
|
||||
public void warning(String message) {
|
||||
this.log("warning", message);
|
||||
}
|
||||
|
||||
public void error(String message) {
|
||||
this.log("error", message);
|
||||
}
|
||||
|
||||
public void critical(String message) {
|
||||
this.log("critical", message);
|
||||
}
|
||||
|
||||
private void log(String level, String message) {
|
||||
HashMap<String, Object> data = new HashMap<String, Object>();
|
||||
data.put("message", message);
|
||||
data.put("level", level);
|
||||
this.logData("log", data);
|
||||
}
|
||||
|
||||
private HashMap<String, Object> makeLogData(String action, Map<String, Object> data) {
|
||||
HashMap<String, Object> allData = new HashMap<String, Object>();
|
||||
allData.put("action", action);
|
||||
allData.put("time", System.currentTimeMillis());
|
||||
allData.put("thread", JSONObject.NULL);
|
||||
allData.put("pid", JSONObject.NULL);
|
||||
allData.put("source", mName);
|
||||
if (mComponent != null) {
|
||||
allData.put("component", mComponent);
|
||||
}
|
||||
|
||||
allData.putAll(data);
|
||||
|
||||
return allData;
|
||||
}
|
||||
|
||||
private void logData(String action, Map<String, Object> data) {
|
||||
HashMap<String, Object> logData = this.makeLogData(action, data);
|
||||
JSONObject jsonObject = new JSONObject(logData);
|
||||
mCallback.call(jsonObject.toString());
|
||||
}
|
||||
|
||||
private void logData(String action) {
|
||||
this.logData(action, new HashMap<String, Object>());
|
||||
}
|
||||
|
||||
}
|
@ -1,253 +0,0 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
package org.mozilla.gecko.tests;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import org.mozilla.gecko.Actions;
|
||||
import org.mozilla.gecko.home.HomePager;
|
||||
|
||||
import android.support.v4.view.ViewPager;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.text.TextUtils;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ListAdapter;
|
||||
import android.widget.ListView;
|
||||
import android.widget.TabWidget;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.robotium.solo.Condition;
|
||||
|
||||
/**
|
||||
* This class is an extension of OldBaseTest that helps with interaction with about:home
|
||||
* This class contains methods that access the different tabs from about:home, methods that get information like history and bookmarks from the database, edit and remove bookmarks and history items
|
||||
* The purpose of this class is to collect all the logically connected methods that deal with about:home
|
||||
* To use any of these methods in your test make sure it extends AboutHomeTest instead of OldBaseTest
|
||||
*/
|
||||
abstract class AboutHomeTest extends PixelTest {
|
||||
protected enum AboutHomeTabs {
|
||||
RECENT_TABS,
|
||||
HISTORY,
|
||||
TOP_SITES,
|
||||
BOOKMARKS,
|
||||
};
|
||||
|
||||
private final ArrayList<String> aboutHomeTabs = new ArrayList<String>() {{
|
||||
add("TOP_SITES");
|
||||
add("BOOKMARKS");
|
||||
}};
|
||||
|
||||
|
||||
@Override
|
||||
public void setUp() throws Exception {
|
||||
super.setUp();
|
||||
|
||||
if (aboutHomeTabs.size() < 4) {
|
||||
// Update it for tablets vs. phones.
|
||||
if (mDevice.type.equals("phone")) {
|
||||
aboutHomeTabs.add(0, AboutHomeTabs.HISTORY.toString());
|
||||
aboutHomeTabs.add(0, AboutHomeTabs.RECENT_TABS.toString());
|
||||
} else {
|
||||
aboutHomeTabs.add(AboutHomeTabs.HISTORY.toString());
|
||||
aboutHomeTabs.add(AboutHomeTabs.RECENT_TABS.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* FIXME: Write new versions of these methods and update their consumers to use the new about:home pages.
|
||||
*/
|
||||
protected ListView getHistoryList(String waitText, int expectedChildCount) {
|
||||
return null;
|
||||
}
|
||||
protected ListView getHistoryList(String waitText) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Returns true if the bookmark is displayed in the bookmarks tab, false otherwise - does not check in folders
|
||||
protected void isBookmarkDisplayed(final String url) {
|
||||
boolean isCorrect = waitForCondition(new Condition() {
|
||||
@Override
|
||||
public boolean isSatisfied() {
|
||||
View bookmark = getDisplayedBookmark(url);
|
||||
return bookmark != null;
|
||||
}
|
||||
}, MAX_WAIT_MS);
|
||||
|
||||
mAsserter.ok(isCorrect, "Checking that " + url + " displayed as a bookmark", url + " displayed");
|
||||
}
|
||||
|
||||
// Loads a bookmark by tapping on the bookmark view in the Bookmarks tab
|
||||
protected void loadBookmark(String url) {
|
||||
View bookmark = getDisplayedBookmark(url);
|
||||
if (bookmark != null) {
|
||||
Actions.EventExpecter contentEventExpecter =
|
||||
mActions.expectGlobalEvent(Actions.EventType.UI, "Content:DOMContentLoaded");
|
||||
mSolo.clickOnView(bookmark);
|
||||
contentEventExpecter.blockForEvent();
|
||||
contentEventExpecter.unregisterListener();
|
||||
} else {
|
||||
mAsserter.ok(false, url + " is not one of the displayed bookmarks", "Please make sure the url provided is bookmarked");
|
||||
}
|
||||
}
|
||||
|
||||
// Opens the bookmark context menu by long-tapping on it
|
||||
protected void openBookmarkContextMenu(String url) {
|
||||
View bookmark = getDisplayedBookmark(url);
|
||||
if (bookmark != null) {
|
||||
mSolo.waitForView(bookmark);
|
||||
mSolo.clickLongOnView(bookmark, LONG_PRESS_TIME);
|
||||
mSolo.waitForDialogToOpen();
|
||||
} else {
|
||||
mAsserter.ok(false, url + " is not one of the displayed bookmarks", "Please make sure the url provided is bookmarked");
|
||||
}
|
||||
}
|
||||
|
||||
// @return the View associated with bookmark for the provided url or null if the link is not bookmarked
|
||||
protected View getDisplayedBookmark(String url) {
|
||||
openAboutHomeTab(AboutHomeTabs.BOOKMARKS);
|
||||
mSolo.hideSoftKeyboard();
|
||||
getInstrumentation().waitForIdleSync();
|
||||
ListView bookmarksTabList = findListViewWithTag(HomePager.LIST_TAG_BOOKMARKS);
|
||||
waitForNonEmptyListToLoad(bookmarksTabList);
|
||||
ListAdapter adapter = bookmarksTabList.getAdapter();
|
||||
if (adapter != null) {
|
||||
for (int i = 0; i < adapter.getCount(); i++ ) {
|
||||
// I am unable to click the view taken with getView for some reason so getting the child at i
|
||||
bookmarksTabList.smoothScrollToPosition(i);
|
||||
View bookmarkView = bookmarksTabList.getChildAt(i);
|
||||
if (bookmarkView instanceof android.widget.LinearLayout) {
|
||||
ViewGroup bookmarkItemView = (ViewGroup) bookmarkView;
|
||||
for (int j = 0 ; j < bookmarkItemView.getChildCount(); j++) {
|
||||
View bookmarkContent = bookmarkItemView.getChildAt(j);
|
||||
if (bookmarkContent instanceof android.widget.LinearLayout) {
|
||||
ViewGroup bookmarkItemLayout = (ViewGroup) bookmarkContent;
|
||||
for (int k = 0 ; k < bookmarkItemLayout.getChildCount(); k++) {
|
||||
// Both the title and url are represented as text views so we can cast the view without any issues
|
||||
TextView bookmarkTextContent = (TextView)bookmarkItemLayout.getChildAt(k);
|
||||
if (url.equals(bookmarkTextContent.getText().toString())) {
|
||||
return bookmarkView;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Waits for the given ListView to have a non-empty adapter and be populated
|
||||
* with a minimum number of items.
|
||||
*
|
||||
* This method will return false if the given ListView or its adapter is null,
|
||||
* or if the ListView does not have the minimum number of items.
|
||||
*/
|
||||
protected boolean waitForListToLoad(final ListView listView, final int minSize) {
|
||||
Condition listWaitCondition = new Condition() {
|
||||
@Override
|
||||
public boolean isSatisfied() {
|
||||
if (listView == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
final ListAdapter adapter = listView.getAdapter();
|
||||
if (adapter == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return (listView.getCount() - listView.getHeaderViewsCount() >= minSize);
|
||||
}
|
||||
};
|
||||
return waitForCondition(listWaitCondition, MAX_WAIT_MS);
|
||||
}
|
||||
|
||||
protected boolean waitForNonEmptyListToLoad(final ListView listView) {
|
||||
return waitForListToLoad(listView, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an active ListView with the specified tag .
|
||||
*
|
||||
* This method uses the predefined tags in HomePager.
|
||||
*/
|
||||
protected final ListView findListViewWithTag(String tag) {
|
||||
for (ListView listView : mSolo.getCurrentViews(ListView.class)) {
|
||||
final String listTag = (String) listView.getTag();
|
||||
if (TextUtils.isEmpty(listTag)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (TextUtils.equals(listTag, tag)) {
|
||||
return listView;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
// A wait in order for the about:home tab to be rendered after drag/tab selection
|
||||
private void waitForAboutHomeTab(final int tabIndex) {
|
||||
boolean correctTab = waitForCondition(new Condition() {
|
||||
@Override
|
||||
public boolean isSatisfied() {
|
||||
ViewPager pager = mSolo.getView(ViewPager.class, 0);
|
||||
return (pager.getCurrentItem() == tabIndex);
|
||||
}
|
||||
}, MAX_WAIT_MS);
|
||||
mAsserter.ok(correctTab, "Checking that the correct tab is displayed", "The " + aboutHomeTabs.get(tabIndex) + " tab is displayed");
|
||||
}
|
||||
|
||||
private void clickAboutHomeTab(AboutHomeTabs tab) {
|
||||
mSolo.clickOnText(tab.toString().replace("_", " "));
|
||||
}
|
||||
|
||||
/**
|
||||
* Swipes to an about:home tab.
|
||||
* @param swipeVector swipeVector Value and direction to swipe (go left for negative, right for positive).
|
||||
*/
|
||||
private void swipeAboutHome(int swipeVector) {
|
||||
// Increase swipe width, which will especially impact tablets.
|
||||
int swipeWidth = mDriver.getGeckoWidth() - 1;
|
||||
int swipeHeight = mDriver.getGeckoHeight() / 2;
|
||||
|
||||
if (swipeVector >= 0) {
|
||||
// Emulate swipe motion from right to left.
|
||||
for (int i = 0; i < swipeVector; i++) {
|
||||
mActions.drag(swipeWidth, 0, swipeHeight, swipeHeight);
|
||||
mSolo.sleep(100);
|
||||
}
|
||||
} else {
|
||||
// Emulate swipe motion from left to right.
|
||||
for (int i = 0; i > swipeVector; i--) {
|
||||
mActions.drag(0, swipeWidth, swipeHeight, swipeHeight);
|
||||
mSolo.sleep(100);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This method can be used to open the different tabs of about:home.
|
||||
*/
|
||||
protected void openAboutHomeTab(AboutHomeTabs tab) {
|
||||
focusUrlBar();
|
||||
ViewPager pager = mSolo.getView(ViewPager.class, 0);
|
||||
final int currentTabIndex = pager.getCurrentItem();
|
||||
int tabOffset;
|
||||
|
||||
// Handle tablets by just clicking the visible tab title.
|
||||
if (mDevice.type.equals("tablet")) {
|
||||
clickAboutHomeTab(tab);
|
||||
return;
|
||||
}
|
||||
|
||||
// Handle phones (non-tablets).
|
||||
tabOffset = aboutHomeTabs.indexOf(tab.toString()) - currentTabIndex;
|
||||
swipeAboutHome(tabOffset);
|
||||
waitForAboutHomeTab(aboutHomeTabs.indexOf(tab.toString()));
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user