Merge change 4252 into donut
* changes:
Add more comment for EXTRA_APPEND_LOCATION
diff --git a/Android.mk b/Android.mk
index bffd04c..6e292a8 100644
--- a/Android.mk
+++ b/Android.mk
@@ -76,6 +76,7 @@
core/java/android/app/IIntentSender.aidl \
core/java/android/app/INotificationManager.aidl \
core/java/android/app/ISearchManager.aidl \
+ core/java/android/app/ISearchManagerCallback.aidl \
core/java/android/app/IServiceConnection.aidl \
core/java/android/app/IStatusBar.aidl \
core/java/android/app/IThumbnailReceiver.aidl \
diff --git a/api/4.xml b/api/4.xml
index 893301e..2e5f34a 100644
--- a/api/4.xml
+++ b/api/4.xml
@@ -122,17 +122,6 @@
visibility="public"
>
</field>
-<field name="ADD_SYSTEM_SERVICE"
- type="java.lang.String"
- transient="false"
- volatile="false"
- value=""android.permission.ADD_SYSTEM_SERVICE""
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
<field name="BATTERY_STATS"
type="java.lang.String"
transient="false"
@@ -925,17 +914,6 @@
visibility="public"
>
</field>
-<field name="SET_PROCESS_FOREGROUND"
- type="java.lang.String"
- transient="false"
- volatile="false"
- value=""android.permission.SET_PROCESS_FOREGROUND""
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
<field name="SET_PROCESS_LIMIT"
type="java.lang.String"
transient="false"
diff --git a/api/current.xml b/api/current.xml
index f30c505..d13797c 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -122,17 +122,6 @@
visibility="public"
>
</field>
-<field name="ADD_SYSTEM_SERVICE"
- type="java.lang.String"
- transient="false"
- volatile="false"
- value=""android.permission.ADD_SYSTEM_SERVICE""
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
<field name="BATTERY_STATS"
type="java.lang.String"
transient="false"
@@ -947,17 +936,6 @@
visibility="public"
>
</field>
-<field name="SET_PROCESS_FOREGROUND"
- type="java.lang.String"
- transient="false"
- volatile="false"
- value=""android.permission.SET_PROCESS_FOREGROUND""
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
<field name="SET_PROCESS_LIMIT"
type="java.lang.String"
transient="false"
@@ -29035,6 +29013,19 @@
<parameter name="mode" type="int">
</parameter>
</method>
+<method name="getSharedPrefsFile"
+ return="java.io.File"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="name" type="java.lang.String">
+</parameter>
+</method>
<method name="getSystemService"
return="java.lang.Object"
abstract="false"
@@ -46228,1694 +46219,6 @@
</method>
</class>
</package>
-<package name="android.gesture"
->
-<class name="Gesture"
- extends="java.lang.Object"
- abstract="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<implements name="android.os.Parcelable">
-</implements>
-<constructor name="Gesture"
- type="android.gesture.Gesture"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</constructor>
-<method name="addStroke"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="stroke" type="android.gesture.GestureStroke">
-</parameter>
-</method>
-<method name="describeContents"
- return="int"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="getBoundingBox"
- return="android.graphics.RectF"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="getID"
- return="long"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="getLength"
- return="float"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="getStrokes"
- return="java.util.ArrayList<android.gesture.GestureStroke>"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="getStrokesCount"
- return="int"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="toBitmap"
- return="android.graphics.Bitmap"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="width" type="int">
-</parameter>
-<parameter name="height" type="int">
-</parameter>
-<parameter name="edge" type="int">
-</parameter>
-<parameter name="numSample" type="int">
-</parameter>
-<parameter name="color" type="int">
-</parameter>
-</method>
-<method name="toBitmap"
- return="android.graphics.Bitmap"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="width" type="int">
-</parameter>
-<parameter name="height" type="int">
-</parameter>
-<parameter name="inset" type="int">
-</parameter>
-<parameter name="color" type="int">
-</parameter>
-</method>
-<method name="toPath"
- return="android.graphics.Path"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="toPath"
- return="android.graphics.Path"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="path" type="android.graphics.Path">
-</parameter>
-</method>
-<method name="toPath"
- return="android.graphics.Path"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="width" type="int">
-</parameter>
-<parameter name="height" type="int">
-</parameter>
-<parameter name="edge" type="int">
-</parameter>
-<parameter name="numSample" type="int">
-</parameter>
-</method>
-<method name="toPath"
- return="android.graphics.Path"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="path" type="android.graphics.Path">
-</parameter>
-<parameter name="width" type="int">
-</parameter>
-<parameter name="height" type="int">
-</parameter>
-<parameter name="edge" type="int">
-</parameter>
-<parameter name="numSample" type="int">
-</parameter>
-</method>
-<method name="writeToParcel"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="out" type="android.os.Parcel">
-</parameter>
-<parameter name="flags" type="int">
-</parameter>
-</method>
-<field name="CREATOR"
- type="android.os.Parcelable.Creator"
- transient="false"
- volatile="false"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-</class>
-<class name="GestureLibraries"
- extends="java.lang.Object"
- abstract="false"
- static="false"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-<method name="fromFile"
- return="android.gesture.GestureLibrary"
- abstract="false"
- native="false"
- synchronized="false"
- static="true"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="path" type="java.lang.String">
-</parameter>
-</method>
-<method name="fromFile"
- return="android.gesture.GestureLibrary"
- abstract="false"
- native="false"
- synchronized="false"
- static="true"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="path" type="java.io.File">
-</parameter>
-</method>
-<method name="fromPrivateFile"
- return="android.gesture.GestureLibrary"
- abstract="false"
- native="false"
- synchronized="false"
- static="true"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="context" type="android.content.Context">
-</parameter>
-<parameter name="name" type="java.lang.String">
-</parameter>
-</method>
-<method name="fromRawResource"
- return="android.gesture.GestureLibrary"
- abstract="false"
- native="false"
- synchronized="false"
- static="true"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="context" type="android.content.Context">
-</parameter>
-<parameter name="resourceId" type="int">
-</parameter>
-</method>
-</class>
-<class name="GestureLibrary"
- extends="java.lang.Object"
- abstract="true"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<constructor name="GestureLibrary"
- type="android.gesture.GestureLibrary"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="protected"
->
-</constructor>
-<method name="addGesture"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="entryName" type="java.lang.String">
-</parameter>
-<parameter name="gesture" type="android.gesture.Gesture">
-</parameter>
-</method>
-<method name="getGestureEntries"
- return="java.util.Set<java.lang.String>"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="getGestures"
- return="java.util.ArrayList<android.gesture.Gesture>"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="entryName" type="java.lang.String">
-</parameter>
-</method>
-<method name="getLearner"
- return="android.gesture.Learner"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="getOrientationStyle"
- return="int"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="getSequenceType"
- return="int"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="isReadOnly"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="load"
- return="boolean"
- abstract="true"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="recognize"
- return="java.util.ArrayList<android.gesture.Prediction>"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="gesture" type="android.gesture.Gesture">
-</parameter>
-</method>
-<method name="removeEntry"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="entryName" type="java.lang.String">
-</parameter>
-</method>
-<method name="removeGesture"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="entryName" type="java.lang.String">
-</parameter>
-<parameter name="gesture" type="android.gesture.Gesture">
-</parameter>
-</method>
-<method name="save"
- return="boolean"
- abstract="true"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="setOrientationStyle"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="style" type="int">
-</parameter>
-</method>
-<method name="setSequenceType"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="type" type="int">
-</parameter>
-</method>
-<field name="mStore"
- type="android.gesture.GestureStore"
- transient="false"
- volatile="false"
- static="false"
- final="true"
- deprecated="not deprecated"
- visibility="protected"
->
-</field>
-</class>
-<class name="GestureOverlayView"
- extends="android.widget.FrameLayout"
- abstract="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<constructor name="GestureOverlayView"
- type="android.gesture.GestureOverlayView"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="context" type="android.content.Context">
-</parameter>
-</constructor>
-<constructor name="GestureOverlayView"
- type="android.gesture.GestureOverlayView"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="context" type="android.content.Context">
-</parameter>
-<parameter name="attrs" type="android.util.AttributeSet">
-</parameter>
-</constructor>
-<constructor name="GestureOverlayView"
- type="android.gesture.GestureOverlayView"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="context" type="android.content.Context">
-</parameter>
-<parameter name="attrs" type="android.util.AttributeSet">
-</parameter>
-<parameter name="defStyle" type="int">
-</parameter>
-</constructor>
-<method name="addOnGestureListener"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="listener" type="android.gesture.GestureOverlayView.OnGestureListener">
-</parameter>
-</method>
-<method name="addOnGesturePerformedListener"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="listener" type="android.gesture.GestureOverlayView.OnGesturePerformedListener">
-</parameter>
-</method>
-<method name="addOnGesturingListener"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="listener" type="android.gesture.GestureOverlayView.OnGesturingListener">
-</parameter>
-</method>
-<method name="cancelClearAnimation"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="cancelGesture"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="clear"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="animated" type="boolean">
-</parameter>
-</method>
-<method name="getCurrentStroke"
- return="java.util.ArrayList<android.gesture.GesturePoint>"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="getFadeOffset"
- return="long"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="getGesture"
- return="android.gesture.Gesture"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="getGestureColor"
- return="int"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="getGestureStrokeAngleThreshold"
- return="float"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="getGestureStrokeLengthThreshold"
- return="float"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="getGestureStrokeSquarenessTreshold"
- return="float"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="getGestureStrokeType"
- return="int"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="getGestureStrokeWidth"
- return="float"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="getOrientation"
- return="int"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="getUncertainGestureColor"
- return="int"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="isEventsInterceptionEnabled"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="isFadeEnabled"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="isGesturing"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="removeAllOnGestureListeners"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="removeAllOnGesturePerformedListeners"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="removeAllOnGesturingListeners"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="removeOnGestureListener"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="listener" type="android.gesture.GestureOverlayView.OnGestureListener">
-</parameter>
-</method>
-<method name="removeOnGesturePerformedListener"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="listener" type="android.gesture.GestureOverlayView.OnGesturePerformedListener">
-</parameter>
-</method>
-<method name="removeOnGesturingListener"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="listener" type="android.gesture.GestureOverlayView.OnGesturingListener">
-</parameter>
-</method>
-<method name="setEventsInterceptionEnabled"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="enabled" type="boolean">
-</parameter>
-</method>
-<method name="setFadeEnabled"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="fadeEnabled" type="boolean">
-</parameter>
-</method>
-<method name="setFadeOffset"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="fadeOffset" type="long">
-</parameter>
-</method>
-<method name="setGesture"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="gesture" type="android.gesture.Gesture">
-</parameter>
-</method>
-<method name="setGestureColor"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="color" type="int">
-</parameter>
-</method>
-<method name="setGestureStrokeAngleThreshold"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="gestureStrokeAngleThreshold" type="float">
-</parameter>
-</method>
-<method name="setGestureStrokeLengthThreshold"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="gestureStrokeLengthThreshold" type="float">
-</parameter>
-</method>
-<method name="setGestureStrokeSquarenessTreshold"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="gestureStrokeSquarenessTreshold" type="float">
-</parameter>
-</method>
-<method name="setGestureStrokeType"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="gestureStrokeType" type="int">
-</parameter>
-</method>
-<method name="setGestureStrokeWidth"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="gestureStrokeWidth" type="float">
-</parameter>
-</method>
-<method name="setOrientation"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="orientation" type="int">
-</parameter>
-</method>
-<method name="setUncertainGestureColor"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="color" type="int">
-</parameter>
-</method>
-<field name="GESTURE_STROKE_TYPE_MULTIPLE"
- type="int"
- transient="false"
- volatile="false"
- value="1"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="GESTURE_STROKE_TYPE_SINGLE"
- type="int"
- transient="false"
- volatile="false"
- value="0"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="ORIENTATION_HORIZONTAL"
- type="int"
- transient="false"
- volatile="false"
- value="0"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="ORIENTATION_VERTICAL"
- type="int"
- transient="false"
- volatile="false"
- value="1"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-</class>
-<interface name="GestureOverlayView.OnGestureListener"
- abstract="true"
- static="true"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<method name="onGesture"
- return="void"
- abstract="true"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="overlay" type="android.gesture.GestureOverlayView">
-</parameter>
-<parameter name="event" type="android.view.MotionEvent">
-</parameter>
-</method>
-<method name="onGestureCancelled"
- return="void"
- abstract="true"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="overlay" type="android.gesture.GestureOverlayView">
-</parameter>
-<parameter name="event" type="android.view.MotionEvent">
-</parameter>
-</method>
-<method name="onGestureEnded"
- return="void"
- abstract="true"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="overlay" type="android.gesture.GestureOverlayView">
-</parameter>
-<parameter name="event" type="android.view.MotionEvent">
-</parameter>
-</method>
-<method name="onGestureStarted"
- return="void"
- abstract="true"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="overlay" type="android.gesture.GestureOverlayView">
-</parameter>
-<parameter name="event" type="android.view.MotionEvent">
-</parameter>
-</method>
-</interface>
-<interface name="GestureOverlayView.OnGesturePerformedListener"
- abstract="true"
- static="true"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<method name="onGesturePerformed"
- return="void"
- abstract="true"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="overlay" type="android.gesture.GestureOverlayView">
-</parameter>
-<parameter name="gesture" type="android.gesture.Gesture">
-</parameter>
-</method>
-</interface>
-<interface name="GestureOverlayView.OnGesturingListener"
- abstract="true"
- static="true"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<method name="onGesturingEnded"
- return="void"
- abstract="true"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="overlay" type="android.gesture.GestureOverlayView">
-</parameter>
-</method>
-<method name="onGesturingStarted"
- return="void"
- abstract="true"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="overlay" type="android.gesture.GestureOverlayView">
-</parameter>
-</method>
-</interface>
-<class name="GesturePoint"
- extends="java.lang.Object"
- abstract="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<constructor name="GesturePoint"
- type="android.gesture.GesturePoint"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="x" type="float">
-</parameter>
-<parameter name="y" type="float">
-</parameter>
-<parameter name="t" type="long">
-</parameter>
-</constructor>
-<field name="timestamp"
- type="long"
- transient="false"
- volatile="false"
- static="false"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="x"
- type="float"
- transient="false"
- volatile="false"
- static="false"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="y"
- type="float"
- transient="false"
- volatile="false"
- static="false"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-</class>
-<class name="GestureStore"
- extends="java.lang.Object"
- abstract="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<constructor name="GestureStore"
- type="android.gesture.GestureStore"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</constructor>
-<method name="addGesture"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="entryName" type="java.lang.String">
-</parameter>
-<parameter name="gesture" type="android.gesture.Gesture">
-</parameter>
-</method>
-<method name="getGestureEntries"
- return="java.util.Set<java.lang.String>"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="getGestures"
- return="java.util.ArrayList<android.gesture.Gesture>"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="entryName" type="java.lang.String">
-</parameter>
-</method>
-<method name="getOrientationStyle"
- return="int"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="getSequenceType"
- return="int"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="hasChanged"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="load"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="stream" type="java.io.InputStream">
-</parameter>
-<exception name="IOException" type="java.io.IOException">
-</exception>
-</method>
-<method name="load"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="stream" type="java.io.InputStream">
-</parameter>
-<parameter name="closeStream" type="boolean">
-</parameter>
-<exception name="IOException" type="java.io.IOException">
-</exception>
-</method>
-<method name="recognize"
- return="java.util.ArrayList<android.gesture.Prediction>"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="gesture" type="android.gesture.Gesture">
-</parameter>
-</method>
-<method name="removeEntry"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="entryName" type="java.lang.String">
-</parameter>
-</method>
-<method name="removeGesture"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="entryName" type="java.lang.String">
-</parameter>
-<parameter name="gesture" type="android.gesture.Gesture">
-</parameter>
-</method>
-<method name="save"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="stream" type="java.io.OutputStream">
-</parameter>
-<exception name="IOException" type="java.io.IOException">
-</exception>
-</method>
-<method name="save"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="stream" type="java.io.OutputStream">
-</parameter>
-<parameter name="closeStream" type="boolean">
-</parameter>
-<exception name="IOException" type="java.io.IOException">
-</exception>
-</method>
-<method name="setOrientationStyle"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="style" type="int">
-</parameter>
-</method>
-<method name="setSequenceType"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="type" type="int">
-</parameter>
-</method>
-<field name="ORIENTATION_INVARIANT"
- type="int"
- transient="false"
- volatile="false"
- value="1"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="ORIENTATION_SENSITIVE"
- type="int"
- transient="false"
- volatile="false"
- value="2"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="SEQUENCE_INVARIANT"
- type="int"
- transient="false"
- volatile="false"
- value="1"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="SEQUENCE_SENSITIVE"
- type="int"
- transient="false"
- volatile="false"
- value="2"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-</class>
-<class name="GestureStroke"
- extends="java.lang.Object"
- abstract="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<constructor name="GestureStroke"
- type="android.gesture.GestureStroke"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="points" type="java.util.ArrayList<android.gesture.GesturePoint>">
-</parameter>
-</constructor>
-<method name="clearPath"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="computeOrientedBoundingBox"
- return="android.gesture.OrientedBoundingBox"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="getPath"
- return="android.graphics.Path"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="toPath"
- return="android.graphics.Path"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="width" type="float">
-</parameter>
-<parameter name="height" type="float">
-</parameter>
-<parameter name="numSample" type="int">
-</parameter>
-</method>
-<field name="boundingBox"
- type="android.graphics.RectF"
- transient="false"
- volatile="false"
- static="false"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="length"
- type="float"
- transient="false"
- volatile="false"
- static="false"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="points"
- type="float[]"
- transient="false"
- volatile="false"
- value="null"
- static="false"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-</class>
-<class name="Learner"
- extends="java.lang.Object"
- abstract="true"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility=""
->
-</class>
-<class name="OrientedBoundingBox"
- extends="java.lang.Object"
- abstract="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<field name="centerX"
- type="float"
- transient="false"
- volatile="false"
- static="false"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="centerY"
- type="float"
- transient="false"
- volatile="false"
- static="false"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="height"
- type="float"
- transient="false"
- volatile="false"
- static="false"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="orientation"
- type="float"
- transient="false"
- volatile="false"
- static="false"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="squareness"
- type="float"
- transient="false"
- volatile="false"
- static="false"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="width"
- type="float"
- transient="false"
- volatile="false"
- static="false"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-</class>
-<class name="Prediction"
- extends="java.lang.Object"
- abstract="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<field name="name"
- type="java.lang.String"
- transient="false"
- volatile="false"
- static="false"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="score"
- type="double"
- transient="false"
- volatile="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-</class>
-</package>
<package name="android.graphics"
>
<class name="AvoidXfermode"
@@ -62837,7 +61140,7 @@
type="float"
transient="false"
volatile="false"
- value="0.001f"
+ value="0.0010f"
static="true"
final="true"
deprecated="not deprecated"
@@ -115907,6 +114210,19 @@
<parameter name="mode" type="int">
</parameter>
</method>
+<method name="getSharedPrefsFile"
+ return="java.io.File"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="name" type="java.lang.String">
+</parameter>
+</method>
<method name="getSystemService"
return="java.lang.Object"
abstract="false"
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index f9b3d05..7fb3449 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -628,6 +628,8 @@
boolean mStartedActivity;
/*package*/ int mConfigChangeFlags;
/*package*/ Configuration mCurrentConfig;
+ private SearchManager mSearchManager;
+ private Bundle mSearchDialogState = null;
private Window mWindow;
@@ -788,6 +790,9 @@
protected void onCreate(Bundle savedInstanceState) {
mVisibleFromClient = mWindow.getWindowStyle().getBoolean(
com.android.internal.R.styleable.Window_windowNoDisplay, true);
+ // uses super.getSystemService() since this.getSystemService() looks at the
+ // mSearchManager field.
+ mSearchManager = (SearchManager) super.getSystemService(Context.SEARCH_SERVICE);
mCalled = true;
}
@@ -805,9 +810,10 @@
// Also restore the state of a search dialog (if any)
// TODO more generic than just this manager
- SearchManager searchManager =
- (SearchManager) getSystemService(Context.SEARCH_SERVICE);
- searchManager.restoreSearchDialog(savedInstanceState, SAVED_SEARCH_DIALOG_KEY);
+ Bundle searchState = savedInstanceState.getBundle(SAVED_SEARCH_DIALOG_KEY);
+ if (searchState != null) {
+ mSearchManager.restoreSearchDialog(searchState);
+ }
}
/**
@@ -1013,9 +1019,11 @@
// Also save the state of a search dialog (if any)
// TODO more generic than just this manager
- SearchManager searchManager =
- (SearchManager) getSystemService(Context.SEARCH_SERVICE);
- searchManager.saveSearchDialog(outState, SAVED_SEARCH_DIALOG_KEY);
+ // onPause() should always be called before this method, so mSearchManagerState
+ // should be up to date.
+ if (mSearchDialogState != null) {
+ outState.putBundle(SAVED_SEARCH_DIALOG_KEY, mSearchDialogState);
+ }
}
/**
@@ -1286,12 +1294,6 @@
}
}
}
-
- // also dismiss search dialog if showing
- // TODO more generic than just this manager
- SearchManager searchManager =
- (SearchManager) getSystemService(Context.SEARCH_SERVICE);
- searchManager.stopSearch();
// close any cursors we are managing.
int numCursors = mManagedCursors.size();
@@ -1301,6 +1303,10 @@
c.mCursor.close();
}
}
+
+ // Clear any search state saved in performPause(). If the state may be needed in the
+ // future, it will have been saved by performSaveInstanceState()
+ mSearchDialogState = null;
}
/**
@@ -1324,9 +1330,7 @@
// also update search dialog if showing
// TODO more generic than just this manager
- SearchManager searchManager =
- (SearchManager) getSystemService(Context.SEARCH_SERVICE);
- searchManager.onConfigurationChanged(newConfig);
+ mSearchManager.onConfigurationChanged(newConfig);
if (mWindow != null) {
// Pass the configuration changed event to the window
@@ -2543,10 +2547,7 @@
*/
public void startSearch(String initialQuery, boolean selectInitialQuery,
Bundle appSearchData, boolean globalSearch) {
- // activate the search manager and start it up!
- SearchManager searchManager = (SearchManager)
- getSystemService(Context.SEARCH_SERVICE);
- searchManager.startSearch(initialQuery, selectInitialQuery, getComponentName(),
+ mSearchManager.startSearch(initialQuery, selectInitialQuery, getComponentName(),
appSearchData, globalSearch);
}
@@ -3265,6 +3266,8 @@
if (WINDOW_SERVICE.equals(name)) {
return mWindowManager;
+ } else if (SEARCH_SERVICE.equals(name)) {
+ return mSearchManager;
}
return super.getSystemService(name);
}
@@ -3563,10 +3566,21 @@
"Activity " + mComponent.toShortString() +
" did not call through to super.onPostResume()");
}
+
+ // restore search dialog, if any
+ if (mSearchDialogState != null) {
+ mSearchManager.restoreSearchDialog(mSearchDialogState);
+ }
+ mSearchDialogState = null;
}
final void performPause() {
onPause();
+
+ // save search dialog state if the search dialog is open,
+ // and then dismiss the search dialog
+ mSearchDialogState = mSearchManager.saveSearchDialog();
+ mSearchManager.stopSearch();
}
final void performUserLeaving() {
diff --git a/core/java/android/app/ApplicationContext.java b/core/java/android/app/ApplicationContext.java
index 98bbf7b..fc3cdcf 100644
--- a/core/java/android/app/ApplicationContext.java
+++ b/core/java/android/app/ApplicationContext.java
@@ -300,10 +300,14 @@
return new File(prefsFile.getPath() + ".bak");
}
+ public File getSharedPrefsFile(String name) {
+ return makeFilename(getPreferencesDir(), name + ".xml");
+ }
+
@Override
public SharedPreferences getSharedPreferences(String name, int mode) {
SharedPreferencesImpl sp;
- File f = makeFilename(getPreferencesDir(), name + ".xml");
+ File f = getSharedPrefsFile(name);
synchronized (sSharedPrefs) {
sp = sSharedPrefs.get(f);
if (sp != null && !sp.hasFileChanged()) {
diff --git a/core/java/android/app/FullBackupAgent.java b/core/java/android/app/FullBackupAgent.java
index 18d62e3..bf5cb5d 100644
--- a/core/java/android/app/FullBackupAgent.java
+++ b/core/java/android/app/FullBackupAgent.java
@@ -47,12 +47,11 @@
}
// That's the file set; now back it all up
- FileBackupHelper.performBackup(this, oldState, data, newState,
- (String[]) allFiles.toArray());
+ FileBackupHelper helper = new FileBackupHelper(this);
+ helper.performBackup(oldState, data, newState, (String[])allFiles.toArray());
}
@Override
public void onRestore(ParcelFileDescriptor data, ParcelFileDescriptor newState) {
}
-
}
diff --git a/core/java/android/app/ISearchManager.aidl b/core/java/android/app/ISearchManager.aidl
index 374423e..e8bd60a 100644
--- a/core/java/android/app/ISearchManager.aidl
+++ b/core/java/android/app/ISearchManager.aidl
@@ -16,7 +16,10 @@
package android.app;
+import android.app.ISearchManagerCallback;
import android.content.ComponentName;
+import android.content.res.Configuration;
+import android.os.Bundle;
import android.server.search.SearchableInfo;
/** @hide */
@@ -26,4 +29,15 @@
List<SearchableInfo> getSearchablesForWebSearch();
SearchableInfo getDefaultSearchableForWebSearch();
void setDefaultWebSearch(in ComponentName component);
+ void startSearch(in String initialQuery,
+ boolean selectInitialQuery,
+ in ComponentName launchActivity,
+ in Bundle appSearchData,
+ boolean globalSearch,
+ ISearchManagerCallback searchManagerCallback);
+ void stopSearch();
+ boolean isVisible();
+ Bundle onSaveInstanceState();
+ void onRestoreInstanceState(in Bundle savedInstanceState);
+ void onConfigurationChanged(in Configuration newConfig);
}
diff --git a/core/java/android/app/ISearchManagerCallback.aidl b/core/java/android/app/ISearchManagerCallback.aidl
new file mode 100644
index 0000000..bdfb2ba
--- /dev/null
+++ b/core/java/android/app/ISearchManagerCallback.aidl
@@ -0,0 +1,23 @@
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app;
+
+/** @hide */
+oneway interface ISearchManagerCallback {
+ void onDismiss();
+ void onCancel();
+}
diff --git a/core/java/android/app/SearchDialog.java b/core/java/android/app/SearchDialog.java
index 7de6572..9141c4c 100644
--- a/core/java/android/app/SearchDialog.java
+++ b/core/java/android/app/SearchDialog.java
@@ -76,8 +76,8 @@
import java.util.concurrent.atomic.AtomicLong;
/**
- * In-application-process implementation of Search Bar. This is still controlled by the
- * SearchManager, but it runs in the current activity's process to keep things lighter weight.
+ * System search dialog. This is controlled by the
+ * SearchManagerService and runs in the system process.
*
* @hide
*/
@@ -179,17 +179,17 @@
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- Window theWindow = getWindow();
- theWindow.setGravity(Gravity.TOP|Gravity.FILL_HORIZONTAL);
-
setContentView(com.android.internal.R.layout.search_bar);
- theWindow.setLayout(ViewGroup.LayoutParams.FILL_PARENT,
- // taking up the whole window (even when transparent) is less than ideal,
- // but necessary to show the popup window until the window manager supports
- // having windows anchored by their parent but not clipped by them.
- ViewGroup.LayoutParams.FILL_PARENT);
+ Window theWindow = getWindow();
WindowManager.LayoutParams lp = theWindow.getAttributes();
+ lp.type = WindowManager.LayoutParams.TYPE_SEARCH_BAR;
+ lp.width = ViewGroup.LayoutParams.FILL_PARENT;
+ // taking up the whole window (even when transparent) is less than ideal,
+ // but necessary to show the popup window until the window manager supports
+ // having windows anchored by their parent but not clipped by them.
+ lp.height = ViewGroup.LayoutParams.FILL_PARENT;
+ lp.gravity = Gravity.TOP | Gravity.FILL_HORIZONTAL;
lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
theWindow.setAttributes(lp);
@@ -234,10 +234,12 @@
// Save voice intent for later queries/launching
mVoiceWebSearchIntent = new Intent(RecognizerIntent.ACTION_WEB_SEARCH);
+ mVoiceWebSearchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mVoiceWebSearchIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);
mVoiceAppSearchIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
+ mVoiceAppSearchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mLocationManager =
(LocationManager) getContext().getSystemService(Context.LOCATION_SERVICE);
@@ -278,12 +280,7 @@
*/
public boolean show(String initialQuery, boolean selectInitialQuery,
ComponentName componentName, Bundle appSearchData, boolean globalSearch) {
- if (isShowing()) {
- // race condition - already showing but not handling events yet.
- // in this case, just discard the "show" request
- return true;
- }
-
+
// Reset any stored values from last time dialog was shown.
mStoredComponentName = null;
mStoredAppSearchData = null;
@@ -442,11 +439,6 @@
stopLocationUpdates();
- // TODO: Removing the listeners means that they never get called, since
- // Dialog.dismissDialog() calls onStop() before sendDismissMessage().
- setOnCancelListener(null);
- setOnDismissListener(null);
-
// stop receiving broadcasts (throws exception if none registered)
try {
getContext().unregisterReceiver(mBroadcastReceiver);
@@ -654,15 +646,15 @@
mSearchAutoComplete.setDropDownAnimationStyle(0); // no animation
mSearchAutoComplete.setThreshold(mSearchable.getSuggestThreshold());
+ // we dismiss the entire dialog instead
+ mSearchAutoComplete.setDropDownDismissedOnCompletion(false);
if (mGlobalSearchMode) {
mSearchAutoComplete.setDropDownAlwaysVisible(true); // fill space until results come in
- mSearchAutoComplete.setDropDownDismissedOnCompletion(false);
mSearchAutoComplete.setDropDownBackgroundResource(
com.android.internal.R.drawable.search_dropdown_background);
} else {
mSearchAutoComplete.setDropDownAlwaysVisible(false);
- mSearchAutoComplete.setDropDownDismissedOnCompletion(true);
mSearchAutoComplete.setDropDownBackgroundResource(
com.android.internal.R.drawable.search_dropdown_background_apps);
}
@@ -1317,7 +1309,8 @@
}
/**
- * Launches an intent. Also dismisses the search dialog if not in global search mode.
+ * Launches an intent and dismisses the search dialog (unless the intent
+ * is one of the special intents that modifies the state of the search dialog).
*/
private void launchIntent(Intent intent) {
if (intent == null) {
@@ -1326,9 +1319,7 @@
if (handleSpecialIntent(intent)){
return;
}
- if (!mGlobalSearchMode) {
- dismiss();
- }
+ dismiss();
getContext().startActivity(intent);
}
@@ -1511,6 +1502,7 @@
int actionKey, String actionMsg) {
// Now build the Intent
Intent intent = new Intent(action);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (data != null) {
intent.setData(data);
}
@@ -1595,14 +1587,7 @@
private boolean isEmpty() {
return TextUtils.getTrimmedLength(getText()) == 0;
}
-
- /**
- * Clears the entered text.
- */
- private void clear() {
- setText("");
- }
-
+
/**
* We override this method to avoid replacing the query box text
* when a suggestion is clicked.
diff --git a/core/java/android/app/SearchManager.java b/core/java/android/app/SearchManager.java
index 820f192..1ddd20a 100644
--- a/core/java/android/app/SearchManager.java
+++ b/core/java/android/app/SearchManager.java
@@ -28,6 +28,7 @@
import android.os.RemoteException;
import android.os.ServiceManager;
import android.server.search.SearchableInfo;
+import android.util.Log;
import android.view.KeyEvent;
import java.util.List;
@@ -1108,6 +1109,10 @@
public class SearchManager
implements DialogInterface.OnDismissListener, DialogInterface.OnCancelListener
{
+
+ private static final boolean DBG = false;
+ private static final String TAG = "SearchManager";
+
/**
* This is a shortcut definition for the default menu key to use for invoking search.
*
@@ -1494,12 +1499,14 @@
private static ISearchManager sService = getSearchManagerService();
private final Context mContext;
- private final Handler mHandler;
-
- private SearchDialog mSearchDialog;
-
- private OnDismissListener mDismissListener = null;
- private OnCancelListener mCancelListener = null;
+
+ // package private since they are used by the inner class SearchManagerCallback
+ /* package */ boolean mIsShowing = false;
+ /* package */ final Handler mHandler;
+ /* package */ OnDismissListener mDismissListener = null;
+ /* package */ OnCancelListener mCancelListener = null;
+
+ private final SearchManagerCallback mSearchManagerCallback = new SearchManagerCallback();
/*package*/ SearchManager(Context context, Handler handler) {
mContext = context;
@@ -1551,17 +1558,16 @@
ComponentName launchActivity,
Bundle appSearchData,
boolean globalSearch) {
-
- if (mSearchDialog == null) {
- mSearchDialog = new SearchDialog(mContext);
+ if (DBG) debug("startSearch(), mIsShowing=" + mIsShowing);
+ if (mIsShowing) return;
+ try {
+ mIsShowing = true;
+ // activate the search manager and start it up!
+ sService.startSearch(initialQuery, selectInitialQuery, launchActivity, appSearchData,
+ globalSearch, mSearchManagerCallback);
+ } catch (RemoteException ex) {
+ Log.e(TAG, "startSearch() failed: " + ex);
}
-
- // activate the search manager and start it up!
- mSearchDialog.show(initialQuery, selectInitialQuery, launchActivity, appSearchData,
- globalSearch);
-
- mSearchDialog.setOnCancelListener(this);
- mSearchDialog.setOnDismissListener(this);
}
/**
@@ -1575,9 +1581,16 @@
*
* @see #startSearch
*/
- public void stopSearch() {
- if (mSearchDialog != null) {
- mSearchDialog.cancel();
+ public void stopSearch() {
+ if (DBG) debug("stopSearch(), mIsShowing=" + mIsShowing);
+ if (!mIsShowing) return;
+ try {
+ sService.stopSearch();
+ // onDismiss will also clear this, but we do it here too since onDismiss() is
+ // called asynchronously.
+ mIsShowing = false;
+ } catch (RemoteException ex) {
+ Log.e(TAG, "stopSearch() failed: " + ex);
}
}
@@ -1590,13 +1603,11 @@
*
* @hide
*/
- public boolean isVisible() {
- if (mSearchDialog != null) {
- return mSearchDialog.isShowing();
- }
- return false;
+ public boolean isVisible() {
+ if (DBG) debug("isVisible(), mIsShowing=" + mIsShowing);
+ return mIsShowing;
}
-
+
/**
* See {@link SearchManager#setOnDismissListener} for configuring your activity to monitor
* search UI state.
@@ -1631,79 +1642,112 @@
public void setOnDismissListener(final OnDismissListener listener) {
mDismissListener = listener;
}
-
- /**
- * The callback from the search dialog when dismissed
- * @hide
- */
- public void onDismiss(DialogInterface dialog) {
- if (dialog == mSearchDialog) {
- if (mDismissListener != null) {
- mDismissListener.onDismiss();
- }
- }
- }
/**
* Set or clear the callback that will be invoked whenever the search UI is canceled.
*
* @param listener The {@link OnCancelListener} to use, or null.
*/
- public void setOnCancelListener(final OnCancelListener listener) {
+ public void setOnCancelListener(OnCancelListener listener) {
mCancelListener = listener;
}
-
-
- /**
- * The callback from the search dialog when canceled
- * @hide
- */
+
+ private class SearchManagerCallback extends ISearchManagerCallback.Stub {
+
+ private final Runnable mFireOnDismiss = new Runnable() {
+ public void run() {
+ if (DBG) debug("mFireOnDismiss");
+ mIsShowing = false;
+ if (mDismissListener != null) {
+ mDismissListener.onDismiss();
+ }
+ }
+ };
+
+ private final Runnable mFireOnCancel = new Runnable() {
+ public void run() {
+ if (DBG) debug("mFireOnCancel");
+ // doesn't need to clear mIsShowing since onDismiss() always gets called too
+ if (mCancelListener != null) {
+ mCancelListener.onCancel();
+ }
+ }
+ };
+
+ public void onDismiss() {
+ if (DBG) debug("onDismiss()");
+ mHandler.post(mFireOnDismiss);
+ }
+
+ public void onCancel() {
+ if (DBG) debug("onCancel()");
+ mHandler.post(mFireOnCancel);
+ }
+
+ }
+
+ // TODO: remove the DialogInterface interfaces from SearchManager.
+ // This changes the public API, so I'll do it in a separate change.
public void onCancel(DialogInterface dialog) {
- if (dialog == mSearchDialog) {
- if (mCancelListener != null) {
- mCancelListener.onCancel();
- }
+ throw new UnsupportedOperationException();
+ }
+ public void onDismiss(DialogInterface dialog) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Saves the state of the search UI.
+ *
+ * @return A Bundle containing the state of the search dialog, or {@code null}
+ * if the search UI is not visible.
+ *
+ * @hide
+ */
+ public Bundle saveSearchDialog() {
+ if (DBG) debug("saveSearchDialog(), mIsShowing=" + mIsShowing);
+ if (!mIsShowing) return null;
+ try {
+ return sService.onSaveInstanceState();
+ } catch (RemoteException ex) {
+ Log.e(TAG, "onSaveInstanceState() failed: " + ex);
+ return null;
}
}
/**
- * Save instance state so we can recreate after a rotation.
- *
+ * Restores the state of the search dialog.
+ *
+ * @param searchDialogState Bundle to read the state from.
+ *
* @hide
*/
- void saveSearchDialog(Bundle outState, String key) {
- if (mSearchDialog != null && mSearchDialog.isShowing()) {
- Bundle searchDialogState = mSearchDialog.onSaveInstanceState();
- outState.putBundle(key, searchDialogState);
+ public void restoreSearchDialog(Bundle searchDialogState) {
+ if (DBG) debug("restoreSearchDialog(" + searchDialogState + ")");
+ if (searchDialogState == null) return;
+ try {
+ sService.onRestoreInstanceState(searchDialogState);
+ } catch (RemoteException ex) {
+ Log.e(TAG, "onRestoreInstanceState() failed: " + ex);
}
}
/**
- * Restore instance state after a rotation.
- *
+ * Update the search dialog after a configuration change.
+ *
+ * @param newConfig The new configuration.
+ *
* @hide
*/
- void restoreSearchDialog(Bundle inState, String key) {
- Bundle searchDialogState = inState.getBundle(key);
- if (searchDialogState != null) {
- if (mSearchDialog == null) {
- mSearchDialog = new SearchDialog(mContext);
- }
- mSearchDialog.onRestoreInstanceState(searchDialogState);
+ public void onConfigurationChanged(Configuration newConfig) {
+ if (DBG) debug("onConfigurationChanged(" + newConfig + "), mIsShowing=" + mIsShowing);
+ if (!mIsShowing) return;
+ try {
+ sService.onConfigurationChanged(newConfig);
+ } catch (RemoteException ex) {
+ Log.e(TAG, "onConfigurationChanged() failed:" + ex);
}
}
-
- /**
- * Hook for updating layout on a rotation
- *
- * @hide
- */
- void onConfigurationChanged(Configuration newConfig) {
- if (mSearchDialog != null && mSearchDialog.isShowing()) {
- mSearchDialog.onConfigurationChanged(newConfig);
- }
- }
-
+
private static ISearchManager getSearchManagerService() {
return ISearchManager.Stub.asInterface(
ServiceManager.getService(Context.SEARCH_SERVICE));
@@ -1724,7 +1768,8 @@
boolean globalSearch) {
try {
return sService.getSearchableInfo(componentName, globalSearch);
- } catch (RemoteException e) {
+ } catch (RemoteException ex) {
+ Log.e(TAG, "getSearchableInfo() failed: " + ex);
return null;
}
}
@@ -1805,6 +1850,7 @@
try {
return sService.getSearchablesInGlobalSearch();
} catch (RemoteException e) {
+ Log.e(TAG, "getSearchablesInGlobalSearch() failed: " + e);
return null;
}
}
@@ -1812,7 +1858,8 @@
/**
* Returns a list of the searchable activities that handle web searches.
*
- * @return a a list of all searchable activities that handle {@link SearchManager#ACTION_WEB_SEARCH}.
+ * @return a list of all searchable activities that handle
+ * {@link android.content.Intent#ACTION_WEB_SEARCH}.
*
* @hide because SearchableInfo is not part of the API.
*/
@@ -1820,6 +1867,7 @@
try {
return sService.getSearchablesForWebSearch();
} catch (RemoteException e) {
+ Log.e(TAG, "getSearchablesForWebSearch() failed: " + e);
return null;
}
}
@@ -1835,6 +1883,7 @@
try {
return sService.getDefaultSearchableForWebSearch();
} catch (RemoteException e) {
+ Log.e(TAG, "getDefaultSearchableForWebSearch() failed: " + e);
return null;
}
}
@@ -1850,6 +1899,12 @@
try {
sService.setDefaultWebSearch(component);
} catch (RemoteException e) {
+ Log.e(TAG, "setDefaultWebSearch() failed: " + e);
}
}
+
+ private static void debug(String msg) {
+ Thread thread = Thread.currentThread();
+ Log.d(TAG, msg + " (" + thread.getName() + "-" + thread.getId() + ")");
+ }
}
diff --git a/core/java/android/app/SuggestionsAdapter.java b/core/java/android/app/SuggestionsAdapter.java
index 8c5cee3..ed76f4e 100644
--- a/core/java/android/app/SuggestionsAdapter.java
+++ b/core/java/android/app/SuggestionsAdapter.java
@@ -68,9 +68,6 @@
private int mIconName2Col;
private int mBackgroundColorCol;
- // Cached item background color.
- private int mDefaultBackgroundColor;
-
// This value is stored in SuggestionsAdapter by the SearchDialog to indicate whether
// a particular list item should be selected upon the next call to notifyDataSetChanged.
// This is used to indicate the index of the "More results..." list item so that when
@@ -102,11 +99,6 @@
Context activityContext = mSearchable.getActivityContext(mContext);
mProviderContext = mSearchable.getProviderContext(mContext, activityContext);
- TypedValue colorValue = new TypedValue();
- mProviderContext.getTheme().resolveAttribute(
- com.android.internal.R.attr.searchWidgetItemBackground, colorValue, true);
- mDefaultBackgroundColor = mProviderContext.getResources().getColor(colorValue.resourceId);
-
mOutsideDrawablesCache = outsideDrawablesCache;
mGlobalSearchMode = globalSearchMode;
@@ -303,9 +295,6 @@
if (mBackgroundColorCol != -1) {
backgroundColor = cursor.getInt(mBackgroundColorCol);
}
- if (backgroundColor == 0) {
- backgroundColor = mDefaultBackgroundColor;
- }
((SuggestionItemView)view).setColor(backgroundColor);
final boolean isHtml = mFormatCol > 0 && "html".equals(cursor.getString(mFormatCol));
@@ -524,6 +513,7 @@
protected SuggestionItemView(Context context, Cursor cursor) {
// Initialize ourselves
super(context);
+ mBackgroundColor = 0; // transparent by default.
// For our layout use the default list item height from the current theme.
TypedValue lineHeight = new TypedValue();
@@ -551,7 +541,7 @@
@Override
public void dispatchDraw(Canvas canvas) {
- if (!isPressed()) {
+ if (mBackgroundColor != 0 && !isPressed() && !isSelected()) {
canvas.drawColor(mBackgroundColor);
}
super.dispatchDraw(canvas);
diff --git a/core/java/android/backup/BackupDataInput.java b/core/java/android/backup/BackupDataInput.java
new file mode 100644
index 0000000..609dd90
--- /dev/null
+++ b/core/java/android/backup/BackupDataInput.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.backup;
+
+import android.content.Context;
+
+import java.io.FileDescriptor;
+import java.io.IOException;
+
+/** @hide */
+public class BackupDataInput {
+ int mBackupReader;
+
+ private EntityHeader mHeader = new EntityHeader();
+ private boolean mHeaderReady;
+
+ private static class EntityHeader {
+ String key;
+ int dataSize;
+ }
+
+ public BackupDataInput(FileDescriptor fd) {
+ if (fd == null) throw new NullPointerException();
+ mBackupReader = ctor(fd);
+ if (mBackupReader == 0) {
+ throw new RuntimeException("Native initialization failed with fd=" + fd);
+ }
+ }
+
+ protected void finalize() throws Throwable {
+ try {
+ dtor(mBackupReader);
+ } finally {
+ super.finalize();
+ }
+ }
+
+ public boolean readNextHeader() throws IOException {
+ int result = readNextHeader_native(mBackupReader, mHeader);
+ if (result == 0) {
+ // read successfully
+ mHeaderReady = true;
+ return true;
+ } else if (result > 0) {
+ // done
+ mHeaderReady = false;
+ return false;
+ } else {
+ // error
+ mHeaderReady = false;
+ throw new IOException("result=0x" + Integer.toHexString(result));
+ }
+ }
+
+ public String getKey() {
+ if (mHeaderReady) {
+ return mHeader.key;
+ } else {
+ throw new IllegalStateException("mHeaderReady=false");
+ }
+ }
+
+ public int getDataSize() {
+ if (mHeaderReady) {
+ return mHeader.dataSize;
+ } else {
+ throw new IllegalStateException("mHeaderReady=false");
+ }
+ }
+
+ public int readEntityData(byte[] data, int size) throws IOException {
+ if (mHeaderReady) {
+ int result = readEntityData_native(mBackupReader, data, size);
+ if (result >= 0) {
+ return result;
+ } else {
+ throw new IOException("result=0x" + Integer.toHexString(result));
+ }
+ } else {
+ throw new IllegalStateException("mHeaderReady=false");
+ }
+ }
+
+ private native static int ctor(FileDescriptor fd);
+ private native static void dtor(int mBackupReader);
+
+ private native int readNextHeader_native(int mBackupReader, EntityHeader entity);
+ private native int readEntityData_native(int mBackupReader, byte[] data, int size);
+}
diff --git a/core/java/android/backup/BackupDataOutput.java b/core/java/android/backup/BackupDataOutput.java
index 25ae15b..1348d81 100644
--- a/core/java/android/backup/BackupDataOutput.java
+++ b/core/java/android/backup/BackupDataOutput.java
@@ -19,6 +19,7 @@
import android.content.Context;
import java.io.FileDescriptor;
+import java.io.IOException;
/** @hide */
public class BackupDataOutput {
@@ -37,6 +38,24 @@
}
}
+ public int writeEntityHeader(String key, int dataSize) throws IOException {
+ int result = writeEntityHeader_native(mBackupWriter, key, dataSize);
+ if (result >= 0) {
+ return result;
+ } else {
+ throw new IOException("result=0x" + Integer.toHexString(result));
+ }
+ }
+
+ public int writeEntityData(byte[] data, int size) throws IOException {
+ int result = writeEntityData_native(mBackupWriter, data, size);
+ if (result >= 0) {
+ return result;
+ } else {
+ throw new IOException("result=0x" + Integer.toHexString(result));
+ }
+ }
+
protected void finalize() throws Throwable {
try {
dtor(mBackupWriter);
@@ -47,5 +66,8 @@
private native static int ctor(FileDescriptor fd);
private native static void dtor(int mBackupWriter);
+
+ private native static int writeEntityHeader_native(int mBackupWriter, String key, int dataSize);
+ private native static int writeEntityData_native(int mBackupWriter, byte[] data, int size);
}
diff --git a/core/java/android/backup/FileBackupHelper.java b/core/java/android/backup/FileBackupHelper.java
index ec16eb1..ed840bb 100644
--- a/core/java/android/backup/FileBackupHelper.java
+++ b/core/java/android/backup/FileBackupHelper.java
@@ -20,36 +20,84 @@
import android.os.ParcelFileDescriptor;
import android.util.Log;
+import java.io.File;
import java.io.FileDescriptor;
/** @hide */
public class FileBackupHelper {
private static final String TAG = "FileBackupHelper";
+ Context mContext;
+ String mKeyPrefix;
+
+ public FileBackupHelper(Context context) {
+ mContext = context;
+ }
+
+ public FileBackupHelper(Context context, String keyPrefix) {
+ mContext = context;
+ mKeyPrefix = keyPrefix;
+ }
+
/**
* Based on oldState, determine which of the files from the application's data directory
* need to be backed up, write them to the data stream, and fill in newState with the
* state as it exists now.
*/
- public static void performBackup(Context context,
- ParcelFileDescriptor oldState, BackupDataOutput data,
+ public void performBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
ParcelFileDescriptor newState, String[] files) {
- String basePath = context.getFilesDir().getAbsolutePath();
- performBackup_checked(basePath, oldState, data, newState, files);
+ // file names
+ File base = mContext.getFilesDir();
+ final int N = files.length;
+ String[] fullPaths = new String[N];
+ for (int i=0; i<N; i++) {
+ fullPaths[i] = (new File(base, files[i])).getAbsolutePath();
+ }
+
+ // keys
+ String[] keys = makeKeys(mKeyPrefix, files);
+
+ // go
+ performBackup_checked(oldState, data, newState, fullPaths, keys);
+ }
+
+ /**
+ * If keyPrefix is not null, prepend it to each of the strings in <code>original</code>;
+ * otherwise, return original.
+ */
+ static String[] makeKeys(String keyPrefix, String[] original) {
+ if (keyPrefix != null) {
+ String[] keys;
+ final int N = original.length;
+ keys = new String[N];
+ for (int i=0; i<N; i++) {
+ keys[i] = keyPrefix + ':' + original[i];
+ }
+ return keys;
+ } else {
+ return original;
+ }
}
/**
* Check the parameters so the native code doens't have to throw all the exceptions
* since it's easier to do that from java.
*/
- static void performBackup_checked(String basePath,
- ParcelFileDescriptor oldState, BackupDataOutput data,
- ParcelFileDescriptor newState, String[] files) {
+ static void performBackup_checked(ParcelFileDescriptor oldState, BackupDataOutput data,
+ ParcelFileDescriptor newState, String[] files, String[] keys) {
if (files.length == 0) {
return;
}
- if (basePath == null) {
- throw new NullPointerException();
+ // files must be all absolute paths
+ for (String f: files) {
+ if (f.charAt(0) != '/') {
+ throw new RuntimeException("files must have all absolute paths: " + f);
+ }
+ }
+ // the length of files and keys must be the same
+ if (files.length != keys.length) {
+ throw new RuntimeException("files.length=" + files.length
+ + " keys.length=" + keys.length);
}
// oldStateFd can be null
FileDescriptor oldStateFd = oldState != null ? oldState.getFileDescriptor() : null;
@@ -58,13 +106,14 @@
throw new NullPointerException();
}
- int err = performBackup_native(basePath, oldStateFd, data.mBackupWriter, newStateFd, files);
+ int err = performBackup_native(oldStateFd, data.mBackupWriter, newStateFd, files, keys);
if (err != 0) {
- throw new RuntimeException("Backup failed"); // TODO: more here
+ // TODO: more here
+ throw new RuntimeException("Backup failed 0x" + Integer.toHexString(err));
}
}
- native private static int performBackup_native(String basePath, FileDescriptor oldState,
- int data, FileDescriptor newState, String[] files);
+ native private static int performBackup_native(FileDescriptor oldState,
+ int data, FileDescriptor newState, String[] files, String[] keys);
}
diff --git a/core/java/android/backup/RestoreHelper.java b/core/java/android/backup/RestoreHelper.java
new file mode 100644
index 0000000..ebd9906e
--- /dev/null
+++ b/core/java/android/backup/RestoreHelper.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.backup;
+
+/** @hide */
+public interface RestoreHelper {
+ public void performRestore();
+}
+
diff --git a/core/java/android/backup/RestoreHelperDistributor.java b/core/java/android/backup/RestoreHelperDistributor.java
new file mode 100644
index 0000000..555ca79
--- /dev/null
+++ b/core/java/android/backup/RestoreHelperDistributor.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.backup;
+
+import java.util.HashMap;
+
+/** @hide */
+public class RestoreHelperDistributor {
+ HashMap<String,RestoreHelper> mHelpers;
+
+ public void addHelper(String keyPrefix, RestoreHelper helper) {
+ mHelpers.put(keyPrefix, helper);
+ }
+}
diff --git a/core/java/android/backup/SharedPreferencesBackupHelper.java b/core/java/android/backup/SharedPreferencesBackupHelper.java
index 8627f08..cad79df 100644
--- a/core/java/android/backup/SharedPreferencesBackupHelper.java
+++ b/core/java/android/backup/SharedPreferencesBackupHelper.java
@@ -23,19 +23,34 @@
/** @hide */
public class SharedPreferencesBackupHelper {
- public static void performBackup(Context context,
- ParcelFileDescriptor oldSnapshot, ParcelFileDescriptor newSnapshot,
- BackupDataOutput data, String[] prefGroups) {
- String basePath = "/xxx"; //context.getPreferencesDir();
+ private Context mContext;
+ private String mKeyPrefix;
+ public SharedPreferencesBackupHelper(Context context) {
+ mContext = context;
+ }
+
+ public SharedPreferencesBackupHelper(Context context, String keyPrefix) {
+ mContext = context;
+ mKeyPrefix = keyPrefix;
+ }
+
+ public void performBackup(ParcelFileDescriptor oldSnapshot, ParcelFileDescriptor newSnapshot,
+ BackupDataOutput data, String[] prefGroups) {
+ Context context = mContext;
+
// make filenames for the prefGroups
final int N = prefGroups.length;
String[] files = new String[N];
for (int i=0; i<N; i++) {
- files[i] = prefGroups[i] + ".xml";
+ files[i] = context.getSharedPrefsFile(prefGroups[i]).getAbsolutePath();
}
- FileBackupHelper.performBackup_checked(basePath, oldSnapshot, data, newSnapshot, files);
+ // make keys if necessary
+ String[] keys = FileBackupHelper.makeKeys(mKeyPrefix, prefGroups);
+
+ // go
+ FileBackupHelper.performBackup_checked(oldSnapshot, data, newSnapshot, files, prefGroups);
}
}
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index ec847a4..925249e 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -254,12 +254,20 @@
* <p>Note: this is not generally useful for applications, since they should
* not be directly accessing the file system.
*
- *
* @return String Path to the code and assets.
*/
public abstract String getPackageCodePath();
/**
+ * {@hide}
+ * Return the full path to the shared prefs file for the given prefs group name.
+ *
+ * <p>Note: this is not generally useful for applications, since they should
+ * not be directly accessing the file system.
+ */
+ public abstract File getSharedPrefsFile(String name);
+
+ /**
* Retrieve and hold the contents of the preferences file 'name', returning
* a SharedPreferences through which you can retrieve and modify its
* values. Only one instance of the SharedPreferences object is returned
diff --git a/core/java/android/content/ContextWrapper.java b/core/java/android/content/ContextWrapper.java
index 36e1c34..262204e 100644
--- a/core/java/android/content/ContextWrapper.java
+++ b/core/java/android/content/ContextWrapper.java
@@ -130,6 +130,11 @@
}
@Override
+ public File getSharedPrefsFile(String name) {
+ return mBase.getSharedPrefsFile(name);
+ }
+
+ @Override
public SharedPreferences getSharedPreferences(String name, int mode) {
return mBase.getSharedPreferences(name, mode);
}
diff --git a/core/java/android/gesture/package.html b/core/java/android/gesture/package.html
new file mode 100644
index 0000000..a54a0171
--- /dev/null
+++ b/core/java/android/gesture/package.html
@@ -0,0 +1,5 @@
+<HTML>
+<BODY>
+@hide
+</BODY>
+</HTML>
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index c2da593..ff38e5a 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -3049,6 +3049,13 @@
public static final String ANR_BUGREPORT_RECIPIENT = "anr_bugreport_recipient";
/**
+ * Flag for allowing service provider to use location information to improve products and
+ * services.
+ * Type: int ( 0 = disallow, 1 = allow )
+ */
+ public static final String USE_LOCATION_FOR_SERVICES = "use_location";
+
+ /**
* @deprecated
* @hide
*/
diff --git a/core/java/android/server/search/SearchManagerService.java b/core/java/android/server/search/SearchManagerService.java
index 060bcea..373e61f 100644
--- a/core/java/android/server/search/SearchManagerService.java
+++ b/core/java/android/server/search/SearchManagerService.java
@@ -17,15 +17,27 @@
package android.server.search;
import android.app.ISearchManager;
+import android.app.ISearchManagerCallback;
+import android.app.SearchDialog;
+import android.app.SearchManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
+import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.res.Configuration;
+import android.os.Bundle;
import android.os.Handler;
import android.os.RemoteException;
+import android.os.SystemProperties;
+import android.text.TextUtils;
+import android.util.Log;
import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.FutureTask;
/**
* This is a simplified version of the Search Manager service. It no longer handles
@@ -34,16 +46,24 @@
* invoked search) to specific searchable activities (where the search will be dispatched).
*/
public class SearchManagerService extends ISearchManager.Stub
+ implements DialogInterface.OnCancelListener, DialogInterface.OnDismissListener
{
// general debugging support
private static final String TAG = "SearchManagerService";
- private static final boolean DEBUG = false;
+ private static final boolean DBG = false;
// class maintenance and general shared data
private final Context mContext;
private final Handler mHandler;
private boolean mSearchablesDirty;
- private Searchables mSearchables;
+ private final Searchables mSearchables;
+
+ final SearchDialog mSearchDialog;
+ ISearchManagerCallback mCallback = null;
+
+ private final boolean mDisabledOnBoot;
+
+ private static final String DISABLE_SEARCH_PROPERTY = "dev.disablesearchdialog";
/**
* Initializes the Search Manager service in the provided system context.
@@ -56,6 +76,9 @@
mHandler = new Handler();
mSearchablesDirty = true;
mSearchables = new Searchables(context);
+ mSearchDialog = new SearchDialog(context);
+ mSearchDialog.setOnCancelListener(this);
+ mSearchDialog.setOnDismissListener(this);
// Setup the infrastructure for updating and maintaining the list
// of searchable activities.
@@ -69,6 +92,9 @@
// After startup settles down, preload the searchables list,
// which will reduce the delay when the search UI is invoked.
mHandler.post(mRunUpdateSearchable);
+
+ // allows disabling of search dialog for stress testing runs
+ mDisabledOnBoot = !TextUtils.isEmpty(SystemProperties.get(DISABLE_SEARCH_PROPERTY));
}
/**
@@ -107,6 +133,7 @@
* a package add/remove broadcast message.
*/
private void updateSearchables() {
+ if (DBG) debug("updateSearchables()");
mSearchables.buildSearchableList();
mSearchablesDirty = false;
}
@@ -137,6 +164,10 @@
if (globalSearch) {
si = mSearchables.getDefaultSearchable();
} else {
+ if (launchActivity == null) {
+ Log.e(TAG, "getSearchableInfo(), activity == null");
+ return null;
+ }
si = mSearchables.getSearchableInfo(launchActivity);
}
@@ -150,6 +181,152 @@
updateSearchablesIfDirty();
return mSearchables.getSearchablesInGlobalSearchList();
}
+ /**
+ * Launches the search UI on the main thread of the service.
+ *
+ * @see SearchManager#startSearch(String, boolean, ComponentName, Bundle, boolean)
+ */
+ public void startSearch(final String initialQuery,
+ final boolean selectInitialQuery,
+ final ComponentName launchActivity,
+ final Bundle appSearchData,
+ final boolean globalSearch,
+ final ISearchManagerCallback searchManagerCallback) {
+ if (DBG) debug("startSearch()");
+ Runnable task = new Runnable() {
+ public void run() {
+ performStartSearch(initialQuery,
+ selectInitialQuery,
+ launchActivity,
+ appSearchData,
+ globalSearch,
+ searchManagerCallback);
+ }
+ };
+ mHandler.post(task);
+ }
+
+ /**
+ * Actually launches the search. This must be called on the service UI thread.
+ */
+ /*package*/ void performStartSearch(String initialQuery,
+ boolean selectInitialQuery,
+ ComponentName launchActivity,
+ Bundle appSearchData,
+ boolean globalSearch,
+ ISearchManagerCallback searchManagerCallback) {
+ if (DBG) debug("performStartSearch()");
+
+ if (mDisabledOnBoot) {
+ Log.d(TAG, "ignoring start search request because " + DISABLE_SEARCH_PROPERTY
+ + " system property is set.");
+ return;
+ }
+
+ mSearchDialog.show(initialQuery, selectInitialQuery, launchActivity, appSearchData,
+ globalSearch);
+ if (searchManagerCallback != null) {
+ mCallback = searchManagerCallback;
+ }
+ }
+
+ /**
+ * Cancels the search dialog. Can be called from any thread.
+ */
+ public void stopSearch() {
+ if (DBG) debug("stopSearch()");
+ mHandler.post(new Runnable() {
+ public void run() {
+ performStopSearch();
+ }
+ });
+ }
+
+ /**
+ * Cancels the search dialog. Must be called from the service UI thread.
+ */
+ /*package*/ void performStopSearch() {
+ if (DBG) debug("performStopSearch()");
+ mSearchDialog.cancel();
+ }
+
+ /**
+ * Determines if the Search UI is currently displayed.
+ *
+ * @see SearchManager#isVisible()
+ */
+ public boolean isVisible() {
+ return postAndWait(mIsShowing, false, "isShowing()");
+ }
+
+ private final Callable<Boolean> mIsShowing = new Callable<Boolean>() {
+ public Boolean call() {
+ return mSearchDialog.isShowing();
+ }
+ };
+
+ public Bundle onSaveInstanceState() {
+ return postAndWait(mOnSaveInstanceState, null, "onSaveInstanceState()");
+ }
+
+ private final Callable<Bundle> mOnSaveInstanceState = new Callable<Bundle>() {
+ public Bundle call() {
+ if (mSearchDialog.isShowing()) {
+ return mSearchDialog.onSaveInstanceState();
+ } else {
+ return null;
+ }
+ }
+ };
+
+ public void onRestoreInstanceState(final Bundle searchDialogState) {
+ if (searchDialogState != null) {
+ mHandler.post(new Runnable() {
+ public void run() {
+ mSearchDialog.onRestoreInstanceState(searchDialogState);
+ }
+ });
+ }
+ }
+
+ public void onConfigurationChanged(final Configuration newConfig) {
+ mHandler.post(new Runnable() {
+ public void run() {
+ if (mSearchDialog.isShowing()) {
+ mSearchDialog.onConfigurationChanged(newConfig);
+ }
+ }
+ });
+ }
+
+ /**
+ * Called by {@link SearchDialog} when it goes away.
+ */
+ public void onDismiss(DialogInterface dialog) {
+ if (DBG) debug("onDismiss()");
+ if (mCallback != null) {
+ try {
+ mCallback.onDismiss();
+ } catch (RemoteException ex) {
+ Log.e(TAG, "onDismiss() failed: " + ex);
+ }
+ }
+ }
+
+ /**
+ * Called by {@link SearchDialog} when the user or activity cancels search.
+ * When this is called, {@link #onDismiss} is called too.
+ */
+ public void onCancel(DialogInterface dialog) {
+ if (DBG) debug("onCancel()");
+ if (mCallback != null) {
+ try {
+ mCallback.onCancel();
+ } catch (RemoteException ex) {
+ Log.e(TAG, "onCancel() failed: " + ex);
+ }
+ }
+ }
/**
* Returns a list of the searchable activities that handle web searches.
@@ -173,4 +350,34 @@
public void setDefaultWebSearch(ComponentName component) {
mSearchables.setDefaultWebSearch(component);
}
+
+ /**
+ * Runs an operation on the handler for the service, blocks until it returns,
+ * and returns the value returned by the operation.
+ *
+ * @param <V> Return value type.
+ * @param callable Operation to run.
+ * @param errorResult Value to return if the operations throws an exception.
+ * @param name Operation name to include in error log messages.
+ * @return The value returned by the operation.
+ */
+ private <V> V postAndWait(Callable<V> callable, V errorResult, String name) {
+ FutureTask<V> task = new FutureTask<V>(callable);
+ mHandler.post(task);
+ try {
+ return task.get();
+ } catch (InterruptedException ex) {
+ Log.e(TAG, "Error calling " + name + ": " + ex);
+ return errorResult;
+ } catch (ExecutionException ex) {
+ Log.e(TAG, "Error calling " + name + ": " + ex);
+ return errorResult;
+ }
+ }
+
+ private static void debug(String msg) {
+ Thread thread = Thread.currentThread();
+ Log.d(TAG, msg + " (" + thread.getName() + "-" + thread.getId() + ")");
+ }
+
}
diff --git a/core/java/android/server/search/SearchableInfo.java b/core/java/android/server/search/SearchableInfo.java
index 4df7368..90dfa0b 100644
--- a/core/java/android/server/search/SearchableInfo.java
+++ b/core/java/android/server/search/SearchableInfo.java
@@ -320,7 +320,7 @@
// for now, implement some form of rules - minimal data
if (mLabelId == 0) {
- throw new IllegalArgumentException("No label.");
+ throw new IllegalArgumentException("Search label must be a resource reference.");
}
}
@@ -441,13 +441,17 @@
xml.close();
if (DBG) {
- Log.d(LOG_TAG, "Checked " + activityInfo.name
- + ",label=" + searchable.getLabelId()
- + ",icon=" + searchable.getIconId()
- + ",suggestAuthority=" + searchable.getSuggestAuthority()
- + ",target=" + searchable.getSearchActivity().getClassName()
- + ",global=" + searchable.shouldIncludeInGlobalSearch()
- + ",threshold=" + searchable.getSuggestThreshold());
+ if (searchable != null) {
+ Log.d(LOG_TAG, "Checked " + activityInfo.name
+ + ",label=" + searchable.getLabelId()
+ + ",icon=" + searchable.getIconId()
+ + ",suggestAuthority=" + searchable.getSuggestAuthority()
+ + ",target=" + searchable.getSearchActivity().getClassName()
+ + ",global=" + searchable.shouldIncludeInGlobalSearch()
+ + ",threshold=" + searchable.getSuggestThreshold());
+ } else {
+ Log.d(LOG_TAG, "Checked " + activityInfo.name + ", no searchable meta-data");
+ }
}
return searchable;
}
diff --git a/core/java/android/text/format/DateFormat.java b/core/java/android/text/format/DateFormat.java
index 963f429..3d10f17 100644
--- a/core/java/android/text/format/DateFormat.java
+++ b/core/java/android/text/format/DateFormat.java
@@ -262,16 +262,65 @@
/**
* Returns a {@link java.text.DateFormat} object that can format the date
* in short form (such as 12/31/1999) according
- * to the current locale.
+ * to the current locale and the user's date-order preference.
* @param context the application context
* @return the {@link java.text.DateFormat} object that properly formats the date.
*/
public static final java.text.DateFormat getDateFormat(Context context) {
+ String value = Settings.System.getString(context.getContentResolver(),
+ Settings.System.DATE_FORMAT);
+
+ return getDateFormatForSetting(context, value);
+ }
+
+ /**
+ * Returns a {@link java.text.DateFormat} object to format the date
+ * as if the date format setting were set to <code>value</code>,
+ * including null to use the locale's default format.
+ * @param context the application context
+ * @param value the date format setting string to interpret for
+ * the current locale
+ * @hide
+ */
+ public static java.text.DateFormat getDateFormatForSetting(Context context,
+ String value) {
+ if (value != null) {
+ int month = value.indexOf('M');
+ int day = value.indexOf('d');
+ int year = value.indexOf('y');
+
+ if (month >= 0 && day >= 0 && year >= 0) {
+ String template = context.getString(R.string.numeric_date_template);
+ if (year < month) {
+ if (month < day) {
+ value = String.format(template, "yyyy", "MM", "dd");
+ } else {
+ value = String.format(template, "yyyy", "dd", "MM");
+ }
+ } else if (month < day) {
+ if (day < year) {
+ value = String.format(template, "MM", "dd", "yyyy");
+ } else { // unlikely
+ value = String.format(template, "MM", "yyyy", "dd");
+ }
+ } else { // day < month
+ if (month < year) {
+ value = String.format(template, "dd", "MM", "yyyy");
+ } else { // unlikely
+ value = String.format(template, "dd", "yyyy", "MM");
+ }
+ }
+
+ return new java.text.SimpleDateFormat(value);
+ }
+ }
+
/*
+ * The setting is not set; use the default.
* We use a resource string here instead of just DateFormat.SHORT
* so that we get a four-digit year instead a two-digit year.
*/
- String value = context.getString(R.string.numeric_date_format);
+ value = context.getString(R.string.numeric_date_format);
return new java.text.SimpleDateFormat(value);
}
diff --git a/core/java/android/text/format/Formatter.java b/core/java/android/text/format/Formatter.java
index 1b30aa0..367b26c 100644
--- a/core/java/android/text/format/Formatter.java
+++ b/core/java/android/text/format/Formatter.java
@@ -59,9 +59,15 @@
result = result / 1024;
}
if (result < 100) {
- return String.format("%.2f%s", result, context.getText(suffix).toString());
+ String value = String.format("%.2f", result);
+ return context.getResources().
+ getString(com.android.internal.R.string.fileSizeSuffix,
+ value, context.getString(suffix));
}
- return String.format("%.0f%s", result, context.getText(suffix).toString());
+ String value = String.format("%.0f", result);
+ return context.getResources().
+ getString(com.android.internal.R.string.fileSizeSuffix,
+ value, context.getString(suffix));
}
/**
diff --git a/core/java/android/view/MotionEvent.java b/core/java/android/view/MotionEvent.java
index 86261c4..ca01448 100644
--- a/core/java/android/view/MotionEvent.java
+++ b/core/java/android/view/MotionEvent.java
@@ -59,32 +59,32 @@
public static final int ACTION_OUTSIDE = 4;
private static final boolean TRACK_RECYCLED_LOCATION = false;
-
+
/**
* Flag indicating the motion event intersected the top edge of the screen.
*/
public static final int EDGE_TOP = 0x00000001;
-
+
/**
* Flag indicating the motion event intersected the bottom edge of the screen.
*/
public static final int EDGE_BOTTOM = 0x00000002;
-
+
/**
* Flag indicating the motion event intersected the left edge of the screen.
*/
public static final int EDGE_LEFT = 0x00000004;
-
+
/**
* Flag indicating the motion event intersected the right edge of the screen.
*/
public static final int EDGE_RIGHT = 0x00000008;
-
+
static private final int MAX_RECYCLED = 10;
static private Object gRecyclerLock = new Object();
static private int gRecyclerUsed = 0;
static private MotionEvent gRecyclerTop = null;
-
+
private long mDownTime;
private long mEventTime;
private int mAction;
@@ -109,7 +109,7 @@
private MotionEvent() {
}
-
+
static private MotionEvent obtain() {
synchronized (gRecyclerLock) {
if (gRecyclerTop == null) {
@@ -123,26 +123,26 @@
return ev;
}
}
-
+
/**
* Create a new MotionEvent, filling in all of the basic values that
* define the motion.
- *
- * @param downTime The time (in ms) when the user originally pressed down to start
+ *
+ * @param downTime The time (in ms) when the user originally pressed down to start
* a stream of position events. This must be obtained from {@link SystemClock#uptimeMillis()}.
- * @param eventTime The the time (in ms) when this specific event was generated. This
+ * @param eventTime The the time (in ms) when this specific event was generated. This
* must be obtained from {@link SystemClock#uptimeMillis()}.
* @param action The kind of action being performed -- one of either
* {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or
* {@link #ACTION_CANCEL}.
* @param x The X coordinate of this event.
* @param y The Y coordinate of this event.
- * @param pressure The current pressure of this event. The pressure generally
- * ranges from 0 (no pressure at all) to 1 (normal pressure), however
- * values higher than 1 may be generated depending on the calibration of
+ * @param pressure The current pressure of this event. The pressure generally
+ * ranges from 0 (no pressure at all) to 1 (normal pressure), however
+ * values higher than 1 may be generated depending on the calibration of
* the input device.
* @param size A scaled value of the approximate size of the area being pressed when
- * touched with the finger. The actual value in pixels corresponding to the finger
+ * touched with the finger. The actual value in pixels corresponding to the finger
* touch is normalized with a device specific range of values
* and scaled to a value between 0 and 1.
* @param metaState The state of any meta / modifier keys that were in effect when
@@ -174,15 +174,15 @@
return ev;
}
-
+
/**
* Create a new MotionEvent, filling in a subset of the basic motion
* values. Those not specified here are: device id (always 0), pressure
* and size (always 1), x and y precision (always 1), and edgeFlags (always 0).
- *
- * @param downTime The time (in ms) when the user originally pressed down to start
+ *
+ * @param downTime The time (in ms) when the user originally pressed down to start
* a stream of position events. This must be obtained from {@link SystemClock#uptimeMillis()}.
- * @param eventTime The the time (in ms) when this specific event was generated. This
+ * @param eventTime The the time (in ms) when this specific event was generated. This
* must be obtained from {@link SystemClock#uptimeMillis()}.
* @param action The kind of action being performed -- one of either
* {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or
@@ -229,9 +229,10 @@
float[] history = mHistory;
int length = history.length;
for (int i = 0; i < length; i += 4) {
- history[i] *= scale;
- history[i + 2] *= scale;
- history[i + 3] *= scale;
+ history[i] *= scale; // X
+ // history[i + 2] == pressure
+ history[i + 1] *= scale; // Y
+ history[i + 3] *= scale; // Size, TODO: square this?
}
}
}
@@ -265,7 +266,7 @@
}
return ev;
}
-
+
/**
* Recycle the MotionEvent, to be re-used by a later caller. After calling
* this function you must not ever touch the event again.
@@ -291,7 +292,7 @@
}
}
}
-
+
/**
* Return the kind of action being performed -- one of either
* {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or
@@ -302,8 +303,8 @@
}
/**
- * Returns the time (in ms) when the user originally pressed down to start
- * a stream of position events.
+ * Returns the time (in ms) when the user originally pressed down to start
+ * a stream of position events.
*/
public final long getDownTime() {
return mDownTime;
@@ -317,25 +318,25 @@
}
/**
- * Returns the X coordinate of this event. Whole numbers are pixels; the
- * value may have a fraction for input devices that are sub-pixel precise.
+ * Returns the X coordinate of this event. Whole numbers are pixels; the
+ * value may have a fraction for input devices that are sub-pixel precise.
*/
public final float getX() {
return mX;
}
/**
- * Returns the Y coordinate of this event. Whole numbers are pixels; the
- * value may have a fraction for input devices that are sub-pixel precise.
+ * Returns the Y coordinate of this event. Whole numbers are pixels; the
+ * value may have a fraction for input devices that are sub-pixel precise.
*/
public final float getY() {
return mY;
}
/**
- * Returns the current pressure of this event. The pressure generally
- * ranges from 0 (no pressure at all) to 1 (normal pressure), however
- * values higher than 1 may be generated depending on the calibration of
+ * Returns the current pressure of this event. The pressure generally
+ * ranges from 0 (no pressure at all) to 1 (normal pressure), however
+ * values higher than 1 may be generated depending on the calibration of
* the input device.
*/
public final float getPressure() {
@@ -344,9 +345,9 @@
/**
* Returns a scaled value of the approximate size, of the area being pressed when
- * touched with the finger. The actual value in pixels corresponding to the finger
+ * touched with the finger. The actual value in pixels corresponding to the finger
* touch is normalized with the device specific range of values
- * and scaled to a value between 0 and 1. The value of size can be used to
+ * and scaled to a value between 0 and 1. The value of size can be used to
* determine fat touch events.
*/
public final float getSize() {
@@ -396,7 +397,7 @@
public final float getXPrecision() {
return mXPrecision;
}
-
+
/**
* Return the precision of the Y coordinates being reported. You can
* multiple this number with {@link #getY} to find the actual hardware
@@ -406,89 +407,89 @@
public final float getYPrecision() {
return mYPrecision;
}
-
+
/**
* Returns the number of historical points in this event. These are
* movements that have occurred between this event and the previous event.
* This only applies to ACTION_MOVE events -- all other actions will have
* a size of 0.
- *
+ *
* @return Returns the number of historical points in the event.
*/
public final int getHistorySize() {
return mNumHistory;
}
-
+
/**
* Returns the time that a historical movement occurred between this event
* and the previous event. Only applies to ACTION_MOVE events.
- *
+ *
* @param pos Which historical value to return; must be less than
* {@link #getHistorySize}
- *
+ *
* @see #getHistorySize
* @see #getEventTime
*/
public final long getHistoricalEventTime(int pos) {
return mHistoryTimes[pos];
}
-
+
/**
* Returns a historical X coordinate that occurred between this event
* and the previous event. Only applies to ACTION_MOVE events.
- *
+ *
* @param pos Which historical value to return; must be less than
* {@link #getHistorySize}
- *
+ *
* @see #getHistorySize
* @see #getX
*/
public final float getHistoricalX(int pos) {
return mHistory[pos*4];
}
-
+
/**
* Returns a historical Y coordinate that occurred between this event
* and the previous event. Only applies to ACTION_MOVE events.
- *
+ *
* @param pos Which historical value to return; must be less than
* {@link #getHistorySize}
- *
+ *
* @see #getHistorySize
* @see #getY
*/
public final float getHistoricalY(int pos) {
return mHistory[pos*4 + 1];
}
-
+
/**
* Returns a historical pressure coordinate that occurred between this event
* and the previous event. Only applies to ACTION_MOVE events.
- *
+ *
* @param pos Which historical value to return; must be less than
* {@link #getHistorySize}
- *
+ *
* @see #getHistorySize
* @see #getPressure
*/
public final float getHistoricalPressure(int pos) {
return mHistory[pos*4 + 2];
}
-
+
/**
* Returns a historical size coordinate that occurred between this event
* and the previous event. Only applies to ACTION_MOVE events.
- *
+ *
* @param pos Which historical value to return; must be less than
* {@link #getHistorySize}
- *
+ *
* @see #getHistorySize
* @see #getSize
*/
public final float getHistoricalSize(int pos) {
return mHistory[pos*4 + 3];
}
-
+
/**
* Return the id for the device that this event came from. An id of
* zero indicates that the event didn't come from a physical device; other
@@ -497,12 +498,12 @@
public final int getDeviceId() {
return mDeviceId;
}
-
+
/**
* Returns a bitfield indicating which edges, if any, where touched by this
- * MotionEvent. For touch events, clients can use this to determine if the
- * user's finger was touching the edge of the display.
- *
+ * MotionEvent. For touch events, clients can use this to determine if the
+ * user's finger was touching the edge of the display.
+ *
* @see #EDGE_LEFT
* @see #EDGE_TOP
* @see #EDGE_RIGHT
@@ -511,12 +512,12 @@
public final int getEdgeFlags() {
return mEdgeFlags;
}
-
+
/**
* Sets the bitfield indicating which edges, if any, where touched by this
- * MotionEvent.
- *
+ * MotionEvent.
+ *
* @see #getEdgeFlags()
*/
public final void setEdgeFlags(int flags) {
@@ -548,11 +549,11 @@
pos[i+1] += deltaY;
}
}
-
+
/**
* Set this event's location. Applies {@link #offsetLocation} with a
* delta from the current location to the given new location.
- *
+ *
* @param x New absolute X location.
* @param y New absolute Y location.
*/
@@ -563,13 +564,13 @@
offsetLocation(deltaX, deltaY);
}
}
-
+
/**
* Add a new movement to the batch of movements in this event. The event's
* current location, position and size is updated to the new values. In
* the future, the current values in the event will be added to a list of
* historic values.
- *
+ *
* @param x The new X position.
* @param y The new Y position.
* @param pressure The new pressure.
@@ -599,16 +600,16 @@
mHistoryTimes = historyTimes = newHistoryTimes;
}
}
-
+
historyTimes[N] = mEventTime;
-
+
final int pos = N*4;
history[pos] = mX;
history[pos+1] = mY;
history[pos+2] = mPressure;
history[pos+3] = mSize;
mNumHistory = N+1;
-
+
mEventTime = eventTime;
mX = mRawX = x;
mY = mRawY = y;
@@ -616,7 +617,7 @@
mSize = size;
mMetaState |= metaState;
}
-
+
@Override
public String toString() {
return "MotionEvent{" + Integer.toHexString(System.identityHashCode(this))
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index bcb97ed..0497344 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -75,17 +75,17 @@
* This class represents the basic building block for user interface components. A View
* occupies a rectangular area on the screen and is responsible for drawing and
* event handling. View is the base class for <em>widgets</em>, which are
- * used to create interactive UI components (buttons, text fields, etc.). The
+ * used to create interactive UI components (buttons, text fields, etc.). The
* {@link android.view.ViewGroup} subclass is the base class for <em>layouts</em>, which
* are invisible containers that hold other Views (or other ViewGroups) and define
* their layout properties.
* </p>
*
* <div class="special">
- * <p>For an introduction to using this class to develop your
- * application's user interface, read the Developer Guide documentation on
+ * <p>For an introduction to using this class to develop your
+ * application's user interface, read the Developer Guide documentation on
* <strong><a href="{@docRoot}guide/topics/ui/index.html">User Interface</a></strong>. Special topics
- * include:
+ * include:
* <br/><a href="{@docRoot}guide/topics/ui/declaring-layout.html">Declaring Layout</a>
* <br/><a href="{@docRoot}guide/topics/ui/menus.html">Creating Menus</a>
* <br/><a href="{@docRoot}guide/topics/ui/layout-objects.html">Common Layout Objects</a>
@@ -96,7 +96,7 @@
* <br/><a href="{@docRoot}guide/topics/ui/how-android-draws.html">How Android Draws Views</a>.
* </p>
* </div>
- *
+ *
* <a name="Using"></a>
* <h3>Using Views</h3>
* <p>
@@ -422,7 +422,7 @@
* </p>
*
* <p>
- * Note that the framework will not draw views that are not in the invalid region.
+ * Note that the framework will not draw views that are not in the invalid region.
* </p>
*
* <p>
@@ -1830,7 +1830,7 @@
int viewFlagMasks = 0;
boolean setScrollContainer = false;
-
+
int x = 0;
int y = 0;
@@ -2464,7 +2464,7 @@
if (!(parent instanceof View)) {
break;
}
-
+
child = (View) parent;
parent = child.getParent();
}
@@ -2556,7 +2556,7 @@
* and previouslyFocusedRect provide insight into where the focus is coming from.
* When overriding, be sure to call up through to the super class so that
* the standard focus handling will occur.
- *
+ *
* @param gainFocus True if the View has focus; false otherwise.
* @param direction The direction focus has moved when requestFocus()
* is called to give this view focus. Values are
@@ -2587,7 +2587,7 @@
&& mAttachInfo.mHasWindowFocus) {
imm.focusIn(this);
}
-
+
invalidate();
if (mOnFocusChangeListener != null) {
mOnFocusChangeListener.onFocusChange(this, gainFocus);
@@ -2676,7 +2676,7 @@
* Subclasses of View overriding this method should always call super.onFocusLost().
*
* @see #onFocusChanged(boolean, int, android.graphics.Rect)
- * @see #onWindowFocusChanged(boolean)
+ * @see #onWindowFocusChanged(boolean)
*
* @hide pending API council approval
*/
@@ -3578,14 +3578,14 @@
*/
public void onStartTemporaryDetach() {
}
-
+
/**
* Called after {@link #onStartTemporaryDetach} when the container is done
* changing the view.
*/
public void onFinishTemporaryDetach() {
}
-
+
/**
* capture information of this view for later analysis: developement only
* check dynamic switch to make sure we only dump view
@@ -3970,25 +3970,25 @@
* a call on that method would return a non-null InputConnection, and
* they are really a first-class editor that the user would normally
* start typing on when the go into a window containing your view.
- *
+ *
* <p>The default implementation always returns false. This does
* <em>not</em> mean that its {@link #onCreateInputConnection(EditorInfo)}
* will not be called or the user can not otherwise perform edits on your
* view; it is just a hint to the system that this is not the primary
* purpose of this view.
- *
+ *
* @return Returns true if this view is a text editor, else false.
*/
public boolean onCheckIsTextEditor() {
return false;
}
-
+
/**
* Create a new InputConnection for an InputMethod to interact
* with the view. The default implementation returns null, since it doesn't
* support input methods. You can override this to implement such support.
* This is only needed for views that take focus and text input.
- *
+ *
* <p>When implementing this, you probably also want to implement
* {@link #onCheckIsTextEditor()} to indicate you will return a
* non-null InputConnection.
@@ -4012,7 +4012,7 @@
public boolean checkInputConnectionProxy(View view) {
return false;
}
-
+
/**
* Show the context menu for this view. It is not safe to hold on to the
* menu after returning from this method.
@@ -4743,7 +4743,7 @@
* whether an instance is opaque. Opaque Views are treated in a special way by
* the View hierarchy, possibly allowing it to perform optimizations during
* invalidate/draw passes.
- *
+ *
* @return True if this View is guaranteed to be fully opaque, false otherwise.
*
* @hide Pending API council approval
@@ -5343,9 +5343,9 @@
}
}
}
-
+
/**
- * Override this if the vertical scrollbar needs to be hidden in a subclass, like when
+ * Override this if the vertical scrollbar needs to be hidden in a subclass, like when
* FastScroller is visible.
* @return whether to temporarily hide the vertical scrollbar
* @hide
@@ -5868,8 +5868,17 @@
EventLog.writeEvent(60002, hashCode());
}
- final int width = mRight - mLeft;
- final int height = mBottom - mTop;
+ int width = mRight - mLeft;
+ int height = mBottom - mTop;
+
+ final AttachInfo attachInfo = mAttachInfo;
+ if (attachInfo != null) {
+ final boolean scalingRequired = attachInfo.mScalingRequired;
+ if (scalingRequired) {
+ width = (int) ((width * attachInfo.mApplicationScale) + 0.5f);
+ height = (int) ((height * attachInfo.mApplicationScale) + 0.5f);
+ }
+ }
final int drawingCacheBackgroundColor = mDrawingCacheBackgroundColor;
final boolean opaque = drawingCacheBackgroundColor != 0 ||
@@ -5925,11 +5934,17 @@
}
Canvas canvas;
- final AttachInfo attachInfo = mAttachInfo;
if (attachInfo != null) {
canvas = attachInfo.mCanvas;
if (canvas == null) {
canvas = new Canvas();
+
+ // NOTE: This should have to happen only once since compatibility
+ // mode should not change at runtime
+ if (attachInfo.mScalingRequired) {
+ final float scale = attachInfo.mApplicationScale;
+ canvas.scale(scale, scale);
+ }
}
canvas.setBitmap(bitmap);
// Temporarily clobber the cached Canvas in case one of our children
@@ -6031,7 +6046,7 @@
// Restore the cached Canvas for our siblings
attachInfo.mCanvas = canvas;
}
-
+
return bitmap;
}
@@ -6971,7 +6986,7 @@
mUserPaddingBottom = bottom;
final int viewFlags = mViewFlags;
-
+
// Common case is there are no scroll bars.
if ((viewFlags & (SCROLLBARS_VERTICAL|SCROLLBARS_HORIZONTAL)) != 0) {
// TODO: Deal with RTL languages to adjust left padding instead of right.
@@ -6984,7 +6999,7 @@
? 0 : getHorizontalScrollbarHeight();
}
}
-
+
if (mPaddingLeft != left) {
changed = true;
mPaddingLeft = left;
@@ -7121,7 +7136,7 @@
return v;
}
}
-
+
View parent = this;
while (parent.mParent != null && parent.mParent instanceof View) {
@@ -7169,7 +7184,7 @@
location[1] += view.mTop - view.mScrollY;
viewParent = view.mParent;
}
-
+
if (viewParent instanceof ViewRoot) {
// *cough*
final ViewRoot vr = (ViewRoot)viewParent;
@@ -7320,7 +7335,7 @@
* @return the Object stored in this view as a tag
*
* @see #setTag(int, Object)
- * @see #getTag()
+ * @see #getTag()
*/
public Object getTag(int key) {
SparseArray<Object> tags = null;
@@ -7376,7 +7391,7 @@
+ "resource id.");
}
- setTagInternal(this, key, tag);
+ setTagInternal(this, key, tag);
}
private static void setTagInternal(View view, int key, Object tag) {
@@ -7411,7 +7426,7 @@
/**
* Method that subclasses should implement to check their consistency. The type of
* consistency check is indicated by the bit field passed as a parameter.
- *
+ *
* @param consistency The type of consistency. See ViewDebug for more information.
*
* @throws IllegalStateException if the view is in an inconsistent state.
@@ -7966,7 +7981,7 @@
/**
* BZZZTT!!1!
- *
+ *
* <p>Provide haptic feedback to the user for this view.
*
* <p>The framework will provide haptic feedback for some built in actions,
@@ -7985,7 +8000,7 @@
/**
* BZZZTT!!1!
- *
+ *
* <p>Like {@link #performHapticFeedback(int)}, with additional options.
*
* @param feedbackConstant One of the constants defined in
@@ -8448,11 +8463,21 @@
* The top view of the hierarchy.
*/
View mRootView;
-
+
IBinder mPanelParentWindowToken;
Surface mSurface;
/**
+ * Scale factor used by the compatibility mode
+ */
+ float mApplicationScale;
+
+ /**
+ * Indicates whether the application is in compatibility mode
+ */
+ boolean mScalingRequired;
+
+ /**
* Left position of this view's window
*/
int mWindowLeft;
@@ -8639,18 +8664,18 @@
// use use a height of 1, and then wack the matrix each time we
// actually use it.
shader = new LinearGradient(0, 0, 0, 1, 0xFF000000, 0, Shader.TileMode.CLAMP);
-
+
paint.setShader(shader);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
}
-
+
public void setFadeColor(int color) {
if (color != 0 && color != mLastColor) {
mLastColor = color;
color |= 0xFF000000;
-
+
shader = new LinearGradient(0, 0, 0, 1, color, 0, Shader.TileMode.CLAMP);
-
+
paint.setShader(shader);
// Restore the default transfer mode (src_over)
paint.setXfermode(null);
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 8b0629c..f803b5a 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -99,7 +99,7 @@
/**
* Internal flags.
- *
+ *
* This field should be made private, so it is hidden from the SDK.
* {@hide}
*/
@@ -152,7 +152,7 @@
* to get the index of the child to draw for that iteration.
*/
protected static final int FLAG_USE_CHILD_DRAWING_ORDER = 0x400;
-
+
/**
* When set, this ViewGroup supports static transformations on children; this causes
* {@link #getChildStaticTransformation(View, android.view.animation.Transformation)} to be
@@ -161,7 +161,7 @@
* Any subclass overriding
* {@link #getChildStaticTransformation(View, android.view.animation.Transformation)} should
* set this flags in {@link #mGroupFlags}.
- *
+ *
* {@hide}
*/
protected static final int FLAG_SUPPORT_STATIC_TRANSFORMATIONS = 0x800;
@@ -222,7 +222,7 @@
* When set, this ViewGroup should not intercept touch events.
*/
private static final int FLAG_DISALLOW_INTERCEPT = 0x80000;
-
+
/**
* Indicates which types of drawing caches are to be kept in memory.
* This field should be made private, so it is hidden from the SDK.
@@ -698,7 +698,7 @@
ViewParent parent = mParent;
if (parent != null) parent.recomputeViewAttributes(this);
}
-
+
@Override
void dispatchCollectViewAttributes(int visibility) {
visibility |= mViewFlags&VISIBILITY_MASK;
@@ -830,16 +830,16 @@
}
}
}
-
+
boolean isUpOrCancel = (action == MotionEvent.ACTION_UP) ||
- (action == MotionEvent.ACTION_CANCEL);
+ (action == MotionEvent.ACTION_CANCEL);
if (isUpOrCancel) {
// Note, we've already copied the previous state to our local
// variable, so this takes effect on the next event
mGroupFlags &= ~FLAG_DISALLOW_INTERCEPT;
}
-
+
// The event wasn't an ACTION_DOWN, dispatch it to our target if
// we have one.
final View target = mMotionTarget;
@@ -886,18 +886,18 @@
* {@inheritDoc}
*/
public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
-
+
if (disallowIntercept == ((mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0)) {
// We're already in this state, assume our ancestors are too
return;
}
-
+
if (disallowIntercept) {
mGroupFlags |= FLAG_DISALLOW_INTERCEPT;
} else {
mGroupFlags &= ~FLAG_DISALLOW_INTERCEPT;
}
-
+
// Pass it up to our parent
if (mParent != null) {
mParent.requestDisallowInterceptTouchEvent(disallowIntercept);
@@ -1301,7 +1301,7 @@
post(end);
}
}
-
+
/**
* Returns the index of the child to draw for this iteration. Override this
* if you want to change the drawing order of children. By default, it
@@ -1309,14 +1309,14 @@
* <p>
* NOTE: In order for this method to be called, the
* {@link #FLAG_USE_CHILD_DRAWING_ORDER} must be set.
- *
+ *
* @param i The current iteration.
* @return The index of the child to draw this iteration.
*/
protected int getChildDrawingOrder(int childCount, int i) {
return i;
}
-
+
private void notifyAnimationListener() {
mGroupFlags &= ~FLAG_NOTIFY_ANIMATION_LISTENER;
mGroupFlags |= FLAG_ANIMATION_DONE;
@@ -1444,10 +1444,12 @@
final int sx = child.mScrollX;
final int sy = child.mScrollY;
+ boolean scalingRequired = false;
Bitmap cache = null;
if ((flags & FLAG_CHILDREN_DRAWN_WITH_CACHE) == FLAG_CHILDREN_DRAWN_WITH_CACHE ||
(flags & FLAG_ALWAYS_DRAWN_WITH_CACHE) == FLAG_ALWAYS_DRAWN_WITH_CACHE) {
cache = child.getDrawingCache();
+ if (mAttachInfo != null) scalingRequired = mAttachInfo.mScalingRequired;
}
final boolean hasNoCache = cache == null;
@@ -1457,6 +1459,11 @@
canvas.translate(cl - sx, ct - sy);
} else {
canvas.translate(cl, ct);
+ if (scalingRequired) {
+ // mAttachInfo cannot be null, otherwise scalingRequired == false
+ final float scale = 1.0f / mAttachInfo.mApplicationScale;
+ canvas.scale(scale, scale);
+ }
}
float alpha = 1.0f;
@@ -1499,7 +1506,11 @@
if (hasNoCache) {
canvas.clipRect(sx, sy, sx + (cr - cl), sy + (cb - ct));
} else {
- canvas.clipRect(0, 0, cr - cl, cb - ct);
+ if (!scalingRequired) {
+ canvas.clipRect(0, 0, cr - cl, cb - ct);
+ } else {
+ canvas.clipRect(0, 0, cache.getWidth(), cache.getHeight());
+ }
}
}
@@ -1509,7 +1520,7 @@
if (ViewDebug.TRACE_HIERARCHY) {
ViewDebug.trace(this, ViewDebug.HierarchyTraceType.DRAW);
}
- child.mPrivateFlags &= ~DIRTY_MASK;
+ child.mPrivateFlags &= ~DIRTY_MASK;
child.dispatchDraw(canvas);
} else {
child.draw(canvas);
@@ -1574,7 +1585,7 @@
children[i].setSelected(selected);
}
}
-
+
@Override
protected void dispatchSetPressed(boolean pressed) {
final View[] children = mChildren;
@@ -1605,7 +1616,7 @@
/**
* {@inheritDoc}
*
- * @see #setStaticTransformationsEnabled(boolean)
+ * @see #setStaticTransformationsEnabled(boolean)
*/
protected boolean getChildStaticTransformation(View child, Transformation t) {
return false;
@@ -1872,10 +1883,10 @@
if (child.hasFocus()) {
requestChildFocus(child, child.findFocus());
}
-
+
AttachInfo ai = mAttachInfo;
if (ai != null) {
- boolean lastKeepOn = ai.mKeepScreenOn;
+ boolean lastKeepOn = ai.mKeepScreenOn;
ai.mKeepScreenOn = false;
child.dispatchAttachedToWindow(mAttachInfo, (mViewFlags&VISIBILITY_MASK));
if (ai.mKeepScreenOn) {
@@ -2075,7 +2086,7 @@
}
needGlobalAttributesUpdate(false);
-
+
removeFromArray(index);
if (clearChildFocus) {
@@ -2108,7 +2119,7 @@
}
needGlobalAttributesUpdate(false);
-
+
if (notifyListener) {
onHierarchyChangeListener.onChildViewRemoved(this, view);
}
@@ -2156,7 +2167,7 @@
View clearChildFocus = null;
needGlobalAttributesUpdate(false);
-
+
for (int i = count - 1; i >= 0; i--) {
final View view = children[i];
@@ -2201,7 +2212,7 @@
if (child == mFocused) {
child.clearFocus();
}
-
+
if (animate && child.getAnimation() != null) {
addDisappearingView(child);
} else if (child.mAttachInfo != null) {
@@ -3164,7 +3175,7 @@
}
}
}
-
+
@Override
protected boolean fitSystemWindows(Rect insets) {
@@ -3298,7 +3309,7 @@
* laid out. See
* {@link android.R.styleable#ViewGroup_Layout ViewGroup Layout Attributes}
* for a list of all child view attributes that this class supports.
- *
+ *
* <p>
* The base LayoutParams class just describes how big the view wants to be
* for both width and height. For each dimension, it can specify one of:
@@ -3429,7 +3440,7 @@
* @param output the String to prepend to the internal representation
* @return a String with the following format: output +
* "ViewGroup.LayoutParams={ width=WIDTH, height=HEIGHT }"
- *
+ *
* @hide
*/
public String debug(String output) {
@@ -3442,7 +3453,7 @@
*
* @param size the size to convert
* @return a String instance representing the supplied size
- *
+ *
* @hide
*/
protected static String sizeToString(int size) {
diff --git a/core/java/android/view/ViewRoot.java b/core/java/android/view/ViewRoot.java
index ee8229d..d35b048 100644
--- a/core/java/android/view/ViewRoot.java
+++ b/core/java/android/view/ViewRoot.java
@@ -94,18 +94,18 @@
static final ThreadLocal<RunQueue> sRunQueues = new ThreadLocal<RunQueue>();
- private static int sDrawTime;
+ private static int sDrawTime;
long mLastTrackballTime = 0;
final TrackballAxis mTrackballAxisX = new TrackballAxis();
final TrackballAxis mTrackballAxisY = new TrackballAxis();
final int[] mTmpLocation = new int[2];
-
+
final InputMethodCallback mInputMethodCallback;
final SparseArray<Object> mPendingEvents = new SparseArray<Object>();
int mPendingEventSeq = 0;
-
+
final Thread mThread;
final WindowLeaked mLocation;
@@ -127,7 +127,7 @@
int mHeight;
Rect mDirty; // will be a graphics.Region soon
boolean mIsAnimating;
-
+
private CompatibilityInfo mCompatibilityInfo;
final View.AttachInfo mAttachInfo;
@@ -170,7 +170,7 @@
int mScrollY;
int mCurScrollY;
Scroller mScroller;
-
+
EGL10 mEgl;
EGLDisplay mEglDisplay;
EGLContext mEglContext;
@@ -180,7 +180,7 @@
boolean mUseGL;
boolean mGlWanted;
- final ViewConfiguration mViewConfiguration;
+ final ViewConfiguration mViewConfiguration;
/**
* see {@link #playSoundEffect(int)}
@@ -399,13 +399,15 @@
mSoftInputMode = attrs.softInputMode;
mWindowAttributesChanged = true;
mAttachInfo.mRootView = view;
+ mAttachInfo.mScalingRequired = mCompatibilityInfo.mScalingRequired;
+ mAttachInfo.mApplicationScale = mCompatibilityInfo.mApplicationScale;
if (panelParentView != null) {
mAttachInfo.mPanelParentWindowToken
= panelParentView.getApplicationWindowToken();
}
mAdded = true;
int res; /* = WindowManagerImpl.ADD_OKAY; */
-
+
// Schedule the first layout -before- adding to the window
// manager, to make sure we do the relayout before receiving
// any other events from the system.
@@ -594,7 +596,7 @@
int getHostVisibility() {
return mAppVisible ? mView.getVisibility() : View.GONE;
}
-
+
private void performTraversals() {
// cache mView since it is used so much below...
final View host = mView;
@@ -638,7 +640,7 @@
fullRedrawNeeded = true;
mLayoutRequested = true;
- DisplayMetrics packageMetrics =
+ DisplayMetrics packageMetrics =
mView.getContext().getResources().getDisplayMetrics();
desiredWindowWidth = packageMetrics.widthPixels;
desiredWindowHeight = packageMetrics.heightPixels;
@@ -685,7 +687,7 @@
}
boolean insetsChanged = false;
-
+
if (mLayoutRequested) {
if (mFirst) {
host.fitSystemWindows(mAttachInfo.mContentInsets);
@@ -710,7 +712,7 @@
|| lp.height == ViewGroup.LayoutParams.WRAP_CONTENT) {
windowResizesToFitContent = true;
- DisplayMetrics packageMetrics =
+ DisplayMetrics packageMetrics =
mView.getContext().getResources().getDisplayMetrics();
desiredWindowWidth = packageMetrics.widthPixels;
desiredWindowHeight = packageMetrics.heightPixels;
@@ -770,7 +772,7 @@
}
}
}
-
+
if (params != null && (host.mPrivateFlags & View.REQUEST_TRANSPARENT_REGIONS) != 0) {
if (!PixelFormat.formatHasAlpha(params.format)) {
params.format = PixelFormat.TRANSLUCENT;
@@ -799,7 +801,7 @@
// computed insets.
insetsPending = computesInternalInsets
&& (mFirst || viewVisibilityChanged);
-
+
if (mWindowAttributes.memoryType == WindowManager.LayoutParams.MEMORY_TYPE_GPU) {
if (params == null) {
params = mWindowAttributes;
@@ -835,7 +837,7 @@
+ " content=" + mPendingContentInsets.toShortString()
+ " visible=" + mPendingVisibleInsets.toShortString()
+ " surface=" + mSurface);
-
+
contentInsetsChanged = !mPendingContentInsets.equals(
mAttachInfo.mContentInsets);
visibleInsetsChanged = !mPendingVisibleInsets.equals(
@@ -863,7 +865,7 @@
// all at once.
newSurface = true;
fullRedrawNeeded = true;
-
+
if (mGlWanted && !mUseGL) {
initializeGL();
initialized = mGlCanvas != null;
@@ -908,7 +910,7 @@
+ " mHeight=" + mHeight
+ " measuredHeight" + host.mMeasuredHeight
+ " coveredInsetsChanged=" + contentInsetsChanged);
-
+
// Ask host how big it wants to be
host.measure(childWidthMeasureSpec, childHeightMeasureSpec);
@@ -983,7 +985,7 @@
mTmpLocation[1] + host.mBottom - host.mTop);
host.gatherTransparentRegion(mTransparentRegion);
- mTransparentRegion.scale(appScale);
+ mTransparentRegion.scale(appScale);
if (!mTransparentRegion.equals(mPreviousTransparentRegion)) {
mPreviousTransparentRegion.set(mTransparentRegion);
// reconfigure window manager
@@ -1027,7 +1029,7 @@
}
}
}
-
+
if (mFirst) {
// handle first focus request
if (DEBUG_INPUT_RESIZE) Log.v(TAG, "First: mView.hasFocus()="
@@ -1065,7 +1067,7 @@
}
}
}
-
+
boolean cancelDraw = attachInfo.mTreeObserver.dispatchOnPreDraw();
if (!cancelDraw && !newSurface) {
@@ -1153,7 +1155,7 @@
mAttachInfo.mViewScrollChanged = false;
mAttachInfo.mTreeObserver.dispatchOnScrollChanged();
}
-
+
int yoff;
final boolean scrolling = mScroller != null && mScroller.computeScrollOffset();
if (scrolling) {
@@ -1318,7 +1320,7 @@
EventLog.writeEvent(60000, SystemClock.elapsedRealtime() - startTime);
}
}
-
+
} finally {
surface.unlockCanvasAndPost(canvas);
}
@@ -1326,7 +1328,7 @@
if (LOCAL_LOGV) {
Log.v("ViewRoot", "Surface " + surface + " unlockCanvasAndPost");
}
-
+
if (scrolling) {
mFullRedrawNeeded = true;
scheduleTraversals();
@@ -1339,7 +1341,7 @@
final Rect vi = attachInfo.mVisibleInsets;
int scrollY = 0;
boolean handled = false;
-
+
if (vi.left > ci.left || vi.top > ci.top
|| vi.right > ci.right || vi.bottom > ci.bottom) {
// We'll assume that we aren't going to change the scroll
@@ -1426,7 +1428,7 @@
}
}
}
-
+
if (scrollY != mScrollY) {
if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Pan scroll changed: old="
+ mScrollY + " , new=" + scrollY);
@@ -1440,10 +1442,10 @@
}
mScrollY = scrollY;
}
-
+
return handled;
}
-
+
public void requestChildFocus(View child, View focused) {
checkThread();
if (mFocusedView != focused) {
@@ -1523,7 +1525,7 @@
} catch (RemoteException e) {
}
}
-
+
/**
* Return true if child is an ancestor of parent, (or equal to the parent).
*/
@@ -1727,10 +1729,10 @@
}
}
}
-
+
mLastWasImTarget = WindowManager.LayoutParams
.mayUseInputMethod(mWindowAttributes.flags);
-
+
InputMethodManager imm = InputMethodManager.peekInstance();
if (mView != null) {
if (hasWindowFocus && imm != null && mLastWasImTarget) {
@@ -2151,50 +2153,50 @@
}
/**
- * log motion events
+ * log motion events
*/
private static void captureMotionLog(String subTag, MotionEvent ev) {
- //check dynamic switch
+ //check dynamic switch
if (ev == null ||
SystemProperties.getInt(ViewDebug.SYSTEM_PROPERTY_CAPTURE_EVENT, 0) == 0) {
return;
- }
-
- StringBuilder sb = new StringBuilder(subTag + ": ");
- sb.append(ev.getDownTime()).append(',');
- sb.append(ev.getEventTime()).append(',');
- sb.append(ev.getAction()).append(',');
- sb.append(ev.getX()).append(',');
- sb.append(ev.getY()).append(',');
- sb.append(ev.getPressure()).append(',');
- sb.append(ev.getSize()).append(',');
- sb.append(ev.getMetaState()).append(',');
- sb.append(ev.getXPrecision()).append(',');
- sb.append(ev.getYPrecision()).append(',');
- sb.append(ev.getDeviceId()).append(',');
- sb.append(ev.getEdgeFlags());
- Log.d(TAG, sb.toString());
- }
- /**
- * log motion events
- */
- private static void captureKeyLog(String subTag, KeyEvent ev) {
- //check dynamic switch
- if (ev == null ||
- SystemProperties.getInt(ViewDebug.SYSTEM_PROPERTY_CAPTURE_EVENT, 0) == 0) {
- return;
}
- StringBuilder sb = new StringBuilder(subTag + ": ");
+
+ StringBuilder sb = new StringBuilder(subTag + ": ");
sb.append(ev.getDownTime()).append(',');
sb.append(ev.getEventTime()).append(',');
sb.append(ev.getAction()).append(',');
- sb.append(ev.getKeyCode()).append(',');
+ sb.append(ev.getX()).append(',');
+ sb.append(ev.getY()).append(',');
+ sb.append(ev.getPressure()).append(',');
+ sb.append(ev.getSize()).append(',');
+ sb.append(ev.getMetaState()).append(',');
+ sb.append(ev.getXPrecision()).append(',');
+ sb.append(ev.getYPrecision()).append(',');
+ sb.append(ev.getDeviceId()).append(',');
+ sb.append(ev.getEdgeFlags());
+ Log.d(TAG, sb.toString());
+ }
+ /**
+ * log motion events
+ */
+ private static void captureKeyLog(String subTag, KeyEvent ev) {
+ //check dynamic switch
+ if (ev == null ||
+ SystemProperties.getInt(ViewDebug.SYSTEM_PROPERTY_CAPTURE_EVENT, 0) == 0) {
+ return;
+ }
+ StringBuilder sb = new StringBuilder(subTag + ": ");
+ sb.append(ev.getDownTime()).append(',');
+ sb.append(ev.getEventTime()).append(',');
+ sb.append(ev.getAction()).append(',');
+ sb.append(ev.getKeyCode()).append(',');
sb.append(ev.getRepeatCount()).append(',');
sb.append(ev.getMetaState()).append(',');
sb.append(ev.getDeviceId()).append(',');
sb.append(ev.getScanCode());
- Log.d(TAG, sb.toString());
- }
+ Log.d(TAG, sb.toString());
+ }
int enqueuePendingEvent(Object event, boolean sendDone) {
int seq = mPendingEventSeq+1;
@@ -2212,7 +2214,7 @@
}
return event;
}
-
+
private void deliverKeyEvent(KeyEvent event, boolean sendDone) {
// If mView is null, we just consume the key event because it doesn't
// make sense to do anything else with it.
@@ -2269,7 +2271,7 @@
}
}
}
-
+
private void deliverKeyEventToViewHierarchy(KeyEvent event, boolean sendDone) {
try {
if (mView != null && mAdded) {
@@ -2278,8 +2280,8 @@
if (checkForLeavingTouchModeAndConsume(event)) {
return;
- }
-
+ }
+
if (Config.LOGV) {
captureKeyLog("captureDispatchKeyEvent", event);
}
@@ -2384,12 +2386,12 @@
}
return relayoutResult;
}
-
+
/**
* Adjust the window's layout parameter for compatibility mode. It replaces FILL_PARENT
* with the default window size, and centers if the window wanted to fill
* horizontally.
- *
+ *
* @param attrs the window's layout params to adjust
*/
private void adjustWindowAttributesForCompatibleMode(WindowManager.LayoutParams attrs) {
@@ -2628,14 +2630,14 @@
boolean immediate) {
return scrollToRectOrFocus(rectangle, immediate);
}
-
+
static class InputMethodCallback extends IInputMethodCallback.Stub {
private WeakReference<ViewRoot> mViewRoot;
public InputMethodCallback(ViewRoot viewRoot) {
mViewRoot = new WeakReference<ViewRoot>(viewRoot);
}
-
+
public void finishedEvent(int seq, boolean handled) {
final ViewRoot viewRoot = mViewRoot.get();
if (viewRoot != null) {
@@ -2647,13 +2649,13 @@
// Stub -- not for use in the client.
}
}
-
+
static class EventCompletion extends Handler {
final IWindow mWindow;
final KeyEvent mKeyEvent;
final boolean mIsPointer;
final MotionEvent mMotionEvent;
-
+
EventCompletion(Looper looper, IWindow window, KeyEvent key,
boolean isPointer, MotionEvent motion) {
super(looper);
@@ -2663,7 +2665,7 @@
mMotionEvent = motion;
sendEmptyMessage(0);
}
-
+
@Override
public void handleMessage(Message msg) {
if (mKeyEvent != null) {
@@ -2705,7 +2707,7 @@
}
}
}
-
+
static class W extends IWindow.Stub {
private final WeakReference<ViewRoot> mViewRoot;
private final Looper mMainLooper;
@@ -2827,14 +2829,14 @@
* The maximum amount of acceleration we will apply.
*/
static final float MAX_ACCELERATION = 20;
-
+
/**
* The maximum amount of time (in milliseconds) between events in order
* for us to consider the user to be doing fast trackball movements,
* and thus apply an acceleration.
*/
static final long FAST_MOVE_TIME = 150;
-
+
/**
* Scaling factor to the time (in milliseconds) between events to how
* much to multiple/divide the current acceleration. When movement
@@ -2842,7 +2844,7 @@
* FAST_MOVE_TIME it divides it.
*/
static final float ACCEL_MOVE_SCALING_FACTOR = (1.0f/40);
-
+
float position;
float absPosition;
float acceleration = 1;
@@ -2894,7 +2896,7 @@
} else {
normTime = 0;
}
-
+
// The number of milliseconds between each movement that is
// considered "normal" and will not result in any acceleration
// or deceleration, scaled by the offset we have here.
@@ -3052,7 +3054,7 @@
sRunQueues.set(rq);
return rq;
}
-
+
/**
* @hide
*/
diff --git a/core/java/android/webkit/JWebCoreJavaBridge.java b/core/java/android/webkit/JWebCoreJavaBridge.java
index 2a84683..7739300 100644
--- a/core/java/android/webkit/JWebCoreJavaBridge.java
+++ b/core/java/android/webkit/JWebCoreJavaBridge.java
@@ -186,6 +186,21 @@
mHasInstantTimer = false;
}
+ private String[] getKeyStrengthList() {
+ // FIXME: fake the list for now
+ String[] list = new String[2];
+ list[0] = "1024";
+ list[1] = "512";
+ return list;
+ }
+
+ private String getSignedPublicKey(int index, String challenge, String url) {
+ // FIXME: do nothing for now
+ Log.w(LOGTAG, "getSignedPublicKey for " + index + " and challenge="
+ + challenge + " and url=" + url);
+ return "";
+ }
+
private native void nativeConstructor();
private native void nativeFinalize();
private native void sharedTimerFired();
diff --git a/core/java/com/android/internal/backup/LocalTransport.java b/core/java/com/android/internal/backup/LocalTransport.java
index 62fba4a..f7b89f2 100644
--- a/core/java/com/android/internal/backup/LocalTransport.java
+++ b/core/java/com/android/internal/backup/LocalTransport.java
@@ -1,5 +1,7 @@
package com.android.internal.backup;
+import android.backup.BackupDataInput;
+import android.backup.BackupDataOutput;
import android.backup.RestoreSet;
import android.content.Context;
import android.content.pm.PackageInfo;
@@ -24,7 +26,7 @@
public class LocalTransport extends IBackupTransport.Stub {
private static final String TAG = "LocalTransport";
- private static final String DATA_FILE_NAME = "data";
+ private static final boolean DEBUG = true;
private Context mContext;
private PackageManager mPackageManager;
@@ -37,6 +39,7 @@
public LocalTransport(Context context) {
+ if (DEBUG) Log.v(TAG, "Transport constructed");
mContext = context;
mPackageManager = context.getPackageManager();
}
@@ -47,29 +50,63 @@
}
public int startSession() throws RemoteException {
+ if (DEBUG) Log.v(TAG, "session started");
+ mDataDir.mkdirs();
return 0;
}
public int endSession() throws RemoteException {
+ if (DEBUG) Log.v(TAG, "session ended");
return 0;
}
public int performBackup(PackageInfo packageInfo, ParcelFileDescriptor data)
throws RemoteException {
+ if (DEBUG) Log.v(TAG, "performBackup() pkg=" + packageInfo.packageName);
+ int err = 0;
+
File packageDir = new File(mDataDir, packageInfo.packageName);
- File imageFileName = new File(packageDir, DATA_FILE_NAME);
+ packageDir.mkdirs();
- //!!! TODO: process the (partial) update into the persistent restore set:
-
- // Parse out the existing image file into the key/value map
+ // Each 'record' in the restore set is kept in its own file, named by
+ // the record key. Wind through the data file, extracting individual
+ // record operations and building a set of all the updates to apply
+ // in this update.
+ BackupDataInput changeSet = new BackupDataInput(data.getFileDescriptor());
+ try {
+ int bufSize = 512;
+ byte[] buf = new byte[bufSize];
+ while (changeSet.readNextHeader()) {
+ String key = changeSet.getKey();
+ int dataSize = changeSet.getDataSize();
+ if (DEBUG) Log.v(TAG, "Got change set key=" + key + " size=" + dataSize);
+ if (dataSize > bufSize) {
+ bufSize = dataSize;
+ buf = new byte[bufSize];
+ }
+ changeSet.readEntityData(buf, dataSize);
+ if (DEBUG) Log.v(TAG, " + data size " + dataSize);
- // Parse out the backup data into the key/value updates
+ File entityFile = new File(packageDir, key);
+ FileOutputStream entity = new FileOutputStream(entityFile);
+ try {
+ entity.write(buf, 0, dataSize);
+ } catch (IOException e) {
+ Log.e(TAG, "Unable to update key file "
+ + entityFile.getAbsolutePath());
+ err = -1;
+ } finally {
+ entity.close();
+ }
+ }
+ } catch (IOException e) {
+ // oops, something went wrong. abort the operation and return error.
+ Log.v(TAG, "Exception reading backup input:");
+ e.printStackTrace();
+ err = -1;
+ }
- // Apply the backup key/value updates to the image
-
- // Write out the image in the canonical format
-
- return -1;
+ return err;
}
// Restore handling
@@ -83,6 +120,7 @@
}
public PackageInfo[] getAppSet(int token) throws android.os.RemoteException {
+ if (DEBUG) Log.v(TAG, "getting app set " + token);
// the available packages are the extant subdirs of mDatadir
File[] packageDirs = mDataDir.listFiles(mDirFileFilter);
ArrayList<PackageInfo> packages = new ArrayList<PackageInfo>();
@@ -99,42 +137,46 @@
}
}
- Log.v(TAG, "Built app set of " + packages.size() + " entries:");
- for (PackageInfo p : packages) {
- Log.v(TAG, " + " + p.packageName);
+ if (DEBUG) {
+ Log.v(TAG, "Built app set of " + packages.size() + " entries:");
+ for (PackageInfo p : packages) {
+ Log.v(TAG, " + " + p.packageName);
+ }
}
PackageInfo[] result = new PackageInfo[packages.size()];
return packages.toArray(result);
}
- public int getRestoreData(int token, PackageInfo packageInfo, ParcelFileDescriptor output)
+ public int getRestoreData(int token, PackageInfo packageInfo, ParcelFileDescriptor outFd)
throws android.os.RemoteException {
+ if (DEBUG) Log.v(TAG, "getting restore data " + token + " : " + packageInfo.packageName);
// we only support one hardcoded restore set
if (token != 0) return -1;
// the data for a given package is at a known location
File packageDir = new File(mDataDir, packageInfo.packageName);
- File imageFile = new File(packageDir, DATA_FILE_NAME);
- // restore is relatively easy: we already maintain the full data set in
- // the canonical form understandable to the BackupAgent
- return copyFileToFD(imageFile, output);
- }
-
- private int copyFileToFD(File source, ParcelFileDescriptor dest) {
- try {
- FileInputStream in = new FileInputStream(source);
- FileOutputStream out = new FileOutputStream(dest.getFileDescriptor());
- byte[] buffer = new byte[4096];
- int bytesRead;
- while ((bytesRead = in.read(buffer)) >= 0) {
- out.write(buffer, 0, bytesRead);
+ // The restore set is the concatenation of the individual record blobs,
+ // each of which is a file in the package's directory
+ File[] blobs = packageDir.listFiles();
+ int err = 0;
+ if (blobs != null && blobs.length > 0) {
+ BackupDataOutput out = new BackupDataOutput(mContext, outFd.getFileDescriptor());
+ try {
+ for (File f : blobs) {
+ FileInputStream in = new FileInputStream(f);
+ int size = (int) f.length();
+ byte[] buf = new byte[size];
+ in.read(buf);
+ out.writeEntityHeader(f.getName(), size);
+ out.writeEntityData(buf, size);
+ }
+ } catch (Exception e) {
+ Log.e(TAG, "Unable to read backup records");
+ err = -1;
}
- } catch (IOException e) {
- // something went wrong; claim failure
- return -1;
}
- return 0;
+ return err;
}
}
diff --git a/core/java/com/google/android/util/GoogleWebContentHelper.java b/core/java/com/google/android/util/GoogleWebContentHelper.java
index 3cdf855..8291e29 100644
--- a/core/java/com/google/android/util/GoogleWebContentHelper.java
+++ b/core/java/com/google/android/util/GoogleWebContentHelper.java
@@ -131,6 +131,10 @@
return this;
}
+ /**
+ * Loads data into the webview and also provides a failback url
+ * @return This {@link GoogleWebContentHelper} so methods can be chained.
+ */
public GoogleWebContentHelper loadDataWithFailUrl(String base, String data,
String mimeType, String encoding, String failUrl) {
ensureViews();
diff --git a/core/jni/Android.mk b/core/jni/Android.mk
index ed8deb1..fee8396 100644
--- a/core/jni/Android.mk
+++ b/core/jni/Android.mk
@@ -117,6 +117,7 @@
android_location_GpsLocationProvider.cpp \
com_android_internal_os_ZygoteInit.cpp \
com_android_internal_graphics_NativeUtils.cpp \
+ android_backup_BackupDataInput.cpp \
android_backup_BackupDataOutput.cpp \
android_backup_FileBackupHelper.cpp
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 302f39e..6d829fc 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -155,6 +155,7 @@
extern int register_com_android_internal_os_ZygoteInit(JNIEnv* env);
extern int register_android_util_Base64(JNIEnv* env);
extern int register_android_location_GpsLocationProvider(JNIEnv* env);
+extern int register_android_backup_BackupDataInput(JNIEnv *env);
extern int register_android_backup_BackupDataOutput(JNIEnv *env);
extern int register_android_backup_FileBackupHelper(JNIEnv *env);
@@ -1127,6 +1128,7 @@
REG_JNI(register_android_ddm_DdmHandleNativeHeap),
REG_JNI(register_android_util_Base64),
REG_JNI(register_android_location_GpsLocationProvider),
+ REG_JNI(register_android_backup_BackupDataInput),
REG_JNI(register_android_backup_BackupDataOutput),
REG_JNI(register_android_backup_FileBackupHelper),
};
diff --git a/core/jni/android_backup_BackupDataInput.cpp b/core/jni/android_backup_BackupDataInput.cpp
new file mode 100644
index 0000000..5b2fb73
--- /dev/null
+++ b/core/jni/android_backup_BackupDataInput.cpp
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "FileBackupHelper_native"
+#include <utils/Log.h>
+
+#include "JNIHelp.h"
+#include <android_runtime/AndroidRuntime.h>
+
+#include <utils/BackupHelpers.h>
+
+namespace android
+{
+
+// java.io.FileDescriptor
+static jfieldID s_descriptorField = 0;
+
+// android.backup.BackupDataInput$EntityHeader
+static jfieldID s_keyField = 0;
+static jfieldID s_dataSizeField = 0;
+
+static int
+ctor_native(JNIEnv* env, jobject clazz, jobject fileDescriptor)
+{
+ int err;
+
+ int fd = env->GetIntField(fileDescriptor, s_descriptorField);
+ if (fd == -1) {
+ return NULL;
+ }
+
+ return (int)new BackupDataReader(fd);
+}
+
+static void
+dtor_native(JNIEnv* env, jobject clazz, int r)
+{
+ delete (BackupDataReader*)r;
+}
+
+static jint
+readNextHeader_native(JNIEnv* env, jobject clazz, int r, jobject entity)
+{
+ int err;
+ BackupDataReader* reader = (BackupDataReader*)r;
+
+ err = reader->Status();
+ if (err != 0) {
+ return err < 0 ? err : -1;
+ }
+
+ int type = 0;
+
+ err = reader->ReadNextHeader(&type);
+ if (err == EIO) {
+ // Clean EOF with no footer block; just claim we're done
+ return 1;
+ }
+
+ if (err != 0) {
+ return err < 0 ? err : -1;
+ }
+
+ switch (type) {
+ case BACKUP_HEADER_APP_V1:
+ {
+ String8 packageName;
+ int cookie;
+ err = reader->ReadAppHeader(&packageName, &cookie);
+ if (err != 0) {
+ LOGD("ReadAppHeader() returned %d; aborting", err);
+ return err < 0 ? err : -1;
+ }
+ break;
+ }
+ case BACKUP_HEADER_ENTITY_V1:
+ {
+ String8 key;
+ size_t dataSize;
+ err = reader->ReadEntityHeader(&key, &dataSize);
+ if (err != 0) {
+ LOGD("ReadEntityHeader(); aborting", err);
+ return err < 0 ? err : -1;
+ }
+ // TODO: Set the fields in the entity object
+ jstring keyStr = env->NewStringUTF(key.string());
+ env->SetObjectField(entity, s_keyField, keyStr);
+ env->SetIntField(entity, s_dataSizeField, dataSize);
+ return 0;
+ }
+ case BACKUP_FOOTER_APP_V1:
+ {
+ break;
+ }
+ default:
+ LOGD("Unknown header type: 0x%08x\n", type);
+ return -1;
+ }
+
+ // done
+ return 1;
+}
+
+static jint
+readEntityData_native(JNIEnv* env, jobject clazz, int r, jbyteArray data, int size)
+{
+ int err;
+ BackupDataReader* reader = (BackupDataReader*)r;
+
+ if (env->GetArrayLength(data) < size) {
+ // size mismatch
+ return -1;
+ }
+
+ jbyte* dataBytes = env->GetByteArrayElements(data, NULL);
+ if (dataBytes == NULL) {
+ return -2;
+ }
+
+ err = reader->ReadEntityData(dataBytes, size);
+
+ env->ReleaseByteArrayElements(data, dataBytes, 0);
+
+ return err;
+}
+
+static const JNINativeMethod g_methods[] = {
+ { "ctor", "(Ljava/io/FileDescriptor;)I", (void*)ctor_native },
+ { "dtor", "(I)V", (void*)dtor_native },
+ { "readNextHeader_native", "(ILandroid/backup/BackupDataInput$EntityHeader;)I",
+ (void*)readNextHeader_native },
+ { "readEntityData_native", "(I[BI)I", (void*)readEntityData_native },
+};
+
+int register_android_backup_BackupDataInput(JNIEnv* env)
+{
+ //LOGD("register_android_backup_BackupDataInput");
+
+ jclass clazz;
+
+ clazz = env->FindClass("java/io/FileDescriptor");
+ LOG_FATAL_IF(clazz == NULL, "Unable to find class java.io.FileDescriptor");
+ s_descriptorField = env->GetFieldID(clazz, "descriptor", "I");
+ LOG_FATAL_IF(s_descriptorField == NULL,
+ "Unable to find descriptor field in java.io.FileDescriptor");
+
+ clazz = env->FindClass("android/backup/BackupDataInput$EntityHeader");
+ LOG_FATAL_IF(clazz == NULL, "Unable to find class android.backup.BackupDataInput.EntityHeader");
+ s_keyField = env->GetFieldID(clazz, "key", "Ljava/lang/String;");
+ LOG_FATAL_IF(s_keyField == NULL,
+ "Unable to find key field in android.backup.BackupDataInput.EntityHeader");
+ s_dataSizeField = env->GetFieldID(clazz, "dataSize", "I");
+ LOG_FATAL_IF(s_dataSizeField == NULL,
+ "Unable to find dataSize field in android.backup.BackupDataInput.EntityHeader");
+
+ return AndroidRuntime::registerNativeMethods(env, "android/backup/BackupDataInput",
+ g_methods, NELEM(g_methods));
+}
+
+}
diff --git a/core/jni/android_backup_BackupDataOutput.cpp b/core/jni/android_backup_BackupDataOutput.cpp
index aab1233..6362439 100644
--- a/core/jni/android_backup_BackupDataOutput.cpp
+++ b/core/jni/android_backup_BackupDataOutput.cpp
@@ -28,7 +28,7 @@
static jfieldID s_descriptorField = 0;
static int
-ctor_native(JNIEnv* env, jobject This, jobject fileDescriptor)
+ctor_native(JNIEnv* env, jobject clazz, jobject fileDescriptor)
{
int err;
@@ -41,19 +41,62 @@
}
static void
-dtor_native(JNIEnv* env, jobject This, int fd)
+dtor_native(JNIEnv* env, jobject clazz, int w)
{
- delete (BackupDataWriter*)fd;
+ delete (BackupDataWriter*)w;
+}
+
+static jint
+writeEntityHeader_native(JNIEnv* env, jobject clazz, int w, jstring key, int dataSize)
+{
+ int err;
+ BackupDataWriter* writer = (BackupDataWriter*)w;
+
+ const char* keyUTF = env->GetStringUTFChars(key, NULL);
+ if (keyUTF == NULL) {
+ return -1;
+ }
+
+ err = writer->WriteEntityHeader(String8(keyUTF), dataSize);
+
+ env->ReleaseStringUTFChars(key, keyUTF);
+
+ return err;
+}
+
+static jint
+writeEntityData_native(JNIEnv* env, jobject clazz, int w, jbyteArray data, int size)
+{
+ int err;
+ BackupDataWriter* writer = (BackupDataWriter*)w;
+
+ if (env->GetArrayLength(data) > size) {
+ // size mismatch
+ return -1;
+ }
+
+ jbyte* dataBytes = env->GetByteArrayElements(data, NULL);
+ if (dataBytes == NULL) {
+ return -1;
+ }
+
+ err = writer->WriteEntityData(dataBytes, size);
+
+ env->ReleaseByteArrayElements(data, dataBytes, JNI_ABORT);
+
+ return err;
}
static const JNINativeMethod g_methods[] = {
{ "ctor", "(Ljava/io/FileDescriptor;)I", (void*)ctor_native },
{ "dtor", "(I)V", (void*)dtor_native },
+ { "writeEntityHeader_native", "(ILjava/lang/String;I)I", (void*)writeEntityHeader_native },
+ { "writeEntityData_native", "(I[BI)I", (void*)writeEntityData_native },
};
int register_android_backup_BackupDataOutput(JNIEnv* env)
{
- LOGD("register_android_backup_BackupDataOutput");
+ //LOGD("register_android_backup_BackupDataOutput");
jclass clazz;
diff --git a/core/jni/android_backup_FileBackupHelper.cpp b/core/jni/android_backup_FileBackupHelper.cpp
index a46f37b..418db8a 100644
--- a/core/jni/android_backup_FileBackupHelper.cpp
+++ b/core/jni/android_backup_FileBackupHelper.cpp
@@ -25,49 +25,55 @@
namespace android
{
+// java.io.FileDescriptor
static jfieldID s_descriptorField = 0;
static int
-performBackup_native(JNIEnv* env, jobject clazz, jstring basePath, jobject oldState, int data,
- jobject newState, jobjectArray files)
+performBackup_native(JNIEnv* env, jobject clazz, jobject oldState, int data,
+ jobject newState, jobjectArray files, jobjectArray keys)
{
int err;
// all parameters have already been checked against null
- LOGD("oldState=%p newState=%p data=%p\n", oldState, newState, data);
int oldStateFD = oldState != NULL ? env->GetIntField(oldState, s_descriptorField) : -1;
int newStateFD = env->GetIntField(newState, s_descriptorField);
BackupDataWriter* dataStream = (BackupDataWriter*)data;
- char const* basePathUTF = env->GetStringUTFChars(basePath, NULL);
- LOGD("basePathUTF=\"%s\"\n", basePathUTF);
const int fileCount = env->GetArrayLength(files);
char const** filesUTF = (char const**)malloc(sizeof(char*)*fileCount);
for (int i=0; i<fileCount; i++) {
filesUTF[i] = env->GetStringUTFChars((jstring)env->GetObjectArrayElement(files, i), NULL);
}
- err = back_up_files(oldStateFD, dataStream, newStateFD, basePathUTF, filesUTF, fileCount);
+ const int keyCount = env->GetArrayLength(keys);
+ char const** keysUTF = (char const**)malloc(sizeof(char*)*keyCount);
+ for (int i=0; i<keyCount; i++) {
+ keysUTF[i] = env->GetStringUTFChars((jstring)env->GetObjectArrayElement(keys, i), NULL);
+ }
+
+ err = back_up_files(oldStateFD, dataStream, newStateFD, filesUTF, keysUTF, fileCount);
for (int i=0; i<fileCount; i++) {
env->ReleaseStringUTFChars((jstring)env->GetObjectArrayElement(files, i), filesUTF[i]);
}
free(filesUTF);
- env->ReleaseStringUTFChars(basePath, basePathUTF);
+
+ for (int i=0; i<keyCount; i++) {
+ env->ReleaseStringUTFChars((jstring)env->GetObjectArrayElement(keys, i), keysUTF[i]);
+ }
+ free(keysUTF);
return err;
}
static const JNINativeMethod g_methods[] = {
{ "performBackup_native",
- "(Ljava/lang/String;Ljava/io/FileDescriptor;ILjava/io/FileDescriptor;[Ljava/lang/String;)I",
- (void*)performBackup_native },
+ "(Ljava/io/FileDescriptor;ILjava/io/FileDescriptor;[Ljava/lang/String;[Ljava/lang/String;)I",
+ (void*)performBackup_native },
};
int register_android_backup_FileBackupHelper(JNIEnv* env)
{
- LOGD("register_android_backup_FileBackupHelper");
-
jclass clazz;
clazz = env->FindClass("java/io/FileDescriptor");
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 20cb34a..3df5cdb 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -738,13 +738,6 @@
android:description="@string/permdesc_statusBar"
android:protectionLevel="signatureOrSystem" />
- <!-- Allows an application to force any currently running process to be
- in the foreground. -->
- <permission android:name="android.permission.SET_PROCESS_FOREGROUND"
- android:label="@string/permlab_setProcessForeground"
- android:description="@string/permdesc_setProcessForeground"
- android:protectionLevel="signature" />
-
<!-- Allows an application to force a BACK operation on whatever is the
top activity. -->
<permission android:name="android.permission.FORCE_BACK"
@@ -752,14 +745,6 @@
android:description="@string/permdesc_forceBack"
android:protectionLevel="signature" />
- <!-- Allows an application to publish system-level services. Such services
- can only be published from processes that never go away, so this is
- not something that any normal application can do. -->
- <permission android:name="android.permission.ADD_SYSTEM_SERVICE"
- android:label="@string/permlab_addSystemService"
- android:description="@string/permdesc_addSystemService"
- android:protectionLevel="signature" />
-
<permission android:name="android.permission.FOTA_UPDATE"
android:label="@string/permlab_fotaUpdate"
android:description="@string/permdesc_fotaUpdate"
diff --git a/core/res/res/values-ar-rEG/donottranslate-cldr.xml b/core/res/res/values-ar-rEG/donottranslate-cldr.xml
index 02c098a..4826a41 100644
--- a/core/res/res/values-ar-rEG/donottranslate-cldr.xml
+++ b/core/res/res/values-ar-rEG/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%-e/%-m/%Y</string>
<string name="numeric_date_format">d/M/yyyy</string>
+ <string name="numeric_date_template">"%s/%s/%s"</string>
<string name="month_day_year">%-e %B، %Y</string>
<string name="time_of_day">%-l:%M:%S %p</string>
<string name="date_and_time">%-l:%M:%S %p %d/%m/%Y</string>
diff --git a/core/res/res/values-bg-rBG/donottranslate-cldr.xml b/core/res/res/values-bg-rBG/donottranslate-cldr.xml
index 2ba7ba2..010b974 100644
--- a/core/res/res/values-bg-rBG/donottranslate-cldr.xml
+++ b/core/res/res/values-bg-rBG/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%d.%m.%Y</string>
<string name="numeric_date_format">dd.MM.yyyy</string>
+ <string name="numeric_date_template">"%s.%s.%s"</string>
<string name="month_day_year">%d %B %Y</string>
<string name="time_of_day">%H:%M:%S</string>
<string name="date_and_time">%H:%M:%S %d.%m.%Y</string>
diff --git a/core/res/res/values-ca-rES/donottranslate-cldr.xml b/core/res/res/values-ca-rES/donottranslate-cldr.xml
index 23c1508..4eabba7 100644
--- a/core/res/res/values-ca-rES/donottranslate-cldr.xml
+++ b/core/res/res/values-ca-rES/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%d/%m/%Y</string>
<string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="numeric_date_template">"%s/%s/%s"</string>
<string name="month_day_year">%-e de %B de %Y</string>
<string name="time_of_day">%-k:%M:%S</string>
<string name="date_and_time">%-k:%M:%S %d/%m/%Y</string>
diff --git a/core/res/res/values-cs-rCZ/donottranslate-cldr.xml b/core/res/res/values-cs-rCZ/donottranslate-cldr.xml
index 38e6a14..0670080 100644
--- a/core/res/res/values-cs-rCZ/donottranslate-cldr.xml
+++ b/core/res/res/values-cs-rCZ/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%-e.%-m.%Y</string>
<string name="numeric_date_format">d.M.yyyy</string>
+ <string name="numeric_date_template">"%s.%s.%s"</string>
<string name="month_day_year">%-e. %B %Y</string>
<string name="time_of_day">%-k:%M:%S</string>
<string name="date_and_time">%-k:%M:%S %-e.%-m.%Y</string>
diff --git a/core/res/res/values-cs/donottranslate-cldr.xml b/core/res/res/values-cs/donottranslate-cldr.xml
index 38e6a14..0670080 100644
--- a/core/res/res/values-cs/donottranslate-cldr.xml
+++ b/core/res/res/values-cs/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%-e.%-m.%Y</string>
<string name="numeric_date_format">d.M.yyyy</string>
+ <string name="numeric_date_template">"%s.%s.%s"</string>
<string name="month_day_year">%-e. %B %Y</string>
<string name="time_of_day">%-k:%M:%S</string>
<string name="date_and_time">%-k:%M:%S %-e.%-m.%Y</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 9cf12a5..ff8012f 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -161,14 +161,10 @@
<string name="permdesc_changeConfiguration">"Umožňuje aplikaci změnit aktuální konfiguraci, např. národní prostředí či obecnou velikost písma."</string>
<string name="permlab_restartPackages">"restartování ostatních aplikací"</string>
<string name="permdesc_restartPackages">"Umožňuje aplikaci vynutit restartování jiných aplikací."</string>
- <string name="permlab_setProcessForeground">"zamezení zastavení aplikace"</string>
- <string name="permdesc_setProcessForeground">"Umožňuje aplikaci spustit jakýkoli proces v popředí tak, že ho nelze ukončit. Běžné aplikace by toto nastavení nikdy neměly používat."</string>
<string name="permlab_forceBack">"vynucení zavření aplikace"</string>
<string name="permdesc_forceBack">"Umožňuje aplikaci vynutit zavření a přesunutí libovolné činnosti v popředí na pozadí. Běžné aplikace by toto nastavení neměly nikdy využívat."</string>
<string name="permlab_dump">"načtení interního stavu systému"</string>
<string name="permdesc_dump">"Umožňuje aplikaci načíst interní stav systému. Škodlivé aplikace mohou načíst řádu soukromých a zabezpečených informací, které by nikdy neměly potřebovat."</string>
- <string name="permlab_addSystemService">"zveřejnění nízkoúrovňových služeb"</string>
- <string name="permdesc_addSystemService">"Umožňuje aplikaci zveřejnit své vlastní nízkoúrovňové systémové služby. Škodlivé aplikace mohou převzít kontrolu nad systémem a získat či poškodit jakákoli data v něm obsažená."</string>
<string name="permlab_runSetActivityWatcher">"sledování a řízení spouštění všech aplikací"</string>
<string name="permdesc_runSetActivityWatcher">"Umožňuje aplikaci sledovat a řídit spouštění činností systémem. Škodlivé aplikace mohou zcela ovládnout systém. Toto oprávnění je zapotřebí pouze pro účely vývoje, nikdy pro běžné použití telefonu."</string>
<string name="permlab_broadcastPackageRemoved">"odeslání vysílání o odstranění balíčku"</string>
diff --git a/core/res/res/values-da-rDK/donottranslate-cldr.xml b/core/res/res/values-da-rDK/donottranslate-cldr.xml
index 9e525a0..4a2a656 100644
--- a/core/res/res/values-da-rDK/donottranslate-cldr.xml
+++ b/core/res/res/values-da-rDK/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">HH.mm</string>
<string name="numeric_date">%d/%m/%Y</string>
<string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="numeric_date_template">"%s/%s/%s"</string>
<string name="month_day_year">%-e. %b %Y</string>
<string name="time_of_day">%H.%M.%S</string>
<string name="date_and_time">%H.%M.%S %d/%m/%Y</string>
diff --git a/core/res/res/values-de-rAT/donottranslate-cldr.xml b/core/res/res/values-de-rAT/donottranslate-cldr.xml
index d90da70..e6112ba 100644
--- a/core/res/res/values-de-rAT/donottranslate-cldr.xml
+++ b/core/res/res/values-de-rAT/donottranslate-cldr.xml
@@ -65,6 +65,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%d.%m.%Y</string>
<string name="numeric_date_format">dd.MM.yyyy</string>
+ <string name="numeric_date_template">"%s.%s.%s"</string>
<string name="month_day_year">%d. %B %Y</string>
<string name="time_of_day">%H:%M:%S</string>
<string name="date_and_time">%H:%M:%S %d.%m.%Y</string>
diff --git a/core/res/res/values-de-rCH/donottranslate-cldr.xml b/core/res/res/values-de-rCH/donottranslate-cldr.xml
index 9e05789..b611c08 100644
--- a/core/res/res/values-de-rCH/donottranslate-cldr.xml
+++ b/core/res/res/values-de-rCH/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%d.%m.%Y</string>
<string name="numeric_date_format">dd.MM.yyyy</string>
+ <string name="numeric_date_template">"%s.%s.%s"</string>
<string name="month_day_year">%-e. %B %Y</string>
<string name="time_of_day">%H:%M:%S</string>
<string name="date_and_time">%H:%M:%S %d.%m.%Y</string>
diff --git a/core/res/res/values-de-rDE/donottranslate-cldr.xml b/core/res/res/values-de-rDE/donottranslate-cldr.xml
index 9e05789..b611c08 100644
--- a/core/res/res/values-de-rDE/donottranslate-cldr.xml
+++ b/core/res/res/values-de-rDE/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%d.%m.%Y</string>
<string name="numeric_date_format">dd.MM.yyyy</string>
+ <string name="numeric_date_template">"%s.%s.%s"</string>
<string name="month_day_year">%-e. %B %Y</string>
<string name="time_of_day">%H:%M:%S</string>
<string name="date_and_time">%H:%M:%S %d.%m.%Y</string>
diff --git a/core/res/res/values-de-rLI/donottranslate-cldr.xml b/core/res/res/values-de-rLI/donottranslate-cldr.xml
index 9e05789..b611c08 100644
--- a/core/res/res/values-de-rLI/donottranslate-cldr.xml
+++ b/core/res/res/values-de-rLI/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%d.%m.%Y</string>
<string name="numeric_date_format">dd.MM.yyyy</string>
+ <string name="numeric_date_template">"%s.%s.%s"</string>
<string name="month_day_year">%-e. %B %Y</string>
<string name="time_of_day">%H:%M:%S</string>
<string name="date_and_time">%H:%M:%S %d.%m.%Y</string>
diff --git a/core/res/res/values-de/donottranslate-cldr.xml b/core/res/res/values-de/donottranslate-cldr.xml
index 9e05789..b611c08 100644
--- a/core/res/res/values-de/donottranslate-cldr.xml
+++ b/core/res/res/values-de/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%d.%m.%Y</string>
<string name="numeric_date_format">dd.MM.yyyy</string>
+ <string name="numeric_date_template">"%s.%s.%s"</string>
<string name="month_day_year">%-e. %B %Y</string>
<string name="time_of_day">%H:%M:%S</string>
<string name="date_and_time">%H:%M:%S %d.%m.%Y</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 4a12ef9..8e52bea 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -161,14 +161,10 @@
<string name="permdesc_changeConfiguration">"Ermöglicht einer Anwendung, die aktuelle Konfiguration zu ändern, etwa das Gebietsschema oder die Schriftgröße."</string>
<string name="permlab_restartPackages">"Andere Anwendungen neu starten"</string>
<string name="permdesc_restartPackages">"Ermöglicht einer Anwendung, den Neustart anderer Anwendungen zu erzwingen."</string>
- <string name="permlab_setProcessForeground">"Beenden nicht zulassen"</string>
- <string name="permdesc_setProcessForeground">"Ermöglicht einer Anwendung, beliebige Prozesse im Vordergrund auszuführen, damit diese nicht beendet werden können. Sollte nicht für normale Anwendungen benötigt werden."</string>
<string name="permlab_forceBack">"Schließen von Anwendung erzwingen"</string>
<string name="permdesc_forceBack">"Ermöglicht einer Anwendung, alle Aktivitäten, die im Vordergrund ablaufen, zu beenden und in den Hintergrund zu schieben. Sollte nicht für normale Anwendungen benötigt werden."</string>
<string name="permlab_dump">"Systeminternen Status abrufen"</string>
<string name="permdesc_dump">"Ermöglicht einer Anwendung, den internen Status des Systems abzurufen. Schädliche Anwendungen rufen hierbei möglicherweise eine Vielzahl an privaten und geschützten Daten ab, die Sie in der Regel nicht benötigen würden."</string>
- <string name="permlab_addSystemService">"systemnahe Dienste veröffentlichen"</string>
- <string name="permdesc_addSystemService">"Ermöglicht der Anwendung, ihre eigenen systemnahen Dienste anzubieten. Schädliche Anwendungen könnten in das System eindringen und darin befindliche Daten stehlen oder manipulieren."</string>
<string name="permlab_runSetActivityWatcher">"Start von Anwendungen überwachen und steuern"</string>
<string name="permdesc_runSetActivityWatcher">"Ermöglicht der Anwendung, den Start von Systemaktivitäten zu überwachen und zu steuern. Schädliche Anwendungen können so das gesamte System beeinträchtigen. Diese Berechtigung wird nur zu Entwicklungszwecken und nie für die normale Telefonnutzung benötigt."</string>
<string name="permlab_broadcastPackageRemoved">"Broadcast ohne Paket senden"</string>
diff --git a/core/res/res/values-el-rGR/donottranslate-cldr.xml b/core/res/res/values-el-rGR/donottranslate-cldr.xml
index 0880190..f76281a 100644
--- a/core/res/res/values-el-rGR/donottranslate-cldr.xml
+++ b/core/res/res/values-el-rGR/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%d/%m/%Y</string>
<string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="numeric_date_template">"%s/%s/%s"</string>
<string name="month_day_year">%d %B %Y</string>
<string name="time_of_day">%-l:%M:%S %p</string>
<string name="date_and_time">%-l:%M:%S %p %d %b %Y</string>
diff --git a/core/res/res/values-en-rAU/donottranslate-cldr.xml b/core/res/res/values-en-rAU/donottranslate-cldr.xml
index 903a36c..223a22b 100644
--- a/core/res/res/values-en-rAU/donottranslate-cldr.xml
+++ b/core/res/res/values-en-rAU/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">HH:mm</string>
<string name="numeric_date">%-e/%m/%Y</string>
<string name="numeric_date_format">d/MM/yyyy</string>
+ <string name="numeric_date_template">"%s/%s/%s"</string>
<string name="month_day_year">%-e %B %Y</string>
<string name="time_of_day">%-l:%M:%S %p</string>
<string name="date_and_time">%d/%m/%Y, %-l:%M:%S %p</string>
diff --git a/core/res/res/values-en-rCA/donottranslate-cldr.xml b/core/res/res/values-en-rCA/donottranslate-cldr.xml
index 8f8097c..32fa2b0 100644
--- a/core/res/res/values-en-rCA/donottranslate-cldr.xml
+++ b/core/res/res/values-en-rCA/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">HH:mm</string>
<string name="numeric_date">%Y-%m-%d</string>
<string name="numeric_date_format">yyyy-MM-dd</string>
+ <string name="numeric_date_template">"%s-%s-%s"</string>
<string name="month_day_year">%B %-e, %Y</string>
<string name="time_of_day">%-l:%M:%S %p</string>
<string name="date_and_time">%Y-%m-%d, %-l:%M:%S %p</string>
diff --git a/core/res/res/values-en-rGB/donottranslate-cldr.xml b/core/res/res/values-en-rGB/donottranslate-cldr.xml
index b2182f5..b90112f 100644
--- a/core/res/res/values-en-rGB/donottranslate-cldr.xml
+++ b/core/res/res/values-en-rGB/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">HH:mm</string>
<string name="numeric_date">%d/%m/%Y</string>
<string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="numeric_date_template">"%s/%s/%s"</string>
<string name="month_day_year">%-e %B %Y</string>
<string name="time_of_day">%H:%M:%S</string>
<string name="date_and_time">%-e %b %Y, %H:%M:%S</string>
diff --git a/core/res/res/values-en-rIE/donottranslate-cldr.xml b/core/res/res/values-en-rIE/donottranslate-cldr.xml
index fd0001a..4143da5 100644
--- a/core/res/res/values-en-rIE/donottranslate-cldr.xml
+++ b/core/res/res/values-en-rIE/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">HH:mm</string>
<string name="numeric_date">%d/%m/%Y</string>
<string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="numeric_date_template">"%s/%s/%s"</string>
<string name="month_day_year">%-e %B %Y</string>
<string name="time_of_day">%H:%M:%S</string>
<string name="date_and_time">%-e %b %Y, %H:%M:%S</string>
diff --git a/core/res/res/values-en-rIN/donottranslate-cldr.xml b/core/res/res/values-en-rIN/donottranslate-cldr.xml
index ba3f94e..6522d677 100644
--- a/core/res/res/values-en-rIN/donottranslate-cldr.xml
+++ b/core/res/res/values-en-rIN/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">HH:mm</string>
<string name="numeric_date">%d/%m/%Y</string>
<string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="numeric_date_template">"%s/%s/%s"</string>
<string name="month_day_year">%-e %B %Y</string>
<string name="time_of_day">%-l:%M:%S %p</string>
<string name="date_and_time">%d-%b-%Y, %-l:%M:%S %p</string>
diff --git a/core/res/res/values-en-rNZ/donottranslate-cldr.xml b/core/res/res/values-en-rNZ/donottranslate-cldr.xml
index ab71345..d29455a 100644
--- a/core/res/res/values-en-rNZ/donottranslate-cldr.xml
+++ b/core/res/res/values-en-rNZ/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">HH:mm</string>
<string name="numeric_date">%-e/%m/%Y</string>
<string name="numeric_date_format">d/MM/yyyy</string>
+ <string name="numeric_date_template">"%s/%s/%s"</string>
<string name="month_day_year">%-e %B %Y</string>
<string name="time_of_day">%-l:%M:%S %p</string>
<string name="date_and_time">%-e/%m/%Y, %-l:%M:%S %p</string>
diff --git a/core/res/res/values-en-rSG/donottranslate-cldr.xml b/core/res/res/values-en-rSG/donottranslate-cldr.xml
index 2e87dee..56c58e2 100644
--- a/core/res/res/values-en-rSG/donottranslate-cldr.xml
+++ b/core/res/res/values-en-rSG/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">HH:mm</string>
<string name="numeric_date">%-m/%-e/%Y</string>
<string name="numeric_date_format">M/d/yyyy</string>
+ <string name="numeric_date_template">"%s/%s/%s"</string>
<string name="month_day_year">%B %-e, %Y</string>
<string name="time_of_day">%-l:%M:%S %p</string>
<string name="date_and_time">%b %-e, %Y, %-l:%M:%S %p</string>
diff --git a/core/res/res/values-en-rUS/donottranslate-cldr.xml b/core/res/res/values-en-rUS/donottranslate-cldr.xml
index 2e87dee..56c58e2 100644
--- a/core/res/res/values-en-rUS/donottranslate-cldr.xml
+++ b/core/res/res/values-en-rUS/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">HH:mm</string>
<string name="numeric_date">%-m/%-e/%Y</string>
<string name="numeric_date_format">M/d/yyyy</string>
+ <string name="numeric_date_template">"%s/%s/%s"</string>
<string name="month_day_year">%B %-e, %Y</string>
<string name="time_of_day">%-l:%M:%S %p</string>
<string name="date_and_time">%b %-e, %Y, %-l:%M:%S %p</string>
diff --git a/core/res/res/values-en-rZA/donottranslate-cldr.xml b/core/res/res/values-en-rZA/donottranslate-cldr.xml
index 011e56e8..e1aac04 100644
--- a/core/res/res/values-en-rZA/donottranslate-cldr.xml
+++ b/core/res/res/values-en-rZA/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">HH:mm</string>
<string name="numeric_date">%Y/%m/%d</string>
<string name="numeric_date_format">yyyy/MM/dd</string>
+ <string name="numeric_date_template">"%s/%s/%s"</string>
<string name="month_day_year">%d %B %Y</string>
<string name="time_of_day">%-l:%M:%S %p</string>
<string name="date_and_time">%d %b %Y, %-l:%M:%S %p</string>
diff --git a/core/res/res/values-es-rES/donottranslate-cldr.xml b/core/res/res/values-es-rES/donottranslate-cldr.xml
index 590a21e..b516291 100644
--- a/core/res/res/values-es-rES/donottranslate-cldr.xml
+++ b/core/res/res/values-es-rES/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%d/%m/%Y</string>
<string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="numeric_date_template">"%s/%s/%s"</string>
<string name="month_day_year">%-e de %B de %Y</string>
<string name="time_of_day">%H:%M:%S</string>
<string name="date_and_time">%H:%M:%S %d/%m/%Y</string>
diff --git a/core/res/res/values-es-rUS/donottranslate-cldr.xml b/core/res/res/values-es-rUS/donottranslate-cldr.xml
index bf61cd0..587a615 100644
--- a/core/res/res/values-es-rUS/donottranslate-cldr.xml
+++ b/core/res/res/values-es-rUS/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%-m/%-e/%Y</string>
<string name="numeric_date_format">M/d/yyyy</string>
+ <string name="numeric_date_template">"%s/%s/%s"</string>
<string name="month_day_year">%-e de %B de %Y</string>
<string name="time_of_day">%-l:%M:%S %p</string>
<string name="date_and_time">%-l:%M:%S %p %b %-e, %Y</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 9134811..286e01b 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -178,14 +178,10 @@
<string name="permdesc_changeConfiguration">"Admite una aplicación para cambiar la configuración actual, como el tamaño de fuente local o general."</string>
<string name="permlab_restartPackages">"reiniciar otras aplicaciones"</string>
<string name="permdesc_restartPackages">"Admite una aplicación que reinicia otras aplicaciones por la fuerza."</string>
- <string name="permlab_setProcessForeground">"impedir la detención"</string>
- <string name="permdesc_setProcessForeground">"Admite una aplicación que ejecuta cualquier tipo de proceso en primer plano, de manera que no se pueda suprimir. Se debe evitar utilizarlo en aplicaciones normales."</string>
<string name="permlab_forceBack">"provocar que la aplicación se acerque"</string>
<string name="permdesc_forceBack">"Admite una aplicación que provoca que cualquier actividad del fondo se acerque y vuelva a alejarse. Se debe evitar utilizarlo en aplicaciones normales."</string>
<string name="permlab_dump">"recuperar el estado interno del sistema"</string>
<string name="permdesc_dump">"Admite que la aplicación recupere el estado interno del sistema. Las aplicaciones maliciosas pueden recuperar una gran variedad de información privada y segura que normalmente nunca necesitaría."</string>
- <string name="permlab_addSystemService">"publicar servicios de bajo nivel"</string>
- <string name="permdesc_addSystemService">"Admite que la aplicación publique sus propios servicios del sistema de bajo nivel. Las aplicaciones maliciosas pueden apropiarse del sistema y robar o corromper cualquiera de sus datos."</string>
<string name="permlab_runSetActivityWatcher">"verificar y controlar todos los lanzamientos de actividades"</string>
<string name="permdesc_runSetActivityWatcher">"Admite una aplicación que verifica y controla el lanzamiento de actividades por parte del sistema. Las aplicaciones maliciosas pueden comprometer totalmente al sistema. Este permiso sólo es necesario para el desarrollo, nunca para el uso normal del teléfono."</string>
<string name="permlab_broadcastPackageRemoved">"enviar emisión de paquete eliminado"</string>
diff --git a/core/res/res/values-es/donottranslate-cldr.xml b/core/res/res/values-es/donottranslate-cldr.xml
index 590a21e..b516291 100644
--- a/core/res/res/values-es/donottranslate-cldr.xml
+++ b/core/res/res/values-es/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%d/%m/%Y</string>
<string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="numeric_date_template">"%s/%s/%s"</string>
<string name="month_day_year">%-e de %B de %Y</string>
<string name="time_of_day">%H:%M:%S</string>
<string name="date_and_time">%H:%M:%S %d/%m/%Y</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index d1d835b..0a816f5 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -161,14 +161,10 @@
<string name="permdesc_changeConfiguration">"Permite que una aplicación cambie la configuración actual como, por ejemplo, la configuración local o el tamaño de fuente general."</string>
<string name="permlab_restartPackages">"reiniciar otras aplicaciones"</string>
<string name="permdesc_restartPackages">"Permite que una aplicación reinicie de forma forzosa otras aplicaciones."</string>
- <string name="permlab_setProcessForeground">"impedir su interrupción"</string>
- <string name="permdesc_setProcessForeground">"Permite que una aplicación ejecute cualquier proceso en segundo plano, de forma que no se pueda interrumpir. No debería ser necesario nunca para las aplicaciones normales."</string>
<string name="permlab_forceBack">"forzar el cierre de la aplicación"</string>
<string name="permdesc_forceBack">"Permite que una aplicación fuerce a cualquier actividad en segundo plano a cerrarse y volver a la pantalla anterior. No debería ser necesario nunca para las aplicaciones normales."</string>
<string name="permlab_dump">"recuperar estado interno del sistema"</string>
<string name="permdesc_dump">"Permite que la aplicación recupere el estado interno del sistema. Las aplicaciones malintencionadas pueden recuperar una amplia variedad de información protegida y privada que normalmente no deberían necesitar."</string>
- <string name="permlab_addSystemService">"publicar servicios de nivel inferior"</string>
- <string name="permdesc_addSystemService">"Permite que la aplicación publique sus propios servicios de sistema de nivel inferior. Las aplicaciones malintencionadas pueden hacerse con el control del sistema, y robar o dañar los datos contenidos en él."</string>
<string name="permlab_runSetActivityWatcher">"supervisar y controlar la ejecución de todas las aplicaciones"</string>
<string name="permdesc_runSetActivityWatcher">"Permite que una aplicación supervise y controle la ejecución de las actividades por parte del sistema. Las aplicaciones malintencionadas pueden vulnerar la seguridad del sistema. Este permiso sólo es necesario para tareas de desarrollo, nunca para el uso habitual del teléfono."</string>
<string name="permlab_broadcastPackageRemoved">"enviar emisión eliminada de paquete"</string>
diff --git a/core/res/res/values-fi-rFI/donottranslate-cldr.xml b/core/res/res/values-fi-rFI/donottranslate-cldr.xml
index fe140d3..40cda53 100644
--- a/core/res/res/values-fi-rFI/donottranslate-cldr.xml
+++ b/core/res/res/values-fi-rFI/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H.mm</string>
<string name="numeric_date">%-e.%-m.%Y</string>
<string name="numeric_date_format">d.M.yyyy</string>
+ <string name="numeric_date_template">"%s.%s.%s"</string>
<string name="month_day_year">%-e. %B %Y</string>
<string name="time_of_day">%-k.%M.%S</string>
<string name="date_and_time">%-k.%M.%S %-e.%-m.%Y</string>
diff --git a/core/res/res/values-fr-rBE/donottranslate-cldr.xml b/core/res/res/values-fr-rBE/donottranslate-cldr.xml
index b7ec69a..0795cc5 100644
--- a/core/res/res/values-fr-rBE/donottranslate-cldr.xml
+++ b/core/res/res/values-fr-rBE/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%-e/%m/%Y</string>
<string name="numeric_date_format">d/MM/yyyy</string>
+ <string name="numeric_date_template">"%s/%s/%s"</string>
<string name="month_day_year">%-e %B %Y</string>
<string name="time_of_day">%H:%M:%S</string>
<string name="date_and_time">%H:%M:%S %-e %b %Y</string>
diff --git a/core/res/res/values-fr-rCA/donottranslate-cldr.xml b/core/res/res/values-fr-rCA/donottranslate-cldr.xml
index d4033b5..7802ee0 100644
--- a/core/res/res/values-fr-rCA/donottranslate-cldr.xml
+++ b/core/res/res/values-fr-rCA/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%Y-%m-%d</string>
<string name="numeric_date_format">yyyy-MM-dd</string>
+ <string name="numeric_date_template">"%s-%s-%s"</string>
<string name="month_day_year">%-e %B %Y</string>
<string name="time_of_day">%H:%M:%S</string>
<string name="date_and_time">%H:%M:%S %Y-%m-%d</string>
diff --git a/core/res/res/values-fr-rCH/donottranslate-cldr.xml b/core/res/res/values-fr-rCH/donottranslate-cldr.xml
index a330cd2..bbda44a 100644
--- a/core/res/res/values-fr-rCH/donottranslate-cldr.xml
+++ b/core/res/res/values-fr-rCH/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%d.%m.%Y</string>
<string name="numeric_date_format">dd.MM.yyyy</string>
+ <string name="numeric_date_template">"%s.%s.%s"</string>
<string name="month_day_year">%-e %B %Y</string>
<string name="time_of_day">%H:%M:%S</string>
<string name="date_and_time">%H:%M:%S %-e %b %Y</string>
diff --git a/core/res/res/values-fr-rFR/donottranslate-cldr.xml b/core/res/res/values-fr-rFR/donottranslate-cldr.xml
index 0ee65c9..76d4141 100644
--- a/core/res/res/values-fr-rFR/donottranslate-cldr.xml
+++ b/core/res/res/values-fr-rFR/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%d/%m/%Y</string>
<string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="numeric_date_template">"%s/%s/%s"</string>
<string name="month_day_year">%-e %B %Y</string>
<string name="time_of_day">%H:%M:%S</string>
<string name="date_and_time">%H:%M:%S %-e %b %Y</string>
diff --git a/core/res/res/values-fr/donottranslate-cldr.xml b/core/res/res/values-fr/donottranslate-cldr.xml
index 0ee65c9..76d4141 100644
--- a/core/res/res/values-fr/donottranslate-cldr.xml
+++ b/core/res/res/values-fr/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%d/%m/%Y</string>
<string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="numeric_date_template">"%s/%s/%s"</string>
<string name="month_day_year">%-e %B %Y</string>
<string name="time_of_day">%H:%M:%S</string>
<string name="date_and_time">%H:%M:%S %-e %b %Y</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index e85b14c..f4b7599 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -21,6 +21,7 @@
<string name="gigabyteShort">"Go"</string>
<string name="terabyteShort">"To"</string>
<string name="petabyteShort">"Po"</string>
+ <string name="fileSizeSuffix"><xliff:g id="number" example="123">%1$s</xliff:g> <xliff:g id="unit" example="KB">%2$s</xliff:g></string>
<string name="untitled">"<sans titre>"</string>
<string name="ellipsis">"…"</string>
<string name="emptyPhoneNumber">"(Aucun numéro de téléphone)"</string>
@@ -161,14 +162,10 @@
<string name="permdesc_changeConfiguration">"Permet à une application de modifier la configuration actuelle (par ex. : la taille de la police générale ou des paramètres régionaux)."</string>
<string name="permlab_restartPackages">"Démarrage d\'autres applications"</string>
<string name="permdesc_restartPackages">"Permet à une application de forcer le lancement d\'autres applications."</string>
- <string name="permlab_setProcessForeground">"Non-possibilité d\'interruption"</string>
- <string name="permdesc_setProcessForeground">"Permet à une application d\'exécuter tout processus au premier plan afin qu\'il ne puisse pas être interrompu. Les applications normales ne devraient jamais nécessiter cette fonctionnalité."</string>
<string name="permlab_forceBack">"Fermeture forcée de l\'application"</string>
<string name="permdesc_forceBack">"Permet à une application de forcer une autre application exécutée au premier plan à se fermer et à passer en arrière-plan. Les applications normales ne devraient jamais avoir recours à cette fonctionnalité."</string>
<string name="permlab_dump">"Vérification de l\'état interne du système"</string>
<string name="permdesc_dump">"Permet à l\'application de récupérer l\'état interne du système. Des applications malveillantes peuvent obtenir de nombreuses informations personnelles et sécurisées auxquelles elles ne devraient pas avoir accès."</string>
- <string name="permlab_addSystemService">"Éditer des services à faible niveau"</string>
- <string name="permdesc_addSystemService">"Permet à l\'application de publier ses propres services de système de niveau inférieur. Des applications malveillantes peuvent prendre le contrôle du système et subtiliser ou endommager ses données."</string>
<string name="permlab_runSetActivityWatcher">"Contrôle du lancement des applications"</string>
<string name="permdesc_runSetActivityWatcher">"Permet à une application de suivre et de contrôler la façon dont le système lance des activités. Des applications malveillantes peuvent entièrement déstabiliser le système. Cette autorisation est uniquement nécessaire au développement et non pour l\'utilisation normale du téléphone."</string>
<string name="permlab_broadcastPackageRemoved">"Envoyer une diffusion sans paquet"</string>
diff --git a/core/res/res/values-he-rIL/donottranslate-cldr.xml b/core/res/res/values-he-rIL/donottranslate-cldr.xml
index 3b0f499..1c8a6f7 100644
--- a/core/res/res/values-he-rIL/donottranslate-cldr.xml
+++ b/core/res/res/values-he-rIL/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%d/%m/%Y</string>
<string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="numeric_date_template">"%s/%s/%s"</string>
<string name="month_day_year">%-e ב%B %Y</string>
<string name="time_of_day">%H:%M:%S</string>
<string name="date_and_time">%H:%M:%S %-e.%-m.%Y</string>
diff --git a/core/res/res/values-hi-rIN/donottranslate-cldr.xml b/core/res/res/values-hi-rIN/donottranslate-cldr.xml
index 476c4e1..ba4ded7 100644
--- a/core/res/res/values-hi-rIN/donottranslate-cldr.xml
+++ b/core/res/res/values-hi-rIN/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%-e-%-m-%Y</string>
<string name="numeric_date_format">d-M-yyyy</string>
+ <string name="numeric_date_template">"%s-%s-%s"</string>
<string name="month_day_year">%-e %B %Y</string>
<string name="time_of_day">%-l:%M:%S %p</string>
<string name="date_and_time">%-l:%M:%S %p %d-%m-%Y</string>
diff --git a/core/res/res/values-hu-rHU/donottranslate-cldr.xml b/core/res/res/values-hu-rHU/donottranslate-cldr.xml
index b2119c6..8dcb426 100644
--- a/core/res/res/values-hu-rHU/donottranslate-cldr.xml
+++ b/core/res/res/values-hu-rHU/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">HH:mm</string>
<string name="numeric_date">%Y.%m.%d.</string>
<string name="numeric_date_format">yyyy.MM.dd.</string>
+ <string name="numeric_date_template">"%s.%s.%s."</string>
<string name="month_day_year">%Y. %B %-e.</string>
<string name="time_of_day">%-k:%M:%S</string>
<string name="date_and_time">%-k:%M:%S %Y.%m.%d.</string>
diff --git a/core/res/res/values-id-rID/donottranslate-cldr.xml b/core/res/res/values-id-rID/donottranslate-cldr.xml
index 4402b1e..feac981 100644
--- a/core/res/res/values-id-rID/donottranslate-cldr.xml
+++ b/core/res/res/values-id-rID/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%d/%m/%Y</string>
<string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="numeric_date_template">"%s/%s/%s"</string>
<string name="month_day_year">%-e %B %Y</string>
<string name="time_of_day">%H:%M:%S</string>
<string name="date_and_time">%H:%M:%S %-e %b %Y</string>
diff --git a/core/res/res/values-it-rCH/donottranslate-cldr.xml b/core/res/res/values-it-rCH/donottranslate-cldr.xml
index 251bd9b..6b76f8e 100644
--- a/core/res/res/values-it-rCH/donottranslate-cldr.xml
+++ b/core/res/res/values-it-rCH/donottranslate-cldr.xml
@@ -93,6 +93,7 @@
<string name="twenty_four_hour_time_format">HH:mm</string>
<string name="numeric_date">%d.%m.%Y</string>
<string name="numeric_date_format">dd.MM.yyyy</string>
+ <string name="numeric_date_template">"%s.%s.%s"</string>
<string name="month_day_year">%-e %B %Y</string>
<string name="time_of_day">%H.%M.%S</string>
<string name="date_and_time">%H.%M.%S %-e-%b-%Y</string>
diff --git a/core/res/res/values-it-rIT/donottranslate-cldr.xml b/core/res/res/values-it-rIT/donottranslate-cldr.xml
index 7545581..929f899 100644
--- a/core/res/res/values-it-rIT/donottranslate-cldr.xml
+++ b/core/res/res/values-it-rIT/donottranslate-cldr.xml
@@ -93,6 +93,7 @@
<string name="twenty_four_hour_time_format">HH:mm</string>
<string name="numeric_date">%d/%m/%Y</string>
<string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="numeric_date_template">"%s/%s/%s"</string>
<string name="month_day_year">%d %B %Y</string>
<string name="time_of_day">%H.%M.%S</string>
<string name="date_and_time">%H.%M.%S %d/%b/%Y</string>
diff --git a/core/res/res/values-it/donottranslate-cldr.xml b/core/res/res/values-it/donottranslate-cldr.xml
index 7545581..929f899 100644
--- a/core/res/res/values-it/donottranslate-cldr.xml
+++ b/core/res/res/values-it/donottranslate-cldr.xml
@@ -93,6 +93,7 @@
<string name="twenty_four_hour_time_format">HH:mm</string>
<string name="numeric_date">%d/%m/%Y</string>
<string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="numeric_date_template">"%s/%s/%s"</string>
<string name="month_day_year">%d %B %Y</string>
<string name="time_of_day">%H.%M.%S</string>
<string name="date_and_time">%H.%M.%S %d/%b/%Y</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index b5cbd98..6b12175 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -161,14 +161,10 @@
<string name="permdesc_changeConfiguration">"Consente a un\'applicazione di modificare la configurazione corrente, come le dimensioni dei caratteri locali o complessive."</string>
<string name="permlab_restartPackages">"riavvio altre applicazioni"</string>
<string name="permdesc_restartPackages">"Consente a un\'applicazione di riavviare forzatamente altre applicazioni."</string>
- <string name="permlab_setProcessForeground">"impedire l\'interruzione"</string>
- <string name="permdesc_setProcessForeground">"Consente a un\'applicazione di eseguire i processi in primo piano in modo che non possano essere interrotti. Non dovrebbe essere mai necessario per le normali applicazioni."</string>
<string name="permlab_forceBack">"chiusura forzata dell\'applicazione"</string>
<string name="permdesc_forceBack">"Consente a un\'applicazione di forzare la chiusura di attività in primo piano. Non dovrebbe essere mai necessario per le normali applicazioni."</string>
<string name="permlab_dump">"recupero stato interno del sistema"</string>
<string name="permdesc_dump">"Consente all\'applicazione di recuperare lo stato interno del sistema. Le applicazioni dannose potrebbero recuperare molte informazioni riservate e protette di cui non dovrebbero avere mai bisogno."</string>
- <string name="permlab_addSystemService">"pubblicaz. servizi di basso livello"</string>
- <string name="permdesc_addSystemService">"Consente a un\'applicazione di pubblicare i suoi servizi di sistema di basso livello. Le applicazioni dannose potrebbero assumere il controllo del sistema e impossessarsi di dati o danneggiarli."</string>
<string name="permlab_runSetActivityWatcher">"monitoraggio e controllo avvio applicazioni"</string>
<string name="permdesc_runSetActivityWatcher">"Consente a un\'applicazione di monitorare e controllare la modalità di avvio delle attività nel sistema. Le applicazioni dannose potrebbero compromettere totalmente il sistema. Questa autorizzazione è necessaria soltanto per lo sviluppo, mai per il normale utilizzo del telefono."</string>
<string name="permlab_broadcastPackageRemoved">"invio broadcast rimossi dal pacchetto"</string>
diff --git a/core/res/res/values-ja-rJP/donottranslate-cldr.xml b/core/res/res/values-ja-rJP/donottranslate-cldr.xml
index 3d0531e..ae07433 100644
--- a/core/res/res/values-ja-rJP/donottranslate-cldr.xml
+++ b/core/res/res/values-ja-rJP/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%Y/%m/%d</string>
<string name="numeric_date_format">yyyy/MM/dd</string>
+ <string name="numeric_date_template">"%s/%s/%s"</string>
<string name="month_day_year">%Y年%-m月%-e日</string>
<string name="time_of_day">%-k:%M:%S</string>
<string name="date_and_time">%-k:%M:%S %Y/%m/%d</string>
diff --git a/core/res/res/values-ja/donottranslate-cldr.xml b/core/res/res/values-ja/donottranslate-cldr.xml
index 3d0531e..ae07433 100644
--- a/core/res/res/values-ja/donottranslate-cldr.xml
+++ b/core/res/res/values-ja/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%Y/%m/%d</string>
<string name="numeric_date_format">yyyy/MM/dd</string>
+ <string name="numeric_date_template">"%s/%s/%s"</string>
<string name="month_day_year">%Y年%-m月%-e日</string>
<string name="time_of_day">%-k:%M:%S</string>
<string name="date_and_time">%-k:%M:%S %Y/%m/%d</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 0f73bb3..a2bc500 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -161,14 +161,10 @@
<string name="permdesc_changeConfiguration">"地域/言語やフォントのサイズなど、現在の設定の変更をアプリケーションに許可します。"</string>
<string name="permlab_restartPackages">"他のアプリケーションの再起動"</string>
<string name="permdesc_restartPackages">"他のアプリケーションの強制的な再起動をアプリケーションに許可します。"</string>
- <string name="permlab_setProcessForeground">"停止の阻止"</string>
- <string name="permdesc_setProcessForeground">"フォアグラウンドでプロセスを実行して、強制終了できないようにすることをアプリケーションに許可します。通常のアプリケーションではまったく必要ありません。"</string>
<string name="permlab_forceBack">"アプリケーションの強制終了"</string>
<string name="permdesc_forceBack">"フォアグラウンドで実行されている操作を強制終了して戻ることをアプリケーションに許可します。通常のアプリケーションではまったく必要ありません。"</string>
<string name="permlab_dump">"システムの内部状態の取得"</string>
<string name="permdesc_dump">"システムの内部状態の取得をアプリケーションに許可します。悪意のあるアプリケーションが、通常は必要としない広範囲にわたる非公開の機密情報を取得する恐れがあります。"</string>
- <string name="permlab_addSystemService">"低レベルサービスの公開"</string>
- <string name="permdesc_addSystemService">"独自の低レベルのシステムサービスを公開することをアプリケーションに許可します。悪意のあるアプリケーションがシステムを乗っ取って、データの盗用や破壊をする恐れがあります。"</string>
<string name="permlab_runSetActivityWatcher">"起動中のすべてのアプリケーションの監視と制御"</string>
<string name="permdesc_runSetActivityWatcher">"システムが起動する操作の監視と制御をアプリケーションに許可します。悪意のあるアプリケーションがシステムを完全に破壊する恐れがあります。この許可は開発にのみ必要で、携帯電話の通常の使用にはまったく必要ありません。"</string>
<string name="permlab_broadcastPackageRemoved">"パッケージ削除ブロードキャストの送信"</string>
diff --git a/core/res/res/values-ko-rKR/donottranslate-cldr.xml b/core/res/res/values-ko-rKR/donottranslate-cldr.xml
index b46d9cd..4ec1ba4 100644
--- a/core/res/res/values-ko-rKR/donottranslate-cldr.xml
+++ b/core/res/res/values-ko-rKR/donottranslate-cldr.xml
@@ -86,6 +86,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%Y. %-m. %-e.</string>
<string name="numeric_date_format">yyyy. M. d.</string>
+ <string name="numeric_date_template">"%s. %s. %s."</string>
<string name="month_day_year">%Y년 %-m월 %-e일</string>
<string name="time_of_day">%p %-l:%M:%S</string>
<string name="date_and_time">%p %-l:%M:%S %Y. %-m. %-e.</string>
diff --git a/core/res/res/values-ko/donottranslate-cldr.xml b/core/res/res/values-ko/donottranslate-cldr.xml
index b46d9cd..4ec1ba4 100644
--- a/core/res/res/values-ko/donottranslate-cldr.xml
+++ b/core/res/res/values-ko/donottranslate-cldr.xml
@@ -86,6 +86,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%Y. %-m. %-e.</string>
<string name="numeric_date_format">yyyy. M. d.</string>
+ <string name="numeric_date_template">"%s. %s. %s."</string>
<string name="month_day_year">%Y년 %-m월 %-e일</string>
<string name="time_of_day">%p %-l:%M:%S</string>
<string name="date_and_time">%p %-l:%M:%S %Y. %-m. %-e.</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 75cbd62..fb05a6d 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -161,14 +161,10 @@
<string name="permdesc_changeConfiguration">"응용프로그램이 로케일 또는 전체 글꼴 크기 같은 현재 구성을 변경할 수 있습니다."</string>
<string name="permlab_restartPackages">"다른 응용프로그램 다시 시작"</string>
<string name="permdesc_restartPackages">"응용프로그램이 다른 응용프로그램을 강제로 다시 시작할 수 있습니다."</string>
- <string name="permlab_setProcessForeground">"중지되지 않도록 하기"</string>
- <string name="permdesc_setProcessForeground">"응용프로그램이 프로세스를 포그라운드에서 실행되도록 하여 프로세스를 중지할 수 있습니다. 일반 응용프로그램에는 필요하지 않습니다."</string>
<string name="permlab_forceBack">"강제로 응용프로그램 닫기"</string>
<string name="permdesc_forceBack">"응용프로그램이 포그라운드에 있는 활동을 강제로 닫을 수 있습니다. 일반 응용프로그램에는 필요하지 않습니다."</string>
<string name="permlab_dump">"시스템 내부 상태 검색"</string>
<string name="permdesc_dump">"응용프로그램이 시스템의 내부 상태를 검색할 수 있습니다. 악성 응용프로그램은 이 기능을 이용하여 일반적으로 필요하지 않은 다양한 개인 정보와 보안 정보를 검색할 수 있습니다."</string>
- <string name="permlab_addSystemService">"하위 수준 서비스 게시"</string>
- <string name="permdesc_addSystemService">"응용프로그램이 자체 하위 수준 시스템 서비스를 게시할 수 있습니다. 악성 응용프로그램은 이 기능을 이용하여 시스템을 하이재킹하거나 시스템의 데이터를 도용 또는 손상시킬 수 있습니다."</string>
<string name="permlab_runSetActivityWatcher">"실행 중인 모든 응용프로그램 모니터링 및 제어"</string>
<string name="permdesc_runSetActivityWatcher">"응용프로그램이 시스템에서 활동이 시작되는 방식을 모니터링하고 제어할 수 있습니다. 악성 응용프로그램은 이 기능을 이용하여 시스템을 완전히 손상시킬 수 있습니다. 이 권한은 개발 과정에만 필요하며 일반 전화기 사용 시에는 필요하지 않습니다."</string>
<string name="permlab_broadcastPackageRemoved">"패키지 제거 브로드캐스트 보내기"</string>
diff --git a/core/res/res/values-lt-rLT/donottranslate-cldr.xml b/core/res/res/values-lt-rLT/donottranslate-cldr.xml
index 0d18411..17f228d 100644
--- a/core/res/res/values-lt-rLT/donottranslate-cldr.xml
+++ b/core/res/res/values-lt-rLT/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%Y-%m-%d</string>
<string name="numeric_date_format">yyyy-MM-dd</string>
+ <string name="numeric_date_template">"%s-%s-%s"</string>
<string name="month_day_year">%Y m. %B %-e d.</string>
<string name="time_of_day">%H:%M:%S</string>
<string name="date_and_time">%H:%M:%S %Y.%m.%d</string>
diff --git a/core/res/res/values-lv-rLV/donottranslate-cldr.xml b/core/res/res/values-lv-rLV/donottranslate-cldr.xml
index 14062ab..e6c3b79 100644
--- a/core/res/res/values-lv-rLV/donottranslate-cldr.xml
+++ b/core/res/res/values-lv-rLV/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">HH:mm</string>
<string name="numeric_date">%d.%m.%Y</string>
<string name="numeric_date_format">dd.MM.yyyy</string>
+ <string name="numeric_date_template">"%s.%s.%s"</string>
<string name="month_day_year">%Y. gada %-e. %B</string>
<string name="time_of_day">%H:%M:%S</string>
<string name="date_and_time">%H:%M:%S %Y. gada %-e. %b</string>
diff --git a/core/res/res/values-nb/donottranslate-cldr.xml b/core/res/res/values-nb/donottranslate-cldr.xml
index e7fe6af..17c9b24 100644
--- a/core/res/res/values-nb/donottranslate-cldr.xml
+++ b/core/res/res/values-nb/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">HH.mm</string>
<string name="numeric_date">%d.%m.%Y</string>
<string name="numeric_date_format">dd.MM.yyyy</string>
+ <string name="numeric_date_template">"%s.%s.%s"</string>
<string name="month_day_year">%-e. %B %Y</string>
<string name="time_of_day">%H.%M.%S</string>
<string name="date_and_time">%H.%M.%S %-e. %b %Y</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 3faf00a..bbb5ba8 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -166,14 +166,10 @@
<string name="permdesc_changeConfiguration">"Tillater applikasjonen å endre gjeldende innstillinger, slik som språk eller skriftstørrelse."</string>
<string name="permlab_restartPackages">"omstarte andre applikasjoner"</string>
<string name="permdesc_restartPackages">"Lar applikasjonen tvinge andre applikasjoner til å starte på nytt."</string>
- <string name="permlab_setProcessForeground">"unngå å bli stoppet"</string>
- <string name="permdesc_setProcessForeground">"Lar applikasjonen sette en vilkårlig prosess i forgrunnen, så den ikke kan bli drept. Vanlige applikasjoner bør aldri trenge dette."</string>
<string name="permlab_forceBack">"tvinge applikasjoner til å lukkes"</string>
<string name="permdesc_forceBack">"Lar applikasjonen tvinge enhver aktivitet som er i forgrunnen til å lukkes og gå tilbake. Vanlige applikasjoner bør aldri trenge dette."</string>
<string name="permlab_dump">"hente intern systemtilstand"</string>
<string name="permdesc_dump">"Lar applikasjonen hente intern tilstand fra systemet. Onsdinnede applikasjoner kan hente et bredt spekter av privat og sikker informasjon som de vanligvis aldri burde ha behov for."</string>
- <string name="permlab_addSystemService">"publisere lavnivåtjenester"</string>
- <string name="permdesc_addSystemService">"Lar applikasjonen publisere sine egne lavnivås systemtjenester. Ondsinnede applikasjoner kan kapre systemet, og stjele eller ødelegge alle data på det."</string>
<string name="permlab_runSetActivityWatcher">"overvåke og kontrollere all applikasjonsoppstart"</string>
<string name="permdesc_runSetActivityWatcher">"Lar applikasjonen overvåke og kontrollere hvordan systemet starter applikasjoner. Ondsinnede applikasjoner kan ta over systemet helt. Denne rettigheten behøves bare for utvikling, aldri for vanlig bruk av telefonen."</string>
<string name="permlab_broadcastPackageRemoved">"kringkaste melding om fjernet pakke"</string>
diff --git a/core/res/res/values-nl-rBE/donottranslate-cldr.xml b/core/res/res/values-nl-rBE/donottranslate-cldr.xml
index 1ff4b5a..72a4694 100644
--- a/core/res/res/values-nl-rBE/donottranslate-cldr.xml
+++ b/core/res/res/values-nl-rBE/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">HH:mm</string>
<string name="numeric_date">%-e/%m/%Y</string>
<string name="numeric_date_format">d/MM/yyyy</string>
+ <string name="numeric_date_template">"%s/%s/%s"</string>
<string name="month_day_year">%-e %B %Y</string>
<string name="time_of_day">%H:%M:%S</string>
<string name="date_and_time">%H:%M:%S %-e-%b-%Y</string>
diff --git a/core/res/res/values-nl-rNL/donottranslate-cldr.xml b/core/res/res/values-nl-rNL/donottranslate-cldr.xml
index 581177a..549d816 100644
--- a/core/res/res/values-nl-rNL/donottranslate-cldr.xml
+++ b/core/res/res/values-nl-rNL/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">HH:mm</string>
<string name="numeric_date">%d-%m-%Y</string>
<string name="numeric_date_format">dd-MM-yyyy</string>
+ <string name="numeric_date_template">"%s-%s-%s"</string>
<string name="month_day_year">%-e %B %Y</string>
<string name="time_of_day">%H:%M:%S</string>
<string name="date_and_time">%H:%M:%S %-e %b %Y</string>
diff --git a/core/res/res/values-nl/donottranslate-cldr.xml b/core/res/res/values-nl/donottranslate-cldr.xml
index 581177a..549d816 100644
--- a/core/res/res/values-nl/donottranslate-cldr.xml
+++ b/core/res/res/values-nl/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">HH:mm</string>
<string name="numeric_date">%d-%m-%Y</string>
<string name="numeric_date_format">dd-MM-yyyy</string>
+ <string name="numeric_date_template">"%s-%s-%s"</string>
<string name="month_day_year">%-e %B %Y</string>
<string name="time_of_day">%H:%M:%S</string>
<string name="date_and_time">%H:%M:%S %-e %b %Y</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 925dc5b..3666388 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -161,14 +161,10 @@
<string name="permdesc_changeConfiguration">"Hiermee kan een toepassing de huidige configuratie, zoals de landinstelling of de algemene lettergrootte, wijzigen."</string>
<string name="permlab_restartPackages">"andere toepassingen opnieuw starten"</string>
<string name="permdesc_restartPackages">"Hiermee kan een toepassing andere toepassingen opnieuw starten."</string>
- <string name="permlab_setProcessForeground">"stoppen voorkomen"</string>
- <string name="permdesc_setProcessForeground">"Hiermee kan een toepassing ervoor zorgen dat elk willekeurig proces op de voorgrond wordt uitgevoerd en dus niet kan worden afgesloten. Nooit vereist voor normale toepassingen."</string>
<string name="permlab_forceBack">"toepassing nu sluiten"</string>
<string name="permdesc_forceBack">"Hiermee kan een toepassing elke willekeurige activiteit die op de voorgrond wordt uitgevoerd, sluiten en naar de achtergrond verplaatsen. Nooit vereist voor normale toepassingen."</string>
<string name="permlab_dump">"interne systeemstatus ophalen"</string>
<string name="permdesc_dump">"Hiermee kan een toepassing de interne status van het systeem ophalen. Schadelijke toepassingen kunnen privé- of veiligheidsgegevens ophalen die ze normaal niet nodig hebben."</string>
- <string name="permlab_addSystemService">"services op laag niveau publiceren"</string>
- <string name="permdesc_addSystemService">"Hiermee kunnen toepassingen hun eigen systeemservices op laag niveau publiceren. Schadelijke toepassingen kunnen het systeem mogelijk kapen en willekeurige gegevens van het systeem stelen of beschadigen."</string>
<string name="permlab_runSetActivityWatcher">"alle startende toepassingen bijhouden en beheren"</string>
<string name="permdesc_runSetActivityWatcher">"Hiermee kan een toepassing de manier waarop het systeem activiteiten start, bijhouden en beheren. Schadelijke toepassingen kunnen het systeem volledig in gevaar brengen. Deze machtiging is alleen voor ontwikkeling vereist, nooit voor normaal telefoongebruik."</string>
<string name="permlab_broadcastPackageRemoved">"melding verzenden dat pakket is verwijderd"</string>
diff --git a/core/res/res/values-pl-rPL/donottranslate-cldr.xml b/core/res/res/values-pl-rPL/donottranslate-cldr.xml
index 3b00264..c4bed0d 100644
--- a/core/res/res/values-pl-rPL/donottranslate-cldr.xml
+++ b/core/res/res/values-pl-rPL/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%d-%m-%Y</string>
<string name="numeric_date_format">dd-MM-yyyy</string>
+ <string name="numeric_date_template">"%s-%s-%s"</string>
<string name="month_day_year">%-e %B %Y</string>
<string name="time_of_day">%H:%M:%S</string>
<string name="date_and_time">%H:%M:%S %d-%m-%Y</string>
diff --git a/core/res/res/values-pl/donottranslate-cldr.xml b/core/res/res/values-pl/donottranslate-cldr.xml
index 3b00264..c4bed0d 100644
--- a/core/res/res/values-pl/donottranslate-cldr.xml
+++ b/core/res/res/values-pl/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%d-%m-%Y</string>
<string name="numeric_date_format">dd-MM-yyyy</string>
+ <string name="numeric_date_template">"%s-%s-%s"</string>
<string name="month_day_year">%-e %B %Y</string>
<string name="time_of_day">%H:%M:%S</string>
<string name="date_and_time">%H:%M:%S %d-%m-%Y</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index c69e900..c10eeee 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -161,14 +161,10 @@
<string name="permdesc_changeConfiguration">"Pozwala aplikacji zmieniać bieżącą konfigurację, na przykład lokalny lub globalny rozmiar czcionki."</string>
<string name="permlab_restartPackages">"resetowanie innych aplikacji"</string>
<string name="permdesc_restartPackages">"Pozwala aplikacji na wymuszenie ponownego uruchomienia innych aplikacji."</string>
- <string name="permlab_setProcessForeground">"zapobieganie zatrzymaniu"</string>
- <string name="permdesc_setProcessForeground">"Pozwala aplikacji na uruchamianie dowolnego procesu na pierwszym planie tak, że nie można go wyłączyć. Nigdy nie powinno być potrzebne normalnym aplikacjom."</string>
<string name="permlab_forceBack">"wymuszanie zamknięcia aplikacji"</string>
<string name="permdesc_forceBack">"Pozwala aplikacji na wymuszenie zamknięcia i cofnięcia dowolnej operacji działającej na pierwszym planie. Nigdy nie powinno być potrzebne normalnym aplikacjom."</string>
<string name="permlab_dump">"pobieranie informacji o wewnętrznym stanie systemu"</string>
<string name="permdesc_dump">"Pozwala aplikacjom na pobieranie informacji o wewnętrznym stanie systemu. Szkodliwe aplikacje mogą pobrać szeroką gamę osobistych i zabezpieczonych informacji, które normalnie nie powinny im być nigdy potrzebne."</string>
- <string name="permlab_addSystemService">"publikowanie usług niskiego poziomu"</string>
- <string name="permdesc_addSystemService">"Pozwala aplikacji na publikowanie własnych usług systemowych niskiego poziomu. Szkodliwe aplikacje mogą przejąć kontrolę nad systemem oraz wykraść lub uszkodzić znajdujące się w nim dane."</string>
<string name="permlab_runSetActivityWatcher">"monitorowanie i kontrolowanie wszystkich uruchamianych aplikacji"</string>
<string name="permdesc_runSetActivityWatcher">"Pozwala aplikacji na monitorowanie i kontrolowanie sposobu, w jaki w systemie uruchamiane są różne działania. Szkodliwe aplikacje mogą całkowicie przejąć system. Te uprawnienia potrzebne są tylko programistom, nigdy w przypadku normalnego wykorzystywania telefonu."</string>
<string name="permlab_broadcastPackageRemoved">"wysyłanie transmisji informującej o usuniętym pakiecie"</string>
diff --git a/core/res/res/values-pt-rBR/donottranslate-cldr.xml b/core/res/res/values-pt-rBR/donottranslate-cldr.xml
index b2ee7c7..7b3304c 100644
--- a/core/res/res/values-pt-rBR/donottranslate-cldr.xml
+++ b/core/res/res/values-pt-rBR/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H'h'mm</string>
<string name="numeric_date">%d/%m/%Y</string>
<string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="numeric_date_template">"%s/%s/%s"</string>
<string name="month_day_year">%-e de %B de %Y</string>
<string name="time_of_day">%H:%M:%S</string>
<string name="date_and_time">%H:%M:%S %d/%m/%Y</string>
diff --git a/core/res/res/values-pt-rPT/donottranslate-cldr.xml b/core/res/res/values-pt-rPT/donottranslate-cldr.xml
index 16f7cd8..b14dbcb 100644
--- a/core/res/res/values-pt-rPT/donottranslate-cldr.xml
+++ b/core/res/res/values-pt-rPT/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H'h'mm</string>
<string name="numeric_date">%d/%m/%Y</string>
<string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="numeric_date_template">"%s/%s/%s"</string>
<string name="month_day_year">%-e de %B de %Y</string>
<string name="time_of_day">%H:%M:%S</string>
<string name="date_and_time">%H:%M:%S %-e de %b de %Y</string>
diff --git a/core/res/res/values-pt/donottranslate-cldr.xml b/core/res/res/values-pt/donottranslate-cldr.xml
index b2ee7c7..7b3304c 100644
--- a/core/res/res/values-pt/donottranslate-cldr.xml
+++ b/core/res/res/values-pt/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H'h'mm</string>
<string name="numeric_date">%d/%m/%Y</string>
<string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="numeric_date_template">"%s/%s/%s"</string>
<string name="month_day_year">%-e de %B de %Y</string>
<string name="time_of_day">%H:%M:%S</string>
<string name="date_and_time">%H:%M:%S %d/%m/%Y</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index bcfcd52..a8e9b12 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -218,14 +218,10 @@
<string name="permdesc_changeConfiguration">"Permite que um aplicativo mude a configuração atual, como a localidade ou o tamanho geral de fonte."</string>
<string name="permlab_restartPackages">"reiniciar outros aplicativos"</string>
<string name="permdesc_restartPackages">"Permite que um aplicativo reinicie outros aplicativos forçosamente."</string>
- <string name="permlab_setProcessForeground">"impedir a interrupção"</string>
- <string name="permdesc_setProcessForeground">"Permite que um aplicativo faça qualquer processo executar em primeiro plano, não podendo ser encerrado. Normalmente não é necessário para aplicativos normais."</string>
<string name="permlab_forceBack">"forçar fechamento do aplicativo"</string>
<string name="permdesc_forceBack">"Permite que um aplicativo force qualquer atividade que esteja em primeiro plano a fechar e voltar. Normalmente não é necessário para aplicativos normais."</string>
<string name="permlab_dump">"recuperar estado interno do sistema"</string>
<string name="permdesc_dump">"Permite que um aplicativo recupere o estado interno do sistema. Aplicativos maliciosos podem recuperar um ampla variedade de informações privadas e seguras, as quais não deveriam precisar normalmente."</string>
- <string name="permlab_addSystemService">"publicar serviços de nível inferior"</string>
- <string name="permdesc_addSystemService">"Permite que o aplicativo publique seus próprios serviços do sistema de nível inferior. Aplicativos maliciosos podem seqüestrar o sistema e roubar ou corromper quaisquer dados contidos nele."</string>
<!-- no translation found for permlab_shutdown (7185747824038909016) -->
<skip />
<!-- no translation found for permdesc_shutdown (7046500838746291775) -->
diff --git a/core/res/res/values-ro-rRO/donottranslate-cldr.xml b/core/res/res/values-ro-rRO/donottranslate-cldr.xml
index a4f1097..3672c94 100644
--- a/core/res/res/values-ro-rRO/donottranslate-cldr.xml
+++ b/core/res/res/values-ro-rRO/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%d.%m.%Y</string>
<string name="numeric_date_format">dd.MM.yyyy</string>
+ <string name="numeric_date_template">"%s.%s.%s"</string>
<string name="month_day_year">%-e %B %Y</string>
<string name="time_of_day">%H:%M:%S</string>
<string name="date_and_time">%H:%M:%S, %d.%m.%Y</string>
diff --git a/core/res/res/values-ru-rRU/donottranslate-cldr.xml b/core/res/res/values-ru-rRU/donottranslate-cldr.xml
index 64f9845..2b8c235 100644
--- a/core/res/res/values-ru-rRU/donottranslate-cldr.xml
+++ b/core/res/res/values-ru-rRU/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%d.%m.%Y</string>
<string name="numeric_date_format">dd.MM.yyyy</string>
+ <string name="numeric_date_template">"%s.%s.%s"</string>
<string name="month_day_year">%-e %B %Y г.</string>
<string name="time_of_day">%-k:%M:%S</string>
<string name="date_and_time">%-k:%M:%S %d.%m.%Y</string>
diff --git a/core/res/res/values-ru/donottranslate-cldr.xml b/core/res/res/values-ru/donottranslate-cldr.xml
index 64f9845..2b8c235 100644
--- a/core/res/res/values-ru/donottranslate-cldr.xml
+++ b/core/res/res/values-ru/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%d.%m.%Y</string>
<string name="numeric_date_format">dd.MM.yyyy</string>
+ <string name="numeric_date_template">"%s.%s.%s"</string>
<string name="month_day_year">%-e %B %Y г.</string>
<string name="time_of_day">%-k:%M:%S</string>
<string name="date_and_time">%-k:%M:%S %d.%m.%Y</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 8b91e4b..5945315 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -161,14 +161,10 @@
<string name="permdesc_changeConfiguration">"Позволяет приложению изменять текущую конфигурацию, например локаль и общий размер шрифта."</string>
<string name="permlab_restartPackages">"перезапускать другие приложения"</string>
<string name="permdesc_restartPackages">"Разрешает приложению принудительно перезапускать другие приложения."</string>
- <string name="permlab_setProcessForeground">"предотвращать остановку"</string>
- <string name="permdesc_setProcessForeground">"Разрешает приложению запускать любые процессы на переднем плане так, что их нельзя прекратить. Не требуется обычным приложениям."</string>
<string name="permlab_forceBack">"принудительно закрывать приложения"</string>
<string name="permdesc_forceBack">"Позволяет приложению принудительно закрывать и переводить в фоновый режим действия, работающие на переднем плане. Не требуется обычным приложениям."</string>
<string name="permlab_dump">"получать внутреннее состояние системы"</string>
<string name="permdesc_dump">"Разрешает приложениям получать внутреннее состояние системы. Вредоносное ПО может получать множество личной и защищенной информации, которая обычно не была бы им доступна."</string>
- <string name="permlab_addSystemService">"публиковать службы низкого уровня"</string>
- <string name="permdesc_addSystemService">"Разрешает приложению публиковать собственные системные службы низкого уровня. Вредоносное ПО может взломать систему и украсть или повредить данные в ней."</string>
<string name="permlab_runSetActivityWatcher">"наблюдать и управлять запуском всех приложений"</string>
<string name="permdesc_runSetActivityWatcher">"Разрешает приложению следить и управлять тем, как система запускает действия. Вредоносное ПО может полностью нарушить работу системы. Это разрешение нужно только для разработки, но не при обычном использовании телефона."</string>
<string name="permlab_broadcastPackageRemoved">"отправлять оповещения об удалении пакетов"</string>
diff --git a/core/res/res/values-sk-rSK/donottranslate-cldr.xml b/core/res/res/values-sk-rSK/donottranslate-cldr.xml
index 0a1245a..ea2a5ab 100644
--- a/core/res/res/values-sk-rSK/donottranslate-cldr.xml
+++ b/core/res/res/values-sk-rSK/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">HH:mm</string>
<string name="numeric_date">%-e.%-m.%Y</string>
<string name="numeric_date_format">d.M.yyyy</string>
+ <string name="numeric_date_template">"%s.%s.%s"</string>
<string name="month_day_year">%-e. %B %Y</string>
<string name="time_of_day">%-k:%M:%S</string>
<string name="date_and_time">%-k:%M:%S %-e.%-m.%Y</string>
diff --git a/core/res/res/values-sl-rSI/donottranslate-cldr.xml b/core/res/res/values-sl-rSI/donottranslate-cldr.xml
index f16b9ea..b9c30c9 100644
--- a/core/res/res/values-sl-rSI/donottranslate-cldr.xml
+++ b/core/res/res/values-sl-rSI/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%-e. %m. %Y</string>
<string name="numeric_date_format">d. MM. yyyy</string>
+ <string name="numeric_date_template">"%s. %s. %s"</string>
<string name="month_day_year">%d. %B %Y</string>
<string name="time_of_day">%H:%M:%S</string>
<string name="date_and_time">%H:%M:%S %-e. %b. %Y</string>
diff --git a/core/res/res/values-sr-rRS/donottranslate-cldr.xml b/core/res/res/values-sr-rRS/donottranslate-cldr.xml
index 1cd9d6a..f88de6b 100644
--- a/core/res/res/values-sr-rRS/donottranslate-cldr.xml
+++ b/core/res/res/values-sr-rRS/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">HH.mm</string>
<string name="numeric_date">%-e.%-m.%Y.</string>
<string name="numeric_date_format">d.M.yyyy.</string>
+ <string name="numeric_date_template">"%s.%s.%s."</string>
<string name="month_day_year">%d. %B %Y.</string>
<string name="time_of_day">%H.%M.%S</string>
<string name="date_and_time">%H.%M.%S %d.%m.%Y.</string>
diff --git a/core/res/res/values-sv-rSE/donottranslate-cldr.xml b/core/res/res/values-sv-rSE/donottranslate-cldr.xml
index ce756bb..c846719 100644
--- a/core/res/res/values-sv-rSE/donottranslate-cldr.xml
+++ b/core/res/res/values-sv-rSE/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H.mm</string>
<string name="numeric_date">%Y-%m-%d</string>
<string name="numeric_date_format">yyyy-MM-dd</string>
+ <string name="numeric_date_template">"%s-%s-%s"</string>
<string name="month_day_year">%-e %B %Y</string>
<string name="time_of_day">%H:%M:%S</string>
<string name="date_and_time">%H:%M:%S %-e %b %Y</string>
diff --git a/core/res/res/values-th-rTH/donottranslate-cldr.xml b/core/res/res/values-th-rTH/donottranslate-cldr.xml
index 876bb80..53cd4d7 100644
--- a/core/res/res/values-th-rTH/donottranslate-cldr.xml
+++ b/core/res/res/values-th-rTH/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%-e/%-m/%Y</string>
<string name="numeric_date_format">d/M/yyyy</string>
+ <string name="numeric_date_template">"%s/%s/%s"</string>
<string name="month_day_year">%-e %B %Y</string>
<string name="time_of_day">%-k:%M:%S</string>
<string name="date_and_time">%-k:%M:%S, %-e %b %Y</string>
diff --git a/core/res/res/values-tr-rTR/donottranslate-cldr.xml b/core/res/res/values-tr-rTR/donottranslate-cldr.xml
index 6220eba..2475b21 100644
--- a/core/res/res/values-tr-rTR/donottranslate-cldr.xml
+++ b/core/res/res/values-tr-rTR/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">HH:mm</string>
<string name="numeric_date">%d %m %Y</string>
<string name="numeric_date_format">dd MM yyyy</string>
+ <string name="numeric_date_template">"%s %s %s"</string>
<string name="month_day_year">%d %B %Y</string>
<string name="time_of_day">%H:%M:%S</string>
<string name="date_and_time">%H:%M:%S %d %b %Y</string>
diff --git a/core/res/res/values-uk-rUA/donottranslate-cldr.xml b/core/res/res/values-uk-rUA/donottranslate-cldr.xml
index 43eaba0..51dabd0 100644
--- a/core/res/res/values-uk-rUA/donottranslate-cldr.xml
+++ b/core/res/res/values-uk-rUA/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%d.%m.%Y</string>
<string name="numeric_date_format">dd.MM.yyyy</string>
+ <string name="numeric_date_template">"%s.%s.%s"</string>
<string name="month_day_year">%-e %B %Y р.</string>
<string name="time_of_day">%H:%M:%S</string>
<string name="date_and_time">%H:%M:%S %-e %b %Y</string>
diff --git a/core/res/res/values-vi-rVN/donottranslate-cldr.xml b/core/res/res/values-vi-rVN/donottranslate-cldr.xml
index b9342fb..0d9eebc 100644
--- a/core/res/res/values-vi-rVN/donottranslate-cldr.xml
+++ b/core/res/res/values-vi-rVN/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%d/%m/%Y</string>
<string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="numeric_date_template">"%s/%s/%s"</string>
<string name="month_day_year">Ngày %d tháng %-m năm %Y</string>
<string name="time_of_day">%H:%M:%S</string>
<string name="date_and_time">%d-%m-%Y %H:%M:%S</string>
diff --git a/core/res/res/values-zh-rCN/donottranslate-cldr.xml b/core/res/res/values-zh-rCN/donottranslate-cldr.xml
index 631ef10..6685a7d 100644
--- a/core/res/res/values-zh-rCN/donottranslate-cldr.xml
+++ b/core/res/res/values-zh-rCN/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%Y-%-m-%-e</string>
<string name="numeric_date_format">yyyy-M-d</string>
+ <string name="numeric_date_template">"%s-%s-%s"</string>
<string name="month_day_year">%Y年%-m月%-e日</string>
<string name="time_of_day">%p%I:%M:%S</string>
<string name="date_and_time">%p%I:%M:%S %Y-%-m-%-e</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index b4386d0..303f549 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -166,14 +166,10 @@
<string name="permdesc_changeConfiguration">"允许应用程序更改当前配置,例如语言设置或整体的字体大小。"</string>
<string name="permlab_restartPackages">"重新启动其他应用程序"</string>
<string name="permdesc_restartPackages">"允许应用程序强制重新启动其他应用程序。"</string>
- <string name="permlab_setProcessForeground">"防止停止"</string>
- <string name="permdesc_setProcessForeground">"允许应用程序在前台运行任何进程,因此该进程不能被终止。普通应用程序从不需要使用此权限。"</string>
<string name="permlab_forceBack">"强制应用程序关闭"</string>
<string name="permdesc_forceBack">"允许应用程序强制前台的任何活动关闭和重新开始。普通应用程序从不需要使用此权限。"</string>
<string name="permlab_dump">"检索系统内部状态"</string>
<string name="permdesc_dump">"允许应用程序检索系统的内部状态。恶意应用程序可能会借此检索通常它们本不需要的各种私有和安全信息。"</string>
- <string name="permlab_addSystemService">"发布低级服务"</string>
- <string name="permdesc_addSystemService">"允许应用程序发布自己的低级系统服务。恶意应用程序可能会借此攻击系统,以及盗取或破坏系统中的任何数据。"</string>
<string name="permlab_runSetActivityWatcher">"监视和控制所有应用程序启动"</string>
<string name="permdesc_runSetActivityWatcher">"允许应用程序监视和控制系统启动活动的方式。恶意应用程序可能会借此彻底损坏系统。此权限仅在开发时才需要,普通的手机应用不需要。"</string>
<string name="permlab_broadcastPackageRemoved">"发送包删除的广播"</string>
diff --git a/core/res/res/values-zh-rTW/donottranslate-cldr.xml b/core/res/res/values-zh-rTW/donottranslate-cldr.xml
index 631ef10..6685a7d 100644
--- a/core/res/res/values-zh-rTW/donottranslate-cldr.xml
+++ b/core/res/res/values-zh-rTW/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">H:mm</string>
<string name="numeric_date">%Y-%-m-%-e</string>
<string name="numeric_date_format">yyyy-M-d</string>
+ <string name="numeric_date_template">"%s-%s-%s"</string>
<string name="month_day_year">%Y年%-m月%-e日</string>
<string name="time_of_day">%p%I:%M:%S</string>
<string name="date_and_time">%p%I:%M:%S %Y-%-m-%-e</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 0d7c0bb..6e49fa5 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -161,14 +161,10 @@
<string name="permdesc_changeConfiguration">"允許應用程式變更目前設定,例如:地區設定或字型大小。"</string>
<string name="permlab_restartPackages">"重新啟動其他應用程式"</string>
<string name="permdesc_restartPackages">"允許應用程式強制重新啟動其他應用程式。"</string>
- <string name="permlab_setProcessForeground">"保持已停止狀態"</string>
- <string name="permdesc_setProcessForeground">"允許應用程式在前端執行任何程序 (無法中止)。一般應用程式不需要此功能。"</string>
<string name="permlab_forceBack">"強制關閉應用程式"</string>
<string name="permdesc_forceBack">"允許應用程式強制關閉在前端運作的活動並返回。一般應用程式不需要此功能。"</string>
<string name="permlab_dump">"接收系統內部狀態"</string>
<string name="permdesc_dump">"允許應用程式取得系統內部狀態。請注意:惡意程式可能利用此功能,不當取得私人或安全性資料。"</string>
- <string name="permlab_addSystemService">"發行低階服務"</string>
- <string name="permdesc_addSystemService">"允許應用程式發行自有低階系統服務。請注意:惡意程式可能利用此功能綁架系統或偷取、竄改資料內容。"</string>
<string name="permlab_runSetActivityWatcher">"監視控制所有應用程式啟動狀態。"</string>
<string name="permdesc_runSetActivityWatcher">"允許應用程式監控管理系統啟動活動。請注意:惡意程式可能因此癱瘓整個系統。此權限只在開發時需要,一般手機使用不需要此權限。"</string>
<string name="permlab_broadcastPackageRemoved">"傳送程式已移除廣播"</string>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 99fe9c8..23ab573 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -82,9 +82,7 @@
<!-- Text color for urls in search suggestions, used by things like global search and the browser. @hide -->
<attr name="textColorSearchUrl" format="reference|color" />
- <!-- Search widget result item background. -->
- <attr name="searchWidgetItemBackground" format="reference|color" />
- <!-- Search widget expandable result item background. -->
+ <!-- Search widget more corpus result item background. -->
<attr name="searchWidgetCorpusItemBackground" format="reference|color" />
<!-- Text color, typeface, size, and style for "large" text. Defaults to primary text color. -->
diff --git a/core/res/res/values/colors.xml b/core/res/res/values/colors.xml
index 29d8f73..d284d0f 100644
--- a/core/res/res/values/colors.xml
+++ b/core/res/res/values/colors.xml
@@ -75,7 +75,6 @@
<!-- For search-related UIs -->
<color name="search_url_text">#7fa87f</color>
- <color name="search_widget_item_background">@android:color/white</color>
<color name="search_widget_corpus_item_background">@android:color/lighter_gray</color>
</resources>
diff --git a/core/res/res/values/donottranslate-cldr.xml b/core/res/res/values/donottranslate-cldr.xml
index 2e87dee..56c58e2 100644
--- a/core/res/res/values/donottranslate-cldr.xml
+++ b/core/res/res/values/donottranslate-cldr.xml
@@ -98,6 +98,7 @@
<string name="twenty_four_hour_time_format">HH:mm</string>
<string name="numeric_date">%-m/%-e/%Y</string>
<string name="numeric_date_format">M/d/yyyy</string>
+ <string name="numeric_date_template">"%s/%s/%s"</string>
<string name="month_day_year">%B %-e, %Y</string>
<string name="time_of_day">%-l:%M:%S %p</string>
<string name="date_and_time">%b %-e, %Y, %-l:%M:%S %p</string>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 79dc1ba..0ec4e3a 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -30,6 +30,11 @@
<string name="terabyteShort">TB</string>
<!-- Suffix added to a number to signify size in petabytes. -->
<string name="petabyteShort">PB</string>
+ <!-- Format string used to add a suffix like "KB" or "MB" to a number
+ to display a size in kilobytes, megabytes, or other size units.
+ Some languages (like French) will want to add a space between
+ the placeholders. -->
+ <string name="fileSizeSuffix"><xliff:g id="number" example="123">%1$s</xliff:g><xliff:g id="unit" example="KB">%2$s</xliff:g></string>
<!-- Used in Contacts for a field that has no label and in Note Pad
for a note with no name. -->
@@ -456,13 +461,6 @@
forcibly restart other applications.</string>
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
- <string name="permlab_setProcessForeground">keep from being stopped</string>
- <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
- <string name="permdesc_setProcessForeground">Allows an application to make
- any process run in the foreground, so it can\'t be killed.
- Should never be needed for normal applications.</string>
-
- <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_forceBack">force application to close</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_forceBack">Allows an application to force any
@@ -478,13 +476,6 @@
never normally need.</string>
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
- <string name="permlab_addSystemService">publish low-level services</string>
- <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
- <string name="permdesc_addSystemService">Allows application to publish
- its own low-level system services. Malicious applications may hijack
- the system, and steal or corrupt any data on it.</string>
-
- <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_shutdown">partial shutdown</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_shutdown">Puts the activity manager into a shutdown
diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml
index 0641021..f37d514 100644
--- a/core/res/res/values/themes.xml
+++ b/core/res/res/values/themes.xml
@@ -185,7 +185,6 @@
<item name="preferenceLayoutChild">@android:layout/preference_child</item>
<!-- Search widget styles -->
- <item name="searchWidgetItemBackground">@android:color/search_widget_item_background</item>
<item name="searchWidgetCorpusItemBackground">@android:color/search_widget_corpus_item_background</item>
</style>
diff --git a/docs/html/index.jd b/docs/html/index.jd
index ea326b0..07d0abe 100644
--- a/docs/html/index.jd
+++ b/docs/html/index.jd
@@ -5,32 +5,36 @@
<div id="mainBodyFixed">
<div id="mainBodyLeft">
<div id="homeMiddle">
- <div id="homeTitle">
- <h2>Developer Announcements</h2>
- </div><!-- end homeTitle -->
- <div id="announcement-block">
- <!-- total max width is 520px -->
- <img src="{@docRoot}assets/images/home/IO-logo.png" alt="Google I/O Developer Conference 2009" width="242px" />
- <div id="announcement" style="width:270px">
- <p>Google I/O is a two-day developer event that will take place May 27-28 at Moscone Center, San Francisco. The agenda includes a number of great sessions on Android topics by team engineers and other developers.</p>
- <p><a href="http://code.google.com/events/io/">Learn more »</a></p>
- </div> <!-- end annoucement -->
- </div> <!-- end annoucement-block -->
- <div id="carouselMain">
- <div id="bulletinImg"></div>
- <div id="bulletinDesc"></div>
- </div>
- <div class="clearer"></div>
- <div class="app-list-container" align="center">
- <a href="javascript:{}" id="arrow-left" onclick="" class="arrow-left-off"></a>
- <div id="list-clip">
- <div style="left: 0px;" id="app-list">
- <!-- populated by buildCarousel() -->
- </div>
- </div><!-- end list-clip -->
- <a href="javascript:page_right()" id="arrow-right" onclick="" class="arrow-right-on"></a>
+ <div id="topAnnouncement">
+ <div id="homeTitle">
+ <h2>Developer Announcements</h2>
+ </div><!-- end homeTitle -->
+ <div id="announcement-block">
+ <!-- total max width is 520px -->
+ <img src="/assets/images/home/IO-logo.png" alt="Google I/O Developer Conference 2009" width="242px" />
+ <div id="announcement" style="width:270px">
+ <p>Google I/O is a two-day developer event that will take place May 27-28 at Moscone Center, San Francisco. The agenda includes a number of great sessions on Android topics by team engineers and other developers.</p>
+ <p><a href="http://code.google.com/events/io/">Learn more »</a></p>
+ </div> <!-- end annoucement -->
+ </div> <!-- end annoucement-block -->
+ </div><!-- end topAnnouncement -->
+ <div id="carousel">
+ <div id="carouselMain">
+ <div id="bulletinImg"></div>
+ <div id="bulletinDesc"></div>
+ </div>
<div class="clearer"></div>
- </div><!-- end app-list container -->
+ <div class="app-list-container" align="center">
+ <a href="javascript:{}" id="arrow-left" onclick="" class="arrow-left-off"></a>
+ <div id="list-clip">
+ <div style="left: 0px;" id="app-list">
+ <!-- populated by buildCarousel() -->
+ </div>
+ </div><!-- end list-clip -->
+ <a href="javascript:page_right()" id="arrow-right" onclick="" class="arrow-right-on"></a>
+ <div class="clearer"></div>
+ </div><!-- end app-list container -->
+ </div><!-- end carousel -->
</div><!-- end homeMiddle -->
<div style="clear:both"> </div>
diff --git a/include/media/IMediaPlayerService.h b/include/media/IMediaPlayerService.h
index 8125cc9..d1d96b1 100644
--- a/include/media/IMediaPlayerService.h
+++ b/include/media/IMediaPlayerService.h
@@ -34,7 +34,7 @@
public:
DECLARE_META_INTERFACE(MediaPlayerService);
- virtual sp<IMediaRecorder> createMediaRecorder(pid_t pid) = 0;
+ virtual sp<IMediaRecorder> createMediaRecorder(pid_t pid) = 0;
virtual sp<IMediaMetadataRetriever> createMetadataRetriever(pid_t pid) = 0;
virtual sp<IMediaPlayer> create(pid_t pid, const sp<IMediaPlayerClient>& client, const char* url) = 0;
@@ -57,4 +57,3 @@
}; // namespace android
#endif // ANDROID_IMEDIAPLAYERSERVICE_H
-
diff --git a/include/media/MediaPlayerInterface.h b/include/media/MediaPlayerInterface.h
index 7f0e7b3..7bf555a 100644
--- a/include/media/MediaPlayerInterface.h
+++ b/include/media/MediaPlayerInterface.h
@@ -123,4 +123,3 @@
#endif // ANDROID_MEDIAPLAYERINTERFACE_H
-
diff --git a/include/media/mediaplayer.h b/include/media/mediaplayer.h
index 255a67b..513ffe1 100644
--- a/include/media/mediaplayer.h
+++ b/include/media/mediaplayer.h
@@ -82,7 +82,7 @@
// 0xx: Reserved
// 7xx: Android Player info/warning (e.g player lagging behind.)
// 8xx: Media info/warning (e.g media badly interleaved.)
-//
+//
enum media_info_type {
// 0xx
MEDIA_INFO_UNKNOWN = 1,
diff --git a/include/utils/BackupHelpers.h b/include/utils/BackupHelpers.h
index 24b6c9e..f60f4ea 100644
--- a/include/utils/BackupHelpers.h
+++ b/include/utils/BackupHelpers.h
@@ -118,7 +118,7 @@
};
int back_up_files(int oldSnapshotFD, BackupDataWriter* dataStream, int newSnapshotFD,
- char const* fileBase, char const* const* files, int fileCount);
+ char const* const* files, char const* const *keys, int fileCount);
#define TEST_BACKUP_HELPERS 1
@@ -127,6 +127,8 @@
int backup_helper_test_empty();
int backup_helper_test_four();
int backup_helper_test_files();
+int backup_helper_test_null_base();
+int backup_helper_test_missing_file();
int backup_helper_test_data_writer();
int backup_helper_test_data_reader();
#endif
diff --git a/libs/utils/BackupData.cpp b/libs/utils/BackupData.cpp
index 120f23d..8c9f875 100644
--- a/libs/utils/BackupData.cpp
+++ b/libs/utils/BackupData.cpp
@@ -327,7 +327,7 @@
}
size_t size = m_header.app.packageLen;
char* buf = packageName->lockBuffer(size);
- if (packageName == NULL) {
+ if (buf == NULL) {
packageName->unlockBuffer();
m_status = ENOMEM;
return m_status;
diff --git a/libs/utils/BackupHelpers.cpp b/libs/utils/BackupHelpers.cpp
index 7f423a8..4c3e37d 100644
--- a/libs/utils/BackupHelpers.cpp
+++ b/libs/utils/BackupHelpers.cpp
@@ -41,8 +41,8 @@
#define MAGIC0 0x70616e53 // Snap
#define MAGIC1 0x656c6946 // File
-#if 0 // TEST_BACKUP_HELPERS
-#define LOGP(x...) printf(x)
+#if 1 // TEST_BACKUP_HELPERS
+#define LOGP(f, x...) printf(f "\n", x)
#else
#define LOGP(x...) LOGD(x)
#endif
@@ -62,6 +62,12 @@
int nameLen;
};
+struct FileRec {
+ char const* file; // this object does not own this string
+ bool deleted;
+ FileState s;
+};
+
const static int ROUND_UP[4] = { 0, 3, 2, 1 };
static inline int
@@ -92,8 +98,8 @@
FileState file;
char filenameBuf[128];
- amt = read(fd, &file, sizeof(file));
- if (amt != sizeof(file)) {
+ amt = read(fd, &file, sizeof(FileState));
+ if (amt != sizeof(FileState)) {
LOGW("read_snapshot_file FileState truncated/error with read at %d bytes\n", bytesRead);
return 1;
}
@@ -128,20 +134,25 @@
}
static int
-write_snapshot_file(int fd, const KeyedVector<String8,FileState>& snapshot)
+write_snapshot_file(int fd, const KeyedVector<String8,FileRec>& snapshot)
{
+ int fileCount = 0;
int bytesWritten = sizeof(SnapshotHeader);
// preflight size
const int N = snapshot.size();
for (int i=0; i<N; i++) {
- const String8& name = snapshot.keyAt(i);
- bytesWritten += sizeof(FileState) + round_up(name.length());
+ const FileRec& g = snapshot.valueAt(i);
+ if (!g.deleted) {
+ const String8& name = snapshot.keyAt(i);
+ bytesWritten += sizeof(FileState) + round_up(name.length());
+ fileCount++;
+ }
}
LOGP("write_snapshot_file fd=%d\n", fd);
int amt;
- SnapshotHeader header = { MAGIC0, N, MAGIC1, bytesWritten };
+ SnapshotHeader header = { MAGIC0, fileCount, MAGIC1, bytesWritten };
amt = write(fd, &header, sizeof(header));
if (amt != sizeof(header)) {
@@ -149,32 +160,34 @@
return errno;
}
- for (int i=0; i<header.fileCount; i++) {
- const String8& name = snapshot.keyAt(i);
- FileState file = snapshot.valueAt(i);
- int nameLen = file.nameLen = name.length();
+ for (int i=0; i<N; i++) {
+ FileRec r = snapshot.valueAt(i);
+ if (!r.deleted) {
+ const String8& name = snapshot.keyAt(i);
+ int nameLen = r.s.nameLen = name.length();
- amt = write(fd, &file, sizeof(file));
- if (amt != sizeof(file)) {
- LOGW("write_snapshot_file error writing header %s", strerror(errno));
- return 1;
- }
-
- // filename is not NULL terminated, but it is padded
- amt = write(fd, name.string(), nameLen);
- if (amt != nameLen) {
- LOGW("write_snapshot_file error writing filename %s", strerror(errno));
- return 1;
- }
- int paddingLen = ROUND_UP[nameLen % 4];
- if (paddingLen != 0) {
- int padding = 0xabababab;
- amt = write(fd, &padding, paddingLen);
- if (amt != paddingLen) {
- LOGW("write_snapshot_file error writing %d bytes of filename padding %s",
- paddingLen, strerror(errno));
+ amt = write(fd, &r.s, sizeof(FileState));
+ if (amt != sizeof(FileState)) {
+ LOGW("write_snapshot_file error writing header %s", strerror(errno));
return 1;
}
+
+ // filename is not NULL terminated, but it is padded
+ amt = write(fd, name.string(), nameLen);
+ if (amt != nameLen) {
+ LOGW("write_snapshot_file error writing filename %s", strerror(errno));
+ return 1;
+ }
+ int paddingLen = ROUND_UP[nameLen % 4];
+ if (paddingLen != 0) {
+ int padding = 0xabababab;
+ amt = write(fd, &padding, paddingLen);
+ if (amt != paddingLen) {
+ LOGW("write_snapshot_file error writing %d bytes of filename padding %s",
+ paddingLen, strerror(errno));
+ return 1;
+ }
+ }
}
}
@@ -190,9 +203,9 @@
static int
write_update_file(BackupDataWriter* dataStream, int fd, const String8& key,
- const String8& realFilename)
+ char const* realFilename)
{
- LOGP("write_update_file %s (%s)\n", realFilename.string(), key.string());
+ LOGP("write_update_file %s (%s)\n", realFilename, key.string());
const int bufsize = 4*1024;
int err;
@@ -237,8 +250,7 @@
}
}
LOGE("write_update_file size mismatch for %s. expected=%d actual=%d."
- " You aren't doing proper locking!",
- realFilename.string(), fileSize, fileSize-bytesLeft);
+ " You aren't doing proper locking!", realFilename, fileSize, fileSize-bytesLeft);
}
free(buf);
@@ -247,10 +259,10 @@
}
static int
-write_update_file(BackupDataWriter* dataStream, const String8& key, const String8& realFilename)
+write_update_file(BackupDataWriter* dataStream, const String8& key, char const* realFilename)
{
int err;
- int fd = open(realFilename.string(), O_RDONLY);
+ int fd = open(realFilename, O_RDONLY);
if (fd == -1) {
return errno;
}
@@ -281,12 +293,11 @@
int
back_up_files(int oldSnapshotFD, BackupDataWriter* dataStream, int newSnapshotFD,
- char const* fileBase, char const* const* files, int fileCount)
+ char const* const* files, char const* const* keys, int fileCount)
{
int err;
- const String8 base(fileBase);
KeyedVector<String8,FileState> oldSnapshot;
- KeyedVector<String8,FileState> newSnapshot;
+ KeyedVector<String8,FileRec> newSnapshot;
if (oldSnapshotFD != -1) {
err = read_snapshot_file(oldSnapshotFD, &oldSnapshot);
@@ -297,26 +308,29 @@
}
for (int i=0; i<fileCount; i++) {
- String8 name(files[i]);
- FileState s;
+ String8 key(keys[i]);
+ FileRec r;
+ char const* file = r.file = files[i];
struct stat st;
- String8 realFilename(base);
- realFilename.appendPath(name);
- err = stat(realFilename.string(), &st);
+ err = stat(file, &st);
if (err != 0) {
- LOGW("Error stating file %s", realFilename.string());
- continue;
+ LOGW("Error stating file %s", file);
+ r.deleted = true;
+ } else {
+ r.deleted = false;
+ r.s.modTime_sec = st.st_mtime;
+ r.s.modTime_nsec = 0; // workaround sim breakage
+ //r.s.modTime_nsec = st.st_mtime_nsec;
+ r.s.size = st.st_size;
+ // we compute the crc32 later down below, when we already have the file open.
+
+ if (newSnapshot.indexOfKey(key) >= 0) {
+ LOGP("back_up_files key already in use '%s'", key.string());
+ return -1;
+ }
}
-
- s.modTime_sec = st.st_mtime;
- s.modTime_nsec = 0; // workaround sim breakage
- //s.modTime_nsec = st.st_mtime_nsec;
- s.size = st.st_size;
-
- // we compute the crc32 later down below, when we already have the file open.
-
- newSnapshot.add(name, s);
+ newSnapshot.add(key, r);
}
int n = 0;
@@ -326,46 +340,42 @@
while (n<N && m<fileCount) {
const String8& p = oldSnapshot.keyAt(n);
const String8& q = newSnapshot.keyAt(m);
+ FileRec& g = newSnapshot.editValueAt(m);
int cmp = p.compare(q);
- if (cmp > 0) {
- // file added
- String8 realFilename(base);
- realFilename.appendPath(q);
- LOGP("file added: %s\n", realFilename.string());
- write_update_file(dataStream, q, realFilename);
- m++;
- }
- else if (cmp < 0) {
+ if (g.deleted || cmp < 0) {
// file removed
- LOGP("file removed: %s\n", p.string());
+ LOGP("file removed: %s", p.string());
+ g.deleted = true; // They didn't mention the file, but we noticed that it's gone.
dataStream->WriteEntityHeader(p, -1);
n++;
}
+ else if (cmp > 0) {
+ // file added
+ LOGP("file added: %s", g.file);
+ write_update_file(dataStream, q, g.file);
+ m++;
+ }
else {
-
// both files exist, check them
- String8 realFilename(base);
- realFilename.appendPath(q);
const FileState& f = oldSnapshot.valueAt(n);
- FileState& g = newSnapshot.editValueAt(m);
- int fd = open(realFilename.string(), O_RDONLY);
+ int fd = open(g.file, O_RDONLY);
if (fd < 0) {
// We can't open the file. Don't report it as a delete either. Let the
// server keep the old version. Maybe they'll be able to deal with it
// on restore.
- LOGP("Unable to open file %s - skipping", realFilename.string());
+ LOGP("Unable to open file %s - skipping", g.file);
} else {
- g.crc32 = compute_crc32(fd);
+ g.s.crc32 = compute_crc32(fd);
- LOGP("%s\n", q.string());
- LOGP(" new: modTime=%d,%d size=%-3d crc32=0x%08x\n",
+ LOGP("%s", q.string());
+ LOGP(" new: modTime=%d,%d size=%-3d crc32=0x%08x",
f.modTime_sec, f.modTime_nsec, f.size, f.crc32);
- LOGP(" old: modTime=%d,%d size=%-3d crc32=0x%08x\n",
- g.modTime_sec, g.modTime_nsec, g.size, g.crc32);
- if (f.modTime_sec != g.modTime_sec || f.modTime_nsec != g.modTime_nsec
- || f.size != g.size || f.crc32 != g.crc32) {
- write_update_file(dataStream, fd, p, realFilename);
+ LOGP(" old: modTime=%d,%d size=%-3d crc32=0x%08x",
+ g.s.modTime_sec, g.s.modTime_nsec, g.s.size, g.s.crc32);
+ if (f.modTime_sec != g.s.modTime_sec || f.modTime_nsec != g.s.modTime_nsec
+ || f.size != g.s.size || f.crc32 != g.s.crc32) {
+ write_update_file(dataStream, fd, p, g.file);
}
close(fd);
@@ -384,9 +394,8 @@
// these were added
while (m<fileCount) {
const String8& q = newSnapshot.keyAt(m);
- String8 realFilename(base);
- realFilename.appendPath(q);
- write_update_file(dataStream, q, realFilename);
+ FileRec& g = newSnapshot.editValueAt(m);
+ write_update_file(dataStream, q, g.file);
m++;
}
@@ -475,7 +484,7 @@
{
int err;
int fd;
- KeyedVector<String8,FileState> snapshot;
+ KeyedVector<String8,FileRec> snapshot;
const char* filename = SCRATCH_DIR "backup_helper_test_empty.snap";
system("rm -r " SCRATCH_DIR);
@@ -534,7 +543,7 @@
{
int err;
int fd;
- KeyedVector<String8,FileState> snapshot;
+ KeyedVector<String8,FileRec> snapshot;
const char* filename = SCRATCH_DIR "backup_helper_test_four.snap";
system("rm -r " SCRATCH_DIR);
@@ -549,38 +558,45 @@
String8 filenames[4];
FileState states[4];
+ FileRec r;
+ r.deleted = false;
+ r.file = NULL;
states[0].modTime_sec = 0xfedcba98;
states[0].modTime_nsec = 0xdeadbeef;
states[0].size = 0xababbcbc;
states[0].crc32 = 0x12345678;
states[0].nameLen = -12;
+ r.s = states[0];
filenames[0] = String8("bytes_of_padding");
- snapshot.add(filenames[0], states[0]);
+ snapshot.add(filenames[0], r);
states[1].modTime_sec = 0x93400031;
states[1].modTime_nsec = 0xdeadbeef;
states[1].size = 0x88557766;
states[1].crc32 = 0x22334422;
states[1].nameLen = -1;
+ r.s = states[1];
filenames[1] = String8("bytes_of_padding3");
- snapshot.add(filenames[1], states[1]);
+ snapshot.add(filenames[1], r);
states[2].modTime_sec = 0x33221144;
states[2].modTime_nsec = 0xdeadbeef;
states[2].size = 0x11223344;
states[2].crc32 = 0x01122334;
states[2].nameLen = 0;
+ r.s = states[2];
filenames[2] = String8("bytes_of_padding_2");
- snapshot.add(filenames[2], states[2]);
+ snapshot.add(filenames[2], r);
states[3].modTime_sec = 0x33221144;
states[3].modTime_nsec = 0xdeadbeef;
states[3].size = 0x11223344;
states[3].crc32 = 0x01122334;
states[3].nameLen = 0;
+ r.s = states[3];
filenames[3] = String8("bytes_of_padding__1");
- snapshot.add(filenames[3], states[3]);
+ snapshot.add(filenames[3], r);
err = write_snapshot_file(fd, snapshot);
@@ -982,6 +998,14 @@
write_text_file(SCRATCH_DIR "data/h", "h\nhh\n");
char const* files_before[] = {
+ SCRATCH_DIR "data/b",
+ SCRATCH_DIR "data/c",
+ SCRATCH_DIR "data/d",
+ SCRATCH_DIR "data/e",
+ SCRATCH_DIR "data/f"
+ };
+
+ char const* keys_before[] = {
"data/b",
"data/c",
"data/d",
@@ -1004,7 +1028,7 @@
{
BackupDataWriter dataStream(dataStreamFD);
- err = back_up_files(-1, &dataStream, newSnapshotFD, SCRATCH_DIR, files_before, 5);
+ err = back_up_files(-1, &dataStream, newSnapshotFD, files_before, keys_before, 5);
if (err != 0) {
return err;
}
@@ -1035,6 +1059,15 @@
unlink(SCRATCH_DIR "data/f");
char const* files_after[] = {
+ SCRATCH_DIR "data/a", // added
+ SCRATCH_DIR "data/b", // same
+ SCRATCH_DIR "data/c", // different mod time
+ SCRATCH_DIR "data/d", // different size (same mod time)
+ SCRATCH_DIR "data/e", // different contents (same mod time, same size)
+ SCRATCH_DIR "data/g" // added
+ };
+
+ char const* keys_after[] = {
"data/a", // added
"data/b", // same
"data/c", // different mod time
@@ -1064,8 +1097,7 @@
{
BackupDataWriter dataStream(dataStreamFD);
- err = back_up_files(oldSnapshotFD, &dataStream, newSnapshotFD, SCRATCH_DIR,
- files_after, 6);
+ err = back_up_files(oldSnapshotFD, &dataStream, newSnapshotFD, files_after, keys_after, 6);
if (err != 0) {
return err;
}
@@ -1078,6 +1110,109 @@
return 0;
}
+int
+backup_helper_test_null_base()
+{
+ int err;
+ int oldSnapshotFD;
+ int dataStreamFD;
+ int newSnapshotFD;
+
+ system("rm -r " SCRATCH_DIR);
+ mkdir(SCRATCH_DIR, 0777);
+ mkdir(SCRATCH_DIR "data", 0777);
+
+ write_text_file(SCRATCH_DIR "data/a", "a\naa\n");
+
+ char const* files[] = {
+ SCRATCH_DIR "data/a",
+ };
+
+ char const* keys[] = {
+ "a",
+ };
+
+ dataStreamFD = creat(SCRATCH_DIR "null_base.data", 0666);
+ if (dataStreamFD == -1) {
+ fprintf(stderr, "error creating: %s\n", strerror(errno));
+ return errno;
+ }
+
+ newSnapshotFD = creat(SCRATCH_DIR "null_base.snap", 0666);
+ if (newSnapshotFD == -1) {
+ fprintf(stderr, "error creating: %s\n", strerror(errno));
+ return errno;
+ }
+
+ {
+ BackupDataWriter dataStream(dataStreamFD);
+
+ err = back_up_files(-1, &dataStream, newSnapshotFD, files, keys, 1);
+ if (err != 0) {
+ return err;
+ }
+ }
+
+ close(dataStreamFD);
+ close(newSnapshotFD);
+
+ return 0;
+}
+
+int
+backup_helper_test_missing_file()
+{
+ int err;
+ int oldSnapshotFD;
+ int dataStreamFD;
+ int newSnapshotFD;
+
+ system("rm -r " SCRATCH_DIR);
+ mkdir(SCRATCH_DIR, 0777);
+ mkdir(SCRATCH_DIR "data", 0777);
+
+ write_text_file(SCRATCH_DIR "data/b", "b\nbb\n");
+
+ char const* files[] = {
+ SCRATCH_DIR "data/a",
+ SCRATCH_DIR "data/b",
+ SCRATCH_DIR "data/c",
+ };
+
+ char const* keys[] = {
+ "a",
+ "b",
+ "c",
+ };
+
+ dataStreamFD = creat(SCRATCH_DIR "null_base.data", 0666);
+ if (dataStreamFD == -1) {
+ fprintf(stderr, "error creating: %s\n", strerror(errno));
+ return errno;
+ }
+
+ newSnapshotFD = creat(SCRATCH_DIR "null_base.snap", 0666);
+ if (newSnapshotFD == -1) {
+ fprintf(stderr, "error creating: %s\n", strerror(errno));
+ return errno;
+ }
+
+ {
+ BackupDataWriter dataStream(dataStreamFD);
+
+ err = back_up_files(-1, &dataStream, newSnapshotFD, files, keys, 1);
+ if (err != 0) {
+ return err;
+ }
+ }
+
+ close(dataStreamFD);
+ close(newSnapshotFD);
+
+ return 0;
+}
+
+
#endif // TEST_BACKUP_HELPERS
}
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index 881de4d..da15adf 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -163,6 +163,9 @@
*/
private int mRingerMode;
+ /** @see System#MODE_RINGER_STREAMS_AFFECTED */
+ private int mRingerModeAffectedStreams;
+
/** @see System#MUTE_STREAMS_AFFECTED */
private int mMuteAffectedStreams;
@@ -286,6 +289,10 @@
mVibrateSetting = System.getInt(cr, System.VIBRATE_ON, 0);
+ mRingerModeAffectedStreams = Settings.System.getInt(cr,
+ Settings.System.MODE_RINGER_STREAMS_AFFECTED,
+ ((1 << AudioManager.STREAM_RING)|(1 << AudioManager.STREAM_NOTIFICATION)|(1 << AudioManager.STREAM_SYSTEM)));
+
mMuteAffectedStreams = System.getInt(cr,
System.MUTE_STREAMS_AFFECTED,
((1 << AudioSystem.STREAM_MUSIC)|(1 << AudioSystem.STREAM_RING)|(1 << AudioSystem.STREAM_SYSTEM)));
@@ -399,7 +406,7 @@
ensureValidStreamType(streamType);
syncRingerAndNotificationStreamVolume(streamType, index, false);
- setStreamVolumeInt(streamType, index, false);
+ setStreamVolumeInt(streamType, index, false, true);
// UI, etc.
mVolumePanel.postVolumeChanged(streamType, flags);
@@ -437,7 +444,7 @@
}
if (streamType == AudioManager.STREAM_RING) {
// One-off to sync notification volume to ringer volume
- setStreamVolumeInt(AudioManager.STREAM_NOTIFICATION, index, force);
+ setStreamVolumeInt(AudioManager.STREAM_NOTIFICATION, index, force, true);
}
}
}
@@ -451,10 +458,11 @@
* @param index Desired volume index of the stream
* @param force If true, set the volume even if the desired volume is same
* as the current volume.
+ * @param lastAudible If true, stores new index as last audible one
*/
- private void setStreamVolumeInt(int streamType, int index, boolean force) {
+ private void setStreamVolumeInt(int streamType, int index, boolean force, boolean lastAudible) {
VolumeStreamState streamState = mStreamStates[streamType];
- if (streamState.setIndex(index) || force) {
+ if (streamState.setIndex(index, lastAudible) || force) {
// Post message to set system volume (it in turn will post a message
// to persist). Do not change volume if stream is muted.
if (streamState.muteCount() == 0) {
@@ -517,13 +525,20 @@
if (!isStreamAffectedByRingerMode(streamType)) continue;
// Bring back last audible volume
setStreamVolumeInt(streamType, mStreamStates[streamType].mLastAudibleIndex,
- false);
+ false, false);
}
} else {
for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) {
- if (!isStreamAffectedByRingerMode(streamType)) continue;
- // Either silent or vibrate, either way volume is 0
- setStreamVolumeInt(streamType, 0, false);
+ if (isStreamAffectedByRingerMode(streamType)) {
+ // Either silent or vibrate, either way volume is 0
+ setStreamVolumeInt(streamType, 0, false, false);
+ } else {
+ // restore stream volume in the case the stream changed from affected
+ // to non affected by ringer mode. Does not arm to do it for streams that
+ // are not affected as well.
+ setStreamVolumeInt(streamType, mStreamStates[streamType].mLastAudibleIndex,
+ false, false);
+ }
}
}
@@ -621,7 +636,7 @@
int streamType = getActiveStreamType(AudioManager.USE_DEFAULT_STREAM_TYPE);
int index = mStreamStates[streamType].mIndex;
syncRingerAndNotificationStreamVolume(streamType, index, true);
- setStreamVolumeInt(streamType, index, true);
+ setStreamVolumeInt(streamType, index, true, true);
}
}
@@ -791,7 +806,7 @@
int streamType = getActiveStreamType(AudioManager.USE_DEFAULT_STREAM_TYPE);
int index = mStreamStates[streamType].mIndex;
syncRingerAndNotificationStreamVolume(streamType, index, true);
- setStreamVolumeInt(streamType, index, true);
+ setStreamVolumeInt(streamType, index, true, true);
}
}
}
@@ -941,9 +956,7 @@
}
public boolean isStreamAffectedByRingerMode(int streamType) {
- int ringerModeAffectedStreams = Settings.System.getInt(mContentResolver,
- Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0);
- return (ringerModeAffectedStreams & (1 << streamType)) != 0;
+ return (mRingerModeAffectedStreams & (1 << streamType)) != 0;
}
public boolean isStreamAffectedByMute(int streamType) {
@@ -1095,15 +1108,15 @@
}
public boolean adjustIndex(int deltaIndex) {
- return setIndex(mIndex + deltaIndex);
+ return setIndex(mIndex + deltaIndex, true);
}
- public boolean setIndex(int index) {
+ public boolean setIndex(int index, boolean lastAudible) {
int oldIndex = mIndex;
mIndex = getValidIndex(index);
if (oldIndex != mIndex) {
- if (mIndex > 0) {
+ if (lastAudible) {
mLastAudibleIndex = mIndex;
}
return true;
@@ -1153,7 +1166,7 @@
mDeathHandlers.add(this);
// If the stream is not yet muted by any client, set lvel to 0
if (muteCount() == 0) {
- setIndex(0);
+ setIndex(0, false);
sendMsg(mAudioHandler, MSG_SET_SYSTEM_VOLUME, mStreamType, SENDMSG_NOOP, 0, 0,
VolumeStreamState.this, 0);
}
@@ -1180,7 +1193,7 @@
// If the stream is not mut any more, restore it's volume if
// ringer mode allows it
if (!isStreamAffectedByRingerMode(mStreamType) || mRingerMode == AudioManager.RINGER_MODE_NORMAL) {
- setIndex(mLastAudibleIndex);
+ setIndex(mLastAudibleIndex, false);
sendMsg(mAudioHandler, MSG_SET_SYSTEM_VOLUME, mStreamType, SENDMSG_NOOP, 0, 0,
VolumeStreamState.this, 0);
}
@@ -1405,6 +1418,10 @@
public void onChange(boolean selfChange) {
super.onChange(selfChange);
+ mRingerModeAffectedStreams = Settings.System.getInt(mContentResolver,
+ Settings.System.MODE_RINGER_STREAMS_AFFECTED,
+ 0);
+
/*
* Ensure all stream types that should be affected by ringer mode
* are in the proper state.
diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java
index 35d604b..3b46d69 100644
--- a/media/java/android/media/MediaPlayer.java
+++ b/media/java/android/media/MediaPlayer.java
@@ -58,7 +58,7 @@
* MediaPlayer object driven by the supported playback control operations.
* The ovals represent the states a MediaPlayer object may reside
* in. The arcs represent the playback control operations that drive the object
- * state transition. There are two types of arcs. The arcs with a single arrow
+ * state transition. There are two types of arcs. The arcs with a single arrow
* head represent synchronous method calls, while those with
* a double arrow head represent asynchronous method calls.</p>
*
@@ -69,42 +69,42 @@
* <p>From this state diagram, one can see that a MediaPlayer object has the
* following states:</p>
* <ul>
- * <li>When a MediaPlayer object is just created using <code>new</code> or
- * after {@link #reset()} is called, it is in the <em>Idle</em> state; and after
- * {@link #release()} is called, it is in the <em>End</em> state. Between these
- * two states is the life cycle of the MediaPlayer object.
+ * <li>When a MediaPlayer object is just created using <code>new</code> or
+ * after {@link #reset()} is called, it is in the <em>Idle</em> state; and after
+ * {@link #release()} is called, it is in the <em>End</em> state. Between these
+ * two states is the life cycle of the MediaPlayer object.
* <ul>
- * <li>There is a subtle but important difference between a newly constructed
- * MediaPlayer object and the MediaPlayer object after {@link #reset()}
- * is called. It is a programming error to invoke methods such
- * as {@link #getCurrentPosition()},
- * {@link #getDuration()}, {@link #getVideoHeight()},
+ * <li>There is a subtle but important difference between a newly constructed
+ * MediaPlayer object and the MediaPlayer object after {@link #reset()}
+ * is called. It is a programming error to invoke methods such
+ * as {@link #getCurrentPosition()},
+ * {@link #getDuration()}, {@link #getVideoHeight()},
* {@link #getVideoWidth()}, {@link #setAudioStreamType(int)},
* {@link #setLooping(boolean)},
- * {@link #setVolume(float, float)}, {@link #pause()}, {@link #start()},
- * {@link #stop()}, {@link #seekTo(int)}, {@link #prepare()} or
- * {@link #prepareAsync()} in the <em>Idle</em> state for both cases. If any of these
- * methods is called right after a MediaPlayer object is constructed,
- * the user supplied callback method OnErrorListener.onError() won't be
+ * {@link #setVolume(float, float)}, {@link #pause()}, {@link #start()},
+ * {@link #stop()}, {@link #seekTo(int)}, {@link #prepare()} or
+ * {@link #prepareAsync()} in the <em>Idle</em> state for both cases. If any of these
+ * methods is called right after a MediaPlayer object is constructed,
+ * the user supplied callback method OnErrorListener.onError() won't be
* called by the internal player engine and the object state remains
- * unchanged; but if these methods are called right after {@link #reset()},
+ * unchanged; but if these methods are called right after {@link #reset()},
* the user supplied callback method OnErrorListener.onError() will be
- * invoked by the internal player engine and the object will be
+ * invoked by the internal player engine and the object will be
* transfered to the <em>Error</em> state. </li>
- * <li>It is also recommended that once
- * a MediaPlayer object is no longer being used, call {@link #release()} immediately
- * so that resources used by the internal player engine associated with the
+ * <li>It is also recommended that once
+ * a MediaPlayer object is no longer being used, call {@link #release()} immediately
+ * so that resources used by the internal player engine associated with the
* MediaPlayer object can be released immediately. Resource may include
- * singleton resources such as hardware acceleration components and
+ * singleton resources such as hardware acceleration components and
* failure to call {@link #release()} may cause subsequent instances of
* MediaPlayer objects to fallback to software implementations or fail
* altogether. Once the MediaPlayer
- * object is in the <em>End</em> state, it can no longer be used and
+ * object is in the <em>End</em> state, it can no longer be used and
* there is no way to bring it back to any other state. </li>
- * <li>Furthermore,
- * the MediaPlayer objects created using <code>new</code> is in the
- * <em>Idle</em> state, while those created with one
- * of the overloaded convenient <code>create</code> methods are <em>NOT</em>
+ * <li>Furthermore,
+ * the MediaPlayer objects created using <code>new</code> is in the
+ * <em>Idle</em> state, while those created with one
+ * of the overloaded convenient <code>create</code> methods are <em>NOT</em>
* in the <em>Idle</em> state. In fact, the objects are in the <em>Prepared</em>
* state if the creation using <code>create</code> method is successful.
* </li>
@@ -114,23 +114,23 @@
* reasons, such as unsupported audio/video format, poorly interleaved
* audio/video, resolution too high, streaming timeout, and the like.
* Thus, error reporting and recovery is an important concern under
- * these circumstances. Sometimes, due to programming errors, invoking a playback
+ * these circumstances. Sometimes, due to programming errors, invoking a playback
* control operation in an invalid state may also occur. Under all these
* error conditions, the internal player engine invokes a user supplied
* OnErrorListener.onError() method if an OnErrorListener has been
* registered beforehand via
* {@link #setOnErrorListener(android.media.MediaPlayer.OnErrorListener)}.
* <ul>
- * <li>It is important to note that once an error occurs, the
- * MediaPlayer object enters the <em>Error</em> state (except as noted
+ * <li>It is important to note that once an error occurs, the
+ * MediaPlayer object enters the <em>Error</em> state (except as noted
* above), even if an error listener has not been registered by the application.</li>
* <li>In order to reuse a MediaPlayer object that is in the <em>
- * Error</em> state and recover from the error,
+ * Error</em> state and recover from the error,
* {@link #reset()} can be called to restore the object to its <em>Idle</em>
* state.</li>
- * <li>It is good programming practice to have your application
- * register a OnErrorListener to look out for error notifications from
- * the internal player engine.</li>
+ * <li>It is good programming practice to have your application
+ * register a OnErrorListener to look out for error notifications from
+ * the internal player engine.</li>
* <li>IlleglStateException is
* thrown to prevent programming errors such as calling {@link #prepare()},
* {@link #prepareAsync()}, or one of the overloaded <code>setDataSource
@@ -141,28 +141,28 @@
* {@link #setDataSource(FileDescriptor)}, or
* {@link #setDataSource(String)}, or
* {@link #setDataSource(Context, Uri)}, or
- * {@link #setDataSource(FileDescriptor, long, long)} transfers a
+ * {@link #setDataSource(FileDescriptor, long, long)} transfers a
* MediaPlayer object in the <em>Idle</em> state to the
* <em>Initialized</em> state.
* <ul>
- * <li>An IllegalStateException is thrown if
+ * <li>An IllegalStateException is thrown if
* setDataSource() is called in any other state.</li>
- * <li>It is good programming
- * practice to always look out for <code>IllegalArgumentException</code>
+ * <li>It is good programming
+ * practice to always look out for <code>IllegalArgumentException</code>
* and <code>IOException</code> that may be thrown from the overloaded
* <code>setDataSource</code> methods.</li>
* </ul>
* </li>
* <li>A MediaPlayer object must first enter the <em>Prepared</em> state
- * before playback can be started.
+ * before playback can be started.
* <ul>
* <li>There are two ways (synchronous vs.
* asynchronous) that the <em>Prepared</em> state can be reached:
* either a call to {@link #prepare()} (synchronous) which
* transfers the object to the <em>Prepared</em> state once the method call
* returns, or a call to {@link #prepareAsync()} (asynchronous) which
- * first transfers the object to the <em>Preparing</em> state after the
- * call returns (which occurs almost right way) while the internal
+ * first transfers the object to the <em>Preparing</em> state after the
+ * call returns (which occurs almost right way) while the internal
* player engine continues working on the rest of preparation work
* until the preparation work completes. When the preparation completes or when {@link #prepare()} call returns,
* the internal player engine then calls a user supplied callback method,
@@ -173,22 +173,22 @@
* the <em>Preparing</em> state is a transient state, and the behavior
* of calling any method with side effect while a MediaPlayer object is
* in the <em>Preparing</em> state is undefined.</li>
- * <li>An IllegalStateException is
- * thrown if {@link #prepare()} or {@link #prepareAsync()} is called in
- * any other state.</li>
- * <li>While in the <em>Prepared</em> state, properties
- * such as audio/sound volume, screenOnWhilePlaying, looping can be
+ * <li>An IllegalStateException is
+ * thrown if {@link #prepare()} or {@link #prepareAsync()} is called in
+ * any other state.</li>
+ * <li>While in the <em>Prepared</em> state, properties
+ * such as audio/sound volume, screenOnWhilePlaying, looping can be
* adjusted by invoking the corresponding set methods.</li>
* </ul>
* </li>
- * <li>To start the playback, {@link #start()} must be called. After
+ * <li>To start the playback, {@link #start()} must be called. After
* {@link #start()} returns successfully, the MediaPlayer object is in the
- * <em>Started</em> state. {@link #isPlaying()} can be called to test
+ * <em>Started</em> state. {@link #isPlaying()} can be called to test
* whether the MediaPlayer object is in the <em>Started</em> state.
* <ul>
* <li>While in the <em>Started</em> state, the internal player engine calls
* a user supplied OnBufferingUpdateListener.onBufferingUpdate() callback
- * method if a OnBufferingUpdateListener has been registered beforehand
+ * method if a OnBufferingUpdateListener has been registered beforehand
* via {@link #setOnBufferingUpdateListener(OnBufferingUpdateListener)}.
* This callback allows applications to keep track of the buffering status
* while streaming audio/video.</li>
@@ -197,44 +197,44 @@
* </ul>
* </li>
* <li>Playback can be paused and stopped, and the current playback position
- * can be adjusted. Playback can be paused via {@link #pause()}. When the call to
+ * can be adjusted. Playback can be paused via {@link #pause()}. When the call to
* {@link #pause()} returns, the MediaPlayer object enters the
- * <em>Paused</em> state. Note that the transition from the <em>Started</em>
- * state to the <em>Paused</em> state and vice versa happens
- * asynchronously in the player engine. It may take some time before
- * the state is updated in calls to {@link #isPlaying()}, and it can be
+ * <em>Paused</em> state. Note that the transition from the <em>Started</em>
+ * state to the <em>Paused</em> state and vice versa happens
+ * asynchronously in the player engine. It may take some time before
+ * the state is updated in calls to {@link #isPlaying()}, and it can be
* a number of seconds in the case of streamed content.
* <ul>
- * <li>Calling {@link #start()} to resume playback for a paused
+ * <li>Calling {@link #start()} to resume playback for a paused
* MediaPlayer object, and the resumed playback
- * position is the same as where it was paused. When the call to
+ * position is the same as where it was paused. When the call to
* {@link #start()} returns, the paused MediaPlayer object goes back to
* the <em>Started</em> state.</li>
* <li>Calling {@link #pause()} has no effect on
* a MediaPlayer object that is already in the <em>Paused</em> state.</li>
* </ul>
* </li>
- * <li>Calling {@link #stop()} stops playback and causes a
+ * <li>Calling {@link #stop()} stops playback and causes a
* MediaPlayer in the <em>Started</em>, <em>Paused</em>, <em>Prepared
- * </em> or <em>PlaybackCompleted</em> state to enter the
+ * </em> or <em>PlaybackCompleted</em> state to enter the
* <em>Stopped</em> state.
* <ul>
- * <li>Once in the <em>Stopped</em> state, playback cannot be started
+ * <li>Once in the <em>Stopped</em> state, playback cannot be started
* until {@link #prepare()} or {@link #prepareAsync()} are called to set
* the MediaPlayer object to the <em>Prepared</em> state again.</li>
- * <li>Calling {@link #stop()} has no effect on a MediaPlayer
+ * <li>Calling {@link #stop()} has no effect on a MediaPlayer
* object that is already in the <em>Stopped</em> state.</li>
* </ul>
* </li>
- * <li>The playback position can be adjusted with a call to
- * {@link #seekTo(int)}.
+ * <li>The playback position can be adjusted with a call to
+ * {@link #seekTo(int)}.
* <ul>
* <li>Although the asynchronuous {@link #seekTo(int)}
* call returns right way, the actual seek operation may take a while to
- * finish, especially for audio/video being streamed. When the actual
- * seek operation completes, the internal player engine calls a user
+ * finish, especially for audio/video being streamed. When the actual
+ * seek operation completes, the internal player engine calls a user
* supplied OnSeekComplete.onSeekComplete() if an OnSeekCompleteListener
- * has been registered beforehand via
+ * has been registered beforehand via
* {@link #setOnSeekCompleteListener(OnSeekCompleteListener)}.</li>
* <li>Please
* note that {@link #seekTo(int)} can also be called in the other states,
@@ -242,7 +242,7 @@
* </em> state.</li>
* <li>Furthermore, the actual current playback position
* can be retrieved with a call to {@link #getCurrentPosition()}, which
- * is helpful for applications such as a Music player that need to keep
+ * is helpful for applications such as a Music player that need to keep
* track of the playback progress.</li>
* </ul>
* </li>
@@ -272,7 +272,7 @@
* <td>Invalid States </p></td>
* <td>Comments </p></td></tr>
* <tr><td>getCurrentPosition </p></td>
- * <td>{Idle, Initialized, Prepared, Started, Paused, Stopped,
+ * <td>{Idle, Initialized, Prepared, Started, Paused, Stopped,
* PlaybackCompleted} </p></td>
* <td>{Error}</p></td>
* <td>Successful invoke of this method in a valid state does not change the
@@ -282,45 +282,45 @@
* <td>{Prepared, Started, Paused, Stopped, PlaybackCompleted} </p></td>
* <td>{Idle, Initialized, Error} </p></td>
* <td>Successful invoke of this method in a valid state does not change the
- * state. Calling this method in an invalid state transfers the object
+ * state. Calling this method in an invalid state transfers the object
* to the <em>Error</em> state. </p></td></tr>
* <tr><td>getVideoHeight </p></td>
- * <td>{Idle, Initialized, Prepared, Started, Paused, Stopped,
+ * <td>{Idle, Initialized, Prepared, Started, Paused, Stopped,
* PlaybackCompleted}</p></td>
* <td>{Error}</p></td>
* <td>Successful invoke of this method in a valid state does not change the
- * state. Calling this method in an invalid state transfers the object
+ * state. Calling this method in an invalid state transfers the object
* to the <em>Error</em> state. </p></td></tr>
* <tr><td>getVideoWidth </p></td>
* <td>{Idle, Initialized, Prepared, Started, Paused, Stopped,
* PlaybackCompleted}</p></td>
* <td>{Error}</p></td>
- * <td>Successful invoke of this method in a valid state does not change
- * the state. Calling this method in an invalid state transfers the
+ * <td>Successful invoke of this method in a valid state does not change
+ * the state. Calling this method in an invalid state transfers the
* object to the <em>Error</em> state. </p></td></tr>
* <tr><td>isPlaying </p></td>
- * <td>{Idle, Initialized, Prepared, Started, Paused, Stopped,
+ * <td>{Idle, Initialized, Prepared, Started, Paused, Stopped,
* PlaybackCompleted}</p></td>
* <td>{Error}</p></td>
* <td>Successful invoke of this method in a valid state does not change
- * the state. Calling this method in an invalid state transfers the
+ * the state. Calling this method in an invalid state transfers the
* object to the <em>Error</em> state. </p></td></tr>
* <tr><td>pause </p></td>
* <td>{Started, Paused}</p></td>
* <td>{Idle, Initialized, Prepared, Stopped, PlaybackCompleted, Error}</p></td>
- * <td>Successful invoke of this method in a valid state transfers the
- * object to the <em>Paused</em> state. Calling this method in an
+ * <td>Successful invoke of this method in a valid state transfers the
+ * object to the <em>Paused</em> state. Calling this method in an
* invalid state transfers the object to the <em>Error</em> state.</p></td></tr>
* <tr><td>prepare </p></td>
* <td>{Initialized, Stopped} </p></td>
* <td>{Idle, Prepared, Started, Paused, PlaybackCompleted, Error} </p></td>
- * <td>Successful invoke of this method in a valid state transfers the
- * object to the <em>Prepared</em> state. Calling this method in an
+ * <td>Successful invoke of this method in a valid state transfers the
+ * object to the <em>Prepared</em> state. Calling this method in an
* invalid state throws an IllegalStateException.</p></td></tr>
* <tr><td>prepareAsync </p></td>
* <td>{Initialized, Stopped} </p></td>
* <td>{Idle, Prepared, Started, Paused, PlaybackCompleted, Error} </p></td>
- * <td>Successful invoke of this method in a valid state transfers the
+ * <td>Successful invoke of this method in a valid state transfers the
* object to the <em>Preparing</em> state. Calling this method in an
* invalid state throws an IllegalStateException.</p></td></tr>
* <tr><td>release </p></td>
@@ -328,18 +328,18 @@
* <td>{} </p></td>
* <td>After {@link #release()}, the object is no longer available. </p></td></tr>
* <tr><td>reset </p></td>
- * <td>{Idle, Initialized, Prepared, Started, Paused, Stopped,
+ * <td>{Idle, Initialized, Prepared, Started, Paused, Stopped,
* PlaybackCompleted, Error}</p></td>
* <td>{}</p></td>
* <td>After {@link #reset()}, the object is like being just created.</p></td></tr>
* <tr><td>seekTo </p></td>
* <td>{Prepared, Started, Paused, PlaybackCompleted} </p></td>
* <td>{Idle, Initialized, Stopped, Error}</p></td>
- * <td>Successful invoke of this method in a valid state does not change
- * the state. Calling this method in an invalid state transfers the
+ * <td>Successful invoke of this method in a valid state does not change
+ * the state. Calling this method in an invalid state transfers the
* object to the <em>Error</em> state. </p></td></tr>
* <tr><td>setAudioStreamType </p></td>
- * <td>{Idle, Initialized, Stopped, Prepared, Started, Paused,
+ * <td>{Idle, Initialized, Stopped, Prepared, Started, Paused,
* PlaybackCompleted}</p></td>
* <td>{Error}</p></td>
* <td>Successful invoke of this method does not change the state.</p></td></tr>
@@ -347,8 +347,8 @@
* <td>{Idle} </p></td>
* <td>{Initialized, Prepared, Started, Paused, Stopped, PlaybackCompleted,
* Error} </p></td>
- * <td>Successful invoke of this method in a valid state transfers the
- * object to the <em>Initialized</em> state. Calling this method in an
+ * <td>Successful invoke of this method in a valid state transfers the
+ * object to the <em>Initialized</em> state. Calling this method in an
* invalid state throws an IllegalStateException.</p></td></tr>
* <tr><td>setDisplay </p></td>
* <td>any </p></td>
@@ -356,11 +356,11 @@
* <td>This method can be called in any state and calling it does not change
* the object state. </p></td></tr>
* <tr><td>setLooping </p></td>
- * <td>{Idle, Initialized, Stopped, Prepared, Started, Paused,
+ * <td>{Idle, Initialized, Stopped, Prepared, Started, Paused,
* PlaybackCompleted}</p></td>
* <td>{Error}</p></td>
- * <td>Successful invoke of this method in a valid state does not change
- * the state. Calling this method in an
+ * <td>Successful invoke of this method in a valid state does not change
+ * the state. Calling this method in an
* invalid state transfers the object to the <em>Error</em> state.</p></td></tr>
* <tr><td>isLooping </p></td>
* <td>any </p></td>
@@ -398,7 +398,7 @@
* <td>This method can be called in any state and calling it does not change
* the object state. </p></td></tr>
* <tr><td>setVolume </p></td>
- * <td>{Idle, Initialized, Stopped, Prepared, Started, Paused,
+ * <td>{Idle, Initialized, Stopped, Prepared, Started, Paused,
* PlaybackCompleted}</p></td>
* <td>{Error}</p></td>
* <td>Successful invoke of this method does not change the state.
@@ -410,14 +410,14 @@
* <tr><td>start </p></td>
* <td>{Prepared, Started, Paused, PlaybackCompleted}</p></td>
* <td>{Idle, Initialized, Stopped, Error}</p></td>
- * <td>Successful invoke of this method in a valid state transfers the
- * object to the <em>Started</em> state. Calling this method in an
+ * <td>Successful invoke of this method in a valid state transfers the
+ * object to the <em>Started</em> state. Calling this method in an
* invalid state transfers the object to the <em>Error</em> state.</p></td></tr>
* <tr><td>stop </p></td>
* <td>{Prepared, Started, Stopped, Paused, PlaybackCompleted}</p></td>
* <td>{Idle, Initialized, Error}</p></td>
- * <td>Successful invoke of this method in a valid state transfers the
- * object to the <em>Stopped</em> state. Calling this method in an
+ * <td>Successful invoke of this method in a valid state transfers the
+ * object to the <em>Stopped</em> state. Calling this method in an
* invalid state transfers the object to the <em>Error</em> state.</p></td></tr>
* </table>
*
@@ -429,13 +429,13 @@
*
*/
public class MediaPlayer
-{
+{
static {
System.loadLibrary("media_jni");
}
-
+
private final static String TAG = "MediaPlayer";
-
+
private int mNativeContext; // accessed by native methods
private int mListenerContext; // accessed by native methods
private Surface mSurface; // accessed by native methods
@@ -444,16 +444,16 @@
private PowerManager.WakeLock mWakeLock = null;
private boolean mScreenOnWhilePlaying;
private boolean mStayAwake;
-
+
/**
- * Default constructor. Consider using one of the create() methods for
+ * Default constructor. Consider using one of the create() methods for
* synchronously instantiating a MediaPlayer from a Uri or resource.
* <p>When done with the MediaPlayer, you should call {@link #release()},
* to free the resources. If not released, too many MediaPlayer instances may
* result in an exception.</p>
*/
public MediaPlayer() {
-
+
Looper looper;
if ((looper = Looper.myLooper()) != null) {
mEventHandler = new EventHandler(this, looper);
@@ -473,12 +473,12 @@
* Update the MediaPlayer ISurface. Call after updating mSurface.
*/
private native void _setVideoSurface();
-
+
/**
* Sets the SurfaceHolder to use for displaying the video portion of the media.
* This call is optional. Not calling it when playing back a video will
* result in only the audio track being played.
- *
+ *
* @param sh the SurfaceHolder to use for video display
*/
public void setDisplay(SurfaceHolder sh) {
@@ -498,29 +498,29 @@
* <p>When done with the MediaPlayer, you should call {@link #release()},
* to free the resources. If not released, too many MediaPlayer instances will
* result in an exception.</p>
- *
- * @param context the Context to use
+ *
+ * @param context the Context to use
* @param uri the Uri from which to get the datasource
* @return a MediaPlayer object, or null if creation failed
*/
public static MediaPlayer create(Context context, Uri uri) {
return create (context, uri, null);
}
-
+
/**
* Convenience method to create a MediaPlayer for a given Uri.
* On success, {@link #prepare()} will already have been called and must not be called again.
* <p>When done with the MediaPlayer, you should call {@link #release()},
* to free the resources. If not released, too many MediaPlayer instances will
* result in an exception.</p>
- *
- * @param context the Context to use
+ *
+ * @param context the Context to use
* @param uri the Uri from which to get the datasource
* @param holder the SurfaceHolder to use for displaying the video
* @return a MediaPlayer object, or null if creation failed
*/
public static MediaPlayer create(Context context, Uri uri, SurfaceHolder holder) {
-
+
try {
MediaPlayer mp = new MediaPlayer();
mp.setDataSource(context, uri);
@@ -549,9 +549,9 @@
* <p>When done with the MediaPlayer, you should call {@link #release()},
* to free the resources. If not released, too many MediaPlayer instances will
* result in an exception.</p>
- *
- * @param context the Context to use
- * @param resid the raw resource id (<var>R.raw.<something></var>) for
+ *
+ * @param context the Context to use
+ * @param resid the raw resource id (<var>R.raw.<something></var>) for
* the resource to use as the datasource
* @return a MediaPlayer object, or null if creation failed
*/
@@ -577,17 +577,17 @@
}
return null;
}
-
+
/**
* Sets the data source as a content Uri.
- *
+ *
* @param context the Context to use when resolving the Uri
* @param uri the Content URI of the data you want to play
* @throws IllegalStateException if it is called in an invalid state
*/
public void setDataSource(Context context, Uri uri)
throws IOException, IllegalArgumentException, SecurityException, IllegalStateException {
-
+
String scheme = uri.getScheme();
if(scheme == null || scheme.equals("file")) {
setDataSource(uri.getPath());
@@ -624,7 +624,7 @@
/**
* Sets the data source (file-path or http/rtsp URL) to use.
- *
+ *
* @param path the path of the file, or the http/rtsp URL of the stream you want to play
* @throws IllegalStateException if it is called in an invalid state
*/
@@ -633,57 +633,57 @@
/**
* Sets the data source (FileDescriptor) to use. It is the caller's responsibility
* to close the file descriptor. It is safe to do so as soon as this call returns.
- *
+ *
* @param fd the FileDescriptor for the file you want to play
* @throws IllegalStateException if it is called in an invalid state
*/
- public void setDataSource(FileDescriptor fd)
+ public void setDataSource(FileDescriptor fd)
throws IOException, IllegalArgumentException, IllegalStateException {
// intentionally less than LONG_MAX
setDataSource(fd, 0, 0x7ffffffffffffffL);
}
-
+
/**
* Sets the data source (FileDescriptor) to use. It is the caller's responsibility
* to close the file descriptor. It is safe to do so as soon as this call returns.
- *
+ *
* @param fd the FileDescriptor for the file you want to play
* @param offset the offset into the file where the data to be played starts, in bytes
* @param length the length in bytes of the data to be played
* @throws IllegalStateException if it is called in an invalid state
*/
- public native void setDataSource(FileDescriptor fd, long offset, long length)
+ public native void setDataSource(FileDescriptor fd, long offset, long length)
throws IOException, IllegalArgumentException, IllegalStateException;
/**
* Prepares the player for playback, synchronously.
- *
+ *
* After setting the datasource and the display surface, you need to either
* call prepare() or prepareAsync(). For files, it is OK to call prepare(),
* which blocks until MediaPlayer is ready for playback.
- *
+ *
* @throws IllegalStateException if it is called in an invalid state
*/
public native void prepare() throws IOException, IllegalStateException;
-
+
/**
* Prepares the player for playback, asynchronously.
- *
+ *
* After setting the datasource and the display surface, you need to either
* call prepare() or prepareAsync(). For streams, you should call prepareAsync(),
* which returns immediately, rather than blocking until enough data has been
* buffered.
- *
+ *
* @throws IllegalStateException if it is called in an invalid state
*/
public native void prepareAsync() throws IllegalStateException;
-
+
/**
* Starts or resumes playback. If playback had previously been paused,
* playback will continue from where it was paused. If playback had
* been stopped, or never started before, playback will start at the
* beginning.
- *
+ *
* @throws IllegalStateException if it is called in an invalid state
*/
public void start() throws IllegalStateException {
@@ -692,10 +692,10 @@
}
private native void _start() throws IllegalStateException;
-
+
/**
- * Stops playback after playback has been stopped or paused.
- *
+ * Stops playback after playback has been stopped or paused.
+ *
* @throws IllegalStateException if the internal player engine has not been
* initialized.
*/
@@ -705,10 +705,10 @@
}
private native void _stop() throws IllegalStateException;
-
+
/**
* Pauses playback. Call start() to resume.
- *
+ *
* @throws IllegalStateException if the internal player engine has not been
* initialized.
*/
@@ -718,20 +718,20 @@
}
private native void _pause() throws IllegalStateException;
-
+
/**
* Set the low-level power management behavior for this MediaPlayer. This
* can be used when the MediaPlayer is not playing through a SurfaceHolder
* set with {@link #setDisplay(SurfaceHolder)} and thus can use the
* high-level {@link #setScreenOnWhilePlaying(boolean)} feature.
- *
+ *
* <p>This function has the MediaPlayer access the low-level power manager
* service to control the device's power usage while playing is occurring.
* The parameter is a combination of {@link android.os.PowerManager} wake flags.
* Use of this method requires {@link android.Manifest.permission#WAKE_LOCK}
* permission.
* By default, no attempt is made to keep the device awake during playback.
- *
+ *
* @param context the Context to use
* @param mode the power/wake mode to set
* @see android.os.PowerManager
@@ -753,14 +753,14 @@
mWakeLock.acquire();
}
}
-
+
/**
* Control whether we should use the attached SurfaceHolder to keep the
* screen on while video playback is occurring. This is the preferred
* method over {@link #setWakeMode} where possible, since it doesn't
* require that the application have permission for low-level wake lock
* access.
- *
+ *
* @param screenOn Supply true to keep the screen on, false to allow it
* to turn off.
*/
@@ -770,7 +770,7 @@
updateSurfaceScreenOn();
}
}
-
+
private void stayAwake(boolean awake) {
if (mWakeLock != null) {
if (awake && !mWakeLock.isHeld()) {
@@ -782,61 +782,61 @@
mStayAwake = awake;
updateSurfaceScreenOn();
}
-
+
private void updateSurfaceScreenOn() {
if (mSurfaceHolder != null) {
mSurfaceHolder.setKeepScreenOn(mScreenOnWhilePlaying && mStayAwake);
}
}
-
+
/**
* Returns the width of the video.
- *
+ *
* @return the width of the video, or 0 if there is no video,
* no display surface was set, or prepare()/prepareAsync()
* have not completed yet
*/
public native int getVideoWidth();
-
+
/**
* Returns the height of the video.
- *
+ *
* @return the height of the video, or 0 if there is no video,
* no display surface was set, or prepare()/prepareAsync()
* have not completed yet
*/
public native int getVideoHeight();
-
+
/**
* Checks whether the MediaPlayer is playing.
- *
+ *
* @return true if currently playing, false otherwise
*/
public native boolean isPlaying();
-
+
/**
* Seeks to specified time position.
- *
+ *
* @param msec the offset in milliseconds from the start to seek to
* @throws IllegalStateException if the internal player engine has not been
* initialized
*/
public native void seekTo(int msec) throws IllegalStateException;
-
+
/**
* Gets the current playback position.
- *
+ *
* @return the current position in milliseconds
*/
public native int getCurrentPosition();
-
+
/**
* Gets the duration of the file.
- *
+ *
* @return the duration in milliseconds
*/
public native int getDuration();
-
+
/**
* Releases resources associated with this MediaPlayer object.
* It is considered good practice to call this method when you're
@@ -856,7 +856,7 @@
}
private native void _release();
-
+
/**
* Resets the MediaPlayer to its uninitialized state. After calling
* this method, you will have to initialize it again by setting the
@@ -868,13 +868,13 @@
// make sure none of the listeners get called anymore
mEventHandler.removeCallbacksAndMessages(null);
}
-
+
private native void _reset();
-
+
/**
* Sets the audio stream type for this MediaPlayer. See {@link AudioManager}
* for a list of stream types.
- *
+ *
* @param streamtype the audio stream type
* @see android.media.AudioManager
*/
@@ -882,20 +882,20 @@
/**
* Sets the player to be looping or non-looping.
- *
+ *
* @param looping whether to loop or not
*/
public native void setLooping(boolean looping);
/**
* Checks whether the MediaPlayer is looping or non-looping.
- *
+ *
* @return true if the MediaPlayer is currently looping, false otherwise
*/
public native boolean isLooping();
/**
- * Sets the volume on this player.
+ * Sets the volume on this player.
* This API is recommended for balancing the output of audio streams
* within an application. Unless you are writing an application to
* control user settings, this API should be used in preference to
@@ -914,7 +914,7 @@
* @hide
*/
public native Bitmap getFrameAt(int msec) throws IllegalStateException;
-
+
private native final void native_setup(Object mediaplayer_this);
private native final void native_finalize();
@Override
@@ -1037,7 +1037,7 @@
{
/**
* Called when the media file is ready for playback.
- *
+ *
* @param mp the MediaPlayer that is ready for playback
*/
void onPrepared(MediaPlayer mp);
@@ -1064,7 +1064,7 @@
{
/**
* Called when the end of a media source is reached during playback.
- *
+ *
* @param mp the MediaPlayer that reached the end of the file
*/
void onCompletion(MediaPlayer mp);
@@ -1091,14 +1091,14 @@
{
/**
* Called to update status in buffering a media stream.
- *
+ *
* @param mp the MediaPlayer the update pertains to
* @param percent the percentage (0-100) of the buffer
* that has been filled thus far
*/
void onBufferingUpdate(MediaPlayer mp, int percent);
}
-
+
/**
* Register a callback to be invoked when the status of a network
* stream's buffer has changed.
@@ -1111,7 +1111,7 @@
}
private OnBufferingUpdateListener mOnBufferingUpdateListener;
-
+
/**
* Interface definition of a callback to be invoked indicating
* the completion of a seek operation.
@@ -1120,23 +1120,23 @@
{
/**
* Called to indicate the completion of a seek operation.
- *
+ *
* @param mp the MediaPlayer that issued the seek operation
*/
public void onSeekComplete(MediaPlayer mp);
}
-
+
/**
* Register a callback to be invoked when a seek operation has been
* completed.
- *
+ *
* @param listener the callback that will be run
*/
public void setOnSeekCompleteListener(OnSeekCompleteListener listener)
{
mOnSeekCompleteListener = listener;
}
-
+
private OnSeekCompleteListener mOnSeekCompleteListener;
/**
@@ -1147,25 +1147,25 @@
{
/**
* Called to indicate the video size
- *
+ *
* @param mp the MediaPlayer associated with this callback
* @param width the width of the video
* @param height the height of the video
*/
public void onVideoSizeChanged(MediaPlayer mp, int width, int height);
}
-
+
/**
* Register a callback to be invoked when the video size is
* known or updated.
- *
+ *
* @param listener the callback that will be run
*/
public void setOnVideoSizeChangedListener(OnVideoSizeChangedListener listener)
{
mOnVideoSizeChangedListener = listener;
}
-
+
private OnVideoSizeChangedListener mOnVideoSizeChangedListener;
/* Do not change these values without updating their counterparts
@@ -1177,11 +1177,11 @@
public static final int MEDIA_ERROR_UNKNOWN = 1;
/** Media server died. In this case, the application must release the
- * MediaPlayer object and instantiate a new one.
+ * MediaPlayer object and instantiate a new one.
* @see android.media.MediaPlayer.OnErrorListener
*/
public static final int MEDIA_ERROR_SERVER_DIED = 100;
-
+
/** The video is streamed and its container is not valid for progressive
* playback i.e the video's index (e.g moov atom) is not at the start of the
* file.
@@ -1198,7 +1198,7 @@
{
/**
* Called to indicate an error.
- *
+ *
* @param mp the MediaPlayer the error pertains to
* @param what the type of error that has occurred:
* <ul>
@@ -1213,11 +1213,11 @@
*/
boolean onError(MediaPlayer mp, int what, int extra);
}
-
+
/**
* Register a callback to be invoked when an error has happened
* during an asynchronous operation.
- *
+ *
* @param listener the callback that will be run
*/
public void setOnErrorListener(OnErrorListener listener)
@@ -1262,7 +1262,7 @@
{
/**
* Called to indicate an info or a warning.
- *
+ *
* @param mp the MediaPlayer the info pertains to.
* @param what the type of info or warning.
* <ul>
@@ -1282,7 +1282,7 @@
/**
* Register a callback to be invoked when an info/warning is available.
- *
+ *
* @param listener the callback that will be run
*/
public void setOnInfoListener(OnInfoListener listener)
diff --git a/media/jni/android_media_MediaPlayer.cpp b/media/jni/android_media_MediaPlayer.cpp
index 5abe451..6317fe2 100644
--- a/media/jni/android_media_MediaPlayer.cpp
+++ b/media/jni/android_media_MediaPlayer.cpp
@@ -125,8 +125,8 @@
return old;
}
-// If exception is NULL and opStatus is not OK, this method sends an error
-// event to the client application; otherwise, if exception is not NULL and
+// If exception is NULL and opStatus is not OK, this method sends an error
+// event to the client application; otherwise, if exception is not NULL and
// opStatus is not OK, this method throws the given exception to the client
// application.
static void process_media_player_call(JNIEnv *env, jobject thiz, status_t opStatus, const char* exception, const char *message)
@@ -203,7 +203,7 @@
jobject surface = env->GetObjectField(thiz, fields.surface);
if (surface != NULL) {
const sp<Surface>& native_surface = get_surface(env, surface);
- LOGV("prepare: surface=%p (id=%d)",
+ LOGV("prepare: surface=%p (id=%d)",
native_surface.get(), native_surface->ID());
mp->setVideoSurface(native_surface);
}
@@ -243,7 +243,7 @@
jobject surface = env->GetObjectField(thiz, fields.surface);
if (surface != NULL) {
const sp<Surface>& native_surface = get_surface(env, surface);
- LOGV("prepareAsync: surface=%p (id=%d)",
+ LOGV("prepareAsync: surface=%p (id=%d)",
native_surface.get(), native_surface->ID());
mp->setVideoSurface(native_surface);
}
@@ -271,7 +271,7 @@
jniThrowException(env, "java/lang/IllegalStateException", NULL);
return;
}
- process_media_player_call( env, thiz, mp->stop(), NULL, NULL );
+ process_media_player_call( env, thiz, mp->stop(), NULL, NULL );
}
static void
diff --git a/media/libmedia/IMediaPlayerService.cpp b/media/libmedia/IMediaPlayerService.cpp
index 370e3fb..01cdb6c 100644
--- a/media/libmedia/IMediaPlayerService.cpp
+++ b/media/libmedia/IMediaPlayerService.cpp
@@ -195,4 +195,3 @@
// ----------------------------------------------------------------------------
}; // namespace android
-
diff --git a/media/libmedia/mediaplayer.cpp b/media/libmedia/mediaplayer.cpp
index 809316a..24e3e6f 100644
--- a/media/libmedia/mediaplayer.cpp
+++ b/media/libmedia/mediaplayer.cpp
@@ -503,7 +503,7 @@
// TODO: In the future, we might be on the same thread if the app is
// running in the same process as the media server. In that case,
// this will deadlock.
- //
+ //
// The threadId hack below works around this for the care of prepare
// and seekTo within the same process.
// FIXME: Remember, this is a hack, it's not even a hack that is applied
@@ -511,7 +511,7 @@
if (mLockThreadId != getThreadId()) {
mLock.lock();
locked = true;
- }
+ }
if (mPlayer == 0) {
LOGV("notify(%d, %d, %d) callback on disconnected mediaplayer", msg, ext1, ext2);
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
index f6958ed..b2f3557 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
@@ -609,10 +609,6 @@
loadBooleanSetting(stmt, Settings.System.ACCELEROMETER_ROTATION,
R.bool.def_accelerometer_rotation);
- // Default date format based on build
- loadSetting(stmt, Settings.System.DATE_FORMAT,
- SystemProperties.get("ro.com.android.dateformat",
- "MM-dd-yyyy"));
stmt.close();
}
diff --git a/packages/VpnServices/Android.mk b/packages/VpnServices/Android.mk
new file mode 100644
index 0000000..eb27ed5
--- /dev/null
+++ b/packages/VpnServices/Android.mk
@@ -0,0 +1,16 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := user
+
+LOCAL_SRC_FILES := $(call all-subdir-java-files)
+
+LOCAL_JAVA_LIBRARIES :=
+
+LOCAL_PACKAGE_NAME := VpnServices
+LOCAL_CERTIFICATE := platform
+
+include $(BUILD_PACKAGE)
+
+########################
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/packages/VpnServices/AndroidManifest.xml b/packages/VpnServices/AndroidManifest.xml
new file mode 100644
index 0000000..e48b2da
--- /dev/null
+++ b/packages/VpnServices/AndroidManifest.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.server.vpn"
+ android:sharedUserId="android.uid.system"
+ >
+ <application android:label="VPN Services">
+
+ <service android:name=".VpnServiceBinder" android:process=":remote">
+ <intent-filter>
+ <!-- These are the interfaces supported by the service, which
+ you can bind to. -->
+ <action android:name="android.net.vpn.IVpnService" />
+ <!-- This is an action code you can use to select the service
+ without explicitly supplying the implementation class. -->
+ <action android:name="android.net.vpn.SERVICE" />
+ </intent-filter>
+ </service>
+
+ </application>
+
+ <uses-permission android:name="android.permission.INTERNET"></uses-permission>
+</manifest>
diff --git a/packages/VpnServices/MODULE_LICENSE_APACHE2 b/packages/VpnServices/MODULE_LICENSE_APACHE2
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/packages/VpnServices/MODULE_LICENSE_APACHE2
diff --git a/packages/VpnServices/NOTICE b/packages/VpnServices/NOTICE
new file mode 100644
index 0000000..c5b1efa
--- /dev/null
+++ b/packages/VpnServices/NOTICE
@@ -0,0 +1,190 @@
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
diff --git a/packages/VpnServices/res/drawable/vpn_connected.png b/packages/VpnServices/res/drawable/vpn_connected.png
new file mode 100644
index 0000000..65fc6db
--- /dev/null
+++ b/packages/VpnServices/res/drawable/vpn_connected.png
Binary files differ
diff --git a/packages/VpnServices/res/drawable/vpn_disconnected.png b/packages/VpnServices/res/drawable/vpn_disconnected.png
new file mode 100644
index 0000000..2440c69
--- /dev/null
+++ b/packages/VpnServices/res/drawable/vpn_disconnected.png
Binary files differ
diff --git a/packages/VpnServices/res/values/strings.xml b/packages/VpnServices/res/values/strings.xml
new file mode 100755
index 0000000..892850a
--- /dev/null
+++ b/packages/VpnServices/res/values/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="vpn_notification_title">%s VPN %s</string>
+ <string name="vpn_notification_connected">connected</string>
+ <string name="vpn_notification_disconnected">disconnected</string>
+ <string name="vpn_notification_connected_message">Up time: %s</string>
+</resources>
+
diff --git a/packages/VpnServices/src/com/android/server/vpn/AndroidServiceProxy.java b/packages/VpnServices/src/com/android/server/vpn/AndroidServiceProxy.java
new file mode 100644
index 0000000..a12db8c
--- /dev/null
+++ b/packages/VpnServices/src/com/android/server/vpn/AndroidServiceProxy.java
@@ -0,0 +1,258 @@
+/*
+ * Copyright (C) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.vpn;
+
+import android.net.LocalSocket;
+import android.net.LocalSocketAddress;
+import android.os.SystemProperties;
+import android.util.Log;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+/**
+ * Proxy to start, stop and interact with an Android service defined in init.rc.
+ * The android service is expected to accept connection through Unix domain
+ * socket. When the proxy successfully starts the service, it will establish a
+ * socket connection with the service. The socket serves two purposes: (1) send
+ * commands to the service; (2) for the proxy to know whether the service is
+ * alive.
+ *
+ * After the service receives commands from the proxy, it should return either
+ * 0 if the service will close the socket (and the proxy will re-establish
+ * another connection immediately after), or 1 if the socket is remained alive.
+ */
+public class AndroidServiceProxy extends ProcessProxy {
+ private static final int WAITING_TIME = 15; // sec
+
+ private static final String SVC_STATE_CMD_PREFIX = "init.svc.";
+ private static final String SVC_START_CMD = "ctl.start";
+ private static final String SVC_STOP_CMD = "ctl.stop";
+ private static final String SVC_STATE_RUNNING = "running";
+ private static final String SVC_STATE_STOPPED = "stopped";
+
+ private static final int END_OF_ARGUMENTS = 255;
+
+ private String mServiceName;
+ private String mSocketName;
+ private LocalSocket mKeepaliveSocket;
+ private boolean mControlSocketInUse;
+ private Integer mSocketResult = null;
+ private String mTag;
+
+ /**
+ * Creates a proxy with the service name.
+ * @param serviceName the service name
+ */
+ public AndroidServiceProxy(String serviceName) {
+ mServiceName = serviceName;
+ mSocketName = serviceName;
+ mTag = "SProxy_" + serviceName;
+ }
+
+ @Override
+ public String getName() {
+ return "Service " + mServiceName;
+ }
+
+ @Override
+ public synchronized void stop() {
+ if (isRunning()) setResultAndCloseControlSocket(-1);
+ SystemProperties.set(SVC_STOP_CMD, mServiceName);
+ }
+
+ /**
+ * Sends a command with arguments to the service through the control socket.
+ * Each argument is sent as a C-style zero-terminated string.
+ */
+ public void sendCommand(String ...args) throws IOException {
+ OutputStream out = getControlSocketOutput();
+ for (String arg : args) outputString(out, arg);
+ checkSocketResult();
+ }
+
+ /**
+ * Sends a command with arguments to the service through the control socket.
+ */
+ public void sendCommand2(String ...args) throws IOException {
+ OutputStream out = getControlSocketOutput();
+ for (String arg : args) outputString2(out, arg);
+ out.write(END_OF_ARGUMENTS);
+ out.flush();
+ checkSocketResult();
+ }
+
+ /**
+ * {@inheritDoc}
+ * The method returns when the service exits.
+ */
+ @Override
+ protected void performTask() throws IOException {
+ String svc = mServiceName;
+ Log.d(mTag, "+++++ Execute: " + svc);
+ SystemProperties.set(SVC_START_CMD, svc);
+
+ boolean success = blockUntil(SVC_STATE_RUNNING, WAITING_TIME);
+
+ if (success) {
+ Log.d(mTag, "----- Running: " + svc + ", create keepalive socket");
+ LocalSocket s = mKeepaliveSocket = createServiceSocket();
+ setState(ProcessState.RUNNING);
+
+ if (s == null) {
+ // no socket connection, stop hosting the service
+ stop();
+ return;
+ }
+ try {
+ for (;;) {
+ InputStream in = s.getInputStream();
+ int data = in.read();
+ if (data >= 0) {
+ Log.d(mTag, "got data from keepalive socket: " + data);
+
+ if (data == 0) {
+ // re-establish the connection:
+ // synchronized here so that checkSocketResult() returns
+ // when new mKeepaliveSocket is available for next cmd
+ synchronized (this) {
+ setResultAndCloseControlSocket((byte) data);
+ s = mKeepaliveSocket = createServiceSocket();
+ }
+ } else {
+ // keep the socket
+ setSocketResult(data);
+ }
+ } else {
+ // service is gone
+ if (mControlSocketInUse) setSocketResult(-1);
+ break;
+ }
+ }
+ Log.d(mTag, "keepalive connection closed");
+ } catch (IOException e) {
+ Log.d(mTag, "keepalive socket broken: " + e.getMessage());
+ }
+
+ // Wait 5 seconds for the service to exit
+ success = blockUntil(SVC_STATE_STOPPED, 5);
+ Log.d(mTag, "stopping " + svc + ", success? " + success);
+ } else {
+ setState(ProcessState.STOPPED);
+ throw new IOException("cannot start service: " + svc);
+ }
+ }
+
+ private LocalSocket createServiceSocket() throws IOException {
+ LocalSocket s = new LocalSocket();
+ LocalSocketAddress a = new LocalSocketAddress(mSocketName,
+ LocalSocketAddress.Namespace.RESERVED);
+
+ // try a few times in case the service has not listen()ed
+ IOException excp = null;
+ for (int i = 0; i < 10; i++) {
+ try {
+ s.connect(a);
+ return s;
+ } catch (IOException e) {
+ Log.d(mTag, "service not yet listen()ing; try again");
+ excp = e;
+ sleep(500);
+ }
+ }
+ throw excp;
+ }
+
+ private OutputStream getControlSocketOutput() throws IOException {
+ if (mKeepaliveSocket != null) {
+ mControlSocketInUse = true;
+ mSocketResult = null;
+ return mKeepaliveSocket.getOutputStream();
+ } else {
+ throw new IOException("no control socket available");
+ }
+ }
+
+ private synchronized void checkSocketResult() throws IOException {
+ try {
+ // will be notified when the result comes back from service
+ if (mSocketResult == null) wait();
+ } catch (InterruptedException e) {
+ Log.d(mTag, "checkSocketResult(): " + e);
+ } finally {
+ mControlSocketInUse = false;
+ if ((mSocketResult == null) || (mSocketResult < 0)) {
+ throw new IOException("socket error, result from service: "
+ + mSocketResult);
+ }
+ }
+ }
+
+ private synchronized void setSocketResult(int result) {
+ if (mControlSocketInUse) {
+ mSocketResult = result;
+ notifyAll();
+ }
+ }
+
+ private void setResultAndCloseControlSocket(int result) {
+ setSocketResult(result);
+ try {
+ mKeepaliveSocket.shutdownInput();
+ mKeepaliveSocket.shutdownOutput();
+ mKeepaliveSocket.close();
+ } catch (IOException e) {
+ Log.e(mTag, "close keepalive socket", e);
+ } finally {
+ mKeepaliveSocket = null;
+ }
+ }
+
+ /**
+ * Waits for the process to be in the expected state. The method returns
+ * false if after the specified duration (in seconds), the process is still
+ * not in the expected state.
+ */
+ private boolean blockUntil(String expectedState, int waitTime) {
+ String cmd = SVC_STATE_CMD_PREFIX + mServiceName;
+ int sleepTime = 200; // ms
+ int n = waitTime * 1000 / sleepTime;
+ for (int i = 0; i < n; i++) {
+ if (expectedState.equals(SystemProperties.get(cmd))) {
+ Log.d(mTag, mServiceName + " is " + expectedState + " after "
+ + (i * sleepTime) + " msec");
+ break;
+ }
+ sleep(sleepTime);
+ }
+ return expectedState.equals(SystemProperties.get(cmd));
+ }
+
+ private void outputString(OutputStream out, String s) throws IOException {
+ out.write(s.getBytes());
+ out.write(0);
+ out.flush();
+ }
+
+ private void outputString2(OutputStream out, String s) throws IOException {
+ byte[] bytes = s.getBytes();
+ out.write(bytes.length);
+ out.write(bytes);
+ out.flush();
+ }
+}
diff --git a/packages/VpnServices/src/com/android/server/vpn/L2tpIpsecService.java b/packages/VpnServices/src/com/android/server/vpn/L2tpIpsecService.java
new file mode 100644
index 0000000..ce56921
--- /dev/null
+++ b/packages/VpnServices/src/com/android/server/vpn/L2tpIpsecService.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.vpn;
+
+import android.net.vpn.L2tpIpsecProfile;
+import android.security.Keystore;
+
+import java.io.IOException;
+
+/**
+ * The service that manages the L2TP-over-IPSec VPN connection.
+ */
+class L2tpIpsecService extends VpnService<L2tpIpsecProfile> {
+ private static final String IPSEC_SERVICE = "racoon";
+ private static final String L2TP_SERVICE = "mtpd";
+
+ @Override
+ protected void connect(String serverIp, String username, String password)
+ throws IOException {
+ String hostIp = getHostIp();
+
+ // IPSEC
+ AndroidServiceProxy ipsecService = startService(IPSEC_SERVICE);
+ ipsecService.sendCommand(
+ String.format("SETKEY %s %s", hostIp, serverIp));
+ ipsecService.sendCommand(String.format("SET_CERTS %s %s %s %s",
+ serverIp, getCaCertPath(), getUserCertPath(),
+ getUserkeyPath()));
+
+ // L2TP
+ AndroidServiceProxy l2tpService = startService(L2TP_SERVICE);
+ l2tpService.sendCommand2("l2tp", serverIp, "1701", "",
+ "file", getPppOptionFilePath(),
+ "name", username,
+ "password", password);
+ }
+
+ private String getCaCertPath() {
+ return Keystore.getInstance().getCertificate(
+ getProfile().getCaCertificate());
+ }
+
+ private String getUserCertPath() {
+ return Keystore.getInstance().getCertificate(
+ getProfile().getUserCertificate());
+ }
+
+ private String getUserkeyPath() {
+ return Keystore.getInstance().getUserkey(getProfile().getUserkey());
+ }
+}
diff --git a/packages/VpnServices/src/com/android/server/vpn/L2tpService.java b/packages/VpnServices/src/com/android/server/vpn/L2tpService.java
new file mode 100644
index 0000000..9aad7a1
--- /dev/null
+++ b/packages/VpnServices/src/com/android/server/vpn/L2tpService.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.vpn;
+
+import android.net.vpn.L2tpProfile;
+
+import java.io.IOException;
+
+/**
+ * The service that manages the L2TP VPN connection.
+ */
+class L2tpService extends VpnService<L2tpProfile> {
+ private static final String L2TP_SERVICE = "mtpd";
+
+ @Override
+ protected void connect(String serverIp, String username, String password)
+ throws IOException {
+ String hostIp = getHostIp();
+
+ // L2TP
+ AndroidServiceProxy l2tpService = startService(L2TP_SERVICE);
+ l2tpService.sendCommand2("l2tp", serverIp, "1701", "",
+ "file", getPppOptionFilePath(),
+ "name", username,
+ "password", password);
+ }
+
+}
diff --git a/packages/VpnServices/src/com/android/server/vpn/NormalProcessProxy.java b/packages/VpnServices/src/com/android/server/vpn/NormalProcessProxy.java
new file mode 100644
index 0000000..f20d85f
--- /dev/null
+++ b/packages/VpnServices/src/com/android/server/vpn/NormalProcessProxy.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.vpn;
+
+import android.util.Log;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.IOException;
+
+/**
+ * Proxy to perform a command with arguments.
+ */
+public class NormalProcessProxy extends ProcessProxy {
+ private Process mProcess;
+ private String[] mArgs;
+ private String mTag;
+
+ /**
+ * Creates a proxy with the arguments.
+ * @param args the argument list with the first one being the command
+ */
+ public NormalProcessProxy(String ...args) {
+ if ((args == null) || (args.length == 0)) {
+ throw new IllegalArgumentException();
+ }
+ mArgs = args;
+ mTag = "PProxy_" + getName();
+ }
+
+ @Override
+ public String getName() {
+ return mArgs[0];
+ }
+
+ @Override
+ public synchronized void stop() {
+ if (isStopped()) return;
+ getHostThread().interrupt();
+ // TODO: not sure how to reliably kill a process
+ mProcess.destroy();
+ setState(ProcessState.STOPPING);
+ }
+
+ @Override
+ protected void performTask() throws IOException, InterruptedException {
+ String[] args = mArgs;
+ Log.d(mTag, "+++++ Execute: " + getEntireCommand());
+ ProcessBuilder pb = new ProcessBuilder(args);
+ setState(ProcessState.RUNNING);
+ Process p = mProcess = pb.start();
+ BufferedReader reader = new BufferedReader(new InputStreamReader(
+ p.getInputStream()));
+ while (true) {
+ String line = reader.readLine();
+ if ((line == null) || isStopping()) break;
+ Log.d(mTag, line);
+ }
+
+ Log.d(mTag, "----- p.waitFor(): " + getName());
+ p.waitFor();
+ Log.d(mTag, "----- Done: " + getName());
+ }
+
+ private CharSequence getEntireCommand() {
+ String[] args = mArgs;
+ StringBuilder sb = new StringBuilder(args[0]);
+ for (int i = 1; i < args.length; i++) sb.append(' ').append(args[i]);
+ return sb;
+ }
+}
diff --git a/packages/VpnServices/src/com/android/server/vpn/ProcessProxy.java b/packages/VpnServices/src/com/android/server/vpn/ProcessProxy.java
new file mode 100644
index 0000000..14d7521
--- /dev/null
+++ b/packages/VpnServices/src/com/android/server/vpn/ProcessProxy.java
@@ -0,0 +1,210 @@
+/*
+ * Copyright (C) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.vpn;
+
+import android.os.ConditionVariable;
+
+import java.io.IOException;
+
+/**
+ * A proxy class that spawns a process to accomplish a certain task.
+ */
+public abstract class ProcessProxy {
+ /**
+ * Defines the interface to call back when the process is finished or an
+ * error occurs during execution.
+ */
+ public static interface Callback {
+ /**
+ * Called when the process is finished.
+ * @param proxy the proxy that hosts the process
+ */
+ void done(ProcessProxy proxy);
+
+ /**
+ * Called when some error occurs.
+ * @param proxy the proxy that hosts the process
+ */
+ void error(ProcessProxy proxy, Throwable error);
+ }
+
+ protected enum ProcessState {
+ STOPPED, STARTING, RUNNING, STOPPING, ERROR
+ }
+
+ private ProcessState mState = ProcessState.STOPPED;
+ private ConditionVariable mLock = new ConditionVariable();
+ private Thread mThread;
+
+ /**
+ * Returns the name of the process.
+ */
+ public abstract String getName();
+
+ /**
+ * Starts the process with a callback.
+ * @param callback the callback to get notified when the process is finished
+ * or an error occurs during execution
+ * @throws IOException when the process is already running or failed to
+ * start
+ */
+ public synchronized void start(final Callback callback) throws IOException {
+ if (!isStopped()) {
+ throw new IOException("Process is already running: " + this);
+ }
+ mLock.close();
+ setState(ProcessState.STARTING);
+ Thread thread = new Thread(new Runnable() {
+ public void run() {
+ try {
+ performTask();
+ setState(ProcessState.STOPPED);
+ mLock.open();
+ if (callback != null) callback.done(ProcessProxy.this);
+ } catch (Throwable e) {
+ setState(ProcessState.ERROR);
+ if (callback != null) callback.error(ProcessProxy.this, e);
+ } finally {
+ mThread = null;
+ }
+ }
+ });
+ thread.setPriority(Thread.MIN_PRIORITY);
+ thread.start();
+ mThread = thread;
+ if (!waitUntilRunning()) {
+ throw new IOException("Failed to start the process: " + this);
+ }
+ }
+
+ /**
+ * Starts the process.
+ * @throws IOException when the process is already running or failed to
+ * start
+ */
+ public synchronized void start() throws IOException {
+ start(null);
+ if (!waitUntilDone()) {
+ throw new IOException("Failed to complete the process: " + this);
+ }
+ }
+
+ /**
+ * Returns the thread that hosts the process.
+ */
+ public Thread getHostThread() {
+ return mThread;
+ }
+
+ /**
+ * Blocks the current thread until the hosted process is finished.
+ *
+ * @return true if the process is finished normally; false if an error
+ * occurs
+ */
+ public boolean waitUntilDone() {
+ while (!mLock.block(1000)) {
+ if (isStopped() || isInError()) break;
+ }
+ return isStopped();
+ }
+
+ /**
+ * Blocks the current thread until the hosted process is running.
+ *
+ * @return true if the process is running normally; false if the process
+ * is in another state
+ */
+ private boolean waitUntilRunning() {
+ for (;;) {
+ if (!isStarting()) break;
+ }
+ return isRunning();
+ }
+
+ /**
+ * Stops and destroys the process.
+ */
+ public abstract void stop();
+
+ /**
+ * Checks whether the process is finished.
+ * @return true if the process is stopped
+ */
+ public boolean isStopped() {
+ return (mState == ProcessState.STOPPED);
+ }
+
+ /**
+ * Checks whether the process is being stopped.
+ * @return true if the process is being stopped
+ */
+ public boolean isStopping() {
+ return (mState == ProcessState.STOPPING);
+ }
+
+ /**
+ * Checks whether the process is being started.
+ * @return true if the process is being started
+ */
+ public boolean isStarting() {
+ return (mState == ProcessState.STARTING);
+ }
+
+ /**
+ * Checks whether the process is running.
+ * @return true if the process is running
+ */
+ public boolean isRunning() {
+ return (mState == ProcessState.RUNNING);
+ }
+
+ /**
+ * Checks whether some error has occurred and the process is stopped.
+ * @return true if some error has occurred and the process is stopped
+ */
+ public boolean isInError() {
+ return (mState == ProcessState.ERROR);
+ }
+
+ /**
+ * Performs the actual task. Subclasses must make sure that the method
+ * is blocked until the task is done or an error occurs.
+ */
+ protected abstract void performTask()
+ throws IOException, InterruptedException;
+
+ /**
+ * Sets the process state.
+ * @param state the new state to be in
+ */
+ protected void setState(ProcessState state) {
+ mState = state;
+ }
+
+ /**
+ * Makes the current thread sleep for the specified time.
+ * @param msec time to sleep in miliseconds
+ */
+ protected void sleep(int msec) {
+ try {
+ Thread.currentThread().sleep(msec);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/packages/VpnServices/src/com/android/server/vpn/VpnService.java b/packages/VpnServices/src/com/android/server/vpn/VpnService.java
new file mode 100644
index 0000000..fdefe9c
--- /dev/null
+++ b/packages/VpnServices/src/com/android/server/vpn/VpnService.java
@@ -0,0 +1,627 @@
+/*
+ * Copyright (C) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.vpn;
+
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.net.vpn.VpnManager;
+import android.net.vpn.VpnProfile;
+import android.net.vpn.VpnState;
+import android.os.FileObserver;
+import android.os.SystemProperties;
+import android.util.Log;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.Socket;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * The service base class for managing a type of VPN connection.
+ */
+abstract class VpnService<E extends VpnProfile> {
+ private static final int NOTIFICATION_ID = 1;
+ private static final String PROFILES_ROOT = VpnManager.PROFILES_PATH + "/";
+ public static final String DEFAULT_CONFIG_PATH = "/etc";
+
+ private static final int DNS_TIMEOUT = 3000; // ms
+ private static final String DNS1 = "net.dns1";
+ private static final String DNS2 = "net.dns2";
+ private static final String REMOTE_IP = "net.ipremote";
+ private static final String DNS_DOMAIN_SUFFICES = "net.dns.search";
+ private static final String SERVER_IP = "net.vpn.server_ip";
+
+ private static final int VPN_TIMEOUT = 30000; // milliseconds
+ private static final int ONE_SECOND = 1000; // milliseconds
+ private static final int FIVE_SECOND = 5000; // milliseconds
+
+ private static final String LOGWRAPPER = "/system/bin/logwrapper";
+ private final String TAG = VpnService.class.getSimpleName();
+
+ E mProfile;
+ VpnServiceBinder mContext;
+
+ private VpnState mState = VpnState.IDLE;
+ private boolean mInError;
+
+ // connection settings
+ private String mOriginalDns1;
+ private String mOriginalDns2;
+ private String mVpnDns1 = "";
+ private String mVpnDns2 = "";
+ private String mOriginalDomainSuffices;
+ private String mHostIp;
+
+ private long mStartTime; // VPN connection start time
+
+ // monitors if the VPN connection is sucessfully established
+ private FileMonitor mConnectMonitor;
+
+ // watch dog timer; fired up if the connection cannot be established within
+ // VPN_TIMEOUT
+ private Object mWatchdog;
+
+ // for helping managing multiple Android services
+ private ServiceHelper mServiceHelper = new ServiceHelper();
+
+ // for helping showing, updating notification
+ private NotificationHelper mNotification = new NotificationHelper();
+
+ /**
+ * Establishes a VPN connection with the specified username and password.
+ */
+ protected abstract void connect(String serverIp, String username,
+ String password) throws IOException;
+
+ /**
+ * Tears down the VPN connection. The base class simply terminates all the
+ * Android services. A subclass may need to do some clean-up before that.
+ */
+ protected void disconnect() {
+ }
+
+ /**
+ * Starts an Android service defined in init.rc.
+ */
+ protected AndroidServiceProxy startService(String serviceName)
+ throws IOException {
+ return mServiceHelper.startService(serviceName);
+ }
+
+ protected String getPppOptionFilePath() throws IOException {
+ String subpath = getProfileSubpath("/ppp/peers");
+ String[] kids = new File(subpath).list();
+ if ((kids == null) || (kids.length == 0)) {
+ throw new IOException("no option file found in " + subpath);
+ }
+ if (kids.length > 1) {
+ Log.w(TAG, "more than one option file found in " + subpath
+ + ", arbitrarily choose " + kids[0]);
+ }
+ return subpath + "/" + kids[0];
+ }
+
+ /**
+ * Returns the VPN profile associated with the connection.
+ */
+ protected E getProfile() {
+ return mProfile;
+ }
+
+ /**
+ * Returns the profile path where configuration files reside.
+ */
+ protected String getProfilePath() throws IOException {
+ String path = PROFILES_ROOT + mProfile.getId();
+ File dir = new File(path);
+ if (!dir.exists()) throw new IOException("Profile dir does not exist");
+ return path;
+ }
+
+ /**
+ * Returns the path where default configuration files reside.
+ */
+ protected String getDefaultConfigPath() throws IOException {
+ return DEFAULT_CONFIG_PATH;
+ }
+
+ /**
+ * Returns the host IP for establishing the VPN connection.
+ */
+ protected String getHostIp() throws IOException {
+ if (mHostIp == null) mHostIp = reallyGetHostIp();
+ return mHostIp;
+ }
+
+ /**
+ * Returns the IP of the specified host name.
+ */
+ protected String getIp(String hostName) throws IOException {
+ InetAddress iaddr = InetAddress.getByName(hostName);
+ byte[] aa = iaddr.getAddress();
+ StringBuilder sb = new StringBuilder().append(byteToInt(aa[0]));
+ for (int i = 1; i < aa.length; i++) {
+ sb.append(".").append(byteToInt(aa[i]));
+ }
+ return sb.toString();
+ }
+
+ /**
+ * Returns the path of the script file that is executed when the VPN
+ * connection is established.
+ */
+ protected String getConnectMonitorFile() {
+ return "/etc/ppp/ip-up";
+ }
+
+ /**
+ * Sets the system property. The method is blocked until the value is
+ * settled in.
+ * @param name the name of the property
+ * @param value the value of the property
+ * @throws IOException if it fails to set the property within 2 seconds
+ */
+ protected void setSystemProperty(String name, String value)
+ throws IOException {
+ SystemProperties.set(name, value);
+ for (int i = 0; i < 5; i++) {
+ String v = SystemProperties.get(name);
+ if (v.equals(value)) {
+ return;
+ } else {
+ Log.d(TAG, "sys_prop: wait for " + name + " to settle in");
+ sleep(400);
+ }
+ }
+ throw new IOException("Failed to set system property: " + name);
+ }
+
+ void setContext(VpnServiceBinder context, E profile) {
+ mContext = context;
+ mProfile = profile;
+ }
+
+ VpnState getState() {
+ return mState;
+ }
+
+ synchronized void onConnect(String username, String password)
+ throws IOException {
+ mState = VpnState.CONNECTING;
+ broadcastConnectivity(VpnState.CONNECTING);
+
+ String serverIp = getIp(getProfile().getServerName());
+ setSystemProperty(SERVER_IP, serverIp);
+ onBeforeConnect();
+
+ connect(serverIp, username, password);
+ }
+
+ synchronized void onDisconnect(boolean cleanUpServices) {
+ try {
+ mState = VpnState.DISCONNECTING;
+ broadcastConnectivity(VpnState.DISCONNECTING);
+ mNotification.showDisconnect();
+
+ // subclass implementation
+ if (cleanUpServices) disconnect();
+
+ mServiceHelper.stop();
+ } catch (Throwable e) {
+ Log.e(TAG, "onError()", e);
+ onFinalCleanUp();
+ }
+ }
+
+ synchronized void onError() {
+ // error may occur during or after connection setup
+ // and it may be due to one or all services gone
+ mInError = true;
+ switch (mState) {
+ case CONNECTED:
+ onDisconnect(true);
+ break;
+
+ case CONNECTING:
+ onDisconnect(false);
+ break;
+ }
+ }
+
+ private void createConnectMonitor() {
+ mConnectMonitor = new FileMonitor(getConnectMonitorFile(),
+ new Runnable() {
+ public void run() {
+ onConnectMonitorTriggered();
+ }
+ });
+ }
+
+ private void onBeforeConnect() {
+ mNotification.disableNotification();
+
+ createConnectMonitor();
+ mConnectMonitor.startWatching();
+ saveOriginalDnsProperties();
+
+ mWatchdog = startTimer(VPN_TIMEOUT, new Runnable() {
+ public void run() {
+ synchronized (VpnService.this) {
+ if (mState == VpnState.CONNECTING) {
+ Log.d(TAG, " watchdog timer is fired !!");
+ onError();
+ }
+ }
+ }
+ });
+ }
+
+ private synchronized void onConnectMonitorTriggered() {
+ Log.d(TAG, "onConnectMonitorTriggered()");
+
+ stopTimer(mWatchdog);
+ mConnectMonitor.stopWatching();
+ saveVpnDnsProperties();
+ saveAndSetDomainSuffices();
+ startConnectivityMonitor();
+
+ mState = VpnState.CONNECTED;
+ broadcastConnectivity(VpnState.CONNECTED);
+ }
+
+ private synchronized void onFinalCleanUp() {
+ Log.d(TAG, "onFinalCleanUp()");
+
+ if (mState == VpnState.IDLE) return;
+
+ // keep the notification when error occurs
+ if (!mInError) mNotification.disableNotification();
+
+ restoreOriginalDnsProperties();
+ restoreOriginalDomainSuffices();
+ if (mConnectMonitor != null) mConnectMonitor.stopWatching();
+ if (mWatchdog != null) stopTimer(mWatchdog);
+ mState = VpnState.IDLE;
+ broadcastConnectivity(VpnState.IDLE);
+
+ // stop the service itself
+ mContext.stopSelf();
+ }
+
+ private synchronized void onOneServiceGone() {
+ switch (mState) {
+ case IDLE:
+ case DISCONNECTING:
+ break;
+
+ default:
+ onError();
+ }
+ }
+
+ private synchronized void onAllServicesGone() {
+ switch (mState) {
+ case IDLE:
+ break;
+
+ case DISCONNECTING:
+ // daemons are gone; now clean up everything
+ onFinalCleanUp();
+ break;
+
+ default:
+ onError();
+ }
+ }
+
+ private void saveOriginalDnsProperties() {
+ mOriginalDns1 = SystemProperties.get(DNS1);
+ mOriginalDns2 = SystemProperties.get(DNS2);
+ Log.d(TAG, String.format("save original dns prop: %s, %s",
+ mOriginalDns1, mOriginalDns2));
+ }
+
+ private void restoreOriginalDnsProperties() {
+ // restore only if they are not overridden
+ if (mVpnDns1.equals(SystemProperties.get(DNS1))) {
+ Log.d(TAG, String.format("restore original dns prop: %s --> %s",
+ SystemProperties.get(DNS1), mOriginalDns1));
+ Log.d(TAG, String.format("restore original dns prop: %s --> %s",
+ SystemProperties.get(DNS2), mOriginalDns2));
+ SystemProperties.set(DNS1, mOriginalDns1);
+ SystemProperties.set(DNS2, mOriginalDns2);
+ }
+ }
+
+ private void saveVpnDnsProperties() {
+ mVpnDns1 = mVpnDns2 = "";
+ for (int i = 0; i < 10; i++) {
+ mVpnDns1 = SystemProperties.get(DNS1);
+ mVpnDns2 = SystemProperties.get(DNS2);
+ if (mVpnDns1.equals(mOriginalDns1)) {
+ Log.d(TAG, "wait for vpn dns to settle in..." + i);
+ sleep(500);
+ } else {
+ Log.d(TAG, String.format("save vpn dns prop: %s, %s",
+ mVpnDns1, mVpnDns2));
+ return;
+ }
+ }
+ Log.e(TAG, "saveVpnDnsProperties(): DNS not updated??");
+ }
+
+ private void restoreVpnDnsProperties() {
+ if (isNullOrEmpty(mVpnDns1) && isNullOrEmpty(mVpnDns2)) {
+ return;
+ }
+ Log.d(TAG, String.format("restore vpn dns prop: %s --> %s",
+ SystemProperties.get(DNS1), mVpnDns1));
+ Log.d(TAG, String.format("restore vpn dns prop: %s --> %s",
+ SystemProperties.get(DNS2), mVpnDns2));
+ SystemProperties.set(DNS1, mVpnDns1);
+ SystemProperties.set(DNS2, mVpnDns2);
+ }
+
+ private void saveAndSetDomainSuffices() {
+ mOriginalDomainSuffices = SystemProperties.get(DNS_DOMAIN_SUFFICES);
+ Log.d(TAG, "save original dns search: " + mOriginalDomainSuffices);
+ String list = mProfile.getDomainSuffices();
+ if (!isNullOrEmpty(list)) {
+ SystemProperties.set(DNS_DOMAIN_SUFFICES, list);
+ }
+ }
+
+ private void restoreOriginalDomainSuffices() {
+ Log.d(TAG, "restore original dns search --> " + mOriginalDomainSuffices);
+ SystemProperties.set(DNS_DOMAIN_SUFFICES, mOriginalDomainSuffices);
+ }
+
+ private void broadcastConnectivity(VpnState s) {
+ new VpnManager(mContext).broadcastConnectivity(mProfile.getName(), s);
+ }
+
+ private void startConnectivityMonitor() {
+ mStartTime = System.currentTimeMillis();
+
+ new Thread(new Runnable() {
+ public void run() {
+ Log.d(TAG, " +++++ connectivity monitor running");
+ try {
+ for (;;) {
+ synchronized (VpnService.this) {
+ if (mState != VpnState.CONNECTED) break;
+ mNotification.update();
+ checkConnectivity();
+ VpnService.this.wait(ONE_SECOND);
+ }
+ }
+ } catch (InterruptedException e) {
+ Log.e(TAG, "connectivity monitor", e);
+ }
+ Log.d(TAG, " ----- connectivity monitor stopped");
+ }
+ }).start();
+ }
+
+ private void checkConnectivity() {
+ checkDnsProperties();
+ }
+
+ private void checkDnsProperties() {
+ String dns1 = SystemProperties.get(DNS1);
+ if (!mVpnDns1.equals(dns1)) {
+ Log.w(TAG, " @@ !!! dns being overridden");
+ onError();
+ }
+ }
+
+ private Object startTimer(final int milliseconds, final Runnable task) {
+ Thread thread = new Thread(new Runnable() {
+ public void run() {
+ Log.d(TAG, "watchdog timer started");
+ Thread t = Thread.currentThread();
+ try {
+ synchronized (t) {
+ t.wait(milliseconds);
+ }
+ task.run();
+ } catch (InterruptedException e) {
+ // ignored
+ }
+ Log.d(TAG, "watchdog timer stopped");
+ }
+ });
+ thread.start();
+ return thread;
+ }
+
+ private void stopTimer(Object timer) {
+ synchronized (timer) {
+ timer.notify();
+ }
+ }
+
+ private String reallyGetHostIp() throws IOException {
+ Socket s = new Socket();
+ s.connect(new InetSocketAddress("www.google.com", 80), DNS_TIMEOUT);
+ String ipAddress = s.getLocalAddress().getHostAddress();
+ Log.d(TAG, "Host IP: " + ipAddress);
+ s.close();
+ return ipAddress;
+ }
+
+ private String getProfileSubpath(String subpath) throws IOException {
+ String path = getProfilePath() + subpath;
+ if (new File(path).exists()) {
+ return path;
+ } else {
+ Log.w(TAG, "Profile subpath does not exist: " + path
+ + ", use default one");
+ String path2 = getDefaultConfigPath() + subpath;
+ if (!new File(path2).exists()) {
+ throw new IOException("Profile subpath does not exist at "
+ + path + " or " + path2);
+ }
+ return path2;
+ }
+ }
+
+ private void sleep(int ms) {
+ try {
+ Thread.currentThread().sleep(ms);
+ } catch (InterruptedException e) {
+ }
+ }
+
+ private static boolean isNullOrEmpty(String message) {
+ return ((message == null) || (message.length() == 0));
+ }
+
+ private static int byteToInt(byte b) {
+ return ((int) b) & 0x0FF;
+ }
+
+ private class ServiceHelper implements ProcessProxy.Callback {
+ private List<AndroidServiceProxy> mServiceList =
+ new ArrayList<AndroidServiceProxy>();
+
+ // starts an Android service
+ AndroidServiceProxy startService(String serviceName)
+ throws IOException {
+ AndroidServiceProxy service = new AndroidServiceProxy(serviceName);
+ mServiceList.add(service);
+ service.start(this);
+ return service;
+ }
+
+ // stops all the Android services
+ void stop() {
+ if (mServiceList.isEmpty()) {
+ onFinalCleanUp();
+ } else {
+ for (AndroidServiceProxy s : mServiceList) s.stop();
+ }
+ }
+
+ //@Override
+ public void done(ProcessProxy p) {
+ Log.d(TAG, "service done: " + p.getName());
+ commonCallback((AndroidServiceProxy) p);
+ }
+
+ //@Override
+ public void error(ProcessProxy p, Throwable e) {
+ Log.e(TAG, "service error: " + p.getName(), e);
+ commonCallback((AndroidServiceProxy) p);
+ }
+
+ private void commonCallback(AndroidServiceProxy service) {
+ mServiceList.remove(service);
+ onOneServiceGone();
+ if (mServiceList.isEmpty()) onAllServicesGone();
+ }
+ }
+
+ private class FileMonitor extends FileObserver {
+ private Runnable mCallback;
+
+ FileMonitor(String path, Runnable callback) {
+ super(path, CLOSE_NOWRITE);
+ mCallback = callback;
+ }
+
+ @Override
+ public void onEvent(int event, String path) {
+ if ((event & CLOSE_NOWRITE) > 0) mCallback.run();
+ }
+ }
+
+ // Helper class for showing, updating notification.
+ private class NotificationHelper {
+ void update() {
+ String title = getNotificationTitle(true);
+ Notification n = new Notification(R.drawable.vpn_connected, title,
+ mStartTime);
+ n.setLatestEventInfo(mContext, title,
+ getNotificationMessage(true), prepareNotificationIntent());
+ n.flags |= Notification.FLAG_NO_CLEAR;
+ n.flags |= Notification.FLAG_ONGOING_EVENT;
+ enableNotification(n);
+ }
+
+ void showDisconnect() {
+ String title = getNotificationTitle(false);
+ Notification n = new Notification(R.drawable.vpn_disconnected,
+ title, System.currentTimeMillis());
+ n.setLatestEventInfo(mContext, title,
+ getNotificationMessage(false), prepareNotificationIntent());
+ n.flags |= Notification.FLAG_AUTO_CANCEL;
+ disableNotification();
+ enableNotification(n);
+ }
+
+ void disableNotification() {
+ ((NotificationManager) mContext.getSystemService(
+ Context.NOTIFICATION_SERVICE)).cancel(NOTIFICATION_ID);
+ }
+
+ private void enableNotification(Notification n) {
+ ((NotificationManager) mContext.getSystemService(
+ Context.NOTIFICATION_SERVICE)).notify(NOTIFICATION_ID, n);
+ }
+
+ private PendingIntent prepareNotificationIntent() {
+ return PendingIntent.getActivity(mContext, 0,
+ new VpnManager(mContext).createSettingsActivityIntent(), 0);
+ }
+
+ private String getNotificationTitle(boolean connected) {
+ String connectedOrNot = connected
+ ? mContext.getString(R.string.vpn_notification_connected)
+ : mContext.getString(
+ R.string.vpn_notification_disconnected);
+ return String.format(
+ mContext.getString(R.string.vpn_notification_title),
+ mProfile.getName(), connectedOrNot);
+ }
+
+ private String getTimeFormat(long duration) {
+ long hours = duration / 3600;
+ StringBuilder sb = new StringBuilder();
+ if (hours > 0) sb.append(hours).append(':');
+ sb.append(String.format("%02d:%02d", (duration % 3600 / 60),
+ (duration % 60)));
+ return sb.toString();
+ }
+
+ private String getNotificationMessage(boolean connected) {
+ if (connected) {
+ long time = (System.currentTimeMillis() - mStartTime) / 1000;
+ return String.format(mContext.getString(
+ R.string.vpn_notification_connected_message),
+ getTimeFormat(time));
+ } else {
+ return "";
+ }
+ }
+ }
+}
diff --git a/packages/VpnServices/src/com/android/server/vpn/VpnServiceBinder.java b/packages/VpnServices/src/com/android/server/vpn/VpnServiceBinder.java
new file mode 100644
index 0000000..7195ea61
--- /dev/null
+++ b/packages/VpnServices/src/com/android/server/vpn/VpnServiceBinder.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.vpn;
+
+import android.app.Service;
+import android.content.Intent;
+import android.net.vpn.IVpnService;
+import android.net.vpn.L2tpIpsecProfile;
+import android.net.vpn.L2tpProfile;
+import android.net.vpn.VpnManager;
+import android.net.vpn.VpnProfile;
+import android.net.vpn.VpnState;
+import android.os.IBinder;
+import android.util.Log;
+
+import java.io.IOException;
+
+/**
+ * The service class for managing a VPN connection. It implements the
+ * {@link IVpnService} binder interface.
+ */
+public class VpnServiceBinder extends Service {
+ private final String TAG = VpnServiceBinder.class.getSimpleName();
+
+ // The actual implementation is delegated to the VpnService class.
+ private VpnService<? extends VpnProfile> mService;
+
+ private final IBinder mBinder = new IVpnService.Stub() {
+ public boolean connect(VpnProfile p, String username, String password) {
+ return VpnServiceBinder.this.connect(p, username, password);
+ }
+
+ public void disconnect() {
+ if (mService != null) mService.onDisconnect(true);
+ }
+
+ public void checkStatus(VpnProfile p) {
+ VpnServiceBinder.this.checkStatus(p);
+ }
+ };
+
+ public IBinder onBind(Intent intent) {
+ return mBinder;
+ }
+
+ private synchronized boolean connect(
+ VpnProfile p, String username, String password) {
+ if (mService != null) return false;
+ try {
+ mService = createService(p);
+ mService.onConnect(username, password);
+ return true;
+ } catch (Throwable e) {
+ Log.e(TAG, "connect()", e);
+ if (mService != null) mService.onError();
+ return false;
+ }
+ }
+
+ private synchronized void checkStatus(VpnProfile p) {
+ if (mService == null) broadcastConnectivity(p.getName(), VpnState.IDLE);
+
+ if (!p.getName().equals(mService.mProfile.getName())) {
+ broadcastConnectivity(p.getName(), VpnState.IDLE);
+ } else {
+ broadcastConnectivity(p.getName(), mService.getState());
+ }
+ }
+
+ private VpnService<? extends VpnProfile> createService(VpnProfile p) {
+ switch (p.getType()) {
+ case L2TP_IPSEC:
+ L2tpIpsecService l2tpIpsec = new L2tpIpsecService();
+ l2tpIpsec.setContext(this, (L2tpIpsecProfile) p);
+ return l2tpIpsec;
+
+ case L2TP:
+ L2tpService l2tp = new L2tpService();
+ l2tp.setContext(this, (L2tpProfile) p);
+ return l2tp;
+
+ default:
+ return null;
+ }
+ }
+
+ private void broadcastConnectivity(String name, VpnState s) {
+ new VpnManager(this).broadcastConnectivity(name, s);
+ }
+}
diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java
index d3067ec..47a6ede 100644
--- a/services/java/com/android/server/BackupManagerService.java
+++ b/services/java/com/android/server/BackupManagerService.java
@@ -51,11 +51,13 @@
import com.android.internal.backup.GoogleTransport;
import com.android.internal.backup.IBackupTransport;
+import java.io.EOFException;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
+import java.io.RandomAccessFile;
import java.lang.String;
import java.util.ArrayList;
import java.util.HashMap;
@@ -122,6 +124,9 @@
private File mStateDir;
private File mDataDir;
+ private File mJournalDir;
+ private File mJournal;
+ private RandomAccessFile mJournalStream;
public BackupManagerService(Context context) {
mContext = context;
@@ -133,6 +138,11 @@
mStateDir.mkdirs();
mDataDir = Environment.getDownloadCacheDirectory();
+ // Set up the backup-request journaling
+ mJournalDir = new File(mStateDir, "pending");
+ mJournalDir.mkdirs();
+ makeJournalLocked(); // okay because no other threads are running yet
+
//!!! TODO: default to cloud transport, not local
mTransportId = BackupManager.TRANSPORT_LOCAL;
@@ -141,6 +151,10 @@
addPackageParticipantsLocked(null);
}
+ // Now that we know about valid backup participants, parse any
+ // leftover journal files and schedule a new backup pass
+ parseLeftoverJournals();
+
// Register for broadcasts about package install, etc., so we can
// update the provider list.
IntentFilter filter = new IntentFilter();
@@ -150,6 +164,46 @@
mContext.registerReceiver(mBroadcastReceiver, filter);
}
+ private void makeJournalLocked() {
+ try {
+ mJournal = File.createTempFile("journal", null, mJournalDir);
+ mJournalStream = new RandomAccessFile(mJournal, "rwd");
+ } catch (IOException e) {
+ Log.e(TAG, "Unable to write backup journals");
+ mJournal = null;
+ mJournalStream = null;
+ }
+ }
+
+ private void parseLeftoverJournals() {
+ if (mJournal != null) {
+ File[] allJournals = mJournalDir.listFiles();
+ for (File f : allJournals) {
+ if (f.compareTo(mJournal) != 0) {
+ // This isn't the current journal, so it must be a leftover. Read
+ // out the package names mentioned there and schedule them for
+ // backup.
+ try {
+ Log.i(TAG, "Found stale backup journal, scheduling:");
+ RandomAccessFile in = new RandomAccessFile(f, "r");
+ while (true) {
+ String packageName = in.readUTF();
+ Log.i(TAG, " + " + packageName);
+ dataChanged(packageName);
+ }
+ } catch (EOFException e) {
+ // no more data; we're done
+ } catch (Exception e) {
+ // can't read it or other error; just skip it
+ } finally {
+ // close/delete the file
+ f.delete();
+ }
+ }
+ }
+ }
+ }
+
// ----- Track installation/removal of packages -----
BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
@@ -198,6 +252,8 @@
switch (msg.what) {
case MSG_RUN_BACKUP:
// snapshot the pending-backup set and work on that
+ File oldJournal = mJournal;
+ RandomAccessFile oldJournalStream = mJournalStream;
synchronized (mQueueLock) {
if (mBackupQueue == null) {
mBackupQueue = new ArrayList<BackupRequest>();
@@ -207,10 +263,22 @@
mPendingBackups = new HashMap<ApplicationInfo,BackupRequest>();
}
// !!! TODO: start a new backup-queue journal file too
- // WARNING: If we crash after this line, anything in mPendingBackups will
- // be lost. FIX THIS.
+ if (mJournalStream != null) {
+ try {
+ mJournalStream.close();
+ } catch (IOException e) {
+ // don't need to do anything
+ }
+ makeJournalLocked();
+ }
+
+ // At this point, we have started a new journal file, and the old
+ // file identity is being passed to the backup processing thread.
+ // When it completes successfully, that old journal file will be
+ // deleted. If we crash prior to that, the old journal is parsed
+ // at next boot and the journaled requests fulfilled.
}
- (new PerformBackupThread(mTransportId, mBackupQueue)).run();
+ (new PerformBackupThread(mTransportId, mBackupQueue, oldJournal)).run();
break;
case MSG_RUN_FULL_BACKUP:
@@ -433,10 +501,13 @@
private static final String TAG = "PerformBackupThread";
int mTransport;
ArrayList<BackupRequest> mQueue;
+ File mJournal;
- public PerformBackupThread(int transportId, ArrayList<BackupRequest> queue) {
+ public PerformBackupThread(int transportId, ArrayList<BackupRequest> queue,
+ File journal) {
mTransport = transportId;
mQueue = queue;
+ mJournal = journal;
}
@Override
@@ -468,6 +539,10 @@
Log.e(TAG, "Error ending transport");
e.printStackTrace();
}
+
+ if (!mJournal.delete()) {
+ Log.e(TAG, "Unable to remove backup journal file " + mJournal.getAbsolutePath());
+ }
}
private void doQueuedBackups(IBackupTransport transport) {
@@ -782,7 +857,9 @@
// one already there, then overwrite it, but no harm done.
BackupRequest req = new BackupRequest(app, false);
mPendingBackups.put(app, req);
- // !!! TODO: write to the pending-backup journal file in case of crash
+
+ // Journal this request in case of crash
+ writeToJournalLocked(packageName);
}
}
@@ -804,6 +881,18 @@
}
}
+ private void writeToJournalLocked(String str) {
+ if (mJournalStream != null) {
+ try {
+ mJournalStream.writeUTF(str);
+ } catch (IOException e) {
+ Log.e(TAG, "Error writing to backup journal");
+ mJournalStream = null;
+ mJournal = null;
+ }
+ }
+ }
+
// Schedule a backup pass for a given package. This method will schedule a
// full backup even for apps that do not declare an android:backupAgent, so
// use with care.
diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java
index 828b8aa..3b47ae7 100644
--- a/services/java/com/android/server/WindowManagerService.java
+++ b/services/java/com/android/server/WindowManagerService.java
@@ -174,6 +174,10 @@
*/
static final int DIM_DURATION_MULTIPLIER = 6;
+ static final int INJECT_FAILED = 0;
+ static final int INJECT_SUCCEEDED = 1;
+ static final int INJECT_NO_PERMISSION = -1;
+
static final int UPDATE_FOCUS_NORMAL = 0;
static final int UPDATE_FOCUS_WILL_ASSIGN_LAYERS = 1;
static final int UPDATE_FOCUS_PLACING_SURFACES = 2;
@@ -1317,7 +1321,7 @@
// Update Orientation after adding a window, only if the window needs to be
// displayed right away
if (win.isVisibleOrAdding()) {
- if (updateOrientationFromAppTokens(null, null) != null) {
+ if (updateOrientationFromAppTokensUnchecked(null, null) != null) {
sendNewConfiguration();
}
}
@@ -1956,7 +1960,7 @@
public void addWindowToken(IBinder token, int type) {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
"addWindowToken()")) {
- return;
+ throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
synchronized(mWindowMap) {
@@ -1974,7 +1978,7 @@
public void removeWindowToken(IBinder token) {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
"removeWindowToken()")) {
- return;
+ throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
final long origId = Binder.clearCallingIdentity();
@@ -2027,7 +2031,7 @@
int groupId, int requestedOrientation, boolean fullscreen) {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
"addAppToken()")) {
- return;
+ throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
synchronized(mWindowMap) {
@@ -2056,7 +2060,7 @@
public void setAppGroupId(IBinder token, int groupId) {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
"setAppStartingIcon()")) {
- return;
+ throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
synchronized(mWindowMap) {
@@ -2154,8 +2158,22 @@
public Configuration updateOrientationFromAppTokens(
Configuration currentConfig, IBinder freezeThisOneIfNeeded) {
+ if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
+ "updateOrientationFromAppTokens()")) {
+ throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
+ }
+
Configuration config;
long ident = Binder.clearCallingIdentity();
+ config = updateOrientationFromAppTokensUnchecked(currentConfig,
+ freezeThisOneIfNeeded);
+ Binder.restoreCallingIdentity(ident);
+ return config;
+ }
+
+ Configuration updateOrientationFromAppTokensUnchecked(
+ Configuration currentConfig, IBinder freezeThisOneIfNeeded) {
+ Configuration config;
synchronized(mWindowMap) {
config = updateOrientationFromAppTokensLocked(currentConfig, freezeThisOneIfNeeded);
}
@@ -2163,7 +2181,6 @@
mLayoutNeeded = true;
performLayoutAndPlaceSurfacesLocked();
}
- Binder.restoreCallingIdentity(ident);
return config;
}
@@ -2235,7 +2252,7 @@
public void setAppOrientation(IApplicationToken token, int requestedOrientation) {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
"setAppOrientation()")) {
- return;
+ throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
synchronized(mWindowMap) {
@@ -2263,7 +2280,7 @@
public void setFocusedApp(IBinder token, boolean moveFocusNow) {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
"setFocusedApp()")) {
- return;
+ throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
synchronized(mWindowMap) {
@@ -2296,7 +2313,7 @@
public void prepareAppTransition(int transit) {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
"prepareAppTransition()")) {
- return;
+ throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
synchronized(mWindowMap) {
@@ -2325,7 +2342,7 @@
public void executeAppTransition() {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
"executeAppTransition()")) {
- return;
+ throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
synchronized(mWindowMap) {
@@ -2345,7 +2362,7 @@
IBinder transferFrom, boolean createIfNeeded) {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
"setAppStartingIcon()")) {
- return;
+ throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
synchronized(mWindowMap) {
@@ -2479,7 +2496,7 @@
public void setAppWillBeHidden(IBinder token) {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
"setAppWillBeHidden()")) {
- return;
+ throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
AppWindowToken wtoken;
@@ -2590,7 +2607,7 @@
public void setAppVisibility(IBinder token, boolean visible) {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
"setAppVisibility()")) {
- return;
+ throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
AppWindowToken wtoken;
@@ -2720,7 +2737,7 @@
public void startAppFreezingScreen(IBinder token, int configChanges) {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
"setAppFreezingScreen()")) {
- return;
+ throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
synchronized(mWindowMap) {
@@ -2743,7 +2760,7 @@
public void stopAppFreezingScreen(IBinder token, boolean force) {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
"setAppFreezingScreen()")) {
- return;
+ throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
synchronized(mWindowMap) {
@@ -2762,7 +2779,7 @@
public void removeAppToken(IBinder token) {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
"removeAppToken()")) {
- return;
+ throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
AppWindowToken wtoken = null;
@@ -2930,7 +2947,7 @@
public void moveAppToken(int index, IBinder token) {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
"moveAppToken()")) {
- return;
+ throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
synchronized(mWindowMap) {
@@ -3012,7 +3029,7 @@
public void moveAppTokensToTop(List<IBinder> tokens) {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
"moveAppTokensToTop()")) {
- return;
+ throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
final long origId = Binder.clearCallingIdentity();
@@ -3033,7 +3050,7 @@
public void moveAppTokensToBottom(List<IBinder> tokens) {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
"moveAppTokensToBottom()")) {
- return;
+ throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
final long origId = Binder.clearCallingIdentity();
@@ -3120,7 +3137,7 @@
public void setAnimationScale(int which, float scale) {
if (!checkCallingPermission(android.Manifest.permission.SET_ANIMATION_SCALE,
"setAnimationScale()")) {
- return;
+ throw new SecurityException("Requires SET_ANIMATION_SCALE permission");
}
if (scale < 0) scale = 0;
@@ -3138,7 +3155,7 @@
public void setAnimationScales(float[] scales) {
if (!checkCallingPermission(android.Manifest.permission.SET_ANIMATION_SCALE,
"setAnimationScale()")) {
- return;
+ throw new SecurityException("Requires SET_ANIMATION_SCALE permission");
}
if (scales != null) {
@@ -3169,7 +3186,7 @@
public int getSwitchState(int sw) {
if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
"getSwitchState()")) {
- return -1;
+ throw new SecurityException("Requires READ_INPUT_STATE permission");
}
return KeyInputQueue.getSwitchState(sw);
}
@@ -3177,7 +3194,7 @@
public int getSwitchStateForDevice(int devid, int sw) {
if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
"getSwitchStateForDevice()")) {
- return -1;
+ throw new SecurityException("Requires READ_INPUT_STATE permission");
}
return KeyInputQueue.getSwitchState(devid, sw);
}
@@ -3185,7 +3202,7 @@
public int getScancodeState(int sw) {
if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
"getScancodeState()")) {
- return -1;
+ throw new SecurityException("Requires READ_INPUT_STATE permission");
}
return KeyInputQueue.getScancodeState(sw);
}
@@ -3193,7 +3210,7 @@
public int getScancodeStateForDevice(int devid, int sw) {
if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
"getScancodeStateForDevice()")) {
- return -1;
+ throw new SecurityException("Requires READ_INPUT_STATE permission");
}
return KeyInputQueue.getScancodeState(devid, sw);
}
@@ -3201,7 +3218,7 @@
public int getKeycodeState(int sw) {
if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
"getKeycodeState()")) {
- return -1;
+ throw new SecurityException("Requires READ_INPUT_STATE permission");
}
return KeyInputQueue.getKeycodeState(sw);
}
@@ -3209,7 +3226,7 @@
public int getKeycodeStateForDevice(int devid, int sw) {
if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
"getKeycodeStateForDevice()")) {
- return -1;
+ throw new SecurityException("Requires READ_INPUT_STATE permission");
}
return KeyInputQueue.getKeycodeState(devid, sw);
}
@@ -3298,7 +3315,7 @@
boolean alwaysSendConfiguration, int animFlags) {
if (!checkCallingPermission(android.Manifest.permission.SET_ORIENTATION,
"setRotation()")) {
- return;
+ throw new SecurityException("Requires SET_ORIENTATION permission");
}
setRotationUnchecked(rotation, alwaysSendConfiguration, animFlags);
@@ -3776,7 +3793,7 @@
/**
* @return Returns true if event was dispatched, false if it was dropped for any reason
*/
- private boolean dispatchPointer(QueuedEvent qev, MotionEvent ev, int pid, int uid) {
+ private int dispatchPointer(QueuedEvent qev, MotionEvent ev, int pid, int uid) {
if (DEBUG_INPUT || WindowManagerPolicy.WATCH_POINTER) Log.v(TAG,
"dispatchPointer " + ev);
@@ -3806,14 +3823,14 @@
mQueue.recycleEvent(qev);
}
ev.recycle();
- return false;
+ return INJECT_FAILED;
}
if (targetObj == mKeyWaiter.CONSUMED_EVENT_TOKEN) {
if (qev != null) {
mQueue.recycleEvent(qev);
}
ev.recycle();
- return true;
+ return INJECT_SUCCEEDED;
}
WindowState target = (WindowState)targetObj;
@@ -3833,7 +3850,7 @@
mQueue.recycleEvent(qev);
}
ev.recycle();
- return false;
+ return INJECT_NO_PERMISSION;
}
}
@@ -3883,7 +3900,7 @@
mQueue.recycleEvent(qev);
}
ev.recycle();
- return false;
+ return INJECT_FAILED;
}
} //end if target
@@ -3957,7 +3974,7 @@
Log.v(TAG, "Delivering pointer " + qev + " to " + target);
}
target.mClient.dispatchPointer(ev, eventTime);
- return true;
+ return INJECT_SUCCEEDED;
} catch (android.os.RemoteException e) {
Log.i(TAG, "WINDOW DIED during motion dispatch: " + target);
mKeyWaiter.mMotionTarget = null;
@@ -3968,13 +3985,13 @@
// removed.
}
}
- return false;
+ return INJECT_FAILED;
}
/**
* @return Returns true if event was dispatched, false if it was dropped for any reason
*/
- private boolean dispatchTrackball(QueuedEvent qev, MotionEvent ev, int pid, int uid) {
+ private int dispatchTrackball(QueuedEvent qev, MotionEvent ev, int pid, int uid) {
if (DEBUG_INPUT) Log.v(
TAG, "dispatchTrackball [" + ev.getAction() +"] <" + ev.getX() + ", " + ev.getY() + ">");
@@ -3986,14 +4003,14 @@
mQueue.recycleEvent(qev);
}
ev.recycle();
- return false;
+ return INJECT_FAILED;
}
if (focusObj == mKeyWaiter.CONSUMED_EVENT_TOKEN) {
if (qev != null) {
mQueue.recycleEvent(qev);
}
ev.recycle();
- return true;
+ return INJECT_SUCCEEDED;
}
WindowState focus = (WindowState)focusObj;
@@ -4009,7 +4026,7 @@
mQueue.recycleEvent(qev);
}
ev.recycle();
- return false;
+ return INJECT_NO_PERMISSION;
}
}
@@ -4029,7 +4046,7 @@
try {
focus.mClient.dispatchTrackball(ev, eventTime);
- return true;
+ return INJECT_SUCCEEDED;
} catch (android.os.RemoteException e) {
Log.i(TAG, "WINDOW DIED during key dispatch: " + focus);
try {
@@ -4040,23 +4057,23 @@
}
}
- return false;
+ return INJECT_FAILED;
}
/**
* @return Returns true if event was dispatched, false if it was dropped for any reason
*/
- private boolean dispatchKey(KeyEvent event, int pid, int uid) {
+ private int dispatchKey(KeyEvent event, int pid, int uid) {
if (DEBUG_INPUT) Log.v(TAG, "Dispatch key: " + event);
Object focusObj = mKeyWaiter.waitForNextEventTarget(event, null,
null, false, false);
if (focusObj == null) {
Log.w(TAG, "No focus window, dropping: " + event);
- return false;
+ return INJECT_FAILED;
}
if (focusObj == mKeyWaiter.CONSUMED_EVENT_TOKEN) {
- return true;
+ return INJECT_SUCCEEDED;
}
WindowState focus = (WindowState)focusObj;
@@ -4071,7 +4088,7 @@
Log.w(TAG, "Permission denied: injecting key event from pid "
+ pid + " uid " + uid + " to window " + focus
+ " owned by uid " + focus.mSession.mUid);
- return false;
+ return INJECT_NO_PERMISSION;
}
}
@@ -4089,7 +4106,7 @@
+ " to " + focus);
}
focus.mClient.dispatchKey(event);
- return true;
+ return INJECT_SUCCEEDED;
} catch (android.os.RemoteException e) {
Log.i(TAG, "WINDOW DIED during key dispatch: " + focus);
try {
@@ -4100,13 +4117,13 @@
}
}
- return false;
+ return INJECT_FAILED;
}
public void pauseKeyDispatching(IBinder _token) {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
"pauseKeyDispatching()")) {
- return;
+ throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
synchronized (mWindowMap) {
@@ -4120,7 +4137,7 @@
public void resumeKeyDispatching(IBinder _token) {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
"resumeKeyDispatching()")) {
- return;
+ throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
synchronized (mWindowMap) {
@@ -4134,7 +4151,7 @@
public void setEventDispatching(boolean enabled) {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
"resumeKeyDispatching()")) {
- return;
+ throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
synchronized (mWindowMap) {
@@ -4167,11 +4184,18 @@
KeyEvent newEvent = new KeyEvent(downTime, eventTime, action, code, repeatCount, metaState,
deviceId, scancode, KeyEvent.FLAG_FROM_SYSTEM);
- boolean result = dispatchKey(newEvent, Binder.getCallingPid(), Binder.getCallingUid());
+ int result = dispatchKey(newEvent, Binder.getCallingPid(), Binder.getCallingUid());
if (sync) {
mKeyWaiter.waitForNextEventTarget(null, null, null, false, true);
}
- return result;
+ switch (result) {
+ case INJECT_NO_PERMISSION:
+ throw new SecurityException(
+ "Injecting to another application requires INJECT_EVENT permission");
+ case INJECT_SUCCEEDED:
+ return true;
+ }
+ return false;
}
/**
@@ -4184,11 +4208,18 @@
* @return Returns true if event was dispatched, false if it was dropped for any reason
*/
public boolean injectPointerEvent(MotionEvent ev, boolean sync) {
- boolean result = dispatchPointer(null, ev, Binder.getCallingPid(), Binder.getCallingUid());
+ int result = dispatchPointer(null, ev, Binder.getCallingPid(), Binder.getCallingUid());
if (sync) {
mKeyWaiter.waitForNextEventTarget(null, null, null, false, true);
}
- return result;
+ switch (result) {
+ case INJECT_NO_PERMISSION:
+ throw new SecurityException(
+ "Injecting to another application requires INJECT_EVENT permission");
+ case INJECT_SUCCEEDED:
+ return true;
+ }
+ return false;
}
/**
@@ -4201,11 +4232,18 @@
* @return Returns true if event was dispatched, false if it was dropped for any reason
*/
public boolean injectTrackballEvent(MotionEvent ev, boolean sync) {
- boolean result = dispatchTrackball(null, ev, Binder.getCallingPid(), Binder.getCallingUid());
+ int result = dispatchTrackball(null, ev, Binder.getCallingPid(), Binder.getCallingUid());
if (sync) {
mKeyWaiter.waitForNextEventTarget(null, null, null, false, true);
}
- return result;
+ switch (result) {
+ case INJECT_NO_PERMISSION:
+ throw new SecurityException(
+ "Injecting to another application requires INJECT_EVENT permission");
+ case INJECT_SUCCEEDED:
+ return true;
+ }
+ return false;
}
private WindowState getFocusedWindow() {
@@ -7492,7 +7530,7 @@
}
case COMPUTE_AND_SEND_NEW_CONFIGURATION: {
- if (updateOrientationFromAppTokens(null, null) != null) {
+ if (updateOrientationFromAppTokensUnchecked(null, null) != null) {
sendNewConfiguration();
}
break;
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index 6a81178..07d6b6f 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -17,7 +17,6 @@
package com.android.server.am;
import com.android.internal.os.BatteryStatsImpl;
-import com.android.internal.os.RuntimeInit;
import com.android.server.IntentResolver;
import com.android.server.ProcessMap;
import com.android.server.ProcessStats;
@@ -2761,7 +2760,7 @@
// instance of the activity so a new fresh one can be started.
if (ret.launchMode == ActivityInfo.LAUNCH_MULTIPLE) {
if (!ret.finishing) {
- int index = indexOfTokenLocked(ret, false);
+ int index = indexOfTokenLocked(ret);
if (index >= 0) {
finishActivityLocked(ret, 0, Activity.RESULT_CANCELED,
null, "clear");
@@ -2854,7 +2853,7 @@
HistoryRecord sourceRecord = null;
HistoryRecord resultRecord = null;
if (resultTo != null) {
- int index = indexOfTokenLocked(resultTo, false);
+ int index = indexOfTokenLocked(resultTo);
if (DEBUG_RESULTS) Log.v(
TAG, "Sending result to " + resultTo + " (index " + index + ")");
if (index >= 0) {
@@ -3420,7 +3419,7 @@
}
synchronized (this) {
- int index = indexOfTokenLocked(callingActivity, false);
+ int index = indexOfTokenLocked(callingActivity);
if (index < 0) {
return false;
}
@@ -3570,7 +3569,7 @@
public void setRequestedOrientation(IBinder token,
int requestedOrientation) {
synchronized (this) {
- int index = indexOfTokenLocked(token, false);
+ int index = indexOfTokenLocked(token);
if (index < 0) {
return;
}
@@ -3592,7 +3591,7 @@
public int getRequestedOrientation(IBinder token) {
synchronized (this) {
- int index = indexOfTokenLocked(token, false);
+ int index = indexOfTokenLocked(token);
if (index < 0) {
return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
}
@@ -3648,7 +3647,7 @@
TAG, "Finishing activity: token=" + token
+ ", result=" + resultCode + ", data=" + resultData);
- int index = indexOfTokenLocked(token, false);
+ int index = indexOfTokenLocked(token);
if (index < 0) {
return false;
}
@@ -3772,7 +3771,7 @@
private final HistoryRecord finishCurrentActivityLocked(HistoryRecord r,
int mode) {
- final int index = indexOfTokenLocked(r, false);
+ final int index = indexOfTokenLocked(r);
if (index < 0) {
return null;
}
@@ -3897,7 +3896,7 @@
public final void finishSubActivity(IBinder token, String resultWho,
int requestCode) {
synchronized(this) {
- int index = indexOfTokenLocked(token, false);
+ int index = indexOfTokenLocked(token);
if (index < 0) {
return;
}
@@ -4447,7 +4446,7 @@
}
synchronized(this) {
- int index = indexOfTokenLocked(token, true);
+ int index = indexOfTokenLocked(token);
if (index < 0) {
return;
}
@@ -5012,7 +5011,7 @@
}
// Get the activity record.
- int index = indexOfTokenLocked(token, false);
+ int index = indexOfTokenLocked(token);
if (index >= 0) {
HistoryRecord r = (HistoryRecord)mHistory.get(index);
@@ -5166,7 +5165,7 @@
HistoryRecord r = null;
synchronized (this) {
- int index = indexOfTokenLocked(token, false);
+ int index = indexOfTokenLocked(token);
if (index >= 0) {
r = (HistoryRecord)mHistory.get(index);
if (!timeout) {
@@ -5197,7 +5196,7 @@
final long origId = Binder.clearCallingIdentity();
synchronized (this) {
- int index = indexOfTokenLocked(token, false);
+ int index = indexOfTokenLocked(token);
if (index >= 0) {
r = (HistoryRecord)mHistory.get(index);
r.thumbnail = thumbnail;
@@ -5227,7 +5226,7 @@
synchronized (this) {
mHandler.removeMessages(DESTROY_TIMEOUT_MSG, token);
- int index = indexOfTokenLocked(token, false);
+ int index = indexOfTokenLocked(token);
if (index >= 0) {
HistoryRecord r = (HistoryRecord)mHistory.get(index);
if (r.state == ActivityState.DESTROYING) {
@@ -5254,7 +5253,7 @@
}
private HistoryRecord getCallingRecordLocked(IBinder token) {
- int index = indexOfTokenLocked(token, true);
+ int index = indexOfTokenLocked(token);
if (index >= 0) {
HistoryRecord r = (HistoryRecord)mHistory.get(index);
if (r != null) {
@@ -5266,7 +5265,7 @@
public ComponentName getActivityClassForToken(IBinder token) {
synchronized(this) {
- int index = indexOfTokenLocked(token, false);
+ int index = indexOfTokenLocked(token);
if (index >= 0) {
HistoryRecord r = (HistoryRecord)mHistory.get(index);
return r.intent.getComponent();
@@ -5277,7 +5276,7 @@
public String getPackageForToken(IBinder token) {
synchronized(this) {
- int index = indexOfTokenLocked(token, false);
+ int index = indexOfTokenLocked(token);
if (index >= 0) {
HistoryRecord r = (HistoryRecord)mHistory.get(index);
return r.packageName;
@@ -5316,7 +5315,7 @@
}
HistoryRecord activity = null;
if (type == INTENT_SENDER_ACTIVITY_RESULT) {
- int index = indexOfTokenLocked(token, false);
+ int index = indexOfTokenLocked(token);
if (index < 0) {
return null;
}
@@ -6837,7 +6836,7 @@
synchronized(this) {
if (r == null) {
- int index = indexOfTokenLocked(token, false);
+ int index = indexOfTokenLocked(token);
if (index < 0) {
return;
}
@@ -8943,7 +8942,7 @@
return false;
}
- private final int indexOfTokenLocked(IBinder token, boolean required) {
+ private final int indexOfTokenLocked(IBinder token) {
int count = mHistory.size();
// convert the token to an entry in the history.
@@ -8957,19 +8956,10 @@
break;
}
}
- if (index < 0 && required) {
- RuntimeInit.crash(TAG, new InvalidTokenException(token));
- }
return index;
}
- static class InvalidTokenException extends Exception {
- InvalidTokenException(IBinder token) {
- super("Bad activity token: " + token);
- }
- }
-
private final void killServicesLocked(ProcessRecord app,
boolean allowRestart) {
// Report disconnected services.
@@ -9994,7 +9984,7 @@
HistoryRecord activity = null;
if (token != null) {
- int aindex = indexOfTokenLocked(token, false);
+ int aindex = indexOfTokenLocked(token);
if (aindex < 0) {
Log.w(TAG, "Binding with unknown activity: " + token);
return 0;
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
index 42f8fac..c922cec 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
@@ -404,6 +404,8 @@
mReconnectIntent = null;
}
+ setState(State.DISCONNECTING);
+
for (DataConnection connBase : dataConnectionList) {
CdmaDataConnection conn = (CdmaDataConnection) connBase;
@@ -419,24 +421,9 @@
stopNetStatPoll();
- /*
- * If we've been asked to tear down the connection,
- * set the state to DISCONNECTING. However, there's
- * a race that can occur if for some reason we were
- * already in the IDLE state. In that case, the call
- * to conn.disconnect() above will immediately post
- * a message to the handler thread that the disconnect
- * is done, and if the handler runs before the code
- * below does, the handler will have set the state to
- * IDLE before the code below runs. If we didn't check
- * for that, future calls to trySetupData would fail,
- * and we would never get out of the DISCONNECTING state.
- */
if (!tearDown) {
setState(State.IDLE);
phone.notifyDataConnection(reason);
- } else if (state != State.IDLE) {
- setState(State.DISCONNECTING);
}
}
@@ -811,6 +798,8 @@
resetPollStats();
}
} else {
+ // reset reconnect timer
+ nextReconnectDelay = RECONNECT_DELAY_INITIAL_MILLIS;
// in case data setup was attempted when we were on a voice call
trySetupData(Phone.REASON_VOICE_CALL_ENDED);
}
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
index 270f78b..71af406 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
@@ -636,6 +636,8 @@
mReconnectIntent = null;
}
+ setState(State.DISCONNECTING);
+
for (DataConnection conn : pdpList) {
PdpConnection pdp = (PdpConnection) conn;
if (tearDown) {
@@ -647,25 +649,10 @@
}
stopNetStatPoll();
- /*
- * If we've been asked to tear down the connection,
- * set the state to DISCONNECTING. However, there's
- * a race that can occur if for some reason we were
- * already in the IDLE state. In that case, the call
- * to pdp.disconnect() above will immediately post
- * a message to the handler thread that the disconnect
- * is done, and if the handler runs before the code
- * below does, the handler will have set the state to
- * IDLE before the code below runs. If we didn't check
- * for that, future calls to trySetupData would fail,
- * and we would never get out of the DISCONNECTING state.
- */
if (!tearDown) {
setState(State.IDLE);
phone.notifyDataConnection(reason);
mActiveApn = null;
- } else if (state != State.IDLE) {
- setState(State.DISCONNECTING);
}
}
@@ -813,6 +800,8 @@
if (state != State.DISCONNECTING) {
cleanUpConnection(isConnected, Phone.REASON_APN_CHANGED);
if (!isConnected) {
+ // reset reconnect timer
+ nextReconnectDelay = RECONNECT_DELAY_INITIAL_MILLIS;
trySetupData(Phone.REASON_APN_CHANGED);
}
}
@@ -1406,6 +1395,8 @@
resetPollStats();
}
} else {
+ // reset reconnect timer
+ nextReconnectDelay = RECONNECT_DELAY_INITIAL_MILLIS;
// in case data setup was attempted when we were on a voice call
trySetupData(Phone.REASON_VOICE_CALL_ENDED);
}
diff --git a/test-runner/android/test/mock/MockContext.java b/test-runner/android/test/mock/MockContext.java
index e733dd1..9e0cf2c 100644
--- a/test-runner/android/test/mock/MockContext.java
+++ b/test-runner/android/test/mock/MockContext.java
@@ -105,6 +105,11 @@
}
@Override
+ public File getSharedPrefsFile(String name) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public String getPackageCodePath() {
throw new UnsupportedOperationException();
}
diff --git a/tests/AndroidTests/AndroidManifest.xml b/tests/AndroidTests/AndroidManifest.xml
index fd6e6d8..55d4d64 100644
--- a/tests/AndroidTests/AndroidManifest.xml
+++ b/tests/AndroidTests/AndroidManifest.xml
@@ -219,7 +219,20 @@
</service>
<!-- Application components used for search manager tests -->
- <!-- TODO: Removed temporarily - need to be replaced using mocks -->
+
+ <activity android:name=".SearchableActivity"
+ android:label="Searchable Activity">
+ <intent-filter>
+ <action android:name="android.intent.action.SEARCH" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ <meta-data android:name="android.app.searchable"
+ android:resource="@xml/searchable" />
+ </activity>
+
+ <provider android:name=".SuggestionProvider"
+ android:authorities="com.android.unit_tests.SuggestionProvider">
+ </provider>
<!-- Used to test IPC. -->
<service android:name=".binder.BinderTestService"
diff --git a/tests/AndroidTests/res/values/strings.xml b/tests/AndroidTests/res/values/strings.xml
index 21c72cf..49d8ae7 100644
--- a/tests/AndroidTests/res/values/strings.xml
+++ b/tests/AndroidTests/res/values/strings.xml
@@ -50,5 +50,8 @@
<item quantity="other">Some dogs</item>
</plurals>
+ <string name="searchable_label">SearchManager Test</string>
+ <string name="searchable_hint">A search hint</string>
+
<!-- <string name="layout_six_text_text">F</string> -->
</resources>
diff --git a/tests/AndroidTests/res/xml/searchable.xml b/tests/AndroidTests/res/xml/searchable.xml
index a40d53d..9d293b5 100644
--- a/tests/AndroidTests/res/xml/searchable.xml
+++ b/tests/AndroidTests/res/xml/searchable.xml
@@ -15,7 +15,12 @@
-->
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
- android:label="SearchManagerTest"
- android:hint="SearchManagerTest Hint"
-/>
+ android:label="@string/searchable_label"
+ android:hint="@string/searchable_hint"
+ android:searchSuggestAuthority="com.android.unit_tests.SuggestionProvider"
+ >
+ <actionkey android:keycode="KEYCODE_CALL"
+ android:suggestActionMsgColumn="suggest_action_msg_call" />
+
+</searchable>
\ No newline at end of file
diff --git a/tests/AndroidTests/src/com/android/unit_tests/SearchManagerTest.java b/tests/AndroidTests/src/com/android/unit_tests/SearchManagerTest.java
index f3c1542..f03a779 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/SearchManagerTest.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/SearchManagerTest.java
@@ -23,7 +23,10 @@
import android.app.SearchManager;
import android.content.ComponentName;
import android.content.Context;
+import android.os.Bundle;
+import android.os.RemoteException;
import android.os.ServiceManager;
+import android.server.search.SearchableInfo;
import android.test.ActivityInstrumentationTestCase2;
import android.test.suitebuilder.annotation.LargeTest;
import android.test.suitebuilder.annotation.MediumTest;
@@ -37,12 +40,11 @@
* com.android.unit_tests/android.test.InstrumentationTestRunner
*/
public class SearchManagerTest extends ActivityInstrumentationTestCase2<LocalActivity> {
-
- // If non-zero, enable a set of tests that start and stop the search manager.
- // This is currently disabled because it's causing an unwanted jump from the unit test
- // activity into the contacts activity. We'll put this back after we disable that jump.
- private static final int TEST_SEARCH_START = 0;
-
+
+ private ComponentName SEARCHABLE_ACTIVITY =
+ new ComponentName("com.android.unit_tests",
+ "com.android.unit_tests.SearchableActivity");
+
/*
* Bug list of test ideas.
*
@@ -88,7 +90,30 @@
super.setUp();
Activity testActivity = getActivity();
- mContext = (Context)testActivity;
+ mContext = testActivity;
+ }
+
+ private ISearchManager getSearchManagerService() {
+ return ISearchManager.Stub.asInterface(
+ ServiceManager.getService(Context.SEARCH_SERVICE));
+ }
+
+ // Checks that the search UI is visible.
+ private void assertSearchVisible() {
+ SearchManager searchManager = (SearchManager)
+ mContext.getSystemService(Context.SEARCH_SERVICE);
+ assertTrue("SearchManager thinks search UI isn't visible when it should be",
+ searchManager.isVisible());
+ }
+
+ // Checks that the search UI is not visible.
+ // This checks both the SearchManager and the SearchManagerService,
+ // since SearchManager keeps a local variable for the visibility.
+ private void assertSearchNotVisible() {
+ SearchManager searchManager = (SearchManager)
+ mContext.getSystemService(Context.SEARCH_SERVICE);
+ assertFalse("SearchManager thinks search UI is visible when it shouldn't be",
+ searchManager.isVisible());
}
/**
@@ -97,9 +122,7 @@
*/
@MediumTest
public void testSearchManagerInterfaceAvailable() {
- ISearchManager searchManager1 = ISearchManager.Stub.asInterface(
- ServiceManager.getService(Context.SEARCH_SERVICE));
- assertNotNull(searchManager1);
+ assertNotNull(getSearchManagerService());
}
/**
@@ -135,38 +158,127 @@
SearchManager searchManager2 = (SearchManager)
mContext.getSystemService(Context.SEARCH_SERVICE);
assertNotNull(searchManager2);
- assertSame( searchManager1, searchManager2 );
+ assertSame(searchManager1, searchManager2 );
}
-
+
+ @MediumTest
+ public void testSearchables() {
+ SearchableInfo si;
+
+ si = SearchManager.getSearchableInfo(SEARCHABLE_ACTIVITY, false);
+ assertNotNull(si);
+ assertFalse(SearchManager.isDefaultSearchable(si));
+ si = SearchManager.getSearchableInfo(SEARCHABLE_ACTIVITY, true);
+ assertNotNull(si);
+ assertTrue(SearchManager.isDefaultSearchable(si));
+ si = SearchManager.getSearchableInfo(null, true);
+ assertNotNull(si);
+ assertTrue(SearchManager.isDefaultSearchable(si));
+ }
+
+ /**
+ * Tests that rapid calls to start-stop-start doesn't cause problems.
+ */
+ @MediumTest
+ public void testSearchManagerFastInvocations() throws Exception {
+ SearchManager searchManager = (SearchManager)
+ mContext.getSystemService(Context.SEARCH_SERVICE);
+ assertNotNull(searchManager);
+ assertSearchNotVisible();
+
+ searchManager.startSearch(null, false, SEARCHABLE_ACTIVITY, null, false);
+ assertSearchVisible();
+ searchManager.stopSearch();
+ searchManager.startSearch(null, false, SEARCHABLE_ACTIVITY, null, false);
+ searchManager.stopSearch();
+ assertSearchNotVisible();
+ }
+
+ /**
+ * Tests that startSearch() is idempotent.
+ */
+ @MediumTest
+ public void testStartSearchIdempotent() throws Exception {
+ SearchManager searchManager = (SearchManager)
+ mContext.getSystemService(Context.SEARCH_SERVICE);
+ assertNotNull(searchManager);
+ assertSearchNotVisible();
+
+ searchManager.startSearch(null, false, SEARCHABLE_ACTIVITY, null, false);
+ searchManager.startSearch(null, false, SEARCHABLE_ACTIVITY, null, false);
+ assertSearchVisible();
+ searchManager.stopSearch();
+ assertSearchNotVisible();
+ }
+
+ /**
+ * Tests that stopSearch() is idempotent and can be called when the search UI is not visible.
+ */
+ @MediumTest
+ public void testStopSearchIdempotent() throws Exception {
+ SearchManager searchManager = (SearchManager)
+ mContext.getSystemService(Context.SEARCH_SERVICE);
+ assertNotNull(searchManager);
+ assertSearchNotVisible();
+ searchManager.stopSearch();
+ assertSearchNotVisible();
+
+ searchManager.startSearch(null, false, SEARCHABLE_ACTIVITY, null, false);
+ assertSearchVisible();
+ searchManager.stopSearch();
+ searchManager.stopSearch();
+ assertSearchNotVisible();
+ }
+
/**
* The goal of this test is to confirm that we can start and then
* stop a simple search.
*/
-
- @MediumTest
- public void testSearchManagerInvocations() {
+ @MediumTest
+ public void testSearchManagerInvocations() throws Exception {
SearchManager searchManager = (SearchManager)
mContext.getSystemService(Context.SEARCH_SERVICE);
assertNotNull(searchManager);
-
- // TODO: make a real component name, or remove this need
- final ComponentName cn = new ComponentName("", "");
+ assertSearchNotVisible();
- if (TEST_SEARCH_START != 0) {
- // These tests should simply run to completion w/o exceptions
- searchManager.startSearch(null, false, cn, null, false);
- searchManager.stopSearch();
-
- searchManager.startSearch("", false, cn, null, false);
- searchManager.stopSearch();
-
- searchManager.startSearch("test search string", false, cn, null, false);
- searchManager.stopSearch();
-
- searchManager.startSearch("test search string", true, cn, null, false);
- searchManager.stopSearch();
- }
- }
+ // These tests should simply run to completion w/o exceptions
+ searchManager.startSearch(null, false, SEARCHABLE_ACTIVITY, null, false);
+ assertSearchVisible();
+ searchManager.stopSearch();
+ assertSearchNotVisible();
+
+ searchManager.startSearch("", false, SEARCHABLE_ACTIVITY, null, false);
+ assertSearchVisible();
+ searchManager.stopSearch();
+ assertSearchNotVisible();
+
+ searchManager.startSearch("test search string", false, SEARCHABLE_ACTIVITY, null, false);
+ assertSearchVisible();
+ searchManager.stopSearch();
+ assertSearchNotVisible();
+
+ searchManager.startSearch("test search string", true, SEARCHABLE_ACTIVITY, null, false);
+ assertSearchVisible();
+ searchManager.stopSearch();
+ assertSearchNotVisible();
+ }
+
+ @MediumTest
+ public void testSearchDialogState() throws Exception {
+ SearchManager searchManager = (SearchManager)
+ mContext.getSystemService(Context.SEARCH_SERVICE);
+ assertNotNull(searchManager);
+
+ Bundle searchState;
+
+ // search dialog not visible, so no state should be stored
+ searchState = searchManager.saveSearchDialog();
+ assertNull(searchState);
+
+ searchManager.startSearch("test search string", true, SEARCHABLE_ACTIVITY, null, false);
+ searchState = searchManager.saveSearchDialog();
+ assertNotNull(searchState);
+ searchManager.stopSearch();
+ }
}
-
diff --git a/tests/AndroidTests/src/com/android/unit_tests/SearchableActivity.java b/tests/AndroidTests/src/com/android/unit_tests/SearchableActivity.java
new file mode 100644
index 0000000..53f40e9
--- /dev/null
+++ b/tests/AndroidTests/src/com/android/unit_tests/SearchableActivity.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.unit_tests;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class SearchableActivity extends Activity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ finish();
+ }
+
+}
diff --git a/tests/AndroidTests/src/com/android/unit_tests/SuggestionProvider.java b/tests/AndroidTests/src/com/android/unit_tests/SuggestionProvider.java
new file mode 100644
index 0000000..bc61e27
--- /dev/null
+++ b/tests/AndroidTests/src/com/android/unit_tests/SuggestionProvider.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.unit_tests;
+
+import android.app.SearchManager;
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.content.Intent;
+import android.content.UriMatcher;
+import android.database.Cursor;
+import android.database.MatrixCursor;
+import android.net.Uri;
+
+/** Simple test provider that runs in the local process.
+ *
+ * Used by {@link SearchManagerTest}.
+ */
+public class SuggestionProvider extends ContentProvider {
+ private static final String TAG = "SuggestionProvider";
+
+ private static final int SEARCH_SUGGESTIONS = 1;
+
+ private static final UriMatcher sURLMatcher = new UriMatcher(
+ UriMatcher.NO_MATCH);
+
+ static {
+ sURLMatcher.addURI("*", SearchManager.SUGGEST_URI_PATH_QUERY,
+ SEARCH_SUGGESTIONS);
+ sURLMatcher.addURI("*", SearchManager.SUGGEST_URI_PATH_QUERY + "/*",
+ SEARCH_SUGGESTIONS);
+ }
+
+ private static final String[] COLUMNS = new String[] {
+ "_id",
+ SearchManager.SUGGEST_COLUMN_TEXT_1,
+ SearchManager.SUGGEST_COLUMN_INTENT_ACTION,
+ SearchManager.SUGGEST_COLUMN_QUERY
+ };
+
+ public SuggestionProvider() {
+ }
+
+ @Override
+ public boolean onCreate() {
+ return true;
+ }
+
+ @Override
+ public Cursor query(Uri url, String[] projectionIn, String selection,
+ String[] selectionArgs, String sort) {
+ int match = sURLMatcher.match(url);
+ switch (match) {
+ case SEARCH_SUGGESTIONS:
+ String query = url.getLastPathSegment();
+ MatrixCursor cursor = new MatrixCursor(COLUMNS);
+ String[] suffixes = { "", "a", " foo", "XXXXXXXXXXXXXXXXX" };
+ for (String suffix : suffixes) {
+ addRow(cursor, query + suffix);
+ }
+ return cursor;
+ default:
+ throw new IllegalArgumentException("Unknown URL: " + url);
+ }
+ }
+
+ private void addRow(MatrixCursor cursor, String string) {
+ long id = cursor.getCount();
+ cursor.newRow().add(id).add(string).add(Intent.ACTION_SEARCH).add(string);
+ }
+
+ @Override
+ public String getType(Uri url) {
+ int match = sURLMatcher.match(url);
+ switch (match) {
+ case SEARCH_SUGGESTIONS:
+ return SearchManager.SUGGEST_MIME_TYPE;
+ default:
+ throw new IllegalArgumentException("Unknown URL: " + url);
+ }
+ }
+
+ @Override
+ public int update(Uri url, ContentValues values, String where, String[] whereArgs) {
+ throw new UnsupportedOperationException("update not supported");
+ }
+
+ @Override
+ public Uri insert(Uri url, ContentValues initialValues) {
+ throw new UnsupportedOperationException("insert not supported");
+ }
+
+ @Override
+ public int delete(Uri url, String where, String[] whereArgs) {
+ throw new UnsupportedOperationException("delete not supported");
+ }
+}
diff --git a/tests/DumpRenderTree/assets/results/layout_tests_failed.txt b/tests/DumpRenderTree/assets/results/layout_tests_failed.txt
index 3cec40d..651b324 100644
--- a/tests/DumpRenderTree/assets/results/layout_tests_failed.txt
+++ b/tests/DumpRenderTree/assets/results/layout_tests_failed.txt
@@ -1,280 +1,698 @@
-/sdcard/android/layout_tests/fast/replaced/image-map-bug16782.html : different length
-/sdcard/android/layout_tests/fast/replaced/table-percent-height.html : different length
-/sdcard/android/layout_tests/fast/replaced/image-map.html : different length
-/sdcard/android/layout_tests/fast/dynamic/paused-event-dispatch.html : @offset: 117
-/sdcard/android/layout_tests/fast/text/plain-text-line-breaks.html : different length
-/sdcard/android/layout_tests/fast/text/zero-width-characters.html : different length
-/sdcard/android/layout_tests/fast/text/reset-drag-on-mouse-down.html : TIMEDOUT
-/sdcard/android/layout_tests/fast/encoding/invalid-xml.html : different length
-/sdcard/android/layout_tests/fast/encoding/char-decoding-mac.html : different length
-/sdcard/android/layout_tests/fast/encoding/frame-default-enc.html : @offset: 0
-/sdcard/android/layout_tests/fast/encoding/mailto-always-utf-8.html : different length
-/sdcard/android/layout_tests/fast/encoding/char-decoding.html : different length
-/sdcard/android/layout_tests/fast/encoding/url-host-name-non-ascii.html : different length
-/sdcard/android/layout_tests/fast/encoding/idn-security.html : different length
-/sdcard/android/layout_tests/fast/encoding/percent-escaping.html : TIMEDOUT
-/sdcard/android/layout_tests/fast/encoding/xml-utf-8-default.xml : different length
-/sdcard/android/layout_tests/fast/encoding/char-encoding-mac.html : different length
-/sdcard/android/layout_tests/fast/encoding/charset-koi8-u.html : @offset: 147
-/sdcard/android/layout_tests/fast/encoding/preload-encoding.html : different length
-/sdcard/android/layout_tests/fast/workers/worker-location.html : TIMEDOUT
-/sdcard/android/layout_tests/fast/workers/worker-constructor.html : different length
-/sdcard/android/layout_tests/fast/workers/worker-terminate.html : different length
-/sdcard/android/layout_tests/fast/workers/worker-gc.html : different length
-/sdcard/android/layout_tests/fast/workers/worker-navigator.html : different length
-/sdcard/android/layout_tests/fast/workers/worker-replace-global-constructor.html : TIMEDOUT
-/sdcard/android/layout_tests/fast/workers/worker-replace-self.html : TIMEDOUT
-/sdcard/android/layout_tests/fast/workers/worker-event-listener.html : TIMEDOUT
-/sdcard/android/layout_tests/fast/overflow/scroll-vertical-not-horizontal.html : different length
-/sdcard/android/layout_tests/fast/events/onunload.html : different length
-/sdcard/android/layout_tests/fast/events/mouseup-outside-document.html : different length
-/sdcard/android/layout_tests/fast/events/offsetX-offsetY.html : different length
-/sdcard/android/layout_tests/fast/events/scroll-event-does-not-bubble.html : different length
-/sdcard/android/layout_tests/fast/events/mouseover-mouseout.html : different length
-/sdcard/android/layout_tests/fast/events/option-tab.html : different length
-/sdcard/android/layout_tests/fast/events/popup-blocking-click-in-iframe.html : different length
-/sdcard/android/layout_tests/fast/events/onchange-passwordfield.html : different length
-/sdcard/android/layout_tests/fast/events/drag-in-frames.html : different length
-/sdcard/android/layout_tests/fast/events/frame-tab-focus.html : different length
-/sdcard/android/layout_tests/fast/events/autoscroll-in-textfield.html : different length
-/sdcard/android/layout_tests/fast/events/arrow-navigation.html : different length
-/sdcard/android/layout_tests/fast/events/fire-scroll-event.html : different length
-/sdcard/android/layout_tests/fast/events/mouseclick-target-and-positioning.html : different length
-/sdcard/android/layout_tests/fast/events/keydown-keypress-focus-change.html : @offset: 172
-/sdcard/android/layout_tests/fast/events/input-image-scrolled-x-y.html : TIMEDOUT
-/sdcard/android/layout_tests/fast/events/dblclick-addEventListener.html : different length
-/sdcard/android/layout_tests/fast/events/frame-programmatic-focus.html : different length
-/sdcard/android/layout_tests/fast/events/related-target.html : different length
-/sdcard/android/layout_tests/fast/events/content-changed-during-drop.html : different length
-/sdcard/android/layout_tests/fast/events/onload-fires-twice.html : different length
-/sdcard/android/layout_tests/fast/events/autoscroll-with-non-scrollable-parent.html : different length
-/sdcard/android/layout_tests/fast/events/window-events-capture.html : different length
-/sdcard/android/layout_tests/fast/events/onchange-click-hang.html : TIMEDOUT
-/sdcard/android/layout_tests/fast/events/onload-webkit-before-webcore.html : @offset: 105
-/sdcard/android/layout_tests/fast/events/window-events-bubble2.html : different length
-/sdcard/android/layout_tests/fast/events/js-keyboard-event-creation.html : different length
-/sdcard/android/layout_tests/fast/events/event-view-toString.html : TIMEDOUT
-/sdcard/android/layout_tests/fast/events/onchange-select-popup.html : different length
-/sdcard/android/layout_tests/fast/events/access-key-self-destruct.html : different length
-/sdcard/android/layout_tests/fast/events/scrollbar-double-click.html : different length
-/sdcard/android/layout_tests/fast/events/onunload-clears-onbeforeunload.html : different length
-/sdcard/android/layout_tests/fast/events/tabindex-focus-chain.html : @offset: 0
-/sdcard/android/layout_tests/fast/events/capture-on-target.html : different length
-/sdcard/android/layout_tests/fast/events/window-events-bubble.html : different length
-/sdcard/android/layout_tests/fast/events/mouseup-from-button2.html : different length
-/sdcard/android/layout_tests/fast/events/frame-click-focus.html : different length
-/sdcard/android/layout_tests/fast/events/mouseout-on-window.html : different length
-/sdcard/android/layout_tests/fast/events/keypress-insert-tab.html : @offset: 85
-/sdcard/android/layout_tests/fast/events/mouseout-dead-subframe.html : TIMEDOUT
-/sdcard/android/layout_tests/fast/events/iframe-object-onload.html : different length
-/sdcard/android/layout_tests/fast/events/onunload-not-on-body.html : different length
-/sdcard/android/layout_tests/fast/events/mousemove-after-drag-over-scrollbar.html : different length
-/sdcard/android/layout_tests/fast/events/contextmenu-scrolled-page-with-frame.html : different length
-/sdcard/android/layout_tests/fast/events/key-events-in-input-button.html : different length
-/sdcard/android/layout_tests/fast/events/arrow-keys-on-body.html : different length
-/sdcard/android/layout_tests/fast/events/ondragenter.html : different length
-/sdcard/android/layout_tests/fast/events/scroll-to-anchor-in-overflow-hidden.html : different length
-/sdcard/android/layout_tests/fast/events/autoscroll-nonscrollable-iframe-in-scrollable-div.html : different length
-/sdcard/android/layout_tests/fast/events/keypress-focus-change.html : different length
-/sdcard/android/layout_tests/fast/events/key-events-in-input-text.html : different length
-/sdcard/android/layout_tests/fast/events/drag-outside-window.html : @offset: 20
-/sdcard/android/layout_tests/fast/events/selectstart-during-autoscroll.html : different length
-/sdcard/android/layout_tests/fast/events/click-count.html : different length
-/sdcard/android/layout_tests/fast/events/onchange-searchfield.html : different length
-/sdcard/android/layout_tests/fast/events/special-key-events-in-input-text.html : different length
-/sdcard/android/layout_tests/fast/events/keydown-keypress-preventDefault.html : @offset: 228
-/sdcard/android/layout_tests/fast/events/mouse-click-events.html : different length
-/sdcard/android/layout_tests/fast/events/onsearch-enter.html : different length
-/sdcard/android/layout_tests/fast/events/mouseover-mouseout2.html : different length
-/sdcard/android/layout_tests/fast/events/open-window-from-another-frame.html : different length
-/sdcard/android/layout_tests/fast/events/init-events.html : different length
-/sdcard/android/layout_tests/fast/events/onchange-textfield.html : different length
-/sdcard/android/layout_tests/fast/events/onclick-list-marker.html : different length
-/sdcard/android/layout_tests/fast/events/anchor-image-scrolled-x-y.html : TIMEDOUT
-/sdcard/android/layout_tests/fast/html/tab-order.html : @offset: 246
-/sdcard/android/layout_tests/fast/js/exception-sequencing-binops.html : TIMEDOUT
-/sdcard/android/layout_tests/fast/js/recursion-limit-equal.html : different length
-/sdcard/android/layout_tests/fast/js/exception-sequencing-binops2.html : TIMEDOUT
-/sdcard/android/layout_tests/fast/js/math-transforms.html : TIMEDOUT
-/sdcard/android/layout_tests/fast/js/try-catch-crash.html : TIMEDOUT
-/sdcard/android/layout_tests/fast/js/navigator-mimeTypes-length.html : different length
-/sdcard/android/layout_tests/fast/js/global-constructors.html : different length
-/sdcard/android/layout_tests/fast/js/uncaught-exception-line-number.html : different length
-/sdcard/android/layout_tests/fast/js/exceptions-thrown-in-callbacks.html : TIMEDOUT
-/sdcard/android/layout_tests/fast/js/toString-and-valueOf-override.html : TIMEDOUT
-/sdcard/android/layout_tests/fast/js/exception-sequencing.html : TIMEDOUT
-/sdcard/android/layout_tests/fast/js/exception-codegen-crash.html : different length
-/sdcard/android/layout_tests/fast/dom/HTMLDocument/activeElement.html : different length
-/sdcard/android/layout_tests/fast/dom/HTMLDocument/hasFocus.html : different length
-/sdcard/android/layout_tests/fast/dom/HTMLSelectElement/listbox-select-reset.html : different length
-/sdcard/android/layout_tests/fast/dom/Element/offsetLeft-offsetTop-body-quirk.html : different length
-/sdcard/android/layout_tests/fast/dom/DOMException/XPathException.html : different length
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/010.xml : different length
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/011.xml : different length
-/sdcard/android/layout_tests/fast/dom/Window/window-resize-and-move-arguments.html : different length
-/sdcard/android/layout_tests/fast/dom/Window/window-function-name-getter-precedence.html : different length
-/sdcard/android/layout_tests/fast/dom/Window/window-xy-properties.html : different length
-/sdcard/android/layout_tests/fast/dom/Window/console-functions.html : different length
-/sdcard/android/layout_tests/fast/dom/Window/window-screen-properties.html : @offset: 65
-/sdcard/android/layout_tests/fast/dom/Window/window-properties.html : TIMEDOUT
-/sdcard/android/layout_tests/fast/dom/Window/window-onFocus.html : different length
-/sdcard/android/layout_tests/fast/dom/Window/new-window-opener.html : TIMEDOUT
-/sdcard/android/layout_tests/fast/dom/Window/window-open-pending-url.html : different length
-/sdcard/android/layout_tests/fast/dom/Window/setting-properties-on-closed-window.html : TIMEDOUT
-/sdcard/android/layout_tests/fast/dom/Window/dom-access-from-closure-window.html : different length
-/sdcard/android/layout_tests/fast/dom/Window/window-resize.html : different length
-/sdcard/android/layout_tests/fast/dom/Window/window-custom-prototype.html : different length
-/sdcard/android/layout_tests/fast/dom/Window/dom-access-from-closure-iframe.html : different length
-/sdcard/android/layout_tests/fast/dom/Window/Plug-ins.html : different length
-/sdcard/android/layout_tests/fast/dom/Window/get-set-properties.html : different length
-/sdcard/android/layout_tests/fast/dom/Window/window-scroll-arguments.html : different length
-/sdcard/android/layout_tests/fast/dom/Window/window-early-properties.html : different length
-/sdcard/android/layout_tests/fast/dom/StyleSheet/ownerNode-lifetime-2.html : different length
-/sdcard/android/layout_tests/fast/dom/dom-constructors.html : different length
-/sdcard/android/layout_tests/fast/dom/assign-to-window-status.html : different length
-/sdcard/android/layout_tests/fast/dom/gc-8.html : different length
-/sdcard/android/layout_tests/fast/dom/object-embed-plugin-scripting.html : different length
-/sdcard/android/layout_tests/fast/dom/gc-9.html : different length
-/sdcard/android/layout_tests/fast/dom/NamedNodeMap-setNamedItem-crash.html : different length
-/sdcard/android/layout_tests/fast/dom/wrapper-classes.html : different length
-/sdcard/android/layout_tests/fast/dom/select-selectedIndex.html : different length
-/sdcard/android/layout_tests/fast/dom/document-width-height-force-layout.html : @offset: 142
-/sdcard/android/layout_tests/fast/dom/client-width-height.html : @offset: 119
-/sdcard/android/layout_tests/fast/dom/clone-node-form-elements-with-attr.html : different length
-/sdcard/android/layout_tests/fast/dom/dom-add-optionelement.html : different length
-/sdcard/android/layout_tests/fast/dom/location-assign.html : different length
-/sdcard/android/layout_tests/fast/dom/javascript-backslash.html : different length
-/sdcard/android/layout_tests/fast/dom/global-constructors.html : different length
-/sdcard/android/layout_tests/fast/dom/client-width-height-quirks.html : @offset: 115
-/sdcard/android/layout_tests/fast/dom/javascript-url-crash-function.html : different length
-/sdcard/android/layout_tests/fast/dom/location-hash.html : different length
-/sdcard/android/layout_tests/fast/dom/constructors-cached.html : different length
-/sdcard/android/layout_tests/fast/dom/documenturi-can-hold-arbitrary-string.html : different length
-/sdcard/android/layout_tests/fast/dom/documenturi-not-affected-by-base-tag.html : different length
-/sdcard/android/layout_tests/fast/dom/open-and-close-by-DOM.html : different length
-/sdcard/android/layout_tests/fast/dom/document_write_params.html : TIMEDOUT
-/sdcard/android/layout_tests/fast/dom/tabindex-clamp.html : different length
-/sdcard/android/layout_tests/fast/dom/constructors-cached-navigate.html : different length
-/sdcard/android/layout_tests/fast/dom/frame-loading-via-document-write.html : TIMEDOUT
-/sdcard/android/layout_tests/fast/dom/ImageDocument-image-deletion.html : different length
-/sdcard/android/layout_tests/fast/forms/mailto/get-non-ascii-text-plain.html : different length
-/sdcard/android/layout_tests/fast/forms/mailto/advanced-get.html : different length
-/sdcard/android/layout_tests/fast/forms/mailto/get-non-ascii-text-plain-latin-1.html : different length
-/sdcard/android/layout_tests/fast/forms/mailto/post-multiple-items-multipart-form-data.html : different length
-/sdcard/android/layout_tests/fast/forms/mailto/get-multiple-items.html : different length
-/sdcard/android/layout_tests/fast/forms/mailto/get-non-ascii-always-utf-8.html : different length
-/sdcard/android/layout_tests/fast/forms/mailto/post-multiple-items.html : different length
-/sdcard/android/layout_tests/fast/forms/mailto/post-append-query.html : different length
-/sdcard/android/layout_tests/fast/forms/mailto/get-multiple-items-x-www-form-urlencoded.html : different length
-/sdcard/android/layout_tests/fast/forms/mailto/get-overwrite-query.html : different length
-/sdcard/android/layout_tests/fast/forms/mailto/post-multiple-items-x-www-form-urlencoded.html : different length
-/sdcard/android/layout_tests/fast/forms/mailto/get-multiple-items-text-plain.html : different length
-/sdcard/android/layout_tests/fast/forms/mailto/post-multiple-items-text-plain.html : different length
-/sdcard/android/layout_tests/fast/forms/mailto/get-non-ascii.html : different length
-/sdcard/android/layout_tests/fast/forms/mailto/post-text-plain-with-accept-charset.html : different length
-/sdcard/android/layout_tests/fast/forms/mailto/post-text-plain.html : different length
-/sdcard/android/layout_tests/fast/forms/mailto/advanced-put.html : different length
-/sdcard/android/layout_tests/fast/forms/listbox-typeahead-scroll.html : different length
-/sdcard/android/layout_tests/fast/forms/select-empty-list.html : different length
-/sdcard/android/layout_tests/fast/forms/select-accesskey.html : different length
-/sdcard/android/layout_tests/fast/forms/focus2.html : different length
-/sdcard/android/layout_tests/fast/forms/password-doubleclick-selection.html : different length
-/sdcard/android/layout_tests/fast/forms/textfield-inside-anchor.html : different length
-/sdcard/android/layout_tests/fast/forms/input-maxlength.html : different length
-/sdcard/android/layout_tests/fast/forms/input-text-option-delete.html : TIMEDOUT
-/sdcard/android/layout_tests/fast/forms/selection-functions.html : @offset: 306
-/sdcard/android/layout_tests/fast/forms/textfield-to-password-on-focus.html : different length
-/sdcard/android/layout_tests/fast/forms/focus-selection-textarea.html : different length
-/sdcard/android/layout_tests/fast/forms/enter-clicks-buttons.html : different length
-/sdcard/android/layout_tests/fast/forms/menulist-no-renderer-onmousedown.html : different length
-/sdcard/android/layout_tests/fast/forms/select-display-none-style-resolve.html : TIMEDOUT
-/sdcard/android/layout_tests/fast/forms/radio_checked_name.html : @offset: 303
-/sdcard/android/layout_tests/fast/forms/select-double-onchange.html : different length
-/sdcard/android/layout_tests/fast/forms/button-enter-click.html : different length
-/sdcard/android/layout_tests/fast/forms/11423.html : different length
-/sdcard/android/layout_tests/fast/forms/search-click-in-placeholder.html : @offset: 1
-/sdcard/android/layout_tests/fast/forms/autofocus-opera-003.html : @offset: 51
-/sdcard/android/layout_tests/fast/forms/search-hidden-cancel-button.html : different length
-/sdcard/android/layout_tests/fast/forms/willvalidate-004.html : different length
-/sdcard/android/layout_tests/fast/forms/textarea-paste-newline.html : different length
-/sdcard/android/layout_tests/fast/forms/drag-into-textarea.html : different length
-/sdcard/android/layout_tests/fast/forms/onselect-textfield.html : different length
-/sdcard/android/layout_tests/fast/forms/input-implicit-length-limit.html : TIMEDOUT
-/sdcard/android/layout_tests/fast/forms/form-and-frame-interaction-retains-values.html : different length
-/sdcard/android/layout_tests/fast/forms/input-appearance-focus.html : TIMEDOUT
-/sdcard/android/layout_tests/fast/forms/slider-transformed.html : different length
-/sdcard/android/layout_tests/fast/forms/listbox-select-all.html : different length
-/sdcard/android/layout_tests/fast/forms/textfield-onchange-deletion.html : different length
-/sdcard/android/layout_tests/fast/forms/focus-control-to-page.html : different length
-/sdcard/android/layout_tests/fast/forms/select-type-ahead-non-latin.html : different length
-/sdcard/android/layout_tests/fast/forms/textarea-no-scroll-on-blur.html : @offset: 79
-/sdcard/android/layout_tests/fast/forms/focus-selection-input.html : different length
-/sdcard/android/layout_tests/fast/forms/listbox-onchange.html : different length
-/sdcard/android/layout_tests/fast/forms/button-spacebar-click.html : different length
-/sdcard/android/layout_tests/fast/forms/search-event-delay.html : different length
-/sdcard/android/layout_tests/fast/forms/search-cancel-button-mouseup.html : different length
-/sdcard/android/layout_tests/fast/forms/select-enter-key.html : different length
-/sdcard/android/layout_tests/fast/forms/drag-out-of-textarea.html : different length
-/sdcard/android/layout_tests/fast/forms/textarea-hard-linewrap.html : different length
-/sdcard/android/layout_tests/fast/forms/input-type-change-in-onfocus-keyboard.html : different length
-/sdcard/android/layout_tests/fast/forms/dragging-to-disabled-file-input.html : different length
-/sdcard/android/layout_tests/fast/forms/input-radio-checked-tab.html : @offset: 115
-/sdcard/android/layout_tests/fast/forms/plaintext-mode-1.html : different length
-/sdcard/android/layout_tests/fast/forms/option-in-optgroup-removal.html : different length
-/sdcard/android/layout_tests/fast/forms/search-display-none-cancel-button.html : TIMEDOUT
-/sdcard/android/layout_tests/fast/forms/check-box-enter-key.html : different length
-/sdcard/android/layout_tests/fast/forms/input-select-on-click.html : different length
-/sdcard/android/layout_tests/fast/forms/button-state-restore.html : different length
-/sdcard/android/layout_tests/fast/forms/access-key.html : different length
-/sdcard/android/layout_tests/fast/forms/textarea-scrolled-endline-caret.html : different length
-/sdcard/android/layout_tests/fast/forms/textarea-type-spaces.html : different length
-/sdcard/android/layout_tests/fast/forms/slider-mouse-events.html : different length
-/sdcard/android/layout_tests/fast/forms/textarea-selection-preservation.html : different length
-/sdcard/android/layout_tests/fast/forms/slider-onchange-event.html : different length
-/sdcard/android/layout_tests/fast/forms/textarea-appearance-wrap.html : different length
-/sdcard/android/layout_tests/fast/forms/onselect-textarea.html : different length
-/sdcard/android/layout_tests/fast/forms/textarea-initial-caret-position.html : different length
-/sdcard/android/layout_tests/fast/forms/listbox-selection.html : different length
-/sdcard/android/layout_tests/fast/css/variables/color-hex-test.html : different length
-/sdcard/android/layout_tests/fast/css/dashboard-region-parser.html : different length
-/sdcard/android/layout_tests/fast/css/hover-affects-child.html : different length
-/sdcard/android/layout_tests/fast/css/html-attr-case-sensitivity.html : TIMEDOUT
-/sdcard/android/layout_tests/fast/css/computed-style.html : different length
-/sdcard/android/layout_tests/fast/css/getComputedStyle-transform.html : different length
-/sdcard/android/layout_tests/fast/css/computed-style-without-renderer.html : different length
-/sdcard/android/layout_tests/fast/parser/entity-comment-in-iframe.html : @offset: 0
-/sdcard/android/layout_tests/fast/parser/external-entities.xml : different length
-/sdcard/android/layout_tests/fast/parser/script-tag-with-trailing-slash.html : different length
-/sdcard/android/layout_tests/fast/parser/comment-in-iframe.html : @offset: 0
-/sdcard/android/layout_tests/fast/parser/xml-declaration-missing-ending-mark.html : different length
-/sdcard/android/layout_tests/fast/parser/entity-end-script-tag.html : different length
-/sdcard/android/layout_tests/fast/parser/tabindex-parsing.html : different length
-/sdcard/android/layout_tests/fast/history/subframe-is-visited.html : different length
-/sdcard/android/layout_tests/fast/history/window-open.html : TIMEDOUT
-/sdcard/android/layout_tests/fast/history/go-back-to-changed-name.html : different length
-/sdcard/android/layout_tests/fast/loader/cancel-load-during-port-block-timer.html : TIMEDOUT
-/sdcard/android/layout_tests/fast/loader/local-iFrame-source-from-local.html : different length
-/sdcard/android/layout_tests/fast/loader/null-request-after-willSendRequest.html : different length
-/sdcard/android/layout_tests/fast/loader/stop-provisional-loads.html : different length
-/sdcard/android/layout_tests/fast/loader/xmlhttprequest-missing-file-exception.html : different length
-/sdcard/android/layout_tests/fast/loader/onunload-form-submit-crash-2.html : different length
-/sdcard/android/layout_tests/fast/loader/plain-text-document.html : different length
-/sdcard/android/layout_tests/fast/loader/onunload-form-submit-crash.html : different length
-/sdcard/android/layout_tests/fast/loader/local-image-from-local.html : different length
-/sdcard/android/layout_tests/fast/loader/local-CSS-from-local.html : TIMEDOUT
-/sdcard/android/layout_tests/fast/loader/local-JavaScript-from-local.html : different length
-/sdcard/android/layout_tests/fast/loader/data-url-encoding-svg.html : different length
-/sdcard/android/layout_tests/fast/loader/opaque-base-url.html : @offset: 129
-/sdcard/android/layout_tests/fast/canvas/canvas-alphaImageData-behavior.html : different length
-/sdcard/android/layout_tests/fast/canvas/pointInPath.html : different length
-/sdcard/android/layout_tests/fast/canvas/toDataURL-supportedTypes.html : different length
-/sdcard/android/layout_tests/fast/canvas/canvas-getImageData.html : different length
-/sdcard/android/layout_tests/fast/canvas/canvas-longlived-context.html : TIMEDOUT
-/sdcard/android/layout_tests/fast/canvas/canvas-save-restore-with-path.html : different length
-/sdcard/android/layout_tests/fast/canvas/set-colors.html : different length
-/sdcard/android/layout_tests/fast/frames/viewsource-empty-attribute-value.html : different length
-/sdcard/android/layout_tests/fast/frames/frame-deep-nested-resize.html : different length
-/sdcard/android/layout_tests/fast/frames/iframe-window-focus.html : different length
-/sdcard/android/layout_tests/fast/frames/frameElement-widthheight.html : different length
-/sdcard/android/layout_tests/fast/frames/removal-before-attach-crash.html : different length
-/sdcard/android/layout_tests/fast/frames/frame-js-url-clientWidth.html : different length
+/sdcard/android/layout_tests/webarchive/loading/test-loading-archive.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement19.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLFormElement10.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement16.html
+/sdcard/android/layout_tests/media/video-error-does-not-exist.html
+/sdcard/android/layout_tests/media/audio-constructor.html
+/sdcard/android/layout_tests/media/video-start.html
+/sdcard/android/layout_tests/media/video-loopend.html
+/sdcard/android/layout_tests/media/video-play-empty-events.html
+/sdcard/android/layout_tests/media/constructors.html
+/sdcard/android/layout_tests/media/video-append-source.html
+/sdcard/android/layout_tests/media/unsupported-rtsp.html
+/sdcard/android/layout_tests/media/video-dom-autoplay.html
+/sdcard/android/layout_tests/media/video-currentTime-set2.html
+/sdcard/android/layout_tests/media/video-poster.html
+/sdcard/android/layout_tests/media/video-source-media.html
+/sdcard/android/layout_tests/media/video-muted.html
+/sdcard/android/layout_tests/media/progress-event.html
+/sdcard/android/layout_tests/media/video-source-type.html
+/sdcard/android/layout_tests/media/video-seek-past-end-playing.html
+/sdcard/android/layout_tests/media/video-dom-src.html
+/sdcard/android/layout_tests/media/remove-from-document.html
+/sdcard/android/layout_tests/media/video-end.html
+/sdcard/android/layout_tests/media/video-src-change.html
+/sdcard/android/layout_tests/media/video-seekable.html
+/sdcard/android/layout_tests/media/video-click-dblckick-standalone.html
+/sdcard/android/layout_tests/media/video-src-set.html
+/sdcard/android/layout_tests/media/video-seeking.html
+/sdcard/android/layout_tests/media/video-controls-transformed.html
+/sdcard/android/layout_tests/media/loopend-limits.html
+/sdcard/android/layout_tests/media/video-volume.html
+/sdcard/android/layout_tests/media/video-size.html
+/sdcard/android/layout_tests/media/video-width-height.html
+/sdcard/android/layout_tests/media/video-loopstart.html
+/sdcard/android/layout_tests/media/video-source.html
+/sdcard/android/layout_tests/media/video-currentTime.html
+/sdcard/android/layout_tests/media/video-dom-loopstart.html
+/sdcard/android/layout_tests/media/broken-video.html
+/sdcard/android/layout_tests/media/video-buffered.html
+/sdcard/android/layout_tests/media/video-load-readyState.html
+/sdcard/android/layout_tests/media/video-dom-end.html
+/sdcard/android/layout_tests/media/fallback.html
+/sdcard/android/layout_tests/media/video-load-networkState.html
+/sdcard/android/layout_tests/media/unsupported-tracks.html
+/sdcard/android/layout_tests/media/video-dom-start.html
+/sdcard/android/layout_tests/media/video-seek-past-end-paused.html
+/sdcard/android/layout_tests/media/video-play-pause-events.html
+/sdcard/android/layout_tests/media/video-autoplay.html
+/sdcard/android/layout_tests/media/video-controls.html
+/sdcard/android/layout_tests/media/loopstart-limits.html
+/sdcard/android/layout_tests/media/video-src-source.html
+/sdcard/android/layout_tests/media/video-currentTime-set.html
+/sdcard/android/layout_tests/media/video-source-type-params.html
+/sdcard/android/layout_tests/media/video-no-autoplay.html
+/sdcard/android/layout_tests/media/video-pause-empty-events.html
+/sdcard/android/layout_tests/media/video-play-pause-exception.html
+/sdcard/android/layout_tests/media/video-dom-loopend.html
+/sdcard/android/layout_tests/media/video-loopcount.html
+/sdcard/android/layout_tests/media/video-src-remove.html
+/sdcard/android/layout_tests/media/video-src.html
+/sdcard/android/layout_tests/media/video-error-abort.html
+/sdcard/android/layout_tests/media/video-dom-loopcount.html
+/sdcard/android/layout_tests/media/progress-event-total.html
+/sdcard/android/layout_tests/media/audio-constructor-src.html
+/sdcard/android/layout_tests/plugins/throw-on-dealloc.html
+/sdcard/android/layout_tests/plugins/invoke.html
+/sdcard/android/layout_tests/plugins/plugin-remove-subframe.html
+/sdcard/android/layout_tests/plugins/netscape-identifier-conversion.html
+/sdcard/android/layout_tests/plugins/call-as-function-test.html
+/sdcard/android/layout_tests/plugins/npruntime.html
+/sdcard/android/layout_tests/plugins/netscape-construct.html
+/sdcard/android/layout_tests/plugins/root-object-premature-delete-crash.html
+/sdcard/android/layout_tests/plugins/netscape-get-property-return-value.html
+/sdcard/android/layout_tests/plugins/mouse-events.html
+/sdcard/android/layout_tests/plugins/return-error-from-new-stream-doesnt-invoke-destroy-stream.html
+/sdcard/android/layout_tests/plugins/destroy-stream-twice.html
+/sdcard/android/layout_tests/plugins/jsobjc-simple.html
+/sdcard/android/layout_tests/plugins/embed-attributes-setting.html
+/sdcard/android/layout_tests/plugins/inner-html-display-none.html
+/sdcard/android/layout_tests/plugins/netscape-invoke-default.html
+/sdcard/android/layout_tests/plugins/undefined-property-crash.html
+/sdcard/android/layout_tests/plugins/netscape-plugin-setwindow-size-2.html
+/sdcard/android/layout_tests/plugins/jsobjc-dom-wrappers.html
+/sdcard/android/layout_tests/plugins/plugin-javascript-access.html
+/sdcard/android/layout_tests/plugins/getintidentifier-special-values.html
+/sdcard/android/layout_tests/plugins/geturl-replace-query.html
+/sdcard/android/layout_tests/plugins/netscape-destroy-plugin-script-objects.html
+/sdcard/android/layout_tests/plugins/open-and-close-window-with-plugin.html
+/sdcard/android/layout_tests/plugins/netscape-enumerate.html
+/sdcard/android/layout_tests/plugins/get-url-that-the-resource-load-delegate-will-disallow.html
+/sdcard/android/layout_tests/plugins/netscape-plugin-setwindow-size.html
+/sdcard/android/layout_tests/plugins/embed-inside-object.html
+/sdcard/android/layout_tests/plugins/netscape-throw-exception.html
+/sdcard/android/layout_tests/plugins/get-url-with-blank-target.html
+/sdcard/android/layout_tests/plugins/bindings-test.html
+/sdcard/android/layout_tests/editing/input/textarea-arrow-navigation.html
+/sdcard/android/layout_tests/editing/inserting/typing-tab-designmode.html
+/sdcard/android/layout_tests/editing/inserting/5994480-2.html
+/sdcard/android/layout_tests/editing/execCommand/queryCommandState-01.html
+/sdcard/android/layout_tests/editing/execCommand/5543472-3.html
+/sdcard/android/layout_tests/editing/execCommand/enabling-and-selection.html
+/sdcard/android/layout_tests/editing/execCommand/5658933-2.html
+/sdcard/android/layout_tests/editing/execCommand/insert-line-break-no-scroll.html
+/sdcard/android/layout_tests/editing/execCommand/enabling-and-selection-2.html
+/sdcard/android/layout_tests/editing/execCommand/delete-no-scroll.html
+/sdcard/android/layout_tests/editing/execCommand/forward-delete-no-scroll.html
+/sdcard/android/layout_tests/editing/execCommand/19089.html
+/sdcard/android/layout_tests/editing/execCommand/unlink.html
+/sdcard/android/layout_tests/editing/execCommand/5543472-2.html
+/sdcard/android/layout_tests/editing/execCommand/copy-without-selection.html
+/sdcard/android/layout_tests/editing/execCommand/findString-diacriticals.html
+/sdcard/android/layout_tests/editing/execCommand/5658933-3.html
+/sdcard/android/layout_tests/editing/execCommand/createLink.html
+/sdcard/android/layout_tests/editing/execCommand/5543472-1.html
+/sdcard/android/layout_tests/editing/execCommand/5939887.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-into-anchor-text.html
+/sdcard/android/layout_tests/editing/pasteboard/copy-crash.html
+/sdcard/android/layout_tests/editing/pasteboard/5665299.html
+/sdcard/android/layout_tests/editing/pasteboard/5761530-1.html
+/sdcard/android/layout_tests/editing/pasteboard/copy-in-password-field.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-plaintext-user-select-none.html
+/sdcard/android/layout_tests/editing/pasteboard/drag-image-in-about-blank-frame.html
+/sdcard/android/layout_tests/editing/pasteboard/4744008.html
+/sdcard/android/layout_tests/editing/pasteboard/4922709.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-text-013.html
+/sdcard/android/layout_tests/editing/pasteboard/5780697-2.html
+/sdcard/android/layout_tests/editing/pasteboard/4840662.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-table-002.html
+/sdcard/android/layout_tests/editing/selection/drag-text-delay.html
+/sdcard/android/layout_tests/editing/selection/skip-non-editable-1.html
+/sdcard/android/layout_tests/editing/selection/move-by-line-003.html
+/sdcard/android/layout_tests/editing/selection/anchor-focus1.html
+/sdcard/android/layout_tests/editing/selection/getRangeAt.html
+/sdcard/android/layout_tests/editing/selection/select-all-textarea.html
+/sdcard/android/layout_tests/editing/selection/doubleclick-whitespace.html
+/sdcard/android/layout_tests/editing/selection/after-line-break.html
+/sdcard/android/layout_tests/editing/selection/legal-positions.html
+/sdcard/android/layout_tests/editing/selection/anchor-focus3.html
+/sdcard/android/layout_tests/editing/selection/toString.html
+/sdcard/android/layout_tests/editing/selection/extend-selection-bidi.html
+/sdcard/android/layout_tests/editing/selection/inactive-selection.html
+/sdcard/android/layout_tests/editing/selection/removeAllRanges.html
+/sdcard/android/layout_tests/editing/selection/5209984.html
+/sdcard/android/layout_tests/editing/selection/skip-non-editable-2.html
+/sdcard/android/layout_tests/editing/selection/toString-1.html
+/sdcard/android/layout_tests/editing/selection/anchor-focus2.html
+/sdcard/android/layout_tests/editing/selection/move-begin-end.html
+/sdcard/android/layout_tests/editing/selection/move-left-right.html
+/sdcard/android/layout_tests/editing/selection/click-before-and-after-table.html
+/sdcard/android/layout_tests/editing/undo/undo-iframe-location-change.html
+/sdcard/android/layout_tests/editing/deleting/pruning-after-merge-1.html
+/sdcard/android/layout_tests/editing/deleting/5546763.html
+/sdcard/android/layout_tests/editing/deleting/5729680.html
+/sdcard/android/layout_tests/editing/deleting/4916235-1.html
+/sdcard/android/layout_tests/editing/deleting/delete-ligature-001.html
+/sdcard/android/layout_tests/editing/deleting/delete-ligature-003.html
+/sdcard/android/layout_tests/editing/deleting/5890684.html
+/sdcard/android/layout_tests/editing/deleting/smart-editing-disabled.html
+/sdcard/android/layout_tests/editing/deleting/delete-ligature-002.html
+/sdcard/android/layout_tests/editing/deleting/delete-all-text-in-text-field-assertion.html
+/sdcard/android/layout_tests/accessibility/image-map1.html
+/sdcard/android/layout_tests/accessibility/aria-labelledby-on-input.html
+/sdcard/android/layout_tests/accessibility/content-editable.html
+/sdcard/android/layout_tests/accessibility/frame-with-title.html
+/sdcard/android/layout_tests/accessibility/textarea-insertion-point-line-number.html
+/sdcard/android/layout_tests/accessibility/table-with-rules.html
+/sdcard/android/layout_tests/accessibility/aria-describedby-on-input.html
+/sdcard/android/layout_tests/accessibility/radio-button-checkbox-size.html
+/sdcard/android/layout_tests/accessibility/table-detection.html
+/sdcard/android/layout_tests/accessibility/th-as-title-ui.html
+/sdcard/android/layout_tests/accessibility/table-with-aria-role.html
+/sdcard/android/layout_tests/accessibility/accesskey.html
+/sdcard/android/layout_tests/accessibility/image-map2.html
+/sdcard/android/layout_tests/accessibility/iframe-bastardization.html
+/sdcard/android/layout_tests/accessibility/aria-spinbutton.html
+/sdcard/android/layout_tests/accessibility/button-press-action.html
+/sdcard/android/layout_tests/accessibility/table-cell-spans.html
+/sdcard/android/layout_tests/accessibility/table-cells.html
+/sdcard/android/layout_tests/accessibility/double-title.html
+/sdcard/android/layout_tests/accessibility/lists.html
+/sdcard/android/layout_tests/accessibility/plugin.html
+/sdcard/android/layout_tests/accessibility/table-sections.html
+/sdcard/android/layout_tests/accessibility/textarea-selected-text-range.html
+/sdcard/android/layout_tests/accessibility/input-image-url.html
+/sdcard/android/layout_tests/accessibility/aria-range-value.html
+/sdcard/android/layout_tests/accessibility/table-one-cell.html
+/sdcard/android/layout_tests/accessibility/internal-link-anchors2.html
+/sdcard/android/layout_tests/accessibility/table-nofirstbody.html
+/sdcard/android/layout_tests/accessibility/table-modification-crash.html
+/sdcard/android/layout_tests/accessibility/radio-button-group-members.html
+/sdcard/android/layout_tests/accessibility/aria-link-supports-press.html
+/sdcard/android/layout_tests/accessibility/document-attributes.html
+/sdcard/android/layout_tests/accessibility/table-notbody.html
+/sdcard/android/layout_tests/accessibility/aria-range.html
+/sdcard/android/layout_tests/accessibility/bounds-for-range.html
+/sdcard/android/layout_tests/accessibility/table-attributes.html
+/sdcard/android/layout_tests/accessibility/textarea-line-for-index.html
+/sdcard/android/layout_tests/accessibility/aria-slider.html
+/sdcard/android/layout_tests/accessibility/document-links.html
+/sdcard/android/layout_tests/accessibility/legend.html
+/sdcard/android/layout_tests/accessibility/aria-roles.html
+/sdcard/android/layout_tests/accessibility/nochildren-elements.html
+/sdcard/android/layout_tests/accessibility/internal-link-anchors.html
+/sdcard/android/layout_tests/fast/replaced/image-map-bug16782.html
+/sdcard/android/layout_tests/fast/replaced/table-percent-height.html
+/sdcard/android/layout_tests/fast/replaced/image-map.html
+/sdcard/android/layout_tests/fast/dynamic/paused-event-dispatch.html
+/sdcard/android/layout_tests/fast/text/plain-text-line-breaks.html
+/sdcard/android/layout_tests/fast/text/zero-width-characters.html
+/sdcard/android/layout_tests/fast/text/reset-drag-on-mouse-down.html
+/sdcard/android/layout_tests/fast/encoding/invalid-xml.html
+/sdcard/android/layout_tests/fast/encoding/char-decoding-mac.html
+/sdcard/android/layout_tests/fast/encoding/frame-default-enc.html
+/sdcard/android/layout_tests/fast/encoding/mailto-always-utf-8.html
+/sdcard/android/layout_tests/fast/encoding/char-decoding.html
+/sdcard/android/layout_tests/fast/encoding/url-host-name-non-ascii.html
+/sdcard/android/layout_tests/fast/encoding/idn-security.html
+/sdcard/android/layout_tests/fast/encoding/percent-escaping.html
+/sdcard/android/layout_tests/fast/encoding/xml-utf-8-default.xml
+/sdcard/android/layout_tests/fast/encoding/char-encoding-mac.html
+/sdcard/android/layout_tests/fast/encoding/yahoo-mail.html
+/sdcard/android/layout_tests/fast/encoding/charset-koi8-u.html
+/sdcard/android/layout_tests/fast/encoding/ahram-org-eg.html
+/sdcard/android/layout_tests/fast/encoding/noscript-in-head.html
+/sdcard/android/layout_tests/fast/workers/worker-location.html
+/sdcard/android/layout_tests/fast/workers/worker-constructor.html
+/sdcard/android/layout_tests/fast/workers/stress-js-execution.html
+/sdcard/android/layout_tests/fast/workers/worker-terminate.html
+/sdcard/android/layout_tests/fast/workers/worker-gc.html
+/sdcard/android/layout_tests/fast/workers/worker-navigator.html
+/sdcard/android/layout_tests/fast/workers/worker-replace-global-constructor.html
+/sdcard/android/layout_tests/fast/workers/worker-replace-self.html
+/sdcard/android/layout_tests/fast/workers/worker-event-listener.html
+/sdcard/android/layout_tests/fast/selectors/lang-inheritance.html
+/sdcard/android/layout_tests/fast/selectors/lang-vs-xml-lang.html
+/sdcard/android/layout_tests/fast/selectors/lang-inheritance2.html
+/sdcard/android/layout_tests/fast/overflow/scroll-vertical-not-horizontal.html
+/sdcard/android/layout_tests/fast/events/onunload.html
+/sdcard/android/layout_tests/fast/events/mouseup-outside-document.html
+/sdcard/android/layout_tests/fast/events/offsetX-offsetY.html
+/sdcard/android/layout_tests/fast/events/scroll-event-does-not-bubble.html
+/sdcard/android/layout_tests/fast/events/mouseover-mouseout.html
+/sdcard/android/layout_tests/fast/events/option-tab.html
+/sdcard/android/layout_tests/fast/events/popup-blocking-click-in-iframe.html
+/sdcard/android/layout_tests/fast/events/tabindex-focus-blur-all.html
+/sdcard/android/layout_tests/fast/events/onchange-passwordfield.html
+/sdcard/android/layout_tests/fast/events/drag-in-frames.html
+/sdcard/android/layout_tests/fast/events/frame-tab-focus.html
+/sdcard/android/layout_tests/fast/events/autoscroll-in-textfield.html
+/sdcard/android/layout_tests/fast/events/arrow-navigation.html
+/sdcard/android/layout_tests/fast/events/fire-scroll-event.html
+/sdcard/android/layout_tests/fast/events/attempt-scroll-with-no-scrollbars.html
+/sdcard/android/layout_tests/fast/events/mouseclick-target-and-positioning.html
+/sdcard/android/layout_tests/fast/events/keydown-keypress-focus-change.html
+/sdcard/android/layout_tests/fast/events/input-image-scrolled-x-y.html
+/sdcard/android/layout_tests/fast/events/dblclick-addEventListener.html
+/sdcard/android/layout_tests/fast/events/frame-programmatic-focus.html
+/sdcard/android/layout_tests/fast/events/context-onmousedown-event.html
+/sdcard/android/layout_tests/fast/events/content-changed-during-drop.html
+/sdcard/android/layout_tests/fast/events/autoscroll-with-non-scrollable-parent.html
+/sdcard/android/layout_tests/fast/events/window-events-capture.html
+/sdcard/android/layout_tests/fast/events/onchange-click-hang.html
+/sdcard/android/layout_tests/fast/events/onload-webkit-before-webcore.html
+/sdcard/android/layout_tests/fast/events/window-events-bubble2.html
+/sdcard/android/layout_tests/fast/events/js-keyboard-event-creation.html
+/sdcard/android/layout_tests/fast/events/event-view-toString.html
+/sdcard/android/layout_tests/fast/events/onchange-select-popup.html
+/sdcard/android/layout_tests/fast/events/access-key-self-destruct.html
+/sdcard/android/layout_tests/fast/events/scrollbar-double-click.html
+/sdcard/android/layout_tests/fast/events/onunload-clears-onbeforeunload.html
+/sdcard/android/layout_tests/fast/events/tabindex-focus-chain.html
+/sdcard/android/layout_tests/fast/events/capture-on-target.html
+/sdcard/android/layout_tests/fast/events/window-events-bubble.html
+/sdcard/android/layout_tests/fast/events/mouseup-from-button2.html
+/sdcard/android/layout_tests/fast/events/frame-click-focus.html
+/sdcard/android/layout_tests/fast/events/mouseout-on-window.html
+/sdcard/android/layout_tests/fast/events/keypress-insert-tab.html
+/sdcard/android/layout_tests/fast/events/mouseout-dead-subframe.html
+/sdcard/android/layout_tests/fast/events/iframe-object-onload.html
+/sdcard/android/layout_tests/fast/events/onunload-not-on-body.html
+/sdcard/android/layout_tests/fast/events/mousemove-after-drag-over-scrollbar.html
+/sdcard/android/layout_tests/fast/events/contextmenu-scrolled-page-with-frame.html
+/sdcard/android/layout_tests/fast/events/key-events-in-input-button.html
+/sdcard/android/layout_tests/fast/events/arrow-keys-on-body.html
+/sdcard/android/layout_tests/fast/events/ondragenter.html
+/sdcard/android/layout_tests/fast/events/pointer-events.html
+/sdcard/android/layout_tests/fast/events/scroll-to-anchor-in-overflow-hidden.html
+/sdcard/android/layout_tests/fast/events/autoscroll-nonscrollable-iframe-in-scrollable-div.html
+/sdcard/android/layout_tests/fast/events/keypress-focus-change.html
+/sdcard/android/layout_tests/fast/events/key-events-in-input-text.html
+/sdcard/android/layout_tests/fast/events/pointer-events-2.html
+/sdcard/android/layout_tests/fast/events/drag-outside-window.html
+/sdcard/android/layout_tests/fast/events/click-count.html
+/sdcard/android/layout_tests/fast/events/onchange-searchfield.html
+/sdcard/android/layout_tests/fast/events/special-key-events-in-input-text.html
+/sdcard/android/layout_tests/fast/events/keydown-keypress-preventDefault.html
+/sdcard/android/layout_tests/fast/events/mouse-click-events.html
+/sdcard/android/layout_tests/fast/events/onsearch-enter.html
+/sdcard/android/layout_tests/fast/events/mouseover-mouseout2.html
+/sdcard/android/layout_tests/fast/events/open-window-from-another-frame.html
+/sdcard/android/layout_tests/fast/events/init-events.html
+/sdcard/android/layout_tests/fast/events/onchange-textfield.html
+/sdcard/android/layout_tests/fast/events/onclick-list-marker.html
+/sdcard/android/layout_tests/fast/events/anchor-image-scrolled-x-y.html
+/sdcard/android/layout_tests/fast/html/tab-order.html
+/sdcard/android/layout_tests/fast/regex/test1.html
+/sdcard/android/layout_tests/fast/js/kde/garbage-n.html
+/sdcard/android/layout_tests/fast/js/kde/Number.html
+/sdcard/android/layout_tests/fast/js/kde/string-2-n.html
+/sdcard/android/layout_tests/fast/js/kde/encode_decode_uri.html
+/sdcard/android/layout_tests/fast/js/kde/string-1-n.html
+/sdcard/android/layout_tests/fast/js/exception-sequencing-binops.html
+/sdcard/android/layout_tests/fast/js/recursion-limit-equal.html
+/sdcard/android/layout_tests/fast/js/exception-sequencing-binops2.html
+/sdcard/android/layout_tests/fast/js/math-transforms.html
+/sdcard/android/layout_tests/fast/js/try-catch-crash.html
+/sdcard/android/layout_tests/fast/js/array-iterate-backwards.html
+/sdcard/android/layout_tests/fast/js/navigator-mimeTypes-length.html
+/sdcard/android/layout_tests/fast/js/global-constructors.html
+/sdcard/android/layout_tests/fast/js/uncaught-exception-line-number.html
+/sdcard/android/layout_tests/fast/js/exceptions-thrown-in-callbacks.html
+/sdcard/android/layout_tests/fast/js/toString-and-valueOf-override.html
+/sdcard/android/layout_tests/fast/js/function-toString-parentheses.html
+/sdcard/android/layout_tests/fast/js/large-expressions.html
+/sdcard/android/layout_tests/fast/js/exception-sequencing.html
+/sdcard/android/layout_tests/fast/js/exception-codegen-crash.html
+/sdcard/android/layout_tests/fast/dom/HTMLDocument/activeElement.html
+/sdcard/android/layout_tests/fast/dom/HTMLDocument/document-special-properties.html
+/sdcard/android/layout_tests/fast/dom/HTMLDocument/url-getset.html
+/sdcard/android/layout_tests/fast/dom/HTMLDocument/hasFocus.html
+/sdcard/android/layout_tests/fast/dom/HTMLSelectElement/listbox-select-reset.html
+/sdcard/android/layout_tests/fast/dom/Document/early-document-access.html
+/sdcard/android/layout_tests/fast/dom/Element/offsetLeft-offsetTop-body-quirk.html
+/sdcard/android/layout_tests/fast/dom/DOMException/XPathException.html
+/sdcard/android/layout_tests/fast/dom/getElementsByClassName/010.xml
+/sdcard/android/layout_tests/fast/dom/getElementsByClassName/011.xml
+/sdcard/android/layout_tests/fast/dom/Window/window-resize-and-move-arguments.html
+/sdcard/android/layout_tests/fast/dom/Window/timeout-released-on-close.html
+/sdcard/android/layout_tests/fast/dom/Window/window-function-name-getter-precedence.html
+/sdcard/android/layout_tests/fast/dom/Window/window-xy-properties.html
+/sdcard/android/layout_tests/fast/dom/Window/console-functions.html
+/sdcard/android/layout_tests/fast/dom/Window/window-screen-properties.html
+/sdcard/android/layout_tests/fast/dom/Window/window-properties.html
+/sdcard/android/layout_tests/fast/dom/Window/window-onFocus.html
+/sdcard/android/layout_tests/fast/dom/Window/new-window-opener.html
+/sdcard/android/layout_tests/fast/dom/Window/window-open-pending-url.html
+/sdcard/android/layout_tests/fast/dom/Window/setting-properties-on-closed-window.html
+/sdcard/android/layout_tests/fast/dom/Window/dom-access-from-closure-window.html
+/sdcard/android/layout_tests/fast/dom/Window/window-resize.html
+/sdcard/android/layout_tests/fast/dom/Window/closure-access-after-navigation-window.html
+/sdcard/android/layout_tests/fast/dom/Window/window-special-properties.html
+/sdcard/android/layout_tests/fast/dom/Window/dom-access-from-closure-iframe.html
+/sdcard/android/layout_tests/fast/dom/Window/Plug-ins.html
+/sdcard/android/layout_tests/fast/dom/Window/get-set-properties.html
+/sdcard/android/layout_tests/fast/dom/Window/window-scroll-arguments.html
+/sdcard/android/layout_tests/fast/dom/Window/window-early-properties.html
+/sdcard/android/layout_tests/fast/dom/StyleSheet/ownerNode-lifetime-2.html
+/sdcard/android/layout_tests/fast/dom/dom-constructors.html
+/sdcard/android/layout_tests/fast/dom/assign-to-window-status.html
+/sdcard/android/layout_tests/fast/dom/gc-8.html
+/sdcard/android/layout_tests/fast/dom/object-embed-plugin-scripting.html
+/sdcard/android/layout_tests/fast/dom/node-filter-gc.html
+/sdcard/android/layout_tests/fast/dom/noscript-canvas-in-created-html-document.html
+/sdcard/android/layout_tests/fast/dom/DOMParser-assign-variable.html
+/sdcard/android/layout_tests/fast/dom/timer-clear-interval-in-handler.html
+/sdcard/android/layout_tests/fast/dom/implementation-createHTMLDocument.html
+/sdcard/android/layout_tests/fast/dom/iframe-document.html
+/sdcard/android/layout_tests/fast/dom/document-all-input.html
+/sdcard/android/layout_tests/fast/dom/null-document-location-href-put-crash.html
+/sdcard/android/layout_tests/fast/dom/getelementsbytagnamens-mixed-namespaces.html
+/sdcard/android/layout_tests/fast/dom/object-plugin-hides-properties.html
+/sdcard/android/layout_tests/fast/dom/gc-2.html
+/sdcard/android/layout_tests/fast/dom/computed-style-set-property.html
+/sdcard/android/layout_tests/fast/dom/inner-text-001.html
+/sdcard/android/layout_tests/fast/dom/css-selectorText.html
+/sdcard/android/layout_tests/fast/dom/replace-first-child.html
+/sdcard/android/layout_tests/fast/dom/importNode-null.html
+/sdcard/android/layout_tests/fast/dom/select-selectedIndex-multiple.html
+/sdcard/android/layout_tests/fast/dom/gc-9.html
+/sdcard/android/layout_tests/fast/dom/NamedNodeMap-setNamedItem-crash.html
+/sdcard/android/layout_tests/fast/dom/wrapper-classes.html
+/sdcard/android/layout_tests/fast/dom/select-selectedIndex.html
+/sdcard/android/layout_tests/fast/dom/document-width-height-force-layout.html
+/sdcard/android/layout_tests/fast/dom/gc-acid3.html
+/sdcard/android/layout_tests/fast/dom/client-width-height.html
+/sdcard/android/layout_tests/fast/dom/global-constructors.html
+/sdcard/android/layout_tests/fast/dom/client-width-height-quirks.html
+/sdcard/android/layout_tests/fast/dom/javascript-url-crash-function.html
+/sdcard/android/layout_tests/fast/dom/location-hash.html
+/sdcard/android/layout_tests/fast/dom/constructors-cached.html
+/sdcard/android/layout_tests/fast/dom/non-numeric-values-numeric-parameters.html
+/sdcard/android/layout_tests/fast/dom/documenturi-can-hold-arbitrary-string.html
+/sdcard/android/layout_tests/fast/dom/documenturi-not-affected-by-base-tag.html
+/sdcard/android/layout_tests/fast/dom/open-and-close-by-DOM.html
+/sdcard/android/layout_tests/fast/dom/set-frame-src-while-running-script-in-frame.html
+/sdcard/android/layout_tests/fast/dom/document_write_params.html
+/sdcard/android/layout_tests/fast/dom/namednodemap-namelookup.html
+/sdcard/android/layout_tests/fast/dom/null-document-location-replace-crash.html
+/sdcard/android/layout_tests/fast/dom/htmlcollection-detectability.html
+/sdcard/android/layout_tests/fast/dom/documenturi-assigned-junk-implies-relative-urls-do-not-resolve.html
+/sdcard/android/layout_tests/fast/dom/collection-namedItem-via-item.html
+/sdcard/android/layout_tests/fast/dom/set-inner-text-newlines.html
+/sdcard/android/layout_tests/fast/dom/document-dir-property.html
+/sdcard/android/layout_tests/fast/dom/undetectable-style-filter.html
+/sdcard/android/layout_tests/fast/dom/tabindex-clamp.html
+/sdcard/android/layout_tests/fast/dom/constructors-cached-navigate.html
+/sdcard/android/layout_tests/fast/dom/frame-loading-via-document-write.html
+/sdcard/android/layout_tests/fast/xpath/4XPath/Borrowed/od_20000608.html
+/sdcard/android/layout_tests/fast/xpath/4XPath/Borrowed/namespace-nodes.html
+/sdcard/android/layout_tests/fast/xpath/4XPath/Borrowed/rs_20010831.html
+/sdcard/android/layout_tests/fast/xpath/4XPath/Borrowed/sr_20021217.html
+/sdcard/android/layout_tests/fast/xpath/4XPath/Borrowed/kd_20010423.html
+/sdcard/android/layout_tests/fast/xpath/4XPath/Borrowed/cz_20030217.html
+/sdcard/android/layout_tests/fast/xpath/4XPath/Core/test_boolean_expr.html
+/sdcard/android/layout_tests/fast/xpath/4XPath/Core/test_core_functions.html
+/sdcard/android/layout_tests/fast/xpath/4XPath/Core/test_location_path.html
+/sdcard/android/layout_tests/fast/xpath/4XPath/Core/test_node_test.html
+/sdcard/android/layout_tests/fast/xpath/4XPath/Core/test_literal_expr.html
+/sdcard/android/layout_tests/fast/xpath/4XPath/Core/test_predicate_list.html
+/sdcard/android/layout_tests/fast/xpath/4XPath/Core/test_parser.html
+/sdcard/android/layout_tests/fast/xpath/4XPath/Core/test_nodeset_expr.html
+/sdcard/android/layout_tests/fast/xpath/4XPath/Core/test_numeric_expr.html
+/sdcard/android/layout_tests/fast/xpath/4XPath/Core/test_step.html
+/sdcard/android/layout_tests/fast/xpath/ancestor-axis.html
+/sdcard/android/layout_tests/fast/xpath/string-value.html
+/sdcard/android/layout_tests/fast/xpath/name-null-namespace.html
+/sdcard/android/layout_tests/fast/xpath/id-simple.html
+/sdcard/android/layout_tests/fast/xpath/id-path.html
+/sdcard/android/layout_tests/fast/xpath/implicit-node-args.html
+/sdcard/android/layout_tests/fast/xpath/text-nodes.html
+/sdcard/android/layout_tests/fast/xpath/invalid-functions.html
+/sdcard/android/layout_tests/fast/xpath/xpath-namespaces.html
+/sdcard/android/layout_tests/fast/xpath/xpath-functional-test.html
+/sdcard/android/layout_tests/fast/xpath/complex-id.html
+/sdcard/android/layout_tests/fast/xpath/attr-namespace.html
+/sdcard/android/layout_tests/fast/xpath/substring-after.html
+/sdcard/android/layout_tests/fast/xpath/evaluate-twice.html
+/sdcard/android/layout_tests/fast/xpath/empty-string-substring.html
+/sdcard/android/layout_tests/fast/xpath/document-order.html
+/sdcard/android/layout_tests/fast/xpath/nodeset-duplicates.html
+/sdcard/android/layout_tests/fast/xpath/nan-to-boolean.html
+/sdcard/android/layout_tests/fast/xpath/reverse-axes.html
+/sdcard/android/layout_tests/fast/forms/mailto/get-non-ascii-text-plain.html
+/sdcard/android/layout_tests/fast/forms/mailto/advanced-get.html
+/sdcard/android/layout_tests/fast/forms/mailto/get-non-ascii-text-plain-latin-1.html
+/sdcard/android/layout_tests/fast/forms/mailto/post-multiple-items-multipart-form-data.html
+/sdcard/android/layout_tests/fast/forms/mailto/get-multiple-items.html
+/sdcard/android/layout_tests/fast/forms/mailto/get-non-ascii-always-utf-8.html
+/sdcard/android/layout_tests/fast/forms/mailto/post-multiple-items.html
+/sdcard/android/layout_tests/fast/forms/mailto/post-append-query.html
+/sdcard/android/layout_tests/fast/forms/mailto/get-multiple-items-x-www-form-urlencoded.html
+/sdcard/android/layout_tests/fast/forms/mailto/get-overwrite-query.html
+/sdcard/android/layout_tests/fast/forms/mailto/post-multiple-items-x-www-form-urlencoded.html
+/sdcard/android/layout_tests/fast/forms/mailto/get-multiple-items-text-plain.html
+/sdcard/android/layout_tests/fast/forms/mailto/post-multiple-items-text-plain.html
+/sdcard/android/layout_tests/fast/forms/mailto/get-non-ascii.html
+/sdcard/android/layout_tests/fast/forms/mailto/post-text-plain-with-accept-charset.html
+/sdcard/android/layout_tests/fast/forms/mailto/post-text-plain.html
+/sdcard/android/layout_tests/fast/forms/mailto/advanced-put.html
+/sdcard/android/layout_tests/fast/forms/listbox-typeahead-scroll.html
+/sdcard/android/layout_tests/fast/forms/select-empty-list.html
+/sdcard/android/layout_tests/fast/forms/select-accesskey.html
+/sdcard/android/layout_tests/fast/forms/focus2.html
+/sdcard/android/layout_tests/fast/forms/password-doubleclick-selection.html
+/sdcard/android/layout_tests/fast/forms/textfield-inside-anchor.html
+/sdcard/android/layout_tests/fast/forms/textarea-trailing-newline.html
+/sdcard/android/layout_tests/fast/forms/legend-access-key.html
+/sdcard/android/layout_tests/fast/forms/input-maxlength.html
+/sdcard/android/layout_tests/fast/forms/selection-functions.html
+/sdcard/android/layout_tests/fast/forms/textfield-to-password-on-focus.html
+/sdcard/android/layout_tests/fast/forms/select-reset.html
+/sdcard/android/layout_tests/fast/forms/focus-selection-textarea.html
+/sdcard/android/layout_tests/fast/forms/enter-clicks-buttons.html
+/sdcard/android/layout_tests/fast/forms/radio_checked_name.html
+/sdcard/android/layout_tests/fast/forms/radio-check-click-and-drag.html
+/sdcard/android/layout_tests/fast/forms/select-double-onchange.html
+/sdcard/android/layout_tests/fast/forms/button-enter-click.html
+/sdcard/android/layout_tests/fast/forms/search-click-in-placeholder.html
+/sdcard/android/layout_tests/fast/forms/autofocus-opera-003.html
+/sdcard/android/layout_tests/fast/forms/search-hidden-cancel-button.html
+/sdcard/android/layout_tests/fast/forms/dragging-to-file-input.html
+/sdcard/android/layout_tests/fast/forms/textarea-paste-newline.html
+/sdcard/android/layout_tests/fast/forms/drag-into-textarea.html
+/sdcard/android/layout_tests/fast/forms/onselect-textfield.html
+/sdcard/android/layout_tests/fast/forms/input-implicit-length-limit.html
+/sdcard/android/layout_tests/fast/forms/form-and-frame-interaction-retains-values.html
+/sdcard/android/layout_tests/fast/forms/slider-transformed.html
+/sdcard/android/layout_tests/fast/forms/listbox-select-all.html
+/sdcard/android/layout_tests/fast/forms/textfield-onchange-deletion.html
+/sdcard/android/layout_tests/fast/forms/focus-control-to-page.html
+/sdcard/android/layout_tests/fast/forms/select-type-ahead-non-latin.html
+/sdcard/android/layout_tests/fast/forms/textarea-no-scroll-on-blur.html
+/sdcard/android/layout_tests/fast/forms/focus-selection-input.html
+/sdcard/android/layout_tests/fast/forms/listbox-onchange.html
+/sdcard/android/layout_tests/fast/forms/button-spacebar-click.html
+/sdcard/android/layout_tests/fast/forms/search-event-delay.html
+/sdcard/android/layout_tests/fast/forms/search-cancel-button-mouseup.html
+/sdcard/android/layout_tests/fast/forms/select-enter-key.html
+/sdcard/android/layout_tests/fast/forms/drag-out-of-textarea.html
+/sdcard/android/layout_tests/fast/forms/textarea-hard-linewrap.html
+/sdcard/android/layout_tests/fast/forms/dragging-to-disabled-file-input.html
+/sdcard/android/layout_tests/fast/forms/input-radio-checked-tab.html
+/sdcard/android/layout_tests/fast/forms/plaintext-mode-1.html
+/sdcard/android/layout_tests/fast/forms/check-box-enter-key.html
+/sdcard/android/layout_tests/fast/forms/input-select-on-click.html
+/sdcard/android/layout_tests/fast/forms/button-state-restore.html
+/sdcard/android/layout_tests/fast/forms/input-appearance-elementFromPoint.html
+/sdcard/android/layout_tests/fast/forms/select-set-inner.html
+/sdcard/android/layout_tests/fast/forms/missing-action.html
+/sdcard/android/layout_tests/fast/forms/access-key.html
+/sdcard/android/layout_tests/fast/forms/textarea-scrolled-endline-caret.html
+/sdcard/android/layout_tests/fast/forms/textarea-scrollbar-height.html
+/sdcard/android/layout_tests/fast/forms/textarea-type-spaces.html
+/sdcard/android/layout_tests/fast/forms/slider-mouse-events.html
+/sdcard/android/layout_tests/fast/forms/textarea-selection-preservation.html
+/sdcard/android/layout_tests/fast/forms/slider-onchange-event.html
+/sdcard/android/layout_tests/fast/forms/add-remove-form-elements-stress-test.html
+/sdcard/android/layout_tests/fast/forms/onchange-enter-submit.html
+/sdcard/android/layout_tests/fast/forms/textarea-appearance-wrap.html
+/sdcard/android/layout_tests/fast/forms/willvalidate-006.html
+/sdcard/android/layout_tests/fast/forms/onselect-textarea.html
+/sdcard/android/layout_tests/fast/forms/textarea-initial-caret-position.html
+/sdcard/android/layout_tests/fast/forms/listbox-selection.html
+/sdcard/android/layout_tests/fast/css/variables/color-hex-test.html
+/sdcard/android/layout_tests/fast/css/dashboard-region-parser.html
+/sdcard/android/layout_tests/fast/css/text-align.html
+/sdcard/android/layout_tests/fast/css/hover-affects-child.html
+/sdcard/android/layout_tests/fast/css/html-attr-case-sensitivity.html
+/sdcard/android/layout_tests/fast/css/computed-style.html
+/sdcard/android/layout_tests/fast/css/getComputedStyle-transform.html
+/sdcard/android/layout_tests/fast/css/computed-style-without-renderer.html
+/sdcard/android/layout_tests/fast/css/invalid-percentage-property.html
+/sdcard/android/layout_tests/fast/parser/entity-comment-in-iframe.html
+/sdcard/android/layout_tests/fast/parser/external-entities.xml
+/sdcard/android/layout_tests/fast/parser/script-tag-with-trailing-slash.html
+/sdcard/android/layout_tests/fast/parser/comment-in-iframe.html
+/sdcard/android/layout_tests/fast/parser/external-entities-in-xslt.xml
+/sdcard/android/layout_tests/fast/parser/xml-declaration-missing-ending-mark.html
+/sdcard/android/layout_tests/fast/parser/entity-end-script-tag.html
+/sdcard/android/layout_tests/fast/parser/tabindex-parsing.html
+/sdcard/android/layout_tests/fast/history/subframe-is-visited.html
+/sdcard/android/layout_tests/fast/history/window-open.html
+/sdcard/android/layout_tests/fast/history/history_reload.html
+/sdcard/android/layout_tests/fast/history/go-back-to-changed-name.html
+/sdcard/android/layout_tests/fast/loader/cancel-load-during-port-block-timer.html
+/sdcard/android/layout_tests/fast/loader/local-iFrame-source-from-local.html
+/sdcard/android/layout_tests/fast/loader/null-request-after-willSendRequest.html
+/sdcard/android/layout_tests/fast/loader/stop-provisional-loads.html
+/sdcard/android/layout_tests/fast/loader/xmlhttprequest-missing-file-exception.html
+/sdcard/android/layout_tests/fast/loader/onunload-form-submit-crash-2.html
+/sdcard/android/layout_tests/fast/loader/plain-text-document.html
+/sdcard/android/layout_tests/fast/loader/onunload-form-submit-crash.html
+/sdcard/android/layout_tests/fast/loader/frame-creation-removal.html
+/sdcard/android/layout_tests/fast/loader/local-image-from-local.html
+/sdcard/android/layout_tests/fast/loader/local-CSS-from-local.html
+/sdcard/android/layout_tests/fast/loader/local-JavaScript-from-local.html
+/sdcard/android/layout_tests/fast/loader/data-url-encoding-svg.html
+/sdcard/android/layout_tests/fast/loader/opaque-base-url.html
+/sdcard/android/layout_tests/fast/xsl/sort-locale.xml
+/sdcard/android/layout_tests/fast/xsl/transformToFragment-XML-declaration.html
+/sdcard/android/layout_tests/fast/xsl/extra-lf-at-end.html
+/sdcard/android/layout_tests/fast/xsl/xslt-doc-noenc.xml
+/sdcard/android/layout_tests/fast/xsl/import-after-comment.xml
+/sdcard/android/layout_tests/fast/xsl/xslt-processor.html
+/sdcard/android/layout_tests/fast/xsl/sort-unicode.xml
+/sdcard/android/layout_tests/fast/xsl/default-html.html
+/sdcard/android/layout_tests/fast/xsl/nbsp-in-stylesheet.html
+/sdcard/android/layout_tests/fast/xsl/xslt-string-parameters.html
+/sdcard/android/layout_tests/fast/xsl/xslt-entity-enc.xml
+/sdcard/android/layout_tests/fast/xsl/xslt-text.html
+/sdcard/android/layout_tests/fast/xsl/xslt-nested-stylesheets.xml
+/sdcard/android/layout_tests/fast/xsl/xslt-url.xml
+/sdcard/android/layout_tests/fast/xsl/xslt-doc-enc.xml
+/sdcard/android/layout_tests/fast/xsl/xslt-recursion.xml
+/sdcard/android/layout_tests/fast/xsl/exslt-node-set.xml
+/sdcard/android/layout_tests/fast/xsl/subframe-location.html
+/sdcard/android/layout_tests/fast/xsl/xslt-second-level-import.xml
+/sdcard/android/layout_tests/fast/xsl/dtd-in-source-document.xml
+/sdcard/android/layout_tests/fast/xsl/mozilla-tests.xml
+/sdcard/android/layout_tests/fast/canvas/canvas-alphaImageData-behavior.html
+/sdcard/android/layout_tests/fast/canvas/canvas-transform-non-invertible.html
+/sdcard/android/layout_tests/fast/canvas/pointInPath.html
+/sdcard/android/layout_tests/fast/canvas/canvas-transform-infinity.html
+/sdcard/android/layout_tests/fast/canvas/toDataURL-supportedTypes.html
+/sdcard/android/layout_tests/fast/canvas/canvas-getImageData.html
+/sdcard/android/layout_tests/fast/canvas/canvas-transform-skewed.html
+/sdcard/android/layout_tests/fast/canvas/canvas-longlived-context.html
+/sdcard/android/layout_tests/fast/canvas/canvas-save-restore-with-path.html
+/sdcard/android/layout_tests/fast/canvas/set-colors.html
+/sdcard/android/layout_tests/fast/canvas/canvas-transform-nan.html
+/sdcard/android/layout_tests/fast/canvas/canvas-transform-identity.html
+/sdcard/android/layout_tests/fast/canvas/canvas-transform-multiply.html
+/sdcard/android/layout_tests/fast/frames/viewsource-empty-attribute-value.html
+/sdcard/android/layout_tests/fast/frames/frame-deep-nested-resize.html
+/sdcard/android/layout_tests/fast/frames/iframe-window-focus.html
+/sdcard/android/layout_tests/fast/frames/frameElement-widthheight.html
+/sdcard/android/layout_tests/fast/frames/removal-before-attach-crash.html
+/sdcard/android/layout_tests/fast/frames/frame-js-url-clientWidth.html
+/sdcard/android/layout_tests/fast/frames/frame-length-fractional.html
+/sdcard/android/layout_tests/fast/frames/frame-limit.html
+/sdcard/android/layout_tests/fast/frames/frame-display-none-focus.html
+/sdcard/android/layout_tests/fast/frames/iframe-name-and-id.html
+/sdcard/android/layout_tests/fast/reflections/teardown-crash.html
+/sdcard/android/layout_tests/fast/reflections/reflection-computed-style.html
+/sdcard/android/layout_tests/transforms/2d/transform-2d.html
+/sdcard/android/layout_tests/transforms/2d/compound-2d-transforms.html
+/sdcard/android/layout_tests/transforms/2d/transform-value-types.html
+/sdcard/android/layout_tests/transforms/2d/computed-style-origin.html
+/sdcard/android/layout_tests/transforms/2d/transform-accuracy.html
+/sdcard/android/layout_tests/wml/variable-reference-valid.html
+/sdcard/android/layout_tests/wml/go-task-get-method-external-deck-with-href.html
+/sdcard/android/layout_tests/wml/variable-reference-invalid-character.html
+/sdcard/android/layout_tests/wml/go-task-animation.html
+/sdcard/android/layout_tests/wml/go-task-get-method-external-deck.html
+/sdcard/android/layout_tests/wml/go-task-get-method-same-deck.html
+/sdcard/android/layout_tests/animations/animation-css-rule-types.html
+/sdcard/android/layout_tests/animations/animation-events-create.html
+/sdcard/android/layout_tests/animations/animation-start-event-destroy-renderer.html
+/sdcard/android/layout_tests/animations/combo-transform-translate+scale.html
+/sdcard/android/layout_tests/animations/simultaneous-start-transform.html
+/sdcard/android/layout_tests/animations/lineheight-animation.html
+/sdcard/android/layout_tests/animations/import.html
+/sdcard/android/layout_tests/animations/simultaneous-start-left.html
+/sdcard/android/layout_tests/animations/fill-unset-properties.html
+/sdcard/android/layout_tests/animations/keyframes-to-missing.html
+/sdcard/android/layout_tests/animations/multiple-keyframes.html
+/sdcard/android/layout_tests/animations/matrix-anim.html
+/sdcard/android/layout_tests/animations/keyframes-comma-separated.html
+/sdcard/android/layout_tests/animations/change-one-anim.html
+/sdcard/android/layout_tests/animations/keyframes-rule.html
+/sdcard/android/layout_tests/animations/generic-from-to.html
+/sdcard/android/layout_tests/animations/big-rotation.html
+/sdcard/android/layout_tests/animations/animation-controller-drt-api.html
+/sdcard/android/layout_tests/animations/keyframe-timing-functions.html
+/sdcard/android/layout_tests/animations/keyframes-from-missing.html
+/sdcard/android/layout_tests/animations/transition-and-animation-1.html
+/sdcard/android/layout_tests/animations/computed-style.html
+/sdcard/android/layout_tests/animations/animation-iteration-event-destroy-renderer.html
+/sdcard/android/layout_tests/animations/keyframes.html
+/sdcard/android/layout_tests/animations/multiple-animations.html
+/sdcard/android/layout_tests/animations/animation-end-event-destroy-renderer.html
+/sdcard/android/layout_tests/animations/change-keyframes-name.html
+/sdcard/android/layout_tests/animations/combo-transform-rotate+scale.html
+/sdcard/android/layout_tests/animations/change-keyframes.html
+/sdcard/android/layout_tests/traversal/hixie-node-iterator/010.xml
+/sdcard/android/layout_tests/traversal/hixie-node-iterator/001.xml
+/sdcard/android/layout_tests/traversal/hixie-node-iterator/002.xml
+/sdcard/android/layout_tests/traversal/hixie-node-iterator/003.xml
+/sdcard/android/layout_tests/traversal/hixie-node-iterator/004.xml
+/sdcard/android/layout_tests/traversal/hixie-node-iterator/005.xml
+/sdcard/android/layout_tests/traversal/hixie-node-iterator/006.xml
+/sdcard/android/layout_tests/traversal/hixie-node-iterator/007.xml
+/sdcard/android/layout_tests/traversal/hixie-node-iterator/008.xml
+/sdcard/android/layout_tests/traversal/hixie-node-iterator/009.xml
+/sdcard/android/layout_tests/storage/domstorage/localstorage/index-get-and-set.html
+/sdcard/android/layout_tests/storage/domstorage/localstorage/onstorage-attribute-setattribute.html
+/sdcard/android/layout_tests/storage/domstorage/localstorage/clear.html
+/sdcard/android/layout_tests/storage/domstorage/localstorage/enumerate-storage.html
+/sdcard/android/layout_tests/storage/domstorage/localstorage/simple-usage.html
+/sdcard/android/layout_tests/storage/domstorage/localstorage/simple-events.html
+/sdcard/android/layout_tests/storage/domstorage/localstorage/onstorage-attribute-markup.html
+/sdcard/android/layout_tests/storage/domstorage/localstorage/iframe-events.html
+/sdcard/android/layout_tests/storage/domstorage/localstorage/delete-removal.html
+/sdcard/android/layout_tests/storage/domstorage/localstorage/window-open.html
+/sdcard/android/layout_tests/storage/domstorage/sessionstorage/index-get-and-set.html
+/sdcard/android/layout_tests/storage/domstorage/sessionstorage/onstorage-attribute-setattribute.html
+/sdcard/android/layout_tests/storage/domstorage/sessionstorage/clear.html
+/sdcard/android/layout_tests/storage/domstorage/sessionstorage/enumerate-storage.html
+/sdcard/android/layout_tests/storage/domstorage/sessionstorage/simple-usage.html
+/sdcard/android/layout_tests/storage/domstorage/sessionstorage/simple-events.html
+/sdcard/android/layout_tests/storage/domstorage/sessionstorage/onstorage-attribute-markup.html
+/sdcard/android/layout_tests/storage/domstorage/sessionstorage/iframe-events.html
+/sdcard/android/layout_tests/storage/domstorage/sessionstorage/delete-removal.html
+/sdcard/android/layout_tests/storage/domstorage/sessionstorage/window-open.html
+/sdcard/android/layout_tests/storage/domstorage/window-attributes-exist.html
+/sdcard/android/layout_tests/storage/open-database-empty-version.html
+/sdcard/android/layout_tests/storage/close-during-stress-test.html
+/sdcard/android/layout_tests/storage/execute-sql-args.html
+/sdcard/android/layout_tests/storage/quota-tracking.html
+/sdcard/android/layout_tests/storage/transaction_callback_exception_crash.html
+/sdcard/android/layout_tests/storage/multiple-databases-garbage-collection.html
+/sdcard/android/layout_tests/storage/empty-statement.html
+/sdcard/android/layout_tests/storage/multiple-transactions.html
+/sdcard/android/layout_tests/storage/success-callback.html
+/sdcard/android/layout_tests/storage/sql-data-types.html
+/sdcard/android/layout_tests/security/set-form-autocomplete-attribute.html
+/sdcard/android/layout_tests/security/autocomplete-cleared-on-back.html
+/sdcard/android/layout_tests/security/block-test.html
+/sdcard/android/layout_tests/transitions/transition-shorthand-delay.html
+/sdcard/android/layout_tests/transitions/transition-drt-api-delay.html
+/sdcard/android/layout_tests/transitions/opacity-transition-zindex.html
+/sdcard/android/layout_tests/transitions/shorthand-transitions.html
+/sdcard/android/layout_tests/transitions/hang-with-bad-transition-list.html
+/sdcard/android/layout_tests/transitions/zero-duration-in-list.html
+/sdcard/android/layout_tests/transitions/shorthand-border-transitions.html
+/sdcard/android/layout_tests/transitions/zero-duration-with-non-zero-delay-end.html
+/sdcard/android/layout_tests/transitions/repeated-firing-background-color.html
+/sdcard/android/layout_tests/transitions/start-transform-transition.html
diff --git a/tests/DumpRenderTree/assets/results/layout_tests_nontext.txt b/tests/DumpRenderTree/assets/results/layout_tests_nontext.txt
index c9e166c..eb5b6e0 100644
--- a/tests/DumpRenderTree/assets/results/layout_tests_nontext.txt
+++ b/tests/DumpRenderTree/assets/results/layout_tests_nontext.txt
@@ -1,3 +1,770 @@
+/sdcard/android/layout_tests/webarchive/loading/cache-expired-subresource.html
+/sdcard/android/layout_tests/webarchive/test-css-import.html
+/sdcard/android/layout_tests/webarchive/test-img-src.html
+/sdcard/android/layout_tests/webarchive/archive-empty-frame-dom.html
+/sdcard/android/layout_tests/webarchive/test-frameset.html
+/sdcard/android/layout_tests/webarchive/test-body-background.html
+/sdcard/android/layout_tests/webarchive/test-input-src.html
+/sdcard/android/layout_tests/webarchive/archive-empty-frame-source.html
+/sdcard/android/layout_tests/webarchive/doctype.html
+/sdcard/android/layout_tests/webarchive/test-css-url-resources-inline-styles.html
+/sdcard/android/layout_tests/webarchive/test-table-background.html
+/sdcard/android/layout_tests/webarchive/test-object-data.html
+/sdcard/android/layout_tests/webarchive/test-css-url-resources-in-stylesheets.html
+/sdcard/android/layout_tests/webarchive/archive-with-unencoded-url.html
+/sdcard/android/layout_tests/webarchive/test-link-href.html
+/sdcard/android/layout_tests/webarchive/test-duplicate-resources.html
+/sdcard/android/layout_tests/webarchive/test-xml-stylesheet.xml
+/sdcard/android/layout_tests/webarchive/test-td-background.html
+/sdcard/android/layout_tests/webarchive/test-script-src.html
+/sdcard/android/layout_tests/media/video-transformed.html
+/sdcard/android/layout_tests/media/video-display-toggle.html
+/sdcard/android/layout_tests/media/audio-controls-rendering.html
+/sdcard/android/layout_tests/media/video-controls-visible-audio-only.html
+/sdcard/android/layout_tests/media/video-zoom.html
+/sdcard/android/layout_tests/media/video-controls-rendering.html
+/sdcard/android/layout_tests/media/video-aspect-ratio.html
+/sdcard/android/layout_tests/media/video-layer-crash.html
+/sdcard/android/layout_tests/plugins/netscape-dom-access.html
+/sdcard/android/layout_tests/plugins/embed-attributes-style.html
+/sdcard/android/layout_tests/editing/input/emacs-ctrl-o.html
+/sdcard/android/layout_tests/editing/style/style-3681552-fix-001.html
+/sdcard/android/layout_tests/editing/style/create-block-for-style-013.html
+/sdcard/android/layout_tests/editing/style/style-3690704-fix.html
+/sdcard/android/layout_tests/editing/style/create-block-for-style-005.html
+/sdcard/android/layout_tests/editing/style/style-boundary-002.html
+/sdcard/android/layout_tests/editing/style/remove-underline-after-paragraph.html
+/sdcard/android/layout_tests/editing/style/create-block-for-style-009.html
+/sdcard/android/layout_tests/editing/style/5228141.html
+/sdcard/android/layout_tests/editing/style/block-style-004.html
+/sdcard/android/layout_tests/editing/style/apple-style-editable-mix.html
+/sdcard/android/layout_tests/editing/style/unbold-in-bold.html
+/sdcard/android/layout_tests/editing/style/typing-style-001.html
+/sdcard/android/layout_tests/editing/style/remove-underline-from-stylesheet.html
+/sdcard/android/layout_tests/editing/style/relative-font-size-change-004.html
+/sdcard/android/layout_tests/editing/style/create-block-for-style-010.html
+/sdcard/android/layout_tests/editing/style/create-block-for-style-002.html
+/sdcard/android/layout_tests/editing/style/style-3681552-fix-002.html
+/sdcard/android/layout_tests/editing/style/create-block-for-style-006.html
+/sdcard/android/layout_tests/editing/style/style-boundary-003.html
+/sdcard/android/layout_tests/editing/style/block-style-001.html
+/sdcard/android/layout_tests/editing/style/smoosh-styles-001.html
+/sdcard/android/layout_tests/editing/style/font-family-with-space.html
+/sdcard/android/layout_tests/editing/style/5084241.html
+/sdcard/android/layout_tests/editing/style/5065910.html
+/sdcard/android/layout_tests/editing/style/block-style-005.html
+/sdcard/android/layout_tests/editing/style/remove-underline-across-paragraph-in-bold.html
+/sdcard/android/layout_tests/editing/style/5279521.html
+/sdcard/android/layout_tests/editing/style/non-inheritable-styles.html
+/sdcard/android/layout_tests/editing/style/5046875-1.html
+/sdcard/android/layout_tests/editing/style/style-3998892-fix.html
+/sdcard/android/layout_tests/editing/style/remove-underline-in-bold.html
+/sdcard/android/layout_tests/editing/style/typing-style-002.html
+/sdcard/android/layout_tests/editing/style/relative-font-size-change-001.html
+/sdcard/android/layout_tests/editing/style/4916887.html
+/sdcard/android/layout_tests/editing/style/remove-underline-across-paragraph.html
+/sdcard/android/layout_tests/editing/style/create-block-for-style-011.html
+/sdcard/android/layout_tests/editing/style/create-block-for-style-003.html
+/sdcard/android/layout_tests/editing/style/remove-underline.html
+/sdcard/android/layout_tests/editing/style/create-block-for-style-007.html
+/sdcard/android/layout_tests/editing/style/style-boundary-004.html
+/sdcard/android/layout_tests/editing/style/5017613-1.html
+/sdcard/android/layout_tests/editing/style/block-style-002.html
+/sdcard/android/layout_tests/editing/style/smoosh-styles-002.html
+/sdcard/android/layout_tests/editing/style/block-style-006.html
+/sdcard/android/layout_tests/editing/style/fontsize-1.html
+/sdcard/android/layout_tests/editing/style/5046875-2.html
+/sdcard/android/layout_tests/editing/style/typing-style-003.html
+/sdcard/android/layout_tests/editing/style/relative-font-size-change-002.html
+/sdcard/android/layout_tests/editing/style/create-block-for-style-012.html
+/sdcard/android/layout_tests/editing/style/create-block-for-style-004.html
+/sdcard/android/layout_tests/editing/style/designmode.html
+/sdcard/android/layout_tests/editing/style/block-styles-007.html
+/sdcard/android/layout_tests/editing/style/style-boundary-001.html
+/sdcard/android/layout_tests/editing/style/create-block-for-style-008.html
+/sdcard/android/layout_tests/editing/style/style-boundary-005.html
+/sdcard/android/layout_tests/editing/style/underline.html
+/sdcard/android/layout_tests/editing/style/5017613-2.html
+/sdcard/android/layout_tests/editing/style/block-style-003.html
+/sdcard/android/layout_tests/editing/style/smoosh-styles-003.html
+/sdcard/android/layout_tests/editing/style/remove-underline-after-paragraph-in-bold.html
+/sdcard/android/layout_tests/editing/style/highlight.html
+/sdcard/android/layout_tests/editing/style/table-selection.html
+/sdcard/android/layout_tests/editing/style/relative-font-size-change-003.html
+/sdcard/android/layout_tests/editing/style/create-block-for-style-001.html
+/sdcard/android/layout_tests/editing/unsupported-content/table-delete-001.html
+/sdcard/android/layout_tests/editing/unsupported-content/table-type-after.html
+/sdcard/android/layout_tests/editing/unsupported-content/table-delete-002.html
+/sdcard/android/layout_tests/editing/unsupported-content/table-type-before.html
+/sdcard/android/layout_tests/editing/unsupported-content/table-delete-003.html
+/sdcard/android/layout_tests/editing/unsupported-content/list-delete-001.html
+/sdcard/android/layout_tests/editing/unsupported-content/list-type-after.html
+/sdcard/android/layout_tests/editing/unsupported-content/list-type-before.html
+/sdcard/android/layout_tests/editing/unsupported-content/list-delete-003.html
+/sdcard/android/layout_tests/editing/inserting/insert-div-011.html
+/sdcard/android/layout_tests/editing/inserting/4960120-1.html
+/sdcard/android/layout_tests/editing/inserting/insert-div-023.html
+/sdcard/android/layout_tests/editing/inserting/insert-paragraph-04.html
+/sdcard/android/layout_tests/editing/inserting/insert-div-007.html
+/sdcard/android/layout_tests/editing/inserting/5058163-2.html
+/sdcard/android/layout_tests/editing/inserting/insert-div-019.html
+/sdcard/android/layout_tests/editing/inserting/insert-br-at-tabspan-003.html
+/sdcard/android/layout_tests/editing/inserting/5607069-2.html
+/sdcard/android/layout_tests/editing/inserting/insert-br-quoted-003.html
+/sdcard/android/layout_tests/editing/inserting/insert-br-003.html
+/sdcard/android/layout_tests/editing/inserting/4875189-1.html
+/sdcard/android/layout_tests/editing/inserting/typing-003.html
+/sdcard/android/layout_tests/editing/inserting/insert-3907422-fix.html
+/sdcard/android/layout_tests/editing/inserting/insert-div-020.html
+/sdcard/android/layout_tests/editing/inserting/before-after-input-element.html
+/sdcard/android/layout_tests/editing/inserting/insert-div-004.html
+/sdcard/android/layout_tests/editing/inserting/insert-paragraph-01.html
+/sdcard/android/layout_tests/editing/inserting/insert-div-016.html
+/sdcard/android/layout_tests/editing/inserting/4959067.html
+/sdcard/android/layout_tests/editing/inserting/insert-br-008.html
+/sdcard/android/layout_tests/editing/inserting/insert-text-at-tabspan-001.html
+/sdcard/android/layout_tests/editing/inserting/insert-div-001.html
+/sdcard/android/layout_tests/editing/inserting/paragraph-separator-02.html
+/sdcard/android/layout_tests/editing/inserting/insert-div-013.html
+/sdcard/android/layout_tests/editing/inserting/insert-div-025.html
+/sdcard/android/layout_tests/editing/inserting/insert-3654864-fix.html
+/sdcard/android/layout_tests/editing/inserting/insert-div-009.html
+/sdcard/android/layout_tests/editing/inserting/return-key-with-selection-002.html
+/sdcard/android/layout_tests/editing/inserting/editable-html-element.html
+/sdcard/android/layout_tests/editing/inserting/5418891.html
+/sdcard/android/layout_tests/editing/inserting/insert-br-quoted-005.html
+/sdcard/android/layout_tests/editing/inserting/insert-tab-002.html
+/sdcard/android/layout_tests/editing/inserting/insert-br-005.html
+/sdcard/android/layout_tests/editing/inserting/line-break.html
+/sdcard/android/layout_tests/editing/inserting/5549929-3.html
+/sdcard/android/layout_tests/editing/inserting/typing-tab-designmode-forms.html
+/sdcard/android/layout_tests/editing/inserting/insert-div-010.html
+/sdcard/android/layout_tests/editing/inserting/insert-div-022.html
+/sdcard/android/layout_tests/editing/inserting/insert-paragraph-03.html
+/sdcard/android/layout_tests/editing/inserting/insert-div-006.html
+/sdcard/android/layout_tests/editing/inserting/5058163-1.html
+/sdcard/android/layout_tests/editing/inserting/insert-div-018.html
+/sdcard/android/layout_tests/editing/inserting/paragraph-separator-in-table-2.html
+/sdcard/android/layout_tests/editing/inserting/insert-br-at-tabspan-002.html
+/sdcard/android/layout_tests/editing/inserting/insert-br-quoted-002.html
+/sdcard/android/layout_tests/editing/inserting/insert-br-002.html
+/sdcard/android/layout_tests/editing/inserting/typing-002.html
+/sdcard/android/layout_tests/editing/inserting/insert-3800346-fix.html
+/sdcard/android/layout_tests/editing/inserting/insert-text-at-tabspan-003.html
+/sdcard/android/layout_tests/editing/inserting/typing-around-image-001.html
+/sdcard/android/layout_tests/editing/inserting/insert-text-with-newlines.html
+/sdcard/android/layout_tests/editing/inserting/insert-div-003.html
+/sdcard/android/layout_tests/editing/inserting/insert-div-015.html
+/sdcard/android/layout_tests/editing/inserting/insert-at-end-02.html
+/sdcard/android/layout_tests/editing/inserting/insert-div-027.html
+/sdcard/android/layout_tests/editing/inserting/insert-3659587-fix.html
+/sdcard/android/layout_tests/editing/inserting/insert-br-007.html
+/sdcard/android/layout_tests/editing/inserting/insert-tab-004.html
+/sdcard/android/layout_tests/editing/inserting/editable-inline-element.html
+/sdcard/android/layout_tests/editing/inserting/insert-3851164-fix.html
+/sdcard/android/layout_tests/editing/inserting/paragraph-separator-01.html
+/sdcard/android/layout_tests/editing/inserting/5156401-2.html
+/sdcard/android/layout_tests/editing/inserting/4960120-2.html
+/sdcard/android/layout_tests/editing/inserting/insert-div-012.html
+/sdcard/android/layout_tests/editing/inserting/insert-div-024.html
+/sdcard/android/layout_tests/editing/inserting/insert-div-008.html
+/sdcard/android/layout_tests/editing/inserting/insert-paragraph-05.html
+/sdcard/android/layout_tests/editing/inserting/multiple-lines-selected.html
+/sdcard/android/layout_tests/editing/inserting/insert-3778059-fix.html
+/sdcard/android/layout_tests/editing/inserting/return-key-with-selection-001.html
+/sdcard/android/layout_tests/editing/inserting/5607069-3.html
+/sdcard/android/layout_tests/editing/inserting/insert-br-quoted-004.html
+/sdcard/android/layout_tests/editing/inserting/insert-br-004.html
+/sdcard/android/layout_tests/editing/inserting/insert-tab-001.html
+/sdcard/android/layout_tests/editing/inserting/4875189-2.html
+/sdcard/android/layout_tests/editing/inserting/5549929-2.html
+/sdcard/android/layout_tests/editing/inserting/editing-empty-divs.html
+/sdcard/android/layout_tests/editing/inserting/insert-div-021.html
+/sdcard/android/layout_tests/editing/inserting/insert-div-005.html
+/sdcard/android/layout_tests/editing/inserting/insert-paragraph-02.html
+/sdcard/android/layout_tests/editing/inserting/insert-3786362-fix.html
+/sdcard/android/layout_tests/editing/inserting/insert-div-017.html
+/sdcard/android/layout_tests/editing/inserting/paragraph-separator-in-table-1.html
+/sdcard/android/layout_tests/editing/inserting/insert-br-at-tabspan-001.html
+/sdcard/android/layout_tests/editing/inserting/insert-space-in-empty-doc.html
+/sdcard/android/layout_tests/editing/inserting/insert-after-delete-001.html
+/sdcard/android/layout_tests/editing/inserting/insert-br-quoted-001.html
+/sdcard/android/layout_tests/editing/inserting/insert-br-001.html
+/sdcard/android/layout_tests/editing/inserting/typing-001.html
+/sdcard/android/layout_tests/editing/inserting/4278698.html
+/sdcard/android/layout_tests/editing/inserting/insert-br-009.html
+/sdcard/android/layout_tests/editing/inserting/insert-text-at-tabspan-002.html
+/sdcard/android/layout_tests/editing/inserting/5002441.html
+/sdcard/android/layout_tests/editing/inserting/insert-div-002.html
+/sdcard/android/layout_tests/editing/inserting/paragraph-separator-03.html
+/sdcard/android/layout_tests/editing/inserting/12882.html
+/sdcard/android/layout_tests/editing/inserting/insert-3775316-fix.html
+/sdcard/android/layout_tests/editing/inserting/edited-whitespace-1.html
+/sdcard/android/layout_tests/editing/inserting/insert-div-014.html
+/sdcard/android/layout_tests/editing/inserting/insert-at-end-01.html
+/sdcard/android/layout_tests/editing/inserting/redo.html
+/sdcard/android/layout_tests/editing/inserting/insert-div-026.html
+/sdcard/android/layout_tests/editing/inserting/4840662.html
+/sdcard/android/layout_tests/editing/inserting/typing-around-br-001.html
+/sdcard/android/layout_tests/editing/inserting/return-key-with-selection-003.html
+/sdcard/android/layout_tests/editing/inserting/insert-br-quoted-006.html
+/sdcard/android/layout_tests/editing/inserting/insert-tab-003.html
+/sdcard/android/layout_tests/editing/inserting/insert-br-006.html
+/sdcard/android/layout_tests/editing/execCommand/5142012-1.html
+/sdcard/android/layout_tests/editing/execCommand/hilitecolor.html
+/sdcard/android/layout_tests/editing/execCommand/5120591.html
+/sdcard/android/layout_tests/editing/execCommand/format-block-with-braces.html
+/sdcard/android/layout_tests/editing/execCommand/4920742-1.html
+/sdcard/android/layout_tests/editing/execCommand/4924441.html
+/sdcard/android/layout_tests/editing/execCommand/create-list-with-hr.html
+/sdcard/android/layout_tests/editing/execCommand/5207369.html
+/sdcard/android/layout_tests/editing/execCommand/format-block-with-trailing-br.html
+/sdcard/android/layout_tests/editing/execCommand/4916583.html
+/sdcard/android/layout_tests/editing/execCommand/remove-formatting-2.html
+/sdcard/android/layout_tests/editing/execCommand/outdent-selection.html
+/sdcard/android/layout_tests/editing/execCommand/strikethroughSelection.html
+/sdcard/android/layout_tests/editing/execCommand/insert-list-with-id.html
+/sdcard/android/layout_tests/editing/execCommand/5432254-1.html
+/sdcard/android/layout_tests/editing/execCommand/5482023.html
+/sdcard/android/layout_tests/editing/execCommand/5062376.html
+/sdcard/android/layout_tests/editing/execCommand/4786404-1.html
+/sdcard/android/layout_tests/editing/execCommand/remove-formatting.html
+/sdcard/android/layout_tests/editing/execCommand/findString.html
+/sdcard/android/layout_tests/editing/execCommand/5142012-3.html
+/sdcard/android/layout_tests/editing/execCommand/5700414-1.html
+/sdcard/android/layout_tests/editing/execCommand/italicizeByCharacter.html
+/sdcard/android/layout_tests/editing/execCommand/switch-list-type.html
+/sdcard/android/layout_tests/editing/execCommand/create-list-from-range-selection.html
+/sdcard/android/layout_tests/editing/execCommand/5190926.html
+/sdcard/android/layout_tests/editing/execCommand/remove-list-1.html
+/sdcard/android/layout_tests/editing/execCommand/insertHorizontalRule.html
+/sdcard/android/layout_tests/editing/execCommand/paste-1.html
+/sdcard/android/layout_tests/editing/execCommand/nsresponder-outdent.html
+/sdcard/android/layout_tests/editing/execCommand/5080333-2.html
+/sdcard/android/layout_tests/editing/execCommand/5119244.html
+/sdcard/android/layout_tests/editing/execCommand/5049671.html
+/sdcard/android/layout_tests/editing/execCommand/4920488.html
+/sdcard/android/layout_tests/editing/execCommand/5164796.html
+/sdcard/android/layout_tests/editing/execCommand/nsresponder-indent.html
+/sdcard/android/layout_tests/editing/execCommand/indent-list-item.html
+/sdcard/android/layout_tests/editing/execCommand/insert-list-empty-div.html
+/sdcard/android/layout_tests/editing/execCommand/5138441.html
+/sdcard/android/layout_tests/editing/execCommand/4916402.html
+/sdcard/android/layout_tests/editing/execCommand/5481523.html
+/sdcard/android/layout_tests/editing/execCommand/print.html
+/sdcard/android/layout_tests/editing/execCommand/4641880-2.html
+/sdcard/android/layout_tests/editing/execCommand/4580583-2.html
+/sdcard/android/layout_tests/editing/execCommand/remove-list-item-1.html
+/sdcard/android/layout_tests/editing/execCommand/5569741.html
+/sdcard/android/layout_tests/editing/execCommand/findString-2.html
+/sdcard/android/layout_tests/editing/execCommand/modifyForeColorByCharacter.html
+/sdcard/android/layout_tests/editing/execCommand/5142012-2.html
+/sdcard/android/layout_tests/editing/execCommand/find-after-replace.html
+/sdcard/android/layout_tests/editing/execCommand/format-block.html
+/sdcard/android/layout_tests/editing/execCommand/5080333-1.html
+/sdcard/android/layout_tests/editing/execCommand/remove-list-from-range-selection.html
+/sdcard/android/layout_tests/editing/execCommand/remove-list-items.html
+/sdcard/android/layout_tests/editing/execCommand/5432254-2.html
+/sdcard/android/layout_tests/editing/execCommand/5144139-1.html
+/sdcard/android/layout_tests/editing/execCommand/5136770.html
+/sdcard/android/layout_tests/editing/execCommand/4916541.html
+/sdcard/android/layout_tests/editing/execCommand/4786404-2.html
+/sdcard/android/layout_tests/editing/execCommand/insertImage.html
+/sdcard/android/layout_tests/editing/execCommand/insert-list-and-stitch.html
+/sdcard/android/layout_tests/editing/execCommand/5573879.html
+/sdcard/android/layout_tests/editing/execCommand/5210032.html
+/sdcard/android/layout_tests/editing/execCommand/5700414-2.html
+/sdcard/android/layout_tests/editing/execCommand/boldSelection.html
+/sdcard/android/layout_tests/editing/execCommand/insertHTML.html
+/sdcard/android/layout_tests/editing/execCommand/4641880-1.html
+/sdcard/android/layout_tests/editing/execCommand/4747450.html
+/sdcard/android/layout_tests/editing/execCommand/4580583-1.html
+/sdcard/android/layout_tests/editing/execCommand/format-block-from-range-selection.html
+/sdcard/android/layout_tests/editing/execCommand/indent-empty-root.html
+/sdcard/android/layout_tests/editing/execCommand/indent-selection.html
+/sdcard/android/layout_tests/editing/execCommand/selectAll.html
+/sdcard/android/layout_tests/editing/execCommand/paste-2.html
+/sdcard/android/layout_tests/editing/pasteboard/subframe-dragndrop-1.html
+/sdcard/android/layout_tests/editing/pasteboard/innerText-inline-table.html
+/sdcard/android/layout_tests/editing/pasteboard/5156401-1.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-list-001.html
+/sdcard/android/layout_tests/editing/pasteboard/5032095.html
+/sdcard/android/layout_tests/editing/pasteboard/4242293-1.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-line-endings-004.html
+/sdcard/android/layout_tests/editing/pasteboard/5247341.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-4035648-fix.html
+/sdcard/android/layout_tests/editing/pasteboard/4700297.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-text-003.html
+/sdcard/android/layout_tests/editing/pasteboard/drop-link.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-blockquote-into-blockquote-3.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-blockquote-into-blockquote.html
+/sdcard/android/layout_tests/editing/pasteboard/4944770-1.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-text-015.html
+/sdcard/android/layout_tests/editing/pasteboard/5075944.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-match-style-001.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-4039777-fix.html
+/sdcard/android/layout_tests/editing/pasteboard/merge-end-3.html
+/sdcard/android/layout_tests/editing/pasteboard/smart-paste-007.html
+/sdcard/android/layout_tests/editing/pasteboard/5483567.html
+/sdcard/android/layout_tests/editing/pasteboard/7955.html
+/sdcard/android/layout_tests/editing/pasteboard/merge-end-blockquote.html
+/sdcard/android/layout_tests/editing/pasteboard/testcase-9507.html
+/sdcard/android/layout_tests/editing/pasteboard/input-field-1.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-line-endings-001.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-text-at-tabspan-001.html
+/sdcard/android/layout_tests/editing/pasteboard/interchange-newline-2.html
+/sdcard/android/layout_tests/editing/pasteboard/block-wrappers-necessary.html
+/sdcard/android/layout_tests/editing/pasteboard/4861080.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-line-endings-009.html
+/sdcard/android/layout_tests/editing/pasteboard/merge-after-delete.html
+/sdcard/android/layout_tests/editing/pasteboard/5478250.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-text-012.html
+/sdcard/android/layout_tests/editing/pasteboard/prevent-block-nesting-01.html
+/sdcard/android/layout_tests/editing/pasteboard/8145-2.html
+/sdcard/android/layout_tests/editing/pasteboard/merge-end-borders.html
+/sdcard/android/layout_tests/editing/pasteboard/5027857.html
+/sdcard/android/layout_tests/editing/pasteboard/smart-paste-004.html
+/sdcard/android/layout_tests/editing/pasteboard/merge-start-list.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-text-008.html
+/sdcard/android/layout_tests/editing/pasteboard/4806874.html
+/sdcard/android/layout_tests/editing/pasteboard/emacs-ctrl-a-k-y.html
+/sdcard/android/layout_tests/editing/pasteboard/bad-placeholder.html
+/sdcard/android/layout_tests/editing/pasteboard/displaced-placeholder.html
+/sdcard/android/layout_tests/editing/pasteboard/5387578.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-blockquote-1.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-line-endings-010.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-line-endings-006.html
+/sdcard/android/layout_tests/editing/pasteboard/5601583-1.html
+/sdcard/android/layout_tests/editing/pasteboard/4947130.html
+/sdcard/android/layout_tests/editing/pasteboard/pasting-tabs.html
+/sdcard/android/layout_tests/editing/pasteboard/merge-after-delete-2.html
+/sdcard/android/layout_tests/editing/pasteboard/smart-paste-001.html
+/sdcard/android/layout_tests/editing/pasteboard/4076267-2.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-table-001.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-text-005.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-text-017.html
+/sdcard/android/layout_tests/editing/pasteboard/merge-end-5.html
+/sdcard/android/layout_tests/editing/pasteboard/drop-text-without-selection.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-text-at-tabspan-003.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-line-endings-003.html
+/sdcard/android/layout_tests/editing/pasteboard/drag-drop-modifies-page.html
+/sdcard/android/layout_tests/editing/pasteboard/emacs-ctrl-k-y-001.html
+/sdcard/android/layout_tests/editing/pasteboard/5071074.html
+/sdcard/android/layout_tests/editing/pasteboard/interchange-newline-4.html
+/sdcard/android/layout_tests/editing/pasteboard/styled-element-markup.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-4038267-fix.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-text-002.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-blockquote-into-blockquote-2.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-pre-002.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-text-014.html
+/sdcard/android/layout_tests/editing/pasteboard/drag-drop-dead-frame.html
+/sdcard/android/layout_tests/editing/pasteboard/merge-end-2.html
+/sdcard/android/layout_tests/editing/pasteboard/smart-paste-006.html
+/sdcard/android/layout_tests/editing/pasteboard/5368833.html
+/sdcard/android/layout_tests/editing/pasteboard/select-element-1.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-blockquote-3.html
+/sdcard/android/layout_tests/editing/pasteboard/4641033.html
+/sdcard/android/layout_tests/editing/pasteboard/drag-image-to-contenteditable-in-iframe.html
+/sdcard/android/layout_tests/editing/pasteboard/interchange-newline-1.html
+/sdcard/android/layout_tests/editing/pasteboard/copy-paste-bidi.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-line-endings-008.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-text-011.html
+/sdcard/android/layout_tests/editing/pasteboard/8145-1.html
+/sdcard/android/layout_tests/editing/pasteboard/smart-paste-003.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-table-003.html
+/sdcard/android/layout_tests/editing/pasteboard/5075944-3.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-text-007.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-TIFF.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-text-019.html
+/sdcard/android/layout_tests/editing/pasteboard/undoable-fragment-removes.html
+/sdcard/android/layout_tests/editing/pasteboard/nested-blocks-with-text-field.html
+/sdcard/android/layout_tests/editing/pasteboard/4989774.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-unrendered-select.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-line-endings-005.html
+/sdcard/android/layout_tests/editing/pasteboard/emacs-cntl-y-001.html
+/sdcard/android/layout_tests/editing/pasteboard/merge-after-delete-1.html
+/sdcard/android/layout_tests/editing/pasteboard/unrendered-br.html
+/sdcard/android/layout_tests/editing/pasteboard/4631972.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-text-004.html
+/sdcard/android/layout_tests/editing/pasteboard/quirks-mode-br-1.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-blockquote-into-blockquote-4.html
+/sdcard/android/layout_tests/editing/pasteboard/4944770-2.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-table-cells.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-text-016.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-match-style-002.html
+/sdcard/android/layout_tests/editing/pasteboard/merge-end-4.html
+/sdcard/android/layout_tests/editing/pasteboard/drag-selected-image-to-contenteditable.html
+/sdcard/android/layout_tests/editing/pasteboard/smart-paste-008.html
+/sdcard/android/layout_tests/editing/pasteboard/3976872.html
+/sdcard/android/layout_tests/editing/pasteboard/pasting-object.html
+/sdcard/android/layout_tests/editing/pasteboard/merge-end-list.html
+/sdcard/android/layout_tests/editing/pasteboard/copy-standalone-image.html
+/sdcard/android/layout_tests/editing/pasteboard/displaced-generic-placeholder.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-line-endings-002.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-text-at-tabspan-002.html
+/sdcard/android/layout_tests/editing/pasteboard/interchange-newline-3.html
+/sdcard/android/layout_tests/editing/pasteboard/5071074-2.html
+/sdcard/android/layout_tests/editing/pasteboard/display-block-on-spans.html
+/sdcard/android/layout_tests/editing/pasteboard/4242293.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-text-001.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-pre-001.html
+/sdcard/android/layout_tests/editing/pasteboard/merge-start-blockquote.html
+/sdcard/android/layout_tests/editing/pasteboard/merge-end-1.html
+/sdcard/android/layout_tests/editing/pasteboard/8145-3.html
+/sdcard/android/layout_tests/editing/pasteboard/5006779.html
+/sdcard/android/layout_tests/editing/pasteboard/smart-paste-005.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-text-009.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-blockquote-2.html
+/sdcard/android/layout_tests/editing/pasteboard/merge-end-table.html
+/sdcard/android/layout_tests/editing/pasteboard/5065605.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-line-endings-007.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-text-010.html
+/sdcard/android/layout_tests/editing/pasteboard/5028447.html
+/sdcard/android/layout_tests/editing/pasteboard/nested-blocks-with-text-area.html
+/sdcard/android/layout_tests/editing/pasteboard/4076267-3.html
+/sdcard/android/layout_tests/editing/pasteboard/4076267.html
+/sdcard/android/layout_tests/editing/pasteboard/smart-paste-002.html
+/sdcard/android/layout_tests/editing/pasteboard/5075944-2.html
+/sdcard/android/layout_tests/editing/pasteboard/5134759.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-text-006.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-text-018.html
+/sdcard/android/layout_tests/editing/pasteboard/paste-RTFD.html
+/sdcard/android/layout_tests/editing/pasteboard/cut-text-001.html
+/sdcard/android/layout_tests/editing/selection/image-before-linebreak.html
+/sdcard/android/layout_tests/editing/selection/mixed-editability-9.html
+/sdcard/android/layout_tests/editing/selection/move-between-blocks-no-001.html
+/sdcard/android/layout_tests/editing/selection/fake-drag.html
+/sdcard/android/layout_tests/editing/selection/wrapped-line-caret-2.html
+/sdcard/android/layout_tests/editing/selection/5131716-3.html
+/sdcard/android/layout_tests/editing/selection/5081257-2.html
+/sdcard/android/layout_tests/editing/selection/3690703-2.html
+/sdcard/android/layout_tests/editing/selection/unrendered-002.html
+/sdcard/android/layout_tests/editing/selection/extend-by-character-005.html
+/sdcard/android/layout_tests/editing/selection/5354455-1.html
+/sdcard/android/layout_tests/editing/selection/caret-rtl-2.html
+/sdcard/android/layout_tests/editing/selection/paragraph-granularity.html
+/sdcard/android/layout_tests/editing/selection/expanding-selections2.html
+/sdcard/android/layout_tests/editing/selection/clear-selection.html
+/sdcard/android/layout_tests/editing/selection/mixed-editability-6.html
+/sdcard/android/layout_tests/editing/selection/display-table-text.html
+/sdcard/android/layout_tests/editing/selection/13804.html
+/sdcard/android/layout_tests/editing/selection/drag-in-iframe.html
+/sdcard/android/layout_tests/editing/selection/table-caret-2.html
+/sdcard/android/layout_tests/editing/selection/expanding-selections.html
+/sdcard/android/layout_tests/editing/selection/unrendered-space.html
+/sdcard/android/layout_tests/editing/selection/node-removal-1.html
+/sdcard/android/layout_tests/editing/selection/5240265.html
+/sdcard/android/layout_tests/editing/selection/select-all-005.html
+/sdcard/android/layout_tests/editing/selection/extend-by-character-002.html
+/sdcard/android/layout_tests/editing/selection/4932260-2.html
+/sdcard/android/layout_tests/editing/selection/5076323-3.html
+/sdcard/android/layout_tests/editing/selection/select-element-paragraph-boundary.html
+/sdcard/android/layout_tests/editing/selection/line-wrap-1.html
+/sdcard/android/layout_tests/editing/selection/replace-selection-1.html
+/sdcard/android/layout_tests/editing/selection/caret-rtl.html
+/sdcard/android/layout_tests/editing/selection/5109817.html
+/sdcard/android/layout_tests/editing/selection/extend-by-sentence-001.html
+/sdcard/android/layout_tests/editing/selection/3690719.html
+/sdcard/android/layout_tests/editing/selection/5136696.html
+/sdcard/android/layout_tests/editing/selection/editable-non-editable-crash.html
+/sdcard/android/layout_tests/editing/selection/4397952.html
+/sdcard/android/layout_tests/editing/selection/mixed-editability-3.html
+/sdcard/android/layout_tests/editing/selection/caret-and-focus-ring.html
+/sdcard/android/layout_tests/editing/selection/4895428-4.html
+/sdcard/android/layout_tests/editing/selection/replaced-boundaries-3.html
+/sdcard/android/layout_tests/editing/selection/4947387.html
+/sdcard/android/layout_tests/editing/selection/move-by-sentence-linebreak.html
+/sdcard/android/layout_tests/editing/selection/move-by-character-005.html
+/sdcard/android/layout_tests/editing/selection/select-from-textfield-outwards.html
+/sdcard/android/layout_tests/editing/selection/leave-requested-block.html
+/sdcard/android/layout_tests/editing/selection/select-all-002.html
+/sdcard/android/layout_tests/editing/selection/end-of-document.html
+/sdcard/android/layout_tests/editing/selection/selectNode.html
+/sdcard/android/layout_tests/editing/selection/editable-links.html
+/sdcard/android/layout_tests/editing/selection/unrendered-004.html
+/sdcard/android/layout_tests/editing/selection/7152-2.html
+/sdcard/android/layout_tests/editing/selection/5195166-1.html
+/sdcard/android/layout_tests/editing/selection/editable-html-element.html
+/sdcard/android/layout_tests/editing/selection/4895428-1.html
+/sdcard/android/layout_tests/editing/selection/4866671.html
+/sdcard/android/layout_tests/editing/selection/move-by-character-002.html
+/sdcard/android/layout_tests/editing/selection/extend-by-word-002.html
+/sdcard/android/layout_tests/editing/selection/mixed-editability-8.html
+/sdcard/android/layout_tests/editing/selection/wrapped-line-caret-1.html
+/sdcard/android/layout_tests/editing/selection/selection-actions.html
+/sdcard/android/layout_tests/editing/selection/14971.html
+/sdcard/android/layout_tests/editing/selection/5131716-2.html
+/sdcard/android/layout_tests/editing/selection/4402375.html
+/sdcard/android/layout_tests/editing/selection/unrendered-001.html
+/sdcard/android/layout_tests/editing/selection/move-3875641-fix.html
+/sdcard/android/layout_tests/editing/selection/5081257-1.html
+/sdcard/android/layout_tests/editing/selection/extend-by-character-004.html
+/sdcard/android/layout_tests/editing/selection/5099303.html
+/sdcard/android/layout_tests/editing/selection/contenteditable-click-inside.html
+/sdcard/android/layout_tests/editing/selection/move-by-line-002.html
+/sdcard/android/layout_tests/editing/selection/addRange.html
+/sdcard/android/layout_tests/editing/selection/select-missing-image.html
+/sdcard/android/layout_tests/editing/selection/selection-3748164-fix.html
+/sdcard/android/layout_tests/editing/selection/mixed-editability-5.html
+/sdcard/android/layout_tests/editing/selection/4983858.html
+/sdcard/android/layout_tests/editing/selection/move-by-sentence-001.html
+/sdcard/android/layout_tests/editing/selection/table-caret-1.html
+/sdcard/android/layout_tests/editing/selection/5007143.html
+/sdcard/android/layout_tests/editing/selection/fake-doubleclick.html
+/sdcard/android/layout_tests/editing/selection/move-by-word-001.html
+/sdcard/android/layout_tests/editing/selection/select-all-004.html
+/sdcard/android/layout_tests/editing/selection/extend-by-character-001.html
+/sdcard/android/layout_tests/editing/selection/4932260-1.html
+/sdcard/android/layout_tests/editing/selection/5076323-2.html
+/sdcard/android/layout_tests/editing/selection/5234383-2.html
+/sdcard/android/layout_tests/editing/selection/5057506.html
+/sdcard/android/layout_tests/editing/selection/focus_editable_html.html
+/sdcard/android/layout_tests/editing/selection/move-3875618-fix.html
+/sdcard/android/layout_tests/editing/selection/4818145.html
+/sdcard/android/layout_tests/editing/selection/move-backwords-by-word-001.html
+/sdcard/android/layout_tests/editing/selection/inline-table.html
+/sdcard/android/layout_tests/editing/selection/mixed-editability-2.html
+/sdcard/android/layout_tests/editing/selection/4895428-3.html
+/sdcard/android/layout_tests/editing/selection/replaced-boundaries-2.html
+/sdcard/android/layout_tests/editing/selection/move-by-character-004.html
+/sdcard/android/layout_tests/editing/selection/caret-before-select.html
+/sdcard/android/layout_tests/editing/selection/4889598.html
+/sdcard/android/layout_tests/editing/selection/select-all-001.html
+/sdcard/android/layout_tests/editing/selection/5131716-4.html
+/sdcard/android/layout_tests/editing/selection/3690703.html
+/sdcard/android/layout_tests/editing/selection/5333725.html
+/sdcard/android/layout_tests/editing/selection/unrendered-003.html
+/sdcard/android/layout_tests/editing/selection/extend-by-character-006.html
+/sdcard/android/layout_tests/editing/selection/7152-1.html
+/sdcard/android/layout_tests/editing/selection/5213963.html
+/sdcard/android/layout_tests/editing/selection/5354455-2.html
+/sdcard/android/layout_tests/editing/selection/selection-background.html
+/sdcard/android/layout_tests/editing/selection/iframe.html
+/sdcard/android/layout_tests/editing/selection/extend-by-word-001.html
+/sdcard/android/layout_tests/editing/selection/move-by-character-001.html
+/sdcard/android/layout_tests/editing/selection/mixed-editability-7.html
+/sdcard/android/layout_tests/editing/selection/doubleclick-crash.html
+/sdcard/android/layout_tests/editing/selection/table-caret-3.html
+/sdcard/android/layout_tests/editing/selection/5131716-1.html
+/sdcard/android/layout_tests/editing/selection/select-all-iframe.html
+/sdcard/android/layout_tests/editing/selection/node-removal-2.html
+/sdcard/android/layout_tests/editing/selection/drag-select-1.html
+/sdcard/android/layout_tests/editing/selection/select-all-006.html
+/sdcard/android/layout_tests/editing/selection/extend-by-character-003.html
+/sdcard/android/layout_tests/editing/selection/4932260-3.html
+/sdcard/android/layout_tests/editing/selection/4960116.html
+/sdcard/android/layout_tests/editing/selection/after-line-wrap.html
+/sdcard/android/layout_tests/editing/selection/line-wrap-2.html
+/sdcard/android/layout_tests/editing/selection/drag-to-contenteditable-iframe.html
+/sdcard/android/layout_tests/editing/selection/move-by-line-001.html
+/sdcard/android/layout_tests/editing/selection/selectNodeContents.html
+/sdcard/android/layout_tests/editing/selection/move-between-blocks-yes-001.html
+/sdcard/android/layout_tests/editing/selection/6476.html
+/sdcard/android/layout_tests/editing/selection/contains-boundaries.html
+/sdcard/android/layout_tests/editing/selection/click-start-of-line.html
+/sdcard/android/layout_tests/editing/selection/mixed-editability-4.html
+/sdcard/android/layout_tests/editing/selection/focus-body.html
+/sdcard/android/layout_tests/editing/selection/triple-click-in-pre.html
+/sdcard/android/layout_tests/editing/selection/move-past-trailing-space.html
+/sdcard/android/layout_tests/editing/selection/inline-closest-leaf-child.html
+/sdcard/android/layout_tests/editing/selection/5007143-2.html
+/sdcard/android/layout_tests/editing/selection/designmode-no-caret.html
+/sdcard/android/layout_tests/editing/selection/select-all-003.html
+/sdcard/android/layout_tests/editing/selection/5076323-1.html
+/sdcard/android/layout_tests/editing/selection/5234383-1.html
+/sdcard/android/layout_tests/editing/selection/5057506-2.html
+/sdcard/android/layout_tests/editing/selection/5232159.html
+/sdcard/android/layout_tests/editing/selection/4975120.html
+/sdcard/android/layout_tests/editing/selection/4960137.html
+/sdcard/android/layout_tests/editing/selection/unrendered-005.html
+/sdcard/android/layout_tests/editing/selection/5195166-2.html
+/sdcard/android/layout_tests/editing/selection/contenteditable-click-outside.html
+/sdcard/android/layout_tests/editing/selection/previous-line-position.html
+/sdcard/android/layout_tests/editing/selection/mixed-editability-1.html
+/sdcard/android/layout_tests/editing/selection/select-box.html
+/sdcard/android/layout_tests/editing/selection/4895428-2.html
+/sdcard/android/layout_tests/editing/selection/replaced-boundaries-1.html
+/sdcard/android/layout_tests/editing/selection/4776665.html
+/sdcard/android/layout_tests/editing/selection/move-by-character-003.html
+/sdcard/android/layout_tests/editing/selection/word-granularity.html
+/sdcard/android/layout_tests/editing/selection/move-by-character-6.html
+/sdcard/android/layout_tests/editing/undo/undo-misspellings.html
+/sdcard/android/layout_tests/editing/undo/undo-combined-delete.html
+/sdcard/android/layout_tests/editing/undo/undo-delete-boundary.html
+/sdcard/android/layout_tests/editing/undo/undo-forward-delete-boundary.html
+/sdcard/android/layout_tests/editing/undo/4063751.html
+/sdcard/android/layout_tests/editing/undo/redo-typing-001.html
+/sdcard/android/layout_tests/editing/undo/5378473.html
+/sdcard/android/layout_tests/editing/undo/undo-combined-delete-boundary.html
+/sdcard/android/layout_tests/editing/undo/undo-delete.html
+/sdcard/android/layout_tests/editing/undo/undo-forward-delete.html
+/sdcard/android/layout_tests/editing/undo/undo-typing-001.html
+/sdcard/android/layout_tests/editing/deleting/delete-3608462-fix.html
+/sdcard/android/layout_tests/editing/deleting/delete-image-001.html
+/sdcard/android/layout_tests/editing/deleting/delete-3928305-fix.html
+/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-012.html
+/sdcard/android/layout_tests/editing/deleting/5115601.html
+/sdcard/android/layout_tests/editing/deleting/deletionUI-single-instance.html
+/sdcard/android/layout_tests/editing/deleting/delete-block-contents-001.html
+/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-024.html
+/sdcard/android/layout_tests/editing/deleting/delete-after-span-ws-001.html
+/sdcard/android/layout_tests/editing/deleting/delete-line-011.html
+/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-008.html
+/sdcard/android/layout_tests/editing/deleting/delete-listitem-001.html
+/sdcard/android/layout_tests/editing/deleting/5300379.html
+/sdcard/android/layout_tests/editing/deleting/delete-line-007.html
+/sdcard/android/layout_tests/editing/deleting/5433862-2.html
+/sdcard/android/layout_tests/editing/deleting/5026848-1.html
+/sdcard/android/layout_tests/editing/deleting/delete-at-paragraph-boundaries-003.html
+/sdcard/android/layout_tests/editing/deleting/delete-br-012.html
+/sdcard/android/layout_tests/editing/deleting/delete-br-008.html
+/sdcard/android/layout_tests/editing/deleting/5206311-2.html
+/sdcard/android/layout_tests/editing/deleting/delete-at-start-or-end.html
+/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-021.html
+/sdcard/android/layout_tests/editing/deleting/delete-ws-fixup-004.html
+/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-005.html
+/sdcard/android/layout_tests/editing/deleting/delete-select-all-003.html
+/sdcard/android/layout_tests/editing/deleting/smart-delete-002.html
+/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-017.html
+/sdcard/android/layout_tests/editing/deleting/table-cells.html
+/sdcard/android/layout_tests/editing/deleting/5156801-2.html
+/sdcard/android/layout_tests/editing/deleting/delete-leading-ws-001.html
+/sdcard/android/layout_tests/editing/deleting/delete-line-004.html
+/sdcard/android/layout_tests/editing/deleting/delete-3857753-fix.html
+/sdcard/android/layout_tests/editing/deleting/delete-3959464-fix.html
+/sdcard/android/layout_tests/editing/deleting/delete-line-016.html
+/sdcard/android/layout_tests/editing/deleting/delete-trailing-ws-001.html
+/sdcard/android/layout_tests/editing/deleting/delete-br-005.html
+/sdcard/android/layout_tests/editing/deleting/delete-at-paragraph-boundaries-008.html
+/sdcard/android/layout_tests/editing/deleting/delete-tab-004.html
+/sdcard/android/layout_tests/editing/deleting/merge-whitespace-pre.html
+/sdcard/android/layout_tests/editing/deleting/delete-ws-fixup-001.html
+/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-002.html
+/sdcard/android/layout_tests/editing/deleting/delete-line-end-ws-002.html
+/sdcard/android/layout_tests/editing/deleting/merge-unrendered-space.html
+/sdcard/android/layout_tests/editing/deleting/delete-by-word-002.html
+/sdcard/android/layout_tests/editing/deleting/delete-image-003.html
+/sdcard/android/layout_tests/editing/deleting/delete-selection-001.html
+/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-014.html
+/sdcard/android/layout_tests/editing/deleting/merge-different-styles.html
+/sdcard/android/layout_tests/editing/deleting/delete-block-contents-003.html
+/sdcard/android/layout_tests/editing/deleting/delete-line-001.html
+/sdcard/android/layout_tests/editing/deleting/delete-after-span-ws-003.html
+/sdcard/android/layout_tests/editing/deleting/delete-line-013.html
+/sdcard/android/layout_tests/editing/deleting/merge-into-empty-block-1.html
+/sdcard/android/layout_tests/editing/deleting/5156801.html
+/sdcard/android/layout_tests/editing/deleting/delete-3865854-fix.html
+/sdcard/android/layout_tests/editing/deleting/delete-line-009.html
+/sdcard/android/layout_tests/editing/deleting/5026848-3.html
+/sdcard/android/layout_tests/editing/deleting/delete-at-paragraph-boundaries-005.html
+/sdcard/android/layout_tests/editing/deleting/delete-br-002.html
+/sdcard/android/layout_tests/editing/deleting/delete-tab-001.html
+/sdcard/android/layout_tests/editing/deleting/4866671.html
+/sdcard/android/layout_tests/editing/deleting/whitespace-pre-1.html
+/sdcard/android/layout_tests/editing/deleting/delete-block-table.html
+/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-011.html
+/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-023.html
+/sdcard/android/layout_tests/editing/deleting/delete-line-010.html
+/sdcard/android/layout_tests/editing/deleting/5032066.html
+/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-007.html
+/sdcard/android/layout_tests/editing/deleting/smart-delete-004.html
+/sdcard/android/layout_tests/editing/deleting/5144139-2.html
+/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-019.html
+/sdcard/android/layout_tests/editing/deleting/delete-line-006.html
+/sdcard/android/layout_tests/editing/deleting/5126166.html
+/sdcard/android/layout_tests/editing/deleting/delete-to-end-of-paragraph.html
+/sdcard/android/layout_tests/editing/deleting/5408255.html
+/sdcard/android/layout_tests/editing/deleting/5099303.html
+/sdcard/android/layout_tests/editing/deleting/4845371.html
+/sdcard/android/layout_tests/editing/deleting/delete-at-paragraph-boundaries-002.html
+/sdcard/android/layout_tests/editing/deleting/4922367.html
+/sdcard/android/layout_tests/editing/deleting/delete-br-011.html
+/sdcard/android/layout_tests/editing/deleting/delete-br-007.html
+/sdcard/android/layout_tests/editing/deleting/move-nodes-001.html
+/sdcard/android/layout_tests/editing/deleting/merge-no-br.html
+/sdcard/android/layout_tests/editing/deleting/delete-3800834-fix.html
+/sdcard/android/layout_tests/editing/deleting/delete-4038408-fix.html
+/sdcard/android/layout_tests/editing/deleting/5206311-1.html
+/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-020.html
+/sdcard/android/layout_tests/editing/deleting/delete-ws-fixup-003.html
+/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-004.html
+/sdcard/android/layout_tests/editing/deleting/smart-delete-001.html
+/sdcard/android/layout_tests/editing/deleting/delete-to-select-table.html
+/sdcard/android/layout_tests/editing/deleting/delete-select-all-002.html
+/sdcard/android/layout_tests/editing/deleting/delete-contiguous-ws-001.html
+/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-016.html
+/sdcard/android/layout_tests/editing/deleting/delete-line-003.html
+/sdcard/android/layout_tests/editing/deleting/delete-line-015.html
+/sdcard/android/layout_tests/editing/deleting/5390681.html
+/sdcard/android/layout_tests/editing/deleting/delete-at-paragraph-boundaries-011.html
+/sdcard/android/layout_tests/editing/deleting/forward-delete.html
+/sdcard/android/layout_tests/editing/deleting/delete-at-paragraph-boundaries-007.html
+/sdcard/android/layout_tests/editing/deleting/delete-br-004.html
+/sdcard/android/layout_tests/editing/deleting/delete-tab-003.html
+/sdcard/android/layout_tests/editing/deleting/collapse-whitespace-3587601-fix.html
+/sdcard/android/layout_tests/editing/deleting/pruning-after-merge-2.html
+/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-001.html
+/sdcard/android/layout_tests/editing/deleting/delete-line-end-ws-001.html
+/sdcard/android/layout_tests/editing/deleting/delete-by-word-001.html
+/sdcard/android/layout_tests/editing/deleting/delete-image-002.html
+/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-013.html
+/sdcard/android/layout_tests/editing/deleting/delete-block-contents-002.html
+/sdcard/android/layout_tests/editing/deleting/paragraph-in-preserveNewline.html
+/sdcard/android/layout_tests/editing/deleting/delete-after-span-ws-002.html
+/sdcard/android/layout_tests/editing/deleting/5272440.html
+/sdcard/android/layout_tests/editing/deleting/delete-line-012.html
+/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-009.html
+/sdcard/android/layout_tests/editing/deleting/delete-listitem-002.html
+/sdcard/android/layout_tests/editing/deleting/delete-character-001.html
+/sdcard/android/layout_tests/editing/deleting/delete-line-008.html
+/sdcard/android/layout_tests/editing/deleting/5483370.html
+/sdcard/android/layout_tests/editing/deleting/5026848-2.html
+/sdcard/android/layout_tests/editing/deleting/delete-br-001.html
+/sdcard/android/layout_tests/editing/deleting/delete-at-paragraph-boundaries-004.html
+/sdcard/android/layout_tests/editing/deleting/5091898.html
+/sdcard/android/layout_tests/editing/deleting/delete-br-009.html
+/sdcard/android/layout_tests/editing/deleting/transpose-empty.html
+/sdcard/android/layout_tests/editing/deleting/merge-endOfParagraph.html
+/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-010.html
+/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-022.html
+/sdcard/android/layout_tests/editing/deleting/delete-3775172-fix.html
+/sdcard/android/layout_tests/editing/deleting/delete-mixed-editable-content-001.html
+/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-006.html
+/sdcard/android/layout_tests/editing/deleting/smart-delete-003.html
+/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-018.html
+/sdcard/android/layout_tests/editing/deleting/delete-line-005.html
+/sdcard/android/layout_tests/editing/deleting/delete-first-list-item.html
+/sdcard/android/layout_tests/editing/deleting/delete-line-017.html
+/sdcard/android/layout_tests/editing/deleting/delete-at-paragraph-boundaries-001.html
+/sdcard/android/layout_tests/editing/deleting/delete-trailing-ws-002.html
+/sdcard/android/layout_tests/editing/deleting/delete-br-010.html
+/sdcard/android/layout_tests/editing/deleting/delete-and-undo.html
+/sdcard/android/layout_tests/editing/deleting/delete-br-006.html
+/sdcard/android/layout_tests/editing/deleting/delete-at-paragraph-boundaries-009.html
+/sdcard/android/layout_tests/editing/deleting/delete-hr.html
+/sdcard/android/layout_tests/editing/deleting/4875189.html
+/sdcard/android/layout_tests/editing/deleting/delete-4083333-fix.html
+/sdcard/android/layout_tests/editing/deleting/delete-3608445-fix.html
+/sdcard/android/layout_tests/editing/deleting/delete-ws-fixup-002.html
+/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-003.html
+/sdcard/android/layout_tests/editing/deleting/delete-image-004.html
+/sdcard/android/layout_tests/editing/deleting/delete-select-all-001.html
+/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-015.html
+/sdcard/android/layout_tests/editing/deleting/delete-line-002.html
+/sdcard/android/layout_tests/editing/deleting/delete-line-014.html
+/sdcard/android/layout_tests/editing/deleting/merge-into-empty-block-2.html
+/sdcard/android/layout_tests/editing/deleting/delete-at-paragraph-boundaries-010.html
+/sdcard/android/layout_tests/editing/deleting/5390681-2.html
+/sdcard/android/layout_tests/editing/deleting/5369009.html
+/sdcard/android/layout_tests/editing/deleting/delete-br-003.html
+/sdcard/android/layout_tests/editing/deleting/delete-at-paragraph-boundaries-006.html
+/sdcard/android/layout_tests/editing/deleting/delete-tab-002.html
+/sdcard/android/layout_tests/editing/deleting/list-item-1.html
+/sdcard/android/layout_tests/editing/deleting/5168598.html
+/sdcard/android/layout_tests/editing/deleting/delete-3608430-fix.html
+/sdcard/android/layout_tests/editing/spelling/spelling.html
+/sdcard/android/layout_tests/editing/spelling/inline_spelling_markers.html
+/sdcard/android/layout_tests/printing/media-queries-print.html
/sdcard/android/layout_tests/fast/media/mq-relative-constraints-05.html
/sdcard/android/layout_tests/fast/media/mq-grid-02.html
/sdcard/android/layout_tests/fast/media/mq-compound-query-02.html
@@ -144,6 +911,7 @@
/sdcard/android/layout_tests/fast/dynamic/014.html
/sdcard/android/layout_tests/fast/dynamic/006.html
/sdcard/android/layout_tests/fast/dynamic/flash-replacement-test.html
+/sdcard/android/layout_tests/fast/dynamic/insertAdjacentElement.html
/sdcard/android/layout_tests/fast/dynamic/insert-before-table-part-in-continuation.html
/sdcard/android/layout_tests/fast/dynamic/staticY.html
/sdcard/android/layout_tests/fast/dynamic/anonymous-block-orphaned-lines.html
@@ -306,6 +1074,7 @@
/sdcard/android/layout_tests/fast/encoding/utf-16-big-endian.html
/sdcard/android/layout_tests/fast/encoding/xmacroman-encoding-test.html
/sdcard/android/layout_tests/fast/encoding/invalid-UTF-8.html
+/sdcard/android/layout_tests/fast/multicol/float-avoidance.html
/sdcard/android/layout_tests/fast/multicol/negativeColumnWidth.html
/sdcard/android/layout_tests/fast/multicol/column-rules.html
/sdcard/android/layout_tests/fast/multicol/zeroColumnCount.html
@@ -345,7 +1114,6 @@
/sdcard/android/layout_tests/fast/css-generated-content/007.html
/sdcard/android/layout_tests/fast/css-generated-content/009.html
/sdcard/android/layout_tests/fast/css-generated-content/wbr-with-before-content.html
-/sdcard/android/layout_tests/fast/workers/stress-js-execution.html : has expected results
/sdcard/android/layout_tests/fast/lists/decimal-leading-zero.html
/sdcard/android/layout_tests/fast/lists/ol-display-types.html
/sdcard/android/layout_tests/fast/lists/li-style-alpha-huge-value-crash.html
@@ -446,7 +1214,6 @@
/sdcard/android/layout_tests/fast/selectors/044.html
/sdcard/android/layout_tests/fast/selectors/008.html
/sdcard/android/layout_tests/fast/selectors/072.html
-/sdcard/android/layout_tests/fast/selectors/lang-inheritance.html : has expected results
/sdcard/android/layout_tests/fast/selectors/064.html
/sdcard/android/layout_tests/fast/selectors/056.html
/sdcard/android/layout_tests/fast/selectors/018b.html
@@ -463,8 +1230,6 @@
/sdcard/android/layout_tests/fast/selectors/077b.html
/sdcard/android/layout_tests/fast/selectors/177b.html
/sdcard/android/layout_tests/fast/selectors/169a.html
-/sdcard/android/layout_tests/fast/selectors/lang-vs-xml-lang.html : has expected results
-/sdcard/android/layout_tests/fast/selectors/lang-inheritance2.html : has expected results
/sdcard/android/layout_tests/fast/selectors/001.html
/sdcard/android/layout_tests/fast/selectors/021.html
/sdcard/android/layout_tests/fast/selectors/unqualified-hover-quirks.html
@@ -563,19 +1328,13 @@
/sdcard/android/layout_tests/fast/overflow/hidden-scrollbar-resize.html
/sdcard/android/layout_tests/fast/events/autoscroll.html
/sdcard/android/layout_tests/fast/events/5056619.html
-/sdcard/android/layout_tests/fast/events/attempt-scroll-with-no-scrollbars.html : has expected results
/sdcard/android/layout_tests/fast/events/updateLayoutForHitTest.html
/sdcard/android/layout_tests/fast/events/label-focus.html
-/sdcard/android/layout_tests/fast/events/context-onmousedown-event.html : has expected results
-/sdcard/android/layout_tests/fast/events/onsubmit-bubbling.html : has expected results
/sdcard/android/layout_tests/fast/events/onloadFrameCrash.html
/sdcard/android/layout_tests/fast/events/event-listener-on-link.html
/sdcard/android/layout_tests/fast/events/keydown-1.html
/sdcard/android/layout_tests/fast/events/onload-re-entry.html
/sdcard/android/layout_tests/fast/events/standalone-image-drag-to-editable.html
-/sdcard/android/layout_tests/fast/events/pointer-events.html : has expected results
-/sdcard/android/layout_tests/fast/events/pointer-events-2.html : has expected results
-/sdcard/android/layout_tests/fast/events/nested-window-event.html : has expected results
/sdcard/android/layout_tests/fast/events/focusingUnloadedFrame.html
/sdcard/android/layout_tests/fast/events/event-sender-mouse-moved.html
/sdcard/android/layout_tests/fast/events/mouseout-dead-node.html
@@ -655,6 +1414,8 @@
/sdcard/android/layout_tests/fast/box-shadow/border-radius-big.html
/sdcard/android/layout_tests/fast/box-shadow/basic-shadows.html
/sdcard/android/layout_tests/fast/js/exception-linenums-in-html-3.html
+/sdcard/android/layout_tests/fast/js/missing-style-end-tag-js.html
+/sdcard/android/layout_tests/fast/body-propagation/background-image/010.html
/sdcard/android/layout_tests/fast/body-propagation/background-image/001.html
/sdcard/android/layout_tests/fast/body-propagation/background-image/002.html
/sdcard/android/layout_tests/fast/body-propagation/background-image/003.html
@@ -698,21 +1459,13 @@
/sdcard/android/layout_tests/fast/dom/HTMLTableElement/colSpan.html
/sdcard/android/layout_tests/fast/dom/HTMLTableElement/createCaption.html
/sdcard/android/layout_tests/fast/dom/HTMLDocument/frameless-location-bugzilla10837.html
-/sdcard/android/layout_tests/fast/dom/Document/early-document-access.html : has expected results
/sdcard/android/layout_tests/fast/dom/Element/null-offset-parent.html
/sdcard/android/layout_tests/fast/dom/Element/class-attribute-whitespace.html
/sdcard/android/layout_tests/fast/dom/HTMLLinkElement/pending-stylesheet-count.html
/sdcard/android/layout_tests/fast/dom/HTMLStyleElement/insert-parser-generated.html
/sdcard/android/layout_tests/fast/dom/HTMLInputElement/input-image-alt-text.html
-/sdcard/android/layout_tests/fast/dom/Window/timeout-released-on-close.html : has expected results
/sdcard/android/layout_tests/fast/dom/Window/open-existing-pop-up-blocking.html
-/sdcard/android/layout_tests/fast/dom/Window/global-opener-function.html : has expected results
-/sdcard/android/layout_tests/fast/dom/Window/window-property-shadowing.html : has expected results
-/sdcard/android/layout_tests/fast/dom/Window/closure-access-after-navigation-window.html : has expected results
-/sdcard/android/layout_tests/fast/dom/Window/remove-timeout-crash.html : has expected results
-/sdcard/android/layout_tests/fast/dom/Window/window-special-properties.html : has expected results
-/sdcard/android/layout_tests/fast/dom/Window/timeout-callback-scope.html : has expected results
-/sdcard/android/layout_tests/fast/dom/Window/window-property-shadowing-name.html : has expected results
+/sdcard/android/layout_tests/fast/dom/Window/btoa-pnglet.html
/sdcard/android/layout_tests/fast/dom/HTMLObjectElement/vspace-hspace-as-number.html
/sdcard/android/layout_tests/fast/dom/HTMLElement/bdo.html
/sdcard/android/layout_tests/fast/dom/Range/surroundContents-1.html
@@ -742,10 +1495,7 @@
/sdcard/android/layout_tests/fast/dom/inner-text.html
/sdcard/android/layout_tests/fast/dom/isindex-002.html
/sdcard/android/layout_tests/fast/dom/outerText.html
-/sdcard/android/layout_tests/fast/dom/setAttributeNS.html : has expected results
-/sdcard/android/layout_tests/fast/dom/anchor-toString.html : has expected results
-/sdcard/android/layout_tests/fast/dom/documenturi-affects-relative-paths.html : has expected results
-/sdcard/android/layout_tests/fast/dom/setAttribute-using-initial-input-value.html : has expected results
+/sdcard/android/layout_tests/fast/dom/row-inner-text.html
/sdcard/android/layout_tests/fast/dom/blur-contenteditable.html
/sdcard/android/layout_tests/fast/dom/setPrimitiveValue.html
/sdcard/android/layout_tests/fast/dom/delete-contents.html
@@ -756,11 +1506,13 @@
/sdcard/android/layout_tests/fast/dom/comment-not-documentElement.html
/sdcard/android/layout_tests/fast/dom/clone-node-dynamic-style.html
/sdcard/android/layout_tests/fast/dom/css-mediarule-insertRule-update.html
-/sdcard/android/layout_tests/fast/dom/set-frame-src-while-running-script-in-frame.html : has expected results
+/sdcard/android/layout_tests/fast/dom/css-insert-import-rule.html
/sdcard/android/layout_tests/fast/dom/stripNullFromTextNodes.html
-/sdcard/android/layout_tests/fast/dom/null-document-location-put-crash.html : has expected results
-/sdcard/android/layout_tests/fast/dom/document-scripts.html : has expected results
-/sdcard/android/layout_tests/fast/invalid/test-case-tr-th-td-should-not-close-dl-list.html : has expected results
+/sdcard/android/layout_tests/fast/gradients/generated-gradients.html
+/sdcard/android/layout_tests/fast/gradients/list-item-gradient.html
+/sdcard/android/layout_tests/fast/gradients/border-image-gradient-sides-and-corners.html
+/sdcard/android/layout_tests/fast/gradients/simple-gradients.html
+/sdcard/android/layout_tests/fast/gradients/border-image-gradient.html
/sdcard/android/layout_tests/fast/invalid/table-inside-stray-table-content.html
/sdcard/android/layout_tests/fast/invalid/010.html
/sdcard/android/layout_tests/fast/invalid/002.html
@@ -801,14 +1553,14 @@
/sdcard/android/layout_tests/fast/forms/plaintext-mode-2.html
/sdcard/android/layout_tests/fast/forms/input-double-click-selection-gap-bug.html
/sdcard/android/layout_tests/fast/forms/preserveFormDuringResidualStyle.html
+/sdcard/android/layout_tests/fast/forms/search-rtl.html
/sdcard/android/layout_tests/fast/forms/select-change-popup-to-listbox.html
/sdcard/android/layout_tests/fast/forms/input-text-maxlength.html
/sdcard/android/layout_tests/fast/forms/blankbuttons.html
/sdcard/android/layout_tests/fast/forms/password-placeholder-text-security.html
/sdcard/android/layout_tests/fast/forms/HTMLOptionElement_label05.html
/sdcard/android/layout_tests/fast/forms/visual-hebrew-text-field.html
-/sdcard/android/layout_tests/fast/forms/textarea-trailing-newline.html : has expected results
-/sdcard/android/layout_tests/fast/forms/legend-access-key.html : has expected results
+/sdcard/android/layout_tests/fast/forms/input-text-option-delete.html
/sdcard/android/layout_tests/fast/forms/textfield-overflow.html
/sdcard/android/layout_tests/fast/forms/005.html
/sdcard/android/layout_tests/fast/forms/HTMLOptionElement_label02.html
@@ -828,13 +1580,13 @@
/sdcard/android/layout_tests/fast/forms/option-text-clip.html
/sdcard/android/layout_tests/fast/forms/textfield-drag-into-disabled.html
/sdcard/android/layout_tests/fast/forms/input-text-paste-maxlength.html
-/sdcard/android/layout_tests/fast/forms/tabs-with-modifiers.html : has expected results
-/sdcard/android/layout_tests/fast/forms/saved-state-adoptNode-crash.html : has expected results
+/sdcard/android/layout_tests/fast/forms/formmove.html
+/sdcard/android/layout_tests/fast/forms/select-display-none-style-resolve.html
/sdcard/android/layout_tests/fast/forms/input-readonly-autoscroll.html
/sdcard/android/layout_tests/fast/forms/thumbslider-no-parent-slider.html
/sdcard/android/layout_tests/fast/forms/textfield-outline.html
/sdcard/android/layout_tests/fast/forms/button-text-transform.html
-/sdcard/android/layout_tests/fast/forms/radio-check-click-and-drag.html : has expected results
+/sdcard/android/layout_tests/fast/forms/listbox-clip.html
/sdcard/android/layout_tests/fast/forms/textarea-scroll-height.html
/sdcard/android/layout_tests/fast/forms/button-table-styles.html
/sdcard/android/layout_tests/fast/forms/textarea-setinnerhtml.html
@@ -842,14 +1594,16 @@
/sdcard/android/layout_tests/fast/forms/box-shadow-override.html
/sdcard/android/layout_tests/fast/forms/button-cannot-be-nested.html
/sdcard/android/layout_tests/fast/forms/input-type-change.html
+/sdcard/android/layout_tests/fast/forms/searchfield-heights.html
/sdcard/android/layout_tests/fast/forms/checkbox-radio-onchange.html
/sdcard/android/layout_tests/fast/forms/input-spaces.html
-/sdcard/android/layout_tests/fast/forms/dragging-to-file-input.html : has expected results
/sdcard/android/layout_tests/fast/forms/menulist-option-wrap.html
+/sdcard/android/layout_tests/fast/forms/select-empty-option-height.html
+/sdcard/android/layout_tests/fast/forms/textarea-scrollbar.html
/sdcard/android/layout_tests/fast/forms/float-before-fieldset.html
/sdcard/android/layout_tests/fast/forms/radio_checked.html
/sdcard/android/layout_tests/fast/forms/minWidthPercent.html
-/sdcard/android/layout_tests/fast/forms/form-post-urlencoded.html : has expected results
+/sdcard/android/layout_tests/fast/forms/input-appearance-focus.html
/sdcard/android/layout_tests/fast/forms/input-value.html
/sdcard/android/layout_tests/fast/forms/HTMLOptionElement_label06.html
/sdcard/android/layout_tests/fast/forms/placeholder-pseudo-style.html
@@ -868,11 +1622,16 @@
/sdcard/android/layout_tests/fast/forms/input-text-click-outside.html
/sdcard/android/layout_tests/fast/forms/input-baseline.html
/sdcard/android/layout_tests/fast/forms/targeted-frame-submission.html
+/sdcard/android/layout_tests/fast/forms/input-text-scroll-left-on-blur.html
+/sdcard/android/layout_tests/fast/forms/form-element-geometry.html
/sdcard/android/layout_tests/fast/forms/input-table.html
+/sdcard/android/layout_tests/fast/forms/textarea-scrolled-type.html
/sdcard/android/layout_tests/fast/forms/select-change-listbox-to-popup.html
/sdcard/android/layout_tests/fast/forms/select-align.html
/sdcard/android/layout_tests/fast/forms/radio_checked_dynamic.html
/sdcard/android/layout_tests/fast/forms/select-writing-direction-natural.html
+/sdcard/android/layout_tests/fast/forms/search-cancel-button-style-sharing.html
+/sdcard/android/layout_tests/fast/forms/tabbing-input-iframe.html
/sdcard/android/layout_tests/fast/forms/hidden-input-file.html
/sdcard/android/layout_tests/fast/forms/menulist-deselect-update.html
/sdcard/android/layout_tests/fast/forms/button-sizes.html
@@ -899,9 +1658,11 @@
/sdcard/android/layout_tests/fast/forms/listbox-selection-2.html
/sdcard/android/layout_tests/fast/forms/input-readonly-empty.html
/sdcard/android/layout_tests/fast/forms/input-align-image.html
-/sdcard/android/layout_tests/fast/forms/input-selection-hidden.html : has expected results
+/sdcard/android/layout_tests/fast/forms/HTMLOptionElement_label07.html
/sdcard/android/layout_tests/fast/forms/option-index.html
+/sdcard/android/layout_tests/fast/forms/menulist-clip.html
/sdcard/android/layout_tests/fast/forms/indeterminate.html
+/sdcard/android/layout_tests/fast/forms/search-display-none-cancel-button.html
/sdcard/android/layout_tests/fast/forms/negativeLineHeight.html
/sdcard/android/layout_tests/fast/forms/007.html
/sdcard/android/layout_tests/fast/forms/HTMLOptionElement_label04.html
@@ -916,10 +1677,9 @@
/sdcard/android/layout_tests/fast/forms/search-placeholder-value-changed.html
/sdcard/android/layout_tests/fast/forms/input-field-text-truncated.html
/sdcard/android/layout_tests/fast/forms/floating-textfield-relayout.html
-/sdcard/android/layout_tests/fast/forms/add-remove-form-elements-stress-test.html : has expected results
/sdcard/android/layout_tests/fast/forms/button-inner-block-reuse.html
/sdcard/android/layout_tests/fast/forms/input-type-text-min-width.html
-/sdcard/android/layout_tests/fast/forms/onchange-enter-submit.html : has expected results
+/sdcard/android/layout_tests/fast/forms/001.html
/sdcard/android/layout_tests/fast/forms/slider-thumb-shared-style.html
/sdcard/android/layout_tests/fast/forms/option-script.html
/sdcard/android/layout_tests/fast/forms/input-paste-undo.html
@@ -934,6 +1694,7 @@
/sdcard/android/layout_tests/fast/forms/button-submit.html
/sdcard/android/layout_tests/fast/forms/disabled-select-change-index.html
/sdcard/android/layout_tests/fast/forms/formmove3.html
+/sdcard/android/layout_tests/fast/forms/form-hides-table.html
/sdcard/android/layout_tests/fast/forms/listbox-width-change.html
/sdcard/android/layout_tests/fast/forms/input-text-self-emptying-click.html
/sdcard/android/layout_tests/fast/forms/input-appearance-bkcolor.html
@@ -941,7 +1702,7 @@
/sdcard/android/layout_tests/fast/forms/search-transformed.html
/sdcard/android/layout_tests/fast/forms/image-border.html
/sdcard/android/layout_tests/fast/forms/encoding-test.html
-/sdcard/android/layout_tests/fast/forms/input-type-change-in-onfocus-mouse.html : has expected results
+/sdcard/android/layout_tests/fast/forms/control-clip.html
/sdcard/android/layout_tests/fast/compact/001.html
/sdcard/android/layout_tests/fast/compact/002.html
/sdcard/android/layout_tests/fast/compact/003.html
@@ -1138,7 +1899,6 @@
/sdcard/android/layout_tests/fast/css/first-letter-skip-out-of-flow.html
/sdcard/android/layout_tests/fast/css/font-face-multiple-remote-sources.html
/sdcard/android/layout_tests/fast/css/hover-subselector.html
-/sdcard/android/layout_tests/fast/css/text-align.html : has expected results
/sdcard/android/layout_tests/fast/css/margin-bottom-form-element-strict.html
/sdcard/android/layout_tests/fast/css/shadow-multiple.html
/sdcard/android/layout_tests/fast/css/import_with_baseurl.html
@@ -1185,6 +1945,7 @@
/sdcard/android/layout_tests/fast/css/zoom-property-parsing.html
/sdcard/android/layout_tests/fast/css/style-outside-head.html
/sdcard/android/layout_tests/fast/css/first-letter-capitalized.html
+/sdcard/android/layout_tests/fast/css/font-face-locally-installed.html
/sdcard/android/layout_tests/fast/css/word-space-extra.html
/sdcard/android/layout_tests/fast/css/first-letter-float.html
/sdcard/android/layout_tests/fast/css/simple-selector-chain-parsing.html
@@ -1192,6 +1953,7 @@
/sdcard/android/layout_tests/fast/css/continuationCrash.html
/sdcard/android/layout_tests/fast/css/vertical-align-lengths.html
/sdcard/android/layout_tests/fast/css/first-child-pseudo-class.html
+/sdcard/android/layout_tests/fast/css/beforeSelectorOnCodeElement.html
/sdcard/android/layout_tests/fast/css/getFloatValueForUnit.html
/sdcard/android/layout_tests/fast/css/first-letter-detach.html
/sdcard/android/layout_tests/fast/css/line-height-font-order.html
@@ -1210,7 +1972,6 @@
/sdcard/android/layout_tests/fast/css/link-outside-head.html
/sdcard/android/layout_tests/fast/css/font-size-negative.html
/sdcard/android/layout_tests/fast/css/position-negative-top-margin.html
-/sdcard/android/layout_tests/fast/css/invalid-percentage-property.html : has expected results
/sdcard/android/layout_tests/fast/css/ZeroOpacityLayers.html
/sdcard/android/layout_tests/fast/css/only-of-type-pseudo-class.html
/sdcard/android/layout_tests/fast/css/004.html
@@ -1223,6 +1984,7 @@
/sdcard/android/layout_tests/fast/css/textCapitalizeEdgeCases.html
/sdcard/android/layout_tests/fast/css/001.html
/sdcard/android/layout_tests/fast/css/hsl-color.html
+/sdcard/android/layout_tests/fast/css/font-face-implicit-local-font.html
/sdcard/android/layout_tests/fast/css/first-letter-recalculation.html
/sdcard/android/layout_tests/fast/css/inline-properties-important.html
/sdcard/android/layout_tests/fast/css/dynamic-sibling-selector.html
@@ -1502,7 +2264,6 @@
/sdcard/android/layout_tests/fast/parser/001.html
/sdcard/android/layout_tests/fast/parser/open-comment-in-textarea.html
/sdcard/android/layout_tests/fast/parser/tabs-in-scripts.html
-/sdcard/android/layout_tests/fast/parser/external-entities-in-xslt.xml : has expected results
/sdcard/android/layout_tests/fast/parser/parseCommentsInTitles.html
/sdcard/android/layout_tests/fast/parser/remove-block-in-residual-style.html
/sdcard/android/layout_tests/fast/parser/open-comment-in-style.html
@@ -1523,7 +2284,6 @@
/sdcard/android/layout_tests/fast/layers/scroll-rect-to-visible.html
/sdcard/android/layout_tests/fast/layers/opacity-stacking.html
/sdcard/android/layout_tests/fast/history/clicked-link-is-visited.html
-/sdcard/android/layout_tests/fast/history/history_reload.html : has expected results
/sdcard/android/layout_tests/fast/backgrounds/repeat/mask-negative-offset-repeat.html
/sdcard/android/layout_tests/fast/backgrounds/repeat/negative-offset-repeat.html
/sdcard/android/layout_tests/fast/backgrounds/repeat/negative-offset-repeat-transformed.html
@@ -1681,20 +2441,29 @@
/sdcard/android/layout_tests/fast/repaint/layer-child-outline.html
/sdcard/android/layout_tests/fast/loader/start-load-in-unload.html
/sdcard/android/layout_tests/fast/loader/text-document-wrapping.html
+/sdcard/android/layout_tests/fast/xsl/document-function.xml
+/sdcard/android/layout_tests/fast/xsl/xslt-extra-content-at-end.xml
+/sdcard/android/layout_tests/fast/xsl/xslt-enc.xml
+/sdcard/android/layout_tests/fast/xsl/xslt_unicode.xml
+/sdcard/android/layout_tests/fast/xsl/xslt-import-depth.xml
+/sdcard/android/layout_tests/fast/xsl/xslt-enc16.xml
+/sdcard/android/layout_tests/fast/xsl/xslt-enc16to16.xml
+/sdcard/android/layout_tests/fast/xsl/xslt-missing-namespace-in-xslt.xml
+/sdcard/android/layout_tests/fast/xsl/xslt-enc-cyr.xml
+/sdcard/android/layout_tests/fast/xsl/xslt-relative-path.xml
+/sdcard/android/layout_tests/fast/xsl/xslt-mismatched-tags-in-xslt.xml
+/sdcard/android/layout_tests/fast/xsl/xslt-entity.xml
/sdcard/android/layout_tests/fast/canvas/fillrect-gradient-zero-stops.html
/sdcard/android/layout_tests/fast/canvas/canvas-transforms-during-path.html
/sdcard/android/layout_tests/fast/canvas/drawImage.html
/sdcard/android/layout_tests/fast/canvas/shadow-offset-7.html
-/sdcard/android/layout_tests/fast/canvas/canvas-transform-non-invertible.html : has expected results
/sdcard/android/layout_tests/fast/canvas/shadow-offset-4.html
-/sdcard/android/layout_tests/fast/canvas/canvas-transform-infinity.html : has expected results
/sdcard/android/layout_tests/fast/canvas/canvas-text-baseline.html
/sdcard/android/layout_tests/fast/canvas/canvas-as-image-incremental-repaint.html
/sdcard/android/layout_tests/fast/canvas/shadow-offset-1.html
/sdcard/android/layout_tests/fast/canvas/canvas-size-change-after-layout.html
/sdcard/android/layout_tests/fast/canvas/canvas-resize-reset.html
/sdcard/android/layout_tests/fast/canvas/canvas-bg.html
-/sdcard/android/layout_tests/fast/canvas/canvas-transform-skewed.html : has expected results
/sdcard/android/layout_tests/fast/canvas/zero-size-fill-rect.html
/sdcard/android/layout_tests/fast/canvas/shadow-offset-6.html
/sdcard/android/layout_tests/fast/canvas/patternfill-repeat.html
@@ -1704,17 +2473,14 @@
/sdcard/android/layout_tests/fast/canvas/gradient-add-second-start-end-stop.html
/sdcard/android/layout_tests/fast/canvas/quadraticCurveTo.xml
/sdcard/android/layout_tests/fast/canvas/fill-stroke-clip-reset-path.html
-/sdcard/android/layout_tests/fast/canvas/canvas-transform-nan.html : has expected results
/sdcard/android/layout_tests/fast/canvas/canvas-text-alignment.html
/sdcard/android/layout_tests/fast/canvas/canvas-incremental-repaint.html
/sdcard/android/layout_tests/fast/canvas/canvasDrawingIntoSelf.html
/sdcard/android/layout_tests/fast/canvas/canvas-as-image.html
/sdcard/android/layout_tests/fast/canvas/canvas-before-css.html
/sdcard/android/layout_tests/fast/canvas/canvas-incremental-repaint-2.html
-/sdcard/android/layout_tests/fast/canvas/canvas-transform-identity.html : has expected results
/sdcard/android/layout_tests/fast/canvas/shadow-offset-5.html
/sdcard/android/layout_tests/fast/canvas/fillrect_gradient.html
-/sdcard/android/layout_tests/fast/canvas/canvas-transform-multiply.html : has expected results
/sdcard/android/layout_tests/fast/canvas/shadow-offset-2.html
/sdcard/android/layout_tests/fast/frames/contentWindow_Frame.html
/sdcard/android/layout_tests/fast/frames/onlyCommentInIFrame.html
@@ -1739,15 +2505,1576 @@
/sdcard/android/layout_tests/fast/frames/iframe-text-contents.html
/sdcard/android/layout_tests/fast/frames/frame-scrolling-attribute.html
/sdcard/android/layout_tests/fast/frames/contentWindow_iFrame.html
-/sdcard/android/layout_tests/fast/frames/frame-length-fractional.html : has expected results
/sdcard/android/layout_tests/fast/frames/calculate-fixed.html
/sdcard/android/layout_tests/fast/frames/frame-element-name.html
/sdcard/android/layout_tests/fast/frames/frame-set-whitespace-attributes.html
/sdcard/android/layout_tests/fast/frames/iframe-with-frameborder.html
/sdcard/android/layout_tests/fast/frames/frameElement-iframe.html
-/sdcard/android/layout_tests/fast/frames/iframe-name-and-id.html : has expected results
/sdcard/android/layout_tests/fast/reflections/inline-crash.html
/sdcard/android/layout_tests/fast/reflections/reflection-nesting.html
/sdcard/android/layout_tests/fast/reflections/reflection-overflow-hidden.html
/sdcard/android/layout_tests/fast/reflections/table-cell.html
+/sdcard/android/layout_tests/fast/reflections/reflection-masks.html
/sdcard/android/layout_tests/fast/reflections/reflection-direction.html
+/sdcard/android/layout_tests/transforms/2d/zoom-menulist.html
+/sdcard/android/layout_tests/transforms/2d/transform-origin-borderbox.html
+/sdcard/android/layout_tests/transforms/2d/transform-borderbox.html
+/sdcard/android/layout_tests/transforms/2d/compound-transforms-vs-containers.html
+/sdcard/android/layout_tests/animations/animation-drt-api-multiple-keyframes.html
+/sdcard/android/layout_tests/animations/animation-drt-api.html
+/sdcard/android/layout_tests/scrollbars/scrollbar-orientation.html
+/sdcard/android/layout_tests/scrollbars/scrollbar-buttons.html
+/sdcard/android/layout_tests/scrollbars/basic-scrollbar.html
+/sdcard/android/layout_tests/scrollbars/overflow-scrollbar-combinations.html
+/sdcard/android/layout_tests/scrollbars/disabled-scrollbar.html
+/sdcard/android/layout_tests/scrollbars/listbox-scrollbar-combinations.html
+/sdcard/android/layout_tests/css2.1/t040103-ident-03-c.html
+/sdcard/android/layout_tests/css2.1/t0804-c5509-padn-l-00-b-ag.html
+/sdcard/android/layout_tests/css2.1/t1205-c563-list-type-00-b.html
+/sdcard/android/layout_tests/css2.1/t090402-c42-ibx-pad-00-d-ag.html
+/sdcard/android/layout_tests/css2.1/t120401-scope-00-b.html
+/sdcard/android/layout_tests/css2.1/t010403-shand-border-00-c.html
+/sdcard/android/layout_tests/css2.1/t0805-c5518-ibrdr-t-00-a.html
+/sdcard/android/layout_tests/css2.1/t1202-counter-03-b.html
+/sdcard/android/layout_tests/css2.1/t1008-c44-ln-box-00-d-ag.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-14-d.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-34-d.html
+/sdcard/android/layout_tests/css2.1/t1204-implied-00-b.html
+/sdcard/android/layout_tests/css2.1/t1001-abs-pos-cb-03-b.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-54-d.html
+/sdcard/android/layout_tests/css2.1/t100801-c548-ln-ht-00-c-a.html
+/sdcard/android/layout_tests/css2.1/t0905-c5526-fltclr-00-c-ag.html
+/sdcard/android/layout_tests/css2.1/bogus-color-span.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-74-d.html
+/sdcard/android/layout_tests/css2.1/t0803-c5504-imrgn-l-03-b-a.html
+/sdcard/android/layout_tests/css2.1/t140201-c534-bgreps-04-c-ag.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-94-d.html
+/sdcard/android/layout_tests/css2.1/t0803-c5502-imrgn-r-03-b-a.html
+/sdcard/android/layout_tests/css2.1/t040307-syntax-01-b.html
+/sdcard/android/layout_tests/css2.1/t100801-c548-ln-ht-04-d-ag.html
+/sdcard/android/layout_tests/css2.1/t1508-c527-font-06-b.html
+/sdcard/android/layout_tests/css2.1/t040306-c63-color-00-b-ag.html
+/sdcard/android/layout_tests/css2.1/t1202-counters-02-b.html
+/sdcard/android/layout_tests/css2.1/t080301-c411-vt-mrgn-00-b.html
+/sdcard/android/layout_tests/css2.1/t010403-shand-font-03-b.html
+/sdcard/android/layout_tests/css2.1/t051103-c21-focus-ln-00-e-i.html
+/sdcard/android/layout_tests/css2.1/t120403-display-none-00-c.html
+/sdcard/android/layout_tests/css2.1/t0805-c5512-brdr-rw-01-b-g.html
+/sdcard/android/layout_tests/css2.1/t040103-ident-12-c.html
+/sdcard/android/layout_tests/css2.1/t0805-c5515-ibrdr-00-b.html
+/sdcard/android/layout_tests/css2.1/t0805-c5520-brdr-b-00-a.html
+/sdcard/android/layout_tests/css2.1/t1505-c524-font-var-00-b.html
+/sdcard/android/layout_tests/css2.1/t0509-c15-ids-00-a.html
+/sdcard/android/layout_tests/css2.1/t060403-c21-pseu-cls-00-e-i.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-03-d.html
+/sdcard/android/layout_tests/css2.1/t1202-counter-12-b.html
+/sdcard/android/layout_tests/css2.1/t0402-c71-fwd-parsing-04-f.html
+/sdcard/android/layout_tests/css2.1/t040303-c62-percent-00-b-ag.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-23-d.html
+/sdcard/android/layout_tests/css2.1/t140201-c535-bg-fixd-00-b-g.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-43-d.html
+/sdcard/android/layout_tests/css2.1/t1204-increment-02-c-o.html
+/sdcard/android/layout_tests/css2.1/t0602-c13-inh-underlin-00-e.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-63-d.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-83-d.html
+/sdcard/android/layout_tests/css2.1/t1202-counter-16-f.html
+/sdcard/android/layout_tests/css2.1/t040302-c61-phys-len-00-b.html
+/sdcard/android/layout_tests/css2.1/t0805-c5516-ibrdr-c-00-a.html
+/sdcard/android/layout_tests/css2.1/t0805-c5521-brdr-l-01-e.html
+/sdcard/android/layout_tests/css2.1/t100801-c544-valgn-03-d-agi.html
+/sdcard/android/layout_tests/css2.1/t040103-escapes-06-b.html
+/sdcard/android/layout_tests/css2.1/t0402-syntax-03-f.html
+/sdcard/android/layout_tests/css2.1/t050803-c14-classes-00-e.html
+/sdcard/android/layout_tests/css2.1/t140201-c537-bgfxps-00-c-ag.html
+/sdcard/android/layout_tests/css2.1/t1002-c5523-width-02-b-g.html
+/sdcard/android/layout_tests/css2.1/t1004-c5524-width-00-b-g.html
+/sdcard/android/layout_tests/css2.1/t1202-counters-11-b.html
+/sdcard/android/layout_tests/css2.1/t0803-c5504-imrgn-l-06-b-ag.html
+/sdcard/android/layout_tests/css2.1/t0805-c5522-brdr-02-e.html
+/sdcard/android/layout_tests/css2.1/t0511-c21-pseud-anch-00-e-i.html
+/sdcard/android/layout_tests/css2.1/t0804-c5508-ipadn-b-01-f-a.html
+/sdcard/android/layout_tests/css2.1/t0803-c5502-imrgn-r-04-b-ag.html
+/sdcard/android/layout_tests/css2.1/t040103-ident-01-c.html
+/sdcard/android/layout_tests/css2.1/t040102-keywords-00-b.html
+/sdcard/android/layout_tests/css2.1/t0505-c16-descendant-02-e.html
+/sdcard/android/layout_tests/css2.1/t1507-c526-font-sz-03-f-a.html
+/sdcard/android/layout_tests/css2.1/t1202-counters-09-b.html
+/sdcard/android/layout_tests/css2.1/t1204-root-e.html
+/sdcard/android/layout_tests/css2.1/t0905-c414-flt-fit-01-d-g.html
+/sdcard/android/layout_tests/css2.1/t1202-counter-01-b.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-12-d.html
+/sdcard/android/layout_tests/css2.1/t090501-c5525-flt-r-00-b-g.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-32-d.html
+/sdcard/android/layout_tests/css2.1/t1001-abs-pos-cb-01-b.html
+/sdcard/android/layout_tests/css2.1/t1004-c43-rpl-bbx-00-d-ag.html
+/sdcard/android/layout_tests/css2.1/t140201-c534-bgre-01-b-ag.html
+/sdcard/android/layout_tests/css2.1/t0804-c5509-ipadn-l-02-b-ag.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-52-d.html
+/sdcard/android/layout_tests/css2.1/t0805-c5512-brdr-rw-02-b.html
+/sdcard/android/layout_tests/css2.1/t040109-c17-comments-00-b.html
+/sdcard/android/layout_tests/css2.1/t0804-c5507-ipadn-r-00-b-ag.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-72-d.html
+/sdcard/android/layout_tests/css2.1/t140201-c534-bgreps-01-c-ag.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-92-d.html
+/sdcard/android/layout_tests/css2.1/t0905-c414-flt-01-d-g.html
+/sdcard/android/layout_tests/css2.1/t100801-c548-ln-ht-01-b-ag.html
+/sdcard/android/layout_tests/css2.1/t090501-c414-flt-03-b-g.html
+/sdcard/android/layout_tests/css2.1/t1204-multiple-01-c.html
+/sdcard/android/layout_tests/css2.1/t0803-c5505-mrgn-03-c-ag.html
+/sdcard/android/layout_tests/css2.1/t1508-c527-font-04-b.html
+/sdcard/android/layout_tests/css2.1/t1202-counters-00-b.html
+/sdcard/android/layout_tests/css2.1/t1602-c43-center-00-d-ag.html
+/sdcard/android/layout_tests/css2.1/t140201-c532-bgcolor-00-a.html
+/sdcard/android/layout_tests/css2.1/t0803-c5504-mrgn-l-03-c.html
+/sdcard/android/layout_tests/css2.1/t010403-shand-font-01-b.html
+/sdcard/android/layout_tests/css2.1/t1005-c5524-width-01-b-g.html
+/sdcard/android/layout_tests/css2.1/t1601-c547-indent-01-d.html
+/sdcard/android/layout_tests/css2.1/t040103-ident-10-c.html
+/sdcard/android/layout_tests/css2.1/t090501-c414-flt-01-b.html
+/sdcard/android/layout_tests/css2.1/t0803-c5505-mrgn-02-c.html
+/sdcard/android/layout_tests/css2.1/t0905-c414-flt-04-c.html
+/sdcard/android/layout_tests/css2.1/t051103-dom-hover-01-c-io.html
+/sdcard/android/layout_tests/css2.1/t1604-c542-letter-sp-00-b-a.html
+/sdcard/android/layout_tests/css2.1/t040103-ident-08-c.html
+/sdcard/android/layout_tests/css2.1/t120401-scope-02-c.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-01-d.html
+/sdcard/android/layout_tests/css2.1/t0402-c71-fwd-parsing-02-f.html
+/sdcard/android/layout_tests/css2.1/t1204-reset-00-c-o.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-21-d.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-41-d.html
+/sdcard/android/layout_tests/css2.1/t0905-c5525-fltwidth-01-c-g.html
+/sdcard/android/layout_tests/css2.1/t1507-c526-font-sz-00-b.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-61-d.html
+/sdcard/android/layout_tests/css2.1/t1202-counter-08-b.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-81-d.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-19-d.html
+/sdcard/android/layout_tests/css2.1/t040103-escapes-04-b.html
+/sdcard/android/layout_tests/css2.1/t1604-c541-word-sp-01-b-a.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-39-d.html
+/sdcard/android/layout_tests/css2.1/t1001-abs-pos-cb-08-b.html
+/sdcard/android/layout_tests/css2.1/t0402-syntax-01-f.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-59-d.html
+/sdcard/android/layout_tests/css2.1/t1205-c565-list-pos-00-b.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-79-d.html
+/sdcard/android/layout_tests/css2.1/t1508-c527-font-10-c.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-99-d.html
+/sdcard/android/layout_tests/css2.1/t0803-c5502-imrgn-r-01-b-ag.html
+/sdcard/android/layout_tests/css2.1/t040306-syntax-01-f.html
+/sdcard/android/layout_tests/css2.1/t1507-c526-font-sz-01-b-a.html
+/sdcard/android/layout_tests/css2.1/t040105-atrule-04-b.html
+/sdcard/android/layout_tests/css2.1/t0505-c16-descendant-00-e.html
+/sdcard/android/layout_tests/css2.1/t0805-c5513-brdr-bw-02-b.html
+/sdcard/android/layout_tests/css2.1/t0805-c5519-brdr-r-01-e.html
+/sdcard/android/layout_tests/css2.1/t1202-counters-07-b.html
+/sdcard/android/layout_tests/css2.1/t0804-c5510-padn-00-b-ag.html
+/sdcard/android/layout_tests/css2.1/t0805-c5517-ibrdr-s-00-a.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-10-d.html
+/sdcard/android/layout_tests/css2.1/t040105-import-00-b.html
+/sdcard/android/layout_tests/css2.1/t0804-c5509-ipadn-l-03-b-a.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-30-d.html
+/sdcard/android/layout_tests/css2.1/t0805-c5514-brdr-lw-02-b.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-50-d.html
+/sdcard/android/layout_tests/css2.1/t0804-c5507-ipadn-r-03-b-a.html
+/sdcard/android/layout_tests/css2.1/t1008-c44-ln-box-02-d-ag.html
+/sdcard/android/layout_tests/css2.1/t0805-c5512-brdr-rw-00-b.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-70-d.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-08-d.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-90-d.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-28-d.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-48-d.html
+/sdcard/android/layout_tests/css2.1/t0805-c5513-brdr-bw-01-b-g.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-68-d.html
+/sdcard/android/layout_tests/css2.1/t1402-c45-bg-canvas-00-b.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-88-d.html
+/sdcard/android/layout_tests/css2.1/t1508-c527-font-02-b.html
+/sdcard/android/layout_tests/css2.1/t0805-c5521-ibrdr-l-00-a.html
+/sdcard/android/layout_tests/css2.1/t0805-c5522-brdr-00-b.html
+/sdcard/android/layout_tests/css2.1/t1606-c562-white-sp-00-b-ag.html
+/sdcard/android/layout_tests/css2.1/t0905-c414-flt-02-c.html
+/sdcard/android/layout_tests/css2.1/t100801-c544-valgn-00-a-ag.html
+/sdcard/android/layout_tests/css2.1/t040103-ident-06-c.html
+/sdcard/android/layout_tests/css2.1/t0402-c71-fwd-parsing-00-f.html
+/sdcard/android/layout_tests/css2.1/t1204-reset-02-c-o.html
+/sdcard/android/layout_tests/css2.1/t0602-c13-inheritance-00-e.html
+/sdcard/android/layout_tests/css2.1/t090501-c414-flt-ln-02-d.html
+/sdcard/android/layout_tests/css2.1/t1205-c566-list-stl-01-c-g.html
+/sdcard/android/layout_tests/css2.1/t1202-counter-06-b.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-17-d.html
+/sdcard/android/layout_tests/css2.1/t100304-c43-rpl-bbx-00-d-g.html
+/sdcard/android/layout_tests/css2.1/t0803-c5504-mrgn-l-00-c-ag.html
+/sdcard/android/layout_tests/css2.1/t1205-c566-list-stl-00-e-ag.html
+/sdcard/android/layout_tests/css2.1/t0905-c5525-fltwidth-03-c-g.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-37-d.html
+/sdcard/android/layout_tests/css2.1/t1001-abs-pos-cb-06-b.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-57-d.html
+/sdcard/android/layout_tests/css2.1/t0804-c5510-padn-02-f.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-77-d.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-97-d.html
+/sdcard/android/layout_tests/css2.1/t0803-c5504-imrgn-l-00-b-ag.html
+/sdcard/android/layout_tests/css2.1/t090204-display-change-01-b-ao.html
+/sdcard/android/layout_tests/css2.1/t040302-c61-ex-len-00-b-a.html
+/sdcard/android/layout_tests/css2.1/t040105-atrule-02-b.html
+/sdcard/android/layout_tests/css2.1/t0805-c5513-brdr-bw-00-b.html
+/sdcard/android/layout_tests/css2.1/t1508-c527-font-09-b.html
+/sdcard/android/layout_tests/css2.1/t1202-counters-05-b.html
+/sdcard/android/layout_tests/css2.1/t0803-c5502-mrgn-r-02-c.html
+/sdcard/android/layout_tests/css2.1/t0803-c5502-imrgn-r-06-b-ag.html
+/sdcard/android/layout_tests/css2.1/t0804-c5507-padn-r-01-c-a.html
+/sdcard/android/layout_tests/css2.1/t090501-c414-flt-00-d.html
+/sdcard/android/layout_tests/css2.1/t1202-counters-17-d.html
+/sdcard/android/layout_tests/css2.1/t0803-c5504-mrgn-l-01-c-a.html
+/sdcard/android/layout_tests/css2.1/t0805-c5514-brdr-lw-00-b.html
+/sdcard/android/layout_tests/css2.1/t140201-c536-bgpos-01-b-ag.html
+/sdcard/android/layout_tests/css2.1/t100303-c412-blockw-00-d-ag.html
+/sdcard/android/layout_tests/css2.1/t120401-scope-04-d.html
+/sdcard/android/layout_tests/css2.1/t0804-c5506-ipadn-t-01-b-a.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-06-d.html
+/sdcard/android/layout_tests/css2.1/t1202-counter-15-b.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-26-d.html
+/sdcard/android/layout_tests/css2.1/t0805-c5521-brdr-l-00-a.html
+/sdcard/android/layout_tests/css2.1/t0805-c5511-brdr-tw-02-b.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-46-d.html
+/sdcard/android/layout_tests/css2.1/t0804-c5507-ipadn-r-02-b-ag.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-66-d.html
+/sdcard/android/layout_tests/css2.1/t140201-c534-bgreps-03-c-ag.html
+/sdcard/android/layout_tests/css2.1/t100801-c544-valgn-02-d-agi.html
+/sdcard/android/layout_tests/css2.1/t0804-c5509-ipadn-l-04-f-ag.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-86-d.html
+/sdcard/android/layout_tests/css2.1/t0805-c5512-ibrdr-rw-00-a.html
+/sdcard/android/layout_tests/css2.1/t1508-c527-font-00-b.html
+/sdcard/android/layout_tests/css2.1/t0905-c5525-fltblck-01-d.html
+/sdcard/android/layout_tests/css2.1/t0402-syntax-06-f.html
+/sdcard/android/layout_tests/css2.1/t100801-c548-ln-ht-03-d-ag.html
+/sdcard/android/layout_tests/css2.1/t0805-c5515-brdr-w-00-a.html
+/sdcard/android/layout_tests/css2.1/t051202-c24-first-lttr-00-b.html
+/sdcard/android/layout_tests/css2.1/t0511-c21-pseud-link-02-e.html
+/sdcard/android/layout_tests/css2.1/t0804-c5510-padn-01-e-a.html
+/sdcard/android/layout_tests/css2.1/t0905-c5525-fltinln-00-c-ag.html
+/sdcard/android/layout_tests/css2.1/t1202-counters-14-b.html
+/sdcard/android/layout_tests/css2.1/t0805-c5518-brdr-t-01-e.html
+/sdcard/android/layout_tests/css2.1/t040105-atkeyw-01-b.html
+/sdcard/android/layout_tests/css2.1/t0805-c5511-brdr-tw-01-b-g.html
+/sdcard/android/layout_tests/css2.1/t040103-ident-04-c.html
+/sdcard/android/layout_tests/css2.1/t1205-c563-list-type-01-b.html
+/sdcard/android/layout_tests/css2.1/t1202-counters-18-f.html
+/sdcard/android/layout_tests/css2.1/t0509-id-sel-syntax-01-f.html
+/sdcard/android/layout_tests/css2.1/t100801-c544-valgn-01-d-ag.html
+/sdcard/android/layout_tests/css2.1/t090501-c414-flt-ln-00-d.html
+/sdcard/android/layout_tests/css2.1/t1601-c547-indent-00-b-a.html
+/sdcard/android/layout_tests/css2.1/t1202-counter-04-b.html
+/sdcard/android/layout_tests/css2.1/t0905-c5525-flthw-00-c-g.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-15-d.html
+/sdcard/android/layout_tests/css2.1/t0805-c5522-brdr-01-b-g.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-35-d.html
+/sdcard/android/layout_tests/css2.1/t040103-escapes-00-b.html
+/sdcard/android/layout_tests/css2.1/t1001-abs-pos-cb-04-b.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-55-d.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-75-d.html
+/sdcard/android/layout_tests/css2.1/t1205-c564-list-img-00-b-g.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-95-d.html
+/sdcard/android/layout_tests/css2.1/t120403-visibility-00-c.html
+/sdcard/android/layout_tests/css2.1/t0803-c5502-imrgn-r-02-b-a.html
+/sdcard/android/layout_tests/css2.1/t051103-c21-activ-ln-00-e-i.html
+/sdcard/android/layout_tests/css2.1/t0801-c412-hz-box-00-b-a.html
+/sdcard/android/layout_tests/css2.1/t090501-c414-flt-02-d-g.html
+/sdcard/android/layout_tests/css2.1/t1605-c545-txttrans-00-b-ag.html
+/sdcard/android/layout_tests/css2.1/t040105-atrule-00-b.html
+/sdcard/android/layout_tests/css2.1/t100801-c548-leadin-00-d-a.html
+/sdcard/android/layout_tests/css2.1/t0803-c5504-imrgn-l-05-b-ag.html
+/sdcard/android/layout_tests/css2.1/t0804-c5508-ipadn-b-03-b-a.html
+/sdcard/android/layout_tests/css2.1/t1508-c527-font-07-b.html
+/sdcard/android/layout_tests/css2.1/t1202-counters-03-b.html
+/sdcard/android/layout_tests/css2.1/t040103-ident-13-c.html
+/sdcard/android/layout_tests/css2.1/t1204-order-01-d.html
+/sdcard/android/layout_tests/css2.1/t0804-c5510-ipadn-00-b-ag.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-04-d.html
+/sdcard/android/layout_tests/css2.1/t1202-counter-13-b.html
+/sdcard/android/layout_tests/css2.1/t140201-c534-bgre-00-b-ag.html
+/sdcard/android/layout_tests/css2.1/t1504-c523-font-style-00-b.html
+/sdcard/android/layout_tests/css2.1/t0804-c5509-ipadn-l-01-b-ag.html
+/sdcard/android/layout_tests/css2.1/t0803-c5502-mrgn-r-01-c-a.html
+/sdcard/android/layout_tests/css2.1/t1204-increment-01-c-o.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-24-d.html
+/sdcard/android/layout_tests/css2.1/t0805-c5511-brdr-tw-00-b.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-44-d.html
+/sdcard/android/layout_tests/css2.1/t140201-c534-bgreps-00-c-ag.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-64-d.html
+/sdcard/android/layout_tests/css2.1/t1204-implied-02-d.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-84-d.html
+/sdcard/android/layout_tests/css2.1/t0805-c5521-brdr-l-02-e.html
+/sdcard/android/layout_tests/css2.1/t040103-escapes-07-b.html
+/sdcard/android/layout_tests/css2.1/t0804-c5507-padn-r-02-f.html
+/sdcard/android/layout_tests/css2.1/t0402-syntax-04-f.html
+/sdcard/android/layout_tests/css2.1/t1002-c5523-width-01-b-g.html
+/sdcard/android/layout_tests/css2.1/t0805-c5519-brdr-r-00-a.html
+/sdcard/android/layout_tests/css2.1/t0511-c21-pseud-link-00-e.html
+/sdcard/android/layout_tests/css2.1/t1202-counters-12-b.html
+/sdcard/android/layout_tests/css2.1/t040103-ident-02-c.html
+/sdcard/android/layout_tests/css2.1/t040102-keywords-01-b.html
+/sdcard/android/layout_tests/css2.1/t0803-c5503-imrgn-b-00-b-a.html
+/sdcard/android/layout_tests/css2.1/t0805-c5513-ibrdr-bw-00-a.html
+/sdcard/android/layout_tests/css2.1/css1_forward_compatible_parsing.html
+/sdcard/android/layout_tests/css2.1/t0804-c5509-padn-l-03-f-g.html
+/sdcard/android/layout_tests/css2.1/t1202-counter-02-b.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-13-d.html
+/sdcard/android/layout_tests/css2.1/t0905-c5526-flthw-00-c-g.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-33-d.html
+/sdcard/android/layout_tests/css2.1/t1001-abs-pos-cb-02-b.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-53-d.html
+/sdcard/android/layout_tests/css2.1/t0805-c5512-brdr-rw-03-b.html
+/sdcard/android/layout_tests/css2.1/t040109-c17-comments-01-b.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-73-d.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-93-d.html
+/sdcard/android/layout_tests/css2.1/t0805-c5511-ibrdr-tw-00-a.html
+/sdcard/android/layout_tests/css2.1/t0803-c5504-imrgn-l-02-b-ag.html
+/sdcard/android/layout_tests/css2.1/t0803-c5502-imrgn-r-00-b-ag.html
+/sdcard/android/layout_tests/css2.1/t1508-c527-font-05-b.html
+/sdcard/android/layout_tests/css2.1/t1202-counters-01-b.html
+/sdcard/android/layout_tests/css2.1/t1005-c5524-width-00-b-g.html
+/sdcard/android/layout_tests/css2.1/t0905-c414-flt-wrap-01-d-g.html
+/sdcard/android/layout_tests/css2.1/t010403-shand-font-02-b.html
+/sdcard/android/layout_tests/css2.1/t0805-c5515-brdr-w-02-b.html
+/sdcard/android/layout_tests/css2.1/t060401-c32-cascading-00-b.html
+/sdcard/android/layout_tests/css2.1/t0905-c5525-fltcont-00-d-g.html
+/sdcard/android/layout_tests/css2.1/t040103-ident-11-c.html
+/sdcard/android/layout_tests/css2.1/t1202-counters-16-c.html
+/sdcard/android/layout_tests/css2.1/t0509-id-sel-syntax-02-b.html
+/sdcard/android/layout_tests/css2.1/t090501-c5525-flt-l-00-b-g.html
+/sdcard/android/layout_tests/css2.1/t040103-ident-09-c.html
+/sdcard/android/layout_tests/css2.1/t050201-c12-grouping-00-b.html
+/sdcard/android/layout_tests/css2.1/t120401-scope-03-c.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-02-d.html
+/sdcard/android/layout_tests/css2.1/t0905-c414-flt-wrap-00-e.html
+/sdcard/android/layout_tests/css2.1/t0402-c71-fwd-parsing-03-f.html
+/sdcard/android/layout_tests/css2.1/t1202-counter-11-b.html
+/sdcard/android/layout_tests/css2.1/t1506-c525-font-wt-00-b.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-22-d.html
+/sdcard/android/layout_tests/css2.1/t1008-c44-ln-box-01-d-ag.html
+/sdcard/android/layout_tests/css2.1/t0905-c5525-fltwidth-00-c-g.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-42-d.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-62-d.html
+/sdcard/android/layout_tests/css2.1/t0905-c5525-fltmult-00-d-g.html
+/sdcard/android/layout_tests/css2.1/t1401-c531-color-00-a.html
+/sdcard/android/layout_tests/css2.1/t0805-c5514-ibrdr-lw-00-a.html
+/sdcard/android/layout_tests/css2.1/t1202-counter-09-b.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-82-d.html
+/sdcard/android/layout_tests/css2.1/t1604-c541-word-sp-00-b-a.html
+/sdcard/android/layout_tests/css2.1/t0805-c5515-brdr-w-01-b-g.html
+/sdcard/android/layout_tests/css2.1/t0804-c5507-ipadn-r-04-b-ag.html
+/sdcard/android/layout_tests/css2.1/t1001-abs-pos-cb-09-b.html
+/sdcard/android/layout_tests/css2.1/t140201-c534-bgreps-05-c-ag.html
+/sdcard/android/layout_tests/css2.1/t0402-syntax-02-f.html
+/sdcard/android/layout_tests/css2.1/t0803-c5503-mrgn-b-00-b-a.html
+/sdcard/android/layout_tests/css2.1/t0805-c5517-brdr-s-00-c.html
+/sdcard/android/layout_tests/css2.1/t0805-c5514-brdr-lw-01-b-g.html
+/sdcard/android/layout_tests/css2.1/t100801-c42-ibx-ht-00-d-a.html
+/sdcard/android/layout_tests/css2.1/t040103-ident-00-c.html
+/sdcard/android/layout_tests/css2.1/t0805-c5513-brdr-bw-03-b.html
+/sdcard/android/layout_tests/css2.1/t0804-c5506-padn-t-00-b-a.html
+/sdcard/android/layout_tests/css2.1/t0505-c16-descendant-01-e.html
+/sdcard/android/layout_tests/css2.1/t0805-c5519-brdr-r-02-e.html
+/sdcard/android/layout_tests/css2.1/t1202-counters-08-b.html
+/sdcard/android/layout_tests/css2.1/t051103-c21-hover-ln-00-e-i.html
+/sdcard/android/layout_tests/css2.1/t120403-content-none-00-c.html
+/sdcard/android/layout_tests/css2.1/t1202-counter-00-b.html
+/sdcard/android/layout_tests/css2.1/t040105-import-01-b.html
+/sdcard/android/layout_tests/css2.1/t040103-case-01-c.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-11-d.html
+/sdcard/android/layout_tests/css2.1/t09-c5526c-display-00-e.html
+/sdcard/android/layout_tests/css2.1/t0905-c5525-fltblck-00-d-ag.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-31-d.html
+/sdcard/android/layout_tests/css2.1/t0805-c5514-brdr-lw-03-b.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-51-d.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-71-d.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-09-d.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-91-d.html
+/sdcard/android/layout_tests/css2.1/t0905-c5525-fltwrap-00-b.html
+/sdcard/android/layout_tests/css2.1/t0905-c414-flt-fit-00-d.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-29-d.html
+/sdcard/android/layout_tests/css2.1/t0803-c5505-mrgn-01-e-a.html
+/sdcard/android/layout_tests/css2.1/t0803-c5502-mrgn-r-00-c-ag.html
+/sdcard/android/layout_tests/css2.1/t1004-c43-rpl-ibx-00-d-ag.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-49-d.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-69-d.html
+/sdcard/android/layout_tests/css2.1/t1204-multiple-00-c.html
+/sdcard/android/layout_tests/css2.1/t140201-c533-bgimage-01-b-g.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-89-d.html
+/sdcard/android/layout_tests/css2.1/t1508-c527-font-03-b.html
+/sdcard/android/layout_tests/css2.1/t0803-c5504-mrgn-l-02-c.html
+/sdcard/android/layout_tests/css2.1/t0805-c5518-brdr-t-00-a.html
+/sdcard/android/layout_tests/css2.1/t010403-shand-font-00-b.html
+/sdcard/android/layout_tests/css2.1/t0510-c25-pseudo-elmnt-00-c.html
+/sdcard/android/layout_tests/css2.1/t0803-c5505-imrgn-00-a-ag.html
+/sdcard/android/layout_tests/css2.1/t0803-c5502-imrgn-r-05-b-ag.html
+/sdcard/android/layout_tests/css2.1/t060402-c31-important-00-b.html
+/sdcard/android/layout_tests/css2.1/t0905-c414-flt-00-d.html
+/sdcard/android/layout_tests/css2.1/t0905-c414-flt-03-c.html
+/sdcard/android/layout_tests/css2.1/t040103-ident-07-c.html
+/sdcard/android/layout_tests/css2.1/t1204-order-00-c.html
+/sdcard/android/layout_tests/css2.1/t120401-scope-01-c.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-00-d.html
+/sdcard/android/layout_tests/css2.1/t0402-c71-fwd-parsing-01-f.html
+/sdcard/android/layout_tests/css2.1/t1604-c542-letter-sp-01-b-a.html
+/sdcard/android/layout_tests/css2.1/t0805-c5520-brdr-b-01-e.html
+/sdcard/android/layout_tests/css2.1/t140201-c536-bgpos-00-b-ag.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-20-d.html
+/sdcard/android/layout_tests/css2.1/t0509-c15-ids-01-e.html
+/sdcard/android/layout_tests/css2.1/t1204-reset-01-c-o.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-40-d.html
+/sdcard/android/layout_tests/css2.1/t090501-c414-flt-ln-03-d.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-60-d.html
+/sdcard/android/layout_tests/css2.1/t0905-c5525-fltwidth-02-c-g.html
+/sdcard/android/layout_tests/css2.1/t0905-c5525-fltclr-00-c-ag.html
+/sdcard/android/layout_tests/css2.1/t1202-counter-07-b.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-80-d.html
+/sdcard/android/layout_tests/css2.1/t1204-implied-01-c.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-18-d.html
+/sdcard/android/layout_tests/css2.1/t0804-c5507-ipadn-r-01-b-ag.html
+/sdcard/android/layout_tests/css2.1/t040103-escapes-03-b.html
+/sdcard/android/layout_tests/css2.1/t140201-c534-bgreps-02-c-ag.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-38-d.html
+/sdcard/android/layout_tests/css2.1/t1001-abs-pos-cb-07-b.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-58-d.html
+/sdcard/android/layout_tests/css2.1/t0803-c5505-mrgn-00-b-ag.html
+/sdcard/android/layout_tests/css2.1/t100801-c544-valgn-04-d-agi.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-78-d.html
+/sdcard/android/layout_tests/css2.1/t100801-c548-ln-ht-02-b-ag.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-98-d.html
+/sdcard/android/layout_tests/css2.1/t0804-c5508-ipadn-b-00-b-a.html
+/sdcard/android/layout_tests/css2.1/t0804-c5509-padn-l-01-b-a.html
+/sdcard/android/layout_tests/css2.1/t040105-atrule-03-b.html
+/sdcard/android/layout_tests/css2.1/t1507-c526-font-sz-02-b-a.html
+/sdcard/android/layout_tests/css2.1/t0805-c5522-ibrdr-00-a.html
+/sdcard/android/layout_tests/css2.1/t0803-c5502-mrgn-r-03-c.html
+/sdcard/android/layout_tests/css2.1/t1202-counters-06-b.html
+/sdcard/android/layout_tests/css2.1/t0905-c5525-fltmrgn-00-c-ag.html
+/sdcard/android/layout_tests/css2.1/t051103-dom-hover-02-c-io.html
+/sdcard/android/layout_tests/css2.1/t0804-c5506-ipadn-t-00-b-a.html
+/sdcard/android/layout_tests/css2.1/t040304-c64-uri-00-a-g.html
+/sdcard/android/layout_tests/css2.1/t0803-c5501-mrgn-t-00-b-a.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-07-d.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-27-d.html
+/sdcard/android/layout_tests/css2.1/t0805-c5511-brdr-tw-03-b.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-47-d.html
+/sdcard/android/layout_tests/css2.1/t060403-c21-pseu-id-00-e-i.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-67-d.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-87-d.html
+/sdcard/android/layout_tests/css2.1/t1508-c527-font-01-b.html
+/sdcard/android/layout_tests/css2.1/t0603-c11-import-00-b.html
+/sdcard/android/layout_tests/css2.1/t0803-c5504-imrgn-l-04-b-ag.html
+/sdcard/android/layout_tests/css2.1/t1503-c522-font-family-00-b.html
+/sdcard/android/layout_tests/css2.1/t090501-c414-flt-ln-01-d-g.html
+/sdcard/android/layout_tests/css2.1/t0511-c21-pseud-link-03-e.html
+/sdcard/android/layout_tests/css2.1/t1202-counters-15-b.html
+/sdcard/android/layout_tests/css2.1/t040105-atkeyw-02-b.html
+/sdcard/android/layout_tests/css2.1/t0805-c5519-ibrdr-r-00-a.html
+/sdcard/android/layout_tests/css2.1/t040103-ident-05-c.html
+/sdcard/android/layout_tests/css2.1/t0602-inherit-bdr-pad-b-00.html
+/sdcard/android/layout_tests/css2.1/t040302-c61-rel-len-00-b-ag.html
+/sdcard/android/layout_tests/css2.1/t0804-c5507-padn-r-00-c-ag.html
+/sdcard/android/layout_tests/css2.1/t0804-c5509-ipadn-l-00-b-ag.html
+/sdcard/android/layout_tests/css2.1/t0805-c5520-ibrdr-b-00-a.html
+/sdcard/android/layout_tests/css2.1/t1202-counter-05-b.html
+/sdcard/android/layout_tests/css2.1/t1008-c44-ln-box-03-d-ag.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-16-d.html
+/sdcard/android/layout_tests/css2.1/t040103-escapes-01-b.html
+/sdcard/android/layout_tests/css2.1/t100304-c43-rpl-bbx-01-d-g.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-36-d.html
+/sdcard/android/layout_tests/css2.1/t1001-abs-pos-cb-05-b.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-56-d.html
+/sdcard/android/layout_tests/css2.1/t0804-c5509-padn-l-02-f.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-76-d.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-96-d.html
+/sdcard/android/layout_tests/css2.1/t051202-c26-psudo-nest-00-c.html
+/sdcard/android/layout_tests/css2.1/t040105-atrule-01-b.html
+/sdcard/android/layout_tests/css2.1/t0804-c5508-ipadn-b-02-b-a.html
+/sdcard/android/layout_tests/css2.1/t0803-c5501-imrgn-t-00-b-ag.html
+/sdcard/android/layout_tests/css2.1/t140201-c532-bgcolor-01-b.html
+/sdcard/android/layout_tests/css2.1/t1508-c527-font-08-b.html
+/sdcard/android/layout_tests/css2.1/t1202-counters-04-b.html
+/sdcard/android/layout_tests/css2.1/t040103-case-00-b.html
+/sdcard/android/layout_tests/css2.1/t1504-c543-txt-decor-00-d-g.html
+/sdcard/android/layout_tests/css2.1/t0805-c5516-brdr-c-00-a.html
+/sdcard/android/layout_tests/css2.1/t0804-c5506-ipadn-t-02-b-a.html
+/sdcard/android/layout_tests/css2.1/t1204-increment-00-c-o.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-05-d.html
+/sdcard/android/layout_tests/css2.1/t1202-counter-14-b.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-25-d.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-45-d.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-65-d.html
+/sdcard/android/layout_tests/css2.1/t040103-escapes-02-d.html
+/sdcard/android/layout_tests/css2.1/t1602-c546-txt-align-00-b.html
+/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-85-d.html
+/sdcard/android/layout_tests/css2.1/t040103-escapes-05-c.html
+/sdcard/android/layout_tests/css2.1/t040103-escapes-08-b.html
+/sdcard/android/layout_tests/css2.1/t0803-c5504-imrgn-l-01-b-ag.html
+/sdcard/android/layout_tests/css2.1/t1002-c5523-width-00-b-g.html
+/sdcard/android/layout_tests/css2.1/t0804-c5507-padn-r-03-f.html
+/sdcard/android/layout_tests/css2.1/t0402-syntax-05-f.html
+/sdcard/android/layout_tests/css2.1/t1205-c561-list-displ-00-b.html
+/sdcard/android/layout_tests/css2.1/t0511-c21-pseud-link-01-e.html
+/sdcard/android/layout_tests/css2.1/t051201-c23-first-line-00-b.html
+/sdcard/android/layout_tests/css2.1/t1202-counters-13-b.html
+/sdcard/android/layout_tests/css2.1/t140201-c533-bgimage-00-a.html
+/sdcard/android/layout_tests/css2.1/t040105-atkeyw-00-b.html
+/sdcard/android/layout_tests/css1/color_and_background/background_color.html
+/sdcard/android/layout_tests/css1/color_and_background/color.html
+/sdcard/android/layout_tests/css1/color_and_background/background.html
+/sdcard/android/layout_tests/css1/color_and_background/background_repeat.html
+/sdcard/android/layout_tests/css1/color_and_background/background_image.html
+/sdcard/android/layout_tests/css1/color_and_background/background_position.html
+/sdcard/android/layout_tests/css1/color_and_background/background_attachment.html
+/sdcard/android/layout_tests/css1/pseudo/firstline.html
+/sdcard/android/layout_tests/css1/pseudo/pseudo_elements_in_selectors.html
+/sdcard/android/layout_tests/css1/pseudo/multiple_pseudo_elements.html
+/sdcard/android/layout_tests/css1/pseudo/firstletter.html
+/sdcard/android/layout_tests/css1/pseudo/anchor.html
+/sdcard/android/layout_tests/css1/text_properties/text_align.html
+/sdcard/android/layout_tests/css1/text_properties/line_height.html
+/sdcard/android/layout_tests/css1/text_properties/text_transform.html
+/sdcard/android/layout_tests/css1/text_properties/word_spacing.html
+/sdcard/android/layout_tests/css1/text_properties/letter_spacing.html
+/sdcard/android/layout_tests/css1/text_properties/vertical_align.html
+/sdcard/android/layout_tests/css1/text_properties/text_indent.html
+/sdcard/android/layout_tests/css1/text_properties/text_decoration.html
+/sdcard/android/layout_tests/css1/basic/containment.html
+/sdcard/android/layout_tests/css1/basic/id_as_selector.html
+/sdcard/android/layout_tests/css1/basic/comments.html
+/sdcard/android/layout_tests/css1/basic/class_as_selector.html
+/sdcard/android/layout_tests/css1/basic/contextual_selectors.html
+/sdcard/android/layout_tests/css1/basic/inheritance.html
+/sdcard/android/layout_tests/css1/basic/grouping.html
+/sdcard/android/layout_tests/css1/font_properties/font_weight.html
+/sdcard/android/layout_tests/css1/font_properties/font_size.html
+/sdcard/android/layout_tests/css1/font_properties/font.html
+/sdcard/android/layout_tests/css1/font_properties/font_style.html
+/sdcard/android/layout_tests/css1/font_properties/font_family.html
+/sdcard/android/layout_tests/css1/font_properties/font_variant.html
+/sdcard/android/layout_tests/css1/units/percentage_units.html
+/sdcard/android/layout_tests/css1/units/color_units.html
+/sdcard/android/layout_tests/css1/units/length_units.html
+/sdcard/android/layout_tests/css1/units/urls.html
+/sdcard/android/layout_tests/css1/cascade/important.html
+/sdcard/android/layout_tests/css1/cascade/cascade_order.html
+/sdcard/android/layout_tests/css1/box_properties/border_width.html
+/sdcard/android/layout_tests/css1/box_properties/margin.html
+/sdcard/android/layout_tests/css1/box_properties/width.html
+/sdcard/android/layout_tests/css1/box_properties/padding_left.html
+/sdcard/android/layout_tests/css1/box_properties/margin_left_inline.html
+/sdcard/android/layout_tests/css1/box_properties/clear.html
+/sdcard/android/layout_tests/css1/box_properties/border_left_width.html
+/sdcard/android/layout_tests/css1/box_properties/margin_left.html
+/sdcard/android/layout_tests/css1/box_properties/padding_top.html
+/sdcard/android/layout_tests/css1/box_properties/padding_bottom.html
+/sdcard/android/layout_tests/css1/box_properties/border_style_inline.html
+/sdcard/android/layout_tests/css1/box_properties/border_top_width_inline.html
+/sdcard/android/layout_tests/css1/box_properties/border_top_inline.html
+/sdcard/android/layout_tests/css1/box_properties/border_style.html
+/sdcard/android/layout_tests/css1/box_properties/border_top.html
+/sdcard/android/layout_tests/css1/box_properties/margin_bottom_inline.html
+/sdcard/android/layout_tests/css1/box_properties/border_bottom_width.html
+/sdcard/android/layout_tests/css1/box_properties/margin_bottom.html
+/sdcard/android/layout_tests/css1/box_properties/float_elements_in_series.html
+/sdcard/android/layout_tests/css1/box_properties/float_on_text_elements.html
+/sdcard/android/layout_tests/css1/box_properties/padding.html
+/sdcard/android/layout_tests/css1/box_properties/border_right_width_inline.html
+/sdcard/android/layout_tests/css1/box_properties/border_right_inline.html
+/sdcard/android/layout_tests/css1/box_properties/border_right_width.html
+/sdcard/android/layout_tests/css1/box_properties/margin_right.html
+/sdcard/android/layout_tests/css1/box_properties/border_width_inline.html
+/sdcard/android/layout_tests/css1/box_properties/border_inline.html
+/sdcard/android/layout_tests/css1/box_properties/clear_float.html
+/sdcard/android/layout_tests/css1/box_properties/border.html
+/sdcard/android/layout_tests/css1/box_properties/padding_left_inline.html
+/sdcard/android/layout_tests/css1/box_properties/border_left_width_inline.html
+/sdcard/android/layout_tests/css1/box_properties/border_left_inline.html
+/sdcard/android/layout_tests/css1/box_properties/padding_top_inline.html
+/sdcard/android/layout_tests/css1/box_properties/border_left.html
+/sdcard/android/layout_tests/css1/box_properties/padding_bottom_inline.html
+/sdcard/android/layout_tests/css1/box_properties/margin_top_inline.html
+/sdcard/android/layout_tests/css1/box_properties/border_top_width.html
+/sdcard/android/layout_tests/css1/box_properties/border_bottom_width_inline.html
+/sdcard/android/layout_tests/css1/box_properties/acid_test.html
+/sdcard/android/layout_tests/css1/box_properties/border_bottom_inline.html
+/sdcard/android/layout_tests/css1/box_properties/margin_top.html
+/sdcard/android/layout_tests/css1/box_properties/border_bottom.html
+/sdcard/android/layout_tests/css1/box_properties/padding_right_inline.html
+/sdcard/android/layout_tests/css1/box_properties/float_margin.html
+/sdcard/android/layout_tests/css1/box_properties/padding_right.html
+/sdcard/android/layout_tests/css1/box_properties/padding_inline.html
+/sdcard/android/layout_tests/css1/box_properties/float.html
+/sdcard/android/layout_tests/css1/box_properties/height.html
+/sdcard/android/layout_tests/css1/box_properties/margin_right_inline.html
+/sdcard/android/layout_tests/css1/box_properties/border_color_inline.html
+/sdcard/android/layout_tests/css1/box_properties/border_right.html
+/sdcard/android/layout_tests/css1/box_properties/border_color.html
+/sdcard/android/layout_tests/css1/box_properties/margin_inline.html
+/sdcard/android/layout_tests/css1/conformance/forward_compatible_parsing.html
+/sdcard/android/layout_tests/css1/formatting_model/floating_elements.html
+/sdcard/android/layout_tests/css1/formatting_model/horizontal_formatting.html
+/sdcard/android/layout_tests/css1/formatting_model/vertical_formatting.html
+/sdcard/android/layout_tests/css1/formatting_model/height_of_lines.html
+/sdcard/android/layout_tests/css1/formatting_model/inline_elements.html
+/sdcard/android/layout_tests/css1/formatting_model/canvas.html
+/sdcard/android/layout_tests/css1/formatting_model/replaced_elements.html
+/sdcard/android/layout_tests/css1/classification/list_style_type.html
+/sdcard/android/layout_tests/css1/classification/list_style_image.html
+/sdcard/android/layout_tests/css1/classification/list_style_position.html
+/sdcard/android/layout_tests/css1/classification/display.html
+/sdcard/android/layout_tests/css1/classification/list_style.html
+/sdcard/android/layout_tests/css1/classification/white_space.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/dom/insertTbodyRebuild1.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/dom/appendCellsRebuild1.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/dom/appendColGroup1.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/dom/appendCol1.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/dom/insertTbodyExpand1.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/dom/appendCells1.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug56024.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-14.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug11945.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-18.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug72393.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug23847.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug7121-2.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug27993-2.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug7243.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-3.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug1647.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-7.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug101759.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug2479-5.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug14007-1.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-11.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug1010.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-15.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug14159-2.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug25707.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug47163.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug91057.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug131020-3.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug19526.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug14489.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug73629.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug1725.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-4.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug106336.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-8.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug22122.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug10216.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug14007-2.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug106966.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug32205-4.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug42043.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug178855.xml
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-12.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug92868_1.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug21518.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug45621.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-16.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug65372.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug59252.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug29058-2.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug17826.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug67915-2.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug46268-4.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug1128.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug1164.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-1.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/97619.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-5.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug10140.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-9.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug32205-1.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug61042-1.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug104898.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug8499.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug9879-1.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug128876.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-13.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug58402-2.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug24880-1.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug85016.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-17.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug80762-2.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug18770.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug33784.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3105.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug1055-2.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug89315.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug92647-1.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug1262.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug7113.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-2.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3517.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug220653.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug4294.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-6.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug6933.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug51000.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug11331.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug61042-2.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-10.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/other/empty_cells.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/other/test4.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/core/col_span2.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/core/columns.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/core/captions1.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/core/cols1.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/core/backgrounds.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/core/captions2.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/core/captions3.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/core/conflicts.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/core/standards1.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/collapsing_borders/bug41262-5.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/collapsing_borders/bug41262-6.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/collapsing_borders/bug41262-1.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/x_table_frame_below.xml
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/backgr_position-table-cell.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_caption.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_dirty_reflow_row.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_hidden_tr.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/backgr_position-table-column.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/tables_caption_align_right.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/backgr_border-table-column-group.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/backgr_position-table-row-group.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_caption_hidden.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_row_sibling.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_frame_lhs.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_tbody.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_rules_rows.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/x_table_rules_all.xml
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_frame_above.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_table.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_frame_void.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/x_table_frame_hsides.xml
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_td_valign_top.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_caption_right.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_hidden_tbody.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/backgr_layers-show.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/x_caption_align_right.xml
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/backgr_border-table-cell.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_frame_below.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_table_caption.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_hidden_table.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/x_table_rules_cols.xml
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_cell.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/backgr_position-table-row.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_td_align_right.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/backgr_border-table-row.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_tbody_sibling.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_rules_cols.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/x_table_frame_border.xml
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/x_colgroup_width_px.xml
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_td_valign_bottom.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/backgr_border-table-quirks.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/x_table_frame_box.xml
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/x_table_rules_rows.xml
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_frame_hsides.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_caption_left.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/x_caption_align_left.xml
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_caption_hidden_table.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/backgr_border-table-row-group.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_caption_bottom.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/backgr_border-table.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_frame_rhs.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_frame_vsides.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_cell_sibling.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/backgr_layers-hide.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_td_valign_middle.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/tables_cellspacing_pct.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/backgr_position-table-column-group.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/x_table_frame_lhs.xml
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/backgr_fixed-bg.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_td_dynamic_deactivate.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_row.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/x_table_frame_rhs.xml
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/x_table_frame_above.xml
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/x_table_frame_vsides.xml
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_dirty_reflow.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_dirty_reflow_tbody.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/backgr_border-table-column.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_caption_top.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_dirty_reflow_table.html
+/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/tables_caption_align_left.html
+/sdcard/android/layout_tests/tables/mozilla/dom/deleteCellsRebuild1.html
+/sdcard/android/layout_tests/tables/mozilla/dom/deleteRowsShrink1.html
+/sdcard/android/layout_tests/tables/mozilla/dom/insertCellsRebuild1.html
+/sdcard/android/layout_tests/tables/mozilla/dom/insertCellsRebuild2.html
+/sdcard/android/layout_tests/tables/mozilla/dom/deleteCol1.html
+/sdcard/android/layout_tests/tables/mozilla/dom/deleteCol2.html
+/sdcard/android/layout_tests/tables/mozilla/dom/insertColGroups1.html
+/sdcard/android/layout_tests/tables/mozilla/dom/deleteCol3.html
+/sdcard/android/layout_tests/tables/mozilla/dom/insertColGroups2.html
+/sdcard/android/layout_tests/tables/mozilla/dom/deleteCellsShrink1.html
+/sdcard/android/layout_tests/tables/mozilla/dom/deleteTbodyExpand1.html
+/sdcard/android/layout_tests/tables/mozilla/dom/deleteCellsShrink2.html
+/sdcard/android/layout_tests/tables/mozilla/dom/tableDom.html
+/sdcard/android/layout_tests/tables/mozilla/dom/appendCol2.html
+/sdcard/android/layout_tests/tables/mozilla/dom/appendTbodyExpand1.html
+/sdcard/android/layout_tests/tables/mozilla/dom/deleteTbodyRebuild1.html
+/sdcard/android/layout_tests/tables/mozilla/dom/deleteColGroup1.html
+/sdcard/android/layout_tests/tables/mozilla/dom/deleteColGroup2.html
+/sdcard/android/layout_tests/tables/mozilla/dom/insertRowsExpand1.html
+/sdcard/android/layout_tests/tables/mozilla/dom/appendRowsExpand1.html
+/sdcard/android/layout_tests/tables/mozilla/dom/deleteRowsRebuild1.html
+/sdcard/android/layout_tests/tables/mozilla/dom/insertCols1.html
+/sdcard/android/layout_tests/tables/mozilla/dom/insertCols2.html
+/sdcard/android/layout_tests/tables/mozilla/dom/insertRowsRebuild1.html
+/sdcard/android/layout_tests/tables/mozilla/dom/insertCellsExpand1.html
+/sdcard/android/layout_tests/tables/mozilla/dom/insertCols3.html
+/sdcard/android/layout_tests/tables/mozilla/dom/insertCellsExpand2.html
+/sdcard/android/layout_tests/tables/mozilla/dom/insertCols4.html
+/sdcard/android/layout_tests/tables/mozilla/dom/insertCols5.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug30418.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug14159-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug46623-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug24661.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug30692.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug53690-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug88035-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug51727.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug81934.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug68912.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug60992.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug92647-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug120107.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug1271.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug28928.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug103533.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug4093.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug2267.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug92868.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug4429.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug5538.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug106816.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug10009.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug149275-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug32205-3.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug13118.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug1802s.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug10296-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug647.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug48028-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug72359.xml
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug25367.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug1430.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug1224.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug67915-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug45486.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug113424.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug108340.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug3454.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug2479-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug139524-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug4849-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug11321.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug2886.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug219693-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug42443.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug54450.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug269566.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug12709.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug80762-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug21918.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug1302.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug25663.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug55527.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug7112-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug1055-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug69382-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug17587.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug102145-3.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug2516.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug4803.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug19599.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug1188.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug3718.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug110566.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug106158-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug5188.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug215629.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug154780.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug137388-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug10039.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug5798.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug22246-3a.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug25074.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug27038-3.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/45621.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug25086.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug43854-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug34538.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug131020.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug7121-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug4501.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug53891.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug8032-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug46268-5.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug63785.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug113235-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug69187.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug9024.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug120364.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug109043.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug220536.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug1818-5.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug2973.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug222467.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug6674.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug99948.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug277062.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug127267.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug30332-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug10036.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug16012.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug2997.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug17130-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug650.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug14323.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug10565.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug52505.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug29314.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug13169.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug30559.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug29326.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug55545.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug46268-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug18359.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug3037-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug82946-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug55694.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug6304.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug3263.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug1818-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug101674.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug123862.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug221784-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug275625.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug106795.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug22513.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug57300.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug51037.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug119786.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug12908-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug15247.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug46623-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug34176.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug53690-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug24880.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug41890.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug88035-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug50695-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug1163-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug8411.xml
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug1802.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug3260.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug97138.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug9123-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug3309-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug3191.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug1296.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug222336.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug2773.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug8381.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug194024.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug2947.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug5838.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug60013.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug138725.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug11026.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug175455-4.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug58402-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug43039.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug48028-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug24627.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug35662.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug21299.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug26178.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug18664.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug23299.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug88524.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug48827.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug1318.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug4427.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug6184.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug11384s.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug5835.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug4576.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug2479-3.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug139524-3.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug133948.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug9879-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug11944.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug13196.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug20579.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug29058-3.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug96334.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug7112-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug60749.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug59354.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug69382-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug27993-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug57378.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug102145-4.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug98196.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug9072.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug2585.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug145572.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug137388-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug5799.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug157890.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug196870.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug22246-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug73321.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug18440.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug965.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug131020-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug43854-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug96343.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug46368-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug102145-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug8032-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug1067-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug2065.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug97383.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug113235-3.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug3681-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug9271-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug1809.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug2962.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug1818-6.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug2469.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug8950.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug133756-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug2886-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug159108.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug4849.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug25004.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug12910.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug43204.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug20804.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug23072.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug19061-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug10269-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug13526.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug52506.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug27038-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug46480-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug42187.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug2050.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug3103.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug39209.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug46268.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug46268-3.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug38916.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug82946-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug3037-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug4523.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug67864.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug8361.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug1818-3.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug2981-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug2684.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug4385.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug126742.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug12910-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug8858.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug709.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug16252.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug33137.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug45350.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug12908-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug92143.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug14159-3.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug50695-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug29429.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug1261.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug4520.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug46944.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/adforce_imgis_com.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug18955.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug227123.xml
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug3309-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug9123-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug7342.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug83786.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug4382.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug24200.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug641-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug625.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug32205-5.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug56201.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug32841.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug44505.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug45055-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug15544.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug40828.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug1800.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug6404.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug2509.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug2479-4.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug4739.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug139524-4.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug13105.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug149275-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug32205-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug12008.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug10296-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug727.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug278385.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug13484.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug15933.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug60807.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug93363.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug14929.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug86708.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug57828.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug11384q.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug2954.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug2479-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug139524-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug219693-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug137388-3.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug30273.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug22246-3.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug22246-2a.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug12384.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug44523.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug60804.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug86220.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug32447.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug17138.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug56405.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug26553.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug1220.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug29058-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug33855.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug29157.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug2123.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug19356.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug28933.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug46368-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug18558.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug102145-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug1067-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug1474.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug3681-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug4284.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug4527.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug9271-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug2296.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug106158-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug2757.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug128229.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug133756-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug5797.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug278266.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug23235.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug19061-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug10269-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug963.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug27038-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug12268.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug45055.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug7471.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug75250.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug46480-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug30985.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug46924.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug56563.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug23994.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug113235-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug99923.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug55789.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug2981-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug1818-4.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug7714.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug222846.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug68998.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug30332-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug17130-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug51140.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug23151.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug10633.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug24503.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug28341.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug47432.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug101201.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug17168.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug46268-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug78162.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug17548.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug100334.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug57828-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug1818-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug2763.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug1828.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug221784-1.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug3977.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug131020_iframe.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug641-2.html
+/sdcard/android/layout_tests/tables/mozilla/bugs/bug22019.html
+/sdcard/android/layout_tests/tables/mozilla/other/move_row.html
+/sdcard/android/layout_tests/tables/mozilla/other/nestedTables.html
+/sdcard/android/layout_tests/tables/mozilla/other/wa_table_tr_align.html
+/sdcard/android/layout_tests/tables/mozilla/other/ms.html
+/sdcard/android/layout_tests/tables/mozilla/other/cell_widths.html
+/sdcard/android/layout_tests/tables/mozilla/other/test3.html
+/sdcard/android/layout_tests/tables/mozilla/other/cellspacing.html
+/sdcard/android/layout_tests/tables/mozilla/other/nested2.html
+/sdcard/android/layout_tests/tables/mozilla/other/test6.html
+/sdcard/android/layout_tests/tables/mozilla/other/padding.html
+/sdcard/android/layout_tests/tables/mozilla/other/body_col.html
+/sdcard/android/layout_tests/tables/mozilla/other/wa_table_thtd_rowspan.html
+/sdcard/android/layout_tests/tables/mozilla/other/slashlogo.html
+/sdcard/android/layout_tests/tables/mozilla/images/adforce_imgis_com.html
+/sdcard/android/layout_tests/tables/mozilla/core/col_widths_auto_auto.html
+/sdcard/android/layout_tests/tables/mozilla/core/captions.html
+/sdcard/android/layout_tests/tables/mozilla/core/col_widths_fix_fixPer.html
+/sdcard/android/layout_tests/tables/mozilla/core/col_widths_auto_autoFix.html
+/sdcard/android/layout_tests/tables/mozilla/core/col_widths_auto_autoPer.html
+/sdcard/android/layout_tests/tables/mozilla/core/row_span.html
+/sdcard/android/layout_tests/tables/mozilla/core/cell_heights.html
+/sdcard/android/layout_tests/tables/mozilla/core/misc.html
+/sdcard/android/layout_tests/tables/mozilla/core/col_widths_auto_autoFixPer.html
+/sdcard/android/layout_tests/tables/mozilla/core/col_widths_auto_fix.html
+/sdcard/android/layout_tests/tables/mozilla/core/col_widths_auto_per.html
+/sdcard/android/layout_tests/tables/mozilla/core/col_widths_fix_auto.html
+/sdcard/android/layout_tests/tables/mozilla/core/col_span.html
+/sdcard/android/layout_tests/tables/mozilla/core/margins.html
+/sdcard/android/layout_tests/tables/mozilla/core/borders.html
+/sdcard/android/layout_tests/tables/mozilla/core/table_frame.html
+/sdcard/android/layout_tests/tables/mozilla/core/table_rules.html
+/sdcard/android/layout_tests/tables/mozilla/core/table_heights.html
+/sdcard/android/layout_tests/tables/mozilla/core/nested1.html
+/sdcard/android/layout_tests/tables/mozilla/core/col_widths_fix_autoFix.html
+/sdcard/android/layout_tests/tables/mozilla/core/col_widths_auto_fixPer.html
+/sdcard/android/layout_tests/tables/mozilla/core/col_widths_fix_autoPer.html
+/sdcard/android/layout_tests/tables/mozilla/core/bloomberg.html
+/sdcard/android/layout_tests/tables/mozilla/core/one_row.html
+/sdcard/android/layout_tests/tables/mozilla/core/table_widths.html
+/sdcard/android/layout_tests/tables/mozilla/core/col_widths_fix_autoFixPer.html
+/sdcard/android/layout_tests/tables/mozilla/core/box_sizing.html
+/sdcard/android/layout_tests/tables/mozilla/core/col_widths_fix_fix.html
+/sdcard/android/layout_tests/tables/mozilla/core/col_widths_fix_per.html
+/sdcard/android/layout_tests/tables/mozilla/collapsing_borders/bug41262-3.html
+/sdcard/android/layout_tests/tables/mozilla/collapsing_borders/bug41262-4.html
+/sdcard/android/layout_tests/tables/mozilla/collapsing_borders/bug127040.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_green.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tfoot_valign_top.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_olive.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_teal_rgb.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tr_align_center.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_colgroup_width_pct.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_class.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_olive_rgb.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_border_0.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/backgr_simple-table-row-group.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_maroon_rgb.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tfoot_align_center.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/colgroup_valign_baseline.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/colgroup_align_right.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_col_width_rel.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_lime.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/td_valign_baseline.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_navy.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tr_align_char.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_valign_top.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/backgr_simple-table-column.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tbody_valign_baseline.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_nowrap.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_id.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_style.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_bgcolor_rgb.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_green_rgb.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_caption_id.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/thead_align_char.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_thead_class.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_colgroup_span.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_bgcolor_rgb.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/th_valign_bottom.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_silver_rgb.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/table_rules_groups.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_col_valign_baseline.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_gray.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_align_center.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tbody_valign_bottom.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tr_bgcolor_rgb.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_cellspacing.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_width_px.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_navy_rgb.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_col_align_left.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/td_valign_middle.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tr_valign_middle.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_yellow.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tr_style.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_td_width.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_green.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/backgr_simple-table-cell.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tbody_align_left.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_silver.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/thead_valign_top.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_col_align_center.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_border_px.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_valign_bottom.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_thead_id.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_th_colspan.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_cellspacing_pct.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_td_nowrap.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tfoot_char.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_blue.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_navy.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_style.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tbody_align_center.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_lime_rgb.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/thead_align_right.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_aqua_rgb.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_colgroup_valign_bottom.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tfoot_align_left.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_rowspan.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_bgcolor_name.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_id.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_col_align_char.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_rowspan.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_navy_rgb.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tfoot_valign_middle.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_table.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_thead_valign_baseline.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_red.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_gray.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_align_right.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tfoot_align_justify.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_fuchsia.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_colgroup_align_right.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tfoot_align_right.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_white_rgb.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_col_align_justify.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_thead_valign_top.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tbody_align_justify.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tr_class.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_colgroup_align_left.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_maroon_rgb.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_rules_none.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/thead_valign_middle.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_caption_align_bot.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_cellpadding_pct.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_yellow_rgb.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_col_align_right.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_colspan.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_valign_top.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/thead_align_justify.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/th_valign_baseline.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_colspan.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/colgroup_align_left.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_colgroup_valign_baseline.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_nowrap.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_lime_rgb.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_aqua_rgb.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_td_align_left.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tfoot_align_char.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_align_justify.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_border_none.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_border_1.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/table_row_align_center.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tbody_align_right.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_th_align_left.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/td_valign_bottom.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_maroon.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/table_frame_border.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_class.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/thead_align_center.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_caption_style.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tfoot_valign_bottom.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_blue.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_col_width_px.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_align_center.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_valign_middle.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_silver_rgb.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_style.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_td_align_center.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_colgroup_width_rel.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/backgr_index.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_row_th_nowrap.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_black_rgb.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tr_id.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_colgroup_align_char.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tbody_align_left.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_colgroup_valign_middle.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_width.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_thead_align_justify.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tfoot_align_right.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_cellpadding_pct.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_gray_rgb.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_olive_rgb.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tr_valign_baseline.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_thead_align_right.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tfoot_valign_bottom.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_align_right.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_id.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_valign_baseline.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tbody_align_char.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tr_valign_top.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/body_col.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/backgr_simple-table-row.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_fuchsia.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_cellpadding.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/colgroup_align_center.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_caption_class.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_frame_void.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_td_align_right.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/thead_valign_bottom.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_td_rowspan.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tbody_align_char.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tbody_char.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_class.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_purple.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_rules_groups.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/backgr_simple-table.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tfoot_valign_middle.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_gray_rgb.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tfoot_style.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_align_left.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_class.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/colgroup_width_pct.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tbody_valign_top.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/body_tfoot.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/colgroup_span.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_width_pct.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tfoot_valign_baseline.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_yellow_rgb.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_align_left.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_height.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_white.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tr_align_justify.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_align_right.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_align_right.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tbody_valign_baseline.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/table_frame_box.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_yellow.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tr_align_right.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tfoot_align_left.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_width_px.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/thead_char.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_col_valign_top.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_col_valign_bottom.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/table_row_align_right.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_border_2.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_aqua.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_fuchsia_rgb.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tbody_valign_bottom.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/td_valign_top.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tfoot_id.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tfoot_valign_baseline.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/th_valign_top.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/col_span.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_align_left.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/table_row_align_left.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_purple_rgb.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tfoot_class.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_align_char.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_red_rgb.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_col_width_pct.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_green_rgb.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_valign_top.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_border.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_white_rgb.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/colgroup_valign_top.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_fuchsia_rgb.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_default.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_caption_align_bottom.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_silver.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_valign_bottom.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_align_center.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_red.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_black.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/table_overflow_td_dynamic_deactivate.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tfoot_valign_top.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_cellpadding.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/colgroup_valign_middle.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_th_align_right.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_th_rowspan.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_cellspacing.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/table_rules_none.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_white.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/colgroup_align_justify.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/table_rules_all.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_thead_valign_bottom.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_thead_align_left.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_blue_rgb.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_colgroup_valign_top.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_valign_middle.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_black_rgb.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/thead_align_left.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tbody_align_right.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_caption_align_top.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_col_valign_middle.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_align_left.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tbody_id.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_col_span.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_bgcolor_name.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_align_justify.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tbody_valign_middle.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_height.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_thead_align_center.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tbody_style.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_teal.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_td_height.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_olive.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_th_height.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/body_thead.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_colgroup_align_justify.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_maroon.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/backgr_simple-table-column-group.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/table_overflow_hidden_td.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_valign_middle.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_black.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/backgr_layers-opacity.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_style.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_th_align_center.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_thead_align_char.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tr_bgcolor_name.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_red_rgb.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_blue_rgb.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tbody_valign_top.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_lime.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/th_valign_middle.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_width_percent.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_width.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_teal_rgb.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_valign_baseline.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tbody_valign_middle.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/colgroup_width_px.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_valign_baseline.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_align_char.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/backgr_position-table.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tfoot_align_char.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_th_width.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tfoot_align_center.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tbody_align_justify.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_bgcolor_rgb.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_purple_rgb.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tbody_align_center.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/colgroup_valign_bottom.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_td_colspan.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_caption_align_top.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_align_center.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_thead_valign_middle.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_colgroup_align_center.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/thead_valign_baseline.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_thead_style.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tbody_class.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_border_3.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tr_align_left.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tr_valign_bottom.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/body_tbody.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_bgcolor_name.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_teal.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_tfoot_align_justify.xml
+/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_purple.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/tr_valign_bottom.html
+/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_id.xml
+/sdcard/android/layout_tests/css3/css3-modsel-33.html
+/sdcard/android/layout_tests/css3/css3-modsel-35.html
+/sdcard/android/layout_tests/css3/css3-modsel-36.html
+/sdcard/android/layout_tests/css3/css3-modsel-37.html
+/sdcard/android/layout_tests/transitions/transition-drt-api.html
diff --git a/tests/DumpRenderTree/assets/results/layout_tests_passed.txt b/tests/DumpRenderTree/assets/results/layout_tests_passed.txt
index fbceabd..37a4bbe 100644
--- a/tests/DumpRenderTree/assets/results/layout_tests_passed.txt
+++ b/tests/DumpRenderTree/assets/results/layout_tests_passed.txt
@@ -1,3 +1,1051 @@
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrlastchild.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_elementnormalize.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_noderemovechildnode.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_elementgetattributenodenull.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_namednodemapreturnfirstitem.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrparentnodenull.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_namednodemapreturnattrnode.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_elementsetattributenodenull.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_elementnormalize2.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_noderemovechild.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeinsertbeforeinvalidnodetype.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodechildnodesappendchild.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrfirstchild.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodevalue05.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatagetlength.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodedocumentnodename.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdataindexsizeerrinsertdataoffsetnegative.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_elementinvalidcharacterexception.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_textsplittexttwo.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrsetvalue1.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeclonegetparentnull.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_documentcreatetextnode.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_documentinvalidcharacterexceptioncreateelement.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodelistreturnlastitem.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrchildnodes1.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdataindexsizeerrdeletedataoffsetnegative.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodetextnodevalue.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_elementretrieveallattributes.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_documentinvalidcharacterexceptioncreateelement1.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_domimplementationfeaturenoversion.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrprevioussiblingnull.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_elementgetelementsbytagnamespecialvalue.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeappendchildnodeancestor.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrappendchild1.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_elementgetelementsbytagnamenomatch.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeappendchildgetnodename.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatadeletedataend.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatareplacedataexceedslengthofarg.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_notationssetnameditem1.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodereplacechildinvalidnodetype.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeinsertbeforenodename.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrinsertbefore7.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodereplacechild.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodegetprevioussiblingnull.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodehaschildnodesfalse.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_namednodemapreturnlastitem.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodegetfirstchildnull.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_notationsremovenameditem1.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeinsertbeforedocfragment.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdataappenddata.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeattributenodevalue.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrspecifiedvalue.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrgetvalue1.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodereplacechildnewchilddiffdocument.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_domimplementationfeaturenull.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdataindexsizeerrreplacedataoffsetnegative.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrinsertbefore1.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeinsertbeforenewchildexists.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodevalue06.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodelistindexnotzero.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_textwithnomarkup.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_entitiessetnameditem1.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrsetvalue2.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_documentgetelementsbytagnametotallength.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_documentinvalidcharacterexceptioncreateattribute1.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodelistindexgetlengthofemptylist.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_elementchangeattributevalue.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeattributenodetype.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodegetnextsiblingnull.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_namednodemapinuseattributeerr.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrchildnodes2.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrcreatetextnode2.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodechildnodesempty.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdataappenddatagetdata.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatareplacedataend.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodegetlastchildnull.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrcreatetextnode.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeclonefalsenocopytext.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeappendchild.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrappendchild2.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdataindexsizeerrreplacedataoffsetgreater.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodetextnodename.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeparentnode.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_namednodemapnotfounderr.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_elementretrieveattrvalue.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodereplacechildoldchildnonexistent.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeinsertbefore.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodehaschildnodes.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodecommentnodename.html
+/sdcard/android/layout_tests/dom/html/level1/core/documentinvalidcharacterexceptioncreateentref1.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrgetvalue2.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_elementretrievetagname.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrspecifiedvaluechanged.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeinsertbeforenewchilddiffdocument.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrinsertbefore2.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdataindexsizeerrreplacedatacountnegative.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatadeletedatabegining.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_documentcreateelement.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdataindexsizeerrinsertdataoffsetgreater.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_textparseintolistofelements.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodevalue07.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodegetownerdocumentnull.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatareplacedatamiddle.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeappendchildinvalidnodetype.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_elementremoveattributenode.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdataindexsizeerrsubstringoffsetgreater.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatadeletedatamiddle.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatasubstringexceedsvalue.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_documentgetrootnode.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatainsertdataend.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodedocumentnodetype.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeclonenodetrue.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_namednodemapchildnoderange.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_namednodemapnumberofnodes.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodevalue01.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_documentgetimplementation.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeappendchildchildexists.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrappendchild3.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_documentgetelementsbytagnamelength.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeelementnodeattributes.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdataindexsizeerrsubstringnegativeoffset.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_noderemovechildgetnodename.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdataindexsizeerrsubstringcountnegative.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_elementnotfounderr.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodedocumentfragmentnodename.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdataindexsizeerrdeletedataoffsetgreater.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatasubstringvalue.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodegetownerdocument.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_elementassociatedattribute.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_elementinvalidcharacterexception1.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_textindexsizeerroffsetoutofbounds.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatadeletedatagetlengthanddata.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodereplacechildnodeancestor.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodevalue08.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_textsplittextthree.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_documentcreateelementcasesensitive.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrinsertbefore3.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodedocumentnodeattribute.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdataindexsizeerrdeletedatacountnegative.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeelementnodevalue.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodereplacechildnewchildexists.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_domimplementationfeaturexml.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_elementreplaceexistingattributegevalue.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeelementnodename.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_elementcreatenewattribute.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodecommentnodevalue.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrnextsiblingnull.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrremovechild1.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_namednodemapwrongdocumenterr.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_namednodemapreturnnull.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodevalue02.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrappendchild4.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_elementinuseattributeerr.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodegetlastchild.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_elementgetattributenode.html
+/sdcard/android/layout_tests/dom/html/level1/core/documentgetdoctypenodtd.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_namednodemapsetnameditemreturnvalue.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatareplacedataexceedslengthofdata.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodetextnodetype.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeattributenodeattribute.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_documentgetdoctype.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_namednodemapsetnameditemthatexists.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_documentcreatedocumentfragment.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_commentgetcomment.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attreffectivevalue.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_textsplittextfour.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeinsertbeforenodeancestor.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrinsertbefore4.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_textindexsizeerrnegativeoffset.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodecommentnodetype.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodetextnodeattribute.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodedocumentnodevalue.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatadeletedataexceedslength.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_textsplittextone.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodedocumentfragmentnodevalue.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatagetdata.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatainsertdatabeginning.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodegetnextsibling.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodelistreturnfirstitem.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrremovechild2.html
+/sdcard/android/layout_tests/dom/html/level1/core/documentinvalidcharacterexceptioncreatepi.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodevalue03.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrappendchild5.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrhaschildnodes.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrreplacechild1.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrnormalize.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodedocumentfragmentnodetype.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_elementreplaceexistingattribute.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeappendchildnewchilddiffdocument.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodelisttraverselist.html
+/sdcard/android/layout_tests/dom/html/level1/core/documentinvalidcharacterexceptioncreateentref.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatasetnodevalue.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_entitiesremovenameditem1.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrinsertbefore5.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_elementgetelementsbytagname.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrcreatedocumentfragment.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrclonenode1.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_namednodemapremovenameditem.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_elementaddnewattribute.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodelistindexequalzero.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodechildnodes.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_elementgetelementempty.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatainsertdatamiddle.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_documentcreatecomment.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodegetprevioussibling.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeinsertbeforerefchildnonexistent.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_elementremoveattributeaftercreate.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_noderemovechildoldchildnonexistent.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_elementwrongdocumenterr.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatareplacedatabegining.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeattributenodename.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodecommentnodeattributes.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodevalue04.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_documentinvalidcharacterexceptioncreateattribute.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_elementremoveattribute.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrappendchild6.html
+/sdcard/android/layout_tests/dom/html/level1/core/documentinvalidcharacterexceptioncreatepi1.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeelementnodetype.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrname.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_namednodemapgetnameditem.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_elementgettagname.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_namednodemapsetnameditem.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeinsertbeforerefchildnull.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrreplacechild2.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeparentnodenull.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodecloneattributescopied.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeclonenodefalse.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodereplacechildnodename.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_elementgetelementsbytagnameaccessnodelist.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeclonetruecopytext.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_attrinsertbefore6.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodelistindexgetlength.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_elementreplaceattributewithself.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_documentcreateattribute.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeappendchilddocfragment.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_namednodemapsetnameditemwithnewvalue.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_documentgetelementsbytagnamevalue.html
+/sdcard/android/layout_tests/dom/html/level1/core/hc_nodegetfirstchild.html
+/sdcard/android/layout_tests/dom/html/level2/events/EventTargetCast01.html
+/sdcard/android/layout_tests/dom/html/level2/events/dispatchEvent12.html
+/sdcard/android/layout_tests/dom/html/level2/events/dispatchEvent04.html
+/sdcard/android/layout_tests/dom/html/level2/events/createEvent02.html
+/sdcard/android/layout_tests/dom/html/level2/events/dispatchEvent08.html
+/sdcard/android/layout_tests/dom/html/level2/events/initEvent04.html
+/sdcard/android/layout_tests/dom/html/level2/events/DocumentEventCast01.html
+/sdcard/android/layout_tests/dom/html/level2/events/dispatchEvent01.html
+/sdcard/android/layout_tests/dom/html/level2/events/dispatchEvent13.html
+/sdcard/android/layout_tests/dom/html/level2/events/dispatchEvent05.html
+/sdcard/android/layout_tests/dom/html/level2/events/initEvent01.html
+/sdcard/android/layout_tests/dom/html/level2/events/createEvent03.html
+/sdcard/android/layout_tests/dom/html/level2/events/initEvent05.html
+/sdcard/android/layout_tests/dom/html/level2/events/dispatchEvent09.html
+/sdcard/android/layout_tests/dom/html/level2/events/dispatchEvent10.html
+/sdcard/android/layout_tests/dom/html/level2/events/dispatchEvent02.html
+/sdcard/android/layout_tests/dom/html/level2/events/initEvent02.html
+/sdcard/android/layout_tests/dom/html/level2/events/dispatchEvent06.html
+/sdcard/android/layout_tests/dom/html/level2/events/createEvent04.html
+/sdcard/android/layout_tests/dom/html/level2/events/initEvent06.html
+/sdcard/android/layout_tests/dom/html/level2/events/dispatchEvent11.html
+/sdcard/android/layout_tests/dom/html/level2/events/dispatchEvent03.html
+/sdcard/android/layout_tests/dom/html/level2/events/createEvent01.html
+/sdcard/android/layout_tests/dom/html/level2/events/dispatchEvent07.html
+/sdcard/android/layout_tests/dom/html/level2/events/initEvent03.html
+/sdcard/android/layout_tests/dom/html/level2/events/createEvent05.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement06.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableColElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement87.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement08.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement04.html
+/sdcard/android/layout_tests/dom/html/level2/html/hasFeature04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement26.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement141.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLButtonElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement37.html
+/sdcard/android/layout_tests/dom/html/level2/html/table12.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLIsIndexElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLFrameSetElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLModElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement27.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement90.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement11.html
+/sdcard/android/layout_tests/dom/html/level2/html/table45.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement14.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTextAreaElement04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement08.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptionsCollection01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement09.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLFrameElement08.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement124.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement40.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLParamElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLFormElement06.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLAreaElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement08.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement30.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptGroupElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement73.html
+/sdcard/android/layout_tests/dom/html/level2/html/table28.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLIFrameElement08.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLAnchorElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/anchor02.html
+/sdcard/android/layout_tests/dom/html/level2/html/object09.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement11.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement12.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement27.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement107.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptionElement07.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement23.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLMetaElement04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLBodyElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement11.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument25.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement13.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement56.html
+/sdcard/android/layout_tests/dom/html/level2/html/table31.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLIFrameElement11.html
+/sdcard/android/layout_tests/dom/html/level2/html/object12.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement08.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement30.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableColElement05.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement89.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement110.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLLabelElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement06.html
+/sdcard/android/layout_tests/dom/html/level2/html/hasFeature06.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement28.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement143.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLBaseElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument08.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLButtonElement04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement39.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLIsIndexElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement11.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLModElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLCollection01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLImageElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement29.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement92.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement13.html
+/sdcard/android/layout_tests/dom/html/level2/html/table47.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement16.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTextAreaElement06.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLAppletElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptionsCollection03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument11.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement126.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement42.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLParamElement04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLFormElement08.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLAreaElement05.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement75.html
+/sdcard/android/layout_tests/dom/html/level2/html/table50.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLAnchorElement04.html
+/sdcard/android/layout_tests/dom/html/level2/html/anchor04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement13.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement14.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement29.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLScriptElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement109.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptionElement09.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement25.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLBodyElement05.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement13.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument27.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement15.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement58.html
+/sdcard/android/layout_tests/dom/html/level2/html/table33.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLHeadingElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/area01.html
+/sdcard/android/layout_tests/dom/html/level2/html/object14.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableColElement07.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement32.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement112.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLLabelElement04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLDivElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement08.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLUListElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement145.html
+/sdcard/android/layout_tests/dom/html/level2/html/button01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLButtonElement06.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement61.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLLegendElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCaptionElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement13.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLCollection03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLImageElement04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableColElement10.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement94.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement15.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLFieldSetElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/table49.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLLIElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement18.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement11.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTextAreaElement08.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLAppletElement04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptionsCollection05.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument13.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement128.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLMapElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement44.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLAreaElement07.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement77.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLLinkElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/table52.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement21.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTextAreaElement11.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLAnchorElement06.html
+/sdcard/android/layout_tests/dom/html/level2/html/anchor06.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement15.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement16.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement131.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLParagraphElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLScriptElement04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement27.html
+/sdcard/android/layout_tests/dom/html/level2/html/table02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLBodyElement07.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement15.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement17.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement80.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/table35.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLHeadingElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement04.html
+/sdcard/android/layout_tests/dom/html/level2/html/area03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableColElement09.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement34.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement114.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement30.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLBodyElement10.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLStyleElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement20.html
+/sdcard/android/layout_tests/dom/html/level2/html/button03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLButtonElement08.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement63.html
+/sdcard/android/layout_tests/dom/html/level2/html/table18.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLLegendElement04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement15.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLCollection05.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableColElement12.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLImageElement06.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLFrameElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement96.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement17.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement13.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLAppletElement06.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptionsCollection07.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument15.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement46.html
+/sdcard/android/layout_tests/dom/html/level2/html/table21.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLIFrameElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/object02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement20.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLQuoteElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement79.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLLinkElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement100.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTextAreaElement13.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLAnchorElement08.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement17.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement18.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement133.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLScriptElement06.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement29.html
+/sdcard/android/layout_tests/dom/html/level2/html/table04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLBodyElement09.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement17.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement19.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement82.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/table37.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLHeadingElement05.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement06.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLAnchorElement11.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement20.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement21.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement36.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement116.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement32.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLBodyElement12.html
+/sdcard/android/layout_tests/dom/html/level2/html/basefont01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLStyleElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement20.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement22.html
+/sdcard/android/layout_tests/dom/html/level2/html/button05.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement65.html
+/sdcard/android/layout_tests/dom/html/level2/html/table40.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement17.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLCollection07.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLImageElement08.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLFrameElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement98.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement19.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement15.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLAppletElement08.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLFormElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument17.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement05.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement48.html
+/sdcard/android/layout_tests/dom/html/level2/html/table23.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLIFrameElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/object04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement20.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLCollection10.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLImageElement11.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLPreElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement22.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLOListElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLLinkElement05.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement102.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptionElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTextAreaElement15.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLAppletElement11.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement19.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument20.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement135.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement51.html
+/sdcard/android/layout_tests/dom/html/level2/html/table06.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLHeadElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement19.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement84.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement05.html
+/sdcard/android/layout_tests/dom/html/level2/html/table39.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement08.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLAnchorElement13.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/hasFeature01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement23.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement38.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement118.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement34.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLBaseFontElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement24.html
+/sdcard/android/layout_tests/dom/html/level2/html/button07.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement67.html
+/sdcard/android/layout_tests/dom/html/level2/html/table42.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement11.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTextAreaElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement05.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLCollection09.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement06.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLFrameElement05.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement121.html
+/sdcard/android/layout_tests/dom/html/level2/html/dlist01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement17.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLFormElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement05.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument19.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement07.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement70.html
+/sdcard/android/layout_tests/dom/html/level2/html/table25.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLMenuElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLFontElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLIFrameElement05.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLCollection12.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement24.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLLinkElement07.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement104.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptionElement04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement20.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLMetaElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument22.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement137.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLHRElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement10.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement53.html
+/sdcard/android/layout_tests/dom/html/level2/html/table08.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement05.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableColElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement86.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement07.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/hasFeature03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement25.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement140.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument05.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLButtonElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement36.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLBaseFontElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLFrameSetElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement26.html
+/sdcard/android/layout_tests/dom/html/level2/html/button09.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement10.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement69.html
+/sdcard/android/layout_tests/dom/html/level2/html/table44.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement13.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTextAreaElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement07.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement08.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLFrameElement07.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement123.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement19.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLParamElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLFormElement05.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLAreaElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement07.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement09.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement72.html
+/sdcard/android/layout_tests/dom/html/level2/html/table27.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLIFrameElement07.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLAnchorElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/anchor01.html
+/sdcard/android/layout_tests/dom/html/level2/html/object08.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement10.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement11.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement26.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement106.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLLinkElement09.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptionElement06.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement22.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLMetaElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLBodyElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/body01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement10.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument24.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement139.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLHRElement04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement12.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement55.html
+/sdcard/android/layout_tests/dom/html/level2/html/table30.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLIFrameElement10.html
+/sdcard/android/layout_tests/dom/html/level2/html/object11.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement07.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableColElement04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement88.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement09.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLHtmlElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLLabelElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTitleElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement05.html
+/sdcard/android/layout_tests/dom/html/level2/html/hasFeature05.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement27.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement142.html
+/sdcard/android/layout_tests/dom/html/level2/html/doc01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument07.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLBaseElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLButtonElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/AppletsCollection.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement38.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLIsIndexElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement10.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLModElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLImageElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement28.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement91.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement12.html
+/sdcard/android/layout_tests/dom/html/level2/html/table46.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement15.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTextAreaElement05.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLAppletElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement09.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement30.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptionsCollection02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLFrameElement09.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument10.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement125.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement41.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLParamElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLFormElement07.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLAreaElement04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement09.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement31.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptGroupElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement74.html
+/sdcard/android/layout_tests/dom/html/level2/html/table29.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLIFrameElement09.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLAnchorElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/anchor03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement12.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement13.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement28.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLScriptElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement108.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptionElement08.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement24.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLBodyElement04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement12.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument26.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement14.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement57.html
+/sdcard/android/layout_tests/dom/html/level2/html/table32.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/object13.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement09.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableColElement06.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement31.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement111.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLLabelElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement07.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement29.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement144.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument09.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLButtonElement05.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement60.html
+/sdcard/android/layout_tests/dom/html/level2/html/table15.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLLegendElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement12.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLCollection02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLModElement04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLImageElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement93.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement14.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLFieldSetElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/table48.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLLIElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement17.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement10.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTextAreaElement07.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLAppletElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptionsCollection04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument12.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement127.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement43.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLFormElement09.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLAreaElement06.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement76.html
+/sdcard/android/layout_tests/dom/html/level2/html/table51.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement20.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTextAreaElement10.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLAnchorElement05.html
+/sdcard/android/layout_tests/dom/html/level2/html/anchor05.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement14.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement15.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement130.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLScriptElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement26.html
+/sdcard/android/layout_tests/dom/html/level2/html/table01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLBodyElement06.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement14.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement16.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement59.html
+/sdcard/android/layout_tests/dom/html/level2/html/table34.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLHeadingElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/area02.html
+/sdcard/android/layout_tests/dom/html/level2/html/object15.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableColElement08.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement33.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement113.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement09.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLUListElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLBRElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/button02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLButtonElement07.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement62.html
+/sdcard/android/layout_tests/dom/html/level2/html/table17.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLLegendElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement14.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLCollection04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLImageElement05.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableColElement11.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement95.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement16.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement19.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement12.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTextAreaElement09.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLAppletElement05.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptionsCollection06.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument14.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement129.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLMapElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement45.html
+/sdcard/android/layout_tests/dom/html/level2/html/table20.html
+/sdcard/android/layout_tests/dom/html/level2/html/object01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLAreaElement08.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement78.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLLinkElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/table53.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement22.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTextAreaElement12.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLAnchorElement07.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement16.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement17.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement132.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLScriptElement05.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement28.html
+/sdcard/android/layout_tests/dom/html/level2/html/table03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLBodyElement08.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement16.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement18.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement81.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/table36.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLHeadingElement04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement05.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLAnchorElement10.html
+/sdcard/android/layout_tests/dom/html/level2/html/area04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement20.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement35.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement115.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLDlistElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement31.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLBodyElement11.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLStyleElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement21.html
+/sdcard/android/layout_tests/dom/html/level2/html/button04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement64.html
+/sdcard/android/layout_tests/dom/html/level2/html/table19.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLCollection06.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLImageElement07.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLFrameElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement97.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement18.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement14.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLAppletElement07.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument16.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement47.html
+/sdcard/android/layout_tests/dom/html/level2/html/table22.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLIFrameElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/object03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLImageElement10.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement21.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLOListElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLQuoteElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement101.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLLinkElement04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptionElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTextAreaElement14.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLAnchorElement09.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLAppletElement10.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement18.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement19.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement134.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLScriptElement07.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement50.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement18.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement83.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement04.html
+/sdcard/android/layout_tests/dom/html/level2/html/table38.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLHeadingElement06.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement07.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLAnchorElement12.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement21.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement22.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement37.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement117.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement33.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLDirectoryElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement23.html
+/sdcard/android/layout_tests/dom/html/level2/html/button06.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement66.html
+/sdcard/android/layout_tests/dom/html/level2/html/table41.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement10.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement18.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLCollection08.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLImageElement09.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement40.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement05.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLFrameElement04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement99.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement120.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement16.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLAppletElement09.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLFormElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument18.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement06.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement49.html
+/sdcard/android/layout_tests/dom/html/level2/html/table24.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLIFrameElement04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLFontElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/object05.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLCollection11.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLImageElement12.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement23.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLOListElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement103.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLLinkElement06.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptionElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument21.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement136.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLHRElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement52.html
+/sdcard/android/layout_tests/dom/html/level2/html/table07.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableColElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement85.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement06.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement09.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLAnchorElement14.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/hasFeature02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement24.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement39.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement119.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement35.html
+/sdcard/android/layout_tests/dom/html/level2/html/table10.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLBaseFontElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement25.html
+/sdcard/android/layout_tests/dom/html/level2/html/button08.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement68.html
+/sdcard/android/layout_tests/dom/html/level2/html/table43.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement12.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTextAreaElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement06.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement07.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLFrameElement06.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement122.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement18.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLFormElement04.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLAreaElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement06.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement08.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement71.html
+/sdcard/android/layout_tests/dom/html/level2/html/table26.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLIFrameElement06.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLFontElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/object07.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement10.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement25.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement105.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLLinkElement08.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptionElement05.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement21.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLMetaElement02.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLBodyElement01.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument23.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement138.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLHRElement03.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement11.html
+/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement54.html
+/sdcard/android/layout_tests/dom/html/level2/html/table09.html
+/sdcard/android/layout_tests/dom/html/level2/html/object10.html
+/sdcard/android/layout_tests/dom/html/level2/core/hc_notationsremovenameditemns1.html
+/sdcard/android/layout_tests/dom/html/level2/core/hc_entitiessetnameditemns1.html
+/sdcard/android/layout_tests/dom/html/level2/core/setAttributeNS10.html
+/sdcard/android/layout_tests/dom/html/level2/core/hc_nodedocumentfragmentnormalize2.html
+/sdcard/android/layout_tests/dom/html/level2/core/hc_namednodemapinvalidtype1.html
+/sdcard/android/layout_tests/dom/html/level2/core/createAttributeNS06.html
+/sdcard/android/layout_tests/dom/html/level2/core/createDocumentType04.html
+/sdcard/android/layout_tests/dom/html/level2/core/hc_notationssetnameditemns1.html
+/sdcard/android/layout_tests/dom/html/level2/core/hc_entitiesremovenameditemns1.html
+/sdcard/android/layout_tests/dom/html/level2/core/hc_nodedocumentfragmentnormalize1.html
+/sdcard/android/layout_tests/dom/html/level2/core/createDocument08.html
+/sdcard/android/layout_tests/plugins/createScriptableObject-before-start.html
+/sdcard/android/layout_tests/plugins/get-empty-url.html
+/sdcard/android/layout_tests/plugins/return-error-from-new-stream-callback-in-full-frame-plugin.html
+/sdcard/android/layout_tests/editing/style/temporary-span-crash.html
+/sdcard/android/layout_tests/editing/style/4230923.html
+/sdcard/android/layout_tests/editing/inserting/5549929-1.html
+/sdcard/android/layout_tests/editing/inserting/6104369.html
+/sdcard/android/layout_tests/editing/inserting/5803706-2.html
+/sdcard/android/layout_tests/editing/inserting/5685601-2.html
+/sdcard/android/layout_tests/editing/inserting/5607069-1.html
+/sdcard/android/layout_tests/editing/inserting/5803706-1.html
+/sdcard/android/layout_tests/editing/inserting/5685601-1.html
+/sdcard/android/layout_tests/editing/inserting/5994480.html
+/sdcard/android/layout_tests/editing/inserting/6104369-2.html
+/sdcard/android/layout_tests/editing/inserting/insert-before-link-1.html
+/sdcard/android/layout_tests/editing/inserting/5378847.html
+/sdcard/android/layout_tests/editing/inserting/5685601-3.html
+/sdcard/android/layout_tests/editing/execCommand/19403.html
+/sdcard/android/layout_tests/editing/execCommand/default-parameters.html
+/sdcard/android/layout_tests/editing/execCommand/19455.html
+/sdcard/android/layout_tests/editing/execCommand/19087.html
+/sdcard/android/layout_tests/editing/execCommand/empty-span-removal.html
+/sdcard/android/layout_tests/editing/execCommand/5469868.html
+/sdcard/android/layout_tests/editing/execCommand/5575101-1.html
+/sdcard/android/layout_tests/editing/execCommand/findString-3.html
+/sdcard/android/layout_tests/editing/execCommand/16049.html
+/sdcard/android/layout_tests/editing/execCommand/19653-1.html
+/sdcard/android/layout_tests/editing/execCommand/arguments-combinations.html
+/sdcard/android/layout_tests/editing/execCommand/5575101-3.html
+/sdcard/android/layout_tests/editing/execCommand/5770834-1.html
+/sdcard/android/layout_tests/editing/execCommand/5483526.html
+/sdcard/android/layout_tests/editing/execCommand/5658933-1.html
+/sdcard/android/layout_tests/editing/execCommand/6355786.html
+/sdcard/android/layout_tests/editing/execCommand/5604313.html
+/sdcard/android/layout_tests/editing/execCommand/19653-3.html
+/sdcard/android/layout_tests/editing/execCommand/5763082.html
+/sdcard/android/layout_tests/editing/execCommand/6444148.html
+/sdcard/android/layout_tests/editing/execCommand/4976800.html
+/sdcard/android/layout_tests/editing/execCommand/4928635.html
+/sdcard/android/layout_tests/editing/execCommand/4920742-2.html
+/sdcard/android/layout_tests/editing/execCommand/4917055.html
+/sdcard/android/layout_tests/editing/execCommand/5575101-2.html
+/sdcard/android/layout_tests/editing/execCommand/12244.html
+/sdcard/android/layout_tests/editing/execCommand/19653-2.html
+/sdcard/android/layout_tests/editing/execCommand/4916235.html
+/sdcard/android/layout_tests/editing/execCommand/5458246.html
+/sdcard/android/layout_tests/editing/execCommand/toggle-styles.html
+/sdcard/android/layout_tests/editing/pasteboard/5761530-2.html
+/sdcard/android/layout_tests/editing/pasteboard/6018653.html
+/sdcard/android/layout_tests/editing/pasteboard/4930986-1.html
+/sdcard/android/layout_tests/editing/pasteboard/5780697-1.html
+/sdcard/android/layout_tests/editing/pasteboard/4930986-3.html
+/sdcard/android/layout_tests/editing/pasteboard/5245519.html
+/sdcard/android/layout_tests/editing/pasteboard/5521237.html
+/sdcard/android/layout_tests/editing/pasteboard/newlines-around-floating-or-positioned.html
+/sdcard/android/layout_tests/editing/pasteboard/5078739.html
+/sdcard/android/layout_tests/editing/pasteboard/createMarkup-assert.xml
+/sdcard/android/layout_tests/editing/pasteboard/4930986-2.html
+/sdcard/android/layout_tests/editing/pasteboard/5480736.html
+/sdcard/android/layout_tests/editing/selection/5497643.html
+/sdcard/android/layout_tests/editing/selection/5825350-1.html
+/sdcard/android/layout_tests/editing/selection/setBaseAndExtent-revert-selection.html
+/sdcard/android/layout_tests/editing/selection/selection-invalid-offset.html
+/sdcard/android/layout_tests/editing/selection/rangeCount.html
+/sdcard/android/layout_tests/editing/selection/5714333.html
+/sdcard/android/layout_tests/editing/selection/select-line.html
+/sdcard/android/layout_tests/editing/selection/doubleclick-whitespace-crash.html
+/sdcard/android/layout_tests/editing/selection/containsNode.html
+/sdcard/android/layout_tests/editing/selection/select-all-user-select-none.html
+/sdcard/android/layout_tests/editing/selection/selectAllChildren.html
+/sdcard/android/layout_tests/editing/selection/find-in-text-control.html
+/sdcard/android/layout_tests/editing/selection/extend.html
+/sdcard/android/layout_tests/editing/selection/5241148.html
+/sdcard/android/layout_tests/editing/selection/cleared-by-relayout.html
+/sdcard/android/layout_tests/editing/selection/5825350-2.html
+/sdcard/android/layout_tests/editing/selection/5794920-1.html
+/sdcard/android/layout_tests/editing/selection/5779984-1.html
+/sdcard/android/layout_tests/editing/selection/deleteFromDocument.html
+/sdcard/android/layout_tests/editing/undo/4059423-1.html
+/sdcard/android/layout_tests/editing/undo/4059423-2.html
+/sdcard/android/layout_tests/editing/undo/5658727.html
+/sdcard/android/layout_tests/editing/undo/5738768.html
+/sdcard/android/layout_tests/editing/deleting/2610675-2.html
+/sdcard/android/layout_tests/editing/deleting/5847330-2.html
+/sdcard/android/layout_tests/editing/deleting/6026335.html
+/sdcard/android/layout_tests/editing/deleting/2610675-1.html
+/sdcard/android/layout_tests/editing/deleting/5847330-1.html
+/sdcard/android/layout_tests/editing/deleting/5433862-1.html
+/sdcard/android/layout_tests/editing/deleting/5495723.html
+/sdcard/android/layout_tests/editing/deleting/5290534.html
+/sdcard/android/layout_tests/editing/deleting/2610675-3.html
/sdcard/android/layout_tests/fast/replaced/object-param-no-name.html
/sdcard/android/layout_tests/fast/dynamic/subtree-common-root.html
/sdcard/android/layout_tests/fast/dynamic/hovered-detach.html
@@ -15,6 +1063,7 @@
/sdcard/android/layout_tests/fast/text/find-backwards.html
/sdcard/android/layout_tests/fast/text/large-text-composed-char-dos.html
/sdcard/android/layout_tests/fast/text/find-case-folding.html
+/sdcard/android/layout_tests/fast/text/text-shadow-extreme-value.html
/sdcard/android/layout_tests/fast/text/line-breaks-after-ideographic-comma-or-full-stop.html
/sdcard/android/layout_tests/fast/encoding/gbk/chinese.html
/sdcard/android/layout_tests/fast/encoding/gbk/x-euc-cn.html
@@ -68,12 +1117,10 @@
/sdcard/android/layout_tests/fast/encoding/pseudo-xml-3.html
/sdcard/android/layout_tests/fast/encoding/pseudo-xml.html
/sdcard/android/layout_tests/fast/encoding/tag-in-title.html
-/sdcard/android/layout_tests/fast/encoding/yahoo-mail.html
-/sdcard/android/layout_tests/fast/encoding/ahram-org-eg.html
-/sdcard/android/layout_tests/fast/encoding/noscript-in-head.html
/sdcard/android/layout_tests/fast/encoding/script-in-head.html
/sdcard/android/layout_tests/fast/encoding/css-cached-bom.html
/sdcard/android/layout_tests/fast/encoding/mispositioned-meta.html
+/sdcard/android/layout_tests/fast/encoding/preload-encoding.html
/sdcard/android/layout_tests/fast/multicol/gap-non-negative.html
/sdcard/android/layout_tests/fast/multicol/content-height-zero-crash.html
/sdcard/android/layout_tests/fast/doctypes/doctype-at-end.html
@@ -106,6 +1153,7 @@
/sdcard/android/layout_tests/fast/events/no-blur-on-page-leave.html
/sdcard/android/layout_tests/fast/events/onload-name-collision.html
/sdcard/android/layout_tests/fast/events/div-focus.html
+/sdcard/android/layout_tests/fast/events/related-target.html
/sdcard/android/layout_tests/fast/events/overflow-events.html
/sdcard/android/layout_tests/fast/events/create-document-crash-on-attach-event.html
/sdcard/android/layout_tests/fast/events/no-blur-on-enter-button.html
@@ -113,6 +1161,8 @@
/sdcard/android/layout_tests/fast/events/shadow-boundary-crossing.html
/sdcard/android/layout_tests/fast/events/submit-reset-nested-bubble.html
/sdcard/android/layout_tests/fast/events/nested-event-remove-node-crash.html
+/sdcard/android/layout_tests/fast/events/onsubmit-bubbling.html
+/sdcard/android/layout_tests/fast/events/onload-fires-twice.html
/sdcard/android/layout_tests/fast/events/mousedown_in_scrollbar.html
/sdcard/android/layout_tests/fast/events/window-load-capture.html
/sdcard/android/layout_tests/fast/events/event-instanceof.html
@@ -128,6 +1178,8 @@
/sdcard/android/layout_tests/fast/events/event-targets.html
/sdcard/android/layout_tests/fast/events/space-scroll-event.html
/sdcard/android/layout_tests/fast/events/onload-after-document-close-no-subresource.html
+/sdcard/android/layout_tests/fast/events/nested-window-event.html
+/sdcard/android/layout_tests/fast/events/selectstart-during-autoscroll.html
/sdcard/android/layout_tests/fast/events/stopPropagation-checkbox.html
/sdcard/android/layout_tests/fast/events/tab-crash-with-image-map.html
/sdcard/android/layout_tests/fast/events/simulated-key-state.html
@@ -166,10 +1218,59 @@
/sdcard/android/layout_tests/fast/regex/slow.html
/sdcard/android/layout_tests/fast/regex/malformed-escapes.html
/sdcard/android/layout_tests/fast/regex/early-acid3-86.html
-/sdcard/android/layout_tests/fast/regex/test1.html
/sdcard/android/layout_tests/fast/regex/alternative-length-miscalculation.html
/sdcard/android/layout_tests/fast/regex/test4.html
/sdcard/android/layout_tests/fast/regex/non-capturing-backtracking.html
+/sdcard/android/layout_tests/fast/js/kde/Boolean.html
+/sdcard/android/layout_tests/fast/js/kde/function.html
+/sdcard/android/layout_tests/fast/js/kde/function_length.html
+/sdcard/android/layout_tests/fast/js/kde/const.html
+/sdcard/android/layout_tests/fast/js/kde/constructor_length.html
+/sdcard/android/layout_tests/fast/js/kde/statements.html
+/sdcard/android/layout_tests/fast/js/kde/math.html
+/sdcard/android/layout_tests/fast/js/kde/assignments.html
+/sdcard/android/layout_tests/fast/js/kde/crash-1.html
+/sdcard/android/layout_tests/fast/js/kde/delete.html
+/sdcard/android/layout_tests/fast/js/kde/var_decl_init.html
+/sdcard/android/layout_tests/fast/js/kde/literals.html
+/sdcard/android/layout_tests/fast/js/kde/eval.html
+/sdcard/android/layout_tests/fast/js/kde/j-comment-3.html
+/sdcard/android/layout_tests/fast/js/kde/StringObject.html
+/sdcard/android/layout_tests/fast/js/kde/crash-2.html
+/sdcard/android/layout_tests/fast/js/kde/exception_propagation.html
+/sdcard/android/layout_tests/fast/js/kde/conditional.html
+/sdcard/android/layout_tests/fast/js/kde/scope.html
+/sdcard/android/layout_tests/fast/js/kde/parse.html
+/sdcard/android/layout_tests/fast/js/kde/function_arguments.html
+/sdcard/android/layout_tests/fast/js/kde/arguments-scope.html
+/sdcard/android/layout_tests/fast/js/kde/lval-exceptions.html
+/sdcard/android/layout_tests/fast/js/kde/operators.html
+/sdcard/android/layout_tests/fast/js/kde/Array.html
+/sdcard/android/layout_tests/fast/js/kde/md5-1.html
+/sdcard/android/layout_tests/fast/js/kde/object_prototype_tostring.html
+/sdcard/android/layout_tests/fast/js/kde/Date-setYear.html
+/sdcard/android/layout_tests/fast/js/kde/GlobalObject.html
+/sdcard/android/layout_tests/fast/js/kde/prototype_proto.html
+/sdcard/android/layout_tests/fast/js/kde/evil-n.html
+/sdcard/android/layout_tests/fast/js/kde/RegExp.html
+/sdcard/android/layout_tests/fast/js/kde/cast.html
+/sdcard/android/layout_tests/fast/js/kde/j-comment-4.html
+/sdcard/android/layout_tests/fast/js/kde/iteration.html
+/sdcard/android/layout_tests/fast/js/kde/comment-1.html
+/sdcard/android/layout_tests/fast/js/kde/Prototype.html
+/sdcard/android/layout_tests/fast/js/kde/completion.html
+/sdcard/android/layout_tests/fast/js/kde/exceptions.html
+/sdcard/android/layout_tests/fast/js/kde/md5-2.html
+/sdcard/android/layout_tests/fast/js/kde/Error.html
+/sdcard/android/layout_tests/fast/js/kde/function_constructor.html
+/sdcard/android/layout_tests/fast/js/kde/object_prototype.html
+/sdcard/android/layout_tests/fast/js/kde/empty.html
+/sdcard/android/layout_tests/fast/js/kde/inbuilt_function_proto.html
+/sdcard/android/layout_tests/fast/js/kde/func-decl.html
+/sdcard/android/layout_tests/fast/js/kde/comment-2.html
+/sdcard/android/layout_tests/fast/js/kde/inbuilt_function_tostring.html
+/sdcard/android/layout_tests/fast/js/kde/Object.html
+/sdcard/android/layout_tests/fast/js/kde/prototype_length.html
/sdcard/android/layout_tests/fast/js/pic/cached-single-entry-transition.html
/sdcard/android/layout_tests/fast/js/pic/cached-prototype-setter.html
/sdcard/android/layout_tests/fast/js/pic/get-empty-string.html
@@ -226,7 +1327,6 @@
/sdcard/android/layout_tests/fast/js/do-while-semicolon.html
/sdcard/android/layout_tests/fast/js/regexp-divequal.html
/sdcard/android/layout_tests/fast/js/named-function-expression.html
-/sdcard/android/layout_tests/fast/js/array-iterate-backwards.html
/sdcard/android/layout_tests/fast/js/constructor-attributes.html
/sdcard/android/layout_tests/fast/js/array-some.html
/sdcard/android/layout_tests/fast/js/missing-title-end-tag-js.html
@@ -345,7 +1445,6 @@
/sdcard/android/layout_tests/fast/js/date-constructor.html
/sdcard/android/layout_tests/fast/js/date-big-setdate.html
/sdcard/android/layout_tests/fast/js/array-every.html
-/sdcard/android/layout_tests/fast/js/function-toString-parentheses.html
/sdcard/android/layout_tests/fast/js/array-functions-non-arrays.html
/sdcard/android/layout_tests/fast/js/while-expression-value.html
/sdcard/android/layout_tests/fast/js/string-replace-3.html
@@ -393,6 +1492,7 @@
/sdcard/android/layout_tests/fast/js/throw-from-array-sort.html
/sdcard/android/layout_tests/fast/js/slash-lineterminator-parse.html
/sdcard/android/layout_tests/fast/js/dot-node-base-exception.html
+/sdcard/android/layout_tests/fast/js/toString-stack-overflow.html
/sdcard/android/layout_tests/fast/js/codegen-peephole-locals.html
/sdcard/android/layout_tests/fast/js/constant-count.html
/sdcard/android/layout_tests/fast/js/regexp-compile.html
@@ -431,8 +1531,6 @@
/sdcard/android/layout_tests/fast/dom/HTMLTableElement/tBodies.html
/sdcard/android/layout_tests/fast/dom/HTMLTableElement/rows.html
/sdcard/android/layout_tests/fast/dom/HTMLDocument/write-multiple-calls.html
-/sdcard/android/layout_tests/fast/dom/HTMLDocument/document-special-properties.html
-/sdcard/android/layout_tests/fast/dom/HTMLDocument/url-getset.html
/sdcard/android/layout_tests/fast/dom/HTMLDocument/writeln-call.html
/sdcard/android/layout_tests/fast/dom/HTMLDocument/document-plugins.html
/sdcard/android/layout_tests/fast/dom/HTMLDocument/title-get.html
@@ -559,6 +1657,12 @@
/sdcard/android/layout_tests/fast/dom/Window/alert-undefined.html
/sdcard/android/layout_tests/fast/dom/Window/window-open-top.html
/sdcard/android/layout_tests/fast/dom/Window/window-appendages-cleared.html
+/sdcard/android/layout_tests/fast/dom/Window/global-opener-function.html
+/sdcard/android/layout_tests/fast/dom/Window/window-property-shadowing.html
+/sdcard/android/layout_tests/fast/dom/Window/remove-timeout-crash.html
+/sdcard/android/layout_tests/fast/dom/Window/window-custom-prototype.html
+/sdcard/android/layout_tests/fast/dom/Window/timeout-callback-scope.html
+/sdcard/android/layout_tests/fast/dom/Window/window-property-shadowing-name.html
/sdcard/android/layout_tests/fast/dom/Window/window-open-parent-no-parent.html
/sdcard/android/layout_tests/fast/dom/Window/closure-access-after-navigation-iframe.html
/sdcard/android/layout_tests/fast/dom/HTMLTableRowElement/cells.html
@@ -611,23 +1715,7 @@
/sdcard/android/layout_tests/fast/dom/css-dom-read.html
/sdcard/android/layout_tests/fast/dom/image-object.html
/sdcard/android/layout_tests/fast/dom/gc-5.html
-/sdcard/android/layout_tests/fast/dom/node-filter-gc.html
-/sdcard/android/layout_tests/fast/dom/noscript-canvas-in-created-html-document.html
-/sdcard/android/layout_tests/fast/dom/DOMParser-assign-variable.html
-/sdcard/android/layout_tests/fast/dom/timer-clear-interval-in-handler.html
-/sdcard/android/layout_tests/fast/dom/implementation-createHTMLDocument.html
-/sdcard/android/layout_tests/fast/dom/iframe-document.html
-/sdcard/android/layout_tests/fast/dom/document-all-input.html
-/sdcard/android/layout_tests/fast/dom/null-document-location-href-put-crash.html
-/sdcard/android/layout_tests/fast/dom/getelementsbytagnamens-mixed-namespaces.html
-/sdcard/android/layout_tests/fast/dom/object-plugin-hides-properties.html
-/sdcard/android/layout_tests/fast/dom/gc-2.html
-/sdcard/android/layout_tests/fast/dom/computed-style-set-property.html
-/sdcard/android/layout_tests/fast/dom/inner-text-001.html
-/sdcard/android/layout_tests/fast/dom/css-selectorText.html
-/sdcard/android/layout_tests/fast/dom/replace-first-child.html
-/sdcard/android/layout_tests/fast/dom/importNode-null.html
-/sdcard/android/layout_tests/fast/dom/select-selectedIndex-multiple.html
+/sdcard/android/layout_tests/fast/dom/cssTarget-crash.html
/sdcard/android/layout_tests/fast/dom/xmlhttprequest-invalid-values.html
/sdcard/android/layout_tests/fast/dom/space-to-text.html
/sdcard/android/layout_tests/fast/dom/css-set-property-exception.html
@@ -643,6 +1731,7 @@
/sdcard/android/layout_tests/fast/dom/getelementbyname-invalidation.html
/sdcard/android/layout_tests/fast/dom/capturing-event-listeners.html
/sdcard/android/layout_tests/fast/dom/title-text-property.html
+/sdcard/android/layout_tests/fast/dom/null-page-show-modal-dialog-crash.html
/sdcard/android/layout_tests/fast/dom/incompatible-operations.html
/sdcard/android/layout_tests/fast/dom/xmlhttprequest-html-response-encoding.html
/sdcard/android/layout_tests/fast/dom/inner-text-rtl.html
@@ -671,7 +1760,6 @@
/sdcard/android/layout_tests/fast/dom/document-all-select.html
/sdcard/android/layout_tests/fast/dom/anchor-backslash.html
/sdcard/android/layout_tests/fast/dom/css-mediarule-functions.html
-/sdcard/android/layout_tests/fast/dom/gc-acid3.html
/sdcard/android/layout_tests/fast/dom/duplicate-ids-document-order.html
/sdcard/android/layout_tests/fast/dom/exception-no-frame-inline-script-crash.html
/sdcard/android/layout_tests/fast/dom/XMLSerializer-doctype2.html
@@ -686,6 +1774,14 @@
/sdcard/android/layout_tests/fast/dom/createElement.html
/sdcard/android/layout_tests/fast/dom/createElement-with-column.xml
/sdcard/android/layout_tests/fast/dom/simultaneouslyRegsiteredTimerFireOrder.html
+/sdcard/android/layout_tests/fast/dom/clone-node-form-elements-with-attr.html
+/sdcard/android/layout_tests/fast/dom/setAttributeNS.html
+/sdcard/android/layout_tests/fast/dom/anchor-toString.html
+/sdcard/android/layout_tests/fast/dom/dom-add-optionelement.html
+/sdcard/android/layout_tests/fast/dom/location-assign.html
+/sdcard/android/layout_tests/fast/dom/documenturi-affects-relative-paths.html
+/sdcard/android/layout_tests/fast/dom/javascript-backslash.html
+/sdcard/android/layout_tests/fast/dom/setAttribute-using-initial-input-value.html
/sdcard/android/layout_tests/fast/dom/generic-form-element-assert.html
/sdcard/android/layout_tests/fast/dom/css-shortHands.html
/sdcard/android/layout_tests/fast/dom/dom-instanceof.html
@@ -713,7 +1809,6 @@
/sdcard/android/layout_tests/fast/dom/exception-no-frame-timeout-crash.html
/sdcard/android/layout_tests/fast/dom/title-text-property-2.html
/sdcard/android/layout_tests/fast/dom/no-elements.html
-/sdcard/android/layout_tests/fast/dom/non-numeric-values-numeric-parameters.html
/sdcard/android/layout_tests/fast/dom/gc-4.html
/sdcard/android/layout_tests/fast/dom/inner-width-height.html
/sdcard/android/layout_tests/fast/dom/XMLSerializer-doctype.html
@@ -723,14 +1818,6 @@
/sdcard/android/layout_tests/fast/dom/gc-1.html
/sdcard/android/layout_tests/fast/dom/select-selectedIndex-bug-12942.html
/sdcard/android/layout_tests/fast/dom/frame-contentWindow-crash.html
-/sdcard/android/layout_tests/fast/dom/namednodemap-namelookup.html
-/sdcard/android/layout_tests/fast/dom/null-document-location-replace-crash.html
-/sdcard/android/layout_tests/fast/dom/htmlcollection-detectability.html
-/sdcard/android/layout_tests/fast/dom/documenturi-assigned-junk-implies-relative-urls-do-not-resolve.html
-/sdcard/android/layout_tests/fast/dom/collection-namedItem-via-item.html
-/sdcard/android/layout_tests/fast/dom/set-inner-text-newlines.html
-/sdcard/android/layout_tests/fast/dom/document-dir-property.html
-/sdcard/android/layout_tests/fast/dom/undetectable-style-filter.html
/sdcard/android/layout_tests/fast/dom/domListEnumeration.html
/sdcard/android/layout_tests/fast/dom/destroy-selected-radio-button-crash.html
/sdcard/android/layout_tests/fast/dom/script-add.html
@@ -742,6 +1829,12 @@
/sdcard/android/layout_tests/fast/dom/attribute-namespaces-get-set.html
/sdcard/android/layout_tests/fast/dom/innerHTML-escaping-attribute.html
/sdcard/android/layout_tests/fast/dom/null-document-xmlhttprequest-open.html
+/sdcard/android/layout_tests/fast/dom/null-document-location-put-crash.html
+/sdcard/android/layout_tests/fast/dom/ImageDocument-image-deletion.html
+/sdcard/android/layout_tests/fast/dom/document-scripts.html
+/sdcard/android/layout_tests/fast/gradients/crash-on-remove.html
+/sdcard/android/layout_tests/fast/xpath/xpath-empty-string.html
+/sdcard/android/layout_tests/fast/invalid/test-case-tr-th-td-should-not-close-dl-list.html
/sdcard/android/layout_tests/fast/invalid/nestedh3s-rapidweaver.html
/sdcard/android/layout_tests/fast/forms/element-by-name.html
/sdcard/android/layout_tests/fast/forms/HTMLOptionElement_selected.html
@@ -751,7 +1844,6 @@
/sdcard/android/layout_tests/fast/forms/textfield-focus-out.html
/sdcard/android/layout_tests/fast/forms/willvalidate-000.html
/sdcard/android/layout_tests/fast/forms/form-data-encoding-normalization-overrun.html
-/sdcard/android/layout_tests/fast/forms/select-reset.html
/sdcard/android/layout_tests/fast/forms/input-named-action-overrides-action-attribute.html
/sdcard/android/layout_tests/fast/forms/empty-get.html
/sdcard/android/layout_tests/fast/forms/display-none-in-onchange-keyboard.html
@@ -762,18 +1854,25 @@
/sdcard/android/layout_tests/fast/forms/autofocus-opera-006.html
/sdcard/android/layout_tests/fast/forms/activate-and-disabled-elements.html
/sdcard/android/layout_tests/fast/forms/form-get-multipart2.html
+/sdcard/android/layout_tests/fast/forms/tabs-with-modifiers.html
+/sdcard/android/layout_tests/fast/forms/menulist-no-renderer-onmousedown.html
+/sdcard/android/layout_tests/fast/forms/saved-state-adoptNode-crash.html
/sdcard/android/layout_tests/fast/forms/select-replace-option.html
/sdcard/android/layout_tests/fast/forms/textarea-setvalue-submit.html
+/sdcard/android/layout_tests/fast/forms/11423.html
/sdcard/android/layout_tests/fast/forms/cursor-position.html
/sdcard/android/layout_tests/fast/forms/willvalidate-007.html
/sdcard/android/layout_tests/fast/forms/input-changing-value.html
/sdcard/android/layout_tests/fast/forms/double-focus.html
/sdcard/android/layout_tests/fast/forms/form-data-encoding-2.html
/sdcard/android/layout_tests/fast/forms/focus.html
+/sdcard/android/layout_tests/fast/forms/willvalidate-004.html
/sdcard/android/layout_tests/fast/forms/button-in-forms-collection.html
+/sdcard/android/layout_tests/fast/forms/input-text-enter.html
/sdcard/android/layout_tests/fast/forms/input-delete.html
/sdcard/android/layout_tests/fast/forms/placeholder-non-textfield.html
/sdcard/android/layout_tests/fast/forms/element-order.html
+/sdcard/android/layout_tests/fast/forms/form-post-urlencoded.html
/sdcard/android/layout_tests/fast/forms/willvalidate-001.html
/sdcard/android/layout_tests/fast/forms/option-constructor-selected.html
/sdcard/android/layout_tests/fast/forms/8250.html
@@ -809,12 +1908,11 @@
/sdcard/android/layout_tests/fast/forms/select-index-setter.html
/sdcard/android/layout_tests/fast/forms/option-change-single-selected.html
/sdcard/android/layout_tests/fast/forms/listbox-scroll-after-options-removed.html
+/sdcard/android/layout_tests/fast/forms/input-selection-hidden.html
+/sdcard/android/layout_tests/fast/forms/input-type-change-in-onfocus-keyboard.html
/sdcard/android/layout_tests/fast/forms/willvalidate-002.html
+/sdcard/android/layout_tests/fast/forms/option-in-optgroup-removal.html
/sdcard/android/layout_tests/fast/forms/form-data-encoding.html
-/sdcard/android/layout_tests/fast/forms/input-appearance-elementFromPoint.html
-/sdcard/android/layout_tests/fast/forms/select-set-inner.html
-/sdcard/android/layout_tests/fast/forms/missing-action.html
-/sdcard/android/layout_tests/fast/forms/textarea-scrollbar-height.html
/sdcard/android/layout_tests/fast/forms/textarea-default-value-leading-newline.html
/sdcard/android/layout_tests/fast/forms/autofocus-opera-008.html
/sdcard/android/layout_tests/fast/forms/listbox-typeahead-empty.html
@@ -828,9 +1926,9 @@
/sdcard/android/layout_tests/fast/forms/input-setvalue-selection.html
/sdcard/android/layout_tests/fast/forms/autofocus-opera-002.html
/sdcard/android/layout_tests/fast/forms/old-names.html
-/sdcard/android/layout_tests/fast/forms/willvalidate-006.html
/sdcard/android/layout_tests/fast/forms/focus-style-pending.html
/sdcard/android/layout_tests/fast/forms/textarea-hard-linewrap-empty.html
+/sdcard/android/layout_tests/fast/forms/input-type-change-in-onfocus-mouse.html
/sdcard/android/layout_tests/fast/forms/document-write.html
/sdcard/android/layout_tests/fast/forms/slow-click.html
/sdcard/android/layout_tests/fast/forms/autofocus-attribute.html
@@ -985,6 +2083,7 @@
/sdcard/android/layout_tests/fast/loader/data-url-encoding-html.html
/sdcard/android/layout_tests/fast/loader/file-URL-with-port-number.html
/sdcard/android/layout_tests/fast/loader/link-no-URL.html
+/sdcard/android/layout_tests/fast/xsl/xslt-fragment-in-empty-doc.html
/sdcard/android/layout_tests/fast/canvas/pattern-with-transform.html
/sdcard/android/layout_tests/fast/canvas/gradient-addColorStop-with-invalid-color.html
/sdcard/android/layout_tests/fast/canvas/canvas-gradient-without-path.html
@@ -1041,6 +2140,63 @@
/sdcard/android/layout_tests/fast/frames/location-change.html
/sdcard/android/layout_tests/fast/frames/frame-base-url.html
/sdcard/android/layout_tests/fast/frames/iframe-display-none.html
-/sdcard/android/layout_tests/fast/frames/frame-display-none-focus.html
-/sdcard/android/layout_tests/fast/reflections/teardown-crash.html
-/sdcard/android/layout_tests/fast/reflections/reflection-computed-style.html
+/sdcard/android/layout_tests/animations/transition-and-animation-2.html
+/sdcard/android/layout_tests/animations/import-crash.html
+/sdcard/android/layout_tests/animations/empty-keyframes.html
+/sdcard/android/layout_tests/animations/width-using-ems.html
+/sdcard/android/layout_tests/animations/keyframes-out-of-order.html
+/sdcard/android/layout_tests/geolocation/geolocation-not-implemented.html
+/sdcard/android/layout_tests/traversal/node-iterator-003.html
+/sdcard/android/layout_tests/traversal/node-iterator-005.html
+/sdcard/android/layout_tests/traversal/node-iterator-007.html
+/sdcard/android/layout_tests/traversal/tree-walker-001.html
+/sdcard/android/layout_tests/traversal/node-iterator-009.html
+/sdcard/android/layout_tests/traversal/tree-walker-003.html
+/sdcard/android/layout_tests/traversal/tree-walker-005.html
+/sdcard/android/layout_tests/traversal/exception-forwarding.html
+/sdcard/android/layout_tests/traversal/stay-within-root.html
+/sdcard/android/layout_tests/traversal/node-iterator-002.html
+/sdcard/android/layout_tests/traversal/node-iterator-004.html
+/sdcard/android/layout_tests/traversal/node-iterator-006.html
+/sdcard/android/layout_tests/traversal/node-iterator-006a.html
+/sdcard/android/layout_tests/traversal/tree-walker-002.html
+/sdcard/android/layout_tests/traversal/node-iterator-008.html
+/sdcard/android/layout_tests/traversal/tree-walker-004.html
+/sdcard/android/layout_tests/traversal/tree-walker-006.html
+/sdcard/android/layout_tests/traversal/size-zero-run.html
+/sdcard/android/layout_tests/traversal/acid3-test-2.html
+/sdcard/android/layout_tests/traversal/tree-walker-filter-1.html
+/sdcard/android/layout_tests/traversal/node-iterator-001.html
+/sdcard/android/layout_tests/css2.1/atrule_longest_match.html
+/sdcard/android/layout_tests/css1/units/zero-duration-without-units.html
+/sdcard/android/layout_tests/css3/khtml-background-size-0x0-bmp.html
+/sdcard/android/layout_tests/transitions/transition-end-event-all-properties.html
+/sdcard/android/layout_tests/transitions/transition-end-event-window.html
+/sdcard/android/layout_tests/transitions/transition-end-event-multiple-03.html
+/sdcard/android/layout_tests/transitions/interrupted-all-transition.html
+/sdcard/android/layout_tests/transitions/transition-end-event-set-none.html
+/sdcard/android/layout_tests/transitions/zero-duration-without-units.html
+/sdcard/android/layout_tests/transitions/zero-duration-with-non-zero-delay-start.html
+/sdcard/android/layout_tests/transitions/inherit-other-props.html
+/sdcard/android/layout_tests/transitions/transition-end-event-multiple-04.html
+/sdcard/android/layout_tests/transitions/transition-duration-cleared-in-transitionend-crash.html
+/sdcard/android/layout_tests/transitions/interrupt-zero-duration.html
+/sdcard/android/layout_tests/transitions/retargetted-transition.html
+/sdcard/android/layout_tests/transitions/override-transition-crash.html
+/sdcard/android/layout_tests/transitions/transition-end-event-left.html
+/sdcard/android/layout_tests/transitions/matched-transform-functions.html
+/sdcard/android/layout_tests/transitions/transition-end-event-multiple-01.html
+/sdcard/android/layout_tests/transitions/transform-op-list-match.html
+/sdcard/android/layout_tests/transitions/interrupt-transform-transition.html
+/sdcard/android/layout_tests/transitions/transition-end-event-container.html
+/sdcard/android/layout_tests/transitions/transition-end-event-nested.html
+/sdcard/android/layout_tests/transitions/change-values-during-transition.html
+/sdcard/android/layout_tests/transitions/transition-end-event-attributes.html
+/sdcard/android/layout_tests/transitions/inherit.html
+/sdcard/android/layout_tests/transitions/transition-end-event-create.html
+/sdcard/android/layout_tests/transitions/transition-end-event-multiple-02.html
+/sdcard/android/layout_tests/transitions/shadow.html
+/sdcard/android/layout_tests/transitions/transition-end-event-transform.html
+/sdcard/android/layout_tests/transitions/transition-timing-function.html
+/sdcard/android/layout_tests/transitions/transform-op-list-no-match.html
+/sdcard/android/layout_tests/transitions/transition-end-event-destroy-renderer.html
diff --git a/tests/DumpRenderTree/assets/run_layout_tests.py b/tests/DumpRenderTree/assets/run_layout_tests.py
index 5409a0c..50ccb24 100755
--- a/tests/DumpRenderTree/assets/run_layout_tests.py
+++ b/tests/DumpRenderTree/assets/run_layout_tests.py
@@ -61,7 +61,8 @@
adb_output = subprocess.Popen(shell_cmd_str, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0]
return adb_output.strip() == "#DONE"
-def DiffResults(marker, new_results, old_results, diff_results, strip_reason):
+def DiffResults(marker, new_results, old_results, diff_results, strip_reason,
+ new_count_first=True):
""" Given two result files, generate diff and
write to diff_results file. All arguments are absolute paths
to files.
@@ -85,21 +86,25 @@
for i in range(0, len(cdict)):
cdict[i] = cdict[i].split(' ')[0] + "\n"
- # Find results in new_results missing in old_results
- new_count=0
- for line in ndict:
- if line not in cdict:
- diff_file.writelines("+ " + line)
- new_count += 1
+ params = {
+ "new": [0, ndict, cdict, "+"],
+ "miss": [0, cdict, ndict, "-"]
+ }
+ if new_count_first:
+ order = ["new", "miss"]
+ else:
+ order = ["miss", "new"]
- # Find results in old_results missing in new_results
- missing_count=0
- for line in cdict:
- if line not in ndict:
- diff_file.writelines("- " + line)
- missing_count += 1
+ for key in order:
+ for line in params[key][1]:
+ if line not in params[key][2]:
+ if line[-1] != "\n":
+ line += "\n";
+ diff_file.writelines(params[key][3] + line)
+ params[key][0] += 1
- logging.info(marker + " >>> " + str(new_count) + " new, " + str(missing_count) + " misses")
+ logging.info(marker + " >>> " + str(params["new"][0]) + " new, " +
+ str(params["miss"][0]) + " misses")
diff_file.writelines("\n\n")
@@ -121,12 +126,12 @@
if os.path.exists(diff_result):
os.remove(diff_result)
- files=["passed", "failed", "nontext", "crashed"]
+ files=["crashed", "failed", "passed", "nontext"]
for f in files:
result_file_name = "layout_tests_" + f + ".txt"
DiffResults(f, os.path.join(results_dir, result_file_name),
os.path.join(ref_dir, result_file_name), diff_result,
- f == "failed")
+ False, files != "passed")
logging.info("Detailed diffs are in " + diff_result)
def main(options, args):
diff --git a/tests/DumpRenderTree/assets/run_reliability_tests.py b/tests/DumpRenderTree/assets/run_reliability_tests.py
index b038740..23f93df 100755
--- a/tests/DumpRenderTree/assets/run_reliability_tests.py
+++ b/tests/DumpRenderTree/assets/run_reliability_tests.py
@@ -14,6 +14,7 @@
import subprocess
import sys
import time
+from Numeric import *
TEST_LIST_FILE = "/sdcard/android/reliability_tests_list.txt"
TEST_STATUS_FILE = "/sdcard/android/reliability_running_test.txt"
@@ -75,21 +76,28 @@
logging.info("Line has more than one '|': " + line)
continue
if pair[0] not in load_times:
- load_times[pair[0]] = [0, 0]
+ load_times[pair[0]] = []
try:
pair[1] = int(pair[1])
except ValueError:
logging.info("Lins has non-numeric load time: " + line)
continue
- load_times[pair[0]][0] += pair[1]
- load_times[pair[0]][1] += 1
+ load_times[pair[0]].append(pair[1])
log_handle.close()
# rewrite the average time to file
log_handle = open(raw_log, "w")
for url, times in load_times.iteritems():
- log_handle.write("%s|%f\n" % (url, float(times[0]) / times[1]))
+ # calculate std
+ arr = array(times)
+ avg = average(arr)
+ d = arr - avg
+ std = sqrt(sum(d * d) / len(arr))
+ output = ("%-70s%-10d%-10d%-12.2f%-12.2f%s\n" %
+ (url, min(arr), max(arr), avg, std,
+ array2string(arr)))
+ log_handle.write(output)
log_handle.close()
@@ -156,6 +164,7 @@
# clean up previous results
RemoveDeviceFile(adb_cmd, TEST_STATUS_FILE)
RemoveDeviceFile(adb_cmd, TEST_TIMEOUT_FILE)
+ RemoveDeviceFile(adb_cmd, TEST_LOAD_TIME_FILE)
logging.info("Running the test ...")
diff --git a/tests/backup/backup_helper_test.cpp b/tests/backup/backup_helper_test.cpp
index f087941..04358ad 100644
--- a/tests/backup/backup_helper_test.cpp
+++ b/tests/backup/backup_helper_test.cpp
@@ -38,6 +38,8 @@
{ "backup_helper_test_empty", backup_helper_test_empty, 0, false },
{ "backup_helper_test_four", backup_helper_test_four, 0, false },
{ "backup_helper_test_files", backup_helper_test_files, 0, false },
+ { "backup_helper_test_null_base", backup_helper_test_null_base, 0, false },
+ { "backup_helper_test_missing_file", backup_helper_test_missing_file, 0, false },
{ "backup_helper_test_data_writer", backup_helper_test_data_writer, 0, false },
{ "backup_helper_test_data_reader", backup_helper_test_data_reader, 0, false },
{ 0, NULL, 0, false}
diff --git a/tests/backup/src/com/android/backuptest/BackupTestAgent.java b/tests/backup/src/com/android/backuptest/BackupTestAgent.java
index 11e520e..a370d69 100644
--- a/tests/backup/src/com/android/backuptest/BackupTestAgent.java
+++ b/tests/backup/src/com/android/backuptest/BackupTestAgent.java
@@ -30,7 +30,8 @@
public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
ParcelFileDescriptor newState) {
Log.d(TAG, "onBackup");
- FileBackupHelper.performBackup(this, oldState, data, newState, new String[] {
+ FileBackupHelper helper = new FileBackupHelper(this);
+ helper.performBackup(oldState, data, newState, new String[] {
BackupTestActivity.FILE_NAME
});
}
diff --git a/tests/permission/Android.mk b/tests/permission/Android.mk
new file mode 100644
index 0000000..a6df98e
--- /dev/null
+++ b/tests/permission/Android.mk
@@ -0,0 +1,14 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# We only want this apk build for tests.
+LOCAL_MODULE_TAGS := tests
+
+# Include all test java files.
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_JAVA_LIBRARIES := android.test.runner
+LOCAL_PACKAGE_NAME := FrameworkPermissionTests
+
+include $(BUILD_PACKAGE)
+
diff --git a/tests/permission/AndroidManifest.xml b/tests/permission/AndroidManifest.xml
new file mode 100644
index 0000000..b19bf00
--- /dev/null
+++ b/tests/permission/AndroidManifest.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2009 Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.framework.permission.tests">
+
+ <application>
+ <uses-library android:name="android.test.runner" />
+ </application>
+
+ <!--
+ The test declared in this instrumentation can be run via this command
+ "adb shell am instrument -w com.android.framework.permission.tests/android.test.InstrumentationTestRunner"
+ -->
+ <instrumentation android:name="android.test.InstrumentationTestRunner"
+ android:targetPackage="com.android.framework.permission.tests"
+ android:label="Tests for private API framework permissions"/>
+
+</manifest>
diff --git a/tests/permission/src/com/android/framework/permission/tests/ActivityManagerPermissionTests.java b/tests/permission/src/com/android/framework/permission/tests/ActivityManagerPermissionTests.java
new file mode 100644
index 0000000..14d3d73
--- /dev/null
+++ b/tests/permission/src/com/android/framework/permission/tests/ActivityManagerPermissionTests.java
@@ -0,0 +1,182 @@
+package com.android.framework.permission.tests;
+
+import android.app.ActivityManagerNative;
+import android.app.IActivityManager;
+import android.content.res.Configuration;
+import android.os.RemoteException;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import junit.framework.TestCase;
+
+/**
+ * TODO: Remove this. This is only a placeholder, need to implement this.
+ */
+public class ActivityManagerPermissionTests extends TestCase {
+ IActivityManager mAm;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mAm = ActivityManagerNative.getDefault();
+ }
+
+ @SmallTest
+ public void testREORDER_TASKS() {
+ try {
+ mAm.moveTaskToFront(-1);
+ fail("IActivityManager.moveTaskToFront did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mAm.moveTaskToBack(-1);
+ fail("IActivityManager.moveTaskToBack did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mAm.moveTaskBackwards(-1);
+ fail("IActivityManager.moveTaskToFront did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+ }
+
+ @SmallTest
+ public void testCHANGE_CONFIGURATION() {
+ try {
+ mAm.updateConfiguration(new Configuration());
+ fail("IActivityManager.updateConfiguration did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+ }
+
+ @SmallTest
+ public void testSET_DEBUG_APP() {
+ try {
+ mAm.setDebugApp(null, false, false);
+ fail("IActivityManager.setDebugApp did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+ }
+
+ @SmallTest
+ public void testSET_PROCESS_LIMIT() {
+ try {
+ mAm.setProcessLimit(10);
+ fail("IActivityManager.setProcessLimit did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+ }
+
+ @SmallTest
+ public void testALWAYS_FINISH() {
+ try {
+ mAm.setAlwaysFinish(false);
+ fail("IActivityManager.setAlwaysFinish did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+ }
+
+ @SmallTest
+ public void testSIGNAL_PERSISTENT_PROCESSES() {
+ try {
+ mAm.signalPersistentProcesses(-1);
+ fail("IActivityManager.signalPersistentProcesses did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+ }
+
+ @SmallTest
+ public void testFORCE_BACK() {
+ try {
+ mAm.unhandledBack();
+ fail("IActivityManager.unhandledBack did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+ }
+
+ @SmallTest
+ public void testSET_ACTIVITY_WATCHER() {
+ try {
+ mAm.setActivityWatcher(null);
+ fail("IActivityManager.setActivityWatcher did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+ }
+
+ @SmallTest
+ public void testSHUTDOWN() {
+ try {
+ mAm.shutdown(0);
+ fail("IActivityManager.shutdown did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+ }
+
+ @SmallTest
+ public void testSTOP_APP_SWITCHES() {
+ try {
+ mAm.stopAppSwitches();
+ fail("IActivityManager.stopAppSwitches did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mAm.resumeAppSwitches();
+ fail("IActivityManager.resumeAppSwitches did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+ }
+}
diff --git a/tests/permission/src/com/android/framework/permission/tests/PmPermissionsTests.java b/tests/permission/src/com/android/framework/permission/tests/PmPermissionsTests.java
new file mode 100644
index 0000000..b690c45
--- /dev/null
+++ b/tests/permission/src/com/android/framework/permission/tests/PmPermissionsTests.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2006 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.framework.permission.tests;
+
+import junit.framework.TestCase;
+import android.content.pm.PackageManager;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+/**
+ * Verify PackageManager api's that require specific permissions.
+ */
+public class PmPermissionsTests extends AndroidTestCase {
+ private PackageManager mPm;
+ private String mPkgName = "com.android.framework.permission.tests";
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mPm = getContext().getPackageManager();
+ }
+
+ /*
+ * This test verifies that PackageManger.getPackageSizeInfo enforces permission
+ * android.permission.GET_PACKAGE_SIZE
+ */
+ @SmallTest
+ public void testGetPackageSize() {
+ try {
+ mPm.getPackageSizeInfo(mPkgName, null);
+ fail("PackageManager.getPackageSizeInfo" +
+ "did not throw SecurityException as expected");
+ } catch (SecurityException e) {
+ // expected
+ }
+ }
+
+ /*
+ * This test verifies that PackageManger.DeleteApplicationCacheFiles enforces permission
+ * android.permission.DELETE_CACHE_FILES
+ */
+ @SmallTest
+ public void testDeleteApplicationCacheFiles() {
+ try {
+ mPm.deleteApplicationCacheFiles(mPkgName, null);
+ fail("PackageManager.deleteApplicationCacheFiles" +
+ "did not throw SecurityException as expected");
+ } catch (SecurityException e) {
+ // expected
+ }
+ }
+
+ /*
+ * This test verifies that PackageManger.installPackage enforces permission
+ * android.permission.INSTALL_PACKAGES
+ */
+ @SmallTest
+ public void testInstallPackage() {
+ try {
+ mPm.installPackage(null, null, 0, null);
+ fail("PackageManager.installPackage" +
+ "did not throw SecurityException as expected");
+ } catch (SecurityException e) {
+ // expected
+ }
+ }
+
+ /*
+ * This test verifies that PackageManger.freeStorage
+ * enforces permission android.permission.CLEAR_APP_CACHE
+ */
+ @SmallTest
+ public void testFreeStorage1() {
+ try {
+ mPm.freeStorage(100000, null);
+ fail("PackageManager.freeStorage " +
+ "did not throw SecurityException as expected");
+ } catch (SecurityException e) {
+ // expected
+ }
+ }
+
+ /*
+ * This test verifies that PackageManger.freeStorageAndNotify
+ * enforces permission android.permission.CLEAR_APP_CACHE
+ */
+ @SmallTest
+ public void testFreeStorage2() {
+ try {
+ mPm.freeStorageAndNotify(100000, null);
+ fail("PackageManager.freeStorageAndNotify" +
+ " did not throw SecurityException as expected");
+ } catch (SecurityException e) {
+ // expected
+ }
+ }
+
+ /*
+ * This test verifies that PackageManger.clearApplicationUserData
+ * enforces permission android.permission.CLEAR_APP_USER_DATA
+ */
+ @SmallTest
+ public void testClearApplicationUserData() {
+ try {
+ mPm.clearApplicationUserData(mPkgName, null);
+ fail("PackageManager.clearApplicationUserData" +
+ "did not throw SecurityException as expected");
+ } catch (SecurityException e) {
+ // expected
+ }
+ }
+
+ /*
+ * This test verifies that PackageManger.deletePackage
+ * enforces permission android.permission.DELETE_PACKAGES
+ */
+ @SmallTest
+ public void testDeletePackage() {
+ try {
+ mPm.deletePackage(mPkgName, null, 0);
+ fail("PackageManager.deletePackage" +
+ "did not throw SecurityException as expected");
+ } catch (SecurityException e) {
+ // expected
+ }
+ }
+}
\ No newline at end of file
diff --git a/tests/permission/src/com/android/framework/permission/tests/ServiceManagerPermissionTests.java b/tests/permission/src/com/android/framework/permission/tests/ServiceManagerPermissionTests.java
new file mode 100644
index 0000000..3f1e27e
--- /dev/null
+++ b/tests/permission/src/com/android/framework/permission/tests/ServiceManagerPermissionTests.java
@@ -0,0 +1,50 @@
+package com.android.framework.permission.tests;
+
+import com.android.internal.os.BinderInternal;
+
+import android.os.Binder;
+import android.os.IPermissionController;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.os.ServiceManagerNative;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import junit.framework.TestCase;
+
+/**
+ * TODO: Remove this. This is only a placeholder, need to implement this.
+ */
+public class ServiceManagerPermissionTests extends TestCase {
+ @SmallTest
+ public void testAddService() {
+ try {
+ // The security in the service manager is that you can't replace
+ // a service that is already published.
+ Binder binder = new Binder();
+ ServiceManager.addService("activity", binder);
+ fail("ServiceManager.addService did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ }
+ }
+
+ @SmallTest
+ public void testSetPermissionController() {
+ try {
+ IPermissionController pc = new IPermissionController.Stub() {
+ public boolean checkPermission(java.lang.String permission, int pid, int uid) {
+ return true;
+ }
+ };
+ ServiceManagerNative.asInterface(BinderInternal.getContextObject())
+ .setPermissionController(pc);
+ fail("IServiceManager.setPermissionController did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+ }
+}
diff --git a/tests/permission/src/com/android/framework/permission/tests/SettingsPermissionsTests.java b/tests/permission/src/com/android/framework/permission/tests/SettingsPermissionsTests.java
new file mode 100644
index 0000000..f55998f
--- /dev/null
+++ b/tests/permission/src/com/android/framework/permission/tests/SettingsPermissionsTests.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.framework.permission.tests;
+
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.provider.Settings;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.MediumTest;
+
+/**
+ * Verify that accessing private-API protected Settings require specific permissions.
+ */
+public class SettingsPermissionsTests extends AndroidTestCase {
+
+ private ContentResolver mContentResolver;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mContentResolver = getContext().getContentResolver();
+ }
+
+ /**
+ * Verify that writing to the GServices table in Settings provider requires permissions.
+ * <p>Tests Permission:
+ * {@link android.Manifest.permission#WRITE_GSERVICES}
+ */
+ @MediumTest
+ public void testWriteGServices() {
+ try {
+ ContentValues values = new ContentValues();
+ values.put("url", "android");
+ mContentResolver.insert(Settings.Gservices.CONTENT_URI, values);
+ fail("Write into Gservices provider did not throw SecurityException as expected.");
+ } catch (SecurityException e) {
+ // expected
+ }
+ }
+}
\ No newline at end of file
diff --git a/tests/permission/src/com/android/framework/permission/tests/WindowManagerPermissionTests.java b/tests/permission/src/com/android/framework/permission/tests/WindowManagerPermissionTests.java
new file mode 100644
index 0000000..8ab2a10
--- /dev/null
+++ b/tests/permission/src/com/android/framework/permission/tests/WindowManagerPermissionTests.java
@@ -0,0 +1,409 @@
+package com.android.framework.permission.tests;
+
+import android.content.res.Configuration;
+import android.os.Binder;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.view.IWindowManager;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+
+import junit.framework.TestCase;
+
+/**
+ * TODO: Remove this. This is only a placeholder, need to implement this.
+ */
+public class WindowManagerPermissionTests extends TestCase {
+ IWindowManager mWm;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mWm = IWindowManager.Stub.asInterface(
+ ServiceManager.getService("window"));
+ }
+
+ @SmallTest
+ public void testMANAGE_APP_TOKENS() {
+ try {
+ mWm.pauseKeyDispatching(null);
+ fail("IWindowManager.pauseKeyDispatching did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mWm.resumeKeyDispatching(null);
+ fail("IWindowManager.resumeKeyDispatching did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mWm.setEventDispatching(true);
+ fail("IWindowManager.setEventDispatching did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mWm.addWindowToken(null, 0);
+ fail("IWindowManager.addWindowToken did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mWm.removeWindowToken(null);
+ fail("IWindowManager.removeWindowToken did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mWm.addAppToken(0, null, 0, 0, false);
+ fail("IWindowManager.addAppToken did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mWm.setAppGroupId(null, 0);
+ fail("IWindowManager.setAppGroupId did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mWm.updateOrientationFromAppTokens(new Configuration(), null);
+ fail("IWindowManager.updateOrientationFromAppTokens did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mWm.setAppOrientation(null, 0);
+ mWm.addWindowToken(null, 0);
+ fail("IWindowManager.setAppOrientation did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mWm.setFocusedApp(null, false);
+ fail("IWindowManager.setFocusedApp did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mWm.prepareAppTransition(0);
+ fail("IWindowManager.prepareAppTransition did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mWm.executeAppTransition();
+ fail("IWindowManager.executeAppTransition did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mWm.setAppStartingWindow(null, "foo", 0, null, 0, 0, null, false);
+ fail("IWindowManager.setAppStartingWindow did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mWm.setAppWillBeHidden(null);
+ fail("IWindowManager.setAppWillBeHidden did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mWm.setAppVisibility(null, false);
+ fail("IWindowManager.setAppVisibility did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mWm.startAppFreezingScreen(null, 0);
+ fail("IWindowManager.startAppFreezingScreen did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mWm.stopAppFreezingScreen(null, false);
+ fail("IWindowManager.stopAppFreezingScreen did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mWm.removeAppToken(null);
+ fail("IWindowManager.removeAppToken did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mWm.moveAppToken(0, null);
+ fail("IWindowManager.moveAppToken did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mWm.moveAppTokensToTop(null);
+ fail("IWindowManager.moveAppTokensToTop did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mWm.moveAppTokensToBottom(null);
+ fail("IWindowManager.moveAppTokensToBottom did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+ }
+
+ @SmallTest
+ public void testINJECT_EVENTS() {
+ try {
+ mWm.injectKeyEvent(new KeyEvent(0, 0), false);
+ fail("IWindowManager.injectKeyEvent did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mWm.injectPointerEvent(MotionEvent.obtain(0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0), false);
+ fail("IWindowManager.injectPointerEvent did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mWm.injectTrackballEvent(MotionEvent.obtain(0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0), false);
+ fail("IWindowManager.injectTrackballEvent did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+ }
+
+ @SmallTest
+ public void testDISABLE_KEYGUARD() {
+ Binder token = new Binder();
+ try {
+ mWm.disableKeyguard(token, "foo");
+ fail("IWindowManager.disableKeyguard did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mWm.reenableKeyguard(token);
+ fail("IWindowManager.reenableKeyguard did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mWm.exitKeyguardSecurely(null);
+ fail("IWindowManager.exitKeyguardSecurely did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+ }
+
+ @SmallTest
+ public void testSET_ANIMATION_SCALE() {
+ try {
+ mWm.setAnimationScale(0, 1);
+ fail("IWindowManager.setAnimationScale did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mWm.setAnimationScales(new float[1]);
+ fail("IWindowManager.setAnimationScales did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+ }
+
+ @SmallTest
+ public void testREAD_INPUT_STATE() {
+ try {
+ mWm.getSwitchState(0);
+ fail("IWindowManager.getSwitchState did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mWm.getSwitchStateForDevice(0, 0);
+ fail("IWindowManager.getSwitchStateForDevice did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mWm.getScancodeState(0);
+ fail("IWindowManager.getScancodeState did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mWm.getScancodeStateForDevice(0, 0);
+ fail("IWindowManager.getScancodeStateForDevice did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mWm.getKeycodeState(0);
+ fail("IWindowManager.getKeycodeState did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mWm.getKeycodeStateForDevice(0, 0);
+ fail("IWindowManager.getKeycodeStateForDevice did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+ }
+
+ @SmallTest
+ public void testSET_ORIENTATION() {
+ try {
+ mWm.setRotation(0, true, 0);
+ mWm.getSwitchState(0);
+ fail("IWindowManager.setRotation did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+ }
+}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeContext.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeContext.java
index baa3d53..d0896b5 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeContext.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeContext.java
@@ -966,6 +966,12 @@
}
@Override
+ public File getSharedPrefsFile(String name) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
public SharedPreferences getSharedPreferences(String arg0, int arg1) {
// TODO Auto-generated method stub
return null;
diff --git a/vpn/java/android/net/vpn/L2tpIpsecProfile.java b/vpn/java/android/net/vpn/L2tpIpsecProfile.java
index a7e53d1..181619d 100644
--- a/vpn/java/android/net/vpn/L2tpIpsecProfile.java
+++ b/vpn/java/android/net/vpn/L2tpIpsecProfile.java
@@ -22,7 +22,9 @@
* The profile for L2TP-over-IPSec type of VPN.
* {@hide}
*/
-public class L2tpIpsecProfile extends SingleServerProfile {
+public class L2tpIpsecProfile extends VpnProfile {
+ private static final long serialVersionUID = 1L;
+
private String mUserCertificate;
private String mCaCertificate;
private String mUserkey;
diff --git a/vpn/java/android/net/vpn/L2tpProfile.java b/vpn/java/android/net/vpn/L2tpProfile.java
index ca4ef75..59d4981 100644
--- a/vpn/java/android/net/vpn/L2tpProfile.java
+++ b/vpn/java/android/net/vpn/L2tpProfile.java
@@ -20,7 +20,9 @@
* The profile for L2TP type of VPN.
* {@hide}
*/
-public class L2tpProfile extends SingleServerProfile {
+public class L2tpProfile extends VpnProfile {
+ private static final long serialVersionUID = 1L;
+
@Override
public VpnType getType() {
return VpnType.L2TP;
diff --git a/vpn/java/android/net/vpn/SingleServerProfile.java b/vpn/java/android/net/vpn/SingleServerProfile.java
deleted file mode 100644
index 59b5a7b..0000000
--- a/vpn/java/android/net/vpn/SingleServerProfile.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2007, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.vpn;
-
-import android.os.Parcel;
-
-/**
- * The profile for single-server type of VPN.
- * {@hide}
- */
-public abstract class SingleServerProfile extends VpnProfile {
- private String mServerName;
-
- public void setServerName(String name) {
- mServerName = name;
- }
-
- public String getServerName() {
- return mServerName;
- }
-
- @Override
- protected void readFromParcel(Parcel in) {
- super.readFromParcel(in);
- mServerName = in.readString();
- }
-
- @Override
- public void writeToParcel(Parcel parcel, int flags) {
- super.writeToParcel(parcel, flags);
- parcel.writeString(mServerName);
- }
-}
diff --git a/vpn/java/android/net/vpn/VpnManager.java b/vpn/java/android/net/vpn/VpnManager.java
index 6c6e52a..98795bd 100644
--- a/vpn/java/android/net/vpn/VpnManager.java
+++ b/vpn/java/android/net/vpn/VpnManager.java
@@ -48,19 +48,8 @@
private static final String PACKAGE_PREFIX =
VpnManager.class.getPackage().getName() + ".";
- /** Action to start the activity of installing a new profile. */
- public static final String ACTION_VPN_INSTALL_PROFILE =
- PACKAGE_PREFIX + "INSTALL_PROFILE";
- /**
- * Key to the installation path in the intent of installing a new profile.
- */
- public static final String KEY_INSTALLATION_PATH = "install_path";
- public static final String DEFAULT_INSTALLATION_PATH =
- "/data/local/tmp/vpn";
-
- // Action to start VPN installation monitor service
- private static final String SERVICE_VPN_INSTALL_MONITOR =
- PACKAGE_PREFIX + "INSTALLATION_MONITOR";
+ // Action to start VPN service
+ private static final String ACTION_VPN_SERVICE = PACKAGE_PREFIX + "SERVICE";
// Action to start VPN settings
private static final String ACTION_VPN_SETTINGS = PACKAGE_PREFIX + "SETTINGS";
@@ -112,53 +101,29 @@
}
}
- private String getServiceActionName(VpnType type) {
- return PACKAGE_PREFIX + type.getServiceName();
+ /**
+ * Starts the VPN service to establish VPN connection.
+ */
+ public void startVpnService() {
+ mContext.startService(new Intent(ACTION_VPN_SERVICE));
}
/**
- * Starts the VPN service of the specified type.
+ * Stops the VPN service.
*/
- public boolean startService(VpnType type) {
- String serviceAction = getServiceActionName(type);
- if (serviceAction != null) {
- Log.i(TAG, "start service: " + serviceAction);
- mContext.startService(new Intent(serviceAction));
- return true;
- } else {
- Log.w(TAG, "unknown vpn type to start service for: " + type);
- return false;
- }
+ public void stopVpnService() {
+ mContext.stopService(new Intent(ACTION_VPN_SERVICE));
}
/**
- * Stops the VPN service of the specified type.
+ * Binds the specified ServiceConnection with the VPN service.
*/
- public void stopService(VpnType type) {
- String serviceAction = getServiceActionName(type);
- if (serviceAction != null) {
- Log.i(TAG, "stop service for: " + type);
- mContext.stopService(new Intent(serviceAction));
- } else {
- Log.w(TAG, "unknown vpn type to stop service for: " + type);
- }
- }
-
- /**
- * Binds the specified ServiceConnection with the VPN service of the
- * specified type.
- */
- public boolean bindService(VpnType type, ServiceConnection c) {
- String serviceAction = getServiceActionName(type);
- if (serviceAction == null) {
- Log.w(TAG, "unknown vpn type to bind service for: " + type);
- return false;
- }
- if (!mContext.bindService(new Intent(serviceAction), c, 0)) {
- Log.w(TAG, "failed to connect to service: " + type);
+ public boolean bindVpnService(ServiceConnection c) {
+ if (!mContext.bindService(new Intent(ACTION_VPN_SERVICE), c, 0)) {
+ Log.w(TAG, "failed to connect to VPN service");
return false;
} else {
- Log.v(TAG, "succeeded to connect to service: " + type);
+ Log.d(TAG, "succeeded to connect to VPN service");
return true;
}
}
@@ -181,21 +146,6 @@
mContext.unregisterReceiver(r);
}
- /**
- * Starts the installation monitor service.
- * The service monitors the default installtion path (under /data/local/tmp)
- * and automatically starts the activity to create a new profile when new
- * configuration files appear in that path.
- */
- public void startInstallationMonitorService() {
- mContext.startService(new Intent(SERVICE_VPN_INSTALL_MONITOR));
- }
-
- /** Stops the installation monitor service. */
- public void stopInstallationMonitorService() {
- mContext.stopService(new Intent(SERVICE_VPN_INSTALL_MONITOR));
- }
-
/** Starts the VPN settings activity. */
public void startSettingsActivity() {
Intent intent = new Intent(ACTION_VPN_SETTINGS);
@@ -203,14 +153,10 @@
mContext.startActivity(intent);
}
- /**
- * Starts the activity to install a customized profile.
- * @param installPath the path where all the configuration files are located
- */
- public void startInstallProfileActivity(String installPath) {
- Intent intent = new Intent(ACTION_VPN_INSTALL_PROFILE);
- intent.putExtra(KEY_INSTALLATION_PATH, installPath);
+ /** Creates an intent to start the VPN settings activity. */
+ public Intent createSettingsActivityIntent() {
+ Intent intent = new Intent(ACTION_VPN_SETTINGS);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- mContext.startActivity(intent);
+ return intent;
}
}
diff --git a/vpn/java/android/net/vpn/VpnProfile.java b/vpn/java/android/net/vpn/VpnProfile.java
index 7cf2608..9e24da4 100644
--- a/vpn/java/android/net/vpn/VpnProfile.java
+++ b/vpn/java/android/net/vpn/VpnProfile.java
@@ -27,11 +27,14 @@
* A VPN profile.
* {@hide}
*/
-public abstract class VpnProfile implements Parcelable {
+public abstract class VpnProfile implements Parcelable, Serializable {
+ private static final long serialVersionUID = 1L;
private String mName; // unique display name
private String mId; // unique identifier
+ private String mServerName; // VPN server name
private String mDomainSuffices; // space separated list
private String mRouteList; // space separated list
+ private String mSavedUsername;
private boolean mIsCustomized;
private transient VpnState mState = VpnState.IDLE;
@@ -57,6 +60,17 @@
}
/**
+ * Sets the name of the VPN server. Used for DNS lookup.
+ */
+ public void setServerName(String name) {
+ mServerName = name;
+ }
+
+ public String getServerName() {
+ return mServerName;
+ }
+
+ /**
* Sets the domain suffices for DNS resolution.
*
* @param entries a comma-separated list of domain suffices
@@ -83,6 +97,14 @@
return mRouteList;
}
+ public void setSavedUsername(String name) {
+ mSavedUsername = name;
+ }
+
+ public String getSavedUsername() {
+ return mSavedUsername;
+ }
+
public void setState(VpnState state) {
mState = state;
}
@@ -115,8 +137,10 @@
protected void readFromParcel(Parcel in) {
mName = in.readString();
mId = in.readString();
+ mServerName = in.readString();
mDomainSuffices = in.readString();
mRouteList = in.readString();
+ mSavedUsername = in.readString();
}
public static final Parcelable.Creator<VpnProfile> CREATOR =
@@ -141,8 +165,10 @@
parcel.writeInt(mIsCustomized ? 1 : 0);
parcel.writeString(mName);
parcel.writeString(mId);
+ parcel.writeString(mServerName);
parcel.writeString(mDomainSuffices);
parcel.writeString(mRouteList);
+ parcel.writeString(mSavedUsername);
}
public int describeContents() {
diff --git a/vpn/java/android/net/vpn/VpnState.java b/vpn/java/android/net/vpn/VpnState.java
index 78117e0..977d938 100644
--- a/vpn/java/android/net/vpn/VpnState.java
+++ b/vpn/java/android/net/vpn/VpnState.java
@@ -24,8 +24,10 @@
* {@link CONNECTED} if successful; back to {@link IDLE} if failed.
* When the connection is about to be torn down, it goes to
* {@link DISCONNECTING} and then {@link IDLE}.
+ * {@link CANCELLED} is a state when a VPN connection attempt is aborted, and
+ * is in transition to {@link IDLE}.
* {@hide}
*/
public enum VpnState {
- CONNECTING, DISCONNECTING, CONNECTED, IDLE
+ CONNECTING, DISCONNECTING, CANCELLED, CONNECTED, IDLE
}
diff --git a/vpn/java/android/net/vpn/VpnType.java b/vpn/java/android/net/vpn/VpnType.java
index dcf2078..91b0ea2 100644
--- a/vpn/java/android/net/vpn/VpnType.java
+++ b/vpn/java/android/net/vpn/VpnType.java
@@ -39,8 +39,4 @@
public Class<? extends VpnProfile> getProfileClass() {
return mClass;
}
-
- public String getServiceName() {
- return this.toString();
- }
}