Merge "Improve constant names for settings injection API" into klp-dev
diff --git a/api/current.txt b/api/current.txt
index 2989383..458c577 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -289,6 +289,7 @@
     field public static final deprecated int animationResolution = 16843546; // 0x101031a
     field public static final int antialias = 16843034; // 0x101011a
     field public static final int anyDensity = 16843372; // 0x101026c
+    field public static final int apduServiceBanner = 16843755; // 0x10103eb
     field public static final int apiKey = 16843281; // 0x1010211
     field public static final int author = 16843444; // 0x10102b4
     field public static final int authorities = 16842776; // 0x1010018
@@ -5736,7 +5737,6 @@
     method public final android.os.Bundle call(android.net.Uri, java.lang.String, java.lang.String, android.os.Bundle);
     method public deprecated void cancelSync(android.net.Uri);
     method public static void cancelSync(android.accounts.Account, java.lang.String);
-    method public static void cancelSync(android.content.SyncRequest);
     method public final int delete(android.net.Uri, java.lang.String, java.lang.String[]);
     method public static deprecated android.content.SyncInfo getCurrentSync();
     method public static java.util.List<android.content.SyncInfo> getCurrentSyncs();
@@ -5957,6 +5957,7 @@
     field public static final int BIND_WAIVE_PRIORITY = 32; // 0x20
     field public static final java.lang.String BLUETOOTH_SERVICE = "bluetooth";
     field public static final java.lang.String CAMERA_SERVICE = "camera";
+    field public static final java.lang.String CAPTIONING_SERVICE = "captioning";
     field public static final java.lang.String CLIPBOARD_SERVICE = "clipboard";
     field public static final java.lang.String CONNECTIVITY_SERVICE = "connectivity";
     field public static final int CONTEXT_IGNORE_SECURITY = 2; // 0x2
@@ -6715,9 +6716,7 @@
     field public final android.accounts.Account account;
     field public final java.lang.String authority;
     field public final android.os.Bundle extras;
-    field public final boolean isService;
     field public final long period;
-    field public final android.content.ComponentName service;
   }
 
   public class ReceiverCallNotAllowedException extends android.util.AndroidRuntimeException {
@@ -6838,7 +6837,6 @@
 
   public class SyncRequest implements android.os.Parcelable {
     method public int describeContents();
-    method public boolean isExpedited();
     method public void writeToParcel(android.os.Parcel, int);
     field public static final android.os.Parcelable.Creator CREATOR;
   }
@@ -6846,18 +6844,15 @@
   public static class SyncRequest.Builder {
     ctor public SyncRequest.Builder();
     method public android.content.SyncRequest build();
-    method public android.content.SyncRequest.Builder setAllowMetered(boolean);
+    method public android.content.SyncRequest.Builder setDisallowMetered(boolean);
     method public android.content.SyncRequest.Builder setExpedited(boolean);
     method public android.content.SyncRequest.Builder setExtras(android.os.Bundle);
     method public android.content.SyncRequest.Builder setIgnoreBackoff(boolean);
     method public android.content.SyncRequest.Builder setIgnoreSettings(boolean);
     method public android.content.SyncRequest.Builder setManual(boolean);
     method public android.content.SyncRequest.Builder setNoRetry(boolean);
-    method public android.content.SyncRequest.Builder setPriority(int);
     method public android.content.SyncRequest.Builder setSyncAdapter(android.accounts.Account, java.lang.String);
-    method public android.content.SyncRequest.Builder setSyncAdapter(android.content.ComponentName);
-    method public android.content.SyncRequest.Builder setTransferSize(long, long);
-    method public android.content.SyncRequest.Builder syncOnce(long, long);
+    method public android.content.SyncRequest.Builder syncOnce();
     method public android.content.SyncRequest.Builder syncPeriodic(long, long);
   }
 
@@ -6884,12 +6879,6 @@
     field public boolean tooManyRetries;
   }
 
-  public abstract class SyncService extends android.app.Service {
-    ctor public SyncService();
-    method public android.os.IBinder onBind(android.content.Intent);
-    method public abstract void onPerformSync(android.os.Bundle, android.content.SyncResult);
-  }
-
   public class SyncStats implements android.os.Parcelable {
     ctor public SyncStats();
     ctor public SyncStats(android.os.Parcel);
@@ -13200,6 +13189,7 @@
     ctor public RemoteControlClient(android.app.PendingIntent);
     ctor public RemoteControlClient(android.app.PendingIntent, android.os.Looper);
     method public android.media.RemoteControlClient.MetadataEditor editMetadata(boolean);
+    method public void setMetadataUpdateListener(android.media.RemoteControlClient.OnMetadataUpdateListener);
     method public void setOnGetPlaybackPositionListener(android.media.RemoteControlClient.OnGetPlaybackPositionListener);
     method public void setPlaybackPositionUpdateListener(android.media.RemoteControlClient.OnPlaybackPositionUpdateListener);
     method public void setPlaybackState(int);
@@ -13212,6 +13202,7 @@
     field public static final int FLAG_KEY_MEDIA_PLAY_PAUSE = 8; // 0x8
     field public static final int FLAG_KEY_MEDIA_POSITION_UPDATE = 256; // 0x100
     field public static final int FLAG_KEY_MEDIA_PREVIOUS = 1; // 0x1
+    field public static final int FLAG_KEY_MEDIA_RATING = 512; // 0x200
     field public static final int FLAG_KEY_MEDIA_REWIND = 2; // 0x2
     field public static final int FLAG_KEY_MEDIA_STOP = 32; // 0x20
     field public static final int PLAYSTATE_BUFFERING = 8; // 0x8
@@ -13226,18 +13217,32 @@
   }
 
   public class RemoteControlClient.MetadataEditor {
+    method public synchronized void addEditableKey(int);
     method public synchronized void apply();
     method public synchronized void clear();
+    method public synchronized void clearEditableKeys();
     method public synchronized android.media.RemoteControlClient.MetadataEditor putBitmap(int, android.graphics.Bitmap) throws java.lang.IllegalArgumentException;
     method public synchronized android.media.RemoteControlClient.MetadataEditor putLong(int, long) throws java.lang.IllegalArgumentException;
     method public synchronized android.media.RemoteControlClient.MetadataEditor putString(int, java.lang.String) throws java.lang.IllegalArgumentException;
     field public static final int BITMAP_KEY_ARTWORK = 100; // 0x64
+    field public static final int LONG_KEY_RATING_BY_OTHERS = 102; // 0x66
+    field public static final int LONG_KEY_RATING_BY_USER = 268435457; // 0x10000001
+    field public static final int LONG_KEY_RATING_TYPE = 101; // 0x65
+    field public static final long RATING_HEART = -1L; // 0xffffffffffffffffL
+    field public static final long RATING_NOT_RATED = -101L; // 0xffffffffffffff9bL
+    field public static final long RATING_THUMB_UP_DOWN = -2L; // 0xfffffffffffffffeL
   }
 
   public static abstract interface RemoteControlClient.OnGetPlaybackPositionListener {
     method public abstract long onGetPlaybackPosition();
   }
 
+  public static abstract interface RemoteControlClient.OnMetadataUpdateListener {
+    method public abstract void onMetadataUpdateBitmap(int, android.graphics.Bitmap);
+    method public abstract void onMetadataUpdateLong(int, long);
+    method public abstract void onMetadataUpdateString(int, java.lang.String);
+  }
+
   public static abstract interface RemoteControlClient.OnPlaybackPositionUpdateListener {
     method public abstract void onPlaybackPositionUpdate(long);
   }
@@ -15261,12 +15266,12 @@
 
 package android.nfc.cardemulation {
 
-  public final class CardEmulationManager {
-    method public static synchronized android.nfc.cardemulation.CardEmulationManager getInstance(android.nfc.NfcAdapter);
+  public final class CardEmulation {
+    method public static synchronized android.nfc.cardemulation.CardEmulation getInstance(android.nfc.NfcAdapter);
     method public int getSelectionModeForCategory(java.lang.String);
     method public boolean isDefaultServiceForAid(android.content.ComponentName, java.lang.String);
     method public boolean isDefaultServiceForCategory(android.content.ComponentName, java.lang.String);
-    field public static final java.lang.String ACTION_CHANGE_DEFAULT = "android.nfc.cardemulation.ACTION_CHANGE_DEFAULT";
+    field public static final java.lang.String ACTION_CHANGE_DEFAULT = "android.nfc.cardemulation.action.ACTION_CHANGE_DEFAULT";
     field public static final java.lang.String CATEGORY_OTHER = "other";
     field public static final java.lang.String CATEGORY_PAYMENT = "payment";
     field public static final java.lang.String EXTRA_CATEGORY = "category";
@@ -15282,19 +15287,18 @@
     method public final android.os.IBinder onBind(android.content.Intent);
     method public abstract void onDeactivated(int);
     method public byte[] processCommandApdu(byte[], android.os.Bundle);
-    method public abstract deprecated byte[] processCommandApdu(byte[], int);
     method public final void sendResponseApdu(byte[]);
     field public static final int DEACTIVATION_DESELECTED = 1; // 0x1
     field public static final int DEACTIVATION_LINK_LOSS = 0; // 0x0
-    field public static final java.lang.String SERVICE_INTERFACE = "android.nfc.HostApduService";
-    field public static final java.lang.String SERVICE_META_DATA = "android.nfc.HostApduService";
+    field public static final java.lang.String SERVICE_INTERFACE = "android.nfc.cardemulation.action.HOST_APDU_SERVICE";
+    field public static final java.lang.String SERVICE_META_DATA = "android.nfc.cardemulation.host_apdu_service";
   }
 
   public abstract class OffHostApduService extends android.app.Service {
     ctor public OffHostApduService();
     method public abstract android.os.IBinder onBind(android.content.Intent);
-    field public static final java.lang.String SERVICE_INTERFACE = "android.nfc.OffHostApduService";
-    field public static final java.lang.String SERVICE_META_DATA = "android.nfc.OffHostApduService";
+    field public static final java.lang.String SERVICE_INTERFACE = "android.nfc.cardemulation.action.OFF_HOST_APDU_SERVICE";
+    field public static final java.lang.String SERVICE_META_DATA = "android.nfc.cardemulation.off_host_apdu_service";
   }
 
 }
@@ -20828,67 +20832,70 @@
   }
 
   public final class DocumentsContract {
+    method public static android.net.Uri buildChildDocumentsUri(java.lang.String, java.lang.String);
     method public static android.net.Uri buildDocumentUri(java.lang.String, java.lang.String);
-    method public static java.lang.String getDocId(android.net.Uri);
+    method public static android.net.Uri buildRecentDocumentsUri(java.lang.String, java.lang.String);
+    method public static android.net.Uri buildRootsUri(java.lang.String);
+    method public static android.net.Uri buildSearchDocumentsUri(java.lang.String, java.lang.String, java.lang.String);
+    method public static android.net.Uri createDocument(android.content.ContentResolver, android.net.Uri, java.lang.String, java.lang.String);
+    method public static boolean deleteDocument(android.content.ContentResolver, android.net.Uri);
+    method public static java.lang.String getDocumentId(android.net.Uri);
+    method public static android.graphics.Bitmap getDocumentThumbnail(android.content.ContentResolver, android.net.Uri, android.graphics.Point, android.os.CancellationSignal);
     method public static android.net.Uri[] getOpenDocuments(android.content.Context);
+    method public static java.lang.String getRootId(android.net.Uri);
+    method public static java.lang.String getSearchDocumentsQuery(android.net.Uri);
     field public static final java.lang.String EXTRA_ERROR = "error";
     field public static final java.lang.String EXTRA_INFO = "info";
     field public static final java.lang.String EXTRA_LOADING = "loading";
   }
 
-  public static abstract interface DocumentsContract.DocumentColumns implements android.provider.OpenableColumns {
-    field public static final java.lang.String DOC_ID = "doc_id";
-    field public static final java.lang.String FLAGS = "flags";
-    field public static final java.lang.String ICON = "icon";
-    field public static final java.lang.String LAST_MODIFIED = "last_modified";
-    field public static final java.lang.String MIME_TYPE = "mime_type";
-    field public static final java.lang.String SUMMARY = "summary";
+  public static final class DocumentsContract.Document {
+    field public static final java.lang.String COLUMN_DISPLAY_NAME = "_display_name";
+    field public static final java.lang.String COLUMN_DOCUMENT_ID = "document_id";
+    field public static final java.lang.String COLUMN_FLAGS = "flags";
+    field public static final java.lang.String COLUMN_ICON = "icon";
+    field public static final java.lang.String COLUMN_LAST_MODIFIED = "last_modified";
+    field public static final java.lang.String COLUMN_MIME_TYPE = "mime_type";
+    field public static final java.lang.String COLUMN_SIZE = "_size";
+    field public static final java.lang.String COLUMN_SUMMARY = "summary";
+    field public static final int FLAG_DIR_PREFERS_GRID = 32; // 0x20
+    field public static final int FLAG_DIR_SUPPORTS_CREATE = 8; // 0x8
+    field public static final int FLAG_DIR_SUPPORTS_SEARCH = 16; // 0x10
+    field public static final int FLAG_SUPPORTS_DELETE = 4; // 0x4
+    field public static final int FLAG_SUPPORTS_THUMBNAIL = 1; // 0x1
+    field public static final int FLAG_SUPPORTS_WRITE = 2; // 0x2
+    field public static final java.lang.String MIME_TYPE_DIR = "vnd.android.document/directory";
   }
 
-  public static final class DocumentsContract.DocumentRoot implements android.os.Parcelable {
-    ctor public DocumentsContract.DocumentRoot();
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator CREATOR;
+  public static final class DocumentsContract.Root {
+    field public static final java.lang.String COLUMN_AVAILABLE_BYTES = "available_bytes";
+    field public static final java.lang.String COLUMN_DOCUMENT_ID = "document_id";
+    field public static final java.lang.String COLUMN_FLAGS = "flags";
+    field public static final java.lang.String COLUMN_ICON = "icon";
+    field public static final java.lang.String COLUMN_ROOT_ID = "root_id";
+    field public static final java.lang.String COLUMN_ROOT_TYPE = "root_type";
+    field public static final java.lang.String COLUMN_SUMMARY = "summary";
+    field public static final java.lang.String COLUMN_TITLE = "title";
+    field public static final int FLAG_ADVANCED = 4; // 0x4
     field public static final int FLAG_LOCAL_ONLY = 2; // 0x2
+    field public static final int FLAG_PROVIDES_AUDIO = 8; // 0x8
+    field public static final int FLAG_PROVIDES_IMAGES = 32; // 0x20
+    field public static final int FLAG_PROVIDES_VIDEO = 16; // 0x10
     field public static final int FLAG_SUPPORTS_CREATE = 1; // 0x1
+    field public static final int FLAG_SUPPORTS_RECENTS = 64; // 0x40
     field public static final int ROOT_TYPE_DEVICE = 3; // 0x3
-    field public static final int ROOT_TYPE_DEVICE_ADVANCED = 4; // 0x4
     field public static final int ROOT_TYPE_SERVICE = 1; // 0x1
     field public static final int ROOT_TYPE_SHORTCUT = 2; // 0x2
-    field public long availableBytes;
-    field public java.lang.String docId;
-    field public int flags;
-    field public int icon;
-    field public java.lang.String[] mimeTypes;
-    field public java.lang.String recentDocId;
-    field public int rootType;
-    field public java.lang.String summary;
-    field public java.lang.String title;
-  }
-
-  public static final class DocumentsContract.Documents {
-    field public static final int FLAG_PREFERS_GRID = 64; // 0x40
-    field public static final int FLAG_SUPPORTS_CREATE = 1; // 0x1
-    field public static final int FLAG_SUPPORTS_DELETE = 4; // 0x4
-    field public static final int FLAG_SUPPORTS_RENAME = 2; // 0x2
-    field public static final int FLAG_SUPPORTS_SEARCH = 16; // 0x10
-    field public static final int FLAG_SUPPORTS_THUMBNAIL = 8; // 0x8
-    field public static final int FLAG_SUPPORTS_WRITE = 32; // 0x20
-    field public static final java.lang.String MIME_TYPE_DIR = "vnd.android.doc/dir";
   }
 
   public abstract class DocumentsProvider extends android.content.ContentProvider {
     ctor public DocumentsProvider();
-    method public final android.os.Bundle callFromPackage(java.lang.String, java.lang.String, java.lang.String, android.os.Bundle);
     method public java.lang.String createDocument(java.lang.String, java.lang.String, java.lang.String) throws java.io.FileNotFoundException;
     method public final int delete(android.net.Uri, java.lang.String, java.lang.String[]);
     method public void deleteDocument(java.lang.String) throws java.io.FileNotFoundException;
-    method public abstract java.util.List<android.provider.DocumentsContract.DocumentRoot> getDocumentRoots();
-    method public java.lang.String getType(java.lang.String) throws java.io.FileNotFoundException;
+    method public java.lang.String getDocumentType(java.lang.String) throws java.io.FileNotFoundException;
     method public final java.lang.String getType(android.net.Uri);
     method public final android.net.Uri insert(android.net.Uri, android.content.ContentValues);
-    method public void notifyDocumentRootsChanged();
     method public abstract android.os.ParcelFileDescriptor openDocument(java.lang.String, java.lang.String, android.os.CancellationSignal) throws java.io.FileNotFoundException;
     method public android.content.res.AssetFileDescriptor openDocumentThumbnail(java.lang.String, android.graphics.Point, android.os.CancellationSignal) throws java.io.FileNotFoundException;
     method public final android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException;
@@ -20896,10 +20903,11 @@
     method public final android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle) throws java.io.FileNotFoundException;
     method public final android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal) throws java.io.FileNotFoundException;
     method public final android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
-    method public abstract android.database.Cursor queryDocument(java.lang.String) throws java.io.FileNotFoundException;
-    method public abstract android.database.Cursor queryDocumentChildren(java.lang.String) throws java.io.FileNotFoundException;
-    method public android.database.Cursor querySearch(java.lang.String, java.lang.String) throws java.io.FileNotFoundException;
-    method public void renameDocument(java.lang.String, java.lang.String) throws java.io.FileNotFoundException;
+    method public abstract android.database.Cursor queryChildDocuments(java.lang.String, java.lang.String[], java.lang.String) throws java.io.FileNotFoundException;
+    method public abstract android.database.Cursor queryDocument(java.lang.String, java.lang.String[]) throws java.io.FileNotFoundException;
+    method public android.database.Cursor queryRecentDocuments(java.lang.String, java.lang.String[]) throws java.io.FileNotFoundException;
+    method public abstract android.database.Cursor queryRoots(java.lang.String[]) throws java.io.FileNotFoundException;
+    method public android.database.Cursor querySearchDocuments(java.lang.String, java.lang.String, java.lang.String[]) throws java.io.FileNotFoundException;
     method public final int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
   }
 
@@ -21254,6 +21262,7 @@
     field public static final java.lang.String ACTION_APPLICATION_DEVELOPMENT_SETTINGS = "android.settings.APPLICATION_DEVELOPMENT_SETTINGS";
     field public static final java.lang.String ACTION_APPLICATION_SETTINGS = "android.settings.APPLICATION_SETTINGS";
     field public static final java.lang.String ACTION_BLUETOOTH_SETTINGS = "android.settings.BLUETOOTH_SETTINGS";
+    field public static final java.lang.String ACTION_CAPTIONING_SETTINGS = "android.settings.CAPTIONING_SETTINGS";
     field public static final java.lang.String ACTION_DATA_ROAMING_SETTINGS = "android.settings.DATA_ROAMING_SETTINGS";
     field public static final java.lang.String ACTION_DATE_SETTINGS = "android.settings.DATE_SETTINGS";
     field public static final java.lang.String ACTION_DEVICE_INFO_SETTINGS = "android.settings.DEVICE_INFO_SETTINGS";
@@ -22585,8 +22594,11 @@
   }
 
   public final class KeyPairGeneratorSpec implements java.security.spec.AlgorithmParameterSpec {
+    method public java.security.spec.AlgorithmParameterSpec getAlgorithmParameterSpec();
     method public android.content.Context getContext();
     method public java.util.Date getEndDate();
+    method public int getKeySize();
+    method public java.lang.String getKeyType();
     method public java.lang.String getKeystoreAlias();
     method public java.math.BigInteger getSerialNumber();
     method public java.util.Date getStartDate();
@@ -22597,9 +22609,12 @@
   public static final class KeyPairGeneratorSpec.Builder {
     ctor public KeyPairGeneratorSpec.Builder(android.content.Context);
     method public android.security.KeyPairGeneratorSpec build();
+    method public android.security.KeyPairGeneratorSpec.Builder setAlgorithmParameterSpec(java.security.spec.AlgorithmParameterSpec);
     method public android.security.KeyPairGeneratorSpec.Builder setAlias(java.lang.String);
     method public android.security.KeyPairGeneratorSpec.Builder setEncryptionRequired();
     method public android.security.KeyPairGeneratorSpec.Builder setEndDate(java.util.Date);
+    method public android.security.KeyPairGeneratorSpec.Builder setKeySize(int);
+    method public android.security.KeyPairGeneratorSpec.Builder setKeyType(java.lang.String) throws java.security.NoSuchAlgorithmException;
     method public android.security.KeyPairGeneratorSpec.Builder setSerialNumber(java.math.BigInteger);
     method public android.security.KeyPairGeneratorSpec.Builder setStartDate(java.util.Date);
     method public android.security.KeyPairGeneratorSpec.Builder setSubject(javax.security.auth.x500.X500Principal);
@@ -25749,7 +25764,7 @@
     method public android.util.JsonWriter value(java.lang.Number) throws java.io.IOException;
   }
 
-  public abstract interface LayoutDirection {
+  public final class LayoutDirection {
     field public static final int INHERIT = 2; // 0x2
     field public static final int LOCALE = 3; // 0x3
     field public static final int LTR = 0; // 0x0
@@ -27148,6 +27163,7 @@
 
   public class ScaleGestureDetector {
     ctor public ScaleGestureDetector(android.content.Context, android.view.ScaleGestureDetector.OnScaleGestureListener);
+    ctor public ScaleGestureDetector(android.content.Context, android.view.ScaleGestureDetector.OnScaleGestureListener, android.os.Handler);
     method public float getCurrentSpan();
     method public float getCurrentSpanX();
     method public float getCurrentSpanY();
@@ -27161,6 +27177,7 @@
     method public long getTimeDelta();
     method public boolean isInProgress();
     method public boolean onTouchEvent(android.view.MotionEvent);
+    method public void setQuickScaleEnabled(boolean);
   }
 
   public static abstract interface ScaleGestureDetector.OnScaleGestureListener {
@@ -28964,15 +28981,15 @@
   }
 
   public class CaptioningManager {
-    ctor public CaptioningManager();
-    method public static final float getFontSize(android.content.ContentResolver);
-    method public static final java.util.Locale getLocale(android.content.ContentResolver);
-    method public static final boolean isEnabled(android.content.ContentResolver);
-    field public static final java.lang.String ACTION_CAPTIONING_SETTINGS = "android.settings.CAPTIONING_SETTINGS";
+    method public void addCaptioningStateChangeListener(android.view.accessibility.CaptioningManager.CaptioningChangeListener);
+    method public final float getFontScale();
+    method public final java.util.Locale getLocale();
+    method public android.view.accessibility.CaptioningManager.CaptionStyle getUserStyle();
+    method public final boolean isEnabled();
+    method public void removeCaptioningStateChangeListener(android.view.accessibility.CaptioningManager.CaptioningChangeListener);
   }
 
   public static final class CaptioningManager.CaptionStyle {
-    method public static android.view.accessibility.CaptioningManager.CaptionStyle defaultUserStyle(android.content.ContentResolver);
     method public android.graphics.Typeface getTypeface();
     field public static final int EDGE_TYPE_DROP_SHADOW = 2; // 0x2
     field public static final int EDGE_TYPE_NONE = 0; // 0x0
@@ -28983,6 +29000,14 @@
     field public final int foregroundColor;
   }
 
+  public abstract class CaptioningManager.CaptioningChangeListener {
+    ctor public CaptioningManager.CaptioningChangeListener();
+    method public void onEnabledChanged(boolean);
+    method public void onFontScaleChanged(float);
+    method public void onLocaleChanged(java.util.Locale);
+    method public void onUserStyleChanged(android.view.accessibility.CaptioningManager.CaptionStyle);
+  }
+
 }
 
 package android.view.animation {
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index cdec399..f10290d 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -105,6 +105,7 @@
 import android.view.Display;
 import android.view.WindowManagerImpl;
 import android.view.accessibility.AccessibilityManager;
+import android.view.accessibility.CaptioningManager;
 import android.view.inputmethod.InputMethodManager;
 import android.view.textservice.TextServicesManager;
 import android.accounts.AccountManager;
@@ -307,6 +308,11 @@
                     return AccessibilityManager.getInstance(ctx);
                 }});
 
+        registerService(CAPTIONING_SERVICE, new ServiceFetcher() {
+                public Object getService(ContextImpl ctx) {
+                    return new CaptioningManager(ctx);
+                }});
+
         registerService(ACCOUNT_SERVICE, new ServiceFetcher() {
                 public Object createService(ContextImpl ctx) {
                     IBinder b = ServiceManager.getService(ACCOUNT_SERVICE);
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index a761a89..8a5a56c 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -141,7 +141,7 @@
     public static final String SYNC_EXTRAS_PRIORITY = "sync_priority";
 
     /** {@hide} Flag to allow sync to occur on metered network. */
-    public static final String SYNC_EXTRAS_ALLOW_METERED = "allow_metered";
+    public static final String SYNC_EXTRAS_DISALLOW_METERED = "disallow_metered";
 
     /**
      * Set by the SyncManager to request that the SyncAdapter initialize itself for
@@ -1669,7 +1669,7 @@
             new SyncRequest.Builder()
                 .setSyncAdapter(account, authority)
                 .setExtras(extras)
-                .syncOnce(0, 0)     // Immediate sync.
+                .syncOnce()
                 .build();
         requestSync(request);
     }
@@ -1677,6 +1677,9 @@
     /**
      * Register a sync with the SyncManager. These requests are built using the
      * {@link SyncRequest.Builder}.
+     *
+     * @param request The immutable SyncRequest object containing the sync parameters. Use
+     * {@link SyncRequest.Builder} to construct these.
      */
     public static void requestSync(SyncRequest request) {
         try {
@@ -1812,6 +1815,9 @@
      * {@link #SYNC_EXTRAS_INITIALIZE}, {@link #SYNC_EXTRAS_FORCE},
      * {@link #SYNC_EXTRAS_EXPEDITED}, {@link #SYNC_EXTRAS_MANUAL} set to true.
      * If any are supplied then an {@link IllegalArgumentException} will be thrown.
+     * <p>As of API level 19 this function introduces a default flexibility of ~4% (up to a maximum
+     * of one hour in the day) into the requested period. Use
+     * {@link SyncRequest.Builder#syncPeriodic(long, long)} to set this flexibility manually.
      *
      * <p>This method requires the caller to hold the permission
      * {@link android.Manifest.permission#WRITE_SYNC_SETTINGS}.
@@ -1875,22 +1881,6 @@
     }
 
     /**
-     * Remove the specified sync. This will remove any syncs that have been scheduled to run, but
-     * will not cancel any running syncs.
-     * <p>This method requires the caller to hold the permission</p>
-     * If the request is for a periodic sync this will cancel future occurrences of the sync.
-     *
-     * It is possible to cancel a sync using a SyncRequest object that is different from the object
-     * with which you requested the sync. Do so by building a SyncRequest with exactly the same
-     * service/adapter, frequency, <b>and</b> extras bundle.
-     *
-     * @param request SyncRequest object containing information about sync to cancel.
-     */
-    public static void cancelSync(SyncRequest request) {
-        // TODO: Finish this implementation.
-    }
-
-    /**
      * Get the list of information about the periodic syncs for the given account and authority.
      * <p>This method requires the caller to hold the permission
      * {@link android.Manifest.permission#READ_SYNC_SETTINGS}.
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index cd1f87b..2ff9182 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -2011,6 +2011,17 @@
 
     /**
      * Use with {@link #getSystemService} to retrieve a
+     * {@link android.view.accessibility.CaptioningManager} for obtaining
+     * captioning properties and listening for changes in captioning
+     * preferences.
+     *
+     * @see #getSystemService
+     * @see android.view.accessibility.CaptioningManager
+     */
+    public static final String CAPTIONING_SERVICE = "captioning";
+
+    /**
+     * Use with {@link #getSystemService} to retrieve a
      * {@link android.app.NotificationManager} for controlling keyguard.
      *
      * @see #getSystemService
diff --git a/core/java/android/content/PeriodicSync.java b/core/java/android/content/PeriodicSync.java
index 6aca151..b586eec 100644
--- a/core/java/android/content/PeriodicSync.java
+++ b/core/java/android/content/PeriodicSync.java
@@ -29,17 +29,13 @@
     public final Account account;
     /** The authority of the sync. Can be null. */
     public final String authority;
-    /** The service for syncing, if this is an anonymous sync. Can be null.*/
-    public final ComponentName service;
     /** Any extras that parameters that are to be passed to the sync adapter. */
     public final Bundle extras;
     /** How frequently the sync should be scheduled, in seconds. Kept around for API purposes. */
     public final long period;
-    /** Whether this periodic sync uses a service. */
-    public final boolean isService;
     /**
-     * How much flexibility can be taken in scheduling the sync, in seconds.
      * {@hide}
+     * How much flexibility can be taken in scheduling the sync, in seconds.
      */
     public final long flexTime;
 
@@ -52,76 +48,44 @@
     public PeriodicSync(Account account, String authority, Bundle extras, long periodInSeconds) {
         this.account = account;
         this.authority = authority;
-        this.service = null;
-        this.isService = false;
         if (extras == null) {
             this.extras = new Bundle();
         } else {
             this.extras = new Bundle(extras);
         }
         this.period = periodInSeconds;
-        // Old API uses default flex time. No-one should be using this ctor anyway.
+        // Initialise to a sane value.
         this.flexTime = 0L;
     }
 
-    // TODO: Add copy ctor from SyncRequest?
-
     /**
-     * Create a copy of a periodic sync.
      * {@hide}
+     * Create a copy of a periodic sync.
      */
     public PeriodicSync(PeriodicSync other) {
         this.account = other.account;
         this.authority = other.authority;
-        this.service = other.service;
-        this.isService = other.isService;
         this.extras = new Bundle(other.extras);
         this.period = other.period;
         this.flexTime = other.flexTime;
     }
 
     /**
-     * A PeriodicSync for a sync with a specified provider.
      * {@hide}
+     * A PeriodicSync for a sync with a specified provider.
      */
     public PeriodicSync(Account account, String authority, Bundle extras,
             long period, long flexTime) {
         this.account = account;
         this.authority = authority;
-        this.service = null;
-        this.isService = false;
-        this.extras = new Bundle(extras);
-        this.period = period;
-        this.flexTime = flexTime;
-    }
-
-    /**
-     * A PeriodicSync for a sync with a specified SyncService.
-     * {@hide}
-     */
-    public PeriodicSync(ComponentName service, Bundle extras,
-            long period,
-            long flexTime) {
-        this.account = null;
-        this.authority = null;
-        this.service = service;
-        this.isService = true;
         this.extras = new Bundle(extras);
         this.period = period;
         this.flexTime = flexTime;
     }
 
     private PeriodicSync(Parcel in) {
-        this.isService = (in.readInt() != 0);
-        if (this.isService) {
-            this.service = in.readParcelable(null);
-            this.account = null;
-            this.authority = null;
-        } else {
-            this.account = in.readParcelable(null);
-            this.authority = in.readString();
-            this.service = null;
-        }
+        this.account = in.readParcelable(null);
+        this.authority = in.readString();
         this.extras = in.readBundle();
         this.period = in.readLong();
         this.flexTime = in.readLong();
@@ -134,13 +98,8 @@
 
     @Override
     public void writeToParcel(Parcel dest, int flags) {
-        dest.writeInt(isService ? 1 : 0);
-        if (account == null && authority == null) {
-            dest.writeParcelable(service, flags);
-        } else {
-            dest.writeParcelable(account, flags);
-            dest.writeString(authority);
-        }
+        dest.writeParcelable(account, flags);
+        dest.writeString(authority);
         dest.writeBundle(extras);
         dest.writeLong(period);
         dest.writeLong(flexTime);
@@ -167,17 +126,8 @@
             return false;
         }
         final PeriodicSync other = (PeriodicSync) o;
-        if (this.isService != other.isService) {
-            return false;
-        }
-        boolean equal = false;
-        if (this.isService) {
-            equal = service.equals(other.service);
-        } else {
-            equal = account.equals(other.account)
-                    && authority.equals(other.authority);
-        }
-        return equal
+        return account.equals(other.account)
+            && authority.equals(other.authority)
             && period == other.period
             && syncExtrasEquals(extras, other.extras);
     }
@@ -208,7 +158,6 @@
     public String toString() {
         return "account: " + account +
                ", authority: " + authority +
-               ", service: " + service +
                ". period: " + period + "s " +
                ", flex: " + flexTime;
     }
diff --git a/core/java/android/content/SyncRequest.java b/core/java/android/content/SyncRequest.java
index 4474c70..d4e0c2a 100644
--- a/core/java/android/content/SyncRequest.java
+++ b/core/java/android/content/SyncRequest.java
@@ -20,20 +20,19 @@
 import android.os.Bundle;
 import android.os.Parcel;
 import android.os.Parcelable;
-import android.util.Pair;
 
 public class SyncRequest implements Parcelable {
     private static final String TAG = "SyncRequest";
-    /** Account to pass to the sync adapter. Can be null. */
+    /** Account to pass to the sync adapter. May be null. */
     private final Account mAccountToSync;
     /** Authority string that corresponds to a ContentProvider. */
     private final String mAuthority;
-    /** {@link SyncService} identifier. */
+    /** Sync service identifier. May be null.*/
     private final ComponentName mComponentInfo;
     /** Bundle containing user info as well as sync settings. */
     private final Bundle mExtras;
-    /** Allow this sync request on metered networks. */
-    private final boolean mAllowMetered;
+    /** Disallow this sync request on metered networks. */
+    private final boolean mDisallowMetered;
     /**
      * Anticipated upload size in bytes.
      * TODO: Not yet used - we put this information into the bundle for simplicity.
@@ -70,14 +69,18 @@
         return mIsPeriodic;
     }
 
+    /**
+     * {@hide}
+     * @return whether this is an expedited sync.
+     */
     public boolean isExpedited() {
         return mIsExpedited;
     }
 
     /**
      * {@hide}
-     * @return true if this sync uses an account/authority pair, or false if
-     *         this is an anonymous sync bound to an @link AnonymousSyncService.
+     * @return true if this sync uses an account/authority pair, or false if this sync is bound to
+     * a Sync Service.
      */
     public boolean hasAuthority() {
         return mIsAuthority;
@@ -85,31 +88,30 @@
 
     /**
      * {@hide}
-     * Throws a runtime IllegalArgumentException if this function is called for an
-     * anonymous sync.
-     *
-     * @return (Account, Provider) for this SyncRequest.
+     * @return account object for this sync.
+     * @throws IllegalArgumentException if this function is called for a request that does not
+     * specify an account/provider authority.
      */
-    public Pair<Account, String> getProviderInfo() {
+    public Account getAccount() {
         if (!hasAuthority()) {
-            throw new IllegalArgumentException("Cannot getProviderInfo() for an anonymous sync.");
+            throw new IllegalArgumentException("Cannot getAccount() for a sync that does not"
+                    + "specify an authority.");
         }
-        return Pair.create(mAccountToSync, mAuthority);
+        return mAccountToSync;
     }
 
     /**
      * {@hide}
-     * Throws a runtime IllegalArgumentException if this function is called for a
-     * SyncRequest that is bound to an account/provider.
-     *
-     * @return ComponentName for the service that this sync will bind to.
+     * @return provider for this sync.
+     * @throws IllegalArgumentException if this function is called for a request that does not
+     * specify an account/provider authority.
      */
-    public ComponentName getService() {
-        if (hasAuthority()) {
-            throw new IllegalArgumentException(
-                    "Cannot getAnonymousService() for a sync that has specified a provider.");
+    public String getProvider() {
+        if (!hasAuthority()) {
+            throw new IllegalArgumentException("Cannot getProvider() for a sync that does not"
+                    + "specify a provider.");
         }
-        return mComponentInfo;
+        return mAuthority;
     }
 
     /**
@@ -127,6 +129,7 @@
     public long getSyncFlexTime() {
         return mSyncFlexTimeSecs;
     }
+
     /**
      * {@hide}
      * @return the last point in time at which this sync must scheduled.
@@ -159,7 +162,7 @@
         parcel.writeLong(mSyncFlexTimeSecs);
         parcel.writeLong(mSyncRunTimeSecs);
         parcel.writeInt((mIsPeriodic ? 1 : 0));
-        parcel.writeInt((mAllowMetered ? 1 : 0));
+        parcel.writeInt((mDisallowMetered ? 1 : 0));
         parcel.writeLong(mTxBytes);
         parcel.writeLong(mRxBytes);
         parcel.writeInt((mIsAuthority ? 1 : 0));
@@ -177,7 +180,7 @@
         mSyncFlexTimeSecs = in.readLong();
         mSyncRunTimeSecs = in.readLong();
         mIsPeriodic = (in.readInt() != 0);
-        mAllowMetered = (in.readInt() != 0);
+        mDisallowMetered = (in.readInt() != 0);
         mTxBytes = in.readLong();
         mRxBytes = in.readLong();
         mIsAuthority = (in.readInt() != 0);
@@ -207,13 +210,13 @@
         // For now we merge the sync config extras & the custom extras into one bundle.
         // TODO: pass the configuration extras through separately.
         mExtras.putAll(b.mSyncConfigExtras);
-        mAllowMetered = b.mAllowMetered;
+        mDisallowMetered = b.mDisallowMetered;
         mTxBytes = b.mTxBytes;
         mRxBytes = b.mRxBytes;
     }
 
     /**
-     * Builder class for a @link SyncRequest. As you build your SyncRequest this class will also
+     * Builder class for a {@link SyncRequest}. As you build your SyncRequest this class will also
      * perform validation.
      */
     public static class Builder {
@@ -229,12 +232,9 @@
         private static final int SYNC_TARGET_SERVICE = 1;
         /** Specify that this is a sync with a provider. */
         private static final int SYNC_TARGET_ADAPTER = 2;
-        /**
-         * Earliest point of displacement into the future at which this sync can
-         * occur.
-         */
+        /** Earliest point of displacement into the future at which this sync can occur. */
         private long mSyncFlexTimeSecs;
-        /** Displacement into the future at which this sync must occur. */
+        /** Latest point of displacement into the future at which this sync must occur. */
         private long mSyncRunTimeSecs;
         /**
          * Sync configuration information - custom user data explicitly provided by the developer.
@@ -253,7 +253,7 @@
         /** Expected download transfer in bytes. */
         private long mRxBytes = -1L;
         /** Whether or not this sync can occur on metered networks. Default false. */
-        private boolean mAllowMetered;
+        private boolean mDisallowMetered;
         /** Priority of this sync relative to others from calling app [-2, 2]. Default 0. */
         private int mPriority = 0;
         /**
@@ -283,9 +283,8 @@
         private boolean mExpedited;
 
         /**
-         * The {@link SyncService} component that
-         * contains the sync logic if this is a provider-less sync, otherwise
-         * null.
+         * The sync component that contains the sync logic if this is a provider-less sync,
+         * otherwise null.
          */
         private ComponentName mComponentName;
         /**
@@ -303,46 +302,28 @@
         }
 
         /**
-         * Developer can define timing constraints for this one-shot request.
-         * These values are elapsed real-time.
-         *
-         * @param whenSeconds The time in seconds at which you want this
-         *            sync to occur.
-         * @param beforeSeconds The amount of time in advance of whenSeconds that this
-         *               sync may be permitted to occur. This is rounded up to a minimum of 5
-         *               seconds, for any sync for which whenSeconds > 5.
+         * Request that a sync occur immediately.
          *
          * Example
          * <pre>
-         *     Perform an immediate sync.
-         *     SyncRequest.Builder builder = (new SyncRequest.Builder()).syncOnce(0, 0);
-         *     That is, a sync 0 seconds from now with 0 seconds of flex.
-         *
-         *     Perform a sync in exactly 5 minutes.
-         *     SyncRequest.Builder builder =
-         *       new SyncRequest.Builder().syncOnce(5 * MIN_IN_SECS, 0);
-         *
-         *     Perform a sync in 5 minutes, with one minute of leeway (between 4 and 5 minutes from
-         *     now).
-         *     SyncRequest.Builder builder =
-         *       new SyncRequest.Builder().syncOnce(5 * MIN_IN_SECS, 1 * MIN_IN_SECS);
+         *     SyncRequest.Builder builder = (new SyncRequest.Builder()).syncOnce();
          * </pre>
          */
-        public Builder syncOnce(long whenSeconds, long beforeSeconds) {
+        public Builder syncOnce() {
             if (mSyncType != SYNC_TYPE_UNKNOWN) {
                 throw new IllegalArgumentException("Sync type has already been defined.");
             }
             mSyncType = SYNC_TYPE_ONCE;
-            setupInterval(whenSeconds, beforeSeconds);
+            setupInterval(0, 0);
             return this;
         }
 
         /**
          * Build a periodic sync. Either this or syncOnce() <b>must</b> be called for this builder.
-         * Syncs are identified by target {@link SyncService}/{@link android.provider} and by the
-         * contents of the extras bundle.
-         * You cannot reuse the same builder for one-time syncs after having specified a periodic
-         * sync (by calling this function). If you do, an <code>IllegalArgumentException</code>
+         * Syncs are identified by target {@link android.provider}/{@link android.accounts.Account}
+         * and by the contents of the extras bundle.
+         * You cannot reuse the same builder for one-time syncs (by calling this function) after
+         * having specified a periodic sync. If you do, an <code>IllegalArgumentException</code>
          * will be thrown.
          *
          * Example usage.
@@ -394,6 +375,7 @@
         }
 
         /**
+         * {@hide}
          * Developer can provide insight into their payload size; optional. -1 specifies unknown,
          * so that you are not restricted to defining both fields.
          *
@@ -407,21 +389,20 @@
         }
 
         /**
-         * @param allow false to allow this transfer on metered networks. Default true.
+         * @see android.net.ConnectivityManager#isActiveNetworkMetered()
+         * @param disallow true to enforce that this transfer not occur on metered networks.
+         *                 Default false.
          */
-        public Builder setAllowMetered(boolean allow) {
-            mAllowMetered = true;
+        public Builder setDisallowMetered(boolean disallow) {
+            mDisallowMetered = disallow;
             return this;
         }
 
         /**
-         * Specify an authority and account for this transfer. Cannot be used with
-         * {@link #setSyncAdapter(ComponentName cname)}.
+         * Specify an authority and account for this transfer.
          *
-         * @param authority
-         * @param account Account to sync. Can be null unless this is a periodic
-         *            sync, for which verification by the ContentResolver will
-         *            fail. If a sync is performed without an account, the
+         * @param authority String identifying which content provider to sync.
+         * @param account Account to sync. Can be null unless this is a periodic sync.
          */
         public Builder setSyncAdapter(Account account, String authority) {
             if (mSyncTarget != SYNC_TARGET_UNKNOWN) {
@@ -435,26 +416,10 @@
         }
 
         /**
-         * Specify the {@link SyncService} component for this sync. This is not validated until
-         * sync time so providing an incorrect component name here will not fail. Cannot be used
-         * with {@link #setSyncAdapter(Account account, String authority)}.
-         *
-         * @param cname ComponentName to identify your Anonymous service
-         */
-        public Builder setSyncAdapter(ComponentName cname) {
-            if (mSyncTarget != SYNC_TARGET_UNKNOWN) {
-                throw new IllegalArgumentException("Sync target has already been defined.");
-            }
-            mSyncTarget = SYNC_TARGET_SERVICE;
-            mComponentName = cname;
-            mAccount = null;
-            mAuthority = null;
-            return this;
-        }
-
-        /**
-         * Developer-provided extras handed back when sync actually occurs. This bundle is copied
-         * into the SyncRequest returned by {@link #build()}.
+         * Optional developer-provided extras handed back in
+         * {@link AbstractThreadedSyncAdapter#onPerformSync(Account, Bundle, String,
+         * ContentProviderClient, SyncResult)} occurs. This bundle is copied into the SyncRequest
+         * returned by {@link #build()}.
          *
          * Example:
          * <pre>
@@ -468,7 +433,7 @@
          *     Bundle extras = new Bundle();
          *     extras.setString("data", syncData);
          *     builder.setExtras(extras);
-         *     ContentResolver.sync(builder.build()); // Each sync() request creates a unique sync.
+         *     ContentResolver.sync(builder.build()); // Each sync() request is for a unique sync.
          *   }
          * </pre>
          * Only values of the following types may be used in the extras bundle:
@@ -509,7 +474,8 @@
         /**
          * Convenience function for setting {@link ContentResolver#SYNC_EXTRAS_IGNORE_SETTINGS}.
          *
-         * Not valid for periodic sync and will throw an <code>IllegalArgumentException</code> in
+         * A sync can specify that system sync settings be ignored (user has turned sync off). Not
+         * valid for periodic sync and will throw an <code>IllegalArgumentException</code> in
          * {@link #build()}.
          *
          * @param ignoreSettings true to ignore the sync automatically settings. Default false.
@@ -522,13 +488,13 @@
         /**
          * Convenience function for setting {@link ContentResolver#SYNC_EXTRAS_IGNORE_BACKOFF}.
          *
-         * Ignoring back-off will force the sync scheduling process to ignore any back-off that was
-         * the result of a failed sync, as well as to invalidate any {@link SyncResult#delayUntil}
-         * value that may have been set by the adapter. Successive failures will not honor this
-         * flag. Not valid for periodic sync and will throw an <code>IllegalArgumentException</code>
-         * in {@link #build()}.
+         * Force the sync scheduling process to ignore any back-off that was the result of a failed
+         * sync, as well as to invalidate any {@link SyncResult#delayUntil} value that may have
+         * been set by the adapter. Successive failures will not honor this flag. Not valid for
+         * periodic sync and will throw an <code>IllegalArgumentException</code> in
+         * {@link #build()}.
          *
-         * @param ignoreBackoff ignore back off settings. Default false.
+         * @param ignoreBackoff ignore back-off settings. Default false.
          */
         public Builder setIgnoreBackoff(boolean ignoreBackoff) {
             mIgnoreBackoff = ignoreBackoff;
@@ -538,8 +504,9 @@
         /**
          * Convenience function for setting {@link ContentResolver#SYNC_EXTRAS_MANUAL}.
          *
-         * Not valid for periodic sync and will throw an <code>IllegalArgumentException</code> in
-         * {@link #build()}.
+         * A manual sync is functionally equivalent to calling {@link #setIgnoreBackoff(boolean)}
+         * and {@link #setIgnoreSettings(boolean)}. Not valid for periodic sync and will throw an
+         * <code>IllegalArgumentException</code> in {@link #build()}.
          *
          * @param isManual User-initiated sync or not. Default false.
          */
@@ -549,7 +516,7 @@
         }
 
         /**
-         * An expedited sync runs immediately and can preempt other non-expedited running syncs.
+         * An expedited sync runs immediately and will preempt another non-expedited running sync.
          *
          * Not valid for periodic sync and will throw an <code>IllegalArgumentException</code> in
          * {@link #build()}.
@@ -562,6 +529,7 @@
         }
 
         /**
+         * {@hide}
          * @param priority the priority of this request among all requests from the calling app.
          * Range of [-2,2] similar to how this is done with notifications.
          */
@@ -581,18 +549,18 @@
          *         builder.
          */
         public SyncRequest build() {
-            // Validate the extras bundle
-            ContentResolver.validateSyncExtrasBundle(mCustomExtras);
             if (mCustomExtras == null) {
                 mCustomExtras = new Bundle();
             }
+            // Validate the extras bundle
+            ContentResolver.validateSyncExtrasBundle(mCustomExtras);
             // Combine builder extra flags into the config bundle.
             mSyncConfigExtras = new Bundle();
             if (mIgnoreBackoff) {
                 mSyncConfigExtras.putBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_BACKOFF, true);
             }
-            if (mAllowMetered) {
-                mSyncConfigExtras.putBoolean(ContentResolver.SYNC_EXTRAS_ALLOW_METERED, true);
+            if (mDisallowMetered) {
+                mSyncConfigExtras.putBoolean(ContentResolver.SYNC_EXTRAS_DISALLOW_METERED, true);
             }
             if (mIgnoreSettings) {
                 mSyncConfigExtras.putBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_SETTINGS, true);
@@ -613,13 +581,22 @@
                 // If this is a periodic sync ensure than invalid extras were not set.
                 validatePeriodicExtras(mCustomExtras);
                 validatePeriodicExtras(mSyncConfigExtras);
+                // Verify that account and provider are not null.
+                if (mAccount == null) {
+                    throw new IllegalArgumentException("Account must not be null for periodic"
+                            + " sync.");
+                }
+                if (mAuthority == null) {
+                    throw new IllegalArgumentException("Authority must not be null for periodic"
+                            + " sync.");
+                }
             } else if (mSyncType == SYNC_TYPE_UNKNOWN) {
                 throw new IllegalArgumentException("Must call either syncOnce() or syncPeriodic()");
             }
             // Ensure that a target for the sync has been set.
             if (mSyncTarget == SYNC_TARGET_UNKNOWN) {
-                throw new IllegalArgumentException("Must specify an adapter with one of"
-                    + "setSyncAdapter(ComponentName) or setSyncAdapter(Account, String");
+                throw new IllegalArgumentException("Must specify an adapter with "
+                        + "setSyncAdapter(Account, String");
             }
             return new SyncRequest(this);
         }
diff --git a/core/java/android/content/SyncService.java b/core/java/android/content/SyncService.java
deleted file mode 100644
index 100fd40..0000000
--- a/core/java/android/content/SyncService.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Copyright (C) 2013 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.content;
-
-import android.app.Service;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.os.Process;
-import android.os.Trace;
-
-import com.android.internal.annotations.GuardedBy;
-
-import java.util.HashMap;
-
-/**
- * Simplified @link android.content.AbstractThreadedSyncAdapter. Folds that
- * behaviour into a service to which the system can bind when requesting an
- * anonymous (providerless/accountless) sync.
- * <p>
- * In order to perform an anonymous sync operation you must extend this service,
- * implementing the abstract methods. This service must then be declared in the
- * application's manifest as usual. You can use this service for other work, however you
- * <b> must not </b> override the onBind() method unless you know what you're doing,
- * which limits the usefulness of this service for other work.
- *
- * <pre>
- * &lt;service ndroid:name=".MyAnonymousSyncService" android:permission="android.permission.SYNC" /&gt;
- * </pre>
- * Like @link android.content.AbstractThreadedSyncAdapter this service supports
- * multiple syncs at the same time. Each incoming startSync() with a unique tag
- * will spawn a thread to do the work of that sync. If startSync() is called
- * with a tag that already exists, a SyncResult.ALREADY_IN_PROGRESS is returned.
- * Remember that your service will spawn multiple threads if you schedule multiple syncs
- * at once, so if you mutate local objects you must ensure synchronization.
- */
-public abstract class SyncService extends Service {
-
-    /** SyncAdapter Instantiation that any anonymous syncs call. */
-    private final AnonymousSyncAdapterImpl mSyncAdapter = new AnonymousSyncAdapterImpl();
-
-    /** Keep track of on-going syncs, keyed by tag. */
-    @GuardedBy("mLock")
-    private final HashMap<Bundle, AnonymousSyncThread>
-            mSyncThreads = new HashMap<Bundle, AnonymousSyncThread>();
-    /** Lock object for accessing the SyncThreads HashMap. */
-    private final Object mSyncThreadLock = new Object();
-
-    @Override
-    public IBinder onBind(Intent intent) {
-        return mSyncAdapter.asBinder();
-    }
-
-    /** {@hide} */
-    private class AnonymousSyncAdapterImpl extends IAnonymousSyncAdapter.Stub {
-
-        @Override
-        public void startSync(ISyncContext syncContext, Bundle extras) {
-            // Wrap the provided Sync Context because it may go away by the time
-            // we call it.
-            final SyncContext syncContextClient = new SyncContext(syncContext);
-            boolean alreadyInProgress = false;
-            synchronized (mSyncThreadLock) {
-                if (mSyncThreads.containsKey(extras)) {
-                    // Don't want to call back to SyncManager while still
-                    // holding lock.
-                    alreadyInProgress = true;
-                } else {
-                    AnonymousSyncThread syncThread = new AnonymousSyncThread(
-                            syncContextClient, extras);
-                    mSyncThreads.put(extras, syncThread);
-                    syncThread.start();
-                }
-            }
-            if (alreadyInProgress) {
-                syncContextClient.onFinished(SyncResult.ALREADY_IN_PROGRESS);
-            }
-        }
-
-        /**
-         * Used by the SM to cancel a specific sync using the {@link
-         * com.android.server.content.SyncManager.ActiveSyncContext} as a handle.
-         */
-        @Override
-        public void cancelSync(ISyncContext syncContext) {
-            AnonymousSyncThread runningSync = null;
-            synchronized (mSyncThreadLock) {
-                for (AnonymousSyncThread thread : mSyncThreads.values()) {
-                    if (thread.mSyncContext.getSyncContextBinder() == syncContext.asBinder()) {
-                        runningSync = thread;
-                        break;
-                    }
-                }
-            }
-            if (runningSync != null) {
-                runningSync.interrupt();
-            }
-        }
-    }
-
-    /**
-     * {@hide}
-     * Similar to {@link android.content.AbstractThreadedSyncAdapter.SyncThread}. However while
-     * the ATSA considers an already in-progress sync to be if the account provided is currently
-     * syncing, this anonymous sync has no notion of account and therefore considers a sync unique
-     * if the provided bundle is different.
-     */
-    private class AnonymousSyncThread extends Thread {
-        private final SyncContext mSyncContext;
-        private final Bundle mExtras;
-
-        public AnonymousSyncThread(SyncContext syncContext, Bundle extras) {
-            mSyncContext = syncContext;
-            mExtras = extras;
-        }
-
-        @Override
-        public void run() {
-            Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
-
-            Trace.traceBegin(Trace.TRACE_TAG_SYNC_MANAGER, getApplication().getPackageName());
-
-            SyncResult syncResult = new SyncResult();
-            try {
-                if (isCancelled()) {
-                    return;
-                }
-                // Run the sync based off of the provided code.
-                SyncService.this.onPerformSync(mExtras, syncResult);
-            } finally {
-                Trace.traceEnd(Trace.TRACE_TAG_SYNC_MANAGER);
-                if (!isCancelled()) {
-                    mSyncContext.onFinished(syncResult);
-                }
-                // Synchronize so that the assignment will be seen by other
-                // threads
-                // that also synchronize accesses to mSyncThreads.
-                synchronized (mSyncThreadLock) {
-                    mSyncThreads.remove(mExtras);
-                }
-            }
-        }
-
-        private boolean isCancelled() {
-            return Thread.currentThread().isInterrupted();
-        }
-    }
-
-    /**
-     * Initiate an anonymous sync using this service. SyncAdapter-specific
-     * parameters may be specified in extras, which is guaranteed to not be
-     * null.
-     */
-    public abstract void onPerformSync(Bundle extras, SyncResult syncResult);
-
-}
diff --git a/core/java/android/ddm/DdmHandleProfiling.java b/core/java/android/ddm/DdmHandleProfiling.java
index e1d359c..ec08393 100644
--- a/core/java/android/ddm/DdmHandleProfiling.java
+++ b/core/java/android/ddm/DdmHandleProfiling.java
@@ -186,7 +186,7 @@
      * Handle a "Method PRofiling Query" request.
      */
     private Chunk handleMPRQ(Chunk request) {
-        int result = Debug.isMethodTracingActive() ? 1 : 0;
+        int result = Debug.getMethodTracingMode();
 
         /* create a non-empty reply so the handler fires on completion */
         byte[] reply = { (byte) result };
diff --git a/core/java/android/nfc/cardemulation/ApduServiceInfo.java b/core/java/android/nfc/cardemulation/ApduServiceInfo.java
index b83911a..41c6603 100644
--- a/core/java/android/nfc/cardemulation/ApduServiceInfo.java
+++ b/core/java/android/nfc/cardemulation/ApduServiceInfo.java
@@ -105,8 +105,12 @@
             if (onHost) {
                 parser = si.loadXmlMetaData(pm, HostApduService.SERVICE_META_DATA);
                 if (parser == null) {
-                    throw new XmlPullParserException("No " + HostApduService.SERVICE_META_DATA +
-                            " meta-data");
+                    Log.d(TAG, "Didn't find service meta-data, trying legacy.");
+                    parser = si.loadXmlMetaData(pm, HostApduService.OLD_SERVICE_META_DATA);
+                    if (parser == null) {
+                        throw new XmlPullParserException("No " + HostApduService.SERVICE_META_DATA +
+                                " meta-data");
+                    }
                 }
             } else {
                 parser = si.loadXmlMetaData(pm, OffHostApduService.SERVICE_META_DATA);
@@ -170,12 +174,12 @@
                             com.android.internal.R.styleable.AidGroup_description);
                     String groupCategory = groupAttrs.getString(
                             com.android.internal.R.styleable.AidGroup_category);
-                    if (!CardEmulationManager.CATEGORY_PAYMENT.equals(groupCategory)) {
-                        groupCategory = CardEmulationManager.CATEGORY_OTHER;
+                    if (!CardEmulation.CATEGORY_PAYMENT.equals(groupCategory)) {
+                        groupCategory = CardEmulation.CATEGORY_OTHER;
                     }
                     currentGroup = mCategoryToGroup.get(groupCategory);
                     if (currentGroup != null) {
-                        if (!CardEmulationManager.CATEGORY_OTHER.equals(groupCategory)) {
+                        if (!CardEmulation.CATEGORY_OTHER.equals(groupCategory)) {
                             Log.e(TAG, "Not allowing multiple aid-groups in the " +
                                     groupCategory + " category");
                             currentGroup = null;
diff --git a/core/java/android/nfc/cardemulation/CardEmulation.java b/core/java/android/nfc/cardemulation/CardEmulation.java
new file mode 100644
index 0000000..3cd7863
--- /dev/null
+++ b/core/java/android/nfc/cardemulation/CardEmulation.java
@@ -0,0 +1,343 @@
+/*
+ * Copyright (C) 2013 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.nfc.cardemulation;
+
+import android.annotation.SdkConstant;
+import android.annotation.SdkConstant.SdkConstantType;
+import android.app.ActivityThread;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.IPackageManager;
+import android.content.pm.PackageManager;
+import android.nfc.INfcCardEmulation;
+import android.nfc.NfcAdapter;
+import android.os.RemoteException;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.util.Log;
+
+import java.util.HashMap;
+import java.util.List;
+
+public final class CardEmulation {
+    static final String TAG = "CardEmulation";
+
+    /**
+     * Activity action: ask the user to change the default
+     * card emulation service for a certain category. This will
+     * show a dialog that asks the user whether he wants to
+     * replace the current default service with the service
+     * identified with the ComponentName specified in
+     * {@link #EXTRA_SERVICE_COMPONENT}, for the category
+     * specified in {@link #EXTRA_CATEGORY}
+     */
+    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+    public static final String ACTION_CHANGE_DEFAULT =
+            "android.nfc.cardemulation.action.ACTION_CHANGE_DEFAULT";
+
+    /**
+     * The category extra for {@link #ACTION_CHANGE_DEFAULT}
+     *
+     * @see #ACTION_CHANGE_DEFAULT
+     */
+    public static final String EXTRA_CATEGORY = "category";
+
+    /**
+     * The ComponentName object passed in as a parcelable
+     * extra for {@link #ACTION_CHANGE_DEFAULT}
+     *
+     * @see #ACTION_CHANGE_DEFAULT
+     */
+    public static final String EXTRA_SERVICE_COMPONENT = "component";
+
+    /**
+     * The payment category can be used to indicate that an AID
+     * represents a payment application.
+     */
+    public static final String CATEGORY_PAYMENT = "payment";
+
+    /**
+     * If an AID group does not contain a category, or the
+     * specified category is not defined by the platform version
+     * that is parsing the AID group, all AIDs in the group will
+     * automatically be categorized under the {@link #CATEGORY_OTHER}
+     * category.
+     */
+    public static final String CATEGORY_OTHER = "other";
+
+    /**
+     * Return value for {@link #getSelectionModeForCategory(String)}.
+     *
+     * <p>In this mode, the user has set a default service for this
+     *    AID category. If a remote reader selects any of the AIDs
+     *    that the default service has registered in this category,
+     *    that service will automatically be bound to to handle
+     *    the transaction.
+     *
+     * <p>There are still cases where a service that is
+     *    not the default for a category can selected:
+     *    <p>
+     *    If a remote reader selects an AID in this category
+     *    that is not handled by the default service, and there is a set
+     *    of other services {S} that do handle this AID, the
+     *    user is asked if he wants to use any of the services in
+     *    {S} instead.
+     *    <p>
+     *    As a special case, if the size of {S} is one, containing a single service X,
+     *    and all AIDs X has registered in this category are not
+     *    registered by any other service, then X will be
+     *    selected automatically without asking the user.
+     *    <p>Example:
+     *    <ul>
+     *    <li>Service A registers AIDs "1", "2" and "3" in the category
+     *    <li>Service B registers AIDs "3" and "4" in the category
+     *    <li>Service C registers AIDs "5" and "6" in the category
+     *    </ul>
+     *    In this case, the following will happen when service A
+     *    is the default:
+     *    <ul>
+     *    <li>Reader selects AID "1", "2" or "3": service A is invoked automatically
+     *    <li>Reader selects AID "4": the user is asked to confirm he
+     *        wants to use service B, because its AIDs overlap with service A.
+     *    <li>Reader selects AID "5" or "6": service C is invoked automatically,
+     *        because all AIDs it has asked for are only registered by C,
+     *        and there is no overlap.
+     *    </ul>
+     *
+     */
+    public static final int SELECTION_MODE_PREFER_DEFAULT = 0;
+
+    /**
+     * Return value for {@link #getSelectionModeForCategory(String)}.
+     *
+     * <p>In this mode, whenever an AID of this category is selected,
+     *    the user is asked which service he wants to use to handle
+     *    the transaction, even if there is only one matching service.
+     */
+    public static final int SELECTION_MODE_ALWAYS_ASK = 1;
+
+    /**
+     * Return value for {@link #getSelectionModeForCategory(String)}.
+     *
+     * <p>In this mode, the user will only be asked to select a service
+     *    if the selected AID has been registered by multiple applications.
+     */
+    public static final int SELECTION_MODE_ASK_IF_CONFLICT = 2;
+
+    static boolean sIsInitialized = false;
+    static HashMap<Context, CardEmulation> sCardEmus = new HashMap();
+    static INfcCardEmulation sService;
+
+    final Context mContext;
+
+    private CardEmulation(Context context, INfcCardEmulation service) {
+        mContext = context.getApplicationContext();
+        sService = service;
+    }
+
+    public static synchronized CardEmulation getInstance(NfcAdapter adapter) {
+        if (adapter == null) throw new NullPointerException("NfcAdapter is null");
+        Context context = adapter.getContext();
+        if (context == null) {
+            Log.e(TAG, "NfcAdapter context is null.");
+            throw new UnsupportedOperationException();
+        }
+        if (!sIsInitialized) {
+            IPackageManager pm = ActivityThread.getPackageManager();
+            if (pm == null) {
+                Log.e(TAG, "Cannot get PackageManager");
+                throw new UnsupportedOperationException();
+            }
+            try {
+                if (!pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION)) {
+                    Log.e(TAG, "This device does not support card emulation");
+                    throw new UnsupportedOperationException();
+                }
+            } catch (RemoteException e) {
+                Log.e(TAG, "PackageManager query failed.");
+                throw new UnsupportedOperationException();
+            }
+            sIsInitialized = true;
+        }
+        CardEmulation manager = sCardEmus.get(context);
+        if (manager == null) {
+            // Get card emu service
+            INfcCardEmulation service = adapter.getCardEmulationService();
+            manager = new CardEmulation(context, service);
+            sCardEmus.put(context, manager);
+        }
+        return manager;
+    }
+
+    /**
+     * Allows an application to query whether a service is currently
+     * the default service to handle a card emulation category.
+     *
+     * <p>Note that if {@link #getSelectionModeForCategory(String)}
+     * returns {@link #SELECTION_MODE_ALWAYS_ASK}, this method will always
+     * return false.
+     *
+     * @param service The ComponentName of the service
+     * @param category The category
+     * @return whether service is currently the default service for the category.
+     */
+    public boolean isDefaultServiceForCategory(ComponentName service, String category) {
+        try {
+            return sService.isDefaultServiceForCategory(UserHandle.myUserId(), service, category);
+        } catch (RemoteException e) {
+            // Try one more time
+            recoverService();
+            if (sService == null) {
+                Log.e(TAG, "Failed to recover CardEmulationService.");
+                return false;
+            }
+            try {
+                return sService.isDefaultServiceForCategory(UserHandle.myUserId(), service,
+                        category);
+            } catch (RemoteException ee) {
+                Log.e(TAG, "Failed to recover CardEmulationService.");
+                return false;
+            }
+        }
+    }
+
+    /**
+     *
+     * Allows an application to query whether a service is currently
+     * the default handler for a specified ISO7816-4 Application ID.
+     *
+     * @param service The ComponentName of the service
+     * @param aid The ISO7816-4 Application ID
+     * @return
+     */
+    public boolean isDefaultServiceForAid(ComponentName service, String aid) {
+        try {
+            return sService.isDefaultServiceForAid(UserHandle.myUserId(), service, aid);
+        } catch (RemoteException e) {
+            // Try one more time
+            recoverService();
+            if (sService == null) {
+                Log.e(TAG, "Failed to recover CardEmulationService.");
+                return false;
+            }
+            try {
+                return sService.isDefaultServiceForAid(UserHandle.myUserId(), service, aid);
+            } catch (RemoteException ee) {
+                Log.e(TAG, "Failed to reach CardEmulationService.");
+                return false;
+            }
+        }
+    }
+
+    /**
+     * Returns the application selection mode for the passed in category.
+     * Valid return values are:
+     * <p>{@link #SELECTION_MODE_PREFER_DEFAULT} the user has requested a default
+     *    application for this category, which will be preferred.
+     * <p>{@link #SELECTION_MODE_ALWAYS_ASK} the user has requested to be asked
+     *    every time what app he would like to use in this category.
+     * <p>{@link #SELECTION_MODE_ASK_IF_CONFLICT} the user will only be asked
+     *    to pick a service if there is a conflict.
+     * @param category The category, for example {@link #CATEGORY_PAYMENT}
+     * @return
+     */
+    public int getSelectionModeForCategory(String category) {
+        if (CATEGORY_PAYMENT.equals(category)) {
+            String defaultComponent = Settings.Secure.getString(mContext.getContentResolver(),
+                    Settings.Secure.NFC_PAYMENT_DEFAULT_COMPONENT);
+            if (defaultComponent != null) {
+                return SELECTION_MODE_PREFER_DEFAULT;
+            } else {
+                return SELECTION_MODE_ALWAYS_ASK;
+            }
+        } else {
+            // All other categories are in "only ask if conflict" mode
+            return SELECTION_MODE_ASK_IF_CONFLICT;
+        }
+    }
+
+    /**
+     * @hide
+     */
+    public boolean setDefaultServiceForCategory(ComponentName service, String category) {
+        try {
+            return sService.setDefaultServiceForCategory(UserHandle.myUserId(), service, category);
+        } catch (RemoteException e) {
+            // Try one more time
+            recoverService();
+            if (sService == null) {
+                Log.e(TAG, "Failed to recover CardEmulationService.");
+                return false;
+            }
+            try {
+                return sService.setDefaultServiceForCategory(UserHandle.myUserId(), service,
+                        category);
+            } catch (RemoteException ee) {
+                Log.e(TAG, "Failed to reach CardEmulationService.");
+                return false;
+            }
+        }
+    }
+
+    /**
+     * @hide
+     */
+    public boolean setDefaultForNextTap(ComponentName service) {
+        try {
+            return sService.setDefaultForNextTap(UserHandle.myUserId(), service);
+        } catch (RemoteException e) {
+            // Try one more time
+            recoverService();
+            if (sService == null) {
+                Log.e(TAG, "Failed to recover CardEmulationService.");
+                return false;
+            }
+            try {
+                return sService.setDefaultForNextTap(UserHandle.myUserId(), service);
+            } catch (RemoteException ee) {
+                Log.e(TAG, "Failed to reach CardEmulationService.");
+                return false;
+            }
+        }
+    }
+    /**
+     * @hide
+     */
+    public List<ApduServiceInfo> getServices(String category) {
+        try {
+            return sService.getServices(UserHandle.myUserId(), category);
+        } catch (RemoteException e) {
+            // Try one more time
+            recoverService();
+            if (sService == null) {
+                Log.e(TAG, "Failed to recover CardEmulationService.");
+                return null;
+            }
+            try {
+                return sService.getServices(UserHandle.myUserId(), category);
+            } catch (RemoteException ee) {
+                Log.e(TAG, "Failed to reach CardEmulationService.");
+                return null;
+            }
+        }
+    }
+
+    void recoverService() {
+        NfcAdapter adapter = NfcAdapter.getDefaultAdapter(mContext);
+        sService = adapter.getCardEmulationService();
+    }
+}
diff --git a/core/java/android/nfc/cardemulation/CardEmulationManager.java b/core/java/android/nfc/cardemulation/CardEmulationManager.java
index 9d60c73..124ea1c 100644
--- a/core/java/android/nfc/cardemulation/CardEmulationManager.java
+++ b/core/java/android/nfc/cardemulation/CardEmulationManager.java
@@ -33,6 +33,10 @@
 import java.util.HashMap;
 import java.util.List;
 
+/**
+ * TODO Remove when calling .apks are upgraded
+ * @hide
+ */
 public final class CardEmulationManager {
     static final String TAG = "CardEmulationManager";
 
diff --git a/core/java/android/nfc/cardemulation/HostApduService.java b/core/java/android/nfc/cardemulation/HostApduService.java
index ae94b2f..174acc0 100644
--- a/core/java/android/nfc/cardemulation/HostApduService.java
+++ b/core/java/android/nfc/cardemulation/HostApduService.java
@@ -40,13 +40,31 @@
      */
     @SdkConstant(SdkConstantType.SERVICE_ACTION)
     public static final String SERVICE_INTERFACE =
-            "android.nfc.HostApduService";
+            "android.nfc.cardemulation.action.HOST_APDU_SERVICE";
 
     /**
      * The name of the meta-data element that contains
      * more information about this service.
      */
-    public static final String SERVICE_META_DATA = "android.nfc.HostApduService";
+    public static final String SERVICE_META_DATA =
+            "android.nfc.cardemulation.host_apdu_service";
+
+    /**
+     * The {@link Intent} that must be declared as handled by the service.
+     * TODO Remove
+     * @hide
+     */
+    public static final String OLD_SERVICE_INTERFACE =
+            "android.nfc.HostApduService";
+
+    /**
+     * The name of the meta-data element that contains
+     * more information about this service.
+     *
+     * TODO Remove
+     * @hide
+     */
+    public static final String OLD_SERVICE_META_DATA = "android.nfc.HostApduService";
 
     /**
      * Reason for {@link #onDeactivated(int)}.
@@ -63,7 +81,7 @@
      * currently active on the logical channel).
      *
      * <p>Note that this next AID may still be resolved to this
-     * service, in which case {@link #processCommandApdu(byte[], int)}
+     * service, in which case {@link #processCommandApdu(byte[], Bundle)}
      * will be called again.
      */
     public static final int DEACTIVATION_DESELECTED = 1;
@@ -131,7 +149,7 @@
 
                 byte[] apdu = dataBundle.getByteArray(KEY_DATA);
                 if (apdu != null) {
-                    byte[] responseApdu = processCommandApdu(apdu, 0);
+                    byte[] responseApdu = processCommandApdu(apdu, null);
                     if (responseApdu != null) {
                         if (mNfcService == null) {
                             Log.e(TAG, "Response not sent; service was deactivated.");
@@ -230,7 +248,7 @@
      * transaction.
      *
      * <p>Note: this method may be called anywhere between
-     *    the first {@link #processCommandApdu(byte[], int)}
+     *    the first {@link #processCommandApdu(byte[], Bundle)}
      *    call and a {@link #onDeactivated(int)} call.
      */
     public final void notifyUnhandled() {
@@ -290,8 +308,11 @@
      * @param flags
      * @return a byte-array containing the response APDU, or null if no
      *         response APDU can be sent at this point.
+     * @hide
      */
-    public abstract byte[] processCommandApdu(byte[] commandApdu, int flags);
+    public byte[] processCommandApdu(byte[] commandApdu, int flags) {
+        return null;
+    }
 
     /**
      * This method will be called in two possible scenarios:
diff --git a/core/java/android/nfc/cardemulation/OffHostApduService.java b/core/java/android/nfc/cardemulation/OffHostApduService.java
index 79599db..15f63f9 100644
--- a/core/java/android/nfc/cardemulation/OffHostApduService.java
+++ b/core/java/android/nfc/cardemulation/OffHostApduService.java
@@ -42,13 +42,14 @@
      */
     @SdkConstant(SdkConstantType.SERVICE_ACTION)
     public static final String SERVICE_INTERFACE =
-            "android.nfc.OffHostApduService";
+            "android.nfc.cardemulation.action.OFF_HOST_APDU_SERVICE";
 
     /**
      * The name of the meta-data element that contains
      * more information about this service.
      */
-    public static final String SERVICE_META_DATA = "android.nfc.OffHostApduService";
+    public static final String SERVICE_META_DATA =
+            "android.nfc.cardemulation.off_host_apdu_service";
 
     /**
      * The Android platform itself will not bind to this service,
diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java
index b78bbc3..60ce132 100644
--- a/core/java/android/os/Debug.java
+++ b/core/java/android/os/Debug.java
@@ -645,11 +645,13 @@
     }
 
     /**
-     * Determine whether method tracing is currently active.
+     * Determine whether method tracing is currently active and what type is
+     * active.
+     *
      * @hide
      */
-    public static boolean isMethodTracingActive() {
-        return VMDebug.isMethodTracingActive();
+    public static int getMethodTracingMode() {
+        return VMDebug.getMethodTracingMode();
     }
 
     /**
diff --git a/core/java/android/printservice/PrinterDiscoverySession.java b/core/java/android/printservice/PrinterDiscoverySession.java
index 1f86ecc..6464cc1 100644
--- a/core/java/android/printservice/PrinterDiscoverySession.java
+++ b/core/java/android/printservice/PrinterDiscoverySession.java
@@ -80,7 +80,7 @@
 public abstract class PrinterDiscoverySession {
     private static final String LOG_TAG = "PrinterDiscoverySession";
 
-    private static final int MAX_ITEMS_PER_CALLBACK = 100;
+    private static final int MAX_ITEMS_PER_CALLBACK = 50;
 
     private static int sIdCounter = 0;
 
diff --git a/core/java/android/provider/DocumentsContract.java b/core/java/android/provider/DocumentsContract.java
index ebb7eb8..f445fd5 100644
--- a/core/java/android/provider/DocumentsContract.java
+++ b/core/java/android/provider/DocumentsContract.java
@@ -19,7 +19,6 @@
 import static android.net.TrafficStats.KB_IN_BYTES;
 import static libcore.io.OsConstants.SEEK_SET;
 
-import android.content.ContentProviderClient;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
@@ -30,16 +29,13 @@
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.Point;
-import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.Bundle;
-import android.os.Parcel;
+import android.os.CancellationSignal;
 import android.os.ParcelFileDescriptor;
 import android.os.ParcelFileDescriptor.OnCloseListener;
-import android.os.Parcelable;
 import android.util.Log;
 
-import com.android.internal.util.Preconditions;
 import com.google.android.collect.Lists;
 
 import libcore.io.ErrnoException;
@@ -62,9 +58,12 @@
 public final class DocumentsContract {
     private static final String TAG = "Documents";
 
-    // content://com.example/docs/12/
-    // content://com.example/docs/12/children/
-    // content://com.example/docs/12/search/?query=pony
+    // content://com.example/root/
+    // content://com.example/root/sdcard/
+    // content://com.example/root/sdcard/recent/
+    // content://com.example/document/12/
+    // content://com.example/document/12/children/
+    // content://com.example/document/12/search/?query=pony
 
     private DocumentsContract() {
     }
@@ -75,207 +74,69 @@
     /** {@hide} */
     public static final String ACTION_MANAGE_DOCUMENTS = "android.provider.action.MANAGE_DOCUMENTS";
 
-    /** {@hide} */
-    public static final String
-            ACTION_DOCUMENT_ROOT_CHANGED = "android.provider.action.DOCUMENT_ROOT_CHANGED";
-
     /**
-     * Constants for individual documents.
+     * Constants related to a document, including {@link Cursor} columns names
+     * and flags.
+     * <p>
+     * A document can be either an openable file (with a specific MIME type), or
+     * a directory containing additional documents (with the
+     * {@link #MIME_TYPE_DIR} MIME type).
+     * <p>
+     * All columns are <em>read-only</em> to client applications.
      */
-    public final static class Documents {
-        private Documents() {
+    public final static class Document {
+        private Document() {
         }
 
         /**
-         * MIME type of a document which is a directory that may contain additional
-         * documents.
-         */
-        public static final String MIME_TYPE_DIR = "vnd.android.doc/dir";
-
-        /**
-         * Flag indicating that a document is a directory that supports creation of
-         * new files within it.
-         *
-         * @see DocumentColumns#FLAGS
-         */
-        public static final int FLAG_SUPPORTS_CREATE = 1;
-
-        /**
-         * Flag indicating that a document is renamable.
-         *
-         * @see DocumentColumns#FLAGS
-         */
-        public static final int FLAG_SUPPORTS_RENAME = 1 << 1;
-
-        /**
-         * Flag indicating that a document is deletable.
-         *
-         * @see DocumentColumns#FLAGS
-         */
-        public static final int FLAG_SUPPORTS_DELETE = 1 << 2;
-
-        /**
-         * Flag indicating that a document can be represented as a thumbnail.
-         *
-         * @see DocumentColumns#FLAGS
-         */
-        public static final int FLAG_SUPPORTS_THUMBNAIL = 1 << 3;
-
-        /**
-         * Flag indicating that a document is a directory that supports search.
-         *
-         * @see DocumentColumns#FLAGS
-         */
-        public static final int FLAG_SUPPORTS_SEARCH = 1 << 4;
-
-        /**
-         * Flag indicating that a document supports writing.
-         *
-         * @see DocumentColumns#FLAGS
-         */
-        public static final int FLAG_SUPPORTS_WRITE = 1 << 5;
-
-        /**
-         * Flag indicating that a document is a directory that prefers its contents
-         * be shown in a larger format grid. Usually suitable when a directory
-         * contains mostly pictures.
-         *
-         * @see DocumentColumns#FLAGS
-         */
-        public static final int FLAG_PREFERS_GRID = 1 << 6;
-    }
-
-    /**
-     * Extra boolean flag included in a directory {@link Cursor#getExtras()}
-     * indicating that a document provider is still loading data. For example, a
-     * provider has returned some results, but is still waiting on an
-     * outstanding network request.
-     *
-     * @see ContentResolver#notifyChange(Uri, android.database.ContentObserver,
-     *      boolean)
-     */
-    public static final String EXTRA_LOADING = "loading";
-
-    /**
-     * Extra string included in a directory {@link Cursor#getExtras()}
-     * providing an informational message that should be shown to a user. For
-     * example, a provider may wish to indicate that not all documents are
-     * available.
-     */
-    public static final String EXTRA_INFO = "info";
-
-    /**
-     * Extra string included in a directory {@link Cursor#getExtras()} providing
-     * an error message that should be shown to a user. For example, a provider
-     * may wish to indicate that a network error occurred. The user may choose
-     * to retry, resulting in a new query.
-     */
-    public static final String EXTRA_ERROR = "error";
-
-    /** {@hide} */
-    public static final String METHOD_GET_ROOTS = "android:getRoots";
-    /** {@hide} */
-    public static final String METHOD_CREATE_DOCUMENT = "android:createDocument";
-    /** {@hide} */
-    public static final String METHOD_RENAME_DOCUMENT = "android:renameDocument";
-    /** {@hide} */
-    public static final String METHOD_DELETE_DOCUMENT = "android:deleteDocument";
-
-    /** {@hide} */
-    public static final String EXTRA_AUTHORITY = "authority";
-    /** {@hide} */
-    public static final String EXTRA_PACKAGE_NAME = "packageName";
-    /** {@hide} */
-    public static final String EXTRA_URI = "uri";
-    /** {@hide} */
-    public static final String EXTRA_ROOTS = "roots";
-    /** {@hide} */
-    public static final String EXTRA_THUMBNAIL_SIZE = "thumbnail_size";
-
-    private static final String PATH_DOCS = "docs";
-    private static final String PATH_CHILDREN = "children";
-    private static final String PATH_SEARCH = "search";
-
-    private static final String PARAM_QUERY = "query";
-
-    /**
-     * Build Uri representing the given {@link DocumentColumns#DOC_ID} in a
-     * document provider.
-     */
-    public static Uri buildDocumentUri(String authority, String docId) {
-        return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
-                .authority(authority).appendPath(PATH_DOCS).appendPath(docId).build();
-    }
-
-    /**
-     * Build Uri representing the contents of the given directory in a document
-     * provider. The given document must be {@link Documents#MIME_TYPE_DIR}.
-     *
-     * @hide
-     */
-    public static Uri buildChildrenUri(String authority, String docId) {
-        return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT).authority(authority)
-                .appendPath(PATH_DOCS).appendPath(docId).appendPath(PATH_CHILDREN).build();
-    }
-
-    /**
-     * Build Uri representing a search for matching documents under a specific
-     * directory in a document provider. The given document must have
-     * {@link Documents#FLAG_SUPPORTS_SEARCH}.
-     *
-     * @hide
-     */
-    public static Uri buildSearchUri(String authority, String docId, String query) {
-        return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT).authority(authority)
-                .appendPath(PATH_DOCS).appendPath(docId).appendPath(PATH_SEARCH)
-                .appendQueryParameter(PARAM_QUERY, query).build();
-    }
-
-    /**
-     * Extract the {@link DocumentColumns#DOC_ID} from the given Uri.
-     */
-    public static String getDocId(Uri documentUri) {
-        final List<String> paths = documentUri.getPathSegments();
-        if (paths.size() < 2) {
-            throw new IllegalArgumentException("Not a document: " + documentUri);
-        }
-        if (!PATH_DOCS.equals(paths.get(0))) {
-            throw new IllegalArgumentException("Not a document: " + documentUri);
-        }
-        return paths.get(1);
-    }
-
-    /** {@hide} */
-    public static String getSearchQuery(Uri documentUri) {
-        return documentUri.getQueryParameter(PARAM_QUERY);
-    }
-
-    /**
-     * Standard columns for document queries. Document providers <em>must</em>
-     * support at least these columns when queried.
-     */
-    public interface DocumentColumns extends OpenableColumns {
-        /**
-         * Unique ID for a document. Values <em>must</em> never change once
-         * returned, since they may used for long-term Uri permission grants.
+         * Unique ID of a document. This ID is both provided by and interpreted
+         * by a {@link DocumentsProvider}, and should be treated as an opaque
+         * value by client applications.
+         * <p>
+         * Each document must have a unique ID within a provider, but that
+         * single document may be included as a child of multiple directories.
+         * <p>
+         * A provider must always return durable IDs, since they will be used to
+         * issue long-term Uri permission grants when an application interacts
+         * with {@link Intent#ACTION_OPEN_DOCUMENT} and
+         * {@link Intent#ACTION_CREATE_DOCUMENT}.
          * <p>
          * Type: STRING
          */
-        public static final String DOC_ID = "doc_id";
+        public static final String COLUMN_DOCUMENT_ID = "document_id";
 
         /**
-         * MIME type of a document.
+         * Concrete MIME type of a document. For example, "image/png" or
+         * "application/pdf" for openable files. A document can also be a
+         * directory containing additional documents, which is represented with
+         * the {@link #MIME_TYPE_DIR} MIME type.
          * <p>
          * Type: STRING
          *
-         * @see Documents#MIME_TYPE_DIR
+         * @see #MIME_TYPE_DIR
          */
-        public static final String MIME_TYPE = "mime_type";
+        public static final String COLUMN_MIME_TYPE = "mime_type";
+
+        /**
+         * Display name of a document, used as the primary title displayed to a
+         * user.
+         * <p>
+         * Type: STRING
+         */
+        public static final String COLUMN_DISPLAY_NAME = OpenableColumns.DISPLAY_NAME;
+
+        /**
+         * Summary of a document, which may be shown to a user. The summary may
+         * be {@code null}.
+         * <p>
+         * Type: STRING
+         */
+        public static final String COLUMN_SUMMARY = "summary";
 
         /**
          * Timestamp when a document was last modified, in milliseconds since
-         * January 1, 1970 00:00:00.0 UTC, or {@code null} if unknown. Document
-         * providers can update this field using events from
+         * January 1, 1970 00:00:00.0 UTC, or {@code null} if unknown. A
+         * {@link DocumentsProvider} can update this field using events from
          * {@link OnCloseListener} or other reliable
          * {@link ParcelFileDescriptor} transports.
          * <p>
@@ -283,71 +144,227 @@
          *
          * @see System#currentTimeMillis()
          */
-        public static final String LAST_MODIFIED = "last_modified";
+        public static final String COLUMN_LAST_MODIFIED = "last_modified";
 
         /**
-         * Specific icon resource for a document, or {@code null} to resolve
-         * default using {@link #MIME_TYPE}.
+         * Specific icon resource ID for a document, or {@code null} to use
+         * platform default icon based on {@link #COLUMN_MIME_TYPE}.
          * <p>
          * Type: INTEGER (int)
          */
-        public static final String ICON = "icon";
+        public static final String COLUMN_ICON = "icon";
 
         /**
-         * Summary for a document, or {@code null} to omit.
-         * <p>
-         * Type: STRING
-         */
-        public static final String SUMMARY = "summary";
-
-        /**
-         * Flags that apply to a specific document.
+         * Flags that apply to a document.
          * <p>
          * Type: INTEGER (int)
+         *
+         * @see #FLAG_SUPPORTS_WRITE
+         * @see #FLAG_SUPPORTS_DELETE
+         * @see #FLAG_SUPPORTS_THUMBNAIL
+         * @see #FLAG_DIR_PREFERS_GRID
+         * @see #FLAG_DIR_SUPPORTS_CREATE
+         * @see #FLAG_DIR_SUPPORTS_SEARCH
          */
-        public static final String FLAGS = "flags";
+        public static final String COLUMN_FLAGS = "flags";
+
+        /**
+         * Size of a document, in bytes, or {@code null} if unknown.
+         * <p>
+         * Type: INTEGER (long)
+         */
+        public static final String COLUMN_SIZE = OpenableColumns.SIZE;
+
+        /**
+         * MIME type of a document which is a directory that may contain
+         * additional documents.
+         *
+         * @see #COLUMN_MIME_TYPE
+         */
+        public static final String MIME_TYPE_DIR = "vnd.android.document/directory";
+
+        /**
+         * Flag indicating that a document can be represented as a thumbnail.
+         *
+         * @see #COLUMN_FLAGS
+         * @see DocumentsContract#getDocumentThumbnail(ContentResolver, Uri,
+         *      Point, CancellationSignal)
+         * @see DocumentsProvider#openDocumentThumbnail(String, Point,
+         *      android.os.CancellationSignal)
+         */
+        public static final int FLAG_SUPPORTS_THUMBNAIL = 1;
+
+        /**
+         * Flag indicating that a document supports writing.
+         * <p>
+         * When a document is opened with {@link Intent#ACTION_OPEN_DOCUMENT},
+         * the calling application is granted both
+         * {@link Intent#FLAG_GRANT_READ_URI_PERMISSION} and
+         * {@link Intent#FLAG_GRANT_WRITE_URI_PERMISSION}. However, the actual
+         * writability of a document may change over time, for example due to
+         * remote access changes. This flag indicates that a document client can
+         * expect {@link ContentResolver#openOutputStream(Uri)} to succeed.
+         *
+         * @see #COLUMN_FLAGS
+         */
+        public static final int FLAG_SUPPORTS_WRITE = 1 << 1;
+
+        /**
+         * Flag indicating that a document is deletable.
+         *
+         * @see #COLUMN_FLAGS
+         * @see DocumentsContract#deleteDocument(ContentResolver, Uri)
+         * @see DocumentsProvider#deleteDocument(String)
+         */
+        public static final int FLAG_SUPPORTS_DELETE = 1 << 2;
+
+        /**
+         * Flag indicating that a document is a directory that supports creation
+         * of new files within it. Only valid when {@link #COLUMN_MIME_TYPE} is
+         * {@link #MIME_TYPE_DIR}.
+         *
+         * @see #COLUMN_FLAGS
+         * @see DocumentsContract#createDocument(ContentResolver, Uri, String,
+         *      String)
+         * @see DocumentsProvider#createDocument(String, String, String)
+         */
+        public static final int FLAG_DIR_SUPPORTS_CREATE = 1 << 3;
+
+        /**
+         * Flag indicating that a directory supports search. Only valid when
+         * {@link #COLUMN_MIME_TYPE} is {@link #MIME_TYPE_DIR}.
+         *
+         * @see #COLUMN_FLAGS
+         * @see DocumentsProvider#querySearchDocuments(String, String,
+         *      String[])
+         */
+        public static final int FLAG_DIR_SUPPORTS_SEARCH = 1 << 4;
+
+        /**
+         * Flag indicating that a directory prefers its contents be shown in a
+         * larger format grid. Usually suitable when a directory contains mostly
+         * pictures. Only valid when {@link #COLUMN_MIME_TYPE} is
+         * {@link #MIME_TYPE_DIR}.
+         *
+         * @see #COLUMN_FLAGS
+         */
+        public static final int FLAG_DIR_PREFERS_GRID = 1 << 5;
     }
 
     /**
-     * Metadata about a specific root of documents.
+     * Constants related to a root of documents, including {@link Cursor}
+     * columns names and flags.
+     * <p>
+     * All columns are <em>read-only</em> to client applications.
      */
-    public final static class DocumentRoot implements Parcelable {
+    public final static class Root {
+        private Root() {
+        }
+
         /**
-         * Root that represents a storage service, such as a cloud-based
+         * Unique ID of a root. This ID is both provided by and interpreted by a
+         * {@link DocumentsProvider}, and should be treated as an opaque value
+         * by client applications.
+         * <p>
+         * Type: STRING
+         */
+        public static final String COLUMN_ROOT_ID = "root_id";
+
+        /**
+         * Type of a root, used for clustering when presenting multiple roots to
+         * a user.
+         * <p>
+         * Type: INTEGER (int)
+         *
+         * @see #ROOT_TYPE_SERVICE
+         * @see #ROOT_TYPE_SHORTCUT
+         * @see #ROOT_TYPE_DEVICE
+         */
+        public static final String COLUMN_ROOT_TYPE = "root_type";
+
+        /**
+         * Flags that apply to a root.
+         * <p>
+         * Type: INTEGER (int)
+         *
+         * @see #FLAG_LOCAL_ONLY
+         * @see #FLAG_SUPPORTS_CREATE
+         * @see #FLAG_ADVANCED
+         * @see #FLAG_PROVIDES_AUDIO
+         * @see #FLAG_PROVIDES_IMAGES
+         * @see #FLAG_PROVIDES_VIDEO
+         */
+        public static final String COLUMN_FLAGS = "flags";
+
+        /**
+         * Icon resource ID for a root.
+         * <p>
+         * Type: INTEGER (int)
+         */
+        public static final String COLUMN_ICON = "icon";
+
+        /**
+         * Title for a root, which will be shown to a user.
+         * <p>
+         * Type: STRING
+         */
+        public static final String COLUMN_TITLE = "title";
+
+        /**
+         * Summary for this root, which may be shown to a user. The summary may
+         * be {@code null}.
+         * <p>
+         * Type: STRING
+         */
+        public static final String COLUMN_SUMMARY = "summary";
+
+        /**
+         * Document which is a directory that represents the top directory of
+         * this root.
+         * <p>
+         * Type: STRING
+         *
+         * @see Document#COLUMN_DOCUMENT_ID
+         */
+        public static final String COLUMN_DOCUMENT_ID = "document_id";
+
+        /**
+         * Number of bytes available in this root, or {@code null} if unknown or
+         * unbounded.
+         * <p>
+         * Type: INTEGER (long)
+         */
+        public static final String COLUMN_AVAILABLE_BYTES = "available_bytes";
+
+        /**
+         * Type of root that represents a storage service, such as a cloud-based
          * service.
          *
-         * @see #rootType
+         * @see #COLUMN_ROOT_TYPE
          */
         public static final int ROOT_TYPE_SERVICE = 1;
 
         /**
-         * Root that represents a shortcut to content that may be available
-         * elsewhere through another storage root.
+         * Type of root that represents a shortcut to content that may be
+         * available elsewhere through another storage root.
          *
-         * @see #rootType
+         * @see #COLUMN_ROOT_TYPE
          */
         public static final int ROOT_TYPE_SHORTCUT = 2;
 
         /**
-         * Root that represents a physical storage device.
+         * Type of root that represents a physical storage device.
          *
-         * @see #rootType
+         * @see #COLUMN_ROOT_TYPE
          */
         public static final int ROOT_TYPE_DEVICE = 3;
 
         /**
-         * Root that represents a physical storage device that should only be
-         * displayed to advanced users.
-         *
-         * @see #rootType
-         */
-        public static final int ROOT_TYPE_DEVICE_ADVANCED = 4;
-
-        /**
          * Flag indicating that at least one directory under this root supports
-         * creating content.
+         * creating content. Roots with this flag will be shown when an
+         * application interacts with {@link Intent#ACTION_CREATE_DOCUMENT}.
          *
-         * @see #flags
+         * @see #COLUMN_FLAGS
          */
         public static final int FLAG_SUPPORTS_CREATE = 1;
 
@@ -355,138 +372,210 @@
          * Flag indicating that this root offers content that is strictly local
          * on the device. That is, no network requests are made for the content.
          *
-         * @see #flags
+         * @see #COLUMN_FLAGS
+         * @see Intent#EXTRA_LOCAL_ONLY
          */
         public static final int FLAG_LOCAL_ONLY = 1 << 1;
 
-        /** {@hide} */
-        public String authority;
-
         /**
-         * Root type, use for clustering.
+         * Flag indicating that this root should only be visible to advanced
+         * users.
          *
-         * @see #ROOT_TYPE_SERVICE
-         * @see #ROOT_TYPE_DEVICE
+         * @see #COLUMN_FLAGS
          */
-        public int rootType;
+        public static final int FLAG_ADVANCED = 1 << 2;
 
         /**
-         * Flags for this root.
+         * Flag indicating that a root offers audio documents. When a user is
+         * selecting audio, roots not providing audio may be excluded.
          *
-         * @see #FLAG_LOCAL_ONLY
+         * @see #COLUMN_FLAGS
+         * @see Intent#EXTRA_MIME_TYPES
          */
-        public int flags;
+        public static final int FLAG_PROVIDES_AUDIO = 1 << 3;
 
         /**
-         * Icon resource ID for this root.
-         */
-        public int icon;
-
-        /**
-         * Title for this root.
-         */
-        public String title;
-
-        /**
-         * Summary for this root. May be {@code null}.
-         */
-        public String summary;
-
-        /**
-         * Document which is a directory that represents the top of this root.
-         * Must not be {@code null}.
+         * Flag indicating that a root offers video documents. When a user is
+         * selecting video, roots not providing video may be excluded.
          *
-         * @see DocumentColumns#DOC_ID
+         * @see #COLUMN_FLAGS
+         * @see Intent#EXTRA_MIME_TYPES
          */
-        public String docId;
+        public static final int FLAG_PROVIDES_VIDEO = 1 << 4;
 
         /**
-         * Document which is a directory representing recently modified
-         * documents under this root. This directory should return at most two
-         * dozen documents modified within the last 90 days. May be {@code null}
-         * if this root doesn't support recents.
+         * Flag indicating that a root offers image documents. When a user is
+         * selecting images, roots not providing images may be excluded.
          *
-         * @see DocumentColumns#DOC_ID
+         * @see #COLUMN_FLAGS
+         * @see Intent#EXTRA_MIME_TYPES
          */
-        public String recentDocId;
+        public static final int FLAG_PROVIDES_IMAGES = 1 << 5;
 
         /**
-         * Number of free bytes of available in this root, or -1 if unknown or
-         * unbounded.
+         * Flag indicating that this root can report recently modified
+         * documents.
+         *
+         * @see #COLUMN_FLAGS
+         * @see DocumentsContract#buildRecentDocumentsUri(String, String)
          */
-        public long availableBytes;
+        public static final int FLAG_SUPPORTS_RECENTS = 1 << 6;
+    }
 
-        /**
-         * Set of MIME type filters describing the content offered by this root,
-         * or {@code null} to indicate that all MIME types are supported. For
-         * example, a provider only supporting audio and video might set this to
-         * {@code ["audio/*", "video/*"]}.
-         */
-        public String[] mimeTypes;
+    /**
+     * Optional boolean flag included in a directory {@link Cursor#getExtras()}
+     * indicating that a document provider is still loading data. For example, a
+     * provider has returned some results, but is still waiting on an
+     * outstanding network request. The provider must send a content changed
+     * notification when loading is finished.
+     *
+     * @see ContentResolver#notifyChange(Uri, android.database.ContentObserver,
+     *      boolean)
+     */
+    public static final String EXTRA_LOADING = "loading";
 
-        public DocumentRoot() {
+    /**
+     * Optional string included in a directory {@link Cursor#getExtras()}
+     * providing an informational message that should be shown to a user. For
+     * example, a provider may wish to indicate that not all documents are
+     * available.
+     */
+    public static final String EXTRA_INFO = "info";
+
+    /**
+     * Optional string included in a directory {@link Cursor#getExtras()}
+     * providing an error message that should be shown to a user. For example, a
+     * provider may wish to indicate that a network error occurred. The user may
+     * choose to retry, resulting in a new query.
+     */
+    public static final String EXTRA_ERROR = "error";
+
+    /** {@hide} */
+    public static final String METHOD_CREATE_DOCUMENT = "android:createDocument";
+    /** {@hide} */
+    public static final String METHOD_DELETE_DOCUMENT = "android:deleteDocument";
+
+    /** {@hide} */
+    public static final String EXTRA_THUMBNAIL_SIZE = "thumbnail_size";
+
+    private static final String PATH_ROOT = "root";
+    private static final String PATH_RECENT = "recent";
+    private static final String PATH_DOCUMENT = "document";
+    private static final String PATH_CHILDREN = "children";
+    private static final String PATH_SEARCH = "search";
+
+    private static final String PARAM_QUERY = "query";
+
+    /**
+     * Build Uri representing the roots of a document provider. When queried, a
+     * provider will return one or more rows with columns defined by
+     * {@link Root}.
+     *
+     * @see DocumentsProvider#queryRoots(String[])
+     */
+    public static Uri buildRootsUri(String authority) {
+        return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
+                .authority(authority).appendPath(PATH_ROOT).build();
+    }
+
+    /**
+     * Build Uri representing the recently modified documents of a specific
+     * root. When queried, a provider will return zero or more rows with columns
+     * defined by {@link Document}.
+     *
+     * @see DocumentsProvider#queryRecentDocuments(String, String[])
+     * @see #getRootId(Uri)
+     */
+    public static Uri buildRecentDocumentsUri(String authority, String rootId) {
+        return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
+                .authority(authority).appendPath(PATH_ROOT).appendPath(rootId)
+                .appendPath(PATH_RECENT).build();
+    }
+
+    /**
+     * Build Uri representing the given {@link Document#COLUMN_DOCUMENT_ID} in a
+     * document provider. When queried, a provider will return a single row with
+     * columns defined by {@link Document}.
+     *
+     * @see DocumentsProvider#queryDocument(String, String[])
+     * @see #getDocumentId(Uri)
+     */
+    public static Uri buildDocumentUri(String authority, String documentId) {
+        return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
+                .authority(authority).appendPath(PATH_DOCUMENT).appendPath(documentId).build();
+    }
+
+    /**
+     * Build Uri representing the children of the given directory in a document
+     * provider. When queried, a provider will return zero or more rows with
+     * columns defined by {@link Document}.
+     *
+     * @param parentDocumentId the document to return children for, which must
+     *            be a directory with MIME type of
+     *            {@link Document#MIME_TYPE_DIR}.
+     * @see DocumentsProvider#queryChildDocuments(String, String[], String)
+     * @see #getDocumentId(Uri)
+     */
+    public static Uri buildChildDocumentsUri(String authority, String parentDocumentId) {
+        return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT).authority(authority)
+                .appendPath(PATH_DOCUMENT).appendPath(parentDocumentId).appendPath(PATH_CHILDREN)
+                .build();
+    }
+
+    /**
+     * Build Uri representing a search for matching documents under a specific
+     * directory in a document provider. When queried, a provider will return
+     * zero or more rows with columns defined by {@link Document}.
+     *
+     * @param parentDocumentId the document to return children for, which must
+     *            be both a directory with MIME type of
+     *            {@link Document#MIME_TYPE_DIR} and have
+     *            {@link Document#FLAG_DIR_SUPPORTS_SEARCH} set.
+     * @see DocumentsProvider#querySearchDocuments(String, String, String[])
+     * @see #getDocumentId(Uri)
+     * @see #getSearchDocumentsQuery(Uri)
+     */
+    public static Uri buildSearchDocumentsUri(
+            String authority, String parentDocumentId, String query) {
+        return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT).authority(authority)
+                .appendPath(PATH_DOCUMENT).appendPath(parentDocumentId).appendPath(PATH_SEARCH)
+                .appendQueryParameter(PARAM_QUERY, query).build();
+    }
+
+    /**
+     * Extract the {@link Root#COLUMN_ROOT_ID} from the given Uri.
+     */
+    public static String getRootId(Uri rootUri) {
+        final List<String> paths = rootUri.getPathSegments();
+        if (paths.size() < 2) {
+            throw new IllegalArgumentException("Not a root: " + rootUri);
         }
-
-        /** {@hide} */
-        public DocumentRoot(Parcel in) {
-            rootType = in.readInt();
-            flags = in.readInt();
-            icon = in.readInt();
-            title = in.readString();
-            summary = in.readString();
-            docId = in.readString();
-            recentDocId = in.readString();
-            availableBytes = in.readLong();
-            mimeTypes = in.readStringArray();
+        if (!PATH_ROOT.equals(paths.get(0))) {
+            throw new IllegalArgumentException("Not a root: " + rootUri);
         }
+        return paths.get(1);
+    }
 
-        /** {@hide} */
-        public Drawable loadIcon(Context context) {
-            if (icon != 0) {
-                if (authority != null) {
-                    final PackageManager pm = context.getPackageManager();
-                    final ProviderInfo info = pm.resolveContentProvider(authority, 0);
-                    if (info != null) {
-                        return pm.getDrawable(info.packageName, icon, info.applicationInfo);
-                    }
-                } else {
-                    return context.getResources().getDrawable(icon);
-                }
-            }
-            return null;
+    /**
+     * Extract the {@link Document#COLUMN_DOCUMENT_ID} from the given Uri.
+     */
+    public static String getDocumentId(Uri documentUri) {
+        final List<String> paths = documentUri.getPathSegments();
+        if (paths.size() < 2) {
+            throw new IllegalArgumentException("Not a document: " + documentUri);
         }
-
-        @Override
-        public int describeContents() {
-            return 0;
+        if (!PATH_DOCUMENT.equals(paths.get(0))) {
+            throw new IllegalArgumentException("Not a document: " + documentUri);
         }
+        return paths.get(1);
+    }
 
-        @Override
-        public void writeToParcel(Parcel dest, int flags) {
-            Preconditions.checkNotNull(docId);
-
-            dest.writeInt(rootType);
-            dest.writeInt(flags);
-            dest.writeInt(icon);
-            dest.writeString(title);
-            dest.writeString(summary);
-            dest.writeString(docId);
-            dest.writeString(recentDocId);
-            dest.writeLong(availableBytes);
-            dest.writeStringArray(mimeTypes);
-        }
-
-        public static final Creator<DocumentRoot> CREATOR = new Creator<DocumentRoot>() {
-            @Override
-            public DocumentRoot createFromParcel(Parcel in) {
-                return new DocumentRoot(in);
-            }
-
-            @Override
-            public DocumentRoot[] newArray(int size) {
-                return new DocumentRoot[size];
-            }
-        };
+    /**
+     * Extract the search query from a Uri built by
+     * {@link #buildSearchDocumentsUri(String, String, String)}.
+     */
+    public static String getSearchDocumentsQuery(Uri searchDocumentsUri) {
+        return searchDocumentsUri.getQueryParameter(PARAM_QUERY);
     }
 
     /**
@@ -497,6 +586,7 @@
      * {@link Intent#ACTION_CREATE_DOCUMENT}.
      *
      * @see Context#grantUriPermission(String, Uri, int)
+     * @see Context#revokeUriPermission(Uri, int)
      * @see ContentResolver#getIncomingUriPermissionGrants(int, int)
      */
     public static Uri[] getOpenDocuments(Context context) {
@@ -520,20 +610,28 @@
     }
 
     /**
-     * Return thumbnail representing the document at the given URI. Callers are
-     * responsible for their own in-memory caching. Given document must have
-     * {@link Documents#FLAG_SUPPORTS_THUMBNAIL} set.
+     * Return thumbnail representing the document at the given Uri. Callers are
+     * responsible for their own in-memory caching.
      *
+     * @param documentUri document to return thumbnail for, which must have
+     *            {@link Document#FLAG_SUPPORTS_THUMBNAIL} set.
+     * @param size optimal thumbnail size desired. A provider may return a
+     *            thumbnail of a different size, but never more than double the
+     *            requested size.
+     * @param signal signal used to indicate that caller is no longer interested
+     *            in the thumbnail.
      * @return decoded thumbnail, or {@code null} if problem was encountered.
-     * @hide
+     * @see DocumentsProvider#openDocumentThumbnail(String, Point,
+     *      android.os.CancellationSignal)
      */
-    public static Bitmap getThumbnail(ContentResolver resolver, Uri documentUri, Point size) {
+    public static Bitmap getDocumentThumbnail(
+            ContentResolver resolver, Uri documentUri, Point size, CancellationSignal signal) {
         final Bundle openOpts = new Bundle();
         openOpts.putParcelable(DocumentsContract.EXTRA_THUMBNAIL_SIZE, size);
 
         AssetFileDescriptor afd = null;
         try {
-            afd = resolver.openTypedAssetFileDescriptor(documentUri, "image/*", openOpts);
+            afd = resolver.openTypedAssetFileDescriptor(documentUri, "image/*", openOpts, signal);
 
             final FileDescriptor fd = afd.getFileDescriptor();
             final long offset = afd.getStartOffset();
@@ -583,38 +681,26 @@
         }
     }
 
-    /** {@hide} */
-    public static List<DocumentRoot> getDocumentRoots(ContentProviderClient client) {
-        try {
-            final Bundle out = client.call(METHOD_GET_ROOTS, null, null);
-            final List<DocumentRoot> roots = out.getParcelableArrayList(EXTRA_ROOTS);
-            return roots;
-        } catch (Exception e) {
-            Log.w(TAG, "Failed to get roots", e);
-            return null;
-        }
-    }
-
     /**
-     * Create a new document under the given parent document with MIME type and
-     * display name.
+     * Create a new document with given MIME type and display name.
      *
-     * @param docId document with {@link Documents#FLAG_SUPPORTS_CREATE}
+     * @param parentDocumentUri directory with
+     *            {@link Document#FLAG_DIR_SUPPORTS_CREATE}
      * @param mimeType MIME type of new document
      * @param displayName name of new document
      * @return newly created document, or {@code null} if failed
-     * @hide
      */
-    public static String createDocument(
-            ContentProviderClient client, String docId, String mimeType, String displayName) {
+    public static Uri createDocument(ContentResolver resolver, Uri parentDocumentUri,
+            String mimeType, String displayName) {
         final Bundle in = new Bundle();
-        in.putString(DocumentColumns.DOC_ID, docId);
-        in.putString(DocumentColumns.MIME_TYPE, mimeType);
-        in.putString(DocumentColumns.DISPLAY_NAME, displayName);
+        in.putString(Document.COLUMN_DOCUMENT_ID, getDocumentId(parentDocumentUri));
+        in.putString(Document.COLUMN_MIME_TYPE, mimeType);
+        in.putString(Document.COLUMN_DISPLAY_NAME, displayName);
 
         try {
-            final Bundle out = client.call(METHOD_CREATE_DOCUMENT, null, in);
-            return out.getString(DocumentColumns.DOC_ID);
+            final Bundle out = resolver.call(parentDocumentUri, METHOD_CREATE_DOCUMENT, null, in);
+            return buildDocumentUri(
+                    parentDocumentUri.getAuthority(), out.getString(Document.COLUMN_DOCUMENT_ID));
         } catch (Exception e) {
             Log.w(TAG, "Failed to create document", e);
             return null;
@@ -622,40 +708,16 @@
     }
 
     /**
-     * Rename the given document.
-     *
-     * @param docId document with {@link Documents#FLAG_SUPPORTS_RENAME}
-     * @return document which may have changed due to rename, or {@code null} if
-     *         rename failed.
-     * @hide
-     */
-    public static String renameDocument(
-            ContentProviderClient client, String docId, String displayName) {
-        final Bundle in = new Bundle();
-        in.putString(DocumentColumns.DOC_ID, docId);
-        in.putString(DocumentColumns.DISPLAY_NAME, displayName);
-
-        try {
-            final Bundle out = client.call(METHOD_RENAME_DOCUMENT, null, in);
-            return out.getString(DocumentColumns.DOC_ID);
-        } catch (Exception e) {
-            Log.w(TAG, "Failed to rename document", e);
-            return null;
-        }
-    }
-
-    /**
      * Delete the given document.
      *
-     * @param docId document with {@link Documents#FLAG_SUPPORTS_DELETE}
-     * @hide
+     * @param documentUri document with {@link Document#FLAG_SUPPORTS_DELETE}
      */
-    public static boolean deleteDocument(ContentProviderClient client, String docId) {
+    public static boolean deleteDocument(ContentResolver resolver, Uri documentUri) {
         final Bundle in = new Bundle();
-        in.putString(DocumentColumns.DOC_ID, docId);
+        in.putString(Document.COLUMN_DOCUMENT_ID, getDocumentId(documentUri));
 
         try {
-            client.call(METHOD_DELETE_DOCUMENT, null, in);
+            final Bundle out = resolver.call(documentUri, METHOD_DELETE_DOCUMENT, null, in);
             return true;
         } catch (Exception e) {
             Log.w(TAG, "Failed to delete document", e);
diff --git a/core/java/android/provider/DocumentsProvider.java b/core/java/android/provider/DocumentsProvider.java
index eeb8c41..09f4866 100644
--- a/core/java/android/provider/DocumentsProvider.java
+++ b/core/java/android/provider/DocumentsProvider.java
@@ -16,16 +16,12 @@
 
 package android.provider;
 
-import static android.provider.DocumentsContract.ACTION_DOCUMENT_ROOT_CHANGED;
-import static android.provider.DocumentsContract.EXTRA_AUTHORITY;
-import static android.provider.DocumentsContract.EXTRA_ROOTS;
 import static android.provider.DocumentsContract.EXTRA_THUMBNAIL_SIZE;
 import static android.provider.DocumentsContract.METHOD_CREATE_DOCUMENT;
 import static android.provider.DocumentsContract.METHOD_DELETE_DOCUMENT;
-import static android.provider.DocumentsContract.METHOD_GET_ROOTS;
-import static android.provider.DocumentsContract.METHOD_RENAME_DOCUMENT;
-import static android.provider.DocumentsContract.getDocId;
-import static android.provider.DocumentsContract.getSearchQuery;
+import static android.provider.DocumentsContract.getDocumentId;
+import static android.provider.DocumentsContract.getRootId;
+import static android.provider.DocumentsContract.getSearchDocumentsQuery;
 
 import android.content.ContentProvider;
 import android.content.ContentValues;
@@ -41,15 +37,12 @@
 import android.os.CancellationSignal;
 import android.os.ParcelFileDescriptor;
 import android.os.ParcelFileDescriptor.OnCloseListener;
-import android.provider.DocumentsContract.DocumentColumns;
-import android.provider.DocumentsContract.DocumentRoot;
-import android.provider.DocumentsContract.Documents;
+import android.provider.DocumentsContract.Document;
 import android.util.Log;
 
 import libcore.io.IoUtils;
 
 import java.io.FileNotFoundException;
-import java.util.List;
 
 /**
  * Base class for a document provider. A document provider should extend this
@@ -58,13 +51,13 @@
  * Each document provider expresses one or more "roots" which each serve as the
  * top-level of a tree. For example, a root could represent an account, or a
  * physical storage device. Under each root, documents are referenced by
- * {@link DocumentColumns#DOC_ID}, which must not change once returned.
+ * {@link Document#COLUMN_DOCUMENT_ID}, which must not change once returned.
  * <p>
  * Documents can be either an openable file (with a specific MIME type), or a
  * directory containing additional documents (with the
- * {@link Documents#MIME_TYPE_DIR} MIME type). Each document can have different
- * capabilities, as described by {@link DocumentColumns#FLAGS}. The same
- * {@link DocumentColumns#DOC_ID} can be included in multiple directories.
+ * {@link Document#MIME_TYPE_DIR} MIME type). Each document can have different
+ * capabilities, as described by {@link Document#COLUMN_FLAGS}. The same
+ * {@link Document#COLUMN_DOCUMENT_ID} can be included in multiple directories.
  * <p>
  * Document providers must be protected with the
  * {@link android.Manifest.permission#MANAGE_DOCUMENTS} permission, which can
@@ -78,22 +71,29 @@
 public abstract class DocumentsProvider extends ContentProvider {
     private static final String TAG = "DocumentsProvider";
 
-    private static final int MATCH_DOCUMENT = 1;
-    private static final int MATCH_CHILDREN = 2;
-    private static final int MATCH_SEARCH = 3;
+    private static final int MATCH_ROOT = 1;
+    private static final int MATCH_RECENT = 2;
+    private static final int MATCH_DOCUMENT = 3;
+    private static final int MATCH_CHILDREN = 4;
+    private static final int MATCH_SEARCH = 5;
 
     private String mAuthority;
 
     private UriMatcher mMatcher;
 
+    /**
+     * Implementation is provided by the parent class.
+     */
     @Override
     public void attachInfo(Context context, ProviderInfo info) {
         mAuthority = info.authority;
 
         mMatcher = new UriMatcher(UriMatcher.NO_MATCH);
-        mMatcher.addURI(mAuthority, "docs/*", MATCH_DOCUMENT);
-        mMatcher.addURI(mAuthority, "docs/*/children", MATCH_CHILDREN);
-        mMatcher.addURI(mAuthority, "docs/*/search", MATCH_SEARCH);
+        mMatcher.addURI(mAuthority, "root", MATCH_ROOT);
+        mMatcher.addURI(mAuthority, "root/*/recent", MATCH_RECENT);
+        mMatcher.addURI(mAuthority, "document/*", MATCH_DOCUMENT);
+        mMatcher.addURI(mAuthority, "document/*/children", MATCH_CHILDREN);
+        mMatcher.addURI(mAuthority, "document/*/search", MATCH_SEARCH);
 
         // Sanity check our setup
         if (!info.exported) {
@@ -111,83 +111,80 @@
     }
 
     /**
-     * Return list of all document roots provided by this document provider.
-     * When this list changes, a provider must call
-     * {@link #notifyDocumentRootsChanged()}.
-     */
-    public abstract List<DocumentRoot> getDocumentRoots();
-
-    /**
-     * Create and return a new document. A provider must allocate a new
-     * {@link DocumentColumns#DOC_ID} to represent the document, which must not
-     * change once returned.
+     * Create a new document and return its {@link Document#COLUMN_DOCUMENT_ID}.
+     * A provider must allocate a new {@link Document#COLUMN_DOCUMENT_ID} to
+     * represent the document, which must not change once returned.
      *
-     * @param docId the parent directory to create the new document under.
+     * @param documentId the parent directory to create the new document under.
      * @param mimeType the MIME type associated with the new document.
      * @param displayName the display name of the new document.
      */
     @SuppressWarnings("unused")
-    public String createDocument(String docId, String mimeType, String displayName)
+    public String createDocument(String documentId, String mimeType, String displayName)
             throws FileNotFoundException {
         throw new UnsupportedOperationException("Create not supported");
     }
 
     /**
-     * Rename the given document.
+     * Delete the given document. Upon returning, any Uri permission grants for
+     * the given document will be revoked. If additional documents were deleted
+     * as a side effect of this call, such as documents inside a directory, the
+     * implementor is responsible for revoking those permissions.
      *
-     * @param docId the document to rename.
-     * @param displayName the new display name.
+     * @param documentId the document to delete.
      */
     @SuppressWarnings("unused")
-    public void renameDocument(String docId, String displayName) throws FileNotFoundException {
-        throw new UnsupportedOperationException("Rename not supported");
+    public void deleteDocument(String documentId) throws FileNotFoundException {
+        throw new UnsupportedOperationException("Delete not supported");
     }
 
-    /**
-     * Delete the given document.
-     *
-     * @param docId the document to delete.
-     */
+    public abstract Cursor queryRoots(String[] projection) throws FileNotFoundException;
+
     @SuppressWarnings("unused")
-    public void deleteDocument(String docId) throws FileNotFoundException {
-        throw new UnsupportedOperationException("Delete not supported");
+    public Cursor queryRecentDocuments(String rootId, String[] projection)
+            throws FileNotFoundException {
+        throw new UnsupportedOperationException("Recent not supported");
     }
 
     /**
      * Return metadata for the given document. A provider should avoid making
      * network requests to keep this request fast.
      *
-     * @param docId the document to return.
+     * @param documentId the document to return.
      */
-    public abstract Cursor queryDocument(String docId) throws FileNotFoundException;
+    public abstract Cursor queryDocument(String documentId, String[] projection)
+            throws FileNotFoundException;
 
     /**
      * Return the children of the given document which is a directory.
      *
-     * @param docId the directory to return children for.
+     * @param parentDocumentId the directory to return children for.
      */
-    public abstract Cursor queryDocumentChildren(String docId) throws FileNotFoundException;
+    public abstract Cursor queryChildDocuments(
+            String parentDocumentId, String[] projection, String sortOrder)
+            throws FileNotFoundException;
 
     /**
      * Return documents that that match the given query, starting the search at
      * the given directory.
      *
-     * @param docId the directory to start search at.
+     * @param parentDocumentId the directory to start search at.
      */
     @SuppressWarnings("unused")
-    public Cursor querySearch(String docId, String query) throws FileNotFoundException {
+    public Cursor querySearchDocuments(String parentDocumentId, String query, String[] projection)
+            throws FileNotFoundException {
         throw new UnsupportedOperationException("Search not supported");
     }
 
     /**
      * Return MIME type for the given document. Must match the value of
-     * {@link DocumentColumns#MIME_TYPE} for this document.
+     * {@link Document#COLUMN_MIME_TYPE} for this document.
      */
-    public String getType(String docId) throws FileNotFoundException {
-        final Cursor cursor = queryDocument(docId);
+    public String getDocumentType(String documentId) throws FileNotFoundException {
+        final Cursor cursor = queryDocument(documentId, null);
         try {
             if (cursor.moveToFirst()) {
-                return cursor.getString(cursor.getColumnIndexOrThrow(DocumentColumns.MIME_TYPE));
+                return cursor.getString(cursor.getColumnIndexOrThrow(Document.COLUMN_MIME_TYPE));
             } else {
                 return null;
             }
@@ -233,7 +230,7 @@
      * @param sizeHint hint of the optimal thumbnail dimensions.
      * @param signal used by the caller to signal if the request should be
      *            cancelled.
-     * @see Documents#FLAG_SUPPORTS_THUMBNAIL
+     * @see Document#FLAG_SUPPORTS_THUMBNAIL
      */
     @SuppressWarnings("unused")
     public AssetFileDescriptor openDocumentThumbnail(
@@ -241,17 +238,31 @@
         throw new UnsupportedOperationException("Thumbnails not supported");
     }
 
+    /**
+     * Implementation is provided by the parent class. Cannot be overriden.
+     *
+     * @see #queryRoots(String[])
+     * @see #queryRecentDocuments(String, String[])
+     * @see #queryDocument(String, String[])
+     * @see #queryChildDocuments(String, String[], String)
+     * @see #querySearchDocuments(String, String, String[])
+     */
     @Override
-    public final Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
-            String sortOrder) {
+    public final Cursor query(Uri uri, String[] projection, String selection,
+            String[] selectionArgs, String sortOrder) {
         try {
             switch (mMatcher.match(uri)) {
+                case MATCH_ROOT:
+                    return queryRoots(projection);
+                case MATCH_RECENT:
+                    return queryRecentDocuments(getRootId(uri), projection);
                 case MATCH_DOCUMENT:
-                    return queryDocument(getDocId(uri));
+                    return queryDocument(getDocumentId(uri), projection);
                 case MATCH_CHILDREN:
-                    return queryDocumentChildren(getDocId(uri));
+                    return queryChildDocuments(getDocumentId(uri), projection, sortOrder);
                 case MATCH_SEARCH:
-                    return querySearch(getDocId(uri), getSearchQuery(uri));
+                    return querySearchDocuments(
+                            getDocumentId(uri), getSearchDocumentsQuery(uri), projection);
                 default:
                     throw new UnsupportedOperationException("Unsupported Uri " + uri);
             }
@@ -261,12 +272,17 @@
         }
     }
 
+    /**
+     * Implementation is provided by the parent class. Cannot be overriden.
+     *
+     * @see #getDocumentType(String)
+     */
     @Override
     public final String getType(Uri uri) {
         try {
             switch (mMatcher.match(uri)) {
                 case MATCH_DOCUMENT:
-                    return getType(getDocId(uri));
+                    return getDocumentType(getDocumentId(uri));
                 default:
                     return null;
             }
@@ -276,22 +292,39 @@
         }
     }
 
+    /**
+     * Implementation is provided by the parent class. Throws by default, and
+     * cannot be overriden.
+     *
+     * @see #createDocument(String, String, String)
+     */
     @Override
     public final Uri insert(Uri uri, ContentValues values) {
         throw new UnsupportedOperationException("Insert not supported");
     }
 
+    /**
+     * Implementation is provided by the parent class. Throws by default, and
+     * cannot be overriden.
+     *
+     * @see #deleteDocument(String)
+     */
     @Override
     public final int delete(Uri uri, String selection, String[] selectionArgs) {
         throw new UnsupportedOperationException("Delete not supported");
     }
 
+    /**
+     * Implementation is provided by the parent class. Throws by default, and
+     * cannot be overriden.
+     */
     @Override
     public final int update(
             Uri uri, ContentValues values, String selection, String[] selectionArgs) {
         throw new UnsupportedOperationException("Update not supported");
     }
 
+    /** {@hide} */
     @Override
     public final Bundle callFromPackage(
             String callingPackage, String method, String arg, Bundle extras) {
@@ -300,33 +333,25 @@
             return super.callFromPackage(callingPackage, method, arg, extras);
         }
 
-        // Platform operations require the caller explicitly hold manage
-        // permission; Uri permissions don't extend management operations.
-        getContext().enforceCallingOrSelfPermission(
-                android.Manifest.permission.MANAGE_DOCUMENTS, "Document management");
+        // Require that caller can manage given document
+        final String documentId = extras.getString(Document.COLUMN_DOCUMENT_ID);
+        final Uri documentUri = DocumentsContract.buildDocumentUri(mAuthority, documentId);
+        getContext().enforceCallingOrSelfUriPermission(
+                documentUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION, method);
 
         final Bundle out = new Bundle();
         try {
-            if (METHOD_GET_ROOTS.equals(method)) {
-                final List<DocumentRoot> roots = getDocumentRoots();
-                out.putParcelableList(EXTRA_ROOTS, roots);
+            if (METHOD_CREATE_DOCUMENT.equals(method)) {
+                final String mimeType = extras.getString(Document.COLUMN_MIME_TYPE);
+                final String displayName = extras.getString(Document.COLUMN_DISPLAY_NAME);
 
-            } else if (METHOD_CREATE_DOCUMENT.equals(method)) {
-                final String docId = extras.getString(DocumentColumns.DOC_ID);
-                final String mimeType = extras.getString(DocumentColumns.MIME_TYPE);
-                final String displayName = extras.getString(DocumentColumns.DISPLAY_NAME);
-
-                // TODO: issue Uri grant towards caller
-                final String newDocId = createDocument(docId, mimeType, displayName);
-                out.putString(DocumentColumns.DOC_ID, newDocId);
-
-            } else if (METHOD_RENAME_DOCUMENT.equals(method)) {
-                final String docId = extras.getString(DocumentColumns.DOC_ID);
-                final String displayName = extras.getString(DocumentColumns.DISPLAY_NAME);
-                renameDocument(docId, displayName);
+                // TODO: issue Uri grant towards calling package
+                // TODO: enforce that package belongs to caller
+                final String newDocumentId = createDocument(documentId, mimeType, displayName);
+                out.putString(Document.COLUMN_DOCUMENT_ID, newDocumentId);
 
             } else if (METHOD_DELETE_DOCUMENT.equals(method)) {
-                final String docId = extras.getString(DocumentColumns.DOC_ID);
+                final String docId = extras.getString(Document.COLUMN_DOCUMENT_ID);
                 deleteDocument(docId);
 
             } else {
@@ -338,47 +363,57 @@
         return out;
     }
 
+    /**
+     * Implementation is provided by the parent class.
+     *
+     * @see #openDocument(String, String, CancellationSignal)
+     */
     @Override
     public final ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
-        return openDocument(getDocId(uri), mode, null);
+        return openDocument(getDocumentId(uri), mode, null);
     }
 
+    /**
+     * Implementation is provided by the parent class.
+     *
+     * @see #openDocument(String, String, CancellationSignal)
+     */
     @Override
     public final ParcelFileDescriptor openFile(Uri uri, String mode, CancellationSignal signal)
             throws FileNotFoundException {
-        return openDocument(getDocId(uri), mode, signal);
+        return openDocument(getDocumentId(uri), mode, signal);
     }
 
+    /**
+     * Implementation is provided by the parent class.
+     *
+     * @see #openDocumentThumbnail(String, Point, CancellationSignal)
+     */
     @Override
     public final AssetFileDescriptor openTypedAssetFile(Uri uri, String mimeTypeFilter, Bundle opts)
             throws FileNotFoundException {
         if (opts != null && opts.containsKey(EXTRA_THUMBNAIL_SIZE)) {
             final Point sizeHint = opts.getParcelable(EXTRA_THUMBNAIL_SIZE);
-            return openDocumentThumbnail(getDocId(uri), sizeHint, null);
+            return openDocumentThumbnail(getDocumentId(uri), sizeHint, null);
         } else {
             return super.openTypedAssetFile(uri, mimeTypeFilter, opts);
         }
     }
 
+    /**
+     * Implementation is provided by the parent class.
+     *
+     * @see #openDocumentThumbnail(String, Point, CancellationSignal)
+     */
     @Override
     public final AssetFileDescriptor openTypedAssetFile(
             Uri uri, String mimeTypeFilter, Bundle opts, CancellationSignal signal)
             throws FileNotFoundException {
         if (opts != null && opts.containsKey(EXTRA_THUMBNAIL_SIZE)) {
             final Point sizeHint = opts.getParcelable(EXTRA_THUMBNAIL_SIZE);
-            return openDocumentThumbnail(getDocId(uri), sizeHint, signal);
+            return openDocumentThumbnail(getDocumentId(uri), sizeHint, signal);
         } else {
             return super.openTypedAssetFile(uri, mimeTypeFilter, opts, signal);
         }
     }
-
-    /**
-     * Notify system that {@link #getDocumentRoots()} has changed, usually due to an
-     * account or device change.
-     */
-    public void notifyDocumentRootsChanged() {
-        final Intent intent = new Intent(ACTION_DOCUMENT_ROOT_CHANGED);
-        intent.putExtra(EXTRA_AUTHORITY, mAuthority);
-        getContext().sendBroadcast(intent);
-    }
 }
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 802bedf..83e1544 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -690,6 +690,19 @@
     public static final String ACTION_NOTIFICATION_LISTENER_SETTINGS
             = "android.settings.NOTIFICATION_LISTENER_SETTINGS";
 
+    /**
+     * Activity Action: Show settings for video captioning.
+     * <p>
+     * In some cases, a matching Activity may not exist, so ensure you safeguard
+     * against this.
+     * <p>
+     * Input: Nothing.
+     * <p>
+     * Output: Nothing.
+     */
+    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+    public static final String ACTION_CAPTIONING_SETTINGS = "android.settings.CAPTIONING_SETTINGS";
+
     // End of Intent actions for Settings
 
     /**
@@ -3588,7 +3601,7 @@
          * <li>{@link #ACCESSIBILITY_CAPTIONING_EDGE_COLOR}
          * <li>{@link #ACCESSIBILITY_CAPTIONING_EDGE_TYPE}
          * <li>{@link #ACCESSIBILITY_CAPTIONING_TYPEFACE}
-         * <li>{@link #ACCESSIBILITY_CAPTIONING_FONT_SIZE}
+         * <li>{@link #ACCESSIBILITY_CAPTIONING_FONT_SCALE}
          * </ul>
          *
          * @hide
@@ -3610,9 +3623,8 @@
          * Integer property that specifies the preset style for captions, one
          * of:
          * <ul>
-         * <li>{@link android.view.accessibility.CaptioningManager#PRESET_WHITE_ON_BLACK}
-         * <li>{@link android.view.accessibility.CaptioningManager#PRESET_BLACK_ON_WHITE}
-         * <li>{@link android.view.accessibility.CaptioningManager#PRESET_CUSTOM}
+         * <li>{@link android.view.accessibility.CaptioningManager.CaptionStyle#PRESET_CUSTOM}
+         * <li>a valid index of {@link android.view.accessibility.CaptioningManager.CaptionStyle#PRESETS}
          * </ul>
          *
          * @see java.util.Locale#toString
@@ -3644,9 +3656,9 @@
         /**
          * Integer property that specifes the edge type for captions, one of:
          * <ul>
-         * <li>{@link android.view.accessibility.CaptioningManager#EDGE_TYPE_NONE}
-         * <li>{@link android.view.accessibility.CaptioningManager#EDGE_TYPE_OUTLINE}
-         * <li>{@link android.view.accessibility.CaptioningManager#EDGE_TYPE_DROP_SHADOWED}
+         * <li>{@link android.view.accessibility.CaptioningManager.CaptionStyle#EDGE_TYPE_NONE}
+         * <li>{@link android.view.accessibility.CaptioningManager.CaptionStyle#EDGE_TYPE_OUTLINE}
+         * <li>{@link android.view.accessibility.CaptioningManager.CaptionStyle#EDGE_TYPE_DROP_SHADOW}
          * </ul>
          *
          * @see #ACCESSIBILITY_CAPTIONING_EDGE_COLOR
@@ -3682,13 +3694,12 @@
                 "accessibility_captioning_typeface";
 
         /**
-         * Integer point property that specifies font size for captions in
-         * scaled pixels (sp).
+         * Floating point property that specifies font scaling for captions.
          *
          * @hide
          */
-        public static final String ACCESSIBILITY_CAPTIONING_FONT_SIZE =
-                "accessibility_captioning_font_size";
+        public static final String ACCESSIBILITY_CAPTIONING_FONT_SCALE =
+                "accessibility_captioning_font_scale";
 
         /**
          * The timout for considering a press to be a long press in milliseconds.
@@ -3697,13 +3708,22 @@
         public static final String LONG_PRESS_TIMEOUT = "long_press_timeout";
 
         /**
-         * List of the enabled print providers.
+         * List of the enabled print services.
          * @hide
          */
         public static final String ENABLED_PRINT_SERVICES =
             "enabled_print_services";
 
         /**
+         * List of the system print services we enabled on first boot. On
+         * first boot we enable all system, i.e. bundled print services,
+         * once, so they work out-of-the-box.
+         * @hide
+         */
+        public static final String ENABLED_ON_FIRST_BOOT_SYSTEM_PRINT_SERVICES =
+            "enabled_on_first_boot_system_print_services";
+
+        /**
          * Setting to always use the default text-to-speech settings regardless
          * of the application settings.
          * 1 = override application settings,
@@ -4327,7 +4347,7 @@
             ACCESSIBILITY_CAPTIONING_EDGE_TYPE,
             ACCESSIBILITY_CAPTIONING_EDGE_COLOR,
             ACCESSIBILITY_CAPTIONING_TYPEFACE,
-            ACCESSIBILITY_CAPTIONING_FONT_SIZE,
+            ACCESSIBILITY_CAPTIONING_FONT_SCALE,
             TTS_USE_DEFAULTS,
             TTS_DEFAULT_RATE,
             TTS_DEFAULT_PITCH,
diff --git a/core/java/android/security/IKeystoreService.java b/core/java/android/security/IKeystoreService.java
index 3d75dc8..bf8d4e5 100644
--- a/core/java/android/security/IKeystoreService.java
+++ b/core/java/android/security/IKeystoreService.java
@@ -244,7 +244,8 @@
                 return _result;
             }
 
-            public int generate(String name, int uid, int flags) throws RemoteException {
+            public int generate(String name, int uid, int keyType, int keySize, int flags,
+                    byte[][] args) throws RemoteException {
                 Parcel _data = Parcel.obtain();
                 Parcel _reply = Parcel.obtain();
                 int _result;
@@ -252,7 +253,17 @@
                     _data.writeInterfaceToken(DESCRIPTOR);
                     _data.writeString(name);
                     _data.writeInt(uid);
+                    _data.writeInt(keyType);
+                    _data.writeInt(keySize);
                     _data.writeInt(flags);
+                    if (args == null) {
+                        _data.writeInt(0);
+                    } else {
+                        _data.writeInt(args.length);
+                        for (int i = 0; i < args.length; i++) {
+                            _data.writeByteArray(args[i]);
+                        }
+                    }
                     mRemote.transact(Stub.TRANSACTION_generate, _data, _reply, 0);
                     _reply.readException();
                     _result = _reply.readInt();
@@ -560,7 +571,8 @@
 
     public int zero() throws RemoteException;
 
-    public int generate(String name, int uid, int flags) throws RemoteException;
+    public int generate(String name, int uid, int keyType, int keySize, int flags, byte[][] args)
+            throws RemoteException;
 
     public int import_key(String name, byte[] data, int uid, int flags) throws RemoteException;
 
diff --git a/core/java/android/speech/tts/SynthesisRequest.java b/core/java/android/speech/tts/SynthesisRequest.java
index 917a109..12a026b 100644
--- a/core/java/android/speech/tts/SynthesisRequest.java
+++ b/core/java/android/speech/tts/SynthesisRequest.java
@@ -30,7 +30,7 @@
  * </ul>
  *
  * Any additional parameters sent to the text to speech service are passed in
- * uninterpreted, see the @code{params} argument in {@link TextToSpeech#speak}
+ * uninterpreted, see the {@code params} argument in {@link TextToSpeech#speak}
  * and {@link TextToSpeech#synthesizeToFile}.
  */
 public final class SynthesisRequest {
diff --git a/core/java/android/util/LayoutDirection.java b/core/java/android/util/LayoutDirection.java
index e37d2f2..20af20b 100644
--- a/core/java/android/util/LayoutDirection.java
+++ b/core/java/android/util/LayoutDirection.java
@@ -17,11 +17,15 @@
 package android.util;
 
 /**
- * An interface for defining layout directions. A layout direction can be left-to-right (LTR)
+ * A class for defining layout directions. A layout direction can be left-to-right (LTR)
  * or right-to-left (RTL). It can also be inherited (from a parent) or deduced from the default
  * language script of a locale.
  */
-public interface LayoutDirection {
+public final class LayoutDirection {
+
+    // No instantiation
+    private LayoutDirection() {}
+
     /**
      * Horizontal layout direction is from Left to Right.
      */
diff --git a/core/java/android/view/ScaleGestureDetector.java b/core/java/android/view/ScaleGestureDetector.java
index 51c5c7b..0bebc04 100644
--- a/core/java/android/view/ScaleGestureDetector.java
+++ b/core/java/android/view/ScaleGestureDetector.java
@@ -18,6 +18,8 @@
 
 import android.content.Context;
 import android.content.res.Resources;
+import android.os.Build;
+import android.os.Handler;
 import android.os.SystemClock;
 import android.util.FloatMath;
 
@@ -128,6 +130,8 @@
     private float mFocusX;
     private float mFocusY;
 
+    private boolean mDoubleTapScales;
+
     private float mCurrSpan;
     private float mPrevSpan;
     private float mInitialSpan;
@@ -148,9 +152,14 @@
     private int mTouchHistoryDirection;
     private long mTouchHistoryLastAcceptedTime;
     private int mTouchMinMajor;
+    private MotionEvent mDoubleTapEvent;
+    private int mDoubleTapMode = DOUBLE_TAP_MODE_NONE;
+    private final Handler mHandler;
 
     private static final long TOUCH_STABILIZE_TIME = 128; // ms
-    private static final int TOUCH_MIN_MAJOR = 48; // dp
+    private static final int DOUBLE_TAP_MODE_NONE = 0;
+    private static final int DOUBLE_TAP_MODE_IN_PROGRESS = 1;
+
 
     /**
      * Consistency verifier for debugging purposes.
@@ -158,8 +167,37 @@
     private final InputEventConsistencyVerifier mInputEventConsistencyVerifier =
             InputEventConsistencyVerifier.isInstrumentationEnabled() ?
                     new InputEventConsistencyVerifier(this, 0) : null;
+    private GestureDetector mGestureDetector;
 
+    private boolean mEventBeforeOrAboveStartingGestureEvent;
+
+    /**
+     * Creates a ScaleGestureDetector with the supplied listener.
+     * You may only use this constructor from a {@link android.os.Looper Looper} thread.
+     *
+     * @param context the application's context
+     * @param listener the listener invoked for all the callbacks, this must
+     * not be null.
+     *
+     * @throws NullPointerException if {@code listener} is null.
+     */
     public ScaleGestureDetector(Context context, OnScaleGestureListener listener) {
+        this(context, listener, null);
+    }
+
+    /**
+     * Creates a ScaleGestureDetector with the supplied listener.
+     * @see android.os.Handler#Handler()
+     *
+     * @param context the application's context
+     * @param listener the listener invoked for all the callbacks, this must
+     * not be null.
+     * @param handler the handler to use for running deferred listener events.
+     *
+     * @throws NullPointerException if {@code listener} is null.
+     */
+    public ScaleGestureDetector(Context context, OnScaleGestureListener listener,
+            Handler handler) {
         mContext = context;
         mListener = listener;
         mSpanSlop = ViewConfiguration.get(context).getScaledTouchSlop() * 2;
@@ -167,8 +205,12 @@
         final Resources res = context.getResources();
         mTouchMinMajor = res.getDimensionPixelSize(
                 com.android.internal.R.dimen.config_minScalingTouchMajor);
-        mMinSpan = res.getDimensionPixelSize(
-                com.android.internal.R.dimen.config_minScalingSpan);
+        mMinSpan = res.getDimensionPixelSize(com.android.internal.R.dimen.config_minScalingSpan);
+        mHandler = handler;
+        // Quick scale is enabled by default after JB_MR2
+        if (context.getApplicationInfo().targetSdkVersion > Build.VERSION_CODES.JELLY_BEAN_MR2) {
+            setQuickScaleEnabled(true);
+        }
     }
 
     /**
@@ -263,8 +305,14 @@
 
         final int action = event.getActionMasked();
 
+        // Forward the event to check for double tap gesture
+        if (mDoubleTapScales) {
+            mGestureDetector.onTouchEvent(event);
+        }
+
         final boolean streamComplete = action == MotionEvent.ACTION_UP ||
                 action == MotionEvent.ACTION_CANCEL;
+
         if (action == MotionEvent.ACTION_DOWN || streamComplete) {
             // Reset any scale in progress with the listener.
             // If it's an ACTION_DOWN we're beginning a new event stream.
@@ -273,6 +321,7 @@
                 mListener.onScaleEnd(this);
                 mInProgress = false;
                 mInitialSpan = 0;
+                mDoubleTapMode = DOUBLE_TAP_MODE_NONE;
             }
 
             if (streamComplete) {
@@ -284,21 +333,37 @@
         final boolean configChanged = action == MotionEvent.ACTION_DOWN ||
                 action == MotionEvent.ACTION_POINTER_UP ||
                 action == MotionEvent.ACTION_POINTER_DOWN;
+
+
         final boolean pointerUp = action == MotionEvent.ACTION_POINTER_UP;
         final int skipIndex = pointerUp ? event.getActionIndex() : -1;
 
         // Determine focal point
         float sumX = 0, sumY = 0;
         final int count = event.getPointerCount();
-        for (int i = 0; i < count; i++) {
-            if (skipIndex == i) continue;
-            sumX += event.getX(i);
-            sumY += event.getY(i);
-        }
         final int div = pointerUp ? count - 1 : count;
-        final float focusX = sumX / div;
-        final float focusY = sumY / div;
+        final float focusX;
+        final float focusY;
+        if (mDoubleTapMode == DOUBLE_TAP_MODE_IN_PROGRESS) {
+            // In double tap mode, the focal pt is always where the double tap
+            // gesture started
+            focusX = mDoubleTapEvent.getX();
+            focusY = mDoubleTapEvent.getY();
+            if (event.getY() < focusY) {
+                mEventBeforeOrAboveStartingGestureEvent = true;
+            } else {
+                mEventBeforeOrAboveStartingGestureEvent = false;
+            }
+        } else {
+            for (int i = 0; i < count; i++) {
+                if (skipIndex == i) continue;
+                sumX += event.getX(i);
+                sumY += event.getY(i);
+            }
 
+            focusX = sumX / div;
+            focusY = sumY / div;
+        }
 
         addTouchHistory(event);
 
@@ -320,7 +385,12 @@
         // the focal point.
         final float spanX = devX * 2;
         final float spanY = devY * 2;
-        final float span = FloatMath.sqrt(spanX * spanX + spanY * spanY);
+        final float span;
+        if (inDoubleTapMode()) {
+            span = spanY;
+        } else {
+            span = FloatMath.sqrt(spanX * spanX + spanY * spanY);
+        }
 
         // Dispatch begin/end events as needed.
         // If the configuration changes, notify the app to reset its current state by beginning
@@ -328,10 +398,11 @@
         final boolean wasInProgress = mInProgress;
         mFocusX = focusX;
         mFocusY = focusY;
-        if (mInProgress && (span < mMinSpan || configChanged)) {
+        if (!inDoubleTapMode() && mInProgress && (span < mMinSpan || configChanged)) {
             mListener.onScaleEnd(this);
             mInProgress = false;
             mInitialSpan = span;
+            mDoubleTapMode = DOUBLE_TAP_MODE_NONE;
         }
         if (configChanged) {
             mPrevSpanX = mCurrSpanX = spanX;
@@ -354,6 +425,7 @@
             mCurrSpan = span;
 
             boolean updatePrev = true;
+
             if (mInProgress) {
                 updatePrev = mListener.onScale(this);
             }
@@ -369,6 +441,34 @@
         return true;
     }
 
+
+    private boolean inDoubleTapMode() {
+        return mDoubleTapMode == DOUBLE_TAP_MODE_IN_PROGRESS;
+    }
+
+    /**
+     * Set whether the associated {@link OnScaleGestureListener} should receive onScale callbacks
+     * when the user performs a doubleTap followed by a swipe. Note that this is enabled by default
+     * if the app targets API 19 and newer.
+     * @param scales true to enable quick scaling, false to disable
+     */
+    public void setQuickScaleEnabled(boolean scales) {
+        mDoubleTapScales = scales;
+        if (mDoubleTapScales && mGestureDetector == null) {
+            GestureDetector.SimpleOnGestureListener gestureListener =
+                    new GestureDetector.SimpleOnGestureListener() {
+                        @Override
+                        public boolean onDoubleTap(MotionEvent e) {
+                            // Double tap: start watching for a swipe
+                            mDoubleTapEvent = e;
+                            mDoubleTapMode = DOUBLE_TAP_MODE_IN_PROGRESS;
+                            return true;
+                        }
+            };
+            mGestureDetector = new GestureDetector(mContext, gestureListener, mHandler);
+        }
+    }
+
     /**
      * Returns {@code true} if a scale gesture is in progress.
      */
@@ -472,6 +572,12 @@
      * @return The current scaling factor.
      */
     public float getScaleFactor() {
+        if (inDoubleTapMode() && mEventBeforeOrAboveStartingGestureEvent) {
+            // Drag is moving up; the further away from the gesture
+            // start, the smaller the span should be, the closer,
+            // the larger the span, and therefore the larger the scale
+            return (1 / mCurrSpan) / (1 / mPrevSpan);
+        }
         return mPrevSpan > 0 ? mCurrSpan / mPrevSpan : 1;
     }
 
@@ -493,4 +599,4 @@
     public long getEventTime() {
         return mCurrTime;
     }
-}
+}
\ No newline at end of file
diff --git a/core/java/android/view/accessibility/CaptioningManager.java b/core/java/android/view/accessibility/CaptioningManager.java
index b1be24c..d4c6abe 100644
--- a/core/java/android/view/accessibility/CaptioningManager.java
+++ b/core/java/android/view/accessibility/CaptioningManager.java
@@ -17,58 +17,77 @@
 package android.view.accessibility;
 
 import android.content.ContentResolver;
+import android.content.Context;
+import android.database.ContentObserver;
 import android.graphics.Color;
 import android.graphics.Typeface;
+import android.net.Uri;
+import android.os.Handler;
 import android.provider.Settings.Secure;
 import android.text.TextUtils;
 
+import java.util.ArrayList;
 import java.util.Locale;
 
 /**
- * Contains methods for accessing preferred video captioning state and
+ * Contains methods for accessing and monitoring preferred video captioning state and visual
  * properties.
+ * <p>
+ * To obtain a handle to the captioning manager, do the following:
+ * <p>
+ * <code>
+ * <pre>CaptioningManager captioningManager =
+ *        (CaptioningManager) context.getSystemService(Context.CAPTIONING_SERVICE);</pre>
+ * </code>
  */
 public class CaptioningManager {
-    /**
-     * Activity Action: Show settings for video captioning.
-     * <p>
-     * In some cases, a matching Activity may not exist, so ensure you safeguard
-     * against this.
-     * <p>
-     * Input: Nothing.
-     * <p>
-     * Output: Nothing.
-     */
-    public static final String ACTION_CAPTIONING_SETTINGS = "android.settings.CAPTIONING_SETTINGS";
-
-    private static final int DEFAULT_PRESET = 0;
+    /** Default captioning enabled value. */
     private static final int DEFAULT_ENABLED = 0;
-    private static final float DEFAULT_FONT_SIZE = 24;
+
+    /** Default style preset as an index into {@link CaptionStyle#PRESETS}. */
+    private static final int DEFAULT_PRESET = 0;
+
+    /** Default scaling value for caption fonts. */
+    private static final float DEFAULT_FONT_SCALE = 1;
+
+    private final ArrayList<CaptioningChangeListener>
+            mListeners = new ArrayList<CaptioningChangeListener>();
+    private final Handler mHandler = new Handler();
+
+    private final ContentResolver mContentResolver;
 
     /**
-     * @param cr Resolver to access the database with.
-     * @return The user's preferred caption enabled state.
-     */
-    public static final boolean isEnabled(ContentResolver cr) {
-        return Secure.getInt(cr, Secure.ACCESSIBILITY_CAPTIONING_ENABLED, DEFAULT_ENABLED) == 1;
-    }
-
-    /**
-     * @param cr Resolver to access the database with.
-     * @return The raw locale string for the user's preferred caption language.
+     * Creates a new captioning manager for the specified context.
+     *
      * @hide
      */
-    public static final String getRawLocale(ContentResolver cr) {
-        return Secure.getString(cr, Secure.ACCESSIBILITY_CAPTIONING_LOCALE);
+    public CaptioningManager(Context context) {
+        mContentResolver = context.getContentResolver();
     }
 
     /**
-     * @param cr Resolver to access the database with.
-     * @return The locale for the user's preferred caption language, or null if
-     *         not specified.
+     * @return the user's preferred captioning enabled state
      */
-    public static final Locale getLocale(ContentResolver cr) {
-        final String rawLocale = getRawLocale(cr);
+    public final boolean isEnabled() {
+        return Secure.getInt(
+                mContentResolver, Secure.ACCESSIBILITY_CAPTIONING_ENABLED, DEFAULT_ENABLED) == 1;
+    }
+
+    /**
+     * @return the raw locale string for the user's preferred captioning
+     *         language
+     * @hide
+     */
+    public final String getRawLocale() {
+        return Secure.getString(mContentResolver, Secure.ACCESSIBILITY_CAPTIONING_LOCALE);
+    }
+
+    /**
+     * @return the locale for the user's preferred captioning language, or null
+     *         if not specified
+     */
+    public final Locale getLocale() {
+        final String rawLocale = getRawLocale();
         if (!TextUtils.isEmpty(rawLocale)) {
             final String[] splitLocale = rawLocale.split("_");
             switch (splitLocale.length) {
@@ -85,14 +104,151 @@
     }
 
     /**
-     * @param cr Resolver to access the database with.
-     * @return The user's preferred font size for video captions, or 0 if not
-     *         specified.
+     * @return the user's preferred font scaling factor for video captions, or 1 if not
+     *         specified
      */
-    public static final float getFontSize(ContentResolver cr) {
-        return Secure.getFloat(cr, Secure.ACCESSIBILITY_CAPTIONING_FONT_SIZE, DEFAULT_FONT_SIZE);
+    public final float getFontScale() {
+        return Secure.getFloat(
+                mContentResolver, Secure.ACCESSIBILITY_CAPTIONING_FONT_SCALE, DEFAULT_FONT_SCALE);
     }
 
+    /**
+     * @return the raw preset number, or the first preset if not specified
+     * @hide
+     */
+    public int getRawUserStyle() {
+        return Secure.getInt(
+                mContentResolver, Secure.ACCESSIBILITY_CAPTIONING_PRESET, DEFAULT_PRESET);
+    }
+
+    /**
+     * @return the user's preferred visual properties for captions as a
+     *         {@link CaptionStyle}, or the default style if not specified
+     */
+    public CaptionStyle getUserStyle() {
+        final int preset = getRawUserStyle();
+        if (preset == CaptionStyle.PRESET_CUSTOM) {
+            return CaptionStyle.getCustomStyle(mContentResolver);
+        }
+
+        return CaptionStyle.PRESETS[preset];
+    }
+
+    /**
+     * Adds a listener for changes in the user's preferred captioning enabled
+     * state and visual properties.
+     *
+     * @param listener the listener to add
+     */
+    public void addCaptioningStateChangeListener(CaptioningChangeListener listener) {
+        synchronized (mListeners) {
+            if (mListeners.isEmpty()) {
+                registerObserver(Secure.ACCESSIBILITY_CAPTIONING_ENABLED);
+                registerObserver(Secure.ACCESSIBILITY_CAPTIONING_FOREGROUND_COLOR);
+                registerObserver(Secure.ACCESSIBILITY_CAPTIONING_BACKGROUND_COLOR);
+                registerObserver(Secure.ACCESSIBILITY_CAPTIONING_EDGE_TYPE);
+                registerObserver(Secure.ACCESSIBILITY_CAPTIONING_EDGE_COLOR);
+                registerObserver(Secure.ACCESSIBILITY_CAPTIONING_TYPEFACE);
+                registerObserver(Secure.ACCESSIBILITY_CAPTIONING_FONT_SCALE);
+                registerObserver(Secure.ACCESSIBILITY_CAPTIONING_LOCALE);
+            }
+
+            mListeners.add(listener);
+        }
+    }
+
+    private void registerObserver(String key) {
+        mContentResolver.registerContentObserver(Secure.getUriFor(key), false, mContentObserver);
+    }
+
+    /**
+     * Removes a listener previously added using
+     * {@link #addCaptioningStateChangeListener}.
+     *
+     * @param listener the listener to remove
+     */
+    public void removeCaptioningStateChangeListener(CaptioningChangeListener listener) {
+        synchronized (mListeners) {
+            mListeners.remove(listener);
+
+            if (mListeners.isEmpty()) {
+                mContentResolver.unregisterContentObserver(mContentObserver);
+            }
+        }
+    }
+
+    private void notifyEnabledChanged() {
+        final boolean enabled = isEnabled();
+        synchronized (mListeners) {
+            for (CaptioningChangeListener listener : mListeners) {
+                listener.onEnabledChanged(enabled);
+            }
+        }
+    }
+
+    private void notifyUserStyleChanged() {
+        final CaptionStyle userStyle = getUserStyle();
+        synchronized (mListeners) {
+            for (CaptioningChangeListener listener : mListeners) {
+                listener.onUserStyleChanged(userStyle);
+            }
+        }
+    }
+
+    private void notifyLocaleChanged() {
+        final Locale locale = getLocale();
+        synchronized (mListeners) {
+            for (CaptioningChangeListener listener : mListeners) {
+                listener.onLocaleChanged(locale);
+            }
+        }
+    }
+
+    private void notifyFontScaleChanged() {
+        final float fontScale = getFontScale();
+        synchronized (mListeners) {
+            for (CaptioningChangeListener listener : mListeners) {
+                listener.onFontScaleChanged(fontScale);
+            }
+        }
+    }
+
+    private final ContentObserver mContentObserver = new ContentObserver(mHandler) {
+        @Override
+        public void onChange(boolean selfChange, Uri uri) {
+            final String uriPath = uri.getPath();
+            final String name = uriPath.substring(uriPath.lastIndexOf('/') + 1);
+            if (Secure.ACCESSIBILITY_CAPTIONING_ENABLED.equals(name)) {
+                notifyEnabledChanged();
+            } else if (Secure.ACCESSIBILITY_CAPTIONING_LOCALE.equals(name)) {
+                notifyLocaleChanged();
+            } else if (Secure.ACCESSIBILITY_CAPTIONING_FONT_SCALE.equals(name)) {
+                notifyFontScaleChanged();
+            } else {
+                // We only need a single callback when multiple style properties
+                // change in rapid succession.
+                mHandler.removeCallbacks(mStyleChangedRunnable);
+                mHandler.post(mStyleChangedRunnable);
+            }
+        }
+    };
+
+    /**
+     * Runnable posted when user style properties change. This is used to
+     * prevent unnecessary change notifications when multiple properties change
+     * in rapid succession.
+     */
+    private final Runnable mStyleChangedRunnable = new Runnable() {
+        @Override
+        public void run() {
+            notifyUserStyleChanged();
+        }
+    };
+
+    /**
+     * Specifies visual properties for video captions, including foreground and
+     * background colors, edge properties, and typeface.
+     */
     public static final class CaptionStyle {
         private static final CaptionStyle WHITE_ON_BLACK;
         private static final CaptionStyle BLACK_ON_WHITE;
@@ -155,8 +311,8 @@
         }
 
         /**
-         * @return The preferred {@link Typeface} for video captions, or null if
-         *         not specified.
+         * @return the preferred {@link Typeface} for video captions, or null if
+         *         not specified
          */
         public Typeface getTypeface() {
             if (mParsedTypeface == null && !TextUtils.isEmpty(mRawTypeface)) {
@@ -168,41 +324,20 @@
         /**
          * @hide
          */
-        public static int getRawPreset(ContentResolver cr) {
-            return Secure.getInt(cr, Secure.ACCESSIBILITY_CAPTIONING_PRESET, DEFAULT_PRESET);
-        }
-
-        /**
-         * @param cr Resolver to access the database with.
-         * @return The user's preferred caption style.
-         */
-        public static CaptionStyle defaultUserStyle(ContentResolver cr) {
-            final int preset = getRawPreset(cr);
-            if (preset == PRESET_CUSTOM) {
-                return getCustomStyle(cr);
-            }
-
-            return PRESETS[preset];
-        }
-
-        /**
-         * @hide
-         */
         public static CaptionStyle getCustomStyle(ContentResolver cr) {
+            final CaptionStyle defStyle = CaptionStyle.DEFAULT_CUSTOM;
             final int foregroundColor = Secure.getInt(
-                    cr, Secure.ACCESSIBILITY_CAPTIONING_FOREGROUND_COLOR,
-                    DEFAULT_CUSTOM.foregroundColor);
-            final int backgroundColor = Secure.getInt(cr,
-                    Secure.ACCESSIBILITY_CAPTIONING_BACKGROUND_COLOR,
-                    DEFAULT_CUSTOM.backgroundColor);
+                    cr, Secure.ACCESSIBILITY_CAPTIONING_FOREGROUND_COLOR, defStyle.foregroundColor);
+            final int backgroundColor = Secure.getInt(
+                    cr, Secure.ACCESSIBILITY_CAPTIONING_BACKGROUND_COLOR, defStyle.backgroundColor);
             final int edgeType = Secure.getInt(
-                    cr, Secure.ACCESSIBILITY_CAPTIONING_EDGE_TYPE, DEFAULT_CUSTOM.edgeType);
+                    cr, Secure.ACCESSIBILITY_CAPTIONING_EDGE_TYPE, defStyle.edgeType);
             final int edgeColor = Secure.getInt(
-                    cr, Secure.ACCESSIBILITY_CAPTIONING_EDGE_COLOR, DEFAULT_CUSTOM.edgeColor);
+                    cr, Secure.ACCESSIBILITY_CAPTIONING_EDGE_COLOR, defStyle.edgeColor);
 
             String rawTypeface = Secure.getString(cr, Secure.ACCESSIBILITY_CAPTIONING_TYPEFACE);
             if (rawTypeface == null) {
-                rawTypeface = DEFAULT_CUSTOM.mRawTypeface;
+                rawTypeface = defStyle.mRawTypeface;
             }
 
             return new CaptionStyle(
@@ -226,4 +361,45 @@
             DEFAULT_CUSTOM = WHITE_ON_BLACK;
         }
     }
+
+    /**
+     * Listener for changes in captioning properties, including enabled state
+     * and user style preferences.
+     */
+    public abstract class CaptioningChangeListener {
+        /**
+         * Called when the captioning enabled state changes.
+         *
+         * @param enabled the user's new preferred captioning enabled state
+         */
+        public void onEnabledChanged(boolean enabled) {
+        }
+
+        /**
+         * Called when the captioning user style changes.
+         *
+         * @param userStyle the user's new preferred style
+         * @see CaptioningManager#getUserStyle()
+         */
+        public void onUserStyleChanged(CaptionStyle userStyle) {
+        }
+
+        /**
+         * Called when the captioning locale changes.
+         *
+         * @param locale the preferred captioning locale
+         * @see CaptioningManager#getLocale()
+         */
+        public void onLocaleChanged(Locale locale) {
+        }
+
+        /**
+         * Called when the captioning font scaling factor changes.
+         *
+         * @param fontScale the preferred font scaling factor
+         * @see CaptioningManager#getFontScale()
+         */
+        public void onFontScaleChanged(float fontScale) {
+        }
+    }
 }
diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java
index f97e3dd..54b87de 100644
--- a/core/java/android/view/inputmethod/InputMethodManager.java
+++ b/core/java/android/view/inputmethod/InputMethodManager.java
@@ -1876,9 +1876,13 @@
     }
 
     /**
-     * Returns true if the current IME needs to offer the users a way to switch to a next input
-     * method. When the user triggers it, the IME has to call {@link #switchToNextInputMethod} to
-     * switch to a next input method which is selected by the system.
+     * Returns true if the current IME needs to offer the users ways to switch to a next input
+     * method (e.g. a globe key.).
+     * When an IME sets supportsSwitchingToNextInputMethod and this method returns true,
+     * the IME has to offer ways to to invoke {@link #switchToNextInputMethod} accordingly.
+     * <p> Note that the system determines the most appropriate next input method
+     * and subtype in order to provide the consistent user experience in switching
+     * between IMEs and subtypes.
      * @param imeToken Supplies the identifying token given to an input method when it was started,
      * which allows it to perform this operation on itself.
      */
diff --git a/core/java/android/webkit/CallbackProxy.java b/core/java/android/webkit/CallbackProxy.java
index fea6be6..7707392 100644
--- a/core/java/android/webkit/CallbackProxy.java
+++ b/core/java/android/webkit/CallbackProxy.java
@@ -50,7 +50,9 @@
  */
 class CallbackProxy extends Handler {
     // Logging tag
-    private static final String LOGTAG = "CallbackProxy";
+    static final String LOGTAG = "WebViewCallback";
+    // Enables API callback tracing
+    private static final boolean TRACE = DebugFlags.TRACE_CALLBACK;
     // Instance of WebViewClient that is the client callback.
     private volatile WebViewClient mWebViewClient;
     // Instance of WebChromeClient for handling all chrome functions.
@@ -258,6 +260,7 @@
         }
         boolean override = false;
         if (mWebViewClient != null) {
+            if (TRACE) Log.d(LOGTAG, "shouldOverrideUrlLoading=" + overrideUrl);
             override = mWebViewClient.shouldOverrideUrlLoading(mWebView.getWebView(),
                     overrideUrl);
         } else {
@@ -307,6 +310,7 @@
                 String startedUrl = msg.getData().getString("url");
                 mWebView.onPageStarted(startedUrl);
                 if (mWebViewClient != null) {
+                    if (TRACE) Log.d(LOGTAG, "onPageStarted=" + startedUrl);
                     mWebViewClient.onPageStarted(mWebView.getWebView(), startedUrl,
                             (Bitmap) msg.obj);
                 }
@@ -316,18 +320,21 @@
                 String finishedUrl = (String) msg.obj;
                 mWebView.onPageFinished(finishedUrl);
                 if (mWebViewClient != null) {
+                    if (TRACE) Log.d(LOGTAG, "onPageFinished=" + finishedUrl);
                     mWebViewClient.onPageFinished(mWebView.getWebView(), finishedUrl);
                 }
                 break;
 
             case RECEIVED_ICON:
                 if (mWebChromeClient != null) {
+                    if (TRACE) Log.d(LOGTAG, "onReceivedIcon");
                     mWebChromeClient.onReceivedIcon(mWebView.getWebView(), (Bitmap) msg.obj);
                 }
                 break;
 
             case RECEIVED_TOUCH_ICON_URL:
                 if (mWebChromeClient != null) {
+                    if (TRACE) Log.d(LOGTAG, "onReceivedTouchIconUrl");
                     mWebChromeClient.onReceivedTouchIconUrl(mWebView.getWebView(),
                             (String) msg.obj, msg.arg1 == 1);
                 }
@@ -335,6 +342,7 @@
 
             case RECEIVED_TITLE:
                 if (mWebChromeClient != null) {
+                    if (TRACE) Log.d(LOGTAG, "onReceivedTitle");
                     mWebChromeClient.onReceivedTitle(mWebView.getWebView(),
                             (String) msg.obj);
                 }
@@ -345,6 +353,7 @@
                     int reasonCode = msg.arg1;
                     final String description  = msg.getData().getString("description");
                     final String failUrl  = msg.getData().getString("failingUrl");
+                    if (TRACE) Log.d(LOGTAG, "onReceivedError=" + failUrl);
                     mWebViewClient.onReceivedError(mWebView.getWebView(), reasonCode,
                             description, failUrl);
                 }
@@ -356,6 +365,7 @@
                 Message dontResend =
                         (Message) msg.getData().getParcelable("dontResend");
                 if (mWebViewClient != null) {
+                    if (TRACE) Log.d(LOGTAG, "onFormResubmission");
                     mWebViewClient.onFormResubmission(mWebView.getWebView(), dontResend,
                             resend);
                 } else {
@@ -379,6 +389,7 @@
                     HttpAuthHandler handler = (HttpAuthHandler) msg.obj;
                     String host = msg.getData().getString("host");
                     String realm = msg.getData().getString("realm");
+                    if (TRACE) Log.d(LOGTAG, "onReceivedHttpAuthRequest");
                     mWebViewClient.onReceivedHttpAuthRequest(mWebView.getWebView(), handler,
                             host, realm);
                 }
@@ -388,6 +399,7 @@
                 if (mWebViewClient != null) {
                     HashMap<String, Object> map =
                         (HashMap<String, Object>) msg.obj;
+                    if (TRACE) Log.d(LOGTAG, "onReceivedSslError");
                     mWebViewClient.onReceivedSslError(mWebView.getWebView(),
                             (SslErrorHandler) map.get("handler"),
                             (SslError) map.get("error"));
@@ -396,6 +408,7 @@
 
             case PROCEEDED_AFTER_SSL_ERROR:
                 if (mWebViewClient != null && mWebViewClient instanceof WebViewClientClassicExt) {
+                    if (TRACE) Log.d(LOGTAG, "onProceededAfterSslError");
                     ((WebViewClientClassicExt) mWebViewClient).onProceededAfterSslError(
                             mWebView.getWebView(),
                             (SslError) msg.obj);
@@ -404,6 +417,7 @@
 
             case CLIENT_CERT_REQUEST:
                 if (mWebViewClient != null  && mWebViewClient instanceof WebViewClientClassicExt) {
+                    if (TRACE) Log.d(LOGTAG, "onReceivedClientCertRequest");
                     HashMap<String, Object> map = (HashMap<String, Object>) msg.obj;
                     ((WebViewClientClassicExt) mWebViewClient).onReceivedClientCertRequest(
                             mWebView.getWebView(),
@@ -418,6 +432,7 @@
                 // changed.
                 synchronized (this) {
                     if (mWebChromeClient != null) {
+                        if (TRACE) Log.d(LOGTAG, "onProgressChanged=" + mLatestProgress);
                         mWebChromeClient.onProgressChanged(mWebView.getWebView(),
                                 mLatestProgress);
                     }
@@ -427,14 +442,18 @@
 
             case UPDATE_VISITED:
                 if (mWebViewClient != null) {
+                    String url = (String) msg.obj;
+                    if (TRACE) Log.d(LOGTAG, "doUpdateVisitedHistory=" + url);
                     mWebViewClient.doUpdateVisitedHistory(mWebView.getWebView(),
-                            (String) msg.obj, msg.arg1 != 0);
+                            url, msg.arg1 != 0);
                 }
                 break;
 
             case LOAD_RESOURCE:
                 if (mWebViewClient != null) {
-                    mWebViewClient.onLoadResource(mWebView.getWebView(), (String) msg.obj);
+                    String url = (String) msg.obj;
+                    if (TRACE) Log.d(LOGTAG, "onLoadResource=" + url);
+                    mWebViewClient.onLoadResource(mWebView.getWebView(), url);
                 }
                 break;
 
@@ -448,6 +467,7 @@
                     String referer = msg.getData().getString("referer");
                     Long contentLength = msg.getData().getLong("contentLength");
 
+                    if (TRACE) Log.d(LOGTAG, "onDownloadStart");
                     if (mDownloadListener instanceof BrowserDownloadListener) {
                         ((BrowserDownloadListener) mDownloadListener).onDownloadStart(url,
                              userAgent, contentDisposition, mimetype, referer, contentLength);
@@ -460,6 +480,7 @@
 
             case CREATE_WINDOW:
                 if (mWebChromeClient != null) {
+                    if (TRACE) Log.d(LOGTAG, "onCreateWindow");
                     if (!mWebChromeClient.onCreateWindow(mWebView.getWebView(),
                                 msg.arg1 == 1, msg.arg2 == 1,
                                 (Message) msg.obj)) {
@@ -473,12 +494,14 @@
 
             case REQUEST_FOCUS:
                 if (mWebChromeClient != null) {
+                    if (TRACE) Log.d(LOGTAG, "onRequestFocus");
                     mWebChromeClient.onRequestFocus(mWebView.getWebView());
                 }
                 break;
 
             case CLOSE_WINDOW:
                 if (mWebChromeClient != null) {
+                    if (TRACE) Log.d(LOGTAG, "onCloseWindow");
                     mWebChromeClient.onCloseWindow(((WebViewClassic) msg.obj).getWebView());
                 }
                 break;
@@ -500,6 +523,7 @@
 
             case ASYNC_KEYEVENTS:
                 if (mWebViewClient != null) {
+                    if (TRACE) Log.d(LOGTAG, "onUnhandledKeyEvent");
                     mWebViewClient.onUnhandledKeyEvent(mWebView.getWebView(),
                             (KeyEvent) msg.obj);
                 }
@@ -521,6 +545,7 @@
                     WebStorage.QuotaUpdater quotaUpdater =
                         (WebStorage.QuotaUpdater) map.get("quotaUpdater");
 
+                    if (TRACE) Log.d(LOGTAG, "onExceededDatabaseQuota");
                     mWebChromeClient.onExceededDatabaseQuota(url,
                             databaseIdentifier, quota, estimatedDatabaseSize,
                             totalQuota, quotaUpdater);
@@ -538,6 +563,7 @@
                     WebStorage.QuotaUpdater quotaUpdater =
                         (WebStorage.QuotaUpdater) map.get("quotaUpdater");
 
+                    if (TRACE) Log.d(LOGTAG, "onReachedMaxAppCacheSize");
                     mWebChromeClient.onReachedMaxAppCacheSize(requiredStorage,
                             quota, quotaUpdater);
                 }
@@ -551,6 +577,7 @@
                     GeolocationPermissions.Callback callback =
                             (GeolocationPermissions.Callback)
                             map.get("callback");
+                    if (TRACE) Log.d(LOGTAG, "onGeolocationPermissionsShowPrompt");
                     mWebChromeClient.onGeolocationPermissionsShowPrompt(origin,
                             callback);
                 }
@@ -558,6 +585,7 @@
 
             case GEOLOCATION_PERMISSIONS_HIDE_PROMPT:
                 if (mWebChromeClient != null) {
+                    if (TRACE) Log.d(LOGTAG, "onGeolocationPermissionsHidePrompt");
                     mWebChromeClient.onGeolocationPermissionsHidePrompt();
                 }
                 break;
@@ -566,6 +594,7 @@
                 if (mWebChromeClient != null) {
                     final JsResultReceiver receiver = (JsResultReceiver) msg.obj;
                     JsDialogHelper helper = new JsDialogHelper(receiver.mJsResult, msg);
+                    if (TRACE) Log.d(LOGTAG, "onJsAlert");
                     if (!helper.invokeCallback(mWebChromeClient, mWebView.getWebView())) {
                         helper.showDialog(mContext);
                     }
@@ -577,6 +606,7 @@
                 if(mWebChromeClient != null) {
                     final JsResultReceiver receiver = (JsResultReceiver) msg.obj;
                     final JsResult res = receiver.mJsResult;
+                    if (TRACE) Log.d(LOGTAG, "onJsTimeout");
                     if (mWebChromeClient.onJsTimeout()) {
                         res.confirm();
                     } else {
@@ -598,6 +628,7 @@
 
             case SCALE_CHANGED:
                 if (mWebViewClient != null) {
+                    if (TRACE) Log.d(LOGTAG, "onScaleChanged");
                     mWebViewClient.onScaleChanged(mWebView.getWebView(), msg.getData()
                             .getFloat("old"), msg.getData().getFloat("new"));
                 }
@@ -624,6 +655,7 @@
                 ConsoleMessage.MessageLevel messageLevel =
                         ConsoleMessage.MessageLevel.values()[msgLevel];
 
+                if (TRACE) Log.d(LOGTAG, "onConsoleMessage");
                 if (!mWebChromeClient.onConsoleMessage(new ConsoleMessage(message, sourceID,
                         lineNumber, messageLevel))) {
                     // If false was returned the user did not provide their own console function so
@@ -654,12 +686,14 @@
 
             case GET_VISITED_HISTORY:
                 if (mWebChromeClient != null) {
+                    if (TRACE) Log.d(LOGTAG, "getVisitedHistory");
                     mWebChromeClient.getVisitedHistory((ValueCallback<String[]>)msg.obj);
                 }
                 break;
 
             case OPEN_FILE_CHOOSER:
                 if (mWebChromeClient != null) {
+                    if (TRACE) Log.d(LOGTAG, "openFileChooser");
                     UploadFileMessageData data = (UploadFileMessageData)msg.obj;
                     mWebChromeClient.openFileChooser(data.getUploadFile(), data.getAcceptType(),
                             data.getCapture());
@@ -668,6 +702,7 @@
 
             case ADD_HISTORY_ITEM:
                 if (mWebBackForwardListClient != null) {
+                    if (TRACE) Log.d(LOGTAG, "onNewHistoryItem");
                     mWebBackForwardListClient.onNewHistoryItem(
                             (WebHistoryItem) msg.obj);
                 }
@@ -693,6 +728,7 @@
                     String realm = msg.getData().getString("realm");
                     String account = msg.getData().getString("account");
                     String args = msg.getData().getString("args");
+                    if (TRACE) Log.d(LOGTAG, "onReceivedLoginRequest");
                     mWebViewClient.onReceivedLoginRequest(mWebView.getWebView(), realm,
                             account, args);
                 }
@@ -910,6 +946,7 @@
             return null;
         }
         // Note: This method does _not_ send a message.
+        if (TRACE) Log.d(LOGTAG, "shouldInterceptRequest=" + url);
         WebResourceResponse r =
                 mWebViewClient.shouldInterceptRequest(mWebView.getWebView(), url);
         if (r == null) {
diff --git a/core/java/android/webkit/DebugFlags.java b/core/java/android/webkit/DebugFlags.java
index 349113e..524f610 100644
--- a/core/java/android/webkit/DebugFlags.java
+++ b/core/java/android/webkit/DebugFlags.java
@@ -24,25 +24,33 @@
  * The name of each flags maps directly to the name of the class in which that
  * flag is used.
  *
+ * @hide Only used by WebView implementations.
  */
-class DebugFlags {
+public class DebugFlags {
 
+    public static final boolean COOKIE_SYNC_MANAGER = false;
+    public static final boolean TRACE_API = false;
+    public static final boolean TRACE_CALLBACK = false;
+    public static final boolean TRACE_JAVASCRIPT_BRIDGE = false;
+    public static final boolean URL_UTIL = false;
+    public static final boolean WEB_SYNC_MANAGER = false;
+
+    // TODO: Delete these when WebViewClassic is moved
     public static final boolean BROWSER_FRAME = false;
     public static final boolean CACHE_MANAGER = false;
     public static final boolean CALLBACK_PROXY = false;
     public static final boolean COOKIE_MANAGER = false;
-    public static final boolean COOKIE_SYNC_MANAGER = false;
     public static final boolean FRAME_LOADER = false;
     public static final boolean J_WEB_CORE_JAVA_BRIDGE = false;// HIGHLY VERBOSE
     public static final boolean LOAD_LISTENER = false;
+    public static final boolean MEASURE_PAGE_SWAP_FPS = false;
     public static final boolean NETWORK = false;
     public static final boolean SSL_ERROR_HANDLER = false;
     public static final boolean STREAM_LOADER = false;
-    public static final boolean URL_UTIL = false;
     public static final boolean WEB_BACK_FORWARD_LIST = false;
     public static final boolean WEB_SETTINGS = false;
-    public static final boolean WEB_SYNC_MANAGER = false;
     public static final boolean WEB_VIEW = false;
     public static final boolean WEB_VIEW_CORE = false;
-    public static final boolean MEASURE_PAGE_SWAP_FPS = false;
+
+
 }
diff --git a/core/java/android/webkit/HTML5VideoFullScreen.java b/core/java/android/webkit/HTML5VideoFullScreen.java
index b52218d..6fb32c8 100644
--- a/core/java/android/webkit/HTML5VideoFullScreen.java
+++ b/core/java/android/webkit/HTML5VideoFullScreen.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.media.MediaPlayer;
 import android.media.Metadata;
+import android.util.Log;
 import android.view.Gravity;
 import android.view.MotionEvent;
 import android.view.SurfaceHolder;
@@ -293,12 +294,16 @@
         mLayout.setVisibility(View.VISIBLE);
         WebChromeClient client = webView.getWebChromeClient();
         if (client != null) {
+            if (DebugFlags.TRACE_CALLBACK) Log.d(CallbackProxy.LOGTAG, "onShowCustomView");
             client.onShowCustomView(mLayout, mCallback);
             // Plugins like Flash will draw over the video so hide
             // them while we're playing.
             if (webView.getViewManager() != null)
                 webView.getViewManager().hideAll();
 
+            if (DebugFlags.TRACE_CALLBACK) {
+                Log.d(CallbackProxy.LOGTAG, "getVideoLoadingProgressView");
+            }
             mProgressView = client.getVideoLoadingProgressView();
             if (mProgressView != null) {
                 mLayout.addView(mProgressView, layoutParams);
diff --git a/core/java/android/webkit/HTML5VideoViewProxy.java b/core/java/android/webkit/HTML5VideoViewProxy.java
index a3d62ae..e8538f6 100644
--- a/core/java/android/webkit/HTML5VideoViewProxy.java
+++ b/core/java/android/webkit/HTML5VideoViewProxy.java
@@ -180,6 +180,7 @@
             if (!mHTML5VideoView.fullScreenExited() && mHTML5VideoView.isFullScreenMode()) {
                 WebChromeClient client = webView.getWebChromeClient();
                 if (client != null) {
+                    if (DebugFlags.TRACE_CALLBACK) Log.d(CallbackProxy.LOGTAG, "onHideCustomView");
                     client.onHideCustomView();
                 }
             }
@@ -405,6 +406,7 @@
             case ERROR: {
                 WebChromeClient client = mWebView.getWebChromeClient();
                 if (client != null) {
+                    if (DebugFlags.TRACE_CALLBACK) Log.d(CallbackProxy.LOGTAG, "onHideCustomView");
                     client.onHideCustomView();
                 }
                 break;
@@ -412,6 +414,9 @@
             case LOAD_DEFAULT_POSTER: {
                 WebChromeClient client = mWebView.getWebChromeClient();
                 if (client != null) {
+                    if (DebugFlags.TRACE_CALLBACK) {
+                        Log.d(CallbackProxy.LOGTAG, "getDefaultVideoPoster");
+                    }
                     doSetPoster(client.getDefaultVideoPoster());
                 }
                 break;
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 3923539..f0e8c4f 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -31,7 +31,9 @@
 import android.os.CancellationSignal;
 import android.os.Looper;
 import android.os.Message;
+import android.os.ParcelFileDescriptor;
 import android.os.StrictMode;
+import android.print.PrintAttributes;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.view.KeyEvent;
@@ -49,7 +51,6 @@
 
 import java.io.BufferedWriter;
 import java.io.File;
-import java.io.OutputStream;
 import java.util.Map;
 
 /**
@@ -243,7 +244,7 @@
         implements ViewTreeObserver.OnGlobalFocusChangeListener,
         ViewGroup.OnHierarchyChangeListener, ViewDebug.HierarchyHandler {
 
-    private static final String LOGTAG = "webview_proxy";
+    private static final String LOGTAG = "WebView";
 
     // Throwing an exception for incorrect thread usage if the
     // build target is JB MR2 or newer. Defaults to false, and is
@@ -495,6 +496,7 @@
         sEnforceThreadChecking = context.getApplicationInfo().targetSdkVersion >=
                 Build.VERSION_CODES.JELLY_BEAN_MR2;
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "WebView<init>");
 
         ensureProviderCreated();
         mProvider.init(javaScriptInterfaces, privateBrowsing);
@@ -509,6 +511,7 @@
      */
     public void setHorizontalScrollbarOverlay(boolean overlay) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "setHorizontalScrollbarOverlay=" + overlay);
         mProvider.setHorizontalScrollbarOverlay(overlay);
     }
 
@@ -519,6 +522,7 @@
      */
     public void setVerticalScrollbarOverlay(boolean overlay) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "setVerticalScrollbarOverlay=" + overlay);
         mProvider.setVerticalScrollbarOverlay(overlay);
     }
 
@@ -573,6 +577,7 @@
     @Deprecated
     public void setCertificate(SslCertificate certificate) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "setCertificate=" + certificate);
         mProvider.setCertificate(certificate);
     }
 
@@ -596,6 +601,7 @@
     @Deprecated
     public void savePassword(String host, String username, String password) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "savePassword=" + host);
         mProvider.savePassword(host, username, password);
     }
 
@@ -615,6 +621,7 @@
     public void setHttpAuthUsernamePassword(String host, String realm,
             String username, String password) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "setHttpAuthUsernamePassword=" + host);
         mProvider.setHttpAuthUsernamePassword(host, realm, username, password);
     }
 
@@ -644,6 +651,7 @@
      */
     public void destroy() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "destroy");
         mProvider.destroy();
     }
 
@@ -682,6 +690,7 @@
      */
     public void setNetworkAvailable(boolean networkUp) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "setNetworkAvailable=" + networkUp);
         mProvider.setNetworkAvailable(networkUp);
     }
 
@@ -698,6 +707,7 @@
      */
     public WebBackForwardList saveState(Bundle outState) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "saveState");
         return mProvider.saveState(outState);
     }
 
@@ -714,6 +724,7 @@
     @Deprecated
     public boolean savePicture(Bundle b, final File dest) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "savePicture=" + dest.getName());
         return mProvider.savePicture(b, dest);
     }
 
@@ -731,6 +742,7 @@
     @Deprecated
     public boolean restorePicture(Bundle b, File src) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "restorePicture=" + src.getName());
         return mProvider.restorePicture(b, src);
     }
 
@@ -748,6 +760,7 @@
      */
     public WebBackForwardList restoreState(Bundle inState) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "restoreState");
         return mProvider.restoreState(inState);
     }
 
@@ -764,6 +777,7 @@
      */
     public void loadUrl(String url, Map<String, String> additionalHttpHeaders) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "loadUrl(extra headers)=" + url);
         mProvider.loadUrl(url, additionalHttpHeaders);
     }
 
@@ -774,6 +788,7 @@
      */
     public void loadUrl(String url) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "loadUrl=" + url);
         mProvider.loadUrl(url);
     }
 
@@ -788,6 +803,7 @@
      */
     public void postUrl(String url, byte[] postData) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "postUrl=" + url);
         mProvider.postUrl(url, postData);
     }
 
@@ -822,6 +838,7 @@
      */
     public void loadData(String data, String mimeType, String encoding) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "loadData");
         mProvider.loadData(data, mimeType, encoding);
     }
 
@@ -854,6 +871,7 @@
     public void loadDataWithBaseURL(String baseUrl, String data,
             String mimeType, String encoding, String historyUrl) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "loadDataWithBaseURL=" + baseUrl);
         mProvider.loadDataWithBaseURL(baseUrl, data, mimeType, encoding, historyUrl);
     }
 
@@ -870,6 +888,7 @@
      */
     public void evaluateJavascript(String script, ValueCallback<String> resultCallback) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "evaluateJavascript=" + script);
         mProvider.evaluateJavaScript(script, resultCallback);
     }
 
@@ -880,6 +899,7 @@
      */
     public void saveWebArchive(String filename) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "saveWebArchive=" + filename);
         mProvider.saveWebArchive(filename);
     }
 
@@ -897,6 +917,7 @@
      */
     public void saveWebArchive(String basename, boolean autoname, ValueCallback<String> callback) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "saveWebArchive(auto)=" + basename);
         mProvider.saveWebArchive(basename, autoname, callback);
     }
 
@@ -905,6 +926,7 @@
      */
     public void stopLoading() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "stopLoading");
         mProvider.stopLoading();
     }
 
@@ -913,6 +935,7 @@
      */
     public void reload() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "reload");
         mProvider.reload();
     }
 
@@ -931,6 +954,7 @@
      */
     public void goBack() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "goBack");
         mProvider.goBack();
     }
 
@@ -949,6 +973,7 @@
      */
     public void goForward() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "goForward");
         mProvider.goForward();
     }
 
@@ -974,6 +999,7 @@
      */
     public void goBackOrForward(int steps) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "goBackOrForwad=" + steps);
         mProvider.goBackOrForward(steps);
     }
 
@@ -993,6 +1019,7 @@
      */
     public boolean pageUp(boolean top) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "pageUp");
         return mProvider.pageUp(top);
     }
 
@@ -1004,6 +1031,7 @@
      */
     public boolean pageDown(boolean bottom) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "pageDown");
         return mProvider.pageDown(bottom);
     }
 
@@ -1016,6 +1044,7 @@
     @Deprecated
     public void clearView() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "clearView");
         mProvider.clearView();
     }
 
@@ -1035,6 +1064,7 @@
      */
     public Picture capturePicture() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "capturePicture");
         return mProvider.capturePicture();
     }
 
@@ -1042,7 +1072,9 @@
      * Exports the contents of this Webview as PDF. Only supported for API levels
      * {@link android.os.Build.VERSION_CODES#KEY_LIME_PIE} and above.
      *
-     * @param out            The stream to export the PDF contents to. Cannot be null.
+     * TODO(sgurun) the parameter list is stale. Fix it before unhiding.
+     *
+     * @param fd             The FileDescriptor to export the PDF contents to. Cannot be null.
      * @param width          The page width. Should be larger than 0.
      * @param height         The page height. Should be larger than 0.
      * @param resultCallback A callback to be invoked when the PDF content is exported.
@@ -1051,21 +1083,27 @@
      *                       be null.
      *
      * The PDF conversion is done asynchronously and the PDF output is written to the provided
-     * outputstream. The caller should not close the outputstream until the resultCallback is
-     * called, indicating PDF conversion is complete. Webview cannot be drawn during the pdf
-     * export so the  application is recommended to take it offscreen, or putting in a layer
-     * with an overlaid progress UI / spinner.
+     * file descriptor. The caller should not close the file descriptor until the resultCallback
+     * is called, indicating PDF conversion is complete. Webview will never close the file
+     * descriptor.
+     * Limitations: Webview cannot be drawn during the PDF export so the  application is
+     * recommended to take it offscreen, or putting in a layer with an overlaid progress
+     * UI / spinner.
      *
      * If the caller cancels the task using the cancellationSignal, the cancellation will be
      * acked using the resultCallback signal.
      *
+     * Throws an exception if an IO error occurs accessing the file descriptor.
+     *
      * TODO(sgurun) margins, explain the units, make it public.
      * @hide
      */
-    public void exportToPdf(OutputStream out, int width, int height,
-            ValueCallback<Boolean> resultCallback, CancellationSignal cancellationSignal) {
+    public void exportToPdf(ParcelFileDescriptor fd, PrintAttributes attributes,
+            ValueCallback<Boolean> resultCallback, CancellationSignal cancellationSignal)
+            throws java.io.IOException {
         checkThread();
-        mProvider.exportToPdf(out, width, height, resultCallback, cancellationSignal);
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "exportToPdf");
+        mProvider.exportToPdf(fd, attributes, resultCallback, cancellationSignal);
     }
 
     /**
@@ -1096,6 +1134,7 @@
      */
     public void setInitialScale(int scaleInPercent) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "setInitialScale=" + scaleInPercent);
         mProvider.setInitialScale(scaleInPercent);
     }
 
@@ -1106,6 +1145,7 @@
      */
     public void invokeZoomPicker() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "invokeZoomPicker");
         mProvider.invokeZoomPicker();
     }
 
@@ -1129,6 +1169,7 @@
      */
     public HitTestResult getHitTestResult() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "getHitTestResult");
         return mProvider.getHitTestResult();
     }
 
@@ -1147,6 +1188,7 @@
      */
     public void requestFocusNodeHref(Message hrefMsg) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "requestFocusNodeHref");
         mProvider.requestFocusNodeHref(hrefMsg);
     }
 
@@ -1159,6 +1201,7 @@
      */
     public void requestImageRef(Message msg) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "requestImageRef");
         mProvider.requestImageRef(msg);
     }
 
@@ -1263,6 +1306,7 @@
      */
     public void pauseTimers() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "pauseTimers");
         mProvider.pauseTimers();
     }
 
@@ -1272,6 +1316,7 @@
      */
     public void resumeTimers() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "resumeTimers");
         mProvider.resumeTimers();
     }
 
@@ -1284,6 +1329,7 @@
      */
     public void onPause() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "onPause");
         mProvider.onPause();
     }
 
@@ -1292,6 +1338,7 @@
      */
     public void onResume() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "onResume");
         mProvider.onResume();
     }
 
@@ -1311,6 +1358,7 @@
      */
     public void freeMemory() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "freeMemory");
         mProvider.freeMemory();
     }
 
@@ -1322,6 +1370,7 @@
      */
     public void clearCache(boolean includeDiskFiles) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "clearCache");
         mProvider.clearCache(includeDiskFiles);
     }
 
@@ -1333,6 +1382,7 @@
      */
     public void clearFormData() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "clearFormData");
         mProvider.clearFormData();
     }
 
@@ -1341,6 +1391,7 @@
      */
     public void clearHistory() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "clearHistory");
         mProvider.clearHistory();
     }
 
@@ -1350,6 +1401,7 @@
      */
     public void clearSslPreferences() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "clearSslPreferences");
         mProvider.clearSslPreferences();
     }
 
@@ -1391,6 +1443,7 @@
      */
     public void findNext(boolean forward) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "findNext");
         mProvider.findNext(forward);
     }
 
@@ -1406,6 +1459,7 @@
     @Deprecated
     public int findAll(String find) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "findAll");
         StrictMode.noteSlowCall("findAll blocks UI: prefer findAllAsync");
         return mProvider.findAll(find);
     }
@@ -1420,6 +1474,7 @@
      */
     public void findAllAsync(String find) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "findAllAsync");
         mProvider.findAllAsync(find);
     }
 
@@ -1440,6 +1495,7 @@
     @Deprecated
     public boolean showFindDialog(String text, boolean showIme) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "showFindDialog");
         return mProvider.showFindDialog(text, showIme);
     }
 
@@ -1475,6 +1531,7 @@
      */
     public void clearMatches() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "clearMatches");
         mProvider.clearMatches();
     }
 
@@ -1535,6 +1592,7 @@
     @Deprecated
     public void setPictureListener(PictureListener listener) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "setPictureListener=" + listener);
         mProvider.setPictureListener(listener);
     }
 
@@ -1584,6 +1642,7 @@
      */
     public void addJavascriptInterface(Object object, String name) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "addJavascriptInterface=" + name);
         mProvider.addJavascriptInterface(object, name);
     }
 
@@ -1596,6 +1655,7 @@
      */
     public void removeJavascriptInterface(String name) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "removeJavascriptInterface=" + name);
         mProvider.removeJavascriptInterface(name);
     }
 
@@ -1685,6 +1745,7 @@
 
     public void flingScroll(int vx, int vy) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "flingScroll");
         mProvider.flingScroll(vx, vy);
     }
 
diff --git a/core/java/android/webkit/WebViewClassic.java b/core/java/android/webkit/WebViewClassic.java
index db98d30..3f22d53 100644
--- a/core/java/android/webkit/WebViewClassic.java
+++ b/core/java/android/webkit/WebViewClassic.java
@@ -62,6 +62,7 @@
 import android.os.Looper;
 import android.os.Message;
 import android.os.SystemClock;
+import android.print.PrintAttributes;
 import android.security.KeyChain;
 import android.text.Editable;
 import android.text.InputType;
@@ -2896,11 +2897,11 @@
      * See {@link WebView#exportToPdf()}
      */
     @Override
-    public void exportToPdf(java.io.OutputStream out, int width, int height,
-            ValueCallback<Boolean> resultCallback, CancellationSignal cancellationSignal) {
+    public void exportToPdf(android.os.ParcelFileDescriptor fd, PrintAttributes attributes,
+            ValueCallback<Boolean> resultCallback, CancellationSignal cancellationSignal)
+            throws java.io.IOException {
         // K-only API not implemented in WebViewClassic.
         throw new IllegalStateException("This API not supported on Android 4.3 and earlier");
-
     }
 
     /**
@@ -7950,6 +7951,7 @@
             // triggered in setNewPicture
             Picture picture = mContext.getApplicationInfo().targetSdkVersion <
                     Build.VERSION_CODES.JELLY_BEAN_MR2 ? capturePicture() : null;
+            if (DebugFlags.TRACE_CALLBACK) Log.d(CallbackProxy.LOGTAG, "onNewPicture");
             mPictureListener.onNewPicture(getWebView(), picture);
         }
     }
@@ -8037,6 +8039,7 @@
                 // triggered in pageSwapCallback
                 Picture picture = mContext.getApplicationInfo().targetSdkVersion <
                         Build.VERSION_CODES.JELLY_BEAN_MR2 ? capturePicture() : null;
+                if (DebugFlags.TRACE_CALLBACK) Log.d(CallbackProxy.LOGTAG, "onNewPicture");
                 mPictureListener.onNewPicture(getWebView(), picture);
             }
         }
diff --git a/core/java/android/webkit/WebViewProvider.java b/core/java/android/webkit/WebViewProvider.java
index 8fe6edf..d625d8a 100644
--- a/core/java/android/webkit/WebViewProvider.java
+++ b/core/java/android/webkit/WebViewProvider.java
@@ -27,6 +27,8 @@
 import android.os.Bundle;
 import android.os.CancellationSignal;
 import android.os.Message;
+import android.os.ParcelFileDescriptor;
+import android.print.PrintAttributes;
 import android.view.KeyEvent;
 import android.view.MotionEvent;
 import android.view.View;
@@ -41,7 +43,6 @@
 
 import java.io.BufferedWriter;
 import java.io.File;
-import java.io.OutputStream;
 import java.util.Map;
 
 /**
@@ -148,8 +149,9 @@
 
     public Picture capturePicture();
 
-    public void exportToPdf(OutputStream out, int width, int height,
-            ValueCallback<Boolean> resultCallback, CancellationSignal cancellationSignal);
+    public void exportToPdf(ParcelFileDescriptor fd, PrintAttributes attributes,
+            ValueCallback<Boolean> resultCallback, CancellationSignal cancellationSignal)
+            throws java.io.IOException;
 
     public float getScale();
 
diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java
index ab81a37..8819237 100644
--- a/core/java/com/android/internal/app/ResolverActivity.java
+++ b/core/java/com/android/internal/app/ResolverActivity.java
@@ -287,102 +287,104 @@
     }
 
     protected void onIntentSelected(ResolveInfo ri, Intent intent, boolean alwaysCheck) {
-        // Build a reasonable intent filter, based on what matched.
-        IntentFilter filter = new IntentFilter();
+        if (mAlwaysUseOption) {
+            // Build a reasonable intent filter, based on what matched.
+            IntentFilter filter = new IntentFilter();
 
-        if (intent.getAction() != null) {
-            filter.addAction(intent.getAction());
-        }
-        Set<String> categories = intent.getCategories();
-        if (categories != null) {
-            for (String cat : categories) {
-                filter.addCategory(cat);
+            if (intent.getAction() != null) {
+                filter.addAction(intent.getAction());
             }
-        }
-        filter.addCategory(Intent.CATEGORY_DEFAULT);
-
-        int cat = ri.match&IntentFilter.MATCH_CATEGORY_MASK;
-        Uri data = intent.getData();
-        if (cat == IntentFilter.MATCH_CATEGORY_TYPE) {
-            String mimeType = intent.resolveType(this);
-            if (mimeType != null) {
-                try {
-                    filter.addDataType(mimeType);
-                } catch (IntentFilter.MalformedMimeTypeException e) {
-                    Log.w("ResolverActivity", e);
-                    filter = null;
+            Set<String> categories = intent.getCategories();
+            if (categories != null) {
+                for (String cat : categories) {
+                    filter.addCategory(cat);
                 }
             }
-        }
-        if (data != null && data.getScheme() != null) {
-            // We need the data specification if there was no type,
-            // OR if the scheme is not one of our magical "file:"
-            // or "content:" schemes (see IntentFilter for the reason).
-            if (cat != IntentFilter.MATCH_CATEGORY_TYPE
-                    || (!"file".equals(data.getScheme())
-                            && !"content".equals(data.getScheme()))) {
-                filter.addDataScheme(data.getScheme());
+            filter.addCategory(Intent.CATEGORY_DEFAULT);
 
-                // Look through the resolved filter to determine which part
-                // of it matched the original Intent.
-                Iterator<PatternMatcher> pIt = ri.filter.schemeSpecificPartsIterator();
-                if (pIt != null) {
-                    String ssp = data.getSchemeSpecificPart();
-                    while (ssp != null && pIt.hasNext()) {
-                        PatternMatcher p = pIt.next();
-                        if (p.match(ssp)) {
-                            filter.addDataSchemeSpecificPart(p.getPath(), p.getType());
-                            break;
-                        }
+            int cat = ri.match&IntentFilter.MATCH_CATEGORY_MASK;
+            Uri data = intent.getData();
+            if (cat == IntentFilter.MATCH_CATEGORY_TYPE) {
+                String mimeType = intent.resolveType(this);
+                if (mimeType != null) {
+                    try {
+                        filter.addDataType(mimeType);
+                    } catch (IntentFilter.MalformedMimeTypeException e) {
+                        Log.w("ResolverActivity", e);
+                        filter = null;
                     }
                 }
-                Iterator<IntentFilter.AuthorityEntry> aIt = ri.filter.authoritiesIterator();
-                if (aIt != null) {
-                    while (aIt.hasNext()) {
-                        IntentFilter.AuthorityEntry a = aIt.next();
-                        if (a.match(data) >= 0) {
-                            int port = a.getPort();
-                            filter.addDataAuthority(a.getHost(),
-                                    port >= 0 ? Integer.toString(port) : null);
-                            break;
+            }
+            if (data != null && data.getScheme() != null) {
+                // We need the data specification if there was no type,
+                // OR if the scheme is not one of our magical "file:"
+                // or "content:" schemes (see IntentFilter for the reason).
+                if (cat != IntentFilter.MATCH_CATEGORY_TYPE
+                        || (!"file".equals(data.getScheme())
+                                && !"content".equals(data.getScheme()))) {
+                    filter.addDataScheme(data.getScheme());
+
+                    // Look through the resolved filter to determine which part
+                    // of it matched the original Intent.
+                    Iterator<PatternMatcher> pIt = ri.filter.schemeSpecificPartsIterator();
+                    if (pIt != null) {
+                        String ssp = data.getSchemeSpecificPart();
+                        while (ssp != null && pIt.hasNext()) {
+                            PatternMatcher p = pIt.next();
+                            if (p.match(ssp)) {
+                                filter.addDataSchemeSpecificPart(p.getPath(), p.getType());
+                                break;
+                            }
                         }
                     }
-                }
-                pIt = ri.filter.pathsIterator();
-                if (pIt != null) {
-                    String path = data.getPath();
-                    while (path != null && pIt.hasNext()) {
-                        PatternMatcher p = pIt.next();
-                        if (p.match(path)) {
-                            filter.addDataPath(p.getPath(), p.getType());
-                            break;
+                    Iterator<IntentFilter.AuthorityEntry> aIt = ri.filter.authoritiesIterator();
+                    if (aIt != null) {
+                        while (aIt.hasNext()) {
+                            IntentFilter.AuthorityEntry a = aIt.next();
+                            if (a.match(data) >= 0) {
+                                int port = a.getPort();
+                                filter.addDataAuthority(a.getHost(),
+                                        port >= 0 ? Integer.toString(port) : null);
+                                break;
+                            }
+                        }
+                    }
+                    pIt = ri.filter.pathsIterator();
+                    if (pIt != null) {
+                        String path = data.getPath();
+                        while (path != null && pIt.hasNext()) {
+                            PatternMatcher p = pIt.next();
+                            if (p.match(path)) {
+                                filter.addDataPath(p.getPath(), p.getType());
+                                break;
+                            }
                         }
                     }
                 }
             }
-        }
 
-        if (filter != null) {
-            final int N = mAdapter.mList.size();
-            ComponentName[] set = new ComponentName[N];
-            int bestMatch = 0;
-            for (int i=0; i<N; i++) {
-                ResolveInfo r = mAdapter.mList.get(i).ri;
-                set[i] = new ComponentName(r.activityInfo.packageName,
-                        r.activityInfo.name);
-                if (r.match > bestMatch) bestMatch = r.match;
-            }
-            if (alwaysCheck) {
-                getPackageManager().addPreferredActivity(filter, bestMatch, set,
-                        intent.getComponent());
-            } else {
-                try {
-                    AppGlobals.getPackageManager().setLastChosenActivity(intent,
-                            intent.resolveTypeIfNeeded(getContentResolver()),
-                            PackageManager.MATCH_DEFAULT_ONLY,
-                            filter, bestMatch, intent.getComponent());
-                } catch (RemoteException re) {
-                    Log.d(TAG, "Error calling setLastChosenActivity\n" + re);
+            if (filter != null) {
+                final int N = mAdapter.mList.size();
+                ComponentName[] set = new ComponentName[N];
+                int bestMatch = 0;
+                for (int i=0; i<N; i++) {
+                    ResolveInfo r = mAdapter.mList.get(i).ri;
+                    set[i] = new ComponentName(r.activityInfo.packageName,
+                            r.activityInfo.name);
+                    if (r.match > bestMatch) bestMatch = r.match;
+                }
+                if (alwaysCheck) {
+                    getPackageManager().addPreferredActivity(filter, bestMatch, set,
+                            intent.getComponent());
+                } else {
+                    try {
+                        AppGlobals.getPackageManager().setLastChosenActivity(intent,
+                                intent.resolveTypeIfNeeded(getContentResolver()),
+                                PackageManager.MATCH_DEFAULT_ONLY,
+                                filter, bestMatch, intent.getComponent());
+                    } catch (RemoteException re) {
+                        Log.d(TAG, "Error calling setLastChosenActivity\n" + re);
+                    }
                 }
             }
         }
diff --git a/core/java/com/android/internal/widget/AutoScrollHelper.java b/core/java/com/android/internal/widget/AutoScrollHelper.java
index 6298e35..afa4103 100644
--- a/core/java/com/android/internal/widget/AutoScrollHelper.java
+++ b/core/java/com/android/internal/widget/AutoScrollHelper.java
@@ -32,7 +32,8 @@
  * scrolling to Views.
  * <p>
  * <b>Note:</b> Implementing classes are responsible for overriding the
- * {@link #onScrollBy} method to scroll the target view. See
+ * {@link #scrollTargetBy}, {@link #canTargetScrollHorizontally}, and
+ * {@link #canTargetScrollVertically} methods. See
  * {@link AbsListViewAutoScroller} for an {@link android.widget.AbsListView}
  * -specific implementation.
  * <p>
@@ -60,12 +61,14 @@
  * {@link #setMaximumEdges}. Default value is {@link #NO_MAX}.
  * </ul>
  * <h1>Scrolling</h1> When automatic scrolling is active, the helper will
- * repeatedly call {@link #onScrollBy} to apply new scrolling offsets.
+ * repeatedly call {@link #scrollTargetBy} to apply new scrolling offsets.
  * <p>
  * The following scrolling properties may be configured:
  * <ul>
  * <li>Acceleration ramp-up duration, see {@link #setRampUpDuration}. Default
- * value is 2.5 seconds.
+ * value is 2500 milliseconds.
+ * <li>Acceleration ramp-down duration, see {@link #setRampDownDuration}.
+ * Default value is 500 milliseconds.
  * <li>Target velocity relative to view size, see {@link #setRelativeVelocity}.
  * Default value is 100% per second for both vertical and horizontal.
  * <li>Minimum velocity used to constrain relative velocity, see
@@ -163,25 +166,22 @@
     private float[] mMaximumVelocity = new float[] { NO_MAX, NO_MAX };
 
     /** Whether to start activation immediately. */
-    private boolean mSkipDelay;
+    private boolean mAlreadyDelayed;
 
     /** Whether to reset the scroller start time on the next animation. */
-    private boolean mResetScroller;
+    private boolean mNeedsReset;
 
-    /** Whether the auto-scroller is active. */
-    private boolean mActive;
+    /** Whether to send a cancel motion event to the target view. */
+    private boolean mNeedsCancel;
 
-    /** Whether the auto-scroller is scrolling. */
-    private boolean mScrolling;
+    /** Whether the auto-scroller is actively scrolling. */
+    private boolean mAnimating;
 
     /** Whether the auto-scroller is enabled. */
     private boolean mEnabled;
 
     /** Whether the auto-scroller consumes events when scrolling. */
-    private boolean mExclusiveEnabled;
-
-    /** Down time of the most recent down touch event. */
-    private long mDownTime;
+    private boolean mExclusive;
 
     // Default values.
     private static final int DEFAULT_EDGE_TYPE = EDGE_TYPE_INSIDE_EXTEND;
@@ -192,7 +192,7 @@
     private static final float DEFAULT_RELATIVE_VELOCITY = 1f;
     private static final int DEFAULT_ACTIVATION_DELAY = ViewConfiguration.getTapTimeout();
     private static final int DEFAULT_RAMP_UP_DURATION = 2500;
-    // TODO: RAMP_DOWN_DURATION of 500ms?
+    private static final int DEFAULT_RAMP_DOWN_DURATION = 500;
 
     /**
      * Creates a new helper for scrolling the specified target view.
@@ -220,8 +220,7 @@
         setRelativeVelocity(DEFAULT_RELATIVE_VELOCITY, DEFAULT_RELATIVE_VELOCITY);
         setActivationDelay(DEFAULT_ACTIVATION_DELAY);
         setRampUpDuration(DEFAULT_RAMP_UP_DURATION);
-
-        mEnabled = true;
+        setRampDownDuration(DEFAULT_RAMP_DOWN_DURATION);
     }
 
     /**
@@ -232,8 +231,8 @@
      * @return The scroll helper, which may used to chain setter calls.
      */
     public AutoScrollHelper setEnabled(boolean enabled) {
-        if (!enabled) {
-            stop(true);
+        if (mEnabled && !enabled) {
+            requestStop();
         }
 
         mEnabled = enabled;
@@ -255,13 +254,13 @@
      * When enabled, {@link #onTouch} will return true if the helper is
      * currently scrolling and false otherwise.
      *
-     * @param enabled True to exclusively handle touch events during scrolling,
+     * @param exclusive True to exclusively handle touch events during scrolling,
      *            false to allow the target view to receive all touch events.
-     * @see #isExclusiveEnabled()
-     * @see #onTouch(View, MotionEvent)
+     * @return The scroll helper, which may used to chain setter calls.
      */
-    public void setExclusiveEnabled(boolean enabled) {
-        mExclusiveEnabled = enabled;
+    public AutoScrollHelper setExclusive(boolean exclusive) {
+        mExclusive = exclusive;
+        return this;
     }
 
     /**
@@ -270,10 +269,10 @@
      *
      * @return True if exclusive handling of touch events during scrolling is
      *         enabled, false otherwise.
-     * @see #setExclusiveEnabled(boolean)
+     * @see #setExclusive(boolean)
      */
-    public boolean isExclusiveEnabled() {
-        return mExclusiveEnabled;
+    public boolean isExclusive() {
+        return mExclusive;
     }
 
     /**
@@ -424,7 +423,22 @@
      * @return The scroll helper, which may used to chain setter calls.
      */
     public AutoScrollHelper setRampUpDuration(int durationMillis) {
-        mScroller.setDuration(durationMillis);
+        mScroller.setRampUpDuration(durationMillis);
+        return this;
+    }
+
+    /**
+     * Sets the amount of time after de-activation of auto-scrolling that is
+     * takes to slow to a stop.
+     * <p>
+     * Specifying a duration greater than zero prevents sudden jumps in
+     * velocity.
+     *
+     * @param durationMillis The ramp-down duration in milliseconds.
+     * @return The scroll helper, which may used to chain setter calls.
+     */
+    public AutoScrollHelper setRampDownDuration(int durationMillis) {
+        mScroller.setRampDownDuration(durationMillis);
         return this;
     }
 
@@ -432,7 +446,7 @@
      * Handles touch events by activating automatic scrolling, adjusting scroll
      * velocity, or stopping.
      * <p>
-     * If {@link #isExclusiveEnabled()} is false, always returns false so that
+     * If {@link #isExclusive()} is false, always returns false so that
      * the host view may handle touch events. Otherwise, returns true when
      * automatic scrolling is active and false otherwise.
      */
@@ -445,52 +459,135 @@
         final int action = event.getActionMasked();
         switch (action) {
             case MotionEvent.ACTION_DOWN:
-                mDownTime = event.getDownTime();
+                mNeedsCancel = true;
+                mAlreadyDelayed = false;
+                // $FALL-THROUGH$
             case MotionEvent.ACTION_MOVE:
-                final float xValue = getEdgeValue(mRelativeEdges[HORIZONTAL], v.getWidth(),
-                        mMaximumEdges[HORIZONTAL], event.getX());
-                final float yValue = getEdgeValue(mRelativeEdges[VERTICAL], v.getHeight(),
-                        mMaximumEdges[VERTICAL], event.getY());
-                final float maxVelX = constrain(mRelativeVelocity[HORIZONTAL] * mTarget.getWidth(),
-                        mMinimumVelocity[HORIZONTAL], mMaximumVelocity[HORIZONTAL]);
-                final float maxVelY = constrain(mRelativeVelocity[VERTICAL] * mTarget.getHeight(),
-                        mMinimumVelocity[VERTICAL], mMaximumVelocity[VERTICAL]);
-                mScroller.setTargetVelocity(xValue * maxVelX, yValue * maxVelY);
+                final float xTargetVelocity = computeTargetVelocity(
+                        HORIZONTAL, event.getX(), v.getWidth(), mTarget.getWidth());
+                final float yTargetVelocity = computeTargetVelocity(
+                        VERTICAL, event.getY(), v.getHeight(), mTarget.getHeight());
+                mScroller.setTargetVelocity(xTargetVelocity, yTargetVelocity);
 
-                if ((xValue != 0 || yValue != 0) && !mActive) {
-                    mActive = true;
-                    mResetScroller = true;
-                    if (mRunnable == null) {
-                        mRunnable = new AutoScrollRunnable();
-                    }
-                    if (mSkipDelay) {
-                        mTarget.postOnAnimation(mRunnable);
-                    } else {
-                        mSkipDelay = true;
-                        mTarget.postOnAnimationDelayed(mRunnable, mActivationDelay);
-                    }
+                // If the auto scroller was not previously active, but it should
+                // be, then update the state and start animations.
+                if (!mAnimating && shouldAnimate()) {
+                    startAnimating();
                 }
                 break;
             case MotionEvent.ACTION_UP:
             case MotionEvent.ACTION_CANCEL:
-                stop(true);
+                requestStop();
                 break;
         }
 
-        return mExclusiveEnabled && mScrolling;
+        return mExclusive && mAnimating;
     }
 
     /**
-     * Override this method to scroll the target view by the specified number
-     * of pixels.
-     * <p>
-     * Returns whether the target view was able to scroll the requested amount.
-     *
-     * @param deltaX The amount to scroll in the X direction, in pixels.
-     * @param deltaY The amount to scroll in the Y direction, in pixels.
-     * @return true if the target view was able to scroll the requested amount.
+     * @return whether the target is able to scroll in the requested direction
      */
-    public abstract boolean onScrollBy(int deltaX, int deltaY);
+    private boolean shouldAnimate() {
+        final ClampedScroller scroller = mScroller;
+        final int verticalDirection = scroller.getVerticalDirection();
+        final int horizontalDirection = scroller.getHorizontalDirection();
+
+        return verticalDirection != 0 && canTargetScrollVertically(verticalDirection)
+                || horizontalDirection != 0 && canTargetScrollHorizontally(horizontalDirection);
+    }
+
+    /**
+     * Starts the scroll animation.
+     */
+    private void startAnimating() {
+        if (mRunnable == null) {
+            mRunnable = new ScrollAnimationRunnable();
+        }
+
+        mAnimating = true;
+        mNeedsReset = true;
+
+        if (!mAlreadyDelayed && mActivationDelay > 0) {
+            mTarget.postOnAnimationDelayed(mRunnable, mActivationDelay);
+        } else {
+            mRunnable.run();
+        }
+
+        // If we start animating again before the user lifts their finger, we
+        // already know it's not a tap and don't need an activation delay.
+        mAlreadyDelayed = true;
+    }
+
+    /**
+     * Requests that the scroll animation slow to a stop. If there is an
+     * activation delay, this may occur between posting the animation and
+     * actually running it.
+     */
+    private void requestStop() {
+        if (mNeedsReset) {
+            // The animation has been posted, but hasn't run yet. Manually
+            // stopping animation will prevent it from running.
+            mAnimating = false;
+        } else {
+            mScroller.requestStop();
+        }
+    }
+
+    private float computeTargetVelocity(
+            int direction, float coordinate, float srcSize, float dstSize) {
+        final float relativeEdge = mRelativeEdges[direction];
+        final float maximumEdge = mMaximumEdges[direction];
+        final float value = getEdgeValue(relativeEdge, srcSize, maximumEdge, coordinate);
+        if (value == 0) {
+            // The edge in this direction is not activated.
+            return 0;
+        }
+
+        final float relativeVelocity = mRelativeVelocity[direction];
+        final float minimumVelocity = mMinimumVelocity[direction];
+        final float maximumVelocity = mMaximumVelocity[direction];
+        final float targetVelocity = relativeVelocity * dstSize;
+
+        // Target velocity is adjusted for interpolated edge position, then
+        // clamped to the minimum and maximum values. Later, this value will be
+        // adjusted for time-based acceleration.
+        if (value > 0) {
+            return constrain(value * targetVelocity, minimumVelocity, maximumVelocity);
+        } else {
+            return -constrain(-value * targetVelocity, minimumVelocity, maximumVelocity);
+        }
+    }
+
+    /**
+     * Override this method to scroll the target view by the specified number of
+     * pixels.
+     *
+     * @param deltaX The number of pixels to scroll by horizontally.
+     * @param deltaY The number of pixels to scroll by vertically.
+     */
+    public abstract void scrollTargetBy(int deltaX, int deltaY);
+
+    /**
+     * Override this method to return whether the target view can be scrolled
+     * horizontally in a certain direction.
+     *
+     * @param direction Negative to check scrolling left, positive to check
+     *            scrolling right.
+     * @return true if the target view is able to horizontally scroll in the
+     *         specified direction.
+     */
+    public abstract boolean canTargetScrollHorizontally(int direction);
+
+    /**
+     * Override this method to return whether the target view can be scrolled
+     * vertically in a certain direction.
+     *
+     * @param direction Negative to check scrolling up, positive to check
+     *            scrolling down.
+     * @return true if the target view is able to vertically scroll in the
+     *         specified direction.
+     */
+    public abstract boolean canTargetScrollVertically(int direction);
 
     /**
      * Returns the interpolated position of a touch point relative to an edge
@@ -534,7 +631,7 @@
                     if (current >= 0) {
                         // Movement up to the edge is scaled.
                         return 1f - current / leading;
-                    } else if (mActive && (mEdgeType == EDGE_TYPE_INSIDE_EXTEND)) {
+                    } else if (mAnimating && (mEdgeType == EDGE_TYPE_INSIDE_EXTEND)) {
                         // Movement beyond the edge is always maximum.
                         return 1f;
                     }
@@ -551,6 +648,16 @@
         return 0;
     }
 
+    private static int constrain(int value, int min, int max) {
+        if (value > max) {
+            return max;
+        } else if (value < min) {
+            return min;
+        } else {
+            return value;
+        }
+    }
+
     private static float constrain(float value, float min, float max) {
         if (value > max) {
             return max;
@@ -562,72 +669,48 @@
     }
 
     /**
-     * Stops auto-scrolling immediately, optionally reseting the auto-scrolling
-     * delay.
-     *
-     * @param reset Whether to reset the auto-scrolling delay.
-     */
-    private void stop(boolean reset) {
-        mActive = false;
-        mScrolling = false;
-        mSkipDelay = !reset;
-
-        if (mRunnable != null) {
-            mTarget.removeCallbacks(mRunnable);
-        }
-    }
-
-    /**
      * Sends a {@link MotionEvent#ACTION_CANCEL} event to the target view,
      * canceling any ongoing touch events.
      */
     private void cancelTargetTouch() {
+        final long eventTime = SystemClock.uptimeMillis();
         final MotionEvent cancel = MotionEvent.obtain(
-                mDownTime, SystemClock.uptimeMillis(), MotionEvent.ACTION_CANCEL, 0, 0, 0);
-        cancel.setAction(MotionEvent.ACTION_CANCEL);
+                eventTime, eventTime, MotionEvent.ACTION_CANCEL, 0, 0, 0);
         mTarget.onTouchEvent(cancel);
         cancel.recycle();
     }
 
-    private class AutoScrollRunnable implements Runnable {
+    private class ScrollAnimationRunnable implements Runnable {
         @Override
         public void run() {
-            if (!mActive) {
+            if (!mAnimating) {
                 return;
             }
 
-            if (mResetScroller) {
-                mResetScroller = false;
+            if (mNeedsReset) {
+                mNeedsReset = false;
                 mScroller.start();
             }
 
-            final View target = mTarget;
             final ClampedScroller scroller = mScroller;
+            if (scroller.isFinished() || !shouldAnimate()) {
+                mAnimating = false;
+                return;
+            }
+
+            if (mNeedsCancel) {
+                mNeedsCancel = false;
+                cancelTargetTouch();
+            }
+
             scroller.computeScrollDelta();
 
             final int deltaX = scroller.getDeltaX();
             final int deltaY = scroller.getDeltaY();
-            if ((deltaX != 0 || deltaY != 0 || !scroller.isFinished())
-                    && onScrollBy(deltaX, deltaY)) {
-                // Update whether we're actively scrolling.
-                final boolean scrolling = (deltaX != 0 || deltaY != 0);
-                if (mScrolling != scrolling) {
-                    mScrolling = scrolling;
+            scrollTargetBy(deltaX,  deltaY);
 
-                    // If we just started actively scrolling, make sure any down
-                    // or move events send to the target view are canceled.
-                    if (mExclusiveEnabled && scrolling) {
-                        cancelTargetTouch();
-                    }
-                }
-
-                // Keep going until the scroller has permanently stopped or the
-                // view can't scroll any more. If the user moves their finger
-                // again, we'll repost the animation.
-                target.postOnAnimation(this);
-            } else {
-                stop(false);
-            }
+            // Keep going until the scroller has permanently stopped.
+            mTarget.postOnAnimation(this);
         }
     }
 
@@ -637,27 +720,39 @@
      * interpolated 1f value after a specified duration.
      */
     private static class ClampedScroller {
-        private final Interpolator mInterpolator = new AccelerateInterpolator();
-
-        private int mDuration;
+        private int mRampUpDuration;
+        private int mRampDownDuration;
         private float mTargetVelocityX;
         private float mTargetVelocityY;
 
         private long mStartTime;
+
         private long mDeltaTime;
         private int mDeltaX;
         private int mDeltaY;
 
+        private long mStopTime;
+        private float mStopValue;
+        private int mEffectiveRampDown;
+
         /**
          * Creates a new ramp-up scroller that reaches full velocity after a
          * specified duration.
          */
         public ClampedScroller() {
-            reset();
+            mStartTime = Long.MIN_VALUE;
+            mStopTime = -1;
+            mDeltaTime = 0;
+            mDeltaX = 0;
+            mDeltaY = 0;
         }
 
-        public void setDuration(int durationMillis) {
-            mDuration = durationMillis;
+        public void setRampUpDuration(int durationMillis) {
+            mRampUpDuration = durationMillis;
+        }
+
+        public void setRampDownDuration(int durationMillis) {
+            mRampDownDuration = durationMillis;
         }
 
         /**
@@ -665,35 +760,53 @@
          */
         public void start() {
             mStartTime = AnimationUtils.currentAnimationTimeMillis();
+            mStopTime = -1;
             mDeltaTime = mStartTime;
-        }
-
-        /**
-         * Returns whether the scroller is finished, which means that its
-         * acceleration is zero.
-         *
-         * @return Whether the scroller is finished.
-         */
-        public boolean isFinished() {
-            if (mTargetVelocityX == 0 && mTargetVelocityY == 0) {
-                return true;
-            }
-            final long currentTime = AnimationUtils.currentAnimationTimeMillis();
-            final long elapsedSinceStart = currentTime - mStartTime;
-            return elapsedSinceStart > mDuration;
-        }
-
-        /**
-         * Stops the scroller and resets its values.
-         */
-        public void reset() {
-            mStartTime = -1;
-            mDeltaTime = -1;
+            mStopValue = 0.5f;
             mDeltaX = 0;
             mDeltaY = 0;
         }
 
         /**
+         * Stops the scroller at the current animation time.
+         */
+        public void requestStop() {
+            final long currentTime = AnimationUtils.currentAnimationTimeMillis();
+            mEffectiveRampDown = constrain((int) (currentTime - mStartTime), 0, mRampDownDuration);
+            mStopValue = getValueAt(currentTime);
+            mStopTime = currentTime;
+        }
+
+        public boolean isFinished() {
+            return mStopTime > 0
+                    && AnimationUtils.currentAnimationTimeMillis() > mStopTime + mEffectiveRampDown;
+        }
+
+        private float getValueAt(long currentTime) {
+            if (currentTime < mStartTime) {
+                return 0f;
+            } else if (mStopTime < 0 || currentTime < mStopTime) {
+                final long elapsedSinceStart = currentTime - mStartTime;
+                return 0.5f * constrain(elapsedSinceStart / (float) mRampUpDuration, 0, 1);
+            } else {
+                final long elapsedSinceEnd = currentTime - mStopTime;
+                return (1 - mStopValue) + mStopValue
+                        * constrain(elapsedSinceEnd / (float) mEffectiveRampDown, 0, 1);
+            }
+        }
+
+        /**
+         * Interpolates the value along a parabolic curve corresponding to the equation
+         * <code>y = -4x * (x-1)</code>.
+         *
+         * @param value The value to interpolate, between 0 and 1.
+         * @return the interpolated value, between 0 and 1.
+         */
+        private float interpolateValue(float value) {
+            return -4 * value * value + 4 * value;
+        }
+
+        /**
          * Computes the current scroll deltas. This usually only be called after
          * starting the scroller with {@link #start()}.
          *
@@ -701,18 +814,13 @@
          * @see #getDeltaY()
          */
         public void computeScrollDelta() {
-            final long currentTime = AnimationUtils.currentAnimationTimeMillis();
-            final long elapsedSinceStart = currentTime - mStartTime;
-            final float value;
-            if (mStartTime < 0) {
-                value = 0f;
-            } else if (elapsedSinceStart < mDuration) {
-                value = (float) elapsedSinceStart / mDuration;
-            } else {
-                value = 1f;
+            if (mDeltaTime == 0) {
+                throw new RuntimeException("Cannot compute scroll delta before calling start()");
             }
 
-            final float scale = mInterpolator.getInterpolation(value);
+            final long currentTime = AnimationUtils.currentAnimationTimeMillis();
+            final float value = getValueAt(currentTime);
+            final float scale = interpolateValue(value);
             final long elapsedSinceDelta = currentTime - mDeltaTime;
 
             mDeltaTime = currentTime;
@@ -731,6 +839,14 @@
             mTargetVelocityY = y;
         }
 
+        public int getHorizontalDirection() {
+            return (int) (mTargetVelocityX / Math.abs(mTargetVelocityX));
+        }
+
+        public int getVerticalDirection() {
+            return (int) (mTargetVelocityY / Math.abs(mTargetVelocityY));
+        }
+
         /**
          * The distance traveled in the X-coordinate computed by the last call
          * to {@link #computeScrollDelta()}.
@@ -749,20 +865,60 @@
     }
 
     /**
-     * Implementation of {@link AutoScrollHelper} that knows how to scroll
-     * generic {@link AbsListView}s.
+     * An implementation of {@link AutoScrollHelper} that knows how to scroll
+     * through an {@link AbsListView}.
      */
     public static class AbsListViewAutoScroller extends AutoScrollHelper {
         private final AbsListView mTarget;
 
         public AbsListViewAutoScroller(AbsListView target) {
             super(target);
+
             mTarget = target;
         }
 
         @Override
-        public boolean onScrollBy(int deltaX, int deltaY) {
-            return mTarget.scrollListBy(deltaY);
+        public void scrollTargetBy(int deltaX, int deltaY) {
+            mTarget.scrollListBy(deltaY);
+        }
+
+        @Override
+        public boolean canTargetScrollHorizontally(int direction) {
+            // List do not scroll horizontally.
+            return false;
+        }
+
+        @Override
+        public boolean canTargetScrollVertically(int direction) {
+            final AbsListView target = mTarget;
+            final int itemCount = target.getCount();
+            final int childCount = target.getChildCount();
+            final int firstPosition = target.getFirstVisiblePosition();
+            final int lastPosition = firstPosition + childCount;
+
+            if (direction > 0) {
+                // Are we already showing the entire last item?
+                if (lastPosition >= itemCount) {
+                    final View lastView = target.getChildAt(childCount - 1);
+                    if (lastView.getBottom() <= target.getHeight()) {
+                        return false;
+                    }
+                }
+            } else if (direction < 0) {
+                // Are we already showing the entire first item?
+                if (firstPosition <= 0) {
+                    final View firstView = target.getChildAt(0);
+                    if (firstView.getTop() >= 0) {
+                        return false;
+                    }
+                }
+            } else {
+                // The behavior for direction 0 is undefined and we can return
+                // whatever we want.
+                return false;
+            }
+
+            return true;
         }
     }
 }
diff --git a/core/jni/android/graphics/BitmapRegionDecoder.cpp b/core/jni/android/graphics/BitmapRegionDecoder.cpp
index 6646579..ee47ac4 100644
--- a/core/jni/android/graphics/BitmapRegionDecoder.cpp
+++ b/core/jni/android/graphics/BitmapRegionDecoder.cpp
@@ -141,7 +141,7 @@
                                   jboolean isShareable) {
     jobject brd = NULL;
     // for now we don't allow shareable with java inputstreams
-    SkStream* stream = CopyJavaInputStream(env, is, storage);
+    SkStreamRewindable* stream = CopyJavaInputStream(env, is, storage);
 
     if (stream) {
         brd = createBitmapRegionDecoder(env, stream);
diff --git a/core/jni/android/graphics/CreateJavaOutputStreamAdaptor.cpp b/core/jni/android/graphics/CreateJavaOutputStreamAdaptor.cpp
index 797d155..d264392 100644
--- a/core/jni/android/graphics/CreateJavaOutputStreamAdaptor.cpp
+++ b/core/jni/android/graphics/CreateJavaOutputStreamAdaptor.cpp
@@ -159,8 +159,8 @@
     friend class RewindableJavaStream;
 };
 
-SkStream* WrapJavaInputStream(JNIEnv* env, jobject stream,
-                              jbyteArray storage) {
+SkStream* CreateJavaInputStreamAdaptor(JNIEnv* env, jobject stream,
+                                       jbyteArray storage) {
     static bool gInited;
 
     if (!gInited) {
@@ -190,6 +190,7 @@
     return new JavaInputStreamAdaptor(env, stream, storage);
 }
 
+
 static SkMemoryStream* adaptor_to_mem_stream(SkStream* adaptor) {
     SkASSERT(adaptor != NULL);
     SkDynamicMemoryWStream wStream;
@@ -203,9 +204,9 @@
     return new SkMemoryStream(data.get());
 }
 
-SkMemoryStream* CopyJavaInputStream(JNIEnv* env, jobject stream,
-                                    jbyteArray storage) {
-    SkAutoTUnref<SkStream> adaptor(WrapJavaInputStream(env, stream, storage));
+SkStreamRewindable* CopyJavaInputStream(JNIEnv* env, jobject stream,
+                                        jbyteArray storage) {
+    SkAutoTUnref<SkStream> adaptor(CreateJavaInputStreamAdaptor(env, stream, storage));
     if (NULL == adaptor.get()) {
         return NULL;
     }
@@ -302,7 +303,7 @@
 
 SkStreamRewindable* GetRewindableStream(JNIEnv* env, jobject stream,
                                         jbyteArray storage) {
-    SkAutoTUnref<SkStream> adaptor(WrapJavaInputStream(env, stream, storage));
+    SkAutoTUnref<SkStream> adaptor(CreateJavaInputStreamAdaptor(env, stream, storage));
     if (NULL == adaptor.get()) {
         return NULL;
     }
diff --git a/core/jni/android/graphics/CreateJavaOutputStreamAdaptor.h b/core/jni/android/graphics/CreateJavaOutputStreamAdaptor.h
index 5218dc5..fcc0c9a 100644
--- a/core/jni/android/graphics/CreateJavaOutputStreamAdaptor.h
+++ b/core/jni/android/graphics/CreateJavaOutputStreamAdaptor.h
@@ -24,8 +24,8 @@
  *      function returns, since the Java InputStream is not managed
  *      by the SkStream.
  */
-SkStream* WrapJavaInputStream(JNIEnv* env, jobject stream,
-                              jbyteArray storage);
+SkStream* CreateJavaInputStreamAdaptor(JNIEnv* env, jobject stream,
+                                       jbyteArray storage);
 
 /**
  *  Copy a Java InputStream.
@@ -33,13 +33,11 @@
  *  @param stream Pointer to Java InputStream.
  *  @param storage Java byte array for retrieving data from the
  *      Java InputStream.
- *  @return SkMemoryStream The data in stream will be copied to a new
- *      SkMemoryStream.
- *  FIXME: Could return a more generic return type if ViewStateSerializer
- *  did not require an SkMemoryStream.
+ *  @return SkStreamRewindable The data in stream will be copied
+ *      to a new SkStreamRewindable.
  */
-SkMemoryStream* CopyJavaInputStream(JNIEnv* env, jobject stream,
-                                    jbyteArray storage);
+SkStreamRewindable* CopyJavaInputStream(JNIEnv* env, jobject stream,
+                                        jbyteArray storage);
 
 /**
  *  Get a rewindable stream from a Java InputStream.
@@ -50,7 +48,7 @@
  *  @return SkStreamRewindable Either a wrapper around the Java
  *      InputStream, if possible, or a copy which is rewindable.
  *      Since it may be a wrapper, must not be used after the
- *      caller returns, like the result of WrapJavaInputStream.
+ *      caller returns, like the result of CreateJavaInputStreamAdaptor.
  */
 SkStreamRewindable* GetRewindableStream(JNIEnv* env, jobject stream,
                                         jbyteArray storage);
@@ -69,5 +67,4 @@
 
 SkWStream* CreateJavaOutputStreamAdaptor(JNIEnv* env, jobject stream,
                                          jbyteArray storage);
-
 #endif
diff --git a/core/jni/android/graphics/Picture.cpp b/core/jni/android/graphics/Picture.cpp
index dff2b18..fcf22b8 100644
--- a/core/jni/android/graphics/Picture.cpp
+++ b/core/jni/android/graphics/Picture.cpp
@@ -39,9 +39,10 @@
     static SkPicture* deserialize(JNIEnv* env, jobject, jobject jstream,
                                   jbyteArray jstorage) {
         SkPicture* picture = NULL;
-        SkAutoTUnref<SkStream> strm(WrapJavaInputStream(env, jstream, jstorage));
-        if (strm.get()) {
-            picture = SkPicture::CreateFromStream(strm.get());
+        SkStream* strm = CreateJavaInputStreamAdaptor(env, jstream, jstorage);
+        if (strm) {
+            picture = SkPicture::CreateFromStream(strm);
+            delete strm;
         }
         return picture;
     }
diff --git a/core/jni/com_google_android_gles_jni_EGLImpl.cpp b/core/jni/com_google_android_gles_jni_EGLImpl.cpp
index a3ce2a5..50b3302 100644
--- a/core/jni/com_google_android_gles_jni_EGLImpl.cpp
+++ b/core/jni/com_google_android_gles_jni_EGLImpl.cpp
@@ -351,9 +351,9 @@
                 "Make sure the SurfaceTexture is valid");
         return 0;
     }
-    
+
     sp<IGraphicBufferProducer> producer(SurfaceTexture_getProducer(_env, native_window));
-    window = new Surface(producer);
+    window = new Surface(producer, true);
     if (window == NULL)
         goto not_valid_surface;
 
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 88a2f14..b6a4250 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -2379,7 +2379,13 @@
              method should be considered an option as the default. -->
         <attr name="isDefault" format="boolean" />
         <!-- Set to true if this input method supports ways to switch to
-             a next input method (e.g. a globe key.). -->
+             a next input method (e.g. a globe key.). When this is true and
+             InputMethodManager#shouldOfferSwitchingToNextInputMethod() returns true,
+             the IME has to offer ways to to invoke InputMethodManager#switchToNextInputMethod()
+             accordingly.
+             <p> Note that the system determines the most appropriate next input method
+             and subtype in order to provide the consistent user experience in switching
+             between IMEs and subtypes. -->
         <attr name="supportsSwitchingToNextInputMethod" format="boolean" />
     </declare-styleable>
 
@@ -2605,6 +2611,9 @@
         <!-- Whether the device must be unlocked before routing data to this service.
              The default is false.-->
         <attr name="requireDeviceUnlock" format="boolean"/>
+        <!-- A drawable that can be rendered in Android's system UI for representing
+             the service. -->
+        <attr name="apduServiceBanner" format="reference"/>
     </declare-styleable>
 
     <!-- Use <code>offhost-apdu-service</code> as the root tag of the XML resource that
@@ -2615,6 +2624,9 @@
         <!-- Short description of the functionality the service implements. This attribute
              is mandatory.-->
         <attr name="description" />
+        <!-- A drawable that can be rendered in Android's system UI for representing
+             the service. -->
+        <attr name="apduServiceBanner"/>
     </declare-styleable>
 
     <!-- Specify one or more <code>aid-group</code> elements inside a
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 696e782..dce2db0 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2074,5 +2074,6 @@
   <public type="attr" name="autoMirrored" />
   <public type="attr" name="supportsSwitchingToNextInputMethod" />
   <public type="attr" name="requireDeviceUnlock" />
+  <public type="attr" name="apduServiceBanner" />
 
 </resources>
diff --git a/core/tests/coretests/Android.mk b/core/tests/coretests/Android.mk
index 22fa7fc..be55444 100644
--- a/core/tests/coretests/Android.mk
+++ b/core/tests/coretests/Android.mk
@@ -22,7 +22,7 @@
 	$(call all-java-files-under, EnabledTestApp/src)
 
 LOCAL_DX_FLAGS := --core-library
-LOCAL_STATIC_JAVA_LIBRARIES := core-tests android-common frameworks-core-util-lib mockwebserver guava littlemock
+LOCAL_STATIC_JAVA_LIBRARIES := core-tests-support android-common frameworks-core-util-lib mockwebserver guava littlemock
 LOCAL_JAVA_LIBRARIES := android.test.runner conscrypt telephony-common
 LOCAL_PACKAGE_NAME := FrameworksCoreTests
 
diff --git a/core/tests/coretests/src/android/webkit/AccessibilityInjectorTest.java b/core/tests/coretests/src/android/webkit/AccessibilityInjectorTest.java
deleted file mode 100644
index 417a85f..0000000
--- a/core/tests/coretests/src/android/webkit/AccessibilityInjectorTest.java
+++ /dev/null
@@ -1,1809 +0,0 @@
-/*
- * Copyright (C) 2010 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.webkit;
-
-import android.accessibilityservice.AccessibilityService;
-import android.accessibilityservice.AccessibilityServiceInfo;
-import android.content.ComponentName;
-import android.content.ContentResolver;
-import android.content.Intent;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.SystemClock;
-import android.provider.Settings;
-import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.view.KeyEvent;
-import android.view.accessibility.AccessibilityEvent;
-import android.view.accessibility.AccessibilityManager;
-
-/**
- * This is a test for the behavior of the {@link AccessibilityInjector}
- * which is used by {@link WebView} to provide basic accessibility support
- * in case JavaScript is disabled.
- * </p>
- * Note: This test works against the generated {@link AccessibilityEvent}s
- *       to so it also checks if the test for announcing navigation axis and
- *       status messages as appropriate.
- */
-public class AccessibilityInjectorTest
-    extends ActivityInstrumentationTestCase2<AccessibilityInjectorTestActivity> {
-
-    /** The timeout to wait for the expected selection. */
-    private static final long TIMEOUT_WAIT_FOR_SELECTION_STRING = 1000;
-
-    /** The timeout to wait for accessibility and the mock service to be enabled. */
-    private static final long TIMEOUT_ENABLE_ACCESSIBILITY_AND_MOCK_SERVICE = 1000;
-
-    /** The count of tests to detect when to shut down the service. */
-    private static final int TEST_CASE_COUNT = 19;
-
-    /** The meta state for pressed left ALT. */
-    private static final int META_STATE_ALT_LEFT_ON = KeyEvent.META_ALT_ON
-            | KeyEvent.META_ALT_LEFT_ON;
-
-    /** Prefix for the CSS style span appended by WebKit. */
-    private static final String APPLE_SPAN_PREFIX = "<span class=\"Apple-style-span\"";
-
-    /** Suffix for the CSS style span appended by WebKit. */
-    private static final String APPLE_SPAN_SUFFIX = "</span>";
-
-    /** The value for not specified selection string since null is a valid value. */
-    private static final String SELECTION_STRING_UNKNOWN = "Unknown";
-
-    /** Lock for locking the test. */
-    private static final Object sTestLock = new Object();
-
-    /** Key bindings used for testing. */
-    private static final String TEST_KEY_DINDINGS =
-        "0x13=0x01000100;" +
-        "0x14=0x01010100;" +
-        "0x15=0x04000000;" +
-        "0x16=0x04000000;" +
-        "0x200000013=0x03020701:0x03010201:0x03000101:0x03030001:0x03040001:0x03050001:0x03060001;" +
-        "0x200000014=0x03010001:0x03020101:0x03070201:0x03030701:0x03040701:0x03050701:0x03060701;" +
-        "0x200000015=0x03040301:0x03050401:0x03060501:0x03000601:0x03010601:0x03020601:0x03070601;" +
-        "0x200000016=0x03050601:0x03040501:0x03030401:0x03020301:0x03070301:0x03010301:0x03000301;";
-
-    /** Handle to the test for use by the mock service. */
-    private static AccessibilityInjectorTest sInstance;
-
-    /** Flag indicating if the accessibility service is ready to receive events. */
-    private static boolean sIsAccessibilityServiceReady;
-
-    /** The count of executed tests to detect when to toggle accessibility and the service. */
-    private static int sExecutedTestCount;
-
-    /** Worker thread with a handler to perform non test thread processing. */
-    private Worker mWorker;
-
-    /** Handle to the {@link WebView} to load data in. */
-    private WebView mWebView;
-
-    /** Used for caching the default bindings so they can be restored. */
-    private static String sDefaultKeyBindings;
-
-    /** The received selection string for assertion checking. */
-    private static String sReceivedSelectionString = SELECTION_STRING_UNKNOWN;
-
-    public AccessibilityInjectorTest() {
-        super(AccessibilityInjectorTestActivity.class);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mWorker = new Worker();
-        sInstance = this;
-        if (sExecutedTestCount == 0) {
-            // until JUnit4 comes to play with @BeforeTest
-            disableAccessibilityAndMockAccessibilityService();
-            enableAccessibilityAndMockAccessibilityService();
-            injectTestWebContentKeyBindings();
-        }
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        if (mWorker != null) {
-            mWorker.stop();
-        }
-        if (sExecutedTestCount == TEST_CASE_COUNT) {
-            // until JUnit4 comes to play with @AfterTest
-            disableAccessibilityAndMockAccessibilityService();
-            restoreDefaultWebContentKeyBindings();
-        }
-        super.tearDown();
-    }
-
-    /**
-     * Tests navigation by character.
-     */
-    @LargeTest
-    public void testNavigationByCharacter() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<html>" +
-               "<head>" +
-               "</head>" +
-               "<body>" +
-                   "<p>" +
-                      "a<b>b</b>c" +
-                   "</p>" +
-                   "<p>" +
-                     "d" +
-                   "<p/>" +
-                   "e" +
-               "</body>" +
-             "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // change navigation axis to word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("1"); // expect the word navigation axis
-
-        // change navigation axis to character
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("0"); // expect the character navigation axis
-
-        // go to the first character
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("a");
-
-        // go to the second character
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<b>b</b>");
-
-        // go to the third character
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("c");
-
-        // go to the fourth character
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("d");
-
-        // go to the fifth character
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("e");
-
-        // try to go past the last character
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the fifth character (reverse)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("e");
-
-        // go to the fourth character (reverse)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("d");
-
-        // go to the third character
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("c");
-
-        // go to the second character
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<b>b</b>");
-
-        // go to the first character
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("a");
-
-        // try to go before the first character
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString(null);
-
-        // go to the first character
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("a");
-
-        // go to the second character (reverse again)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<b>b</b>");
-    }
-
-    /**
-     * Tests navigation by word.
-     */
-    @LargeTest
-    public void testNavigationByWord() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<html>" +
-               "<head>" +
-               "</head>" +
-               "<body>" +
-                   "<p>" +
-                      "This is <b>a</b> sentence" +
-                   "</p>" +
-                   "<p>" +
-                     " scattered " +
-                     "<p/>" +
-                     " all over " +
-                   "</p>" +
-                   "<div>" +
-                     "<p>the place.</p>" +
-                   "</div>" +
-               "</body>" +
-             "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // change navigation axis to word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("1"); // expect the word navigation axis
-
-        // go to the first word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("This");
-
-        // go to the second word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("is");
-
-        // go to the third word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<b>a</b>");
-
-        // go to the fourth word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("sentence");
-
-        // go to the fifth word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("scattered");
-
-        // go to the sixth word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("all");
-
-        // go to the seventh word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("over");
-
-        // go to the eight word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("the");
-
-        // go to the ninth word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("place");
-
-        // NOTE: WebKit selection returns the dot as a word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(".");
-
-        // try to go past the last word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the last word (reverse)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("place.");
-
-        // go to the eight word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("the");
-
-        // go to the seventh word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("over");
-
-        // go to the sixth word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("all");
-
-        // go to the fifth word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("scattered");
-
-        // go to the fourth word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("sentence");
-
-        // go to the third word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<b>a</b>");
-
-        // go to the second word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("is");
-
-        // go to the first word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("This");
-
-        // try to go before the first word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString(null);
-
-        // go to the first word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("This");
-
-        // go to the second word (reverse again)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("is");
-    }
-
-    /**
-     * Tests navigation by sentence.
-     */
-    @LargeTest
-    public void testNavigationBySentence() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "<div>" +
-                  "<p>" +
-                    "This is the first sentence of the first paragraph and has an <b>inline bold tag</b>." +
-                    "This is the second sentence of the first paragraph." +
-                  "</p>" +
-                  "<h1>This is a heading</h1>" +
-                  "<p>" +
-                    "This is the first sentence of the second paragraph." +
-                    "This is the second sentence of the second paragraph." +
-                  "</p>" +
-                "</div>" +
-              "</body>" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // Sentence axis is the default
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("This is the first sentence of the first paragraph and has an "
-                + "<b>inline bold tag</b>.");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("This is the second sentence of the first paragraph.");
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("This is a heading");
-
-        // go to the fourth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("This is the first sentence of the second paragraph.");
-
-        // go to the fifth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("This is the second sentence of the second paragraph.");
-
-        // try to go past the last sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the fifth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("This is the second sentence of the second paragraph.");
-
-        // go to the fourth sentence (reverse)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("This is the first sentence of the second paragraph.");
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("This is a heading");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("This is the second sentence of the first paragraph.");
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("This is the first sentence of the first paragraph and has an "
-                + "<b>inline bold tag</b>.");
-
-        // try to go before the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString(null);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("This is the first sentence of the first paragraph and has an "
-                + "<b>inline bold tag</b>.");
-
-        // go to the second sentence (reverse again)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("This is the second sentence of the first paragraph.");
-    }
-
-    /**
-     * Tests navigation by heading.
-     */
-    @LargeTest
-    public void testNavigationByHeading() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<!DOCTYPE html>" +
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "<h1>Heading one</h1>" +
-                "<p>" +
-                  "This is some text" +
-                "</p>" +
-                "<h2>Heading two</h2>" +
-                "<p>" +
-                  "This is some text" +
-                "</p>" +
-                "<h3>Heading three</h3>" +
-                "<p>" +
-                  "This is some text" +
-                "</p>" +
-                "<h4>Heading four</h4>" +
-                "<p>" +
-                  "This is some text" +
-                "</p>" +
-                "<h5>Heading five</h5>" +
-                "<p>" +
-                  "This is some text" +
-                "</p>" +
-                "<h6>Heading six</h6>" +
-              "</body>" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // change navigation axis to heading
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_RIGHT, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("3"); // expect the heading navigation axis
-
-        // go to the first heading
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<h1>Heading one</h1>");
-
-        // go to the second heading
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<h2>Heading two</h2>");
-
-        // go to the third heading
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<h3>Heading three</h3>");
-
-        // go to the fourth heading
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<h4>Heading four</h4>");
-
-        // go to the fifth heading
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<h5>Heading five</h5>");
-
-        // go to the sixth heading
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<h6>Heading six</h6>");
-
-        // try to go past the last heading
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the fifth heading (reverse)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<h5>Heading five</h5>");
-
-        // go to the fourth heading
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<h4>Heading four</h4>");
-
-        // go to the third heading
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<h3>Heading three</h3>");
-
-        // go to the second heading
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<h2>Heading two</h2>");
-
-        // go to the first heading
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<h1>Heading one</h1>");
-
-        // try to go before the first heading
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString(null);
-
-        // go to the second heading (reverse again)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<h2>Heading two</h2>");
-    }
-
-    /**
-     * Tests navigation by sibling.
-     */
-    @LargeTest
-    public void testNavigationBySibing() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<!DOCTYPE html>" +
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "<h1>Heading one</h1>" +
-                "<p>" +
-                  "This is some text" +
-                "</p>" +
-                "<div>" +
-                  "<button>Input</button>" +
-                "</div>" +
-              "</body>" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // change navigation axis to heading
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_RIGHT, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("3"); // expect the heading navigation axis
-
-        // change navigation axis to sibling
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_RIGHT, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("4"); // expect the sibling navigation axis
-
-        // change navigation axis to parent/first child
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_RIGHT, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("5"); // expect the parent/first child navigation axis
-
-        // go to the first child of the body
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<h1>Heading one</h1>");
-
-        // change navigation axis to sibling
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_LEFT, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("4"); // expect the sibling navigation axis
-
-        // go to the next sibling
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<p>This is some text</p>");
-
-        // go to the next sibling
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<div><button>Input</button></div>");
-
-        // try to go past the last sibling
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the previous sibling (reverse)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<p>This is some text</p>");
-
-        // go to the previous sibling
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<h1>Heading one</h1>");
-
-        // try to go before the previous sibling
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString(null);
-
-        // go to the next sibling (reverse again)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<p>This is some text</p>");
-    }
-
-    /**
-     * Tests navigation by parent/first child.
-     */
-    @LargeTest
-    public void testNavigationByParentFirstChild() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<!DOCTYPE html>" +
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "<div>" +
-                  "<button>Input</button>" +
-                "</div>" +
-              "</body>" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // change navigation axis to document
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_LEFT, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("6"); // expect the document navigation axis
-
-        // change navigation axis to parent/first child
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_LEFT, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("5"); // expect the parent/first child navigation axis
-
-        // go to the first child
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<div><button>Input</button></div>");
-
-        // go to the first child
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<button>Input</button>");
-
-        // try to go to the first child of a leaf element
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the parent (reverse)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<div><button>Input</button></div>");
-
-        // go to the parent
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<body><div><button>Input</button></div></body>");
-
-        // try to go to the body parent
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString(null);
-
-        // go to the first child (reverse again)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<div><button>Input</button></div>");
-    }
-
-    /**
-     * Tests navigation by document.
-     */
-    @LargeTest
-    public void testNavigationByDocument() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<!DOCTYPE html>" +
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "<button>Click</button>" +
-              "</body>" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // change navigation axis to document
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_LEFT, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("6"); // expect the document navigation axis
-
-        // go to the bottom of the document
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("Click");
-
-        // go to the top of the document (reverse)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<body><button>Click</button></body>");
-
-        // go to the bottom of the document (reverse again)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("Click");
-    }
-
-    /**
-     * Tests the sync between the text navigation and navigation by DOM elements.
-     */
-    @LargeTest
-    public void testSyncBetweenTextAndDomNodeNavigation() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<!DOCTYPE html>" +
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "<p>" +
-                  "First" +
-                "</p>" +
-                "<button>Second</button>" +
-                "<p>" +
-                  "Third" +
-                "</p>" +
-              "</body>" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // change navigation axis to word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("1"); // expect the word navigation axis
-
-        // go to the first word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("First");
-
-        // change navigation axis to heading
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_RIGHT, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("3"); // expect the heading navigation axis
-
-        // change navigation axis to sibling
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_RIGHT, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("4"); // expect the sibling navigation axis
-
-        // go to the next sibling
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<button>Second</button>");
-
-        // change navigation axis to character
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("0"); // expect the character navigation axis
-
-        // change navigation axis to word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("1"); // expect the word navigation axis
-
-        // go to the next word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("Third");
-    }
-
-    /**
-     * Tests that the selection does not cross anchor boundaries. This is a
-     * workaround for the asymmetric and inconsistent handling of text with
-     * links by WebKit while traversing by sentence.
-     */
-    @LargeTest
-    public void testEnforceSelectionDoesNotCrossAnchorBoundary1() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<!DOCTYPE html>" +
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "<div>First</div>" +
-                "<p>" +
-                  "<a href=\"\">Second</a> Third" +
-                "</p>" +
-              "</body>" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<div>First</div>");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<a href=\"\">Second</a>");
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("Third");
-
-        // go to past the last sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("Third");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<a href=\"\">Second</a>");
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("First");
-
-        // go to before the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString(null);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<div>First</div>");
-    }
-
-    /**
-     * Tests that the selection does not cross anchor boundaries. This is a
-     * workaround for the asymmetric and inconsistent handling of text with
-     * links by WebKit while traversing by sentence.
-     */
-    @LargeTest
-    public void testEnforceSelectionDoesNotCrossAnchorBoundary2() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<!DOCTYPE html>" +
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "<div>First</div>" +
-                "<a href=\"#\">Second</a>" +
-                "&nbsp;" +
-                "<a href=\"#\">Third</a>" +
-              "</body>" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("First");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<a href=\"#\">Second</a>");
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("&nbsp;");
-
-        // go to the fourth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<a href=\"#\">Third</a>");
-
-        // go to past the last sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the fourth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<a href=\"#\">Third</a>");
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("&nbsp;");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<a href=\"#\">Second</a>");
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("First");
-
-        // go to before the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString(null);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("First");
-    }
-
-    /**
-     * Tests that the selection does not cross anchor boundaries. This is a
-     * workaround for the asymmetric and inconsistent handling of text with
-     * links by WebKit while traversing by sentence.
-     */
-    @LargeTest
-    public void testEnforceSelectionDoesNotCrossAnchorBoundary3() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<!DOCTYPE html>" +
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "<div>" +
-                  "First" +
-                "<div>" +
-                "<div>" +
-                  "<a href=\"#\">Second</a>" +
-                "</div>" +
-                "<div>" +
-                  "Third" +
-                "</div>" +
-              "</body>" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("First");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<a href=\"#\">Second</a>");
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("Third");
-
-        // go to past the last sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("Third");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<a href=\"#\">Second</a>");
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("First");
-
-        // go to before the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString(null);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("First");
-    }
-
-    /**
-     * Tests skipping of content with hidden visibility.
-     */
-    @LargeTest
-    public void testSkipVisibilityHidden() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<!DOCTYPE html>" +
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "<div>First </div>" +
-                "<div style=\"visibility:hidden;\">Second</div>" +
-                "<div> Third</div>" +
-              "</body>" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // change navigation axis to word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("1"); // expect the word navigation axis
-
-        // go to the first word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("First");
-
-        // go to the third word (the second is invisible)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("Third");
-
-        // go to past the last sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the third word (the second is invisible)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("Third");
-
-        // go to the first word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("First");
-
-        // go to before the first word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString(null);
-
-        // go to the first word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("First");
-    }
-
-    /**
-     * Tests skipping of content with display none.
-     */
-    @LargeTest
-    public void testSkipDisplayNone() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<!DOCTYPE html>" +
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "<div>First</div>" +
-                "<div style=\"display: none;\">Second</div>" +
-                "<div>Third</div>" +
-              "</body>" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // change navigation axis to word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("1"); // expect the word navigation axis
-
-        // go to the first word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("First");
-
-        // go to the third word (the second is invisible)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("Third");
-
-        // go to past the last sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the third word (the second is invisible)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("Third");
-
-        // go to the first word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("First");
-
-        // go to before the first word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString(null);
-
-        // go to the first word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("First");
-    }
-
-    /**
-     * Tests for the selection not getting stuck.
-     *
-     * Note: The selection always proceeds but if it can
-     * be selecting the same content i.e. between the start
-     * and end are contained the same text nodes.
-     */
-    @LargeTest
-    public void testSelectionTextProceed() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<!DOCTYPE html>" +
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "<a href=\"#\">First</a>" +
-                "<span><a href=\"#\"><span>Second</span>&nbsp;<small>a</small></a>" +
-                "</span>&nbsp;<a href=\"#\">Third</a>" +
-              "</body>" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<a href=\"#\">First</a>");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<a href=\"#\"><span>Second&nbsp;<small>a</small></a>");
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("&nbsp;");
-
-        // go to the fourth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<a href=\"#\">Third</a>");
-
-        // go to past the last sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<a href=\"#\">Third</a>");
-
-        // NOTE: Here we are a bit asymmetric around whitespace but we can live with it
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("&nbsp;");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<a href=\"#\"><span>Second&nbsp;<small>a</small></a>");
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<a href=\"#\">First</a>");
-
-        // go to before the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString(null);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<a href=\"#\">First</a>");
-    }
-
-    /**
-     * Tests if input elements are selected rather skipped.
-     */
-    @LargeTest
-    public void testSelectionOfInputElements() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<!DOCTYPE html>" +
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "<p>" +
-                  "First" +
-                "</p>" +
-                "<input type=\"text\"/>" +
-                "<p>" +
-                  "Second" +
-                "</p>" +
-              "</body>" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("First");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<input type=\"text\">");
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("Second");
-
-        // go to past the last sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("Second");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<input type=\"text\">");
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("First");
-
-        // go to before the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString(null);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("First");
-    }
-
-    /**
-     * Tests traversing of input controls.
-     */
-    @LargeTest
-    public void testSelectionOfInputElements2() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<!DOCTYPE html>" +
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "<div>" +
-                  "First" +
-                  "<input type=\"text\"/>" +
-                  "<span>" +
-                    "<input type=\"text\"/>" +
-                  "</span>" +
-                  "<button type=\"button\">Click Me!</button>" +
-                  "<div>" +
-                    "<input type=\"submit\"/>" +
-                  "</div>" +
-                  "<p>" +
-                    "Second" +
-                  "</p>" +
-                "</div>" +
-              "</body>" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("First");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<input type=\"text\">");
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<input type=\"text\">");
-
-        // go to the fourth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<button type=\"button\">Click Me!</button>");
-
-        // go to the fifth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<input type=\"submit\">");
-
-        // go to the sixth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("Second");
-
-        // go to past the last sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the sixth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("Second");
-
-        // go to the fifth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<input type=\"submit\">");
-
-        // go to the fourth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<button type=\"button\">Click Me!</button>");
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<input type=\"text\">");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<input type=\"text\">");
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("First");
-    }
-
-    /**
-     * Tests traversing of input controls.
-     */
-    @LargeTest
-    public void testSelectionOfInputElements3() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<!DOCTYPE html>" +
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "<input type=\"text\"/>" +
-                "<button type=\"button\">Click Me!</button>" +
-                "<select>" +
-                  "<option value=\"volvo\">Volvo</option>" +
-                  "<option value=\"saab\">Saab</option>" +
-                "</select>" +
-              "</body>" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<input type=\"text\">");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<button type=\"button\">Click Me!</button>");
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<select><option value=\"volvo\">Volvo</option>" +
-                "<option value=\"saab\">Saab</option></select>");
-
-        // go to past the last sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<select><option value=\"volvo\">Volvo</option>" +
-                "<option value=\"saab\">Saab</option></select>");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<button type=\"button\">Click Me!</button>");
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<input type=\"text\">");
-
-        // go to before the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString(null);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<input type=\"text\">");
-    }
-
-    /**
-     * Tests traversing of input controls.
-     */
-    @LargeTest
-    public void testSelectionOfInputElements4() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<!DOCTYPE html>" +
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "Start" +
-                "<span>" +
-                  "<span>" +
-                    "<input type=\"submit\">" +
-                  "</span>" +
-                "</span>" +
-                "<input type=\"text\" size=\"30\">" +
-                "<span>" +
-                  "<span>" +
-                    "<input type=\"submit\" size=\"30\">" +
-                  "</span>" +
-                "</span>" +
-                "End" +
-              "</body>" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("Start");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<input type=\"submit\">");
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<input type=\"text\" size=\"30\">");
-
-        // go to the fourth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<input type=\"submit\" size=\"30\">");
-
-        // go to the fifth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("End");
-
-        // go to past the last sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the fifth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("End");
-
-        // go to the fourth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<input type=\"submit\" size=\"30\">");
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<input type=\"text\" size=\"30\">");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<input type=\"submit\">");
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("Start");
-
-        // go to before the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString(null);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("Start");
-    }
-
-    /**
-     * Tests traversing of input controls.
-     */
-    @LargeTest
-    public void testSelectionOfInputElements5() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<!DOCTYPE html>" +
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "<div>" +
-                  "First" +
-                  "<input type=\"hidden\">" +
-                  "<input type=\"hidden\">" +
-                  "<input type=\"hidden\">" +
-                  "<input type=\"hidden\">" +
-                  "<input type=\"text\">" +
-                  "<span>" +
-                    "<span>" +
-                      "<input type=\"submit\">" +
-                    "</span>" +
-                  "</span>" +
-                "</div>" +
-              "</body>" +
-              "Second" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("First");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<input type=\"text\">");
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<input type=\"submit\">");
-
-        // go to the fourth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("Second");
-
-        // go to past the last sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the fourth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("Second");
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<input type=\"submit\">");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<input type=\"text\">");
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("First");
-
-        // go to before the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString(null);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("First");
-    }
-
-    /**
-     * Enable accessibility and the mock accessibility service.
-     */
-    private void enableAccessibilityAndMockAccessibilityService() {
-        // make sure the manager is instantiated so the system initializes it
-        AccessibilityManager.getInstance(getActivity());
-
-        // enable accessibility and the mock accessibility service
-        Settings.Secure.putInt(getActivity().getContentResolver(),
-                Settings.Secure.ACCESSIBILITY_ENABLED, 1);
-        String enabledServices = new ComponentName(getActivity().getPackageName(),
-                MockAccessibilityService.class.getName()).flattenToShortString();
-        Settings.Secure.putString(getActivity().getContentResolver(),
-                Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, enabledServices);
-
-        // poll within a timeout and let be interrupted in case of success
-        long incrementStep = TIMEOUT_ENABLE_ACCESSIBILITY_AND_MOCK_SERVICE / 5;
-        long start = SystemClock.uptimeMillis();
-        while (SystemClock.uptimeMillis() - start < TIMEOUT_ENABLE_ACCESSIBILITY_AND_MOCK_SERVICE &&
-                !sIsAccessibilityServiceReady) {
-            synchronized (sTestLock) {
-                try {
-                    sTestLock.wait(incrementStep);
-                } catch (InterruptedException ie) {
-                    /* ignore */
-                }
-            }
-        }
-
-        if (!sIsAccessibilityServiceReady) {
-            throw new IllegalStateException("MockAccessibilityService not ready. Did you add " +
-                    "tests and forgot to update AccessibilityInjectorTest#TEST_CASE_COUNT?");
-        }
-    }
-
-    @Override
-    protected void scrubClass(Class<?> testCaseClass) {
-        /* do nothing - avoid superclass behavior */
-    }
-
-    /**
-     * Strips the apple span appended by WebKit while generating
-     * the selection markup.
-     *
-     * @param markup The markup.
-     * @return Stripped from apple spans markup.
-     */
-    private static String stripAppleSpanFromMarkup(String markup) {
-        StringBuilder stripped = new StringBuilder(markup);
-        int prefixBegIdx = stripped.indexOf(APPLE_SPAN_PREFIX);
-        while (prefixBegIdx >= 0) {
-            int prefixEndIdx = stripped.indexOf(">", prefixBegIdx) + 1;
-            stripped.replace(prefixBegIdx, prefixEndIdx, "");
-            int suffixBegIdx = stripped.lastIndexOf(APPLE_SPAN_SUFFIX);
-            int suffixEndIdx = suffixBegIdx + APPLE_SPAN_SUFFIX.length();
-            stripped.replace(suffixBegIdx, suffixEndIdx, "");
-            prefixBegIdx = stripped.indexOf(APPLE_SPAN_PREFIX);
-        }
-        return stripped.toString();
-    }
-
-    /**
-     * Disables accessibility and the mock accessibility service.
-     */
-    private void disableAccessibilityAndMockAccessibilityService() {
-        // disable accessibility and the mock accessibility service
-        Settings.Secure.putInt(getActivity().getContentResolver(),
-                Settings.Secure.ACCESSIBILITY_ENABLED, 0);
-        Settings.Secure.putString(getActivity().getContentResolver(),
-                Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, "");
-    }
-
-    /**
-     * Asserts the next <code>expectedSelectionString</code> to be received.
-     */
-    private void assertSelectionString(String expectedSelectionString) {
-        assertTrue("MockAccessibilityService not ready", sIsAccessibilityServiceReady);
-
-        long incrementStep = TIMEOUT_WAIT_FOR_SELECTION_STRING / 5;
-        long start = SystemClock.uptimeMillis();
-        while (SystemClock.uptimeMillis() - start < TIMEOUT_WAIT_FOR_SELECTION_STRING &&
-                sReceivedSelectionString == SELECTION_STRING_UNKNOWN) {
-            synchronized (sTestLock) {
-                try {
-                    sTestLock.wait(incrementStep);
-                } catch (InterruptedException ie) {
-                    /* ignore */
-                }
-            }
-        }
-        try {
-            if (sReceivedSelectionString == SELECTION_STRING_UNKNOWN) {
-                fail("No selection string received. Expected: " + expectedSelectionString);
-            }
-            assertEquals(expectedSelectionString, sReceivedSelectionString);
-        } finally {
-            sReceivedSelectionString = SELECTION_STRING_UNKNOWN;
-        }
-    }
-
-    /**
-     * Sends a {@link KeyEvent} (up and down) to the {@link WebView}.
-     *
-     * @param keyCode The event key code.
-     */
-    private void sendKeyEvent(WebView webView, int keyCode, int metaState) {
-        webView.onKeyDown(keyCode, new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, keyCode, 1, metaState));
-        webView.onKeyUp(keyCode, new KeyEvent(0, 0, KeyEvent.ACTION_UP, keyCode, 1, metaState));
-    }
-
-    /**
-     * Loads HTML content in a {@link WebView}.
-     *
-     * @param html The HTML content;
-     * @return The {@link WebView} view.
-     */
-    private WebView loadHTML(final String html) {
-        mWorker.getHandler().post(new Runnable() {
-            public void run() {
-                if (mWebView == null) {
-                    mWebView = getActivity().getWebView();
-                    mWebView.setWebViewClient(new WebViewClient() {
-                        @Override
-                        public void onPageFinished(WebView view, String url) {
-                            mWorker.getHandler().post(new Runnable() {
-                                public void run() {
-                                    synchronized (sTestLock) {
-                                        sTestLock.notifyAll();
-                                    }
-                                }
-                            });
-                        }
-                    });
-                }
-                mWebView.loadData(html, "text/html", null);
-            }
-        });
-        synchronized (sTestLock) {
-            try {
-                sTestLock.wait();
-            } catch (InterruptedException ie) {
-                /* ignore */
-            }
-        }
-        return mWebView;
-    }
-
-    /**
-     * Injects web content key bindings used for testing. This is required
-     * to ensure that this test will be agnostic to changes of the bindings.
-     */
-    private void injectTestWebContentKeyBindings() {
-        ContentResolver contentResolver = getActivity().getContentResolver();
-        sDefaultKeyBindings = Settings.Secure.getString(contentResolver,
-                Settings.Secure.ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS);
-        Settings.Secure.putString(contentResolver,
-                Settings.Secure.ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS, TEST_KEY_DINDINGS);
-    }
-
-    /**
-     * Restores the default web content key bindings.
-     */
-    private void restoreDefaultWebContentKeyBindings() {
-        Settings.Secure.putString(getActivity().getContentResolver(),
-                Settings.Secure.ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS,
-                sDefaultKeyBindings);
-    }
-
-    /**
-     * This is a worker thread responsible for creating the {@link WebView}.
-     */
-    private class Worker implements Runnable {
-        private final Object mWorkerLock = new Object();
-        private Handler mHandler;
-
-       public Worker() {
-            new Thread(this).start();
-            synchronized (mWorkerLock) {
-                while (mHandler == null) {
-                    try {
-                        mWorkerLock.wait();
-                    } catch (InterruptedException ex) {
-                        /* ignore */
-                    }
-                }
-            }
-        }
-
-        public void run() {
-            synchronized (mWorkerLock) {
-                Looper.prepare();
-                mHandler = new Handler();
-                mWorkerLock.notifyAll();
-            }
-            Looper.loop();
-        }
-
-        public Handler getHandler() {
-            return mHandler;
-        }
-
-        public void stop() {
-            mHandler.getLooper().quit();
-        }
-    }
-
-    /**
-     * Mock accessibility service to receive the accessibility events
-     * with the current {@link WebView} selection.
-     */
-    public static class MockAccessibilityService extends AccessibilityService {
-        private boolean mIsServiceInfoSet;
-
-        @Override
-        protected void onServiceConnected() {
-            if (mIsServiceInfoSet) {
-                return;
-            }
-            AccessibilityServiceInfo info = new AccessibilityServiceInfo();
-            info.eventTypes = AccessibilityEvent.TYPE_VIEW_SELECTED;
-            info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
-            setServiceInfo(info);
-            mIsServiceInfoSet = true;
-
-            sIsAccessibilityServiceReady = true;
-
-            if (sInstance == null) {
-                return;
-            }
-            synchronized (sTestLock) {
-                sTestLock.notifyAll();
-            }
-        }
-
-        @Override
-        public void onAccessibilityEvent(AccessibilityEvent event) {
-            if (sInstance == null) {
-                return;
-            }
-            if (!event.getText().isEmpty()) {
-                CharSequence text = event.getText().get(0);
-                if (text != null) {
-                    sReceivedSelectionString = stripAppleSpanFromMarkup(text.toString());
-                } else {
-                    sReceivedSelectionString = null;
-                }
-            }
-            synchronized (sTestLock) {
-                sTestLock.notifyAll();
-            }
-        }
-
-        @Override
-        public void onInterrupt() {
-            /* do nothing */
-        }
-
-        @Override
-        public boolean onUnbind(Intent intent) {
-            sIsAccessibilityServiceReady = false;
-            return false;
-        }
-    }
-}
diff --git a/core/tests/coretests/src/android/webkit/AccessibilityInjectorTestActivity.java b/core/tests/coretests/src/android/webkit/AccessibilityInjectorTestActivity.java
deleted file mode 100644
index 3842df7..0000000
--- a/core/tests/coretests/src/android/webkit/AccessibilityInjectorTestActivity.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2011 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.webkit;
-
-import com.android.frameworks.coretests.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class AccessibilityInjectorTestActivity extends Activity {
-
-    private WebView mWebView;
-
-    @Override
-    public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-        setContentView(R.layout.accessibility_injector_test);
-        mWebView = (WebView) findViewById(R.id.webview);
-    }
-
-    public WebView getWebView() {
-        return mWebView;
-    }
-}
diff --git a/core/tests/coretests/src/android/webkit/UrlInterceptRegistryTest.java b/core/tests/coretests/src/android/webkit/UrlInterceptRegistryTest.java
deleted file mode 100644
index 7504449..0000000
--- a/core/tests/coretests/src/android/webkit/UrlInterceptRegistryTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * 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.webkit;
-
-import android.test.AndroidTestCase;
-import android.util.Log;
-import android.webkit.CacheManager.CacheResult;
-import android.webkit.PluginData;
-import android.webkit.UrlInterceptHandler;
-
-import java.util.LinkedList;
-import java.util.Map;
-
-public class UrlInterceptRegistryTest extends AndroidTestCase {
-
-    /**
-     * To run these tests: $ mmm
-     * frameworks/base/tests/CoreTests/android && adb remount && adb
-     * sync $ adb shell am instrument -w  -e class \
-     * android.webkit.UrlInterceptRegistryTest \
-     * android.core/android.test.InstrumentationTestRunner
-     */
-
-    private static class MockUrlInterceptHandler implements UrlInterceptHandler {
-        private PluginData mData;
-        private String mUrl;
-
-        public MockUrlInterceptHandler(PluginData data, String url) {
-            mData = data;
-            mUrl = url;
-        }
-
-        public CacheResult service(String url, Map<String, String> headers) {
-            return null;
-        }
-
-        public PluginData getPluginData(String url,
-                                        Map<String,
-                                        String> headers) {
-            if (mUrl.equals(url)) {
-                return mData;
-            }
-
-            return null;
-        }
-    }
-
-    public void testGetPluginData() {
-        PluginData data = new PluginData(null, 0 , null, 200);
-        String url = new String("url1");
-        MockUrlInterceptHandler handler1 =
-                new MockUrlInterceptHandler(data, url);
-
-        data = new PluginData(null, 0 , null, 404);
-        url = new String("url2");
-        MockUrlInterceptHandler handler2 =
-                new MockUrlInterceptHandler(data, url);
-
-        assertTrue(UrlInterceptRegistry.registerHandler(handler1));
-        assertTrue(UrlInterceptRegistry.registerHandler(handler2));
-
-        data = UrlInterceptRegistry.getPluginData("url1", null);
-        assertTrue(data != null);
-        assertTrue(data.getStatusCode() == 200);
-
-        data = UrlInterceptRegistry.getPluginData("url2", null);
-        assertTrue(data != null);
-        assertTrue(data.getStatusCode() == 404);
-
-        assertTrue(UrlInterceptRegistry.unregisterHandler(handler1));
-        assertTrue(UrlInterceptRegistry.unregisterHandler(handler2));
-
-    }
-}
diff --git a/core/tests/coretests/src/android/webkit/WebkitTest.java b/core/tests/coretests/src/android/webkit/WebkitTest.java
deleted file mode 100644
index 4685e3c..0000000
--- a/core/tests/coretests/src/android/webkit/WebkitTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * 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 android.webkit;
-
-import android.test.AndroidTestCase;
-import android.text.format.DateFormat;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.util.Log;
-import android.webkit.DateSorter;
-
-import java.util.Calendar;
-import java.util.Date;
-
-public class WebkitTest extends AndroidTestCase {
-
-    private static final String LOGTAG = WebkitTest.class.getName();
-
-    @MediumTest
-    public void testDateSorter() throws Exception {
-        /**
-         * Note: check the logging output manually to test
-         * nothing automated yet, besides object creation
-         */
-        DateSorter dateSorter = new DateSorter(mContext);
-        Date date = new Date();
-
-        for (int i = 0; i < DateSorter.DAY_COUNT; i++) {
-            Log.i(LOGTAG, "Boundary " + i + " " + dateSorter.getBoundary(i));
-            Log.i(LOGTAG, "Label " + i + " " + dateSorter.getLabel(i));
-        }
-
-        Calendar c = Calendar.getInstance();
-        long time = c.getTimeInMillis();
-        int index;
-        Log.i(LOGTAG, "now: " + dateSorter.getIndex(time));
-        for (int i = 0; i < 20; i++) {
-            time -= 8 * 60 * 60 * 1000; // 8 hours
-            date.setTime(time);
-            c.setTime(date);
-            index = dateSorter.getIndex(time);
-            Log.i(LOGTAG, "time: " + DateFormat.format("yyyy/MM/dd HH:mm:ss", c).toString() +
-                    " " + index + " " + dateSorter.getLabel(index));
-        }
-    }
-}
diff --git a/core/tests/coretests/src/android/webkit/ZoomManagerTest.java b/core/tests/coretests/src/android/webkit/ZoomManagerTest.java
deleted file mode 100644
index 7e0e0b2..0000000
--- a/core/tests/coretests/src/android/webkit/ZoomManagerTest.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (C) 2010 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.webkit;
-
-import android.test.AndroidTestCase;
-
-public class ZoomManagerTest extends AndroidTestCase {
-
-    private ZoomManager zoomManager;
-
-    @Override
-    public void setUp() {
-        WebView webView = new WebView(this.getContext());
-        WebViewClassic webViewClassic = WebViewClassic.fromWebView(webView);
-        CallbackProxy callbackProxy = new CallbackProxy(this.getContext(), webViewClassic);
-        zoomManager = new ZoomManager(webViewClassic, callbackProxy);
-
-        zoomManager.init(1.00f);
-    }
-
-    public void testInit() {
-        testInit(0.01f);
-        testInit(1.00f);
-        testInit(1.25f);
-    }
-
-    private void testInit(float density) {
-        zoomManager.init(density);
-        actualScaleTest(density);
-        defaultScaleTest(density);
-        assertEquals(zoomManager.getDefaultMaxZoomScale(), zoomManager.getMaxZoomScale());
-        assertEquals(zoomManager.getDefaultMinZoomScale(), zoomManager.getMinZoomScale());
-        assertEquals(density, zoomManager.getTextWrapScale());
-    }
-
-    public void testUpdateDefaultZoomDensity() {
-        // test the basic case where the actual values are equal to the defaults
-        testUpdateDefaultZoomDensity(0.01f);
-        testUpdateDefaultZoomDensity(1.00f);
-        testUpdateDefaultZoomDensity(1.25f);
-    }
-
-    private void testUpdateDefaultZoomDensity(float density) {
-        zoomManager.updateDefaultZoomDensity(density);
-        defaultScaleTest(density);
-    }
-
-    public void testUpdateDefaultZoomDensityWithSmallMinZoom() {
-        // test the case where the minZoomScale has changed to be < the default
-        float newDefaultScale = 1.50f;
-        float minZoomScale = ZoomManager.DEFAULT_MIN_ZOOM_SCALE_FACTOR * newDefaultScale;
-        WebViewCore.ViewState minViewState = new WebViewCore.ViewState();
-        minViewState.mMinScale = minZoomScale - 0.1f;
-        zoomManager.updateZoomRange(minViewState, 0, 0);
-        zoomManager.updateDefaultZoomDensity(newDefaultScale);
-        defaultScaleTest(newDefaultScale);
-    }
-
-    public void testUpdateDefaultZoomDensityWithLargeMinZoom() {
-        // test the case where the minZoomScale has changed to be > the default
-        float newDefaultScale = 1.50f;
-        float minZoomScale = ZoomManager.DEFAULT_MIN_ZOOM_SCALE_FACTOR * newDefaultScale;
-        WebViewCore.ViewState minViewState = new WebViewCore.ViewState();
-        minViewState.mMinScale = minZoomScale + 0.1f;
-        zoomManager.updateZoomRange(minViewState, 0, 0);
-        zoomManager.updateDefaultZoomDensity(newDefaultScale);
-        defaultScaleTest(newDefaultScale);
-    }
-
-    public void testUpdateDefaultZoomDensityWithSmallMaxZoom() {
-        // test the case where the maxZoomScale has changed to be < the default
-        float newDefaultScale = 1.50f;
-        float maxZoomScale = ZoomManager.DEFAULT_MAX_ZOOM_SCALE_FACTOR * newDefaultScale;
-        WebViewCore.ViewState maxViewState = new WebViewCore.ViewState();
-        maxViewState.mMaxScale = maxZoomScale - 0.1f;
-        zoomManager.updateZoomRange(maxViewState, 0, 0);
-        zoomManager.updateDefaultZoomDensity(newDefaultScale);
-        defaultScaleTest(newDefaultScale);
-    }
-
-    public void testUpdateDefaultZoomDensityWithLargeMaxZoom() {
-        // test the case where the maxZoomScale has changed to be > the default
-        float newDefaultScale = 1.50f;
-        float maxZoomScale = ZoomManager.DEFAULT_MAX_ZOOM_SCALE_FACTOR * newDefaultScale;
-        WebViewCore.ViewState maxViewState = new WebViewCore.ViewState();
-        maxViewState.mMaxScale = maxZoomScale + 0.1f;
-        zoomManager.updateZoomRange(maxViewState, 0, 0);
-        zoomManager.updateDefaultZoomDensity(newDefaultScale);
-        defaultScaleTest(newDefaultScale);
-    }
-
-    public void testComputeScaleWithLimits() {
-        final float maxScale = zoomManager.getMaxZoomScale();
-        final float minScale = zoomManager.getMinZoomScale();
-        assertTrue(maxScale > minScale);
-        assertEquals(maxScale, zoomManager.computeScaleWithLimits(maxScale));
-        assertEquals(maxScale, zoomManager.computeScaleWithLimits(maxScale + .01f));
-        assertEquals(minScale, zoomManager.computeScaleWithLimits(minScale));
-        assertEquals(minScale, zoomManager.computeScaleWithLimits(minScale - .01f));
-    }
-
-    private void actualScaleTest(float actualScale) {
-        assertEquals(actualScale, zoomManager.getScale());
-        assertEquals(1 / actualScale, zoomManager.getInvScale());
-    }
-
-    private void defaultScaleTest(float defaultScale) {
-        final float maxDefault = ZoomManager.DEFAULT_MAX_ZOOM_SCALE_FACTOR * defaultScale;
-        final float minDefault = ZoomManager.DEFAULT_MIN_ZOOM_SCALE_FACTOR * defaultScale;
-        assertEquals(defaultScale, zoomManager.getDefaultScale());
-        assertEquals(1 / defaultScale, zoomManager.getInvDefaultScale());
-        assertEquals(maxDefault, zoomManager.getDefaultMaxZoomScale());
-        assertEquals(minDefault, zoomManager.getDefaultMinZoomScale());
-    }
-}
diff --git a/data/etc/platform.xml b/data/etc/platform.xml
index 1f38ddb..89d102d 100644
--- a/data/etc/platform.xml
+++ b/data/etc/platform.xml
@@ -126,7 +126,6 @@
          interact with the system. -->
 
     <assign-permission name="android.permission.MODIFY_AUDIO_SETTINGS" uid="media" />
-    <assign-permission name="android.permission.ACCESS_DRM" uid="media" />
     <assign-permission name="android.permission.ACCESS_SURFACE_FLINGER" uid="media" />
     <assign-permission name="android.permission.WAKE_LOCK" uid="media" />
     <assign-permission name="android.permission.UPDATE_APP_OPS_STATS" uid="media" />
diff --git a/docs/html/distribute/googleplay/promote/brand.jd b/docs/html/distribute/googleplay/promote/brand.jd
index 265584f..0bda561 100644
--- a/docs/html/distribute/googleplay/promote/brand.jd
+++ b/docs/html/distribute/googleplay/promote/brand.jd
@@ -21,8 +21,8 @@
     <ul>
     <li>Android&trade; should have a trademark symbol the first time it appears in a creative.</li>
     <li>Android should always be capitalized and is never plural or possessive.</li>
-    <li>"Android" by itself cannot be used in the name of an application name or accessory product.
-Instead use "for Android."
+    <li>"Android" cannot be used in names of applications or accessory products,
+    including phones, tablets, TVs, speakers, headphones, watches, and other devices. Instead use "for Android".
       <ul>
         <li><span style="color:red">Incorrect</span>: "Android MediaPlayer"</li>
         <li><span style="color:green">Correct</span>: "MediaPlayer for Android"</li>
diff --git a/drm/java/android/drm/DrmManagerClient.java b/drm/java/android/drm/DrmManagerClient.java
index e2606d6..10cdab0 100644
--- a/drm/java/android/drm/DrmManagerClient.java
+++ b/drm/java/android/drm/DrmManagerClient.java
@@ -63,8 +63,6 @@
 
     private final CloseGuard mCloseGuard = CloseGuard.get();
 
-    private static final String EXTENDED_INFO_DATA = "extended_info_data";
-
     static {
         // Load the respective library
         System.loadLibrary("drmframework_jni");
@@ -186,22 +184,8 @@
         DrmManagerClient instance = (DrmManagerClient)((WeakReference)thisReference).get();
 
         if (null != instance && null != instance.mInfoHandler) {
-            DrmInfoEvent event = new DrmInfoEvent(uniqueId, infoType, message);
             Message m = instance.mInfoHandler.obtainMessage(
-                    InfoHandler.INFO_EVENT_TYPE, event);
-            instance.mInfoHandler.sendMessage(m);
-        }
-    }
-
-    private static void notify(
-            Object thisReference, int uniqueId, int infoType, String message,
-            HashMap<String, Object> attributes) {
-        DrmManagerClient instance = (DrmManagerClient)((WeakReference)thisReference).get();
-
-        if (null != instance && null != instance.mInfoHandler) {
-            DrmInfoEvent event = new DrmInfoEvent(uniqueId, infoType, message, attributes);
-            Message m = instance.mInfoHandler.obtainMessage(
-                    InfoHandler.INFO_EVENT_TYPE, event);
+                InfoHandler.INFO_EVENT_TYPE, uniqueId, infoType, message);
             instance.mInfoHandler.sendMessage(m);
         }
     }
@@ -214,25 +198,23 @@
         }
 
         public void handleMessage(Message msg) {
-            DrmInfoEvent info = (DrmInfoEvent) msg.obj;
+            DrmInfoEvent info = null;
             DrmErrorEvent error = null;
-            int uniqueId;
-            int eventType;
-            String message;
 
             switch (msg.what) {
             case InfoHandler.INFO_EVENT_TYPE:
-                uniqueId = info.getUniqueId();
-                eventType = info.getType();
-                message = info.getMessage();
+                int uniqueId = msg.arg1;
+                int infoType = msg.arg2;
+                String message = msg.obj.toString();
 
-                switch (eventType) {
+                switch (infoType) {
                 case DrmInfoEvent.TYPE_REMOVE_RIGHTS: {
                     try {
                         DrmUtils.removeFile(message);
                     } catch (IOException e) {
                         e.printStackTrace();
                     }
+                    info = new DrmInfoEvent(uniqueId, infoType, message);
                     break;
                 }
                 case DrmInfoEvent.TYPE_ALREADY_REGISTERED_BY_ANOTHER_ACCOUNT:
@@ -240,11 +222,11 @@
                 case DrmInfoEvent.TYPE_WAIT_FOR_RIGHTS:
                 case DrmInfoEvent.TYPE_ACCOUNT_ALREADY_REGISTERED:
                 case DrmInfoEvent.TYPE_RIGHTS_REMOVED: {
+                    info = new DrmInfoEvent(uniqueId, infoType, message);
                     break;
                 }
                 default:
-                    info = null;
-                    error = new DrmErrorEvent(uniqueId, eventType, message);
+                    error = new DrmErrorEvent(uniqueId, infoType, message);
                     break;
                 }
 
diff --git a/drm/jni/android_drm_DrmManagerClient.cpp b/drm/jni/android_drm_DrmManagerClient.cpp
index 7fce3d0..baddf62 100644
--- a/drm/jni/android_drm_DrmManagerClient.cpp
+++ b/drm/jni/android_drm_DrmManagerClient.cpp
@@ -169,49 +169,11 @@
     JNIEnv *env = AndroidRuntime::getJNIEnv();
     jstring message = env->NewStringUTF(event.getMessage().string());
     ALOGV("JNIOnInfoListener::onInfo => %d | %d | %s", uniqueId, type, event.getMessage().string());
-    const DrmBuffer& drmBuffer = event.getData();
-    if (event.getCount() > 0 || drmBuffer.length > 0) {
-        jclass hashMapClazz = env->FindClass("java/util/HashMap");
-        jmethodID hashMapInitId = env->GetMethodID(hashMapClazz, "<init>", "()V");
-        jmethodID hashMapPutId = env->GetMethodID(hashMapClazz, "put",
-                "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
-        jobject hashMapObject = env->NewObject(hashMapClazz, hashMapInitId);
-        env->DeleteLocalRef(hashMapClazz);
 
-        if (0 < drmBuffer.length) {
-            jfieldID fid = env->GetStaticFieldID(
-                mClass, "EXTENDED_INFO_DATA", "Ljava/lang/String;");
-            jstring key = (jstring) env->GetStaticObjectField(mClass, fid);
-
-            jbyteArray valueByte = env->NewByteArray(drmBuffer.length);
-            env->SetByteArrayRegion(valueByte, 0, drmBuffer.length, (jbyte*) drmBuffer.data);
-            env->CallObjectMethod(hashMapObject, hashMapPutId, key, valueByte);
-            env->DeleteLocalRef(valueByte);
-            env->DeleteLocalRef(key);
-        }
-        DrmInfoEvent::KeyIterator keyIt = event.keyIterator();
-        while (keyIt.hasNext()) {
-            String8 mapKey = keyIt.next();
-            jstring key = env->NewStringUTF(mapKey.string());
-            jstring value = env->NewStringUTF(event.get(mapKey).string());
-            env->CallObjectMethod(hashMapObject, hashMapPutId, key, value);
-            env->DeleteLocalRef(value);
-            env->DeleteLocalRef(key);
-        }
-        env->CallStaticVoidMethod(
-                mClass,
-                env->GetStaticMethodID(mClass, "notify",
-                        "(Ljava/lang/Object;IILjava/lang/String;Ljava/util/HashMap;)V"),
-                mObject, uniqueId, type, message, hashMapObject);
-        env->DeleteLocalRef(hashMapObject);
-    } else {
-        env->CallStaticVoidMethod(
-                mClass,
-                env->GetStaticMethodID(mClass, "notify",
-                        "(Ljava/lang/Object;IILjava/lang/String;)V"),
-                mObject, uniqueId, type, message);
-    }
-    env->DeleteLocalRef(message);
+    env->CallStaticVoidMethod(
+            mClass,
+            env->GetStaticMethodID(mClass, "notify", "(Ljava/lang/Object;IILjava/lang/String;)V"),
+            mObject, uniqueId, type, message);
 }
 
 static Mutex sLock;
diff --git a/keystore/java/android/security/AndroidKeyPairGenerator.java b/keystore/java/android/security/AndroidKeyPairGenerator.java
index 390e732..1ab0aeb 100644
--- a/keystore/java/android/security/AndroidKeyPairGenerator.java
+++ b/keystore/java/android/security/AndroidKeyPairGenerator.java
@@ -18,6 +18,7 @@
 
 import com.android.org.bouncycastle.x509.X509V3CertificateGenerator;
 
+import com.android.org.conscrypt.NativeCrypto;
 import com.android.org.conscrypt.OpenSSLEngine;
 
 import java.security.InvalidAlgorithmParameterException;
@@ -33,7 +34,10 @@
 import java.security.cert.CertificateEncodingException;
 import java.security.cert.X509Certificate;
 import java.security.spec.AlgorithmParameterSpec;
+import java.security.spec.DSAParameterSpec;
+import java.security.spec.ECParameterSpec;
 import java.security.spec.InvalidKeySpecException;
+import java.security.spec.RSAKeyGenParameterSpec;
 import java.security.spec.X509EncodedKeySpec;
 
 /**
@@ -87,8 +91,12 @@
 
         Credentials.deleteAllTypesForAlias(mKeyStore, alias);
 
+        final int keyType = KeyStore.getKeyTypeForAlgorithm(mSpec.getKeyType());
+        byte[][] args = getArgsForKeyType(keyType, mSpec.getAlgorithmParameterSpec());
+
         final String privateKeyAlias = Credentials.USER_PRIVATE_KEY + alias;
-        if (!mKeyStore.generate(privateKeyAlias, KeyStore.UID_SELF, mSpec.getFlags())) {
+        if (!mKeyStore.generate(privateKeyAlias, KeyStore.UID_SELF, keyType,
+                mSpec.getKeySize(), mSpec.getFlags(), args)) {
             throw new IllegalStateException("could not generate key in keystore");
         }
 
@@ -104,10 +112,10 @@
 
         final PublicKey pubKey;
         try {
-            final KeyFactory keyFact = KeyFactory.getInstance("RSA");
+            final KeyFactory keyFact = KeyFactory.getInstance(mSpec.getKeyType());
             pubKey = keyFact.generatePublic(new X509EncodedKeySpec(pubKeyBytes));
         } catch (NoSuchAlgorithmException e) {
-            throw new IllegalStateException("Can't instantiate RSA key generator", e);
+            throw new IllegalStateException("Can't instantiate key generator", e);
         } catch (InvalidKeySpecException e) {
             throw new IllegalStateException("keystore returned invalid key encoding", e);
         }
@@ -119,7 +127,7 @@
         certGen.setIssuerDN(mSpec.getSubjectDN());
         certGen.setNotBefore(mSpec.getStartDate());
         certGen.setNotAfter(mSpec.getEndDate());
-        certGen.setSignatureAlgorithm("sha1WithRSA");
+        certGen.setSignatureAlgorithm(getDefaultSignatureAlgorithmForKeyType(mSpec.getKeyType()));
 
         final X509Certificate cert;
         try {
@@ -146,6 +154,37 @@
         return new KeyPair(pubKey, privKey);
     }
 
+    private static String getDefaultSignatureAlgorithmForKeyType(String keyType) {
+        if ("RSA".equalsIgnoreCase(keyType)) {
+            return "sha256WithRSA";
+        } else if ("DSA".equalsIgnoreCase(keyType)) {
+            return "sha1WithDSA";
+        } else if ("EC".equalsIgnoreCase(keyType)) {
+            return "sha256WithECDSA";
+        } else {
+            throw new IllegalArgumentException("Unsupported key type " + keyType);
+        }
+    }
+
+    private static byte[][] getArgsForKeyType(int keyType, AlgorithmParameterSpec spec) {
+        switch (keyType) {
+            case NativeCrypto.EVP_PKEY_RSA:
+                if (spec instanceof RSAKeyGenParameterSpec) {
+                    RSAKeyGenParameterSpec rsaSpec = (RSAKeyGenParameterSpec) spec;
+                    return new byte[][] { rsaSpec.getPublicExponent().toByteArray() };
+                }
+                break;
+            case NativeCrypto.EVP_PKEY_DSA:
+                if (spec instanceof DSAParameterSpec) {
+                    DSAParameterSpec dsaSpec = (DSAParameterSpec) spec;
+                    return new byte[][] { dsaSpec.getG().toByteArray(),
+                            dsaSpec.getP().toByteArray(), dsaSpec.getQ().toByteArray() };
+                }
+                break;
+        }
+        return null;
+    }
+
     @Override
     public void initialize(int keysize, SecureRandom random) {
         throw new IllegalArgumentException("cannot specify keysize with AndroidKeyPairGenerator");
diff --git a/keystore/java/android/security/KeyPairGeneratorSpec.java b/keystore/java/android/security/KeyPairGeneratorSpec.java
index 59f89bc..21d6caa 100644
--- a/keystore/java/android/security/KeyPairGeneratorSpec.java
+++ b/keystore/java/android/security/KeyPairGeneratorSpec.java
@@ -16,13 +16,18 @@
 
 package android.security;
 
+import com.android.org.conscrypt.NativeCrypto;
+
 import android.content.Context;
 import android.text.TextUtils;
 
 import java.math.BigInteger;
+import java.security.NoSuchAlgorithmException;
 import java.security.PrivateKey;
 import java.security.cert.Certificate;
 import java.security.spec.AlgorithmParameterSpec;
+import java.security.spec.DSAParameterSpec;
+import java.security.spec.RSAKeyGenParameterSpec;
 import java.util.Date;
 
 import javax.security.auth.x500.X500Principal;
@@ -50,10 +55,35 @@
  * certificate signed by a real Certificate Authority.
  */
 public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec {
-    private final String mKeystoreAlias;
+    /*
+     * These must be kept in sync with system/security/keystore/defaults.h
+     */
+
+    /* DSA */
+    private static final int DSA_DEFAULT_KEY_SIZE = 1024;
+    private static final int DSA_MIN_KEY_SIZE = 512;
+    private static final int DSA_MAX_KEY_SIZE = 8192;
+
+    /* EC */
+    private static final int EC_DEFAULT_KEY_SIZE = 256;
+    private static final int EC_MIN_KEY_SIZE = 192;
+    private static final int EC_MAX_KEY_SIZE = 521;
+
+    /* RSA */
+    private static final int RSA_DEFAULT_KEY_SIZE = 2048;
+    private static final int RSA_MIN_KEY_SIZE = 512;
+    private static final int RSA_MAX_KEY_SIZE = 8192;
 
     private final Context mContext;
 
+    private final String mKeystoreAlias;
+
+    private final String mKeyType;
+
+    private final int mKeySize;
+
+    private final AlgorithmParameterSpec mSpec;
+
     private final X500Principal mSubjectDN;
 
     private final BigInteger mSerialNumber;
@@ -84,6 +114,9 @@
      * @param context Android context for the activity
      * @param keyStoreAlias name to use for the generated key in the Android
      *            keystore
+     * @param keyType key algorithm to use (RSA, DSA, EC)
+     * @param keySize size of key to generate
+     * @param spec the underlying key type parameters
      * @param subjectDN X.509 v3 Subject Distinguished Name
      * @param serialNumber X509 v3 certificate serial number
      * @param startDate the start of the self-signed certificate validity period
@@ -93,9 +126,9 @@
      *             {@code endDate} is before {@code startDate}.
      * @hide should be built with KeyPairGeneratorSpecBuilder
      */
-    public KeyPairGeneratorSpec(Context context, String keyStoreAlias,
-            X500Principal subjectDN, BigInteger serialNumber, Date startDate, Date endDate,
-            int flags) {
+    public KeyPairGeneratorSpec(Context context, String keyStoreAlias, String keyType, int keySize,
+            AlgorithmParameterSpec spec, X500Principal subjectDN, BigInteger serialNumber,
+            Date startDate, Date endDate, int flags) {
         if (context == null) {
             throw new IllegalArgumentException("context == null");
         } else if (TextUtils.isEmpty(keyStoreAlias)) {
@@ -112,8 +145,18 @@
             throw new IllegalArgumentException("endDate < startDate");
         }
 
+        final int keyTypeInt = KeyStore.getKeyTypeForAlgorithm(keyType);
+        if (keySize == -1) {
+            keySize = getDefaultKeySizeForType(keyTypeInt);
+        }
+        checkCorrectParametersSpec(keyTypeInt, keySize, spec);
+        checkValidKeySize(keyTypeInt, keySize);
+
         mContext = context;
         mKeystoreAlias = keyStoreAlias;
+        mKeyType = keyType;
+        mKeySize = keySize;
+        mSpec = spec;
         mSubjectDN = subjectDN;
         mSerialNumber = serialNumber;
         mStartDate = startDate;
@@ -121,6 +164,64 @@
         mFlags = flags;
     }
 
+    private static int getDefaultKeySizeForType(int keyType) {
+        if (keyType == NativeCrypto.EVP_PKEY_DSA) {
+            return DSA_DEFAULT_KEY_SIZE;
+        } else if (keyType == NativeCrypto.EVP_PKEY_EC) {
+            return EC_DEFAULT_KEY_SIZE;
+        } else if (keyType == NativeCrypto.EVP_PKEY_RSA) {
+            return RSA_DEFAULT_KEY_SIZE;
+        }
+        throw new IllegalArgumentException("Invalid key type " + keyType);
+    }
+
+    private static void checkValidKeySize(int keyType, int keySize) {
+        if (keyType == NativeCrypto.EVP_PKEY_DSA) {
+            if (keySize < DSA_MIN_KEY_SIZE || keySize > DSA_MAX_KEY_SIZE) {
+                throw new IllegalArgumentException("DSA keys must be >= " + DSA_MIN_KEY_SIZE
+                        + " and <= " + DSA_MAX_KEY_SIZE);
+            }
+        } else if (keyType == NativeCrypto.EVP_PKEY_EC) {
+            if (keySize < EC_MIN_KEY_SIZE || keySize > EC_MAX_KEY_SIZE) {
+                throw new IllegalArgumentException("EC keys must be >= " + EC_MIN_KEY_SIZE
+                        + " and <= " + EC_MAX_KEY_SIZE);
+            }
+        } else if (keyType == NativeCrypto.EVP_PKEY_RSA) {
+            if (keySize < RSA_MIN_KEY_SIZE || keySize > RSA_MAX_KEY_SIZE) {
+                throw new IllegalArgumentException("RSA keys must be >= " + RSA_MIN_KEY_SIZE
+                        + " and <= " + RSA_MAX_KEY_SIZE);
+            }
+        } else {
+            throw new IllegalArgumentException("Invalid key type " + keyType);
+        }
+    }
+
+    private static void checkCorrectParametersSpec(int keyType, int keySize,
+            AlgorithmParameterSpec spec) {
+        if (keyType == NativeCrypto.EVP_PKEY_DSA && spec != null) {
+            if (!(spec instanceof DSAParameterSpec)) {
+                throw new IllegalArgumentException("DSA keys must have DSAParameterSpec specified");
+            }
+        } else if (keyType == NativeCrypto.EVP_PKEY_RSA && spec != null) {
+            if (spec instanceof RSAKeyGenParameterSpec) {
+                RSAKeyGenParameterSpec rsaSpec = (RSAKeyGenParameterSpec) spec;
+                if (keySize != -1 && keySize != rsaSpec.getKeysize()) {
+                    throw new IllegalArgumentException("RSA key size must match: " + keySize
+                            + " vs " + rsaSpec.getKeysize());
+                }
+            } else {
+                throw new IllegalArgumentException("RSA may only use RSAKeyGenParameterSpec");
+            }
+        }
+    }
+
+    /**
+     * Gets the Android context used for operations with this instance.
+     */
+    public Context getContext() {
+        return mContext;
+    }
+
     /**
      * Returns the alias that will be used in the {@code java.security.KeyStore}
      * in conjunction with the {@code AndroidKeyStore}.
@@ -130,10 +231,28 @@
     }
 
     /**
-     * Gets the Android context used for operations with this instance.
+     * Returns the key type (e.g., "RSA", "DSA", "EC") specified by this
+     * parameter.
      */
-    public Context getContext() {
-        return mContext;
+    public String getKeyType() {
+        return mKeyType;
+    }
+
+    /**
+     * Returns the key size specified by this parameter. For instance, for RSA
+     * this will return the modulus size and for EC it will return the field
+     * size.
+     */
+    public int getKeySize() {
+        return mKeySize;
+    }
+
+    /**
+     * Returns the {@link AlgorithmParameterSpec} that will be used for creation
+     * of the key pair.
+     */
+    public AlgorithmParameterSpec getAlgorithmParameterSpec() {
+        return mSpec;
     }
 
     /**
@@ -209,6 +328,12 @@
 
         private String mKeystoreAlias;
 
+        private String mKeyType = "RSA";
+
+        private int mKeySize = -1;
+
+        private AlgorithmParameterSpec mSpec;
+
         private X500Principal mSubjectDN;
 
         private BigInteger mSerialNumber;
@@ -246,6 +371,49 @@
         }
 
         /**
+         * Sets the key type (e.g., RSA, DSA, EC) of the keypair to be created.
+         */
+        public Builder setKeyType(String keyType) throws NoSuchAlgorithmException {
+            if (keyType == null) {
+                throw new NullPointerException("keyType == null");
+            } else {
+                try {
+                    KeyStore.getKeyTypeForAlgorithm(keyType);
+                } catch (IllegalArgumentException e) {
+                    throw new NoSuchAlgorithmException("Unsupported key type: " + keyType);
+                }
+            }
+            mKeyType = keyType;
+            return this;
+        }
+
+        /**
+         * Sets the key size for the keypair to be created. For instance, for a
+         * key type of RSA this will set the modulus size and for a key type of
+         * EC it will select a curve with a matching field size.
+         */
+        public Builder setKeySize(int keySize) {
+            if (keySize < 0) {
+                throw new IllegalArgumentException("keySize < 0");
+            }
+            mKeySize = keySize;
+            return this;
+        }
+
+        /**
+         * Sets the underlying key type's parameters. This is required for DSA
+         * where you must set this to an instance of
+         * {@link java.security.spec.DSAParameterSpec}.
+         */
+        public Builder setAlgorithmParameterSpec(AlgorithmParameterSpec spec) {
+            if (spec == null) {
+                throw new NullPointerException("spec == null");
+            }
+            mSpec = spec;
+            return this;
+        }
+
+        /**
          * Sets the subject used for the self-signed certificate of the
          * generated key pair.
          */
@@ -311,8 +479,8 @@
          * @return built instance of {@code KeyPairGeneratorSpec}
          */
         public KeyPairGeneratorSpec build() {
-            return new KeyPairGeneratorSpec(mContext, mKeystoreAlias, mSubjectDN,
-                    mSerialNumber, mStartDate, mEndDate, mFlags);
+            return new KeyPairGeneratorSpec(mContext, mKeystoreAlias, mKeyType, mKeySize, mSpec,
+                    mSubjectDN, mSerialNumber, mStartDate, mEndDate, mFlags);
         }
     }
 }
diff --git a/keystore/java/android/security/KeyStore.java b/keystore/java/android/security/KeyStore.java
index fb5e039..9babb94 100644
--- a/keystore/java/android/security/KeyStore.java
+++ b/keystore/java/android/security/KeyStore.java
@@ -16,6 +16,8 @@
 
 package android.security;
 
+import com.android.org.conscrypt.NativeCrypto;
+
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.util.Log;
@@ -64,6 +66,18 @@
         return new KeyStore(keystore);
     }
 
+    static int getKeyTypeForAlgorithm(String keyType) throws IllegalArgumentException {
+        if ("RSA".equalsIgnoreCase(keyType)) {
+            return NativeCrypto.EVP_PKEY_RSA;
+        } else if ("DSA".equalsIgnoreCase(keyType)) {
+            return NativeCrypto.EVP_PKEY_DSA;
+        } else if ("EC".equalsIgnoreCase(keyType)) {
+            return NativeCrypto.EVP_PKEY_EC;
+        } else {
+            throw new IllegalArgumentException("Unsupported key type: " + keyType);
+        }
+    }
+
     public State state() {
         final int ret;
         try {
@@ -188,9 +202,10 @@
         }
     }
 
-    public boolean generate(String key, int uid, int flags) {
+    public boolean generate(String key, int uid, int keyType, int keySize, int flags,
+            byte[][] args) {
         try {
-            return mBinder.generate(key, uid, flags) == NO_ERROR;
+            return mBinder.generate(key, uid, keyType, keySize, flags, args) == NO_ERROR;
         } catch (RemoteException e) {
             Log.w(TAG, "Cannot connect to keystore", e);
             return false;
diff --git a/keystore/tests/src/android/security/AndroidKeyPairGeneratorTest.java b/keystore/tests/src/android/security/AndroidKeyPairGeneratorTest.java
index 1582f74..ea6c43d 100644
--- a/keystore/tests/src/android/security/AndroidKeyPairGeneratorTest.java
+++ b/keystore/tests/src/android/security/AndroidKeyPairGeneratorTest.java
@@ -27,6 +27,13 @@
 import java.security.cert.Certificate;
 import java.security.cert.CertificateFactory;
 import java.security.cert.X509Certificate;
+import java.security.interfaces.DSAParams;
+import java.security.interfaces.DSAPublicKey;
+import java.security.interfaces.ECPublicKey;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.AlgorithmParameterSpec;
+import java.security.spec.DSAParameterSpec;
+import java.security.spec.RSAKeyGenParameterSpec;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 
@@ -118,6 +125,8 @@
         mGenerator.initialize(
                 new KeyPairGeneratorSpec.Builder(getContext())
                         .setAlias(TEST_ALIAS_1)
+                        .setKeyType("RSA")
+                        .setKeySize(1024)
                         .setSubject(TEST_DN_1)
                         .setSerialNumber(TEST_SERIAL_1)
                         .setStartDate(NOW)
@@ -142,10 +151,207 @@
         final KeyPair pair = mGenerator.generateKeyPair();
         assertNotNull("The KeyPair returned should not be null", pair);
 
-        assertKeyPairCorrect(pair, TEST_ALIAS_1, TEST_DN_1, TEST_SERIAL_1, NOW, NOW_PLUS_10_YEARS);
+        assertKeyPairCorrect(pair, TEST_ALIAS_1, "RSA", 2048, null, TEST_DN_1, TEST_SERIAL_1, NOW,
+                NOW_PLUS_10_YEARS);
     }
 
-    public void testKeyPairGenerator_GenerateKeyPair_Unencrypted_Success() throws Exception {
+    public void testKeyPairGenerator_GenerateKeyPair_DSA_Unencrypted_Success() throws Exception {
+        mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
+                .setAlias(TEST_ALIAS_1)
+                .setKeyType("DSA")
+                .setSubject(TEST_DN_1)
+                .setSerialNumber(TEST_SERIAL_1)
+                .setStartDate(NOW)
+                .setEndDate(NOW_PLUS_10_YEARS)
+                .build());
+
+        final KeyPair pair = mGenerator.generateKeyPair();
+        assertNotNull("The KeyPair returned should not be null", pair);
+
+        assertKeyPairCorrect(pair, TEST_ALIAS_1, "DSA", 1024, null, TEST_DN_1, TEST_SERIAL_1, NOW,
+                NOW_PLUS_10_YEARS);
+    }
+
+    public void testKeyPairGenerator_GenerateKeyPair_DSA_2048_Unencrypted_Success()
+            throws Exception {
+        mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
+                .setAlias(TEST_ALIAS_1)
+                .setKeyType("DSA")
+                .setKeySize(2048)
+                .setSubject(TEST_DN_1)
+                .setSerialNumber(TEST_SERIAL_1)
+                .setStartDate(NOW)
+                .setEndDate(NOW_PLUS_10_YEARS)
+                .build());
+
+        final KeyPair pair = mGenerator.generateKeyPair();
+        assertNotNull("The KeyPair returned should not be null", pair);
+
+        assertKeyPairCorrect(pair, TEST_ALIAS_1, "DSA", 2048, null, TEST_DN_1, TEST_SERIAL_1, NOW,
+                NOW_PLUS_10_YEARS);
+    }
+
+    public void testKeyPairGenerator_GenerateKeyPair_DSA_SpecifiedParams_Unencrypted_Success()
+            throws Exception {
+        /*
+         * generated using: openssl dsaparam -C 2048
+         */
+        BigInteger p = new BigInteger(1, new byte[] {
+                (byte) 0xC0, (byte) 0x3D, (byte) 0x86, (byte) 0x09, (byte) 0xCA, (byte) 0x8C,
+                (byte) 0x37, (byte) 0xCA, (byte) 0xCC, (byte) 0x4A, (byte) 0x81, (byte) 0xBD,
+                (byte) 0xD8, (byte) 0x50, (byte) 0x77, (byte) 0xCD, (byte) 0xDD, (byte) 0x32,
+                (byte) 0x0B, (byte) 0x43, (byte) 0xBF, (byte) 0x42, (byte) 0x06, (byte) 0x5A,
+                (byte) 0x3D, (byte) 0x18, (byte) 0x50, (byte) 0x47, (byte) 0x79, (byte) 0xE1,
+                (byte) 0x5B, (byte) 0x86, (byte) 0x03, (byte) 0xB9, (byte) 0x28, (byte) 0x9C,
+                (byte) 0x18, (byte) 0xA9, (byte) 0xF5, (byte) 0xD6, (byte) 0xF4, (byte) 0x94,
+                (byte) 0x5B, (byte) 0x87, (byte) 0x58, (byte) 0xCA, (byte) 0xB2, (byte) 0x1E,
+                (byte) 0xFC, (byte) 0xED, (byte) 0x37, (byte) 0xC3, (byte) 0x49, (byte) 0xAC,
+                (byte) 0xFA, (byte) 0x46, (byte) 0xDB, (byte) 0x7A, (byte) 0x50, (byte) 0x96,
+                (byte) 0xCF, (byte) 0x52, (byte) 0xD7, (byte) 0x4E, (byte) 0xEB, (byte) 0x26,
+                (byte) 0x41, (byte) 0xA2, (byte) 0x6F, (byte) 0x99, (byte) 0x80, (byte) 0x9F,
+                (byte) 0x0F, (byte) 0x0A, (byte) 0xA8, (byte) 0x0D, (byte) 0xAC, (byte) 0xAB,
+                (byte) 0xEF, (byte) 0x7D, (byte) 0xE7, (byte) 0x4C, (byte) 0xF1, (byte) 0x88,
+                (byte) 0x44, (byte) 0xC9, (byte) 0x17, (byte) 0xD0, (byte) 0xBB, (byte) 0xE2,
+                (byte) 0x01, (byte) 0x8C, (byte) 0xC1, (byte) 0x02, (byte) 0x1D, (byte) 0x3C,
+                (byte) 0x15, (byte) 0xB7, (byte) 0x41, (byte) 0x30, (byte) 0xD8, (byte) 0x11,
+                (byte) 0xBD, (byte) 0x6A, (byte) 0x2A, (byte) 0x0D, (byte) 0x36, (byte) 0x44,
+                (byte) 0x9C, (byte) 0x3F, (byte) 0x32, (byte) 0xE2, (byte) 0x1C, (byte) 0xFB,
+                (byte) 0xE3, (byte) 0xFF, (byte) 0xCC, (byte) 0x1A, (byte) 0x72, (byte) 0x38,
+                (byte) 0x37, (byte) 0x69, (byte) 0x5E, (byte) 0x35, (byte) 0x73, (byte) 0xE1,
+                (byte) 0x1E, (byte) 0x74, (byte) 0x35, (byte) 0x44, (byte) 0x07, (byte) 0xB5,
+                (byte) 0x2F, (byte) 0x0B, (byte) 0x60, (byte) 0xF4, (byte) 0xA9, (byte) 0xE0,
+                (byte) 0x81, (byte) 0xB2, (byte) 0xCD, (byte) 0x8B, (byte) 0x82, (byte) 0x76,
+                (byte) 0x7F, (byte) 0xD4, (byte) 0x17, (byte) 0x32, (byte) 0x86, (byte) 0x98,
+                (byte) 0x7C, (byte) 0x85, (byte) 0x66, (byte) 0xF6, (byte) 0x77, (byte) 0xED,
+                (byte) 0x8B, (byte) 0x1A, (byte) 0x52, (byte) 0x16, (byte) 0xDA, (byte) 0x1C,
+                (byte) 0xA7, (byte) 0x16, (byte) 0x79, (byte) 0x20, (byte) 0x1C, (byte) 0x99,
+                (byte) 0x5F, (byte) 0x12, (byte) 0x66, (byte) 0x15, (byte) 0x9F, (byte) 0xE5,
+                (byte) 0x73, (byte) 0xA9, (byte) 0x61, (byte) 0xBA, (byte) 0xA7, (byte) 0x23,
+                (byte) 0x93, (byte) 0x77, (byte) 0xB5, (byte) 0xF6, (byte) 0xEC, (byte) 0x13,
+                (byte) 0xBF, (byte) 0x95, (byte) 0x60, (byte) 0x78, (byte) 0x84, (byte) 0xE3,
+                (byte) 0x44, (byte) 0xEC, (byte) 0x74, (byte) 0xC2, (byte) 0xCB, (byte) 0xD4,
+                (byte) 0x70, (byte) 0xC5, (byte) 0x7B, (byte) 0xF8, (byte) 0x07, (byte) 0x3B,
+                (byte) 0xEB, (byte) 0x9F, (byte) 0xC9, (byte) 0x7D, (byte) 0xE0, (byte) 0xA5,
+                (byte) 0xBA, (byte) 0x68, (byte) 0x7B, (byte) 0xF4, (byte) 0x70, (byte) 0x40,
+                (byte) 0xAE, (byte) 0xE9, (byte) 0x65, (byte) 0xEE, (byte) 0x5B, (byte) 0x71,
+                (byte) 0x36, (byte) 0x0B, (byte) 0xB0, (byte) 0xA2, (byte) 0x98, (byte) 0x7D,
+                (byte) 0xE3, (byte) 0x24, (byte) 0x95, (byte) 0x2B, (byte) 0xC2, (byte) 0x0A,
+                (byte) 0x78, (byte) 0x3D, (byte) 0xCC, (byte) 0x3A, (byte) 0xEE, (byte) 0xED,
+                (byte) 0x48, (byte) 0xEB, (byte) 0xA3, (byte) 0x78, (byte) 0xA8, (byte) 0x9D,
+                (byte) 0x0A, (byte) 0x8F, (byte) 0x9E, (byte) 0x59, (byte) 0x2C, (byte) 0x44,
+                (byte) 0xB5, (byte) 0xF9, (byte) 0x53, (byte) 0x43,
+        });
+
+        BigInteger q = new BigInteger(1, new byte[] {
+                (byte) 0xA1, (byte) 0x9B, (byte) 0x1D, (byte) 0xC0, (byte) 0xE3, (byte) 0xF6,
+                (byte) 0x4A, (byte) 0x35, (byte) 0xE1, (byte) 0x8A, (byte) 0x43, (byte) 0xC2,
+                (byte) 0x9C, (byte) 0xF9, (byte) 0x52, (byte) 0x8F, (byte) 0x94, (byte) 0xA1,
+                (byte) 0x12, (byte) 0x11, (byte) 0xDB, (byte) 0x9A, (byte) 0xB6, (byte) 0x35,
+                (byte) 0x56, (byte) 0x26, (byte) 0x60, (byte) 0x89, (byte) 0x11, (byte) 0xAC,
+                (byte) 0xA8, (byte) 0xE5,
+        });
+
+        BigInteger g = new BigInteger(1, new byte[] {
+                (byte) 0xA1, (byte) 0x5C, (byte) 0x57, (byte) 0x15, (byte) 0xC3, (byte) 0xD9,
+                (byte) 0xD7, (byte) 0x41, (byte) 0x89, (byte) 0xD6, (byte) 0xB8, (byte) 0x7B,
+                (byte) 0xF3, (byte) 0xE0, (byte) 0xB3, (byte) 0xC5, (byte) 0xD1, (byte) 0xAA,
+                (byte) 0xF9, (byte) 0x55, (byte) 0x48, (byte) 0xF1, (byte) 0xDA, (byte) 0xE8,
+                (byte) 0x6F, (byte) 0x51, (byte) 0x05, (byte) 0xB2, (byte) 0xC9, (byte) 0x64,
+                (byte) 0xDA, (byte) 0x5F, (byte) 0xD4, (byte) 0xAA, (byte) 0xFD, (byte) 0x67,
+                (byte) 0xE0, (byte) 0x10, (byte) 0x2C, (byte) 0x1F, (byte) 0x03, (byte) 0x10,
+                (byte) 0xD4, (byte) 0x4B, (byte) 0x20, (byte) 0x82, (byte) 0x2B, (byte) 0x04,
+                (byte) 0xF9, (byte) 0x09, (byte) 0xAE, (byte) 0x28, (byte) 0x3D, (byte) 0x9B,
+                (byte) 0xFF, (byte) 0x87, (byte) 0x76, (byte) 0xCD, (byte) 0xF0, (byte) 0x11,
+                (byte) 0xB7, (byte) 0xEA, (byte) 0xE6, (byte) 0xCD, (byte) 0x60, (byte) 0xD3,
+                (byte) 0x8C, (byte) 0x74, (byte) 0xD3, (byte) 0x45, (byte) 0x63, (byte) 0x69,
+                (byte) 0x3F, (byte) 0x1D, (byte) 0x31, (byte) 0x25, (byte) 0x49, (byte) 0x97,
+                (byte) 0x4B, (byte) 0x73, (byte) 0x34, (byte) 0x12, (byte) 0x73, (byte) 0x27,
+                (byte) 0x4C, (byte) 0xDA, (byte) 0xF3, (byte) 0x08, (byte) 0xA8, (byte) 0xA9,
+                (byte) 0x27, (byte) 0xE4, (byte) 0xB8, (byte) 0xD6, (byte) 0xB5, (byte) 0xC4,
+                (byte) 0x18, (byte) 0xED, (byte) 0xBD, (byte) 0x6F, (byte) 0xA2, (byte) 0x36,
+                (byte) 0xA2, (byte) 0x9C, (byte) 0x27, (byte) 0x62, (byte) 0x7F, (byte) 0x93,
+                (byte) 0xD7, (byte) 0x52, (byte) 0xA9, (byte) 0x76, (byte) 0x55, (byte) 0x99,
+                (byte) 0x00, (byte) 0x5B, (byte) 0xC2, (byte) 0xB9, (byte) 0x18, (byte) 0xAC,
+                (byte) 0x6B, (byte) 0x83, (byte) 0x0D, (byte) 0xA1, (byte) 0xC5, (byte) 0x01,
+                (byte) 0x1A, (byte) 0xE5, (byte) 0x4D, (byte) 0x2F, (byte) 0xCF, (byte) 0x5D,
+                (byte) 0xB2, (byte) 0xE7, (byte) 0xC7, (byte) 0xCB, (byte) 0x2C, (byte) 0xFF,
+                (byte) 0x51, (byte) 0x1B, (byte) 0x9D, (byte) 0xA4, (byte) 0x05, (byte) 0xEB,
+                (byte) 0x17, (byte) 0xD8, (byte) 0x97, (byte) 0x9D, (byte) 0x0C, (byte) 0x59,
+                (byte) 0x92, (byte) 0x8A, (byte) 0x03, (byte) 0x34, (byte) 0xFD, (byte) 0x16,
+                (byte) 0x0F, (byte) 0x2A, (byte) 0xF9, (byte) 0x7D, (byte) 0xC3, (byte) 0x41,
+                (byte) 0x0D, (byte) 0x06, (byte) 0x5A, (byte) 0x4B, (byte) 0x34, (byte) 0xD5,
+                (byte) 0xF5, (byte) 0x09, (byte) 0x1C, (byte) 0xCE, (byte) 0xA7, (byte) 0x19,
+                (byte) 0x6D, (byte) 0x04, (byte) 0x53, (byte) 0x71, (byte) 0xCC, (byte) 0x84,
+                (byte) 0xA0, (byte) 0xB2, (byte) 0xA0, (byte) 0x68, (byte) 0xA3, (byte) 0x40,
+                (byte) 0xC0, (byte) 0x67, (byte) 0x38, (byte) 0x96, (byte) 0x73, (byte) 0x2E,
+                (byte) 0x8E, (byte) 0x2A, (byte) 0x9D, (byte) 0x56, (byte) 0xE9, (byte) 0xAC,
+                (byte) 0xC7, (byte) 0xEC, (byte) 0x84, (byte) 0x7F, (byte) 0xFC, (byte) 0xE0,
+                (byte) 0x69, (byte) 0x03, (byte) 0x8B, (byte) 0x48, (byte) 0x64, (byte) 0x76,
+                (byte) 0x85, (byte) 0xA5, (byte) 0x10, (byte) 0xD9, (byte) 0x31, (byte) 0xC3,
+                (byte) 0x8B, (byte) 0x07, (byte) 0x48, (byte) 0x62, (byte) 0xF6, (byte) 0x68,
+                (byte) 0xF2, (byte) 0x96, (byte) 0xB2, (byte) 0x18, (byte) 0x5B, (byte) 0xFF,
+                (byte) 0x6D, (byte) 0xD1, (byte) 0x6B, (byte) 0xF5, (byte) 0xFD, (byte) 0x81,
+                (byte) 0xF1, (byte) 0xFD, (byte) 0x04, (byte) 0xF0, (byte) 0x9F, (byte) 0xB7,
+                (byte) 0x08, (byte) 0x95, (byte) 0x57, (byte) 0x48, (byte) 0x07, (byte) 0x00,
+                (byte) 0x52, (byte) 0xEC, (byte) 0x75, (byte) 0x91, (byte) 0x02, (byte) 0x11,
+                (byte) 0xA3, (byte) 0x64, (byte) 0x26, (byte) 0xCA,
+        });
+
+        AlgorithmParameterSpec spec = new DSAParameterSpec(p, q, g);
+        mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
+                .setAlias(TEST_ALIAS_1)
+                .setKeyType("DSA")
+                .setKeySize(2048)
+                .setAlgorithmParameterSpec(spec)
+                .setSubject(TEST_DN_1)
+                .setSerialNumber(TEST_SERIAL_1)
+                .setStartDate(NOW)
+                .setEndDate(NOW_PLUS_10_YEARS)
+                .build());
+
+        final KeyPair pair = mGenerator.generateKeyPair();
+        assertNotNull("The KeyPair returned should not be null", pair);
+
+        assertKeyPairCorrect(pair, TEST_ALIAS_1, "DSA", 2048, spec, TEST_DN_1, TEST_SERIAL_1, NOW,
+                NOW_PLUS_10_YEARS);
+    }
+
+    public void testKeyPairGenerator_GenerateKeyPair_EC_Unencrypted_Success() throws Exception {
+        mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
+                .setAlias(TEST_ALIAS_1)
+                .setKeyType("EC")
+                .setSubject(TEST_DN_1)
+                .setSerialNumber(TEST_SERIAL_1)
+                .setStartDate(NOW)
+                .setEndDate(NOW_PLUS_10_YEARS)
+                .build());
+
+        final KeyPair pair = mGenerator.generateKeyPair();
+        assertNotNull("The KeyPair returned should not be null", pair);
+
+        assertKeyPairCorrect(pair, TEST_ALIAS_1, "EC", 256, null, TEST_DN_1, TEST_SERIAL_1, NOW,
+                NOW_PLUS_10_YEARS);
+    }
+
+    public void testKeyPairGenerator_GenerateKeyPair_EC_P521_Unencrypted_Success() throws Exception {
+        mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
+                .setAlias(TEST_ALIAS_1)
+                .setKeyType("EC")
+                .setKeySize(521)
+                .setSubject(TEST_DN_1)
+                .setSerialNumber(TEST_SERIAL_1)
+                .setStartDate(NOW)
+                .setEndDate(NOW_PLUS_10_YEARS)
+                .build());
+
+        final KeyPair pair = mGenerator.generateKeyPair();
+        assertNotNull("The KeyPair returned should not be null", pair);
+
+        assertKeyPairCorrect(pair, TEST_ALIAS_1, "EC", 521, null, TEST_DN_1, TEST_SERIAL_1, NOW,
+                NOW_PLUS_10_YEARS);
+    }
+
+    public void testKeyPairGenerator_GenerateKeyPair_RSA_Unencrypted_Success() throws Exception {
         mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
                 .setAlias(TEST_ALIAS_1)
                 .setSubject(TEST_DN_1)
@@ -157,7 +363,28 @@
         final KeyPair pair = mGenerator.generateKeyPair();
         assertNotNull("The KeyPair returned should not be null", pair);
 
-        assertKeyPairCorrect(pair, TEST_ALIAS_1, TEST_DN_1, TEST_SERIAL_1, NOW, NOW_PLUS_10_YEARS);
+        assertKeyPairCorrect(pair, TEST_ALIAS_1, "RSA", 2048, null, TEST_DN_1, TEST_SERIAL_1, NOW,
+                NOW_PLUS_10_YEARS);
+    }
+
+    public void testKeyPairGenerator_GenerateKeyPair_RSA_WithParams_Unencrypted_Success()
+            throws Exception {
+        AlgorithmParameterSpec spec = new RSAKeyGenParameterSpec(1024, BigInteger.valueOf(3L));
+        mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
+                .setAlias(TEST_ALIAS_1)
+                .setKeySize(1024)
+                .setAlgorithmParameterSpec(spec)
+                .setSubject(TEST_DN_1)
+                .setSerialNumber(TEST_SERIAL_1)
+                .setStartDate(NOW)
+                .setEndDate(NOW_PLUS_10_YEARS)
+                .build());
+
+        final KeyPair pair = mGenerator.generateKeyPair();
+        assertNotNull("The KeyPair returned should not be null", pair);
+
+        assertKeyPairCorrect(pair, TEST_ALIAS_1, "RSA", 1024, spec, TEST_DN_1, TEST_SERIAL_1, NOW,
+                NOW_PLUS_10_YEARS);
     }
 
     public void testKeyPairGenerator_GenerateKeyPair_Replaced_Success() throws Exception {
@@ -172,8 +399,8 @@
                     .build());
             final KeyPair pair1 = mGenerator.generateKeyPair();
             assertNotNull("The KeyPair returned should not be null", pair1);
-            assertKeyPairCorrect(pair1, TEST_ALIAS_1, TEST_DN_1, TEST_SERIAL_1, NOW,
-                    NOW_PLUS_10_YEARS);
+            assertKeyPairCorrect(pair1, TEST_ALIAS_1, "RSA", 2048, null, TEST_DN_1, TEST_SERIAL_1,
+                    NOW, NOW_PLUS_10_YEARS);
         }
 
         // Replace the original key
@@ -187,8 +414,8 @@
                     .build());
             final KeyPair pair2 = mGenerator.generateKeyPair();
             assertNotNull("The KeyPair returned should not be null", pair2);
-            assertKeyPairCorrect(pair2, TEST_ALIAS_2, TEST_DN_2, TEST_SERIAL_2, NOW,
-                    NOW_PLUS_10_YEARS);
+            assertKeyPairCorrect(pair2, TEST_ALIAS_2, "RSA", 2048, null, TEST_DN_2, TEST_SERIAL_2,
+                    NOW, NOW_PLUS_10_YEARS);
         }
     }
 
@@ -205,8 +432,8 @@
                     .build());
             final KeyPair pair1 = mGenerator.generateKeyPair();
             assertNotNull("The KeyPair returned should not be null", pair1);
-            assertKeyPairCorrect(pair1, TEST_ALIAS_1, TEST_DN_1, TEST_SERIAL_1, NOW,
-                    NOW_PLUS_10_YEARS);
+            assertKeyPairCorrect(pair1, TEST_ALIAS_1, "RSA", 2048, null, TEST_DN_1, TEST_SERIAL_1,
+                    NOW, NOW_PLUS_10_YEARS);
         }
 
         // Attempt to replace previous key
@@ -230,18 +457,45 @@
 
             final KeyPair pair2 = mGenerator.generateKeyPair();
             assertNotNull("The KeyPair returned should not be null", pair2);
-            assertKeyPairCorrect(pair2, TEST_ALIAS_1, TEST_DN_2, TEST_SERIAL_2, NOW,
-                    NOW_PLUS_10_YEARS);
+            assertKeyPairCorrect(pair2, TEST_ALIAS_1, "RSA", 2048, null, TEST_DN_2, TEST_SERIAL_2,
+                    NOW, NOW_PLUS_10_YEARS);
         }
     }
 
-    private void assertKeyPairCorrect(KeyPair pair, String alias, X500Principal dn,
-            BigInteger serial, Date start, Date end) throws Exception {
+    private void assertKeyPairCorrect(KeyPair pair, String alias, String keyType, int keySize,
+            AlgorithmParameterSpec spec, X500Principal dn, BigInteger serial, Date start, Date end)
+            throws Exception {
         final PublicKey pubKey = pair.getPublic();
         assertNotNull("The PublicKey for the KeyPair should be not null", pubKey);
+        assertEquals(keyType, pubKey.getAlgorithm());
+
+        if ("DSA".equalsIgnoreCase(keyType)) {
+            DSAPublicKey dsaPubKey = (DSAPublicKey) pubKey;
+            DSAParams actualParams = dsaPubKey.getParams();
+            assertEquals(keySize, (actualParams.getP().bitLength() + 7) & ~7);
+            if (spec != null) {
+                DSAParameterSpec expectedParams = (DSAParameterSpec) spec;
+                assertEquals(expectedParams.getP(), actualParams.getP());
+                assertEquals(expectedParams.getQ(), actualParams.getQ());
+                assertEquals(expectedParams.getG(), actualParams.getG());
+            }
+        } else if ("EC".equalsIgnoreCase(keyType)) {
+            assertEquals("Curve should be what was specified during initialization", keySize,
+                    ((ECPublicKey) pubKey).getParams().getCurve().getField().getFieldSize());
+        } else if ("RSA".equalsIgnoreCase(keyType)) {
+            RSAPublicKey rsaPubKey = (RSAPublicKey) pubKey;
+            assertEquals("Modulus size should be what is specified during initialization",
+                    (keySize + 7) & ~7, (rsaPubKey.getModulus().bitLength() + 7) & ~7);
+            if (spec != null) {
+                RSAKeyGenParameterSpec params = (RSAKeyGenParameterSpec) spec;
+                assertEquals((keySize + 7) & ~7, (params.getKeysize() + 7) & ~7);
+                assertEquals(params.getPublicExponent(), rsaPubKey.getPublicExponent());
+            }
+        }
 
         final PrivateKey privKey = pair.getPrivate();
         assertNotNull("The PrivateKey for the KeyPair should be not null", privKey);
+        assertEquals(keyType, privKey.getAlgorithm());
 
         final byte[] userCertBytes = mAndroidKeyStore.get(Credentials.USER_CERTIFICATE + alias);
         assertNotNull("The user certificate should exist for the generated entry", userCertBytes);
diff --git a/keystore/tests/src/android/security/AndroidKeyStoreTest.java b/keystore/tests/src/android/security/AndroidKeyStoreTest.java
index b7129db..6597d3f 100644
--- a/keystore/tests/src/android/security/AndroidKeyStoreTest.java
+++ b/keystore/tests/src/android/security/AndroidKeyStoreTest.java
@@ -18,7 +18,9 @@
 
 import com.android.org.bouncycastle.x509.X509V3CertificateGenerator;
 
+import com.android.org.conscrypt.NativeCrypto;
 import com.android.org.conscrypt.OpenSSLEngine;
+import com.android.org.conscrypt.OpenSSLKeyHolder;
 
 import android.test.AndroidTestCase;
 
@@ -39,6 +41,10 @@
 import java.security.cert.Certificate;
 import java.security.cert.CertificateFactory;
 import java.security.cert.X509Certificate;
+import java.security.interfaces.DSAPrivateKey;
+import java.security.interfaces.DSAPublicKey;
+import java.security.interfaces.ECPrivateKey;
+import java.security.interfaces.ECPublicKey;
 import java.security.interfaces.RSAPrivateKey;
 import java.security.spec.InvalidKeySpecException;
 import java.security.spec.PKCS8EncodedKeySpec;
@@ -99,7 +105,7 @@
      *
      * openssl x509 -outform d -in cacert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
      */
-    private static final byte[] FAKE_CA_1 = {
+    private static final byte[] FAKE_RSA_CA_1 = {
             (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0xce, (byte) 0x30, (byte) 0x82,
             (byte) 0x02, (byte) 0x37, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
             (byte) 0x02, (byte) 0x02, (byte) 0x09, (byte) 0x00, (byte) 0xe1, (byte) 0x6a,
@@ -228,7 +234,7 @@
      *
      * openssl pkcs8 -topk8 -outform d -in userkey.pem -nocrypt | xxd -i | sed 's/0x/(byte) 0x/g'
      */
-    private static final byte[] FAKE_KEY_1 = new byte[] {
+    private static final byte[] FAKE_RSA_KEY_1 = new byte[] {
             (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x78, (byte) 0x02, (byte) 0x01,
             (byte) 0x00, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a,
             (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01,
@@ -342,7 +348,7 @@
      *
      * openssl x509 -outform d -in usercert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
      */
-    private static final byte[] FAKE_USER_1 = new byte[] {
+    private static final byte[] FAKE_RSA_USER_1 = new byte[] {
             (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x95, (byte) 0x30, (byte) 0x82,
             (byte) 0x01, (byte) 0xfe, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
             (byte) 0x02, (byte) 0x02, (byte) 0x01, (byte) 0x01, (byte) 0x30, (byte) 0x0d,
@@ -456,6 +462,628 @@
             (byte) 0x08, (byte) 0x41, (byte) 0x0a, (byte) 0xf3, (byte) 0x72
     };
 
+    /*
+     * The keys and certificates below are generated with:
+     *
+     * openssl req -new -x509 -days 3650 -extensions v3_ca -keyout cakey.pem -out cacert.pem
+     * openssl ecparam -name prime256v1 -out ecparam.pem
+     * openssl req -newkey ec:ecparam.pem -keyout userkey.pem -nodes -days 3650 -out userkey.req
+     * mkdir -p demoCA/newcerts
+     * touch demoCA/index.txt
+     * echo "01" > demoCA/serial
+     * openssl ca -out usercert.pem -in userkey.req -cert cacert.pem -keyfile cakey.pem -days 3650
+     */
+
+    /**
+     * Generated from above and converted with:
+     *
+     * openssl x509 -outform d -in cacert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
+     */
+    private static final byte[] FAKE_EC_CA_1 = {
+            (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x58, (byte) 0x30, (byte) 0x82,
+            (byte) 0x01, (byte) 0xc1, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
+            (byte) 0x02, (byte) 0x02, (byte) 0x09, (byte) 0x00, (byte) 0xe1, (byte) 0xb2,
+            (byte) 0x8c, (byte) 0x04, (byte) 0x95, (byte) 0xeb, (byte) 0x10, (byte) 0xcb,
+            (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,
+            (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01,
+            (byte) 0x05, (byte) 0x05, (byte) 0x00, (byte) 0x30, (byte) 0x45, (byte) 0x31,
+            (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55,
+            (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55,
+            (byte) 0x31, (byte) 0x13, (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03,
+            (byte) 0x55, (byte) 0x04, (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53,
+            (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74,
+            (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x31, (byte) 0x21, (byte) 0x30,
+            (byte) 0x1f, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a,
+            (byte) 0x0c, (byte) 0x18, (byte) 0x49, (byte) 0x6e, (byte) 0x74, (byte) 0x65,
+            (byte) 0x72, (byte) 0x6e, (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x57,
+            (byte) 0x69, (byte) 0x64, (byte) 0x67, (byte) 0x69, (byte) 0x74, (byte) 0x73,
+            (byte) 0x20, (byte) 0x50, (byte) 0x74, (byte) 0x79, (byte) 0x20, (byte) 0x4c,
+            (byte) 0x74, (byte) 0x64, (byte) 0x30, (byte) 0x1e, (byte) 0x17, (byte) 0x0d,
+            (byte) 0x31, (byte) 0x33, (byte) 0x30, (byte) 0x38, (byte) 0x32, (byte) 0x37,
+            (byte) 0x31, (byte) 0x36, (byte) 0x32, (byte) 0x38, (byte) 0x32, (byte) 0x38,
+            (byte) 0x5a, (byte) 0x17, (byte) 0x0d, (byte) 0x32, (byte) 0x33, (byte) 0x30,
+            (byte) 0x38, (byte) 0x32, (byte) 0x35, (byte) 0x31, (byte) 0x36, (byte) 0x32,
+            (byte) 0x38, (byte) 0x32, (byte) 0x38, (byte) 0x5a, (byte) 0x30, (byte) 0x45,
+            (byte) 0x31, (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03,
+            (byte) 0x55, (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41,
+            (byte) 0x55, (byte) 0x31, (byte) 0x13, (byte) 0x30, (byte) 0x11, (byte) 0x06,
+            (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x08, (byte) 0x0c, (byte) 0x0a,
+            (byte) 0x53, (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x53,
+            (byte) 0x74, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x31, (byte) 0x21,
+            (byte) 0x30, (byte) 0x1f, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
+            (byte) 0x0a, (byte) 0x0c, (byte) 0x18, (byte) 0x49, (byte) 0x6e, (byte) 0x74,
+            (byte) 0x65, (byte) 0x72, (byte) 0x6e, (byte) 0x65, (byte) 0x74, (byte) 0x20,
+            (byte) 0x57, (byte) 0x69, (byte) 0x64, (byte) 0x67, (byte) 0x69, (byte) 0x74,
+            (byte) 0x73, (byte) 0x20, (byte) 0x50, (byte) 0x74, (byte) 0x79, (byte) 0x20,
+            (byte) 0x4c, (byte) 0x74, (byte) 0x64, (byte) 0x30, (byte) 0x81, (byte) 0x9f,
+            (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,
+            (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01,
+            (byte) 0x01, (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x81, (byte) 0x8d,
+            (byte) 0x00, (byte) 0x30, (byte) 0x81, (byte) 0x89, (byte) 0x02, (byte) 0x81,
+            (byte) 0x81, (byte) 0x00, (byte) 0xb5, (byte) 0xf6, (byte) 0x08, (byte) 0x0f,
+            (byte) 0xc4, (byte) 0x4d, (byte) 0xe4, (byte) 0x0d, (byte) 0x34, (byte) 0x1d,
+            (byte) 0xe2, (byte) 0x23, (byte) 0x18, (byte) 0x63, (byte) 0x03, (byte) 0xf7,
+            (byte) 0x14, (byte) 0x0e, (byte) 0x98, (byte) 0xcd, (byte) 0x45, (byte) 0x1f,
+            (byte) 0xfe, (byte) 0xfb, (byte) 0x09, (byte) 0x3f, (byte) 0x5d, (byte) 0x36,
+            (byte) 0x3b, (byte) 0x0f, (byte) 0xf9, (byte) 0x5e, (byte) 0x86, (byte) 0x56,
+            (byte) 0x64, (byte) 0xd7, (byte) 0x3f, (byte) 0xae, (byte) 0x33, (byte) 0x09,
+            (byte) 0xd3, (byte) 0xdd, (byte) 0x06, (byte) 0x17, (byte) 0x26, (byte) 0xdc,
+            (byte) 0xa2, (byte) 0x8c, (byte) 0x3c, (byte) 0x65, (byte) 0xed, (byte) 0x03,
+            (byte) 0x82, (byte) 0x78, (byte) 0x9b, (byte) 0xee, (byte) 0xe3, (byte) 0x98,
+            (byte) 0x58, (byte) 0xe1, (byte) 0xf1, (byte) 0xa0, (byte) 0x85, (byte) 0xae,
+            (byte) 0x63, (byte) 0x84, (byte) 0x41, (byte) 0x46, (byte) 0xa7, (byte) 0x4f,
+            (byte) 0xdc, (byte) 0xbb, (byte) 0x1c, (byte) 0x6e, (byte) 0xec, (byte) 0x7b,
+            (byte) 0xd5, (byte) 0xab, (byte) 0x3d, (byte) 0x6a, (byte) 0x05, (byte) 0x58,
+            (byte) 0x0f, (byte) 0x9b, (byte) 0x6a, (byte) 0x67, (byte) 0x4b, (byte) 0xe9,
+            (byte) 0x2a, (byte) 0x6d, (byte) 0x96, (byte) 0x11, (byte) 0x53, (byte) 0x95,
+            (byte) 0x78, (byte) 0xaa, (byte) 0xd1, (byte) 0x91, (byte) 0x4a, (byte) 0xf8,
+            (byte) 0x54, (byte) 0x52, (byte) 0x6d, (byte) 0xb9, (byte) 0xca, (byte) 0x74,
+            (byte) 0x81, (byte) 0xf8, (byte) 0x99, (byte) 0x64, (byte) 0xd1, (byte) 0x4f,
+            (byte) 0x01, (byte) 0x38, (byte) 0x4f, (byte) 0x08, (byte) 0x5c, (byte) 0x31,
+            (byte) 0xcb, (byte) 0x7c, (byte) 0x5c, (byte) 0x78, (byte) 0x5d, (byte) 0x47,
+            (byte) 0xd9, (byte) 0xf0, (byte) 0x1a, (byte) 0xeb, (byte) 0x02, (byte) 0x03,
+            (byte) 0x01, (byte) 0x00, (byte) 0x01, (byte) 0xa3, (byte) 0x50, (byte) 0x30,
+            (byte) 0x4e, (byte) 0x30, (byte) 0x1d, (byte) 0x06, (byte) 0x03, (byte) 0x55,
+            (byte) 0x1d, (byte) 0x0e, (byte) 0x04, (byte) 0x16, (byte) 0x04, (byte) 0x14,
+            (byte) 0x5f, (byte) 0x5b, (byte) 0x5e, (byte) 0xac, (byte) 0x29, (byte) 0xfa,
+            (byte) 0xa1, (byte) 0x9f, (byte) 0x9e, (byte) 0xad, (byte) 0x46, (byte) 0xe1,
+            (byte) 0xbc, (byte) 0x20, (byte) 0x72, (byte) 0xcf, (byte) 0x4a, (byte) 0xd4,
+            (byte) 0xfa, (byte) 0xe3, (byte) 0x30, (byte) 0x1f, (byte) 0x06, (byte) 0x03,
+            (byte) 0x55, (byte) 0x1d, (byte) 0x23, (byte) 0x04, (byte) 0x18, (byte) 0x30,
+            (byte) 0x16, (byte) 0x80, (byte) 0x14, (byte) 0x5f, (byte) 0x5b, (byte) 0x5e,
+            (byte) 0xac, (byte) 0x29, (byte) 0xfa, (byte) 0xa1, (byte) 0x9f, (byte) 0x9e,
+            (byte) 0xad, (byte) 0x46, (byte) 0xe1, (byte) 0xbc, (byte) 0x20, (byte) 0x72,
+            (byte) 0xcf, (byte) 0x4a, (byte) 0xd4, (byte) 0xfa, (byte) 0xe3, (byte) 0x30,
+            (byte) 0x0c, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x13,
+            (byte) 0x04, (byte) 0x05, (byte) 0x30, (byte) 0x03, (byte) 0x01, (byte) 0x01,
+            (byte) 0xff, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a,
+            (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01,
+            (byte) 0x01, (byte) 0x05, (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x81,
+            (byte) 0x81, (byte) 0x00, (byte) 0xa1, (byte) 0x4a, (byte) 0xe6, (byte) 0xfc,
+            (byte) 0x7f, (byte) 0x17, (byte) 0xaa, (byte) 0x65, (byte) 0x4a, (byte) 0x34,
+            (byte) 0xde, (byte) 0x69, (byte) 0x67, (byte) 0x54, (byte) 0x4d, (byte) 0xa2,
+            (byte) 0xc2, (byte) 0x98, (byte) 0x02, (byte) 0x43, (byte) 0x6a, (byte) 0x0e,
+            (byte) 0x0b, (byte) 0x7f, (byte) 0xa4, (byte) 0x46, (byte) 0xaf, (byte) 0xa4,
+            (byte) 0x65, (byte) 0xa0, (byte) 0xdb, (byte) 0xf1, (byte) 0x5b, (byte) 0xd5,
+            (byte) 0x09, (byte) 0xbc, (byte) 0xee, (byte) 0x37, (byte) 0x51, (byte) 0x19,
+            (byte) 0x36, (byte) 0xc0, (byte) 0x90, (byte) 0xd3, (byte) 0x5f, (byte) 0xf3,
+            (byte) 0x4f, (byte) 0xb9, (byte) 0x08, (byte) 0x45, (byte) 0x0e, (byte) 0x01,
+            (byte) 0x8a, (byte) 0x95, (byte) 0xef, (byte) 0x92, (byte) 0x95, (byte) 0x33,
+            (byte) 0x78, (byte) 0xdd, (byte) 0x90, (byte) 0xbb, (byte) 0xf3, (byte) 0x06,
+            (byte) 0x75, (byte) 0xd0, (byte) 0x66, (byte) 0xe6, (byte) 0xd0, (byte) 0x18,
+            (byte) 0x6e, (byte) 0xeb, (byte) 0x1c, (byte) 0x52, (byte) 0xc3, (byte) 0x2e,
+            (byte) 0x57, (byte) 0x7d, (byte) 0xa9, (byte) 0x03, (byte) 0xdb, (byte) 0xf4,
+            (byte) 0x57, (byte) 0x5f, (byte) 0x6c, (byte) 0x7e, (byte) 0x00, (byte) 0x0d,
+            (byte) 0x8f, (byte) 0xe8, (byte) 0x91, (byte) 0xf7, (byte) 0xae, (byte) 0x24,
+            (byte) 0x35, (byte) 0x07, (byte) 0xb5, (byte) 0x48, (byte) 0x2d, (byte) 0x36,
+            (byte) 0x30, (byte) 0x5d, (byte) 0xe9, (byte) 0x49, (byte) 0x2d, (byte) 0xd1,
+            (byte) 0x5d, (byte) 0xc5, (byte) 0xf4, (byte) 0x33, (byte) 0x77, (byte) 0x3c,
+            (byte) 0x71, (byte) 0xad, (byte) 0x90, (byte) 0x65, (byte) 0xa9, (byte) 0xc1,
+            (byte) 0x0b, (byte) 0x5c, (byte) 0x62, (byte) 0x55, (byte) 0x50, (byte) 0x6f,
+            (byte) 0x9b, (byte) 0xc9, (byte) 0x0d, (byte) 0xee
+    };
+
+    /**
+     * Generated from above and converted with:
+     *
+     * openssl pkcs8 -topk8 -outform d -in userkey.pem -nocrypt | xxd -i | sed 's/0x/(byte) 0x/g'
+     */
+    private static final byte[] FAKE_EC_KEY_1 = new byte[] {
+            (byte) 0x30, (byte) 0x81, (byte) 0x87, (byte) 0x02, (byte) 0x01, (byte) 0x00,
+            (byte) 0x30, (byte) 0x13, (byte) 0x06, (byte) 0x07, (byte) 0x2a, (byte) 0x86,
+            (byte) 0x48, (byte) 0xce, (byte) 0x3d, (byte) 0x02, (byte) 0x01, (byte) 0x06,
+            (byte) 0x08, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0xce, (byte) 0x3d,
+            (byte) 0x03, (byte) 0x01, (byte) 0x07, (byte) 0x04, (byte) 0x6d, (byte) 0x30,
+            (byte) 0x6b, (byte) 0x02, (byte) 0x01, (byte) 0x01, (byte) 0x04, (byte) 0x20,
+            (byte) 0x3a, (byte) 0x8a, (byte) 0x02, (byte) 0xdc, (byte) 0xde, (byte) 0x70,
+            (byte) 0x84, (byte) 0x45, (byte) 0x34, (byte) 0xaf, (byte) 0xbd, (byte) 0xd5,
+            (byte) 0x02, (byte) 0x17, (byte) 0x69, (byte) 0x90, (byte) 0x65, (byte) 0x1e,
+            (byte) 0x87, (byte) 0xf1, (byte) 0x3d, (byte) 0x17, (byte) 0xb6, (byte) 0xf4,
+            (byte) 0x31, (byte) 0x94, (byte) 0x86, (byte) 0x76, (byte) 0x55, (byte) 0xf7,
+            (byte) 0xcc, (byte) 0xba, (byte) 0xa1, (byte) 0x44, (byte) 0x03, (byte) 0x42,
+            (byte) 0x00, (byte) 0x04, (byte) 0xd9, (byte) 0xcf, (byte) 0xe7, (byte) 0x9b,
+            (byte) 0x23, (byte) 0xc8, (byte) 0xa3, (byte) 0xb8, (byte) 0x33, (byte) 0x14,
+            (byte) 0xa4, (byte) 0x4d, (byte) 0x75, (byte) 0x90, (byte) 0xf3, (byte) 0xcd,
+            (byte) 0x43, (byte) 0xe5, (byte) 0x1b, (byte) 0x05, (byte) 0x1d, (byte) 0xf3,
+            (byte) 0xd0, (byte) 0xa3, (byte) 0xb7, (byte) 0x32, (byte) 0x5f, (byte) 0x79,
+            (byte) 0xdc, (byte) 0x88, (byte) 0xb8, (byte) 0x4d, (byte) 0xb3, (byte) 0xd1,
+            (byte) 0x6d, (byte) 0xf7, (byte) 0x75, (byte) 0xf3, (byte) 0xbf, (byte) 0x50,
+            (byte) 0xa1, (byte) 0xbc, (byte) 0x03, (byte) 0x64, (byte) 0x22, (byte) 0xe6,
+            (byte) 0x1a, (byte) 0xa1, (byte) 0xe1, (byte) 0x06, (byte) 0x68, (byte) 0x3b,
+            (byte) 0xbc, (byte) 0x9f, (byte) 0xd3, (byte) 0xae, (byte) 0x77, (byte) 0x5e,
+            (byte) 0x88, (byte) 0x0c, (byte) 0x5e, (byte) 0x0c, (byte) 0xb2, (byte) 0x38
+    };
+
+    /**
+     * Generated from above and converted with:
+     *
+     * openssl x509 -outform d -in usercert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
+     */
+    private static final byte[] FAKE_EC_USER_1 = new byte[] {
+            (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x51, (byte) 0x30, (byte) 0x82,
+            (byte) 0x01, (byte) 0xba, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
+            (byte) 0x02, (byte) 0x02, (byte) 0x01, (byte) 0x01, (byte) 0x30, (byte) 0x0d,
+            (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86,
+            (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x05,
+            (byte) 0x00, (byte) 0x30, (byte) 0x45, (byte) 0x31, (byte) 0x0b, (byte) 0x30,
+            (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06,
+            (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55, (byte) 0x31, (byte) 0x13,
+            (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
+            (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53, (byte) 0x6f, (byte) 0x6d,
+            (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74, (byte) 0x61, (byte) 0x74,
+            (byte) 0x65, (byte) 0x31, (byte) 0x21, (byte) 0x30, (byte) 0x1f, (byte) 0x06,
+            (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a, (byte) 0x0c, (byte) 0x18,
+            (byte) 0x49, (byte) 0x6e, (byte) 0x74, (byte) 0x65, (byte) 0x72, (byte) 0x6e,
+            (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x57, (byte) 0x69, (byte) 0x64,
+            (byte) 0x67, (byte) 0x69, (byte) 0x74, (byte) 0x73, (byte) 0x20, (byte) 0x50,
+            (byte) 0x74, (byte) 0x79, (byte) 0x20, (byte) 0x4c, (byte) 0x74, (byte) 0x64,
+            (byte) 0x30, (byte) 0x1e, (byte) 0x17, (byte) 0x0d, (byte) 0x31, (byte) 0x33,
+            (byte) 0x30, (byte) 0x38, (byte) 0x32, (byte) 0x37, (byte) 0x31, (byte) 0x36,
+            (byte) 0x33, (byte) 0x30, (byte) 0x30, (byte) 0x38, (byte) 0x5a, (byte) 0x17,
+            (byte) 0x0d, (byte) 0x32, (byte) 0x33, (byte) 0x30, (byte) 0x38, (byte) 0x32,
+            (byte) 0x35, (byte) 0x31, (byte) 0x36, (byte) 0x33, (byte) 0x30, (byte) 0x30,
+            (byte) 0x38, (byte) 0x5a, (byte) 0x30, (byte) 0x62, (byte) 0x31, (byte) 0x0b,
+            (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
+            (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55, (byte) 0x31,
+            (byte) 0x13, (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03, (byte) 0x55,
+            (byte) 0x04, (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53, (byte) 0x6f,
+            (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74, (byte) 0x61,
+            (byte) 0x74, (byte) 0x65, (byte) 0x31, (byte) 0x21, (byte) 0x30, (byte) 0x1f,
+            (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a, (byte) 0x0c,
+            (byte) 0x18, (byte) 0x49, (byte) 0x6e, (byte) 0x74, (byte) 0x65, (byte) 0x72,
+            (byte) 0x6e, (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x57, (byte) 0x69,
+            (byte) 0x64, (byte) 0x67, (byte) 0x69, (byte) 0x74, (byte) 0x73, (byte) 0x20,
+            (byte) 0x50, (byte) 0x74, (byte) 0x79, (byte) 0x20, (byte) 0x4c, (byte) 0x74,
+            (byte) 0x64, (byte) 0x31, (byte) 0x1b, (byte) 0x30, (byte) 0x19, (byte) 0x06,
+            (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x03, (byte) 0x0c, (byte) 0x12,
+            (byte) 0x73, (byte) 0x65, (byte) 0x72, (byte) 0x76, (byte) 0x65, (byte) 0x72,
+            (byte) 0x2e, (byte) 0x65, (byte) 0x78, (byte) 0x61, (byte) 0x6d, (byte) 0x70,
+            (byte) 0x6c, (byte) 0x65, (byte) 0x2e, (byte) 0x63, (byte) 0x6f, (byte) 0x6d,
+            (byte) 0x30, (byte) 0x59, (byte) 0x30, (byte) 0x13, (byte) 0x06, (byte) 0x07,
+            (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0xce, (byte) 0x3d, (byte) 0x02,
+            (byte) 0x01, (byte) 0x06, (byte) 0x08, (byte) 0x2a, (byte) 0x86, (byte) 0x48,
+            (byte) 0xce, (byte) 0x3d, (byte) 0x03, (byte) 0x01, (byte) 0x07, (byte) 0x03,
+            (byte) 0x42, (byte) 0x00, (byte) 0x04, (byte) 0xd9, (byte) 0xcf, (byte) 0xe7,
+            (byte) 0x9b, (byte) 0x23, (byte) 0xc8, (byte) 0xa3, (byte) 0xb8, (byte) 0x33,
+            (byte) 0x14, (byte) 0xa4, (byte) 0x4d, (byte) 0x75, (byte) 0x90, (byte) 0xf3,
+            (byte) 0xcd, (byte) 0x43, (byte) 0xe5, (byte) 0x1b, (byte) 0x05, (byte) 0x1d,
+            (byte) 0xf3, (byte) 0xd0, (byte) 0xa3, (byte) 0xb7, (byte) 0x32, (byte) 0x5f,
+            (byte) 0x79, (byte) 0xdc, (byte) 0x88, (byte) 0xb8, (byte) 0x4d, (byte) 0xb3,
+            (byte) 0xd1, (byte) 0x6d, (byte) 0xf7, (byte) 0x75, (byte) 0xf3, (byte) 0xbf,
+            (byte) 0x50, (byte) 0xa1, (byte) 0xbc, (byte) 0x03, (byte) 0x64, (byte) 0x22,
+            (byte) 0xe6, (byte) 0x1a, (byte) 0xa1, (byte) 0xe1, (byte) 0x06, (byte) 0x68,
+            (byte) 0x3b, (byte) 0xbc, (byte) 0x9f, (byte) 0xd3, (byte) 0xae, (byte) 0x77,
+            (byte) 0x5e, (byte) 0x88, (byte) 0x0c, (byte) 0x5e, (byte) 0x0c, (byte) 0xb2,
+            (byte) 0x38, (byte) 0xa3, (byte) 0x7b, (byte) 0x30, (byte) 0x79, (byte) 0x30,
+            (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x13,
+            (byte) 0x04, (byte) 0x02, (byte) 0x30, (byte) 0x00, (byte) 0x30, (byte) 0x2c,
+            (byte) 0x06, (byte) 0x09, (byte) 0x60, (byte) 0x86, (byte) 0x48, (byte) 0x01,
+            (byte) 0x86, (byte) 0xf8, (byte) 0x42, (byte) 0x01, (byte) 0x0d, (byte) 0x04,
+            (byte) 0x1f, (byte) 0x16, (byte) 0x1d, (byte) 0x4f, (byte) 0x70, (byte) 0x65,
+            (byte) 0x6e, (byte) 0x53, (byte) 0x53, (byte) 0x4c, (byte) 0x20, (byte) 0x47,
+            (byte) 0x65, (byte) 0x6e, (byte) 0x65, (byte) 0x72, (byte) 0x61, (byte) 0x74,
+            (byte) 0x65, (byte) 0x64, (byte) 0x20, (byte) 0x43, (byte) 0x65, (byte) 0x72,
+            (byte) 0x74, (byte) 0x69, (byte) 0x66, (byte) 0x69, (byte) 0x63, (byte) 0x61,
+            (byte) 0x74, (byte) 0x65, (byte) 0x30, (byte) 0x1d, (byte) 0x06, (byte) 0x03,
+            (byte) 0x55, (byte) 0x1d, (byte) 0x0e, (byte) 0x04, (byte) 0x16, (byte) 0x04,
+            (byte) 0x14, (byte) 0xd5, (byte) 0xc4, (byte) 0x72, (byte) 0xbd, (byte) 0xd2,
+            (byte) 0x4e, (byte) 0x90, (byte) 0x1b, (byte) 0x14, (byte) 0x32, (byte) 0xdb,
+            (byte) 0x03, (byte) 0xae, (byte) 0xfa, (byte) 0x27, (byte) 0x7d, (byte) 0x8d,
+            (byte) 0xe4, (byte) 0x80, (byte) 0x58, (byte) 0x30, (byte) 0x1f, (byte) 0x06,
+            (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x23, (byte) 0x04, (byte) 0x18,
+            (byte) 0x30, (byte) 0x16, (byte) 0x80, (byte) 0x14, (byte) 0x5f, (byte) 0x5b,
+            (byte) 0x5e, (byte) 0xac, (byte) 0x29, (byte) 0xfa, (byte) 0xa1, (byte) 0x9f,
+            (byte) 0x9e, (byte) 0xad, (byte) 0x46, (byte) 0xe1, (byte) 0xbc, (byte) 0x20,
+            (byte) 0x72, (byte) 0xcf, (byte) 0x4a, (byte) 0xd4, (byte) 0xfa, (byte) 0xe3,
+            (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,
+            (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01,
+            (byte) 0x05, (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x81, (byte) 0x81,
+            (byte) 0x00, (byte) 0x43, (byte) 0x99, (byte) 0x9f, (byte) 0x67, (byte) 0x08,
+            (byte) 0x43, (byte) 0xd5, (byte) 0x6b, (byte) 0x6f, (byte) 0xd7, (byte) 0x05,
+            (byte) 0xd6, (byte) 0x75, (byte) 0x34, (byte) 0x30, (byte) 0xca, (byte) 0x20,
+            (byte) 0x47, (byte) 0x61, (byte) 0xa1, (byte) 0x89, (byte) 0xb6, (byte) 0xf1,
+            (byte) 0x49, (byte) 0x7b, (byte) 0xd9, (byte) 0xb9, (byte) 0xe8, (byte) 0x1e,
+            (byte) 0x29, (byte) 0x74, (byte) 0x0a, (byte) 0x67, (byte) 0xc0, (byte) 0x7d,
+            (byte) 0xb8, (byte) 0xe6, (byte) 0x39, (byte) 0xa8, (byte) 0x5e, (byte) 0xc3,
+            (byte) 0xb0, (byte) 0xa1, (byte) 0x30, (byte) 0x6a, (byte) 0x1f, (byte) 0x1d,
+            (byte) 0xfc, (byte) 0x11, (byte) 0x59, (byte) 0x0b, (byte) 0xb9, (byte) 0xad,
+            (byte) 0x3a, (byte) 0x4e, (byte) 0x50, (byte) 0x0a, (byte) 0x61, (byte) 0xdb,
+            (byte) 0x75, (byte) 0x6b, (byte) 0xe5, (byte) 0x3f, (byte) 0x8d, (byte) 0xde,
+            (byte) 0x28, (byte) 0x68, (byte) 0xb1, (byte) 0x29, (byte) 0x9a, (byte) 0x18,
+            (byte) 0x8a, (byte) 0xfc, (byte) 0x3f, (byte) 0x13, (byte) 0x93, (byte) 0x29,
+            (byte) 0xed, (byte) 0x22, (byte) 0x7c, (byte) 0xb4, (byte) 0x50, (byte) 0xd5,
+            (byte) 0x4d, (byte) 0x32, (byte) 0x4d, (byte) 0x42, (byte) 0x2b, (byte) 0x29,
+            (byte) 0x97, (byte) 0x86, (byte) 0xc0, (byte) 0x01, (byte) 0x00, (byte) 0x25,
+            (byte) 0xf6, (byte) 0xd3, (byte) 0x2a, (byte) 0xd8, (byte) 0xda, (byte) 0x13,
+            (byte) 0x94, (byte) 0x12, (byte) 0x78, (byte) 0x14, (byte) 0x0b, (byte) 0x51,
+            (byte) 0xc0, (byte) 0x45, (byte) 0xb4, (byte) 0x02, (byte) 0x37, (byte) 0x98,
+            (byte) 0x42, (byte) 0x3c, (byte) 0xcb, (byte) 0x2e, (byte) 0xe4, (byte) 0x38,
+            (byte) 0x69, (byte) 0x1b, (byte) 0x72, (byte) 0xf0, (byte) 0xaa, (byte) 0x89,
+            (byte) 0x7e, (byte) 0xde, (byte) 0xb2
+    };
+
+    /*
+     * The keys and certificates below are generated with:
+     *
+     * openssl req -new -x509 -days 3650 -extensions v3_ca -keyout cakey.pem -out cacert.pem
+     * openssl dsaparam -out dsaparam.pem 1024
+     * openssl req -newkey dsa:dsaparam.pem -keyout userkey.pem -nodes -days 3650 -out userkey.req
+     * mkdir -p demoCA/newcerts
+     * touch demoCA/index.txt
+     * echo "01" > demoCA/serial
+     * openssl ca -out usercert.pem -in userkey.req -cert cacert.pem -keyfile cakey.pem -days 3650
+     */
+
+    /**
+     * Generated from above and converted with:
+     *
+     * openssl x509 -outform d -in cacert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
+     */
+    private static final byte[] FAKE_DSA_CA_1 = new byte[] {
+            (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x8a, (byte) 0x30, (byte) 0x82,
+            (byte) 0x01, (byte) 0xf3, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
+            (byte) 0x02, (byte) 0x02, (byte) 0x09, (byte) 0x00, (byte) 0x87, (byte) 0xc0,
+            (byte) 0x68, (byte) 0x7f, (byte) 0x42, (byte) 0x92, (byte) 0x0b, (byte) 0x7a,
+            (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,
+            (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01,
+            (byte) 0x05, (byte) 0x05, (byte) 0x00, (byte) 0x30, (byte) 0x5e, (byte) 0x31,
+            (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55,
+            (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55,
+            (byte) 0x31, (byte) 0x13, (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03,
+            (byte) 0x55, (byte) 0x04, (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53,
+            (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74,
+            (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x31, (byte) 0x21, (byte) 0x30,
+            (byte) 0x1f, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a,
+            (byte) 0x0c, (byte) 0x18, (byte) 0x49, (byte) 0x6e, (byte) 0x74, (byte) 0x65,
+            (byte) 0x72, (byte) 0x6e, (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x57,
+            (byte) 0x69, (byte) 0x64, (byte) 0x67, (byte) 0x69, (byte) 0x74, (byte) 0x73,
+            (byte) 0x20, (byte) 0x50, (byte) 0x74, (byte) 0x79, (byte) 0x20, (byte) 0x4c,
+            (byte) 0x74, (byte) 0x64, (byte) 0x31, (byte) 0x17, (byte) 0x30, (byte) 0x15,
+            (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x03, (byte) 0x0c,
+            (byte) 0x0e, (byte) 0x63, (byte) 0x61, (byte) 0x2e, (byte) 0x65, (byte) 0x78,
+            (byte) 0x61, (byte) 0x6d, (byte) 0x70, (byte) 0x6c, (byte) 0x65, (byte) 0x2e,
+            (byte) 0x63, (byte) 0x6f, (byte) 0x6d, (byte) 0x30, (byte) 0x1e, (byte) 0x17,
+            (byte) 0x0d, (byte) 0x31, (byte) 0x33, (byte) 0x30, (byte) 0x38, (byte) 0x32,
+            (byte) 0x37, (byte) 0x32, (byte) 0x33, (byte) 0x33, (byte) 0x31, (byte) 0x32,
+            (byte) 0x39, (byte) 0x5a, (byte) 0x17, (byte) 0x0d, (byte) 0x32, (byte) 0x33,
+            (byte) 0x30, (byte) 0x38, (byte) 0x32, (byte) 0x35, (byte) 0x32, (byte) 0x33,
+            (byte) 0x33, (byte) 0x31, (byte) 0x32, (byte) 0x39, (byte) 0x5a, (byte) 0x30,
+            (byte) 0x5e, (byte) 0x31, (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06,
+            (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02,
+            (byte) 0x41, (byte) 0x55, (byte) 0x31, (byte) 0x13, (byte) 0x30, (byte) 0x11,
+            (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x08, (byte) 0x0c,
+            (byte) 0x0a, (byte) 0x53, (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d,
+            (byte) 0x53, (byte) 0x74, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x31,
+            (byte) 0x21, (byte) 0x30, (byte) 0x1f, (byte) 0x06, (byte) 0x03, (byte) 0x55,
+            (byte) 0x04, (byte) 0x0a, (byte) 0x0c, (byte) 0x18, (byte) 0x49, (byte) 0x6e,
+            (byte) 0x74, (byte) 0x65, (byte) 0x72, (byte) 0x6e, (byte) 0x65, (byte) 0x74,
+            (byte) 0x20, (byte) 0x57, (byte) 0x69, (byte) 0x64, (byte) 0x67, (byte) 0x69,
+            (byte) 0x74, (byte) 0x73, (byte) 0x20, (byte) 0x50, (byte) 0x74, (byte) 0x79,
+            (byte) 0x20, (byte) 0x4c, (byte) 0x74, (byte) 0x64, (byte) 0x31, (byte) 0x17,
+            (byte) 0x30, (byte) 0x15, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
+            (byte) 0x03, (byte) 0x0c, (byte) 0x0e, (byte) 0x63, (byte) 0x61, (byte) 0x2e,
+            (byte) 0x65, (byte) 0x78, (byte) 0x61, (byte) 0x6d, (byte) 0x70, (byte) 0x6c,
+            (byte) 0x65, (byte) 0x2e, (byte) 0x63, (byte) 0x6f, (byte) 0x6d, (byte) 0x30,
+            (byte) 0x81, (byte) 0x9f, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09,
+            (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d,
+            (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x00, (byte) 0x03,
+            (byte) 0x81, (byte) 0x8d, (byte) 0x00, (byte) 0x30, (byte) 0x81, (byte) 0x89,
+            (byte) 0x02, (byte) 0x81, (byte) 0x81, (byte) 0x00, (byte) 0xa4, (byte) 0xc7,
+            (byte) 0x06, (byte) 0xba, (byte) 0xdf, (byte) 0x2b, (byte) 0xee, (byte) 0xd2,
+            (byte) 0xb9, (byte) 0xe4, (byte) 0x52, (byte) 0x21, (byte) 0x68, (byte) 0x2b,
+            (byte) 0x83, (byte) 0xdf, (byte) 0xe3, (byte) 0x9c, (byte) 0x08, (byte) 0x73,
+            (byte) 0xdd, (byte) 0x90, (byte) 0xea, (byte) 0x97, (byte) 0x0c, (byte) 0x96,
+            (byte) 0x20, (byte) 0xb1, (byte) 0xee, (byte) 0x11, (byte) 0xd5, (byte) 0xd4,
+            (byte) 0x7c, (byte) 0x44, (byte) 0x96, (byte) 0x2e, (byte) 0x6e, (byte) 0xa2,
+            (byte) 0xb2, (byte) 0xa3, (byte) 0x4b, (byte) 0x0f, (byte) 0x32, (byte) 0x90,
+            (byte) 0xaf, (byte) 0x5c, (byte) 0x6f, (byte) 0x00, (byte) 0x88, (byte) 0x45,
+            (byte) 0x4e, (byte) 0x9b, (byte) 0x26, (byte) 0xc1, (byte) 0x94, (byte) 0x3c,
+            (byte) 0xfe, (byte) 0x10, (byte) 0xbd, (byte) 0xda, (byte) 0xf2, (byte) 0x8d,
+            (byte) 0x03, (byte) 0x52, (byte) 0x32, (byte) 0x11, (byte) 0xff, (byte) 0xf6,
+            (byte) 0xf9, (byte) 0x6e, (byte) 0x8f, (byte) 0x0f, (byte) 0xc8, (byte) 0x0a,
+            (byte) 0x48, (byte) 0x39, (byte) 0x33, (byte) 0xb9, (byte) 0x0c, (byte) 0xb3,
+            (byte) 0x2b, (byte) 0xab, (byte) 0x7d, (byte) 0x79, (byte) 0x6f, (byte) 0x57,
+            (byte) 0x5b, (byte) 0xb8, (byte) 0x84, (byte) 0xb6, (byte) 0xcc, (byte) 0xe8,
+            (byte) 0x30, (byte) 0x78, (byte) 0xff, (byte) 0x92, (byte) 0xe5, (byte) 0x43,
+            (byte) 0x2e, (byte) 0xef, (byte) 0x66, (byte) 0x98, (byte) 0xb4, (byte) 0xfe,
+            (byte) 0xa2, (byte) 0x40, (byte) 0xf2, (byte) 0x1f, (byte) 0xd0, (byte) 0x86,
+            (byte) 0x16, (byte) 0xc8, (byte) 0x45, (byte) 0xc4, (byte) 0x52, (byte) 0xcb,
+            (byte) 0x31, (byte) 0x5c, (byte) 0x9f, (byte) 0x32, (byte) 0x3b, (byte) 0xf7,
+            (byte) 0x19, (byte) 0x08, (byte) 0xc7, (byte) 0x00, (byte) 0x21, (byte) 0x7d,
+            (byte) 0x02, (byte) 0x03, (byte) 0x01, (byte) 0x00, (byte) 0x01, (byte) 0xa3,
+            (byte) 0x50, (byte) 0x30, (byte) 0x4e, (byte) 0x30, (byte) 0x1d, (byte) 0x06,
+            (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x0e, (byte) 0x04, (byte) 0x16,
+            (byte) 0x04, (byte) 0x14, (byte) 0x47, (byte) 0x82, (byte) 0xa3, (byte) 0xf1,
+            (byte) 0xc2, (byte) 0x7e, (byte) 0x3a, (byte) 0xde, (byte) 0x4f, (byte) 0x30,
+            (byte) 0x4c, (byte) 0x7f, (byte) 0x72, (byte) 0x81, (byte) 0x15, (byte) 0x32,
+            (byte) 0xda, (byte) 0x7f, (byte) 0x58, (byte) 0x18, (byte) 0x30, (byte) 0x1f,
+            (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x23, (byte) 0x04,
+            (byte) 0x18, (byte) 0x30, (byte) 0x16, (byte) 0x80, (byte) 0x14, (byte) 0x47,
+            (byte) 0x82, (byte) 0xa3, (byte) 0xf1, (byte) 0xc2, (byte) 0x7e, (byte) 0x3a,
+            (byte) 0xde, (byte) 0x4f, (byte) 0x30, (byte) 0x4c, (byte) 0x7f, (byte) 0x72,
+            (byte) 0x81, (byte) 0x15, (byte) 0x32, (byte) 0xda, (byte) 0x7f, (byte) 0x58,
+            (byte) 0x18, (byte) 0x30, (byte) 0x0c, (byte) 0x06, (byte) 0x03, (byte) 0x55,
+            (byte) 0x1d, (byte) 0x13, (byte) 0x04, (byte) 0x05, (byte) 0x30, (byte) 0x03,
+            (byte) 0x01, (byte) 0x01, (byte) 0xff, (byte) 0x30, (byte) 0x0d, (byte) 0x06,
+            (byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7,
+            (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x05, (byte) 0x00,
+            (byte) 0x03, (byte) 0x81, (byte) 0x81, (byte) 0x00, (byte) 0x08, (byte) 0x7f,
+            (byte) 0x6a, (byte) 0x48, (byte) 0x90, (byte) 0x7b, (byte) 0x9b, (byte) 0x72,
+            (byte) 0x13, (byte) 0xa7, (byte) 0xef, (byte) 0x6b, (byte) 0x0b, (byte) 0x59,
+            (byte) 0xe5, (byte) 0x49, (byte) 0x72, (byte) 0x3a, (byte) 0xc8, (byte) 0x84,
+            (byte) 0xcc, (byte) 0x23, (byte) 0x18, (byte) 0x4c, (byte) 0xec, (byte) 0xc7,
+            (byte) 0xef, (byte) 0xcb, (byte) 0xa7, (byte) 0xbe, (byte) 0xe4, (byte) 0xef,
+            (byte) 0x8f, (byte) 0xc6, (byte) 0x06, (byte) 0x8c, (byte) 0xc0, (byte) 0xe4,
+            (byte) 0x2f, (byte) 0x2a, (byte) 0xc0, (byte) 0x35, (byte) 0x7d, (byte) 0x5e,
+            (byte) 0x19, (byte) 0x29, (byte) 0x8c, (byte) 0xb9, (byte) 0xf1, (byte) 0x1e,
+            (byte) 0xaf, (byte) 0x82, (byte) 0xd8, (byte) 0xe3, (byte) 0x88, (byte) 0xe1,
+            (byte) 0x31, (byte) 0xc8, (byte) 0x82, (byte) 0x1f, (byte) 0x83, (byte) 0xa9,
+            (byte) 0xde, (byte) 0xfe, (byte) 0x4b, (byte) 0xe2, (byte) 0x78, (byte) 0x64,
+            (byte) 0xed, (byte) 0xa4, (byte) 0x7b, (byte) 0xee, (byte) 0x8d, (byte) 0x71,
+            (byte) 0x1b, (byte) 0x44, (byte) 0xe6, (byte) 0xb7, (byte) 0xe8, (byte) 0xc5,
+            (byte) 0x9a, (byte) 0x93, (byte) 0x92, (byte) 0x6f, (byte) 0x6f, (byte) 0xdb,
+            (byte) 0xbd, (byte) 0xd7, (byte) 0x03, (byte) 0x85, (byte) 0xa9, (byte) 0x5f,
+            (byte) 0x53, (byte) 0x5f, (byte) 0x5d, (byte) 0x30, (byte) 0xc6, (byte) 0xd9,
+            (byte) 0xce, (byte) 0x34, (byte) 0xa8, (byte) 0xbe, (byte) 0x31, (byte) 0x47,
+            (byte) 0x1c, (byte) 0xa4, (byte) 0x7f, (byte) 0xc0, (byte) 0x2c, (byte) 0xbc,
+            (byte) 0xfe, (byte) 0x1a, (byte) 0x31, (byte) 0xd8, (byte) 0x77, (byte) 0x4d,
+            (byte) 0xfc, (byte) 0x45, (byte) 0x84, (byte) 0xfc, (byte) 0x45, (byte) 0x12,
+            (byte) 0xab, (byte) 0x50, (byte) 0xe4, (byte) 0x45, (byte) 0xe5, (byte) 0x11
+    };
+
+    /**
+     * Generated from above and converted with: openssl pkcs8 -topk8 -outform d
+     * -in userkey.pem -nocrypt | xxd -i | sed 's/0x/(byte) 0x/g'
+     */
+    private static final byte[] FAKE_DSA_KEY_1 = new byte[] {
+            (byte) 0x30, (byte) 0x82, (byte) 0x01, (byte) 0x4c, (byte) 0x02, (byte) 0x01,
+            (byte) 0x00, (byte) 0x30, (byte) 0x82, (byte) 0x01, (byte) 0x2c, (byte) 0x06,
+            (byte) 0x07, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0xce, (byte) 0x38,
+            (byte) 0x04, (byte) 0x01, (byte) 0x30, (byte) 0x82, (byte) 0x01, (byte) 0x1f,
+            (byte) 0x02, (byte) 0x81, (byte) 0x81, (byte) 0x00, (byte) 0xb3, (byte) 0x23,
+            (byte) 0xf7, (byte) 0x86, (byte) 0xbd, (byte) 0x3b, (byte) 0x86, (byte) 0xcc,
+            (byte) 0xc3, (byte) 0x91, (byte) 0xc0, (byte) 0x30, (byte) 0x32, (byte) 0x02,
+            (byte) 0x47, (byte) 0x35, (byte) 0x01, (byte) 0xef, (byte) 0xee, (byte) 0x98,
+            (byte) 0x13, (byte) 0x56, (byte) 0x49, (byte) 0x47, (byte) 0xb5, (byte) 0x20,
+            (byte) 0xa8, (byte) 0x60, (byte) 0xcb, (byte) 0xc0, (byte) 0xd5, (byte) 0x77,
+            (byte) 0xc1, (byte) 0x69, (byte) 0xcd, (byte) 0x18, (byte) 0x34, (byte) 0x92,
+            (byte) 0xf2, (byte) 0x6a, (byte) 0x2a, (byte) 0x10, (byte) 0x59, (byte) 0x1c,
+            (byte) 0x91, (byte) 0x20, (byte) 0x51, (byte) 0xca, (byte) 0x37, (byte) 0xb2,
+            (byte) 0x87, (byte) 0xa6, (byte) 0x8a, (byte) 0x02, (byte) 0xfd, (byte) 0x45,
+            (byte) 0x46, (byte) 0xf9, (byte) 0x76, (byte) 0xb1, (byte) 0x35, (byte) 0x38,
+            (byte) 0x8d, (byte) 0xff, (byte) 0x4c, (byte) 0x5d, (byte) 0x75, (byte) 0x8f,
+            (byte) 0x66, (byte) 0x15, (byte) 0x7d, (byte) 0x7b, (byte) 0xda, (byte) 0xdb,
+            (byte) 0x57, (byte) 0x39, (byte) 0xff, (byte) 0x91, (byte) 0x3f, (byte) 0xdd,
+            (byte) 0xe2, (byte) 0xb4, (byte) 0x22, (byte) 0x60, (byte) 0x4c, (byte) 0x32,
+            (byte) 0x3b, (byte) 0x9d, (byte) 0x34, (byte) 0x9f, (byte) 0xb9, (byte) 0x5d,
+            (byte) 0x75, (byte) 0xb9, (byte) 0xd3, (byte) 0x7f, (byte) 0x11, (byte) 0xba,
+            (byte) 0xb7, (byte) 0xc8, (byte) 0x32, (byte) 0xc6, (byte) 0xce, (byte) 0x71,
+            (byte) 0x91, (byte) 0xd3, (byte) 0x32, (byte) 0xaf, (byte) 0x4d, (byte) 0x7e,
+            (byte) 0x7c, (byte) 0x15, (byte) 0xf7, (byte) 0x71, (byte) 0x2c, (byte) 0x52,
+            (byte) 0x65, (byte) 0x4d, (byte) 0xa9, (byte) 0x81, (byte) 0x25, (byte) 0x35,
+            (byte) 0xce, (byte) 0x0b, (byte) 0x5b, (byte) 0x56, (byte) 0xfe, (byte) 0xf1,
+            (byte) 0x02, (byte) 0x15, (byte) 0x00, (byte) 0xeb, (byte) 0x4e, (byte) 0x7f,
+            (byte) 0x7a, (byte) 0x31, (byte) 0xb3, (byte) 0x7d, (byte) 0x8d, (byte) 0xb2,
+            (byte) 0xf7, (byte) 0xaf, (byte) 0xad, (byte) 0xb1, (byte) 0x42, (byte) 0x92,
+            (byte) 0xf3, (byte) 0x6c, (byte) 0xe4, (byte) 0xed, (byte) 0x8b, (byte) 0x02,
+            (byte) 0x81, (byte) 0x81, (byte) 0x00, (byte) 0x81, (byte) 0xc8, (byte) 0x36,
+            (byte) 0x48, (byte) 0xdb, (byte) 0x71, (byte) 0x2b, (byte) 0x91, (byte) 0xce,
+            (byte) 0x6d, (byte) 0xbc, (byte) 0xb8, (byte) 0xf9, (byte) 0xcb, (byte) 0x50,
+            (byte) 0x91, (byte) 0x10, (byte) 0x8a, (byte) 0xf8, (byte) 0x37, (byte) 0x50,
+            (byte) 0xda, (byte) 0x4f, (byte) 0xc8, (byte) 0x4d, (byte) 0x73, (byte) 0xcb,
+            (byte) 0x4d, (byte) 0xb0, (byte) 0x19, (byte) 0x54, (byte) 0x5a, (byte) 0xf3,
+            (byte) 0x6c, (byte) 0xc9, (byte) 0xd8, (byte) 0x96, (byte) 0xd9, (byte) 0xb0,
+            (byte) 0x54, (byte) 0x7e, (byte) 0x7d, (byte) 0xe2, (byte) 0x58, (byte) 0x0e,
+            (byte) 0x5f, (byte) 0xc0, (byte) 0xce, (byte) 0xb9, (byte) 0x5c, (byte) 0xe3,
+            (byte) 0xd3, (byte) 0xdf, (byte) 0xcf, (byte) 0x45, (byte) 0x74, (byte) 0xfb,
+            (byte) 0xe6, (byte) 0x20, (byte) 0xe7, (byte) 0xfc, (byte) 0x0f, (byte) 0xca,
+            (byte) 0xdb, (byte) 0xc0, (byte) 0x0b, (byte) 0xe1, (byte) 0x5a, (byte) 0x16,
+            (byte) 0x1d, (byte) 0xb3, (byte) 0x2e, (byte) 0xe5, (byte) 0x5f, (byte) 0x89,
+            (byte) 0x17, (byte) 0x73, (byte) 0x50, (byte) 0xd1, (byte) 0x4a, (byte) 0x60,
+            (byte) 0xb7, (byte) 0xaa, (byte) 0xf0, (byte) 0xc7, (byte) 0xc5, (byte) 0x03,
+            (byte) 0x4e, (byte) 0x36, (byte) 0x51, (byte) 0x9e, (byte) 0x2f, (byte) 0xfa,
+            (byte) 0xf3, (byte) 0xd6, (byte) 0x58, (byte) 0x14, (byte) 0x02, (byte) 0xb4,
+            (byte) 0x41, (byte) 0xd6, (byte) 0x72, (byte) 0x6f, (byte) 0x58, (byte) 0x5b,
+            (byte) 0x2d, (byte) 0x23, (byte) 0xc0, (byte) 0x75, (byte) 0x4f, (byte) 0x39,
+            (byte) 0xa8, (byte) 0x6a, (byte) 0xdf, (byte) 0x79, (byte) 0x21, (byte) 0xf2,
+            (byte) 0x77, (byte) 0x91, (byte) 0x3f, (byte) 0x1c, (byte) 0x4d, (byte) 0x48,
+            (byte) 0x78, (byte) 0xcd, (byte) 0xed, (byte) 0x79, (byte) 0x23, (byte) 0x04,
+            (byte) 0x17, (byte) 0x02, (byte) 0x15, (byte) 0x00, (byte) 0xc7, (byte) 0xe7,
+            (byte) 0xe2, (byte) 0x6b, (byte) 0x14, (byte) 0xe6, (byte) 0x31, (byte) 0x12,
+            (byte) 0xb2, (byte) 0x1e, (byte) 0xd4, (byte) 0xf2, (byte) 0x9b, (byte) 0x2c,
+            (byte) 0xf6, (byte) 0x54, (byte) 0x4c, (byte) 0x12, (byte) 0xe8, (byte) 0x22
+    };
+
+    /**
+     * Generated from above and converted with: openssl x509 -outform d -in
+     * usercert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
+     */
+    private static final byte[] FAKE_DSA_USER_1 = new byte[] {
+            (byte) 0x30, (byte) 0x82, (byte) 0x03, (byte) 0xca, (byte) 0x30, (byte) 0x82,
+            (byte) 0x03, (byte) 0x33, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
+            (byte) 0x02, (byte) 0x02, (byte) 0x01, (byte) 0x01, (byte) 0x30, (byte) 0x0d,
+            (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86,
+            (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x05,
+            (byte) 0x00, (byte) 0x30, (byte) 0x5e, (byte) 0x31, (byte) 0x0b, (byte) 0x30,
+            (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06,
+            (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55, (byte) 0x31, (byte) 0x13,
+            (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
+            (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53, (byte) 0x6f, (byte) 0x6d,
+            (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74, (byte) 0x61, (byte) 0x74,
+            (byte) 0x65, (byte) 0x31, (byte) 0x21, (byte) 0x30, (byte) 0x1f, (byte) 0x06,
+            (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a, (byte) 0x0c, (byte) 0x18,
+            (byte) 0x49, (byte) 0x6e, (byte) 0x74, (byte) 0x65, (byte) 0x72, (byte) 0x6e,
+            (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x57, (byte) 0x69, (byte) 0x64,
+            (byte) 0x67, (byte) 0x69, (byte) 0x74, (byte) 0x73, (byte) 0x20, (byte) 0x50,
+            (byte) 0x74, (byte) 0x79, (byte) 0x20, (byte) 0x4c, (byte) 0x74, (byte) 0x64,
+            (byte) 0x31, (byte) 0x17, (byte) 0x30, (byte) 0x15, (byte) 0x06, (byte) 0x03,
+            (byte) 0x55, (byte) 0x04, (byte) 0x03, (byte) 0x0c, (byte) 0x0e, (byte) 0x63,
+            (byte) 0x61, (byte) 0x2e, (byte) 0x65, (byte) 0x78, (byte) 0x61, (byte) 0x6d,
+            (byte) 0x70, (byte) 0x6c, (byte) 0x65, (byte) 0x2e, (byte) 0x63, (byte) 0x6f,
+            (byte) 0x6d, (byte) 0x30, (byte) 0x1e, (byte) 0x17, (byte) 0x0d, (byte) 0x31,
+            (byte) 0x33, (byte) 0x30, (byte) 0x38, (byte) 0x32, (byte) 0x37, (byte) 0x32,
+            (byte) 0x33, (byte) 0x33, (byte) 0x34, (byte) 0x32, (byte) 0x32, (byte) 0x5a,
+            (byte) 0x17, (byte) 0x0d, (byte) 0x32, (byte) 0x33, (byte) 0x30, (byte) 0x38,
+            (byte) 0x32, (byte) 0x35, (byte) 0x32, (byte) 0x33, (byte) 0x33, (byte) 0x34,
+            (byte) 0x32, (byte) 0x32, (byte) 0x5a, (byte) 0x30, (byte) 0x62, (byte) 0x31,
+            (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55,
+            (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55,
+            (byte) 0x31, (byte) 0x13, (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03,
+            (byte) 0x55, (byte) 0x04, (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53,
+            (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74,
+            (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x31, (byte) 0x21, (byte) 0x30,
+            (byte) 0x1f, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a,
+            (byte) 0x0c, (byte) 0x18, (byte) 0x49, (byte) 0x6e, (byte) 0x74, (byte) 0x65,
+            (byte) 0x72, (byte) 0x6e, (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x57,
+            (byte) 0x69, (byte) 0x64, (byte) 0x67, (byte) 0x69, (byte) 0x74, (byte) 0x73,
+            (byte) 0x20, (byte) 0x50, (byte) 0x74, (byte) 0x79, (byte) 0x20, (byte) 0x4c,
+            (byte) 0x74, (byte) 0x64, (byte) 0x31, (byte) 0x1b, (byte) 0x30, (byte) 0x19,
+            (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x03, (byte) 0x0c,
+            (byte) 0x12, (byte) 0x73, (byte) 0x65, (byte) 0x72, (byte) 0x76, (byte) 0x65,
+            (byte) 0x72, (byte) 0x2e, (byte) 0x65, (byte) 0x78, (byte) 0x61, (byte) 0x6d,
+            (byte) 0x70, (byte) 0x6c, (byte) 0x65, (byte) 0x2e, (byte) 0x63, (byte) 0x6f,
+            (byte) 0x6d, (byte) 0x30, (byte) 0x82, (byte) 0x01, (byte) 0xb7, (byte) 0x30,
+            (byte) 0x82, (byte) 0x01, (byte) 0x2c, (byte) 0x06, (byte) 0x07, (byte) 0x2a,
+            (byte) 0x86, (byte) 0x48, (byte) 0xce, (byte) 0x38, (byte) 0x04, (byte) 0x01,
+            (byte) 0x30, (byte) 0x82, (byte) 0x01, (byte) 0x1f, (byte) 0x02, (byte) 0x81,
+            (byte) 0x81, (byte) 0x00, (byte) 0xb3, (byte) 0x23, (byte) 0xf7, (byte) 0x86,
+            (byte) 0xbd, (byte) 0x3b, (byte) 0x86, (byte) 0xcc, (byte) 0xc3, (byte) 0x91,
+            (byte) 0xc0, (byte) 0x30, (byte) 0x32, (byte) 0x02, (byte) 0x47, (byte) 0x35,
+            (byte) 0x01, (byte) 0xef, (byte) 0xee, (byte) 0x98, (byte) 0x13, (byte) 0x56,
+            (byte) 0x49, (byte) 0x47, (byte) 0xb5, (byte) 0x20, (byte) 0xa8, (byte) 0x60,
+            (byte) 0xcb, (byte) 0xc0, (byte) 0xd5, (byte) 0x77, (byte) 0xc1, (byte) 0x69,
+            (byte) 0xcd, (byte) 0x18, (byte) 0x34, (byte) 0x92, (byte) 0xf2, (byte) 0x6a,
+            (byte) 0x2a, (byte) 0x10, (byte) 0x59, (byte) 0x1c, (byte) 0x91, (byte) 0x20,
+            (byte) 0x51, (byte) 0xca, (byte) 0x37, (byte) 0xb2, (byte) 0x87, (byte) 0xa6,
+            (byte) 0x8a, (byte) 0x02, (byte) 0xfd, (byte) 0x45, (byte) 0x46, (byte) 0xf9,
+            (byte) 0x76, (byte) 0xb1, (byte) 0x35, (byte) 0x38, (byte) 0x8d, (byte) 0xff,
+            (byte) 0x4c, (byte) 0x5d, (byte) 0x75, (byte) 0x8f, (byte) 0x66, (byte) 0x15,
+            (byte) 0x7d, (byte) 0x7b, (byte) 0xda, (byte) 0xdb, (byte) 0x57, (byte) 0x39,
+            (byte) 0xff, (byte) 0x91, (byte) 0x3f, (byte) 0xdd, (byte) 0xe2, (byte) 0xb4,
+            (byte) 0x22, (byte) 0x60, (byte) 0x4c, (byte) 0x32, (byte) 0x3b, (byte) 0x9d,
+            (byte) 0x34, (byte) 0x9f, (byte) 0xb9, (byte) 0x5d, (byte) 0x75, (byte) 0xb9,
+            (byte) 0xd3, (byte) 0x7f, (byte) 0x11, (byte) 0xba, (byte) 0xb7, (byte) 0xc8,
+            (byte) 0x32, (byte) 0xc6, (byte) 0xce, (byte) 0x71, (byte) 0x91, (byte) 0xd3,
+            (byte) 0x32, (byte) 0xaf, (byte) 0x4d, (byte) 0x7e, (byte) 0x7c, (byte) 0x15,
+            (byte) 0xf7, (byte) 0x71, (byte) 0x2c, (byte) 0x52, (byte) 0x65, (byte) 0x4d,
+            (byte) 0xa9, (byte) 0x81, (byte) 0x25, (byte) 0x35, (byte) 0xce, (byte) 0x0b,
+            (byte) 0x5b, (byte) 0x56, (byte) 0xfe, (byte) 0xf1, (byte) 0x02, (byte) 0x15,
+            (byte) 0x00, (byte) 0xeb, (byte) 0x4e, (byte) 0x7f, (byte) 0x7a, (byte) 0x31,
+            (byte) 0xb3, (byte) 0x7d, (byte) 0x8d, (byte) 0xb2, (byte) 0xf7, (byte) 0xaf,
+            (byte) 0xad, (byte) 0xb1, (byte) 0x42, (byte) 0x92, (byte) 0xf3, (byte) 0x6c,
+            (byte) 0xe4, (byte) 0xed, (byte) 0x8b, (byte) 0x02, (byte) 0x81, (byte) 0x81,
+            (byte) 0x00, (byte) 0x81, (byte) 0xc8, (byte) 0x36, (byte) 0x48, (byte) 0xdb,
+            (byte) 0x71, (byte) 0x2b, (byte) 0x91, (byte) 0xce, (byte) 0x6d, (byte) 0xbc,
+            (byte) 0xb8, (byte) 0xf9, (byte) 0xcb, (byte) 0x50, (byte) 0x91, (byte) 0x10,
+            (byte) 0x8a, (byte) 0xf8, (byte) 0x37, (byte) 0x50, (byte) 0xda, (byte) 0x4f,
+            (byte) 0xc8, (byte) 0x4d, (byte) 0x73, (byte) 0xcb, (byte) 0x4d, (byte) 0xb0,
+            (byte) 0x19, (byte) 0x54, (byte) 0x5a, (byte) 0xf3, (byte) 0x6c, (byte) 0xc9,
+            (byte) 0xd8, (byte) 0x96, (byte) 0xd9, (byte) 0xb0, (byte) 0x54, (byte) 0x7e,
+            (byte) 0x7d, (byte) 0xe2, (byte) 0x58, (byte) 0x0e, (byte) 0x5f, (byte) 0xc0,
+            (byte) 0xce, (byte) 0xb9, (byte) 0x5c, (byte) 0xe3, (byte) 0xd3, (byte) 0xdf,
+            (byte) 0xcf, (byte) 0x45, (byte) 0x74, (byte) 0xfb, (byte) 0xe6, (byte) 0x20,
+            (byte) 0xe7, (byte) 0xfc, (byte) 0x0f, (byte) 0xca, (byte) 0xdb, (byte) 0xc0,
+            (byte) 0x0b, (byte) 0xe1, (byte) 0x5a, (byte) 0x16, (byte) 0x1d, (byte) 0xb3,
+            (byte) 0x2e, (byte) 0xe5, (byte) 0x5f, (byte) 0x89, (byte) 0x17, (byte) 0x73,
+            (byte) 0x50, (byte) 0xd1, (byte) 0x4a, (byte) 0x60, (byte) 0xb7, (byte) 0xaa,
+            (byte) 0xf0, (byte) 0xc7, (byte) 0xc5, (byte) 0x03, (byte) 0x4e, (byte) 0x36,
+            (byte) 0x51, (byte) 0x9e, (byte) 0x2f, (byte) 0xfa, (byte) 0xf3, (byte) 0xd6,
+            (byte) 0x58, (byte) 0x14, (byte) 0x02, (byte) 0xb4, (byte) 0x41, (byte) 0xd6,
+            (byte) 0x72, (byte) 0x6f, (byte) 0x58, (byte) 0x5b, (byte) 0x2d, (byte) 0x23,
+            (byte) 0xc0, (byte) 0x75, (byte) 0x4f, (byte) 0x39, (byte) 0xa8, (byte) 0x6a,
+            (byte) 0xdf, (byte) 0x79, (byte) 0x21, (byte) 0xf2, (byte) 0x77, (byte) 0x91,
+            (byte) 0x3f, (byte) 0x1c, (byte) 0x4d, (byte) 0x48, (byte) 0x78, (byte) 0xcd,
+            (byte) 0xed, (byte) 0x79, (byte) 0x23, (byte) 0x03, (byte) 0x81, (byte) 0x84,
+            (byte) 0x00, (byte) 0x02, (byte) 0x81, (byte) 0x80, (byte) 0x1a, (byte) 0x50,
+            (byte) 0x9d, (byte) 0x3e, (byte) 0xa1, (byte) 0x6c, (byte) 0x99, (byte) 0x35,
+            (byte) 0x36, (byte) 0x26, (byte) 0x22, (byte) 0x6b, (byte) 0x47, (byte) 0x45,
+            (byte) 0x80, (byte) 0x5b, (byte) 0xd5, (byte) 0xc1, (byte) 0xc5, (byte) 0x70,
+            (byte) 0x75, (byte) 0x55, (byte) 0x66, (byte) 0x33, (byte) 0x1d, (byte) 0xae,
+            (byte) 0xd0, (byte) 0x01, (byte) 0x64, (byte) 0x8b, (byte) 0xae, (byte) 0x9d,
+            (byte) 0x66, (byte) 0x58, (byte) 0xf9, (byte) 0x42, (byte) 0x74, (byte) 0x3a,
+            (byte) 0x32, (byte) 0xc7, (byte) 0x7f, (byte) 0x25, (byte) 0x64, (byte) 0x7d,
+            (byte) 0x08, (byte) 0x26, (byte) 0xbf, (byte) 0x21, (byte) 0x3a, (byte) 0x84,
+            (byte) 0xcc, (byte) 0x2c, (byte) 0x66, (byte) 0x7d, (byte) 0xc7, (byte) 0xd6,
+            (byte) 0xb1, (byte) 0x69, (byte) 0x57, (byte) 0x67, (byte) 0x52, (byte) 0x73,
+            (byte) 0x3f, (byte) 0x79, (byte) 0x60, (byte) 0xaa, (byte) 0xf4, (byte) 0x8a,
+            (byte) 0x48, (byte) 0x42, (byte) 0x46, (byte) 0x41, (byte) 0xd0, (byte) 0x50,
+            (byte) 0x9b, (byte) 0xa2, (byte) 0x4e, (byte) 0xa5, (byte) 0x88, (byte) 0x10,
+            (byte) 0xf7, (byte) 0x61, (byte) 0xa2, (byte) 0xfa, (byte) 0x8d, (byte) 0xa6,
+            (byte) 0x13, (byte) 0x9e, (byte) 0x36, (byte) 0x86, (byte) 0x62, (byte) 0xf0,
+            (byte) 0x97, (byte) 0xef, (byte) 0x11, (byte) 0xc6, (byte) 0x35, (byte) 0xd3,
+            (byte) 0x79, (byte) 0x30, (byte) 0xde, (byte) 0xf2, (byte) 0x7f, (byte) 0x7a,
+            (byte) 0x3c, (byte) 0x03, (byte) 0xa3, (byte) 0xc5, (byte) 0xbc, (byte) 0xb1,
+            (byte) 0xbc, (byte) 0x2f, (byte) 0x10, (byte) 0xf4, (byte) 0x51, (byte) 0x89,
+            (byte) 0xe2, (byte) 0xaf, (byte) 0xf7, (byte) 0x61, (byte) 0x1a, (byte) 0xf0,
+            (byte) 0x87, (byte) 0x5e, (byte) 0xa5, (byte) 0x02, (byte) 0xd2, (byte) 0xe4,
+            (byte) 0xa3, (byte) 0x7b, (byte) 0x30, (byte) 0x79, (byte) 0x30, (byte) 0x09,
+            (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x13, (byte) 0x04,
+            (byte) 0x02, (byte) 0x30, (byte) 0x00, (byte) 0x30, (byte) 0x2c, (byte) 0x06,
+            (byte) 0x09, (byte) 0x60, (byte) 0x86, (byte) 0x48, (byte) 0x01, (byte) 0x86,
+            (byte) 0xf8, (byte) 0x42, (byte) 0x01, (byte) 0x0d, (byte) 0x04, (byte) 0x1f,
+            (byte) 0x16, (byte) 0x1d, (byte) 0x4f, (byte) 0x70, (byte) 0x65, (byte) 0x6e,
+            (byte) 0x53, (byte) 0x53, (byte) 0x4c, (byte) 0x20, (byte) 0x47, (byte) 0x65,
+            (byte) 0x6e, (byte) 0x65, (byte) 0x72, (byte) 0x61, (byte) 0x74, (byte) 0x65,
+            (byte) 0x64, (byte) 0x20, (byte) 0x43, (byte) 0x65, (byte) 0x72, (byte) 0x74,
+            (byte) 0x69, (byte) 0x66, (byte) 0x69, (byte) 0x63, (byte) 0x61, (byte) 0x74,
+            (byte) 0x65, (byte) 0x30, (byte) 0x1d, (byte) 0x06, (byte) 0x03, (byte) 0x55,
+            (byte) 0x1d, (byte) 0x0e, (byte) 0x04, (byte) 0x16, (byte) 0x04, (byte) 0x14,
+            (byte) 0xd1, (byte) 0x6c, (byte) 0x36, (byte) 0x36, (byte) 0x61, (byte) 0x6c,
+            (byte) 0xf6, (byte) 0x90, (byte) 0x82, (byte) 0x82, (byte) 0x87, (byte) 0x93,
+            (byte) 0xbe, (byte) 0x99, (byte) 0x60, (byte) 0x1b, (byte) 0x03, (byte) 0x58,
+            (byte) 0x36, (byte) 0x63, (byte) 0x30, (byte) 0x1f, (byte) 0x06, (byte) 0x03,
+            (byte) 0x55, (byte) 0x1d, (byte) 0x23, (byte) 0x04, (byte) 0x18, (byte) 0x30,
+            (byte) 0x16, (byte) 0x80, (byte) 0x14, (byte) 0x47, (byte) 0x82, (byte) 0xa3,
+            (byte) 0xf1, (byte) 0xc2, (byte) 0x7e, (byte) 0x3a, (byte) 0xde, (byte) 0x4f,
+            (byte) 0x30, (byte) 0x4c, (byte) 0x7f, (byte) 0x72, (byte) 0x81, (byte) 0x15,
+            (byte) 0x32, (byte) 0xda, (byte) 0x7f, (byte) 0x58, (byte) 0x18, (byte) 0x30,
+            (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48,
+            (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05,
+            (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x81, (byte) 0x81, (byte) 0x00,
+            (byte) 0x81, (byte) 0xde, (byte) 0x20, (byte) 0xa1, (byte) 0xb2, (byte) 0x50,
+            (byte) 0x03, (byte) 0xcd, (byte) 0x90, (byte) 0x4f, (byte) 0x2b, (byte) 0x47,
+            (byte) 0x1d, (byte) 0xac, (byte) 0x6e, (byte) 0xb4, (byte) 0xc7, (byte) 0x14,
+            (byte) 0xc6, (byte) 0x4f, (byte) 0x45, (byte) 0xaf, (byte) 0x81, (byte) 0x5d,
+            (byte) 0x5a, (byte) 0x31, (byte) 0xff, (byte) 0x9c, (byte) 0x4d, (byte) 0xdc,
+            (byte) 0x9e, (byte) 0x36, (byte) 0x9f, (byte) 0x9b, (byte) 0xb1, (byte) 0xc9,
+            (byte) 0x50, (byte) 0xa3, (byte) 0xf6, (byte) 0x9c, (byte) 0x68, (byte) 0x6f,
+            (byte) 0x68, (byte) 0xd9, (byte) 0x56, (byte) 0x1b, (byte) 0xe5, (byte) 0x1b,
+            (byte) 0x41, (byte) 0xd4, (byte) 0xcc, (byte) 0xb6, (byte) 0x37, (byte) 0xd5,
+            (byte) 0x69, (byte) 0x6b, (byte) 0x39, (byte) 0xaf, (byte) 0xc6, (byte) 0xb8,
+            (byte) 0x39, (byte) 0x76, (byte) 0xe3, (byte) 0xf7, (byte) 0x97, (byte) 0x74,
+            (byte) 0x31, (byte) 0xc4, (byte) 0x2d, (byte) 0xb7, (byte) 0x9a, (byte) 0xa4,
+            (byte) 0xfa, (byte) 0x9f, (byte) 0xa8, (byte) 0xe3, (byte) 0x41, (byte) 0xda,
+            (byte) 0x2f, (byte) 0x0c, (byte) 0x9d, (byte) 0x83, (byte) 0xdc, (byte) 0x86,
+            (byte) 0x1f, (byte) 0x5c, (byte) 0x0f, (byte) 0x87, (byte) 0x05, (byte) 0xc9,
+            (byte) 0xb0, (byte) 0x63, (byte) 0xca, (byte) 0x9b, (byte) 0xdb, (byte) 0xe6,
+            (byte) 0x3c, (byte) 0xe9, (byte) 0x23, (byte) 0x9e, (byte) 0x23, (byte) 0x44,
+            (byte) 0x1d, (byte) 0x5b, (byte) 0x60, (byte) 0x66, (byte) 0xb6, (byte) 0x72,
+            (byte) 0x8c, (byte) 0x87, (byte) 0x86, (byte) 0xe8, (byte) 0xdb, (byte) 0x29,
+            (byte) 0x67, (byte) 0x9c, (byte) 0x33, (byte) 0x5c, (byte) 0x39, (byte) 0xf1,
+            (byte) 0xb5, (byte) 0x9b, (byte) 0xb8, (byte) 0xe1, (byte) 0x42, (byte) 0x51,
+            (byte) 0xed, (byte) 0x2c
+    };
+
     /**
      * The amount of time to allow before and after expected time for variance
      * in timing tests.
@@ -505,11 +1133,12 @@
         assertAliases(new String[] {});
 
         assertTrue(mAndroidKeyStore.generate(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
-                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+                KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA, 1024, KeyStore.FLAG_ENCRYPTED,
+                null));
 
         assertAliases(new String[] { TEST_ALIAS_1 });
 
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         assertAliases(new String[] { TEST_ALIAS_1, TEST_ALIAS_2 });
@@ -533,11 +1162,12 @@
         assertAliases(new String[] {});
 
         assertTrue(mAndroidKeyStore.generate(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
-                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+                KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA, 1024, KeyStore.FLAG_ENCRYPTED,
+                null));
 
         assertTrue("Should contain generated private key", mKeyStore.containsAlias(TEST_ALIAS_1));
 
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         assertTrue("Should contain added CA certificate", mKeyStore.containsAlias(TEST_ALIAS_2));
@@ -551,7 +1181,7 @@
 
         mKeyStore.load(null, null);
 
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         assertTrue("Should contain added CA certificate", mKeyStore.containsAlias(TEST_ALIAS_2));
@@ -572,18 +1202,18 @@
 
         // TEST_ALIAS_1
         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
-                FAKE_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_USER_1,
+                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         // TEST_ALIAS_2
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         // TEST_ALIAS_3
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_3, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_3, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         assertAliases(new String[] { TEST_ALIAS_1, TEST_ALIAS_2, TEST_ALIAS_3 });
@@ -617,10 +1247,10 @@
 
         // TEST_ALIAS_1
         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
-                FAKE_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_USER_1,
+                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         // Should not throw when a non-existent entry is requested for delete.
@@ -632,7 +1262,7 @@
 
         mKeyStore.load(null, null);
 
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         assertAliases(new String[] { TEST_ALIAS_1 });
@@ -645,7 +1275,7 @@
         assertNotNull("Retrieved certificate should not be null", retrieved);
 
         CertificateFactory f = CertificateFactory.getInstance("X.509");
-        Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         assertEquals("Actual and retrieved certificates should be the same", actual, retrieved);
     }
@@ -664,11 +1294,11 @@
 
         mKeyStore.load(null, null);
 
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         CertificateFactory f = CertificateFactory.getInstance("X.509");
-        Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         assertEquals("Stored certificate alias should be found", TEST_ALIAS_1,
                 mKeyStore.getCertificateAlias(actual));
@@ -681,14 +1311,14 @@
         mKeyStore.load(null, null);
 
         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
-                FAKE_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_USER_1,
+                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         CertificateFactory f = CertificateFactory.getInstance("X.509");
-        Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
+        Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
 
         assertEquals("Stored certificate alias should be found", TEST_ALIAS_1,
                 mKeyStore.getCertificateAlias(actual));
@@ -701,19 +1331,19 @@
         mKeyStore.load(null, null);
 
         // Insert TrustedCertificateEntry with CA name
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         // Insert PrivateKeyEntry that uses the same CA
         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
-                FAKE_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_USER_1,
+                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         CertificateFactory f = CertificateFactory.getInstance("X.509");
-        Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         assertEquals("Stored certificate alias should be found", TEST_ALIAS_2,
                 mKeyStore.getCertificateAlias(actual));
@@ -726,7 +1356,7 @@
         mKeyStore.load(null, null);
 
         CertificateFactory f = CertificateFactory.getInstance("X.509");
-        Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         assertNull("Stored certificate alias should not be found",
                 mKeyStore.getCertificateAlias(actual));
@@ -737,11 +1367,11 @@
 
         mKeyStore.load(null, null);
 
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         CertificateFactory f = CertificateFactory.getInstance("X.509");
-        Certificate userCert = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
+        Certificate userCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
 
         assertNull("Stored certificate alias should be found",
                 mKeyStore.getCertificateAlias(userCert));
@@ -753,16 +1383,16 @@
         mKeyStore.load(null, null);
 
         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
-                FAKE_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_USER_1,
+                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         CertificateFactory cf = CertificateFactory.getInstance("X.509");
         Certificate[] expected = new Certificate[2];
-        expected[0] = cf.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
-        expected[1] = cf.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        expected[0] = cf.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
+        expected[1] = cf.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         Certificate[] actual = mKeyStore.getCertificateChain(TEST_ALIAS_1);
 
@@ -792,10 +1422,10 @@
         mKeyStore.load(null, null);
 
         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
-                FAKE_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_USER_1,
+                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         Date now = new Date();
@@ -812,10 +1442,10 @@
         mKeyStore.load(null, null);
 
         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
-                FAKE_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
-        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_USER_1,
+                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
+        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_NONE));
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_NONE));
 
         Date now = new Date();
@@ -833,7 +1463,7 @@
 
         mKeyStore.load(null, null);
 
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         Date now = new Date();
@@ -853,10 +1483,10 @@
         mKeyStore.load(null, null);
 
         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
-                FAKE_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_USER_1,
+                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
@@ -866,17 +1496,18 @@
 
         PrivateKeyEntry keyEntry = (PrivateKeyEntry) entry;
 
-        assertPrivateKeyEntryEquals(keyEntry, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+        assertPrivateKeyEntryEquals(keyEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
+                FAKE_RSA_CA_1);
     }
 
-    public void testKeyStore_GetEntry_NullParams_Unencrypted_Success() throws Exception {
+    public void testKeyStore_GetEntry_DSA_NullParams_Unencrypted_Success() throws Exception {
         mKeyStore.load(null, null);
 
         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
-                FAKE_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
-        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_USER_1,
-                KeyStore.UID_SELF, KeyStore.FLAG_NONE));
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+                FAKE_DSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
+        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1,
+                FAKE_DSA_USER_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_DSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_NONE));
 
         Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
@@ -886,13 +1517,54 @@
 
         PrivateKeyEntry keyEntry = (PrivateKeyEntry) entry;
 
-        assertPrivateKeyEntryEquals(keyEntry, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+        assertPrivateKeyEntryEquals(keyEntry, "DSA", FAKE_DSA_KEY_1, FAKE_DSA_USER_1, FAKE_DSA_CA_1);
+    }
+
+    public void testKeyStore_GetEntry_EC_NullParams_Unencrypted_Success() throws Exception {
+        mKeyStore.load(null, null);
+
+        assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
+                FAKE_EC_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
+        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1,
+                FAKE_EC_USER_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_EC_CA_1,
+                KeyStore.UID_SELF, KeyStore.FLAG_NONE));
+
+        Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
+        assertNotNull("Entry should exist", entry);
+
+        assertTrue("Should be a PrivateKeyEntry", entry instanceof PrivateKeyEntry);
+
+        PrivateKeyEntry keyEntry = (PrivateKeyEntry) entry;
+
+        assertPrivateKeyEntryEquals(keyEntry, "EC", FAKE_EC_KEY_1, FAKE_EC_USER_1, FAKE_EC_CA_1);
+    }
+
+    public void testKeyStore_GetEntry_RSA_NullParams_Unencrypted_Success() throws Exception {
+        mKeyStore.load(null, null);
+
+        assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
+                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
+        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1,
+                FAKE_RSA_USER_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
+                KeyStore.UID_SELF, KeyStore.FLAG_NONE));
+
+        Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
+        assertNotNull("Entry should exist", entry);
+
+        assertTrue("Should be a PrivateKeyEntry", entry instanceof PrivateKeyEntry);
+
+        PrivateKeyEntry keyEntry = (PrivateKeyEntry) entry;
+
+        assertPrivateKeyEntryEquals(keyEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
+                FAKE_RSA_CA_1);
     }
 
     @SuppressWarnings("unchecked")
-    private void assertPrivateKeyEntryEquals(PrivateKeyEntry keyEntry, byte[] key, byte[] cert,
-            byte[] ca) throws Exception {
-        KeyFactory keyFact = KeyFactory.getInstance("RSA");
+    private void assertPrivateKeyEntryEquals(PrivateKeyEntry keyEntry, String keyType, byte[] key,
+            byte[] cert, byte[] ca) throws Exception {
+        KeyFactory keyFact = KeyFactory.getInstance(keyType);
         PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(key));
 
         CertificateFactory certFact = CertificateFactory.getInstance("X.509");
@@ -911,9 +1583,19 @@
 
     private void assertPrivateKeyEntryEquals(PrivateKeyEntry keyEntry, PrivateKey expectedKey,
             Certificate expectedCert, Collection<Certificate> expectedChain) throws Exception {
-        assertEquals("Returned PrivateKey should be what we inserted",
-                ((RSAPrivateKey) expectedKey).getModulus(),
-                ((RSAPrivateKey) keyEntry.getPrivateKey()).getModulus());
+        if (expectedKey instanceof DSAPrivateKey) {
+            assertEquals("Returned PrivateKey should be what we inserted",
+                    ((DSAPrivateKey) expectedKey).getParams(),
+                    ((DSAPublicKey) keyEntry.getCertificate().getPublicKey()).getParams());
+        } else if (expectedKey instanceof ECPrivateKey) {
+            assertEquals("Returned PrivateKey should be what we inserted",
+                    ((ECPrivateKey) expectedKey).getParams().getCurve(),
+                    ((ECPublicKey) keyEntry.getCertificate().getPublicKey()).getParams().getCurve());
+        } else if (expectedKey instanceof RSAPrivateKey) {
+            assertEquals("Returned PrivateKey should be what we inserted",
+                    ((RSAPrivateKey) expectedKey).getModulus(),
+                    ((RSAPrivateKey) keyEntry.getPrivateKey()).getModulus());
+        }
 
         assertEquals("Returned Certificate should be what we inserted", expectedCert,
                 keyEntry.getCertificate());
@@ -956,10 +1638,10 @@
         mKeyStore.load(null, null);
 
         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
-                FAKE_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_USER_1,
+                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         Key key = mKeyStore.getKey(TEST_ALIAS_1, null);
@@ -970,7 +1652,7 @@
         RSAPrivateKey actualKey = (RSAPrivateKey) key;
 
         KeyFactory keyFact = KeyFactory.getInstance("RSA");
-        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
 
         assertEquals("Inserted key should be same as retrieved key",
                 ((RSAPrivateKey) expectedKey).getModulus(), actualKey.getModulus());
@@ -980,10 +1662,10 @@
         mKeyStore.load(null, null);
 
         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
-                FAKE_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
-        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_USER_1,
+                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
+        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_NONE));
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_NONE));
 
         Key key = mKeyStore.getKey(TEST_ALIAS_1, null);
@@ -994,7 +1676,7 @@
         RSAPrivateKey actualKey = (RSAPrivateKey) key;
 
         KeyFactory keyFact = KeyFactory.getInstance("RSA");
-        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
 
         assertEquals("Inserted key should be same as retrieved key",
                 ((RSAPrivateKey) expectedKey).getModulus(), actualKey.getModulus());
@@ -1005,7 +1687,7 @@
 
         mKeyStore.load(null, null);
 
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         assertNull("Certificate entries should return null", mKeyStore.getKey(TEST_ALIAS_1, null));
@@ -1035,7 +1717,7 @@
         setupPassword();
         mKeyStore.load(null, null);
 
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         assertTrue("Should return true for CA certificate",
@@ -1047,10 +1729,10 @@
         mKeyStore.load(null, null);
 
         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
-                FAKE_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_USER_1,
+                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         assertFalse("Should return false for PrivateKeyEntry",
@@ -1077,10 +1759,10 @@
         mKeyStore.load(null, null);
 
         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
-                FAKE_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_USER_1,
+                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         assertTrue("Should return true for PrivateKeyEntry", mKeyStore.isKeyEntry(TEST_ALIAS_1));
@@ -1090,7 +1772,7 @@
         setupPassword();
         mKeyStore.load(null, null);
 
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         assertFalse("Should return false for CA certificate", mKeyStore.isKeyEntry(TEST_ALIAS_1));
@@ -1106,7 +1788,7 @@
 
     public void testKeyStore_SetCertificate_CA_Encrypted_Success() throws Exception {
         final CertificateFactory f = CertificateFactory.getInstance("X.509");
-        final Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        final Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         setupPassword();
         mKeyStore.load(null, null);
@@ -1124,13 +1806,13 @@
         setupPassword();
         mKeyStore.load(null, null);
 
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         assertAliases(new String[] { TEST_ALIAS_1 });
 
         final CertificateFactory f = CertificateFactory.getInstance("X.509");
-        final Certificate cert = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        final Certificate cert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         // TODO have separate FAKE_CA for second test
         mKeyStore.setCertificateEntry(TEST_ALIAS_1, cert);
@@ -1143,16 +1825,16 @@
         mKeyStore.load(null, null);
 
         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
-                FAKE_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_USER_1,
+                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         assertAliases(new String[] { TEST_ALIAS_1 });
 
         final CertificateFactory f = CertificateFactory.getInstance("X.509");
-        final Certificate cert = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        final Certificate cert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         try {
             mKeyStore.setCertificateEntry(TEST_ALIAS_1, cert);
@@ -1166,13 +1848,13 @@
         mKeyStore.load(null, null);
 
         KeyFactory keyFact = KeyFactory.getInstance("RSA");
-        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
 
         final CertificateFactory f = CertificateFactory.getInstance("X.509");
 
         final Certificate[] expectedChain = new Certificate[2];
-        expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
-        expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
+        expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         PrivateKeyEntry expected = new PrivateKeyEntry(expectedKey, expectedChain);
 
@@ -1186,20 +1868,74 @@
 
         PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
 
-        assertPrivateKeyEntryEquals(actual, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+        assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1, FAKE_RSA_CA_1);
     }
 
-    public void testKeyStore_SetEntry_PrivateKeyEntry_Unencrypted_Success() throws Exception {
+    public void testKeyStore_SetEntry_PrivateKeyEntry_DSA_Unencrypted_Success() throws Exception {
+        mKeyStore.load(null, null);
+
+        KeyFactory keyFact = KeyFactory.getInstance("DSA");
+        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_DSA_KEY_1));
+
+        final CertificateFactory f = CertificateFactory.getInstance("X.509");
+
+        final Certificate[] expectedChain = new Certificate[2];
+        expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_DSA_USER_1));
+        expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_DSA_CA_1));
+
+        PrivateKeyEntry expected = new PrivateKeyEntry(expectedKey, expectedChain);
+
+        mKeyStore.setEntry(TEST_ALIAS_1, expected, null);
+
+        Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
+        assertNotNull("Retrieved entry should exist", actualEntry);
+
+        assertTrue("Retrieved entry should be of type PrivateKeyEntry",
+                actualEntry instanceof PrivateKeyEntry);
+
+        PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
+
+        assertPrivateKeyEntryEquals(actual, "DSA", FAKE_DSA_KEY_1, FAKE_DSA_USER_1, FAKE_DSA_CA_1);
+    }
+
+    public void testKeyStore_SetEntry_PrivateKeyEntry_EC_Unencrypted_Success() throws Exception {
+        mKeyStore.load(null, null);
+
+        KeyFactory keyFact = KeyFactory.getInstance("EC");
+        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_EC_KEY_1));
+
+        final CertificateFactory f = CertificateFactory.getInstance("X.509");
+
+        final Certificate[] expectedChain = new Certificate[2];
+        expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_EC_USER_1));
+        expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_EC_CA_1));
+
+        PrivateKeyEntry expected = new PrivateKeyEntry(expectedKey, expectedChain);
+
+        mKeyStore.setEntry(TEST_ALIAS_1, expected, null);
+
+        Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
+        assertNotNull("Retrieved entry should exist", actualEntry);
+
+        assertTrue("Retrieved entry should be of type PrivateKeyEntry",
+                actualEntry instanceof PrivateKeyEntry);
+
+        PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
+
+        assertPrivateKeyEntryEquals(actual, "EC", FAKE_EC_KEY_1, FAKE_EC_USER_1, FAKE_EC_CA_1);
+    }
+
+    public void testKeyStore_SetEntry_PrivateKeyEntry_RSA_Unencrypted_Success() throws Exception {
         mKeyStore.load(null, null);
 
         KeyFactory keyFact = KeyFactory.getInstance("RSA");
-        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
 
         final CertificateFactory f = CertificateFactory.getInstance("X.509");
 
         final Certificate[] expectedChain = new Certificate[2];
-        expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
-        expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
+        expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         PrivateKeyEntry expected = new PrivateKeyEntry(expectedKey, expectedChain);
 
@@ -1213,20 +1949,20 @@
 
         PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
 
-        assertPrivateKeyEntryEquals(actual, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+        assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1, FAKE_RSA_CA_1);
     }
 
     public void testKeyStore_SetEntry_PrivateKeyEntry_Params_Unencrypted_Failure() throws Exception {
         mKeyStore.load(null, null);
 
         KeyFactory keyFact = KeyFactory.getInstance("RSA");
-        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
 
         final CertificateFactory f = CertificateFactory.getInstance("X.509");
 
         final Certificate[] expectedChain = new Certificate[2];
-        expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
-        expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
+        expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         PrivateKeyEntry entry = new PrivateKeyEntry(expectedKey, expectedChain);
 
@@ -1253,11 +1989,11 @@
 
         // Start with PrivateKeyEntry
         {
-            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
 
             final Certificate[] expectedChain = new Certificate[2];
-            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
-            expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
+            expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
             PrivateKeyEntry expected = new PrivateKeyEntry(expectedKey, expectedChain);
 
@@ -1271,17 +2007,18 @@
 
             PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
 
-            assertPrivateKeyEntryEquals(actual, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+            assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
+                    FAKE_RSA_CA_1);
         }
 
         // TODO make entirely new test vector for the overwrite
         // Replace with PrivateKeyEntry
         {
-            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
 
             final Certificate[] expectedChain = new Certificate[2];
-            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
-            expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
+            expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
             PrivateKeyEntry expected = new PrivateKeyEntry(expectedKey, expectedChain);
 
@@ -1295,7 +2032,8 @@
 
             PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
 
-            assertPrivateKeyEntryEquals(actual, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+            assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
+                    FAKE_RSA_CA_1);
         }
     }
 
@@ -1308,7 +2046,7 @@
 
         // Start with TrustedCertificateEntry
         {
-            final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+            final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
             TrustedCertificateEntry expectedCertEntry = new TrustedCertificateEntry(caCert);
             mKeyStore.setEntry(TEST_ALIAS_1, expectedCertEntry, null);
@@ -1326,10 +2064,10 @@
         // Replace with PrivateKeyEntry
         {
             KeyFactory keyFact = KeyFactory.getInstance("RSA");
-            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
             final Certificate[] expectedChain = new Certificate[2];
-            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
-            expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
+            expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
             PrivateKeyEntry expectedPrivEntry = new PrivateKeyEntry(expectedKey, expectedChain);
 
@@ -1341,7 +2079,8 @@
                     actualEntry instanceof PrivateKeyEntry);
 
             PrivateKeyEntry actualPrivEntry = (PrivateKeyEntry) actualEntry;
-            assertPrivateKeyEntryEquals(actualPrivEntry, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+            assertPrivateKeyEntryEquals(actualPrivEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
+                    FAKE_RSA_CA_1);
         }
     }
 
@@ -1352,14 +2091,14 @@
 
         final CertificateFactory f = CertificateFactory.getInstance("X.509");
 
-        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         // Start with PrivateKeyEntry
         {
             KeyFactory keyFact = KeyFactory.getInstance("RSA");
-            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
             final Certificate[] expectedChain = new Certificate[2];
-            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
+            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
             expectedChain[1] = caCert;
 
             PrivateKeyEntry expectedPrivEntry = new PrivateKeyEntry(expectedKey, expectedChain);
@@ -1372,7 +2111,8 @@
                     actualEntry instanceof PrivateKeyEntry);
 
             PrivateKeyEntry actualPrivEntry = (PrivateKeyEntry) actualEntry;
-            assertPrivateKeyEntryEquals(actualPrivEntry, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+            assertPrivateKeyEntryEquals(actualPrivEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
+                    FAKE_RSA_CA_1);
         }
 
         // Replace with TrustedCertificateEntry
@@ -1400,14 +2140,14 @@
 
         final CertificateFactory f = CertificateFactory.getInstance("X.509");
 
-        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         // Start with PrivateKeyEntry
         {
             KeyFactory keyFact = KeyFactory.getInstance("RSA");
-            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
             final Certificate[] expectedChain = new Certificate[2];
-            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
+            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
             expectedChain[1] = caCert;
 
             PrivateKeyEntry expectedPrivEntry = new PrivateKeyEntry(expectedKey, expectedChain);
@@ -1420,15 +2160,16 @@
                     actualEntry instanceof PrivateKeyEntry);
 
             PrivateKeyEntry actualPrivEntry = (PrivateKeyEntry) actualEntry;
-            assertPrivateKeyEntryEquals(actualPrivEntry, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+            assertPrivateKeyEntryEquals(actualPrivEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
+                    FAKE_RSA_CA_1);
         }
 
         // Replace with PrivateKeyEntry that has no chain
         {
             KeyFactory keyFact = KeyFactory.getInstance("RSA");
-            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
             final Certificate[] expectedChain = new Certificate[1];
-            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
+            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
 
             PrivateKeyEntry expectedPrivEntry = new PrivateKeyEntry(expectedKey, expectedChain);
 
@@ -1440,7 +2181,8 @@
                     actualEntry instanceof PrivateKeyEntry);
 
             PrivateKeyEntry actualPrivEntry = (PrivateKeyEntry) actualEntry;
-            assertPrivateKeyEntryEquals(actualPrivEntry, FAKE_KEY_1, FAKE_USER_1, null);
+            assertPrivateKeyEntryEquals(actualPrivEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
+                    null);
         }
     }
 
@@ -1453,7 +2195,7 @@
 
         // Insert TrustedCertificateEntry
         {
-            final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+            final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
             TrustedCertificateEntry expectedCertEntry = new TrustedCertificateEntry(caCert);
             mKeyStore.setEntry(TEST_ALIAS_1, expectedCertEntry, null);
@@ -1471,7 +2213,7 @@
         // Replace with TrustedCertificateEntry of USER
         {
             final Certificate userCert = f
-                    .generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
+                    .generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
 
             TrustedCertificateEntry expectedUserEntry = new TrustedCertificateEntry(userCert);
             mKeyStore.setEntry(TEST_ALIAS_1, expectedUserEntry, null);
@@ -1493,12 +2235,12 @@
 
         final CertificateFactory f = CertificateFactory.getInstance("X.509");
 
-        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         KeyFactory keyFact = KeyFactory.getInstance("RSA");
-        PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+        PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
         final Certificate[] chain = new Certificate[2];
-        chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
+        chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
         chain[1] = caCert;
 
         try {
@@ -1514,12 +2256,12 @@
 
         final CertificateFactory f = CertificateFactory.getInstance("X.509");
 
-        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         KeyFactory keyFact = KeyFactory.getInstance("RSA");
-        PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+        PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
         final Certificate[] chain = new Certificate[2];
-        chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
+        chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
         chain[1] = caCert;
 
         mKeyStore.setKeyEntry(TEST_ALIAS_1, privKey, null, chain);
@@ -1532,7 +2274,7 @@
 
         PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
 
-        assertPrivateKeyEntryEquals(actual, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+        assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1, FAKE_RSA_CA_1);
     }
 
     public void testKeyStore_SetKeyEntry_Replaced_Encrypted_Success() throws Exception {
@@ -1541,14 +2283,14 @@
 
         final CertificateFactory f = CertificateFactory.getInstance("X.509");
 
-        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         // Insert initial key
         {
             KeyFactory keyFact = KeyFactory.getInstance("RSA");
-            PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+            PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
             final Certificate[] chain = new Certificate[2];
-            chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
+            chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
             chain[1] = caCert;
 
             mKeyStore.setKeyEntry(TEST_ALIAS_1, privKey, null, chain);
@@ -1561,16 +2303,17 @@
 
             PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
 
-            assertPrivateKeyEntryEquals(actual, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+            assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
+                    FAKE_RSA_CA_1);
         }
 
         // TODO make a separate key
         // Replace key
         {
             KeyFactory keyFact = KeyFactory.getInstance("RSA");
-            PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+            PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
             final Certificate[] chain = new Certificate[2];
-            chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
+            chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
             chain[1] = caCert;
 
             mKeyStore.setKeyEntry(TEST_ALIAS_1, privKey, null, chain);
@@ -1583,7 +2326,8 @@
 
             PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
 
-            assertPrivateKeyEntryEquals(actual, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+            assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
+                    FAKE_RSA_CA_1);
         }
     }
 
@@ -1635,7 +2379,7 @@
         {
             final String privateKeyAlias = Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1;
             assertTrue(mAndroidKeyStore.generate(privateKeyAlias, KeyStore.UID_SELF,
-                    KeyStore.FLAG_ENCRYPTED));
+                    NativeCrypto.EVP_PKEY_RSA, 1024, KeyStore.FLAG_ENCRYPTED, null));
 
             Key key = mKeyStore.getKey(TEST_ALIAS_1, null);
 
@@ -1691,7 +2435,7 @@
         {
             final String privateKeyAlias = Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1;
             assertTrue(mAndroidKeyStore.generate(privateKeyAlias, KeyStore.UID_SELF,
-                    KeyStore.FLAG_ENCRYPTED));
+                    NativeCrypto.EVP_PKEY_RSA, 1024, KeyStore.FLAG_ENCRYPTED, null));
 
             X509Certificate cert = generateCertificate(mAndroidKeyStore, TEST_ALIAS_1,
                     TEST_SERIAL_1, TEST_DN_1, NOW, NOW_PLUS_10_YEARS);
@@ -1704,7 +2448,7 @@
         {
             final String privateKeyAlias = Credentials.USER_PRIVATE_KEY + TEST_ALIAS_2;
             assertTrue(mAndroidKeyStore.generate(privateKeyAlias, KeyStore.UID_SELF,
-                    KeyStore.FLAG_ENCRYPTED));
+                    NativeCrypto.EVP_PKEY_RSA, 1024, KeyStore.FLAG_ENCRYPTED, null));
 
             X509Certificate cert = generateCertificate(mAndroidKeyStore, TEST_ALIAS_2,
                     TEST_SERIAL_2, TEST_DN_2, NOW, NOW_PLUS_10_YEARS);
@@ -1736,7 +2480,8 @@
         {
             final String privateKeyAlias = Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1;
             assertTrue(mAndroidKeyStore.generate(privateKeyAlias,
-                    android.security.KeyStore.UID_SELF, android.security.KeyStore.FLAG_NONE));
+                    android.security.KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA, 1024,
+                    android.security.KeyStore.FLAG_NONE, null));
 
             X509Certificate cert =
                     generateCertificate(mAndroidKeyStore, TEST_ALIAS_1, TEST_SERIAL_1, TEST_DN_1,
@@ -1774,20 +2519,21 @@
         setupPassword();
         mKeyStore.load(null, null);
 
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         assertEquals("The keystore size should match expected", 1, mKeyStore.size());
         assertAliases(new String[] { TEST_ALIAS_1 });
 
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         assertEquals("The keystore size should match expected", 2, mKeyStore.size());
         assertAliases(new String[] { TEST_ALIAS_1, TEST_ALIAS_2 });
 
         assertTrue(mAndroidKeyStore.generate(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_3,
-                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+                KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA, 1024, KeyStore.FLAG_ENCRYPTED,
+                null));
 
         assertEquals("The keystore size should match expected", 3, mKeyStore.size());
         assertAliases(new String[] { TEST_ALIAS_1, TEST_ALIAS_2, TEST_ALIAS_3 });
@@ -1854,7 +2600,8 @@
     private void setupKey() throws Exception {
         final String privateKeyAlias = Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1;
         assertTrue(mAndroidKeyStore
-                .generate(privateKeyAlias, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+                .generate(privateKeyAlias, KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA, 1024,
+                        KeyStore.FLAG_ENCRYPTED, null));
 
         X509Certificate cert = generateCertificate(mAndroidKeyStore, TEST_ALIAS_1, TEST_SERIAL_1,
                 TEST_DN_1, NOW, NOW_PLUS_10_YEARS);
diff --git a/keystore/tests/src/android/security/KeyPairGeneratorSpecTest.java b/keystore/tests/src/android/security/KeyPairGeneratorSpecTest.java
index 113d730..bc8dd13 100644
--- a/keystore/tests/src/android/security/KeyPairGeneratorSpecTest.java
+++ b/keystore/tests/src/android/security/KeyPairGeneratorSpecTest.java
@@ -40,13 +40,17 @@
 
     public void testConstructor_Success() throws Exception {
         KeyPairGeneratorSpec spec =
-                new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, TEST_DN_1, SERIAL_1,
-                        NOW, NOW_PLUS_10_YEARS, 0);
+                new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, "RSA", 1024, null, TEST_DN_1,
+                        SERIAL_1, NOW, NOW_PLUS_10_YEARS, 0);
 
         assertEquals("Context should be the one specified", getContext(), spec.getContext());
 
         assertEquals("Alias should be the one specified", TEST_ALIAS_1, spec.getKeystoreAlias());
 
+        assertEquals("Key algorithm should be the one specified", "RSA", spec.getKeyType());
+
+        assertEquals("Key size should be the one specified", 1024, spec.getKeySize());
+
         assertEquals("subjectDN should be the one specified", TEST_DN_1, spec.getSubjectDN());
 
         assertEquals("startDate should be the one specified", NOW, spec.getStartDate());
@@ -57,6 +61,8 @@
     public void testBuilder_Success() throws Exception {
         KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(getContext())
                 .setAlias(TEST_ALIAS_1)
+                .setKeyType("RSA")
+                .setKeySize(1024)
                 .setSubject(TEST_DN_1)
                 .setSerialNumber(SERIAL_1)
                 .setStartDate(NOW)
@@ -68,6 +74,10 @@
 
         assertEquals("Alias should be the one specified", TEST_ALIAS_1, spec.getKeystoreAlias());
 
+        assertEquals("Key algorithm should be the one specified", "RSA", spec.getKeyType());
+
+        assertEquals("Key size should be the one specified", 1024, spec.getKeySize());
+
         assertEquals("subjectDN should be the one specified", TEST_DN_1, spec.getSubjectDN());
 
         assertEquals("startDate should be the one specified", NOW, spec.getStartDate());
@@ -79,7 +89,7 @@
 
     public void testConstructor_NullContext_Failure() throws Exception {
         try {
-            new KeyPairGeneratorSpec(null, TEST_ALIAS_1, TEST_DN_1, SERIAL_1, NOW,
+            new KeyPairGeneratorSpec(null, TEST_ALIAS_1, "RSA", 1024, null, TEST_DN_1, SERIAL_1, NOW,
                     NOW_PLUS_10_YEARS, 0);
             fail("Should throw IllegalArgumentException when context is null");
         } catch (IllegalArgumentException success) {
@@ -88,7 +98,7 @@
 
     public void testConstructor_NullKeystoreAlias_Failure() throws Exception {
         try {
-            new KeyPairGeneratorSpec(getContext(), null, TEST_DN_1, SERIAL_1, NOW,
+            new KeyPairGeneratorSpec(getContext(), null, "RSA", 1024, null, TEST_DN_1, SERIAL_1, NOW,
                     NOW_PLUS_10_YEARS, 0);
             fail("Should throw IllegalArgumentException when keystoreAlias is null");
         } catch (IllegalArgumentException success) {
@@ -97,7 +107,7 @@
 
     public void testConstructor_NullSubjectDN_Failure() throws Exception {
         try {
-            new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, null, SERIAL_1, NOW,
+            new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, "RSA", 1024, null, null, SERIAL_1, NOW,
                     NOW_PLUS_10_YEARS, 0);
             fail("Should throw IllegalArgumentException when subjectDN is null");
         } catch (IllegalArgumentException success) {
@@ -106,7 +116,7 @@
 
     public void testConstructor_NullSerial_Failure() throws Exception {
         try {
-            new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, TEST_DN_1, null, NOW,
+            new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, "RSA", 1024, null, TEST_DN_1, null, NOW,
                     NOW_PLUS_10_YEARS, 0);
             fail("Should throw IllegalArgumentException when startDate is null");
         } catch (IllegalArgumentException success) {
@@ -115,8 +125,8 @@
 
     public void testConstructor_NullStartDate_Failure() throws Exception {
         try {
-            new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, TEST_DN_1, SERIAL_1, null,
-                    NOW_PLUS_10_YEARS, 0);
+            new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, "RSA", 1024, null, TEST_DN_1, SERIAL_1,
+                    null, NOW_PLUS_10_YEARS, 0);
             fail("Should throw IllegalArgumentException when startDate is null");
         } catch (IllegalArgumentException success) {
         }
@@ -124,8 +134,8 @@
 
     public void testConstructor_NullEndDate_Failure() throws Exception {
         try {
-            new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, TEST_DN_1, SERIAL_1, NOW,
-                    null, 0);
+            new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, "RSA", 1024, null, TEST_DN_1, SERIAL_1,
+                    NOW, null, 0);
             fail("Should throw IllegalArgumentException when keystoreAlias is null");
         } catch (IllegalArgumentException success) {
         }
@@ -133,7 +143,7 @@
 
     public void testConstructor_EndBeforeStart_Failure() throws Exception {
         try {
-            new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, TEST_DN_1, SERIAL_1,
+            new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, "RSA", 1024, null, TEST_DN_1, SERIAL_1,
                     NOW_PLUS_10_YEARS, NOW, 0);
             fail("Should throw IllegalArgumentException when end is before start");
         } catch (IllegalArgumentException success) {
diff --git a/keystore/tests/src/android/security/KeyStoreTest.java b/keystore/tests/src/android/security/KeyStoreTest.java
index 9bf88d3..7a142cc 100644
--- a/keystore/tests/src/android/security/KeyStoreTest.java
+++ b/keystore/tests/src/android/security/KeyStoreTest.java
@@ -22,6 +22,7 @@
 import android.test.ActivityUnitTestCase;
 import android.test.AssertionFailedError;
 import android.test.suitebuilder.annotation.MediumTest;
+import com.android.org.conscrypt.NativeCrypto;
 import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 import java.util.Date;
@@ -347,21 +348,24 @@
 
     public void testGenerate_NotInitialized_Fail() throws Exception {
         assertFalse("Should fail when keystore is not initialized",
-                mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+                mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA,
+                        1024, KeyStore.FLAG_ENCRYPTED, null));
     }
 
     public void testGenerate_Locked_Fail() throws Exception {
         mKeyStore.password(TEST_PASSWD);
         mKeyStore.lock();
         assertFalse("Should fail when keystore is locked",
-                mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+                mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA,
+                        1024, KeyStore.FLAG_ENCRYPTED, null));
     }
 
     public void testGenerate_Success() throws Exception {
         assertTrue(mKeyStore.password(TEST_PASSWD));
 
         assertTrue("Should be able to generate key when unlocked",
-                mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+                mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA,
+                        1024, KeyStore.FLAG_ENCRYPTED, null));
         assertTrue(mKeyStore.contains(TEST_KEYNAME));
         assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.WIFI_UID));
     }
@@ -370,7 +374,8 @@
         assertTrue(mKeyStore.password(TEST_PASSWD));
 
         assertTrue("Should be able to generate key when unlocked",
-                mKeyStore.generate(TEST_KEYNAME, Process.WIFI_UID, KeyStore.FLAG_ENCRYPTED));
+                mKeyStore.generate(TEST_KEYNAME, Process.WIFI_UID, NativeCrypto.EVP_PKEY_RSA,
+                        1024, KeyStore.FLAG_ENCRYPTED, null));
         assertTrue(mKeyStore.contains(TEST_KEYNAME, Process.WIFI_UID));
         assertFalse(mKeyStore.contains(TEST_KEYNAME));
     }
@@ -378,7 +383,8 @@
     public void testGenerate_ungrantedUid_Bluetooth_Failure() throws Exception {
         assertTrue(mKeyStore.password(TEST_PASSWD));
 
-        assertFalse(mKeyStore.generate(TEST_KEYNAME, Process.BLUETOOTH_UID, KeyStore.FLAG_ENCRYPTED));
+        assertFalse(mKeyStore.generate(TEST_KEYNAME, Process.BLUETOOTH_UID,
+                    NativeCrypto.EVP_PKEY_RSA, 1024, KeyStore.FLAG_ENCRYPTED, null));
         assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.BLUETOOTH_UID));
         assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.WIFI_UID));
         assertFalse(mKeyStore.contains(TEST_KEYNAME));
@@ -424,7 +430,8 @@
     public void testSign_Success() throws Exception {
         mKeyStore.password(TEST_PASSWD);
 
-        assertTrue(mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+        assertTrue(mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA,
+                    1024, KeyStore.FLAG_ENCRYPTED, null));
         assertTrue(mKeyStore.contains(TEST_KEYNAME));
         final byte[] signature = mKeyStore.sign(TEST_KEYNAME, TEST_DATA);
 
@@ -434,7 +441,8 @@
     public void testVerify_Success() throws Exception {
         mKeyStore.password(TEST_PASSWD);
 
-        assertTrue(mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+        assertTrue(mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA,
+                    1024, KeyStore.FLAG_ENCRYPTED, null));
         assertTrue(mKeyStore.contains(TEST_KEYNAME));
         final byte[] signature = mKeyStore.sign(TEST_KEYNAME, TEST_DATA);
 
@@ -461,7 +469,8 @@
                 mKeyStore.password(TEST_PASSWD));
 
         assertTrue("Should be able to generate key for testcase",
-                mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+                mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA,
+                        1024, KeyStore.FLAG_ENCRYPTED, null));
 
         assertTrue("Should be able to grant key to other user",
                 mKeyStore.grant(TEST_KEYNAME, 0));
@@ -494,7 +503,8 @@
                 mKeyStore.password(TEST_PASSWD));
 
         assertTrue("Should be able to generate key for testcase",
-                mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+                mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA,
+                        1024, KeyStore.FLAG_ENCRYPTED, null));
 
         assertTrue("Should be able to grant key to other user",
                 mKeyStore.grant(TEST_KEYNAME, 0));
@@ -527,7 +537,8 @@
                 mKeyStore.password(TEST_PASSWD));
 
         assertTrue("Should be able to generate key for testcase",
-                mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+                mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA,
+                        1024, KeyStore.FLAG_ENCRYPTED, null));
 
         assertFalse("Should not be able to revoke not existent grant",
                 mKeyStore.ungrant(TEST_KEYNAME, 0));
@@ -538,7 +549,8 @@
                 mKeyStore.password(TEST_PASSWD));
 
         assertTrue("Should be able to generate key for testcase",
-                mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+                mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA,
+                        1024, KeyStore.FLAG_ENCRYPTED, null));
 
         assertTrue("Should be able to grant key to other user",
                 mKeyStore.grant(TEST_KEYNAME, 0));
@@ -555,7 +567,8 @@
                 mKeyStore.password(TEST_PASSWD));
 
         assertTrue("Should be able to generate key for testcase",
-                mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+                mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA,
+                        1024, KeyStore.FLAG_ENCRYPTED, null));
 
         assertTrue("Should be able to grant key to other user",
                 mKeyStore.grant(TEST_KEYNAME, 0));
@@ -575,7 +588,8 @@
 
         assertFalse(mKeyStore.contains(TEST_KEYNAME));
 
-        assertTrue(mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+        assertTrue(mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA,
+                    1024, KeyStore.FLAG_ENCRYPTED, null));
 
         assertTrue(mKeyStore.contains(TEST_KEYNAME));
         assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.WIFI_UID));
@@ -613,7 +627,8 @@
 
         assertFalse(mKeyStore.contains(TEST_KEYNAME));
 
-        assertTrue(mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+        assertTrue(mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA,
+                    1024, KeyStore.FLAG_ENCRYPTED, null));
 
         assertTrue(mKeyStore.contains(TEST_KEYNAME));
         assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.BLUETOOTH_UID));
diff --git a/media/java/android/media/RemoteControlClient.java b/media/java/android/media/RemoteControlClient.java
index 4dcac31..58f5d55 100644
--- a/media/java/android/media/RemoteControlClient.java
+++ b/media/java/android/media/RemoteControlClient.java
@@ -294,14 +294,13 @@
      */
     public final static int FLAG_KEY_MEDIA_POSITION_UPDATE = 1 << 8;
     /**
-     * @hide
-     * CANDIDATE FOR PUBLIC API
      * Flag indicating a RemoteControlClient supports ratings.
      * This flag must be set in order for components that display the RemoteControlClient
      * information, to display ratings information, and, if ratings are declared editable
      * (by calling {@link MetadataEditor#addEditableKey(int)} with the
      * {@link MetadataEditor#LONG_KEY_RATING_BY_USER} key), it will enable the user to rate
-     * the media.
+     * the media, with values being received through the interface set with
+     * {@link #setMetadataUpdateListener(OnMetadataUpdateListener)}.
      * @see #setTransportControlFlags(int)
      */
     public final static int FLAG_KEY_MEDIA_RATING = 1 << 9;
@@ -452,8 +451,6 @@
          */
         public final static int BITMAP_KEY_ARTWORK = 100;
         /**
-         * @hide
-         * CANDIDATE FOR PUBLIC API
          * The metadata key qualifying the content rating.
          * The value associated with this key may be: {@link #RATING_HEART},
          * {@link #RATING_THUMB_UP_DOWN}, or a non-null positive integer expressing a maximum
@@ -461,8 +458,6 @@
          */
         public final static int LONG_KEY_RATING_TYPE = 101;
         /**
-         * @hide
-         * CANDIDATE FOR PUBLIC API
          * The metadata key for the content's average rating, not the user's rating.
          * The value associated with this key may be: an integer value between 0 and 100,
          * or {@link #RATING_NOT_RATED} to express that no average rating is available.
@@ -472,11 +467,12 @@
          * <p></p>
          * When the rating type is:
          * <ul>
-         * <li>{@link #RATING_HEART}, a rating of 50 to 100 means "heart selected",</li>
-         * <li>{@link #RATING_THUMB_UP_DOWN}, a rating of 0 to 49 means "thumb down", 50 means
-         *     both "thumb up" and "thumb down" selected, 51 to 100 means "thumb up"</li>
+         * <li>{@link #RATING_HEART}, a rating of 51 to 100 means "heart selected",</li>
+         * <li>{@link #RATING_THUMB_UP_DOWN}, a rating of 0 to 50 means "thumb down",
+         *     51 to 100 means "thumb up"</li>
          * <li>a non-null positive integer, the rating value is mapped to the number of stars, e.g.
-         *     with a maximum of 5 stars, a rating of 21 to 40 maps to 2 stars.</li>
+         *     with a maximum of 5 stars, a rating of 0 maps to 0 stars, 1 to 20 maps to 1 star,
+         *     21 to 40 maps to 2 stars, etc.</li>
          * </ul>
          * @see #LONG_KEY_RATING_BY_USER
          */
@@ -489,34 +485,29 @@
          */
         public final static int KEY_EDITABLE_MASK = 0x1FFFFFFF;
         /**
-         * @hide
-         * CANDIDATE FOR PUBLIC API
-         * The metadata key for the content's rating by the user.
+         * The metadata key for the content's user rating.
          * The value associated with this key may be: an integer value between 0 and 100,
          * or {@link #RATING_NOT_RATED} to express that the user hasn't rated this content.
          * Rules for the interpretation of the rating value according to the rating style are
-         * the same as for {@link #LONG_KEY_RATING_BY_OTHERS}
+         * the same as for {@link #LONG_KEY_RATING_BY_OTHERS}.
+         * This key can be flagged as "editable" (with {@link #addEditableKey(int)}) to enable
+         * receiving user rating values through the
+         * {@link android.media.RemoteControlClient.OnMetadataUpdateListener} interface.
          */
         public final static int LONG_KEY_RATING_BY_USER = 0x10000001;
 
         /**
-         * @hide
-         * CANDIDATE FOR PUBLIC API
          * A rating style with a single degree of rating, "heart" vs "no heart". Can be used to
          * indicate the content referred to is a favorite (or not).
          * @see #LONG_KEY_RATING_TYPE
          */
         public final static long RATING_HEART = -1;
         /**
-         * @hide
-         * CANDIDATE FOR PUBLIC API
          * A rating style for "thumb up" vs "thumb down".
          * @see #LONG_KEY_RATING_TYPE
          */
         public final static long RATING_THUMB_UP_DOWN = -2;
         /**
-         * @hide
-         * CANDIDATE FOR PUBLIC API
          * A rating value indicating no rating is available.
          * @see #LONG_KEY_RATING_BY_OTHERS
          * @see #LONG_KEY_RATING_BY_USER
@@ -573,7 +564,9 @@
          *      {@link android.media.MediaMetadataRetriever#METADATA_KEY_DISC_NUMBER},
          *      {@link android.media.MediaMetadataRetriever#METADATA_KEY_DURATION} (with a value
          *      expressed in milliseconds),
-         *      {@link android.media.MediaMetadataRetriever#METADATA_KEY_YEAR}.
+         *      {@link android.media.MediaMetadataRetriever#METADATA_KEY_YEAR},
+         *      {@link #LONG_KEY_RATING_BY_OTHERS}, {@link #LONG_KEY_RATING_BY_USER},
+         *      {@link #LONG_KEY_RATING_TYPE}.
          * @param value The long value for the given key
          * @return Returns a reference to the same MetadataEditor object, so you can chain put
          *      calls together.
@@ -620,8 +613,9 @@
         /**
          * Clears all the metadata that has been set since the MetadataEditor instance was
          *     created with {@link RemoteControlClient#editMetadata(boolean)}.
+         * Note that clearing the metadata doesn't reset the editable keys
+         * (use {@link #clearEditableKeys()} instead).
          */
-        // TODO add in javadoc that this doesn't call clearEditableKeys()
         public synchronized void clear() {
             if (mApplied) {
                 Log.e(TAG, "Can't clear a previously applied MetadataEditor");
@@ -632,8 +626,11 @@
         }
 
         /**
-         * @hide
-         * CANDIDATE FOR PUBLIC API
+         * Flag the given key as being editable.
+         * This will declare the metadata field as eligible to be updated, with new values
+         * received through the {@link RemoteControlClient.OnMetadataUpdateListener} interface.
+         * @param key the type of metadata that can be edited. The supported key is
+         *     {@link #LONG_KEY_RATING_BY_USER}.
          */
         public synchronized void addEditableKey(int key) {
             if (mApplied) {
@@ -651,8 +648,7 @@
         }
 
         /**
-         * @hide
-         * CANDIDATE FOR PUBLIC API
+         * Causes all metadata fields to be read-only.
          */
         public synchronized void clearEditableKeys() {
             if (mApplied) {
@@ -869,7 +865,8 @@
      *      {@link #FLAG_KEY_MEDIA_STOP},
      *      {@link #FLAG_KEY_MEDIA_FAST_FORWARD},
      *      {@link #FLAG_KEY_MEDIA_NEXT},
-     *      {@link #FLAG_KEY_MEDIA_POSITION_UPDATE}
+     *      {@link #FLAG_KEY_MEDIA_POSITION_UPDATE},
+     *      {@link #FLAG_KEY_MEDIA_RATING}.
      */
     public void setTransportControlFlags(int transportControlFlags) {
         synchronized(mCacheLock) {
@@ -882,36 +879,39 @@
     }
 
     /**
-     * @hide
-     * CANDIDATE FOR PUBLIC API
-     * TODO ADD DESCRIPTION
+     * Interface definition for a callback to be invoked when one of the metadata values has
+     * been updated.
      */
     public interface OnMetadataUpdateListener  {
         /**
-         * TODO ADD DESCRIPTION
-         * @param key
-         * @param newValue
+         * Called on the implementer to notify that the metadata field for the given key has
+         * been updated to the new value of type <code>long</long>.
+         * @param key the identifier of the updated metadata field of type <code>long</long>.
+         * @param newValue the new <code>long</long> value for the key
          */
         void onMetadataUpdateLong(int key, long newValue);
         /**
-         * TODO ADD DESCRIPTION
-         * @param key
-         * @param newValue
+         * Called on the implementer to notify that the metadata field for the given key has
+         * been updated to the new <code>String</long>.
+         * @param key the identifier of the updated metadata field of type <code>String</long>.
+         * @param newValue the new <code>String</long> value for the key
          */
         void onMetadataUpdateString(int key, String newValue);
         /**
-         * TODO ADD DESCRIPTION
-         * @param key
-         * @param newValue
+         * Called on the implementer to notify that the metadata field for the given key has
+         * been updated to the new {@link android.graphics.Bitmap}.
+         * @param key the identifier of the updated metadata field of type
+         *     {@link android.graphics.Bitmap}.
+         * @param newValue the new {@link android.graphics.Bitmap} for the key
          */
         void onMetadataUpdateBitmap(int key, Bitmap newValue);
     }
 
     /**
-     * @hide
-     * CANDIDATE FOR PUBLIC API
-     * TODO ADD DESCRIPTION
-     * @param l
+     * Sets the listener to be called whenever the metadata is updated.
+     * New metadata values will be received in the same thread as the one in which
+     * RemoteControlClient was created.
+     * @param l the metadata update listener
      */
     public void setMetadataUpdateListener(OnMetadataUpdateListener l) {
         synchronized(mCacheLock) {
diff --git a/packages/DocumentsUI/Android.mk b/packages/DocumentsUI/Android.mk
index 853353d..7900953 100644
--- a/packages/DocumentsUI/Android.mk
+++ b/packages/DocumentsUI/Android.mk
@@ -5,7 +5,7 @@
 
 LOCAL_SRC_FILES := $(call all-subdir-java-files)
 
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4 guava
 
 LOCAL_PACKAGE_NAME := DocumentsUI
 LOCAL_CERTIFICATE := platform
diff --git a/packages/DocumentsUI/AndroidManifest.xml b/packages/DocumentsUI/AndroidManifest.xml
index 6cc92e3..45e2650 100644
--- a/packages/DocumentsUI/AndroidManifest.xml
+++ b/packages/DocumentsUI/AndroidManifest.xml
@@ -11,10 +11,7 @@
         <!-- TODO: allow rotation when state saving is in better shape -->
         <activity
             android:name=".DocumentsActivity"
-            android:finishOnCloseSystemDialogs="true"
-            android:excludeFromRecents="true"
-            android:theme="@android:style/Theme.Holo.Light"
-            android:screenOrientation="nosensor">
+            android:theme="@android:style/Theme.Holo.Light">
             <intent-filter android:priority="100">
                 <action android:name="android.intent.action.OPEN_DOCUMENT" />
                 <category android:name="android.intent.category.DEFAULT" />
@@ -37,7 +34,7 @@
             <intent-filter>
                 <action android:name="android.provider.action.MANAGE_DOCUMENTS" />
                 <category android:name="android.intent.category.DEFAULT" />
-                <data android:mimeType="vnd.android.doc/dir" />
+                <data android:mimeType="vnd.android.document/directory" />
             </intent-filter>
         </activity>
 
diff --git a/packages/DocumentsUI/res/values/strings.xml b/packages/DocumentsUI/res/values/strings.xml
index 928ba85..f4a822d 100644
--- a/packages/DocumentsUI/res/values/strings.xml
+++ b/packages/DocumentsUI/res/values/strings.xml
@@ -63,4 +63,6 @@
     <string name="more">More</string>
     <string name="loading">Loading\u2026</string>
 
+    <string name="share_via">Share via</string>
+
 </resources>
diff --git a/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java
index 6bc554f..e0b8d19 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java
@@ -20,7 +20,6 @@
 import android.app.Dialog;
 import android.app.DialogFragment;
 import android.app.FragmentManager;
-import android.content.ContentProviderClient;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -28,13 +27,13 @@
 import android.net.Uri;
 import android.os.Bundle;
 import android.provider.DocumentsContract;
-import android.provider.DocumentsContract.Documents;
+import android.provider.DocumentsContract.Document;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.widget.EditText;
 import android.widget.Toast;
 
-import com.android.documentsui.model.Document;
+import com.android.documentsui.model.DocumentInfo;
 
 /**
  * Dialog to create a new directory.
@@ -67,24 +66,17 @@
                 final String displayName = text1.getText().toString();
 
                 final DocumentsActivity activity = (DocumentsActivity) getActivity();
-                final Document cwd = activity.getCurrentDirectory();
+                final DocumentInfo cwd = activity.getCurrentDirectory();
 
-                final ContentProviderClient client = resolver.acquireUnstableContentProviderClient(
-                        cwd.uri.getAuthority());
                 try {
-                    final String docId = DocumentsContract.createDocument(client,
-                            DocumentsContract.getDocId(cwd.uri), Documents.MIME_TYPE_DIR,
-                            displayName);
+                    final Uri childUri = DocumentsContract.createDocument(
+                            resolver, cwd.uri, Document.MIME_TYPE_DIR, displayName);
 
                     // Navigate into newly created child
-                    final Uri childUri = DocumentsContract.buildDocumentUri(
-                            cwd.uri.getAuthority(), docId);
-                    final Document childDoc = Document.fromUri(resolver, childUri);
+                    final DocumentInfo childDoc = DocumentInfo.fromUri(resolver, childUri);
                     activity.onDocumentPicked(childDoc);
                 } catch (Exception e) {
                     Toast.makeText(context, R.string.save_error, Toast.LENGTH_SHORT).show();
-                } finally {
-                    ContentProviderClient.closeQuietly(client);
                 }
             }
         });
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
index 783b6ff..5b23ca5 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
@@ -17,12 +17,12 @@
 package com.android.documentsui;
 
 import static com.android.documentsui.DocumentsActivity.TAG;
-import static com.android.documentsui.DocumentsActivity.DisplayState.ACTION_MANAGE;
-import static com.android.documentsui.DocumentsActivity.DisplayState.MODE_GRID;
-import static com.android.documentsui.DocumentsActivity.DisplayState.MODE_LIST;
-import static com.android.documentsui.DocumentsActivity.DisplayState.SORT_ORDER_DISPLAY_NAME;
-import static com.android.documentsui.DocumentsActivity.DisplayState.SORT_ORDER_LAST_MODIFIED;
-import static com.android.documentsui.DocumentsActivity.DisplayState.SORT_ORDER_SIZE;
+import static com.android.documentsui.DocumentsActivity.State.ACTION_MANAGE;
+import static com.android.documentsui.DocumentsActivity.State.MODE_GRID;
+import static com.android.documentsui.DocumentsActivity.State.MODE_LIST;
+import static com.android.documentsui.model.DocumentInfo.getCursorInt;
+import static com.android.documentsui.model.DocumentInfo.getCursorLong;
+import static com.android.documentsui.model.DocumentInfo.getCursorString;
 
 import android.app.Fragment;
 import android.app.FragmentManager;
@@ -32,12 +32,14 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.Loader;
+import android.database.Cursor;
 import android.graphics.Bitmap;
 import android.graphics.Point;
 import android.net.Uri;
 import android.os.AsyncTask;
 import android.os.Bundle;
 import android.provider.DocumentsContract;
+import android.provider.DocumentsContract.Document;
 import android.text.format.DateUtils;
 import android.text.format.Formatter;
 import android.text.format.Time;
@@ -60,13 +62,13 @@
 import android.widget.TextView;
 import android.widget.Toast;
 
-import com.android.documentsui.DocumentsActivity.DisplayState;
-import com.android.documentsui.model.Document;
+import com.android.documentsui.DocumentsActivity.State;
+import com.android.documentsui.model.DocumentInfo;
+import com.android.documentsui.model.RootInfo;
 import com.android.internal.util.Predicate;
 import com.google.android.collect.Lists;
 
 import java.util.ArrayList;
-import java.util.Comparator;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -81,7 +83,7 @@
 
     private AbsListView mCurrentView;
 
-    private Predicate<Document> mFilter;
+    private Predicate<DocumentInfo> mFilter;
 
     public static final int TYPE_NORMAL = 1;
     public static final int TYPE_SEARCH = 2;
@@ -95,30 +97,38 @@
     private LoaderCallbacks<DirectoryResult> mCallbacks;
 
     private static final String EXTRA_TYPE = "type";
-    private static final String EXTRA_URI = "uri";
+    private static final String EXTRA_AUTHORITY = "authority";
+    private static final String EXTRA_ROOT_ID = "rootId";
+    private static final String EXTRA_DOC_ID = "docId";
+    private static final String EXTRA_QUERY = "query";
 
     private static AtomicInteger sLoaderId = new AtomicInteger(4000);
 
+    private int mLastSortOrder = -1;
+
     private final int mLoaderId = sLoaderId.incrementAndGet();
 
     public static void showNormal(FragmentManager fm, Uri uri) {
-        show(fm, TYPE_NORMAL, uri);
+        show(fm, TYPE_NORMAL, uri.getAuthority(), null, DocumentsContract.getDocumentId(uri), null);
     }
 
     public static void showSearch(FragmentManager fm, Uri uri, String query) {
-        final Uri searchUri = DocumentsContract.buildSearchUri(
-                uri.getAuthority(), DocumentsContract.getDocId(uri), query);
-        show(fm, TYPE_SEARCH, searchUri);
+        show(fm, TYPE_SEARCH, uri.getAuthority(), null, DocumentsContract.getDocumentId(uri),
+                query);
     }
 
     public static void showRecentsOpen(FragmentManager fm) {
-        show(fm, TYPE_RECENT_OPEN, null);
+        show(fm, TYPE_RECENT_OPEN, null, null, null, null);
     }
 
-    private static void show(FragmentManager fm, int type, Uri uri) {
+    private static void show(FragmentManager fm, int type, String authority, String rootId,
+            String docId, String query) {
         final Bundle args = new Bundle();
         args.putInt(EXTRA_TYPE, type);
-        args.putParcelable(EXTRA_URI, uri);
+        args.putString(EXTRA_AUTHORITY, authority);
+        args.putString(EXTRA_ROOT_ID, rootId);
+        args.putString(EXTRA_DOC_ID, docId);
+        args.putString(EXTRA_QUERY, query);
 
         final DirectoryFragment fragment = new DirectoryFragment();
         fragment.setArguments(args);
@@ -137,7 +147,6 @@
     public View onCreateView(
             LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
         final Context context = inflater.getContext();
-
         final View view = inflater.inflate(R.layout.fragment_directory, container, false);
 
         mEmptyView = view.findViewById(android.R.id.empty);
@@ -150,80 +159,77 @@
         mGridView.setOnItemClickListener(mItemListener);
         mGridView.setMultiChoiceModeListener(mMultiListener);
 
-        mAdapter = new DocumentsAdapter();
+        return view;
+    }
 
-        final Uri uri = getArguments().getParcelable(EXTRA_URI);
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+
+        final Context context = getActivity();
+
+        mAdapter = new DocumentsAdapter();
         mType = getArguments().getInt(EXTRA_TYPE);
 
         mCallbacks = new LoaderCallbacks<DirectoryResult>() {
             @Override
             public Loader<DirectoryResult> onCreateLoader(int id, Bundle args) {
-                final DisplayState state = getDisplayState(DirectoryFragment.this);
-                mFilter = new MimePredicate(state.acceptMimes);
+                final State state = getDisplayState(DirectoryFragment.this);
+
+                final String authority = getArguments().getString(EXTRA_AUTHORITY);
+                final String rootId = getArguments().getString(EXTRA_ROOT_ID);
+                final String docId = getArguments().getString(EXTRA_DOC_ID);
+                final String query = getArguments().getString(EXTRA_QUERY);
 
                 Uri contentsUri;
-                if (mType == TYPE_NORMAL) {
-                    contentsUri = DocumentsContract.buildChildrenUri(
-                            uri.getAuthority(), DocumentsContract.getDocId(uri));
-                } else if (mType == TYPE_RECENT_OPEN) {
-                    contentsUri = RecentsProvider.buildRecentOpen();
-                } else {
-                    contentsUri = uri;
-                }
+                switch (mType) {
+                    case TYPE_NORMAL:
+                        contentsUri = DocumentsContract.buildChildDocumentsUri(authority, docId);
+                        return new DirectoryLoader(context, rootId, contentsUri, state.sortOrder);
+                    case TYPE_SEARCH:
+                        contentsUri = DocumentsContract.buildSearchDocumentsUri(
+                                authority, docId, query);
+                        return new DirectoryLoader(context, rootId, contentsUri, state.sortOrder);
+                    case TYPE_RECENT_OPEN:
+                        final RootsCache roots = DocumentsApplication.getRootsCache(context);
+                        final List<RootInfo> matchingRoots = roots.getMatchingRoots(state);
+                        return new RecentLoader(context, matchingRoots);
+                    default:
+                        throw new IllegalStateException("Unknown type " + mType);
 
-                final Comparator<Document> sortOrder;
-                if (state.sortOrder == SORT_ORDER_LAST_MODIFIED || mType == TYPE_RECENT_OPEN) {
-                    sortOrder = new Document.LastModifiedComparator();
-                } else if (state.sortOrder == SORT_ORDER_DISPLAY_NAME) {
-                    sortOrder = new Document.DisplayNameComparator();
-                } else if (state.sortOrder == SORT_ORDER_SIZE) {
-                    sortOrder = new Document.SizeComparator();
-                } else {
-                    throw new IllegalArgumentException("Unknown sort order " + state.sortOrder);
                 }
-
-                return new DirectoryLoader(context, contentsUri, mType, null, sortOrder);
             }
 
             @Override
             public void onLoadFinished(Loader<DirectoryResult> loader, DirectoryResult result) {
-                mAdapter.swapDocuments(result.contents);
+                mAdapter.swapCursor(result.cursor);
             }
 
             @Override
             public void onLoaderReset(Loader<DirectoryResult> loader) {
-                mAdapter.swapDocuments(null);
+                mAdapter.swapCursor(null);
             }
         };
 
         updateDisplayState();
-
-        return view;
-    }
-
-    @Override
-    public void onStart() {
-        super.onStart();
-        getLoaderManager().restartLoader(mLoaderId, getArguments(), mCallbacks);
-    }
-
-    @Override
-    public void onStop() {
-        super.onStop();
-        getLoaderManager().destroyLoader(mLoaderId);
     }
 
     public void updateDisplayState() {
-        final DisplayState state = getDisplayState(this);
+        final State state = getDisplayState(this);
 
-        // TODO: avoid kicking loader when nothing changed
-        getLoaderManager().restartLoader(mLoaderId, getArguments(), mCallbacks);
+        if (mLastSortOrder != state.sortOrder) {
+            getLoaderManager().restartLoader(mLoaderId, null, mCallbacks);
+            mLastSortOrder = state.sortOrder;
+        }
+
         mListView.smoothScrollToPosition(0);
         mGridView.smoothScrollToPosition(0);
 
         mListView.setVisibility(state.mode == MODE_LIST ? View.VISIBLE : View.GONE);
         mGridView.setVisibility(state.mode == MODE_GRID ? View.VISIBLE : View.GONE);
 
+        mFilter = new MimePredicate(state.acceptMimes);
+
         final int choiceMode;
         if (state.allowMultiple) {
             choiceMode = ListView.CHOICE_MODE_MULTIPLE_MODAL;
@@ -258,7 +264,8 @@
     private OnItemClickListener mItemListener = new OnItemClickListener() {
         @Override
         public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-            final Document doc = mAdapter.getItem(position);
+            final Cursor cursor = mAdapter.getItem(position);
+            final DocumentInfo doc = DocumentInfo.fromDirectoryCursor(cursor);
             if (mFilter.apply(doc)) {
                 ((DocumentsActivity) getActivity()).onDocumentPicked(doc);
             }
@@ -274,7 +281,7 @@
 
         @Override
         public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
-            final DisplayState state = getDisplayState(DirectoryFragment.this);
+            final State state = getDisplayState(DirectoryFragment.this);
 
             final MenuItem open = menu.findItem(R.id.menu_open);
             final MenuItem share = menu.findItem(R.id.menu_share);
@@ -291,11 +298,12 @@
         @Override
         public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
             final SparseBooleanArray checked = mCurrentView.getCheckedItemPositions();
-            final ArrayList<Document> docs = Lists.newArrayList();
+            final ArrayList<DocumentInfo> docs = Lists.newArrayList();
             final int size = checked.size();
             for (int i = 0; i < size; i++) {
                 if (checked.valueAt(i)) {
-                    final Document doc = mAdapter.getItem(checked.keyAt(i));
+                    final Cursor cursor = mAdapter.getItem(checked.keyAt(i));
+                    final DocumentInfo doc = DocumentInfo.fromDirectoryCursor(cursor);
                     docs.add(doc);
                 }
             }
@@ -303,14 +311,17 @@
             final int id = item.getItemId();
             if (id == R.id.menu_open) {
                 DocumentsActivity.get(DirectoryFragment.this).onDocumentsPicked(docs);
+                mode.finish();
                 return true;
 
             } else if (id == R.id.menu_share) {
                 onShareDocuments(docs);
+                mode.finish();
                 return true;
 
             } else if (id == R.id.menu_delete) {
                 onDeleteDocuments(docs);
+                mode.finish();
                 return true;
 
             } else {
@@ -328,8 +339,9 @@
                 ActionMode mode, int position, long id, boolean checked) {
             if (checked) {
                 // Directories cannot be checked
-                final Document doc = mAdapter.getItem(position);
-                if (doc.isDirectory()) {
+                final Cursor cursor = mAdapter.getItem(position);
+                final String docMimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE);
+                if (Document.MIME_TYPE_DIR.equals(docMimeType)) {
                     mCurrentView.setItemChecked(position, false);
                 }
             }
@@ -339,36 +351,46 @@
         }
     };
 
-    private void onShareDocuments(List<Document> docs) {
-        final ArrayList<Uri> uris = Lists.newArrayList();
-        for (Document doc : docs) {
-            uris.add(doc.uri);
-        }
+    private void onShareDocuments(List<DocumentInfo> docs) {
+        Intent intent;
+        if (docs.size() == 1) {
+            final DocumentInfo doc = docs.get(0);
 
-        final Intent intent;
-        if (uris.size() > 1) {
-            intent = new Intent(Intent.ACTION_SEND_MULTIPLE);
-            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
-            intent.addCategory(Intent.CATEGORY_DEFAULT);
-            // TODO: find common mimetype
-            intent.setType("*/*");
-            intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
-        } else {
             intent = new Intent(Intent.ACTION_SEND);
             intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
             intent.addCategory(Intent.CATEGORY_DEFAULT);
-            intent.setData(uris.get(0));
+            intent.setType(doc.mimeType);
+            intent.putExtra(Intent.EXTRA_STREAM, doc.uri);
+
+        } else if (docs.size() > 1) {
+            intent = new Intent(Intent.ACTION_SEND_MULTIPLE);
+            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+            intent.addCategory(Intent.CATEGORY_DEFAULT);
+
+            final ArrayList<String> mimeTypes = Lists.newArrayList();
+            final ArrayList<Uri> uris = Lists.newArrayList();
+            for (DocumentInfo doc : docs) {
+                mimeTypes.add(doc.mimeType);
+                uris.add(doc.uri);
+            }
+
+            intent.setType(findCommonMimeType(mimeTypes));
+            intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
+
+        } else {
+            return;
         }
 
+        intent = Intent.createChooser(intent, getActivity().getText(R.string.share_via));
         startActivity(intent);
     }
 
-    private void onDeleteDocuments(List<Document> docs) {
+    private void onDeleteDocuments(List<DocumentInfo> docs) {
         final Context context = getActivity();
         final ContentResolver resolver = context.getContentResolver();
 
         boolean hadTrouble = false;
-        for (Document doc : docs) {
+        for (DocumentInfo doc : docs) {
             if (!doc.isDeleteSupported()) {
                 Log.w(TAG, "Skipping " + doc);
                 hadTrouble = true;
@@ -391,20 +413,17 @@
         }
     }
 
-    private static DisplayState getDisplayState(Fragment fragment) {
+    private static State getDisplayState(Fragment fragment) {
         return ((DocumentsActivity) fragment.getActivity()).getDisplayState();
     }
 
     private class DocumentsAdapter extends BaseAdapter {
-        private List<Document> mDocuments;
+        private Cursor mCursor;
 
-        public DocumentsAdapter() {
-        }
+        public void swapCursor(Cursor cursor) {
+            mCursor = cursor;
 
-        public void swapDocuments(List<Document> documents) {
-            mDocuments = documents;
-
-            if (mDocuments != null && mDocuments.isEmpty()) {
+            if (isEmpty()) {
                 mEmptyView.setVisibility(View.VISIBLE);
             } else {
                 mEmptyView.setVisibility(View.GONE);
@@ -416,7 +435,7 @@
         @Override
         public View getView(int position, View convertView, ViewGroup parent) {
             final Context context = parent.getContext();
-            final DisplayState state = getDisplayState(DirectoryFragment.this);
+            final State state = getDisplayState(DirectoryFragment.this);
 
             final RootsCache roots = DocumentsApplication.getRootsCache(context);
             final ThumbnailCache thumbs = DocumentsApplication.getThumbnailsCache(
@@ -433,7 +452,18 @@
                 }
             }
 
-            final Document doc = getItem(position);
+            final Cursor cursor = getItem(position);
+
+            final String docAuthority = getCursorString(cursor, RootCursorWrapper.COLUMN_AUTHORITY);
+            final String docRootId = getCursorString(cursor, RootCursorWrapper.COLUMN_ROOT_ID);
+            final String docId = getCursorString(cursor, Document.COLUMN_DOCUMENT_ID);
+            final String docMimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE);
+            final String docDisplayName = getCursorString(cursor, Document.COLUMN_DISPLAY_NAME);
+            final long docLastModified = getCursorLong(cursor, Document.COLUMN_LAST_MODIFIED);
+            final int docIcon = getCursorInt(cursor, Document.COLUMN_ICON);
+            final int docFlags = getCursorInt(cursor, Document.COLUMN_FLAGS);
+            final String docSummary = getCursorString(cursor, Document.COLUMN_SUMMARY);
+            final long docSize = getCursorLong(cursor, Document.COLUMN_SIZE);
 
             final ImageView icon = (ImageView) convertView.findViewById(android.R.id.icon);
             final TextView title = (TextView) convertView.findViewById(android.R.id.title);
@@ -448,32 +478,39 @@
                 oldTask.cancel(false);
             }
 
-            if (doc.isThumbnailSupported()) {
-                final Bitmap cachedResult = thumbs.get(doc.uri);
+            if ((docFlags & Document.FLAG_SUPPORTS_THUMBNAIL) != 0) {
+                final Uri uri = DocumentsContract.buildDocumentUri(docAuthority, docId);
+                final Bitmap cachedResult = thumbs.get(uri);
                 if (cachedResult != null) {
                     icon.setImageBitmap(cachedResult);
                 } else {
                     final ThumbnailAsyncTask task = new ThumbnailAsyncTask(icon, mThumbSize);
                     icon.setImageBitmap(null);
                     icon.setTag(task);
-                    task.execute(doc.uri);
+                    task.execute(uri);
                 }
+            } else if (docIcon != 0) {
+                icon.setImageDrawable(DocumentInfo.loadIcon(context, docAuthority, docIcon));
             } else {
-                icon.setImageDrawable(RootsCache.resolveDocumentIcon(context, doc.mimeType));
+                icon.setImageDrawable(RootsCache.resolveDocumentIcon(context, docMimeType));
             }
 
-            title.setText(doc.displayName);
+            title.setText(docDisplayName);
 
-            if (mType == TYPE_NORMAL || mType == TYPE_SEARCH) {
+            if (mType == TYPE_RECENT_OPEN) {
+                final RootInfo root = roots.getRoot(docAuthority, docRootId);
+                icon1.setVisibility(View.VISIBLE);
+                icon1.setImageDrawable(root.loadIcon(context));
+                summary.setText(root.getDirectoryString());
+                summary.setVisibility(View.VISIBLE);
+            } else {
                 icon1.setVisibility(View.GONE);
-                if (doc.summary != null) {
-                    summary.setText(doc.summary);
+                if (docSummary != null) {
+                    summary.setText(docSummary);
                     summary.setVisibility(View.VISIBLE);
                 } else {
                     summary.setVisibility(View.INVISIBLE);
                 }
-            } else if (mType == TYPE_RECENT_OPEN) {
-                // TODO: resolve storage root
             }
 
             if (summaryGrid != null) {
@@ -481,18 +518,18 @@
                         (summary.getVisibility() == View.VISIBLE) ? View.VISIBLE : View.GONE);
             }
 
-            if (doc.lastModified == -1) {
+            if (docLastModified == -1) {
                 date.setText(null);
             } else {
-                date.setText(formatTime(context, doc.lastModified));
+                date.setText(formatTime(context, docLastModified));
             }
 
             if (state.showSize) {
                 size.setVisibility(View.VISIBLE);
-                if (doc.isDirectory() || doc.size == -1) {
+                if (Document.MIME_TYPE_DIR.equals(docMimeType) || docSize == -1) {
                     size.setText(null);
                 } else {
-                    size.setText(Formatter.formatFileSize(context, doc.size));
+                    size.setText(Formatter.formatFileSize(context, docSize));
                 }
             } else {
                 size.setVisibility(View.GONE);
@@ -503,17 +540,20 @@
 
         @Override
         public int getCount() {
-            return mDocuments != null ? mDocuments.size() : 0;
+            return mCursor != null ? mCursor.getCount() : 0;
         }
 
         @Override
-        public Document getItem(int position) {
-            return mDocuments.get(position);
+        public Cursor getItem(int position) {
+            if (mCursor != null) {
+                mCursor.moveToPosition(position);
+            }
+            return mCursor;
         }
 
         @Override
         public long getItemId(int position) {
-            return getItem(position).uri.hashCode();
+            return position;
         }
     }
 
@@ -538,8 +578,8 @@
 
             Bitmap result = null;
             try {
-                result = DocumentsContract.getThumbnail(
-                        context.getContentResolver(), uri, mThumbSize);
+                result = DocumentsContract.getDocumentThumbnail(
+                        context.getContentResolver(), uri, mThumbSize, null);
                 if (result != null) {
                     final ThumbnailCache thumbs = DocumentsApplication.getThumbnailsCache(
                             context, mThumbSize);
@@ -580,4 +620,28 @@
 
         return DateUtils.formatDateTime(context, when, flags);
     }
+
+    private String findCommonMimeType(List<String> mimeTypes) {
+        String[] commonType = mimeTypes.get(0).split("/");
+        if (commonType.length != 2) {
+            return "*/*";
+        }
+
+        for (int i = 1; i < mimeTypes.size(); i++) {
+            String[] type = mimeTypes.get(i).split("/");
+            if (type.length != 2) continue;
+
+            if (!commonType[1].equals(type[1])) {
+                commonType[1] = "*";
+            }
+
+            if (!commonType[0].equals(type[0])) {
+                commonType[0] = "*";
+                commonType[1] = "*";
+                break;
+            }
+        }
+
+        return commonType[0] + "/" + commonType[1];
+    }
 }
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java
index 4ce5ef8..3f016b5 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java
@@ -16,98 +16,155 @@
 
 package com.android.documentsui;
 
-import static com.android.documentsui.DirectoryFragment.TYPE_NORMAL;
-import static com.android.documentsui.DirectoryFragment.TYPE_RECENT_OPEN;
-import static com.android.documentsui.DirectoryFragment.TYPE_SEARCH;
-import static com.android.documentsui.DocumentsActivity.TAG;
+import static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_DISPLAY_NAME;
+import static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_LAST_MODIFIED;
+import static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_SIZE;
 
-import android.content.ContentResolver;
+import android.content.AsyncTaskLoader;
+import android.content.ContentProviderClient;
 import android.content.Context;
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.CancellationSignal;
-import android.util.Log;
-
-import com.android.documentsui.model.Document;
-import com.android.internal.util.Predicate;
-import com.google.android.collect.Lists;
+import android.os.OperationCanceledException;
+import android.provider.DocumentsContract.Document;
 
 import libcore.io.IoUtils;
 
-import java.io.FileNotFoundException;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
 class DirectoryResult implements AutoCloseable {
+    ContentProviderClient client;
     Cursor cursor;
-    List<Document> contents = Lists.newArrayList();
-    Exception e;
+    Exception exception;
 
     @Override
-    public void close() throws Exception {
+    public void close() {
         IoUtils.closeQuietly(cursor);
+        ContentProviderClient.closeQuietly(client);
+        cursor = null;
+        client = null;
     }
 }
 
-public class DirectoryLoader extends UriDerivativeLoader<Uri, DirectoryResult> {
+public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> {
+    private final ForceLoadContentObserver mObserver = new ForceLoadContentObserver();
 
-    private final int mType;
-    private Predicate<Document> mFilter;
-    private Comparator<Document> mSortOrder;
+    private final String mRootId;
+    private final Uri mUri;
+    private final int mSortOrder;
 
-    public DirectoryLoader(Context context, Uri uri, int type, Predicate<Document> filter,
-            Comparator<Document> sortOrder) {
-        super(context, uri);
-        mType = type;
-        mFilter = filter;
+    private CancellationSignal mSignal;
+    private DirectoryResult mResult;
+
+    public DirectoryLoader(Context context, String rootId, Uri uri, int sortOrder) {
+        super(context);
+        mRootId = rootId;
+        mUri = uri;
         mSortOrder = sortOrder;
     }
 
     @Override
-    public DirectoryResult loadInBackground(Uri uri, CancellationSignal signal) {
+    public final DirectoryResult loadInBackground() {
+        synchronized (this) {
+            if (isLoadInBackgroundCanceled()) {
+                throw new OperationCanceledException();
+            }
+            mSignal = new CancellationSignal();
+        }
         final DirectoryResult result = new DirectoryResult();
+        final String authority = mUri.getAuthority();
         try {
-            loadInBackgroundInternal(result, uri, signal);
+            result.client = getContext()
+                    .getContentResolver().acquireUnstableContentProviderClient(authority);
+            final Cursor cursor = result.client.query(
+                    mUri, null, null, null, getQuerySortOrder(mSortOrder), mSignal);
+            final Cursor withRoot = new RootCursorWrapper(mUri.getAuthority(), mRootId, cursor, -1);
+            final Cursor sorted = new SortingCursorWrapper(withRoot, mSortOrder);
+
+            result.cursor = sorted;
+            result.cursor.registerContentObserver(mObserver);
         } catch (Exception e) {
-            result.e = e;
+            result.exception = e;
+            ContentProviderClient.closeQuietly(result.client);
+        } finally {
+            synchronized (this) {
+                mSignal = null;
+            }
         }
         return result;
     }
 
-    private void loadInBackgroundInternal(
-            DirectoryResult result, Uri uri, CancellationSignal signal) throws RuntimeException {
-        // TODO: switch to using unstable CPC
-        final ContentResolver resolver = getContext().getContentResolver();
-        final Cursor cursor = resolver.query(uri, null, null, null, null, signal);
-        result.cursor = cursor;
-        result.cursor.registerContentObserver(mObserver);
+    @Override
+    public void cancelLoadInBackground() {
+        super.cancelLoadInBackground();
 
-        while (cursor.moveToNext()) {
-            Document doc = null;
-            switch (mType) {
-                case TYPE_NORMAL:
-                case TYPE_SEARCH:
-                    doc = Document.fromDirectoryCursor(uri, cursor);
-                    break;
-                case TYPE_RECENT_OPEN:
-                    try {
-                        doc = Document.fromRecentOpenCursor(resolver, cursor);
-                    } catch (FileNotFoundException e) {
-                        Log.w(TAG, "Failed to find recent: " + e);
-                    }
-                    break;
-                default:
-                    throw new IllegalArgumentException("Unknown type");
-            }
-
-            if (doc != null && (mFilter == null || mFilter.apply(doc))) {
-                result.contents.add(doc);
+        synchronized (this) {
+            if (mSignal != null) {
+                mSignal.cancel();
             }
         }
+    }
 
-        if (mSortOrder != null) {
-            Collections.sort(result.contents, mSortOrder);
+    @Override
+    public void deliverResult(DirectoryResult result) {
+        if (isReset()) {
+            IoUtils.closeQuietly(result);
+            return;
+        }
+        DirectoryResult oldResult = mResult;
+        mResult = result;
+
+        if (isStarted()) {
+            super.deliverResult(result);
+        }
+
+        if (oldResult != null && oldResult != result) {
+            IoUtils.closeQuietly(oldResult);
+        }
+    }
+
+    @Override
+    protected void onStartLoading() {
+        if (mResult != null) {
+            deliverResult(mResult);
+        }
+        if (takeContentChanged() || mResult == null) {
+            forceLoad();
+        }
+    }
+
+    @Override
+    protected void onStopLoading() {
+        cancelLoad();
+    }
+
+    @Override
+    public void onCanceled(DirectoryResult result) {
+        IoUtils.closeQuietly(result);
+    }
+
+    @Override
+    protected void onReset() {
+        super.onReset();
+
+        // Ensure the loader is stopped
+        onStopLoading();
+
+        IoUtils.closeQuietly(mResult);
+        mResult = null;
+
+        getContext().getContentResolver().unregisterContentObserver(mObserver);
+    }
+
+    public static String getQuerySortOrder(int sortOrder) {
+        switch (sortOrder) {
+            case SORT_ORDER_DISPLAY_NAME:
+                return Document.COLUMN_DISPLAY_NAME + " ASC";
+            case SORT_ORDER_LAST_MODIFIED:
+                return Document.COLUMN_LAST_MODIFIED + " DESC";
+            case SORT_ORDER_SIZE:
+                return Document.COLUMN_SIZE + " DESC";
+            default:
+                return null;
         }
     }
 }
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DocumentChangedReceiver.java b/packages/DocumentsUI/src/com/android/documentsui/DocumentChangedReceiver.java
index 0ce5968..54f62ef 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DocumentChangedReceiver.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DocumentChangedReceiver.java
@@ -21,11 +21,10 @@
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
-import android.provider.DocumentsContract.DocumentRoot;
 import android.util.Log;
 
 /**
- * Handles {@link DocumentRoot} changes which invalidate cached data.
+ * Handles changes which invalidate cached data.
  */
 public class DocumentChangedReceiver extends BroadcastReceiver {
     @Override
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java
index 73ca8fa..f569f5a 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java
@@ -16,13 +16,13 @@
 
 package com.android.documentsui;
 
-import static com.android.documentsui.DocumentsActivity.DisplayState.ACTION_CREATE;
-import static com.android.documentsui.DocumentsActivity.DisplayState.ACTION_GET_CONTENT;
-import static com.android.documentsui.DocumentsActivity.DisplayState.ACTION_MANAGE;
-import static com.android.documentsui.DocumentsActivity.DisplayState.ACTION_OPEN;
-import static com.android.documentsui.DocumentsActivity.DisplayState.MODE_GRID;
-import static com.android.documentsui.DocumentsActivity.DisplayState.MODE_LIST;
-import static com.android.documentsui.DocumentsActivity.DisplayState.SORT_ORDER_LAST_MODIFIED;
+import static com.android.documentsui.DocumentsActivity.State.ACTION_CREATE;
+import static com.android.documentsui.DocumentsActivity.State.ACTION_GET_CONTENT;
+import static com.android.documentsui.DocumentsActivity.State.ACTION_MANAGE;
+import static com.android.documentsui.DocumentsActivity.State.ACTION_OPEN;
+import static com.android.documentsui.DocumentsActivity.State.MODE_GRID;
+import static com.android.documentsui.DocumentsActivity.State.MODE_LIST;
+import static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_LAST_MODIFIED;
 
 import android.app.ActionBar;
 import android.app.ActionBar.OnNavigationListener;
@@ -41,8 +41,8 @@
 import android.graphics.drawable.ColorDrawable;
 import android.net.Uri;
 import android.os.Bundle;
+import android.os.Parcel;
 import android.provider.DocumentsContract;
-import android.provider.DocumentsContract.DocumentRoot;
 import android.support.v4.app.ActionBarDrawerToggle;
 import android.support.v4.view.GravityCompat;
 import android.support.v4.widget.DrawerLayout;
@@ -60,32 +60,29 @@
 import android.widget.TextView;
 import android.widget.Toast;
 
-import com.android.documentsui.model.Document;
+import com.android.documentsui.model.DocumentInfo;
 import com.android.documentsui.model.DocumentStack;
+import com.android.documentsui.model.DurableUtils;
+import com.android.documentsui.model.RootInfo;
 
 import java.io.FileNotFoundException;
+import java.io.IOException;
 import java.util.Arrays;
 import java.util.List;
 
 public class DocumentsActivity extends Activity {
     public static final String TAG = "Documents";
 
-    private int mAction;
-
     private SearchView mSearchView;
 
     private View mRootsContainer;
     private DrawerLayout mDrawerLayout;
     private ActionBarDrawerToggle mDrawerToggle;
 
-    private final DisplayState mDisplayState = new DisplayState();
+    private static final String EXTRA_STATE = "state";
 
     private RootsCache mRoots;
-
-    /** Current user navigation stack; empty implies recents. */
-    private DocumentStack mStack = new DocumentStack();
-    /** Currently active search, overriding any stack. */
-    private String mCurrentSearch;
+    private State mState;
 
     @Override
     public void onCreate(Bundle icicle) {
@@ -93,59 +90,9 @@
 
         mRoots = DocumentsApplication.getRootsCache(this);
 
-        final Intent intent = getIntent();
-        final String action = intent.getAction();
-        if (Intent.ACTION_OPEN_DOCUMENT.equals(action)) {
-            mAction = ACTION_OPEN;
-        } else if (Intent.ACTION_CREATE_DOCUMENT.equals(action)) {
-            mAction = ACTION_CREATE;
-        } else if (Intent.ACTION_GET_CONTENT.equals(action)) {
-            mAction = ACTION_GET_CONTENT;
-        } else if (DocumentsContract.ACTION_MANAGE_DOCUMENTS.equals(action)) {
-            mAction = ACTION_MANAGE;
-        }
-
-        // TODO: unify action in single place
-        mDisplayState.action = mAction;
-
-        if (mAction == ACTION_OPEN || mAction == ACTION_GET_CONTENT) {
-            mDisplayState.allowMultiple = intent.getBooleanExtra(
-                    Intent.EXTRA_ALLOW_MULTIPLE, false);
-        }
-
-        if (mAction == ACTION_MANAGE) {
-            mDisplayState.acceptMimes = new String[] { "*/*" };
-            mDisplayState.allowMultiple = true;
-        } else if (intent.hasExtra(Intent.EXTRA_MIME_TYPES)) {
-            mDisplayState.acceptMimes = intent.getStringArrayExtra(Intent.EXTRA_MIME_TYPES);
-        } else {
-            mDisplayState.acceptMimes = new String[] { intent.getType() };
-        }
-
-        mDisplayState.localOnly = intent.getBooleanExtra(Intent.EXTRA_LOCAL_ONLY, false);
-
         setResult(Activity.RESULT_CANCELED);
         setContentView(R.layout.activity);
 
-        if (mAction == ACTION_CREATE) {
-            final String mimeType = getIntent().getType();
-            final String title = getIntent().getStringExtra(Intent.EXTRA_TITLE);
-            SaveFragment.show(getFragmentManager(), mimeType, title);
-        }
-
-        if (mAction == ACTION_GET_CONTENT) {
-            final Intent moreApps = new Intent(getIntent());
-            moreApps.setComponent(null);
-            moreApps.setPackage(null);
-            RootsFragment.show(getFragmentManager(), moreApps);
-        } else if (mAction == ACTION_OPEN || mAction == ACTION_CREATE) {
-            RootsFragment.show(getFragmentManager(), null);
-        }
-
-        if (mAction == ACTION_MANAGE) {
-            mDisplayState.sortOrder = SORT_ORDER_LAST_MODIFIED;
-        }
-
         mRootsContainer = findViewById(R.id.container_roots);
 
         mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
@@ -156,11 +103,73 @@
         mDrawerLayout.setDrawerListener(mDrawerListener);
         mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
 
-        if (mAction == ACTION_MANAGE) {
-            mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
+        if (icicle != null) {
+            mState = icicle.getParcelable(EXTRA_STATE);
+        } else {
+            buildDefaultState();
+        }
 
+        if (mState.action == ACTION_MANAGE) {
+            mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
+        }
+
+        if (mState.action == ACTION_CREATE) {
+            final String mimeType = getIntent().getType();
+            final String title = getIntent().getStringExtra(Intent.EXTRA_TITLE);
+            SaveFragment.show(getFragmentManager(), mimeType, title);
+        }
+
+        if (mState.action == ACTION_GET_CONTENT) {
+            final Intent moreApps = new Intent(getIntent());
+            moreApps.setComponent(null);
+            moreApps.setPackage(null);
+            RootsFragment.show(getFragmentManager(), moreApps);
+        } else if (mState.action == ACTION_OPEN || mState.action == ACTION_CREATE) {
+            RootsFragment.show(getFragmentManager(), null);
+        }
+
+        onCurrentDirectoryChanged();
+    }
+
+    private void buildDefaultState() {
+        mState = new State();
+
+        final Intent intent = getIntent();
+        final String action = intent.getAction();
+        if (Intent.ACTION_OPEN_DOCUMENT.equals(action)) {
+            mState.action = ACTION_OPEN;
+        } else if (Intent.ACTION_CREATE_DOCUMENT.equals(action)) {
+            mState.action = ACTION_CREATE;
+        } else if (Intent.ACTION_GET_CONTENT.equals(action)) {
+            mState.action = ACTION_GET_CONTENT;
+        } else if (DocumentsContract.ACTION_MANAGE_DOCUMENTS.equals(action)) {
+            mState.action = ACTION_MANAGE;
+        }
+
+        if (mState.action == ACTION_OPEN || mState.action == ACTION_GET_CONTENT) {
+            mState.allowMultiple = intent.getBooleanExtra(
+                    Intent.EXTRA_ALLOW_MULTIPLE, false);
+        }
+
+        if (mState.action == ACTION_MANAGE) {
+            mState.acceptMimes = new String[] { "*/*" };
+            mState.allowMultiple = true;
+        } else if (intent.hasExtra(Intent.EXTRA_MIME_TYPES)) {
+            mState.acceptMimes = intent.getStringArrayExtra(Intent.EXTRA_MIME_TYPES);
+        } else {
+            mState.acceptMimes = new String[] { intent.getType() };
+        }
+
+        mState.localOnly = intent.getBooleanExtra(Intent.EXTRA_LOCAL_ONLY, false);
+        mState.showAdvanced = SettingsActivity.getDisplayAdvancedDevices(this);
+
+        if (mState.action == ACTION_MANAGE) {
+            mState.sortOrder = SORT_ORDER_LAST_MODIFIED;
+        }
+
+        if (mState.action == ACTION_MANAGE) {
             final Uri rootUri = intent.getData();
-            final DocumentRoot root = mRoots.findRoot(rootUri);
+            final RootInfo root = mRoots.findRoot(rootUri);
             if (root != null) {
                 onRootPicked(root, true);
             } else {
@@ -169,8 +178,6 @@
             }
 
         } else {
-            mDrawerLayout.openDrawer(mRootsContainer);
-
             // Restore last stack for calling package
             // TODO: move into async loader
             final String packageName = getCallingPackage();
@@ -178,17 +185,17 @@
                     .query(RecentsProvider.buildResume(packageName), null, null, null, null);
             try {
                 if (cursor.moveToFirst()) {
-                    final String raw = cursor.getString(
+                    final byte[] rawStack = cursor.getBlob(
                             cursor.getColumnIndex(RecentsProvider.COL_PATH));
-                    mStack = DocumentStack.deserialize(getContentResolver(), raw);
+                    DurableUtils.readFromArray(rawStack, mState.stack);
                 }
-            } catch (FileNotFoundException e) {
+            } catch (IOException e) {
                 Log.w(TAG, "Failed to resume", e);
             } finally {
                 cursor.close();
             }
 
-            onCurrentDirectoryChanged();
+            mDrawerLayout.openDrawer(mRootsContainer);
         }
     }
 
@@ -196,10 +203,10 @@
     public void onStart() {
         super.onStart();
 
-        if (mAction == ACTION_MANAGE) {
-            mDisplayState.showSize = true;
+        if (mState.action == ACTION_MANAGE) {
+            mState.showSize = true;
         } else {
-            mDisplayState.showSize = SettingsActivity.getDisplayFileSize(this);
+            mState.showSize = SettingsActivity.getDisplayFileSize(this);
         }
     }
 
@@ -242,9 +249,9 @@
             actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
             actionBar.setIcon(new ColorDrawable());
 
-            if (mAction == ACTION_OPEN || mAction == ACTION_GET_CONTENT) {
+            if (mState.action == ACTION_OPEN || mState.action == ACTION_GET_CONTENT) {
                 actionBar.setTitle(R.string.title_open);
-            } else if (mAction == ACTION_CREATE) {
+            } else if (mState.action == ACTION_CREATE) {
                 actionBar.setTitle(R.string.title_save);
             }
 
@@ -252,7 +259,7 @@
             mDrawerToggle.setDrawerIndicatorEnabled(true);
 
         } else {
-            final DocumentRoot root = getCurrentRoot();
+            final RootInfo root = getCurrentRoot();
             actionBar.setIcon(root != null ? root.loadIcon(this) : null);
 
             if (mRoots.isRecentsRoot(root)) {
@@ -262,13 +269,13 @@
                 actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
                 actionBar.setTitle(null);
                 actionBar.setListNavigationCallbacks(mSortAdapter, mSortListener);
-                actionBar.setSelectedNavigationItem(mDisplayState.sortOrder);
+                actionBar.setSelectedNavigationItem(mState.sortOrder);
             }
 
-            if (mStack.size() > 1) {
+            if (mState.stack.size() > 1) {
                 actionBar.setDisplayHomeAsUpEnabled(true);
                 mDrawerToggle.setDrawerIndicatorEnabled(false);
-            } else if (mAction == ACTION_MANAGE) {
+            } else if (mState.action == ACTION_MANAGE) {
                 actionBar.setDisplayHomeAsUpEnabled(false);
                 mDrawerToggle.setDrawerIndicatorEnabled(false);
             } else {
@@ -288,7 +295,7 @@
         mSearchView.setOnQueryTextListener(new OnQueryTextListener() {
             @Override
             public boolean onQueryTextSubmit(String query) {
-                mCurrentSearch = query;
+                mState.currentSearch = query;
                 onCurrentDirectoryChanged();
                 mSearchView.setIconified(true);
                 return true;
@@ -303,7 +310,7 @@
         mSearchView.setOnCloseListener(new OnCloseListener() {
             @Override
             public boolean onClose() {
-                mCurrentSearch = null;
+                mState.currentSearch = null;
                 onCurrentDirectoryChanged();
                 return false;
             }
@@ -317,7 +324,7 @@
         super.onPrepareOptionsMenu(menu);
 
         final FragmentManager fm = getFragmentManager();
-        final Document cwd = getCurrentDirectory();
+        final DocumentInfo cwd = getCurrentDirectory();
 
         final MenuItem createDir = menu.findItem(R.id.menu_create_dir);
         final MenuItem search = menu.findItem(R.id.menu_search);
@@ -325,11 +332,11 @@
         final MenuItem list = menu.findItem(R.id.menu_list);
         final MenuItem settings = menu.findItem(R.id.menu_settings);
 
-        grid.setVisible(mDisplayState.mode != MODE_GRID);
-        list.setVisible(mDisplayState.mode != MODE_LIST);
+        grid.setVisible(mState.mode != MODE_GRID);
+        list.setVisible(mState.mode != MODE_LIST);
 
         final boolean searchVisible;
-        if (mAction == ACTION_CREATE) {
+        if (mState.action == ACTION_CREATE) {
             createDir.setVisible(cwd != null && cwd.isCreateSupported());
             searchVisible = false;
 
@@ -348,7 +355,7 @@
         // TODO: close any search in-progress when hiding
         search.setVisible(searchVisible);
 
-        settings.setVisible(mAction != ACTION_MANAGE);
+        settings.setVisible(mState.action != ACTION_MANAGE);
 
         return true;
     }
@@ -370,13 +377,13 @@
             return false;
         } else if (id == R.id.menu_grid) {
             // TODO: persist explicit user mode for cwd
-            mDisplayState.mode = MODE_GRID;
+            mState.mode = MODE_GRID;
             updateDisplayState();
             invalidateOptionsMenu();
             return true;
         } else if (id == R.id.menu_list) {
             // TODO: persist explicit user mode for cwd
-            mDisplayState.mode = MODE_LIST;
+            mState.mode = MODE_LIST;
             updateDisplayState();
             invalidateOptionsMenu();
             return true;
@@ -390,9 +397,9 @@
 
     @Override
     public void onBackPressed() {
-        final int size = mStack.size();
+        final int size = mState.stack.size();
         if (size > 1) {
-            mStack.pop();
+            mState.stack.pop();
             onCurrentDirectoryChanged();
         } else if (size == 1 && !mDrawerLayout.isDrawerOpen(mRootsContainer)) {
             // TODO: open root drawer once we can capture back key
@@ -402,11 +409,23 @@
         }
     }
 
+    @Override
+    protected void onSaveInstanceState(Bundle state) {
+        super.onSaveInstanceState(state);
+        state.putParcelable(EXTRA_STATE, mState);
+    }
+
+    @Override
+    protected void onRestoreInstanceState(Bundle state) {
+        super.onRestoreInstanceState(state);
+        updateActionBar();
+    }
+
     // TODO: support additional sort orders
     private BaseAdapter mSortAdapter = new BaseAdapter() {
         @Override
         public int getCount() {
-            return mDisplayState.showSize ? 3 : 2;
+            return mState.showSize ? 3 : 2;
         }
 
         @Override
@@ -438,8 +457,8 @@
             final TextView title = (TextView) convertView.findViewById(android.R.id.title);
             final TextView summary = (TextView) convertView.findViewById(android.R.id.summary);
 
-            if (mStack.size() > 0) {
-                title.setText(mStack.getTitle(mRoots));
+            if (mState.stack.size() > 0) {
+                title.setText(mState.stack.getTitle(mRoots));
             } else {
                 // No directory means recents
                 title.setText(R.string.root_recent);
@@ -467,43 +486,43 @@
     private OnNavigationListener mSortListener = new OnNavigationListener() {
         @Override
         public boolean onNavigationItemSelected(int itemPosition, long itemId) {
-            mDisplayState.sortOrder = itemPosition;
+            mState.sortOrder = itemPosition;
             updateDisplayState();
             return true;
         }
     };
 
-    public DocumentRoot getCurrentRoot() {
-        if (mStack.size() > 0) {
-            return mStack.getRoot(mRoots);
+    public RootInfo getCurrentRoot() {
+        if (mState.stack.size() > 0) {
+            return mState.stack.getRoot(mRoots);
         } else {
             return mRoots.getRecentsRoot();
         }
     }
 
-    public Document getCurrentDirectory() {
-        return mStack.peek();
+    public DocumentInfo getCurrentDirectory() {
+        return mState.stack.peek();
     }
 
-    public DisplayState getDisplayState() {
-        return mDisplayState;
+    public State getDisplayState() {
+        return mState;
     }
 
     private void onCurrentDirectoryChanged() {
         final FragmentManager fm = getFragmentManager();
-        final Document cwd = getCurrentDirectory();
+        final DocumentInfo cwd = getCurrentDirectory();
 
         if (cwd == null) {
             // No directory means recents
-            if (mAction == ACTION_CREATE) {
+            if (mState.action == ACTION_CREATE) {
                 RecentsCreateFragment.show(fm);
             } else {
                 DirectoryFragment.showRecentsOpen(fm);
             }
         } else {
-            if (mCurrentSearch != null) {
+            if (mState.currentSearch != null) {
                 // Ongoing search
-                DirectoryFragment.showSearch(fm, cwd.uri, mCurrentSearch);
+                DirectoryFragment.showSearch(fm, cwd.uri, mState.currentSearch);
             } else {
                 // Normal boring directory
                 DirectoryFragment.showNormal(fm, cwd.uri);
@@ -511,7 +530,7 @@
         }
 
         // Forget any replacement target
-        if (mAction == ACTION_CREATE) {
+        if (mState.action == ACTION_CREATE) {
             final SaveFragment save = SaveFragment.get(fm);
             if (save != null) {
                 save.setReplaceTarget(null);
@@ -529,18 +548,18 @@
     }
 
     public void onStackPicked(DocumentStack stack) {
-        mStack = stack;
+        mState.stack = stack;
         onCurrentDirectoryChanged();
     }
 
-    public void onRootPicked(DocumentRoot root, boolean closeDrawer) {
+    public void onRootPicked(RootInfo root, boolean closeDrawer) {
         // Clear entire backstack and start in new root
-        mStack.clear();
+        mState.stack.clear();
 
         if (!mRoots.isRecentsRoot(root)) {
             try {
-                final Uri uri = DocumentsContract.buildDocumentUri(root.authority, root.docId);
-                onDocumentPicked(Document.fromUri(getContentResolver(), uri));
+                final Uri uri = DocumentsContract.buildDocumentUri(root.authority, root.documentId);
+                onDocumentPicked(DocumentInfo.fromUri(getContentResolver(), uri));
             } catch (FileNotFoundException e) {
             }
         } else {
@@ -561,24 +580,24 @@
         finish();
     }
 
-    public void onDocumentPicked(Document doc) {
+    public void onDocumentPicked(DocumentInfo doc) {
         final FragmentManager fm = getFragmentManager();
         if (doc.isDirectory()) {
             // TODO: query display mode user preference for this dir
             if (doc.isGridPreferred()) {
-                mDisplayState.mode = MODE_GRID;
+                mState.mode = MODE_GRID;
             } else {
-                mDisplayState.mode = MODE_LIST;
+                mState.mode = MODE_LIST;
             }
-            mStack.push(doc);
+            mState.stack.push(doc);
             onCurrentDirectoryChanged();
-        } else if (mAction == ACTION_OPEN || mAction == ACTION_GET_CONTENT) {
+        } else if (mState.action == ACTION_OPEN || mState.action == ACTION_GET_CONTENT) {
             // Explicit file picked, return
             onFinished(doc.uri);
-        } else if (mAction == ACTION_CREATE) {
+        } else if (mState.action == ACTION_CREATE) {
             // Replace selected file
             SaveFragment.get(fm).setReplaceTarget(doc);
-        } else if (mAction == ACTION_MANAGE) {
+        } else if (mState.action == ACTION_MANAGE) {
             // Open the document
             final Intent intent = new Intent(Intent.ACTION_VIEW);
             intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
@@ -591,8 +610,8 @@
         }
     }
 
-    public void onDocumentsPicked(List<Document> docs) {
-        if (mAction == ACTION_OPEN || mAction == ACTION_GET_CONTENT) {
+    public void onDocumentsPicked(List<DocumentInfo> docs) {
+        if (mState.action == ACTION_OPEN || mState.action == ACTION_GET_CONTENT) {
             final int size = docs.size();
             final Uri[] uris = new Uri[size];
             for (int i = 0; i < size; i++) {
@@ -602,21 +621,19 @@
         }
     }
 
-    public void onSaveRequested(Document replaceTarget) {
+    public void onSaveRequested(DocumentInfo replaceTarget) {
         onFinished(replaceTarget.uri);
     }
 
     public void onSaveRequested(String mimeType, String displayName) {
-        final Document cwd = getCurrentDirectory();
+        final DocumentInfo cwd = getCurrentDirectory();
         final String authority = cwd.uri.getAuthority();
 
         final ContentProviderClient client = getContentResolver()
                 .acquireUnstableContentProviderClient(authority);
         try {
-            final String docId = DocumentsContract.createDocument(client,
-                    DocumentsContract.getDocId(cwd.uri), mimeType, displayName);
-
-            final Uri childUri = DocumentsContract.buildDocumentUri(authority, docId);
+            final Uri childUri = DocumentsContract.createDocument(
+                    getContentResolver(), cwd.uri, mimeType, displayName);
             onFinished(childUri);
         } catch (Exception e) {
             Toast.makeText(this, R.string.save_error, Toast.LENGTH_SHORT).show();
@@ -631,14 +648,14 @@
         final ContentResolver resolver = getContentResolver();
         final ContentValues values = new ContentValues();
 
-        final String rawStack = DocumentStack.serialize(mStack);
-        if (mAction == ACTION_CREATE) {
+        final byte[] rawStack = DurableUtils.writeToArrayOrNull(mState.stack);
+        if (mState.action == ACTION_CREATE) {
             // Remember stack for last create
             values.clear();
             values.put(RecentsProvider.COL_PATH, rawStack);
             resolver.insert(RecentsProvider.buildRecentCreate(), values);
 
-        } else if (mAction == ACTION_OPEN || mAction == ACTION_GET_CONTENT) {
+        } else if (mState.action == ACTION_OPEN || mState.action == ACTION_GET_CONTENT) {
             // Remember opened items
             for (Uri uri : uris) {
                 values.clear();
@@ -658,14 +675,14 @@
             intent.setData(uris[0]);
         } else if (uris.length > 1) {
             final ClipData clipData = new ClipData(
-                    null, mDisplayState.acceptMimes, new ClipData.Item(uris[0]));
+                    null, mState.acceptMimes, new ClipData.Item(uris[0]));
             for (int i = 1; i < uris.length; i++) {
                 clipData.addItem(new ClipData.Item(uris[i]));
             }
             intent.setClipData(clipData);
         }
 
-        if (mAction == ACTION_GET_CONTENT) {
+        if (mState.action == ACTION_GET_CONTENT) {
             intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
         } else {
             intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
@@ -677,7 +694,7 @@
         finish();
     }
 
-    public static class DisplayState {
+    public static class State implements android.os.Parcelable {
         public int action;
         public int mode = MODE_LIST;
         public String[] acceptMimes;
@@ -685,6 +702,12 @@
         public boolean allowMultiple = false;
         public boolean showSize = false;
         public boolean localOnly = false;
+        public boolean showAdvanced = false;
+
+        /** Current user navigation stack; empty implies recents. */
+        public DocumentStack stack = new DocumentStack();
+        /** Currently active search, overriding any stack. */
+        public String currentSearch;
 
         public static final int ACTION_OPEN = 1;
         public static final int ACTION_CREATE = 2;
@@ -697,11 +720,53 @@
         public static final int SORT_ORDER_DISPLAY_NAME = 0;
         public static final int SORT_ORDER_LAST_MODIFIED = 1;
         public static final int SORT_ORDER_SIZE = 2;
+
+        @Override
+        public int describeContents() {
+            return 0;
+        }
+
+        @Override
+        public void writeToParcel(Parcel out, int flags) {
+            out.writeInt(action);
+            out.writeInt(mode);
+            out.writeStringArray(acceptMimes);
+            out.writeInt(sortOrder);
+            out.writeInt(allowMultiple ? 1 : 0);
+            out.writeInt(showSize ? 1 : 0);
+            out.writeInt(localOnly ? 1 : 0);
+            out.writeInt(showAdvanced ? 1 : 0);
+            DurableUtils.writeToParcel(out, stack);
+            out.writeString(currentSearch);
+        }
+
+        public static final Creator<State> CREATOR = new Creator<State>() {
+            @Override
+            public State createFromParcel(Parcel in) {
+                final State state = new State();
+                state.action = in.readInt();
+                state.mode = in.readInt();
+                state.acceptMimes = in.readStringArray();
+                state.sortOrder = in.readInt();
+                state.allowMultiple = in.readInt() != 0;
+                state.showSize = in.readInt() != 0;
+                state.localOnly = in.readInt() != 0;
+                state.showAdvanced = in.readInt() != 0;
+                DurableUtils.readFromParcel(in, state.stack);
+                state.currentSearch = in.readString();
+                return state;
+            }
+
+            @Override
+            public State[] newArray(int size) {
+                return new State[size];
+            }
+        };
     }
 
     private void dumpStack() {
         Log.d(TAG, "Current stack:");
-        for (Document doc : mStack) {
+        for (DocumentInfo doc : mState.stack) {
             Log.d(TAG, "--> " + doc);
         }
     }
diff --git a/packages/DocumentsUI/src/com/android/documentsui/MimePredicate.java b/packages/DocumentsUI/src/com/android/documentsui/MimePredicate.java
index a9929de..15ad061 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/MimePredicate.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/MimePredicate.java
@@ -16,10 +16,10 @@
 
 package com.android.documentsui;
 
-import com.android.documentsui.model.Document;
+import com.android.documentsui.model.DocumentInfo;
 import com.android.internal.util.Predicate;
 
-public class MimePredicate implements Predicate<Document> {
+public class MimePredicate implements Predicate<DocumentInfo> {
     private final String[] mFilters;
 
     public MimePredicate(String[] filters) {
@@ -27,7 +27,7 @@
     }
 
     @Override
-    public boolean apply(Document doc) {
+    public boolean apply(DocumentInfo doc) {
         if (doc.isDirectory()) {
             return true;
         }
diff --git a/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java b/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java
new file mode 100644
index 0000000..756a297
--- /dev/null
+++ b/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java
@@ -0,0 +1,255 @@
+/*
+ * Copyright (C) 2013 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.documentsui;
+
+import static com.android.documentsui.DocumentsActivity.TAG;
+
+import android.content.AsyncTaskLoader;
+import android.content.ContentProviderClient;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.Cursor;
+import android.database.MergeCursor;
+import android.net.Uri;
+import android.provider.DocumentsContract;
+import android.provider.DocumentsContract.Root;
+import android.util.Log;
+
+import com.android.documentsui.DocumentsActivity.State;
+import com.android.documentsui.model.RootInfo;
+import com.google.android.collect.Maps;
+import com.google.common.collect.Lists;
+import com.google.common.util.concurrent.AbstractFuture;
+
+import libcore.io.IoUtils;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+public class RecentLoader extends AsyncTaskLoader<DirectoryResult> {
+
+    public static final int MAX_OUTSTANDING_RECENTS = 2;
+
+    /**
+     * Time to wait for first pass to complete before returning partial results.
+     */
+    public static final int MAX_FIRST_PASS_WAIT_MILLIS = 500;
+
+    /**
+     * Maximum documents from a single root.
+     */
+    public static final int MAX_DOCS_FROM_ROOT = 24;
+
+    private static final ExecutorService sExecutor = buildExecutor();
+
+    /**
+     * Create a bounded thread pool for fetching recents; it creates threads as
+     * needed (up to maximum) and reclaims them when finished.
+     */
+    private static ExecutorService buildExecutor() {
+        // Create a bounded thread pool for fetching recents; it creates
+        // threads as needed (up to maximum) and reclaims them when finished.
+        final ThreadPoolExecutor executor = new ThreadPoolExecutor(
+                MAX_OUTSTANDING_RECENTS, MAX_OUTSTANDING_RECENTS, 10, TimeUnit.SECONDS,
+                new LinkedBlockingQueue<Runnable>());
+        executor.allowCoreThreadTimeOut(true);
+        return executor;
+    }
+
+    private final List<RootInfo> mRoots;
+
+    private final HashMap<RootInfo, RecentTask> mTasks = Maps.newHashMap();
+
+    private final int mSortOrder = State.SORT_ORDER_LAST_MODIFIED;
+
+    private CountDownLatch mFirstPassLatch;
+    private volatile boolean mFirstPassDone;
+
+    private DirectoryResult mResult;
+
+    // TODO: create better transfer of ownership around cursor to ensure its
+    // closed in all edge cases.
+
+    public class RecentTask extends AbstractFuture<Cursor> implements Runnable, Closeable {
+        public final String authority;
+        public final String rootId;
+
+        private Cursor mWithRoot;
+
+        public RecentTask(String authority, String rootId) {
+            this.authority = authority;
+            this.rootId = rootId;
+        }
+
+        @Override
+        public void run() {
+            if (isCancelled()) return;
+
+            final ContentResolver resolver = getContext().getContentResolver();
+            final ContentProviderClient client = resolver.acquireUnstableContentProviderClient(
+                    authority);
+            try {
+                final Uri uri = DocumentsContract.buildRecentDocumentsUri(authority, rootId);
+                final Cursor cursor = client.query(
+                        uri, null, null, null, DirectoryLoader.getQuerySortOrder(mSortOrder));
+                mWithRoot = new RootCursorWrapper(authority, rootId, cursor, MAX_DOCS_FROM_ROOT);
+                set(mWithRoot);
+
+                mFirstPassLatch.countDown();
+                if (mFirstPassDone) {
+                    onContentChanged();
+                }
+
+            } catch (Exception e) {
+                setException(e);
+            } finally {
+                ContentProviderClient.closeQuietly(client);
+            }
+        }
+
+        @Override
+        public void close() throws IOException {
+            IoUtils.closeQuietly(mWithRoot);
+        }
+    }
+
+    public RecentLoader(Context context, List<RootInfo> roots) {
+        super(context);
+        mRoots = roots;
+    }
+
+    @Override
+    public DirectoryResult loadInBackground() {
+        if (mFirstPassLatch == null) {
+            // First time through we kick off all the recent tasks, and wait
+            // around to see if everyone finishes quickly.
+
+            for (RootInfo root : mRoots) {
+                if ((root.flags & Root.FLAG_SUPPORTS_RECENTS) != 0) {
+                    final RecentTask task = new RecentTask(root.authority, root.rootId);
+                    mTasks.put(root, task);
+                }
+            }
+
+            mFirstPassLatch = new CountDownLatch(mTasks.size());
+            for (RecentTask task : mTasks.values()) {
+                sExecutor.execute(task);
+            }
+
+            try {
+                mFirstPassLatch.await(MAX_FIRST_PASS_WAIT_MILLIS, TimeUnit.MILLISECONDS);
+                mFirstPassDone = true;
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        // Collect all finished tasks
+        List<Cursor> cursors = Lists.newArrayList();
+        for (RecentTask task : mTasks.values()) {
+            if (task.isDone()) {
+                try {
+                    cursors.add(task.get());
+                } catch (InterruptedException e) {
+                    throw new RuntimeException(e);
+                } catch (ExecutionException e) {
+                    Log.w(TAG, "Failed to load " + task.authority + ", " + task.rootId, e);
+                }
+            }
+        }
+
+        final DirectoryResult result = new DirectoryResult();
+        if (cursors.size() > 0) {
+            final MergeCursor merged = new MergeCursor(cursors.toArray(new Cursor[cursors.size()]));
+            final SortingCursorWrapper sorted = new SortingCursorWrapper(
+                    merged, State.SORT_ORDER_LAST_MODIFIED) {
+                @Override
+                public void close() {
+                    // Ignored, since we manage cursor lifecycle internally
+                }
+            };
+            result.cursor = sorted;
+        }
+        return result;
+    }
+
+    @Override
+    public void cancelLoadInBackground() {
+        super.cancelLoadInBackground();
+    }
+
+    @Override
+    public void deliverResult(DirectoryResult result) {
+        if (isReset()) {
+            IoUtils.closeQuietly(result);
+            return;
+        }
+        DirectoryResult oldResult = mResult;
+        mResult = result;
+
+        if (isStarted()) {
+            super.deliverResult(result);
+        }
+
+        if (oldResult != null && oldResult != result) {
+            IoUtils.closeQuietly(oldResult);
+        }
+    }
+
+    @Override
+    protected void onStartLoading() {
+        if (mResult != null) {
+            deliverResult(mResult);
+        }
+        if (takeContentChanged() || mResult == null) {
+            forceLoad();
+        }
+    }
+
+    @Override
+    protected void onStopLoading() {
+        cancelLoad();
+    }
+
+    @Override
+    public void onCanceled(DirectoryResult result) {
+        IoUtils.closeQuietly(result);
+    }
+
+    @Override
+    protected void onReset() {
+        super.onReset();
+
+        // Ensure the loader is stopped
+        onStopLoading();
+
+        for (RecentTask task : mTasks.values()) {
+            IoUtils.closeQuietly(task);
+        }
+
+        IoUtils.closeQuietly(mResult);
+        mResult = null;
+    }
+}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java b/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java
index 3447a51..fd7293d 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java
@@ -29,7 +29,6 @@
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.CancellationSignal;
-import android.provider.DocumentsContract.DocumentRoot;
 import android.text.TextUtils.TruncateAt;
 import android.util.Log;
 import android.view.LayoutInflater;
@@ -43,11 +42,14 @@
 import android.widget.TextView;
 
 import com.android.documentsui.model.DocumentStack;
+import com.android.documentsui.model.RootInfo;
 import com.google.android.collect.Lists;
 
 import libcore.io.IoUtils;
 
-import java.io.FileNotFoundException;
+import java.io.ByteArrayInputStream;
+import java.io.DataInputStream;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -138,12 +140,13 @@
                     uri, null, null, null, RecentsProvider.COL_TIMESTAMP + " DESC", signal);
             try {
                 while (cursor != null && cursor.moveToNext()) {
-                    final String rawStack = cursor.getString(
+                    final byte[] raw = cursor.getBlob(
                             cursor.getColumnIndex(RecentsProvider.COL_PATH));
                     try {
-                        final DocumentStack stack = DocumentStack.deserialize(resolver, rawStack);
+                        final DocumentStack stack = new DocumentStack();
+                        stack.read(new DataInputStream(new ByteArrayInputStream(raw)));
                         result.add(stack);
-                    } catch (FileNotFoundException e) {
+                    } catch (IOException e) {
                         Log.w(TAG, "Failed to resolve stack: " + e);
                     }
                 }
@@ -181,7 +184,7 @@
             final View summaryList = convertView.findViewById(R.id.summary_list);
 
             final DocumentStack stack = getItem(position);
-            final DocumentRoot root = stack.getRoot(roots);
+            final RootInfo root = stack.getRoot(roots);
             icon.setImageDrawable(root.loadIcon(context));
 
             final StringBuilder builder = new StringBuilder();
diff --git a/packages/DocumentsUI/src/com/android/documentsui/RecentsProvider.java b/packages/DocumentsUI/src/com/android/documentsui/RecentsProvider.java
index dbcb039..0c87783 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/RecentsProvider.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/RecentsProvider.java
@@ -61,6 +61,7 @@
     public static final String COL_PACKAGE_NAME = "package_name";
     public static final String COL_TIMESTAMP = "timestamp";
 
+    @Deprecated
     public static Uri buildRecentOpen() {
         return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
                 .authority(AUTHORITY).appendPath("recent_open").build();
diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootCursorWrapper.java b/packages/DocumentsUI/src/com/android/documentsui/RootCursorWrapper.java
new file mode 100644
index 0000000..d0e5ff6
--- /dev/null
+++ b/packages/DocumentsUI/src/com/android/documentsui/RootCursorWrapper.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2013 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.documentsui;
+
+import android.database.AbstractCursor;
+import android.database.Cursor;
+
+/**
+ * Cursor wrapper that adds columns to identify which root a document came from.
+ */
+public class RootCursorWrapper extends AbstractCursor {
+    private final String mAuthority;
+    private final String mRootId;
+
+    private final Cursor mCursor;
+    private final int mCount;
+
+    private final String[] mColumnNames;
+
+    private final int mAuthorityIndex;
+    private final int mRootIdIndex;
+
+    public static final String COLUMN_AUTHORITY = "android:authority";
+    public static final String COLUMN_ROOT_ID = "android:rootId";
+
+    public RootCursorWrapper(String authority, String rootId, Cursor cursor, int maxCount) {
+        mAuthority = authority;
+        mRootId = rootId;
+        mCursor = cursor;
+
+        final int count = cursor.getCount();
+        if (maxCount > 0 && count > maxCount) {
+            mCount = maxCount;
+        } else {
+            mCount = count;
+        }
+
+        if (cursor.getColumnIndex(COLUMN_AUTHORITY) != -1
+                || cursor.getColumnIndex(COLUMN_ROOT_ID) != -1) {
+            throw new IllegalArgumentException("Cursor contains internal columns!");
+        }
+        final String[] before = cursor.getColumnNames();
+        mColumnNames = new String[before.length + 2];
+        System.arraycopy(before, 0, mColumnNames, 0, before.length);
+        mAuthorityIndex = before.length;
+        mRootIdIndex = before.length + 1;
+        mColumnNames[mAuthorityIndex] = COLUMN_AUTHORITY;
+        mColumnNames[mRootIdIndex] = COLUMN_ROOT_ID;
+    }
+
+    @Override
+    public void close() {
+        super.close();
+        mCursor.close();
+    }
+
+    @Override
+    public boolean onMove(int oldPosition, int newPosition) {
+        return mCursor.moveToPosition(newPosition);
+    }
+
+    @Override
+    public String[] getColumnNames() {
+        return mColumnNames;
+    }
+
+    @Override
+    public int getCount() {
+        return mCount;
+    }
+
+    @Override
+    public double getDouble(int column) {
+        return mCursor.getDouble(column);
+    }
+
+    @Override
+    public float getFloat(int column) {
+        return mCursor.getFloat(column);
+    }
+
+    @Override
+    public int getInt(int column) {
+        return mCursor.getInt(column);
+    }
+
+    @Override
+    public long getLong(int column) {
+        return mCursor.getLong(column);
+    }
+
+    @Override
+    public short getShort(int column) {
+        return mCursor.getShort(column);
+    }
+
+    @Override
+    public String getString(int column) {
+        if (column == mAuthorityIndex) {
+            return mAuthority;
+        } else if (column == mRootIdIndex) {
+            return mRootId;
+        } else {
+            return mCursor.getString(column);
+        }
+    }
+
+    @Override
+    public int getType(int column) {
+        return mCursor.getType(column);
+    }
+
+    @Override
+    public boolean isNull(int column) {
+        return mCursor.isNull(column);
+    }
+
+}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java b/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java
index aa21457..0b10f19 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java
@@ -25,17 +25,23 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ProviderInfo;
 import android.content.pm.ResolveInfo;
+import android.database.Cursor;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.provider.DocumentsContract;
-import android.provider.DocumentsContract.DocumentRoot;
-import android.provider.DocumentsContract.Documents;
+import android.provider.DocumentsContract.Document;
+import android.provider.DocumentsContract.Root;
 import android.util.Log;
 
+import com.android.documentsui.DocumentsActivity.State;
+import com.android.documentsui.model.RootInfo;
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.util.Objects;
 import com.google.android.collect.Lists;
 
+import libcore.io.IoUtils;
+
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -46,11 +52,13 @@
     // TODO: cache roots in local provider to avoid spinning up backends
     // TODO: root updates should trigger UI refresh
 
+    private static final boolean RECENTS_ENABLED = true;
+
     private final Context mContext;
 
-    public List<DocumentRoot> mRoots = Lists.newArrayList();
+    public List<RootInfo> mRoots = Lists.newArrayList();
 
-    private DocumentRoot mRecentsRoot;
+    private RootInfo mRecentsRoot;
 
     public RootsCache(Context context) {
         mContext = context;
@@ -64,14 +72,13 @@
     public void update() {
         mRoots.clear();
 
-        {
+        if (RECENTS_ENABLED) {
             // Create special root for recents
-            final DocumentRoot root = new DocumentRoot();
-            root.rootType = DocumentRoot.ROOT_TYPE_SHORTCUT;
-            root.docId = null;
+            final RootInfo root = new RootInfo();
+            root.rootType = Root.ROOT_TYPE_SHORTCUT;
             root.icon = R.drawable.ic_dir;
+            root.flags = Root.FLAG_LOCAL_ONLY | Root.FLAG_SUPPORTS_CREATE;
             root.title = mContext.getString(R.string.root_recent);
-            root.summary = null;
             root.availableBytes = -1;
 
             mRoots.add(root);
@@ -89,28 +96,32 @@
 
                 // TODO: remove deprecated customRoots flag
                 // TODO: populate roots on background thread, and cache results
+                final Uri rootsUri = DocumentsContract.buildRootsUri(info.authority);
                 final ContentProviderClient client = resolver
                         .acquireUnstableContentProviderClient(info.authority);
+                Cursor cursor = null;
                 try {
-                    final List<DocumentRoot> roots = DocumentsContract.getDocumentRoots(client);
-                    for (DocumentRoot root : roots) {
-                        root.authority = info.authority;
+                    cursor = client.query(rootsUri, null, null, null, null);
+                    while (cursor.moveToNext()) {
+                        final RootInfo root = RootInfo.fromRootsCursor(info.authority, cursor);
+                        mRoots.add(root);
                     }
-                    mRoots.addAll(roots);
                 } catch (Exception e) {
                     Log.w(TAG, "Failed to load some roots from " + info.authority + ": " + e);
                 } finally {
+                    IoUtils.closeQuietly(cursor);
                     ContentProviderClient.closeQuietly(client);
                 }
             }
         }
     }
 
-    public DocumentRoot findRoot(Uri uri) {
+    @Deprecated
+    public RootInfo findRoot(Uri uri) {
         final String authority = uri.getAuthority();
-        final String docId = DocumentsContract.getDocId(uri);
-        for (DocumentRoot root : mRoots) {
-            if (Objects.equal(root.authority, authority) && Objects.equal(root.docId, docId)) {
+        final String docId = DocumentsContract.getDocumentId(uri);
+        for (RootInfo root : mRoots) {
+            if (Objects.equal(root.authority, authority) && Objects.equal(root.documentId, docId)) {
                 return root;
             }
         }
@@ -118,23 +129,87 @@
     }
 
     @GuardedBy("ActivityThread")
-    public DocumentRoot getRecentsRoot() {
+    public RootInfo getRoot(String authority, String rootId) {
+        for (RootInfo root : mRoots) {
+            if (Objects.equal(root.authority, authority) && Objects.equal(root.rootId, rootId)) {
+                return root;
+            }
+        }
+        return null;
+    }
+
+    @GuardedBy("ActivityThread")
+    public RootInfo getRecentsRoot() {
         return mRecentsRoot;
     }
 
     @GuardedBy("ActivityThread")
-    public boolean isRecentsRoot(DocumentRoot root) {
+    public boolean isRecentsRoot(RootInfo root) {
         return mRecentsRoot == root;
     }
 
     @GuardedBy("ActivityThread")
-    public List<DocumentRoot> getRoots() {
+    public List<RootInfo> getRoots() {
         return mRoots;
     }
 
+    /**
+     * Flags that declare explicit content types.
+     */
+    private static final int FLAGS_CONTENT_MASK = Root.FLAG_PROVIDES_IMAGES
+            | Root.FLAG_PROVIDES_AUDIO | Root.FLAG_PROVIDES_VIDEO;
+
+    @GuardedBy("ActivityThread")
+    public List<RootInfo> getMatchingRoots(State state) {
+
+        // Determine acceptable content flags
+        int includeFlags = 0;
+        for (String acceptMime : state.acceptMimes) {
+            final String[] type = acceptMime.split("/");
+            if (type.length != 2) continue;
+
+            if ("image".equals(type[0])) {
+                includeFlags |= Root.FLAG_PROVIDES_IMAGES;
+            } else if ("audio".equals(type[0])) {
+                includeFlags |= Root.FLAG_PROVIDES_AUDIO;
+            } else if ("video".equals(type[0])) {
+                includeFlags |= Root.FLAG_PROVIDES_VIDEO;
+            } else if ("*".equals(type[0])) {
+                includeFlags |= Root.FLAG_PROVIDES_IMAGES | Root.FLAG_PROVIDES_AUDIO
+                        | Root.FLAG_PROVIDES_VIDEO;
+            }
+        }
+
+        ArrayList<RootInfo> matching = Lists.newArrayList();
+        for (RootInfo root : mRoots) {
+            final boolean supportsCreate = (root.flags & Root.FLAG_SUPPORTS_CREATE) != 0;
+            final boolean advanced = (root.flags & Root.FLAG_ADVANCED) != 0;
+            final boolean localOnly = (root.flags & Root.FLAG_LOCAL_ONLY) != 0;
+
+            // Exclude read-only devices when creating
+            if (state.action == State.ACTION_CREATE && !supportsCreate) continue;
+            // Exclude advanced devices when not requested
+            if (!state.showAdvanced && advanced) continue;
+            // Exclude non-local devices when local only
+            if (state.localOnly && !localOnly) continue;
+
+            if ((root.flags & FLAGS_CONTENT_MASK) != 0) {
+                // This root offers specific content, so only include if the
+                // caller asked for that content type.
+                if ((root.flags & includeFlags) == 0) {
+                    // Sorry, no overlap.
+                    continue;
+                }
+            }
+
+            matching.add(root);
+        }
+        return matching;
+    }
+
     @GuardedBy("ActivityThread")
     public static Drawable resolveDocumentIcon(Context context, String mimeType) {
-        if (Documents.MIME_TYPE_DIR.equals(mimeType)) {
+        if (Document.MIME_TYPE_DIR.equals(mimeType)) {
             return context.getResources().getDrawable(R.drawable.ic_dir);
         } else {
             final PackageManager pm = context.getPackageManager();
diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java b/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java
index 2cfa841..ef3a31d 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java
@@ -16,8 +16,6 @@
 
 package com.android.documentsui;
 
-import static com.android.documentsui.DocumentsActivity.TAG;
-
 import android.app.Fragment;
 import android.app.FragmentManager;
 import android.app.FragmentTransaction;
@@ -26,9 +24,8 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.os.Bundle;
-import android.provider.DocumentsContract.DocumentRoot;
+import android.provider.DocumentsContract.Root;
 import android.text.format.Formatter;
-import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -39,8 +36,10 @@
 import android.widget.ListView;
 import android.widget.TextView;
 
+import com.android.documentsui.DocumentsActivity.State;
 import com.android.documentsui.SectionedListAdapter.SectionAdapter;
-import com.android.documentsui.model.Document;
+import com.android.documentsui.model.DocumentInfo;
+import com.android.documentsui.model.RootInfo;
 
 import java.util.Comparator;
 import java.util.List;
@@ -75,24 +74,31 @@
     public View onCreateView(
             LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
         final Context context = inflater.getContext();
-        final RootsCache roots = DocumentsApplication.getRootsCache(context);
 
         final View view = inflater.inflate(R.layout.fragment_roots, container, false);
         mList = (ListView) view.findViewById(android.R.id.list);
         mList.setOnItemClickListener(mItemListener);
 
-        final Intent includeApps = getArguments().getParcelable(EXTRA_INCLUDE_APPS);
-        mAdapter = new SectionedRootsAdapter(context, roots.getRoots(), includeApps);
-
         return view;
     }
 
     @Override
     public void onStart() {
         super.onStart();
+        updateRootsAdapter();
+    }
 
+    private void updateRootsAdapter() {
         final Context context = getActivity();
-        mAdapter.updateVisible(SettingsActivity.getDisplayAdvancedDevices(context));
+
+        final State state = ((DocumentsActivity) context).getDisplayState();
+        state.showAdvanced = SettingsActivity.getDisplayAdvancedDevices(context);
+
+        final RootsCache roots = DocumentsApplication.getRootsCache(context);
+        final List<RootInfo> matchingRoots = roots.getMatchingRoots(state);
+        final Intent includeApps = getArguments().getParcelable(EXTRA_INCLUDE_APPS);
+
+        mAdapter = new SectionedRootsAdapter(context, matchingRoots, includeApps);
         mList.setAdapter(mAdapter);
     }
 
@@ -101,8 +107,8 @@
         public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
             final DocumentsActivity activity = DocumentsActivity.get(RootsFragment.this);
             final Object item = mAdapter.getItem(position);
-            if (item instanceof DocumentRoot) {
-                activity.onRootPicked((DocumentRoot) item, true);
+            if (item instanceof RootInfo) {
+                activity.onRootPicked((RootInfo) item, true);
             } else if (item instanceof ResolveInfo) {
                 activity.onAppPicked((ResolveInfo) item);
             } else {
@@ -111,7 +117,7 @@
         }
     };
 
-    private static class RootsAdapter extends ArrayAdapter<DocumentRoot> implements SectionAdapter {
+    private static class RootsAdapter extends ArrayAdapter<RootInfo> implements SectionAdapter {
         private int mHeaderId;
 
         public RootsAdapter(Context context, int headerId) {
@@ -131,15 +137,13 @@
             final TextView title = (TextView) convertView.findViewById(android.R.id.title);
             final TextView summary = (TextView) convertView.findViewById(android.R.id.summary);
 
-            final DocumentRoot root = getItem(position);
+            final RootInfo root = getItem(position);
             icon.setImageDrawable(root.loadIcon(context));
             title.setText(root.title);
 
             // Device summary is always available space
             final String summaryText;
-            if ((root.rootType == DocumentRoot.ROOT_TYPE_DEVICE
-                    || root.rootType == DocumentRoot.ROOT_TYPE_DEVICE_ADVANCED)
-                    && root.availableBytes >= 0) {
+            if (root.rootType == Root.ROOT_TYPE_DEVICE && root.availableBytes >= 0) {
                 summaryText = context.getString(R.string.root_available_bytes,
                         Formatter.formatFileSize(context, root.availableBytes));
             } else {
@@ -212,31 +216,24 @@
         private final RootsAdapter mServices;
         private final RootsAdapter mShortcuts;
         private final RootsAdapter mDevices;
-        private final RootsAdapter mDevicesAdvanced;
         private final AppsAdapter mApps;
 
-        public SectionedRootsAdapter(Context context, List<DocumentRoot> roots, Intent includeApps) {
+        public SectionedRootsAdapter(Context context, List<RootInfo> roots, Intent includeApps) {
             mServices = new RootsAdapter(context, R.string.root_type_service);
             mShortcuts = new RootsAdapter(context, R.string.root_type_shortcut);
             mDevices = new RootsAdapter(context, R.string.root_type_device);
-            mDevicesAdvanced = new RootsAdapter(context, R.string.root_type_device);
             mApps = new AppsAdapter(context);
 
-            for (DocumentRoot root : roots) {
-                Log.d(TAG, "Found rootType=" + root.rootType);
+            for (RootInfo root : roots) {
                 switch (root.rootType) {
-                    case DocumentRoot.ROOT_TYPE_SERVICE:
+                    case Root.ROOT_TYPE_SERVICE:
                         mServices.add(root);
                         break;
-                    case DocumentRoot.ROOT_TYPE_SHORTCUT:
+                    case Root.ROOT_TYPE_SHORTCUT:
                         mShortcuts.add(root);
                         break;
-                    case DocumentRoot.ROOT_TYPE_DEVICE:
+                    case Root.ROOT_TYPE_DEVICE:
                         mDevices.add(root);
-                        mDevicesAdvanced.add(root);
-                        break;
-                    case DocumentRoot.ROOT_TYPE_DEVICE_ADVANCED:
-                        mDevicesAdvanced.add(root);
                         break;
                 }
             }
@@ -258,37 +255,36 @@
             mServices.sort(comp);
             mShortcuts.sort(comp);
             mDevices.sort(comp);
-            mDevicesAdvanced.sort(comp);
-        }
 
-        public void updateVisible(boolean showAdvanced) {
-            clearSections();
             if (mServices.getCount() > 0) {
                 addSection(mServices);
             }
             if (mShortcuts.getCount() > 0) {
                 addSection(mShortcuts);
             }
-
-            final RootsAdapter devices = showAdvanced ? mDevicesAdvanced : mDevices;
-            if (devices.getCount() > 0) {
-                addSection(devices);
+            if (mDevices.getCount() > 0) {
+                addSection(mDevices);
             }
-
             if (mApps.getCount() > 0) {
                 addSection(mApps);
             }
         }
     }
 
-    public static class RootComparator implements Comparator<DocumentRoot> {
+    public static class RootComparator implements Comparator<RootInfo> {
         @Override
-        public int compare(DocumentRoot lhs, DocumentRoot rhs) {
-            final int score = Document.compareToIgnoreCaseNullable(lhs.title, rhs.title);
+        public int compare(RootInfo lhs, RootInfo rhs) {
+            if (lhs.authority == null) {
+                return -1;
+            } else if (rhs.authority == null) {
+                return 1;
+            }
+
+            final int score = DocumentInfo.compareToIgnoreCaseNullable(lhs.title, rhs.title);
             if (score != 0) {
                 return score;
             } else {
-                return Document.compareToIgnoreCaseNullable(lhs.summary, rhs.summary);
+                return DocumentInfo.compareToIgnoreCaseNullable(lhs.summary, rhs.summary);
             }
         }
     }
diff --git a/packages/DocumentsUI/src/com/android/documentsui/SaveFragment.java b/packages/DocumentsUI/src/com/android/documentsui/SaveFragment.java
index 7e1a297..8b0a974 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/SaveFragment.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/SaveFragment.java
@@ -31,7 +31,7 @@
 import android.widget.EditText;
 import android.widget.ImageView;
 
-import com.android.documentsui.model.Document;
+import com.android.documentsui.model.DocumentInfo;
 
 /**
  * Display document title editor and save button.
@@ -39,7 +39,7 @@
 public class SaveFragment extends Fragment {
     public static final String TAG = "SaveFragment";
 
-    private Document mReplaceTarget;
+    private DocumentInfo mReplaceTarget;
     private EditText mDisplayName;
     private Button mSave;
     private boolean mIgnoreNextEdit;
@@ -128,7 +128,7 @@
      * without changing the filename. Can be set to {@code null} if user
      * navigates outside the target directory.
      */
-    public void setReplaceTarget(Document replaceTarget) {
+    public void setReplaceTarget(DocumentInfo replaceTarget) {
         mReplaceTarget = replaceTarget;
 
         if (mReplaceTarget != null) {
diff --git a/packages/DocumentsUI/src/com/android/documentsui/SortingCursorWrapper.java b/packages/DocumentsUI/src/com/android/documentsui/SortingCursorWrapper.java
new file mode 100644
index 0000000..b434a35
--- /dev/null
+++ b/packages/DocumentsUI/src/com/android/documentsui/SortingCursorWrapper.java
@@ -0,0 +1,256 @@
+/*
+ * Copyright (C) 2013 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.documentsui;
+
+import static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_DISPLAY_NAME;
+import static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_LAST_MODIFIED;
+import static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_SIZE;
+
+import android.database.AbstractCursor;
+import android.database.Cursor;
+import android.provider.DocumentsContract.Document;
+
+/**
+ * Cursor wrapper that presents a sorted view of the underlying cursor. Handles
+ * common {@link Document} sorting modes, such as ordering directories first.
+ */
+public class SortingCursorWrapper extends AbstractCursor {
+    private final Cursor mCursor;
+
+    private final int[] mPosition;
+    private final String[] mValueString;
+    private final long[] mValueLong;
+
+    public SortingCursorWrapper(Cursor cursor, int sortOrder) {
+        mCursor = cursor;
+
+        final int count = cursor.getCount();
+        mPosition = new int[count];
+        switch (sortOrder) {
+            case SORT_ORDER_DISPLAY_NAME:
+                mValueString = new String[count];
+                mValueLong = null;
+                break;
+            case SORT_ORDER_LAST_MODIFIED:
+            case SORT_ORDER_SIZE:
+                mValueString = null;
+                mValueLong = new long[count];
+                break;
+            default:
+                throw new IllegalArgumentException();
+        }
+
+        cursor.moveToPosition(-1);
+        for (int i = 0; i < count; i++) {
+            cursor.moveToNext();
+            mPosition[i] = i;
+
+            switch (sortOrder) {
+                case SORT_ORDER_DISPLAY_NAME:
+                    final String mimeType = cursor.getString(
+                            cursor.getColumnIndex(Document.COLUMN_MIME_TYPE));
+                    final String displayName = cursor.getString(
+                            cursor.getColumnIndex(Document.COLUMN_DISPLAY_NAME));
+                    if (Document.MIME_TYPE_DIR.equals(mimeType)) {
+                        mValueString[i] = '\001' + displayName;
+                    } else {
+                        mValueString[i] = displayName;
+                    }
+                    break;
+                case SORT_ORDER_LAST_MODIFIED:
+                    mValueLong[i] = cursor.getLong(
+                            cursor.getColumnIndex(Document.COLUMN_LAST_MODIFIED));
+                    break;
+                case SORT_ORDER_SIZE:
+                    mValueLong[i] = cursor.getLong(cursor.getColumnIndex(Document.COLUMN_SIZE));
+                    break;
+            }
+        }
+
+        switch (sortOrder) {
+            case SORT_ORDER_DISPLAY_NAME:
+                synchronized (SortingCursorWrapper.class) {
+
+                    binarySort(mPosition, mValueString);
+                }
+                break;
+            case SORT_ORDER_LAST_MODIFIED:
+            case SORT_ORDER_SIZE:
+                binarySort(mPosition, mValueLong);
+                break;
+        }
+    }
+
+    @Override
+    public void close() {
+        super.close();
+        mCursor.close();
+    }
+
+    @Override
+    public boolean onMove(int oldPosition, int newPosition) {
+        return mCursor.moveToPosition(mPosition[newPosition]);
+    }
+
+    @Override
+    public String[] getColumnNames() {
+        return mCursor.getColumnNames();
+    }
+
+    @Override
+    public int getCount() {
+        return mCursor.getCount();
+    }
+
+    @Override
+    public double getDouble(int column) {
+        return mCursor.getDouble(column);
+    }
+
+    @Override
+    public float getFloat(int column) {
+        return mCursor.getFloat(column);
+    }
+
+    @Override
+    public int getInt(int column) {
+        return mCursor.getInt(column);
+    }
+
+    @Override
+    public long getLong(int column) {
+        return mCursor.getLong(column);
+    }
+
+    @Override
+    public short getShort(int column) {
+        return mCursor.getShort(column);
+    }
+
+    @Override
+    public String getString(int column) {
+        return mCursor.getString(column);
+    }
+
+    @Override
+    public int getType(int column) {
+        return mCursor.getType(column);
+    }
+
+    @Override
+    public boolean isNull(int column) {
+        return mCursor.isNull(column);
+    }
+
+    /**
+     * Borrowed from TimSort.binarySort(), but modified to sort two column
+     * dataset.
+     */
+    private static void binarySort(int[] position, String[] value) {
+        final int count = position.length;
+        for (int start = 1; start < count; start++) {
+            final int pivotPosition = position[start];
+            final String pivotValue = value[start];
+
+            int left = 0;
+            int right = start;
+
+            while (left < right) {
+                int mid = (left + right) >>> 1;
+
+                final String lhs = pivotValue;
+                final String rhs = value[mid];
+                final int compare;
+                if (lhs == null) {
+                    compare = -1;
+                } else if (rhs == null) {
+                    compare = 1;
+                } else {
+                    compare = lhs.compareToIgnoreCase(rhs);
+                }
+
+                if (compare < 0) {
+                    right = mid;
+                } else {
+                    left = mid + 1;
+                }
+            }
+
+            int n = start - left;
+            switch (n) {
+                case 2:
+                    position[left + 2] = position[left + 1];
+                    value[left + 2] = value[left + 1];
+                case 1:
+                    position[left + 1] = position[left];
+                    value[left + 1] = value[left];
+                    break;
+                default:
+                    System.arraycopy(position, left, position, left + 1, n);
+                    System.arraycopy(value, left, value, left + 1, n);
+            }
+
+            position[left] = pivotPosition;
+            value[left] = pivotValue;
+        }
+    }
+
+    /**
+     * Borrowed from TimSort.binarySort(), but modified to sort two column
+     * dataset.
+     */
+    private static void binarySort(int[] position, long[] value) {
+        final int count = position.length;
+        for (int start = 1; start < count; start++) {
+            final int pivotPosition = position[start];
+            final long pivotValue = value[start];
+
+            int left = 0;
+            int right = start;
+
+            while (left < right) {
+                int mid = (left + right) >>> 1;
+
+                final long lhs = pivotValue;
+                final long rhs = value[mid];
+                final int compare = Long.compare(lhs, rhs);
+                if (compare > 0) {
+                    right = mid;
+                } else {
+                    left = mid + 1;
+                }
+            }
+
+            int n = start - left;
+            switch (n) {
+                case 2:
+                    position[left + 2] = position[left + 1];
+                    value[left + 2] = value[left + 1];
+                case 1:
+                    position[left + 1] = position[left];
+                    value[left + 1] = value[left];
+                    break;
+                default:
+                    System.arraycopy(position, left, position, left + 1, n);
+                    System.arraycopy(value, left, value, left + 1, n);
+            }
+
+            position[left] = pivotPosition;
+            value[left] = pivotValue;
+        }
+    }
+}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/TestActivity.java b/packages/DocumentsUI/src/com/android/documentsui/TestActivity.java
index f6548e8..2405cb5 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/TestActivity.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/TestActivity.java
@@ -32,7 +32,6 @@
 import libcore.io.IoUtils;
 import libcore.io.Streams;
 
-import java.io.IOException;
 import java.io.InputStream;
 
 public class TestActivity extends Activity {
@@ -50,8 +49,11 @@
         view.setOrientation(LinearLayout.VERTICAL);
 
         final CheckBox multiple = new CheckBox(context);
-        multiple.setText("ALLOW_MULTIPLE");
+        multiple.setText("\nALLOW_MULTIPLE\n");
         view.addView(multiple);
+        final CheckBox localOnly = new CheckBox(context);
+        localOnly.setText("\nLOCAL_ONLY\n");
+        view.addView(localOnly);
 
         Button button;
         button = new Button(context);
@@ -65,6 +67,9 @@
                 if (multiple.isChecked()) {
                     intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
                 }
+                if (localOnly.isChecked()) {
+                    intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
+                }
                 startActivityForResult(intent, 42);
             }
         });
@@ -81,6 +86,28 @@
                 if (multiple.isChecked()) {
                     intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
                 }
+                if (localOnly.isChecked()) {
+                    intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
+                }
+                startActivityForResult(intent, 42);
+            }
+        });
+        view.addView(button);
+
+        button = new Button(context);
+        button.setText("OPEN_DOC audio/ogg");
+        button.setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
+                intent.addCategory(Intent.CATEGORY_OPENABLE);
+                intent.setType("audio/ogg");
+                if (multiple.isChecked()) {
+                    intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
+                }
+                if (localOnly.isChecked()) {
+                    intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
+                }
                 startActivityForResult(intent, 42);
             }
         });
@@ -99,6 +126,9 @@
                 if (multiple.isChecked()) {
                     intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
                 }
+                if (localOnly.isChecked()) {
+                    intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
+                }
                 startActivityForResult(intent, 42);
             }
         });
@@ -113,6 +143,9 @@
                 intent.addCategory(Intent.CATEGORY_OPENABLE);
                 intent.setType("text/plain");
                 intent.putExtra(Intent.EXTRA_TITLE, "foobar.txt");
+                if (localOnly.isChecked()) {
+                    intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
+                }
                 startActivityForResult(intent, 42);
             }
         });
@@ -129,6 +162,9 @@
                 if (multiple.isChecked()) {
                     intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
                 }
+                if (localOnly.isChecked()) {
+                    intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
+                }
                 startActivityForResult(Intent.createChooser(intent, "Kittens!"), 42);
             }
         });
diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/Document.java b/packages/DocumentsUI/src/com/android/documentsui/model/Document.java
deleted file mode 100644
index 692d171..0000000
--- a/packages/DocumentsUI/src/com/android/documentsui/model/Document.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * Copyright (C) 2013 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.documentsui.model;
-
-import android.content.ContentResolver;
-import android.database.Cursor;
-import android.net.Uri;
-import android.provider.DocumentsContract;
-import android.provider.DocumentsContract.DocumentColumns;
-import android.provider.DocumentsContract.Documents;
-
-import com.android.documentsui.RecentsProvider;
-
-import libcore.io.IoUtils;
-
-import java.io.FileNotFoundException;
-import java.util.Comparator;
-
-/**
- * Representation of a single document.
- */
-public class Document {
-    public final Uri uri;
-    public final String mimeType;
-    public final String displayName;
-    public final long lastModified;
-    public final int flags;
-    public final String summary;
-    public final long size;
-
-    private Document(Uri uri, String mimeType, String displayName, long lastModified, int flags,
-            String summary, long size) {
-        this.uri = uri;
-        this.mimeType = mimeType;
-        this.displayName = displayName;
-        this.lastModified = lastModified;
-        this.flags = flags;
-        this.summary = summary;
-        this.size = size;
-    }
-
-    public static Document fromDirectoryCursor(Uri parent, Cursor cursor) {
-        final String authority = parent.getAuthority();
-        final String docId = getCursorString(cursor, DocumentColumns.DOC_ID);
-
-        final Uri uri = DocumentsContract.buildDocumentUri(authority, docId);
-        final String mimeType = getCursorString(cursor, DocumentColumns.MIME_TYPE);
-        final String displayName = getCursorString(cursor, DocumentColumns.DISPLAY_NAME);
-        final long lastModified = getCursorLong(cursor, DocumentColumns.LAST_MODIFIED);
-        final int flags = getCursorInt(cursor, DocumentColumns.FLAGS);
-        final String summary = getCursorString(cursor, DocumentColumns.SUMMARY);
-        final long size = getCursorLong(cursor, DocumentColumns.SIZE);
-
-        return new Document(uri, mimeType, displayName, lastModified, flags, summary, size);
-    }
-
-    @Deprecated
-    public static Document fromRecentOpenCursor(ContentResolver resolver, Cursor recentCursor)
-            throws FileNotFoundException {
-        final Uri uri = Uri.parse(getCursorString(recentCursor, RecentsProvider.COL_URI));
-        final long lastModified = getCursorLong(recentCursor, RecentsProvider.COL_TIMESTAMP);
-
-        Cursor cursor = null;
-        try {
-            cursor = resolver.query(uri, null, null, null, null);
-            if (!cursor.moveToFirst()) {
-                throw new FileNotFoundException("Missing details for " + uri);
-            }
-            final String mimeType = getCursorString(cursor, DocumentColumns.MIME_TYPE);
-            final String displayName = getCursorString(cursor, DocumentColumns.DISPLAY_NAME);
-            final int flags = getCursorInt(cursor, DocumentColumns.FLAGS)
-                    & Documents.FLAG_SUPPORTS_THUMBNAIL;
-            final String summary = getCursorString(cursor, DocumentColumns.SUMMARY);
-            final long size = getCursorLong(cursor, DocumentColumns.SIZE);
-
-            return new Document(uri, mimeType, displayName, lastModified, flags, summary, size);
-        } catch (Throwable t) {
-            throw asFileNotFoundException(t);
-        } finally {
-            IoUtils.closeQuietly(cursor);
-        }
-    }
-
-    public static Document fromUri(ContentResolver resolver, Uri uri) throws FileNotFoundException {
-        Cursor cursor = null;
-        try {
-            cursor = resolver.query(uri, null, null, null, null);
-            if (!cursor.moveToFirst()) {
-                throw new FileNotFoundException("Missing details for " + uri);
-            }
-            final String mimeType = getCursorString(cursor, DocumentColumns.MIME_TYPE);
-            final String displayName = getCursorString(cursor, DocumentColumns.DISPLAY_NAME);
-            final long lastModified = getCursorLong(cursor, DocumentColumns.LAST_MODIFIED);
-            final int flags = getCursorInt(cursor, DocumentColumns.FLAGS);
-            final String summary = getCursorString(cursor, DocumentColumns.SUMMARY);
-            final long size = getCursorLong(cursor, DocumentColumns.SIZE);
-
-            return new Document(uri, mimeType, displayName, lastModified, flags, summary, size);
-        } catch (Throwable t) {
-            throw asFileNotFoundException(t);
-        } finally {
-            IoUtils.closeQuietly(cursor);
-        }
-    }
-
-    @Override
-    public String toString() {
-        return "Document{name=" + displayName + ", uri=" + uri + "}";
-    }
-
-    public boolean isCreateSupported() {
-        return (flags & Documents.FLAG_SUPPORTS_CREATE) != 0;
-    }
-
-    public boolean isSearchSupported() {
-        return (flags & Documents.FLAG_SUPPORTS_SEARCH) != 0;
-    }
-
-    public boolean isThumbnailSupported() {
-        return (flags & Documents.FLAG_SUPPORTS_THUMBNAIL) != 0;
-    }
-
-    public boolean isDirectory() {
-        return Documents.MIME_TYPE_DIR.equals(mimeType);
-    }
-
-    public boolean isGridPreferred() {
-        return (flags & Documents.FLAG_PREFERS_GRID) != 0;
-    }
-
-    public boolean isDeleteSupported() {
-        return (flags & Documents.FLAG_SUPPORTS_DELETE) != 0;
-    }
-
-    private static String getCursorString(Cursor cursor, String columnName) {
-        final int index = cursor.getColumnIndex(columnName);
-        return (index != -1) ? cursor.getString(index) : null;
-    }
-
-    /**
-     * Missing or null values are returned as -1.
-     */
-    private static long getCursorLong(Cursor cursor, String columnName) {
-        final int index = cursor.getColumnIndex(columnName);
-        if (index == -1) return -1;
-        final String value = cursor.getString(index);
-        if (value == null) return -1;
-        try {
-            return Long.parseLong(value);
-        } catch (NumberFormatException e) {
-            return -1;
-        }
-    }
-
-    private static int getCursorInt(Cursor cursor, String columnName) {
-        final int index = cursor.getColumnIndex(columnName);
-        return (index != -1) ? cursor.getInt(index) : 0;
-    }
-
-    public static class DisplayNameComparator implements Comparator<Document> {
-        @Override
-        public int compare(Document lhs, Document rhs) {
-            final boolean leftDir = lhs.isDirectory();
-            final boolean rightDir = rhs.isDirectory();
-
-            if (leftDir != rightDir) {
-                return leftDir ? -1 : 1;
-            } else {
-                return compareToIgnoreCaseNullable(lhs.displayName, rhs.displayName);
-            }
-        }
-    }
-
-    public static class LastModifiedComparator implements Comparator<Document> {
-        @Override
-        public int compare(Document lhs, Document rhs) {
-            return Long.compare(rhs.lastModified, lhs.lastModified);
-        }
-    }
-
-    public static class SizeComparator implements Comparator<Document> {
-        @Override
-        public int compare(Document lhs, Document rhs) {
-            return Long.compare(rhs.size, lhs.size);
-        }
-    }
-
-    public static FileNotFoundException asFileNotFoundException(Throwable t)
-            throws FileNotFoundException {
-        if (t instanceof FileNotFoundException) {
-            throw (FileNotFoundException) t;
-        }
-        final FileNotFoundException fnfe = new FileNotFoundException(t.getMessage());
-        fnfe.initCause(t);
-        throw fnfe;
-    }
-
-    public static int compareToIgnoreCaseNullable(String lhs, String rhs) {
-        if (lhs == null) return -1;
-        if (rhs == null) return 1;
-        return lhs.compareToIgnoreCase(rhs);
-    }
-}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java
new file mode 100644
index 0000000..7721bcc
--- /dev/null
+++ b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java
@@ -0,0 +1,294 @@
+/*
+ * Copyright (C) 2013 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.documentsui.model;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.pm.ProviderInfo;
+import android.database.Cursor;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.provider.DocumentsContract;
+import android.provider.DocumentsContract.Document;
+
+import com.android.documentsui.RecentsProvider;
+import com.android.documentsui.RootCursorWrapper;
+
+import libcore.io.IoUtils;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.ProtocolException;
+import java.util.Comparator;
+
+/**
+ * Representation of a {@link Document}.
+ */
+public class DocumentInfo implements Durable {
+    private static final int VERSION_INIT = 1;
+
+    public Uri uri;
+    public String mimeType;
+    public String displayName;
+    public long lastModified;
+    public int flags;
+    public String summary;
+    public long size;
+    public int icon;
+
+    public DocumentInfo() {
+        reset();
+    }
+
+    @Override
+    public void reset() {
+        uri = null;
+        mimeType = null;
+        displayName = null;
+        lastModified = -1;
+        flags = 0;
+        summary = null;
+        size = -1;
+        icon = 0;
+    }
+
+    @Override
+    public void read(DataInputStream in) throws IOException {
+        final int version = in.readInt();
+        switch (version) {
+            case VERSION_INIT:
+                final String rawUri = DurableUtils.readNullableString(in);
+                uri = rawUri != null ? Uri.parse(rawUri) : null;
+                mimeType = DurableUtils.readNullableString(in);
+                displayName = DurableUtils.readNullableString(in);
+                lastModified = in.readLong();
+                flags = in.readInt();
+                summary = DurableUtils.readNullableString(in);
+                size = in.readLong();
+                icon = in.readInt();
+                break;
+            default:
+                throw new ProtocolException("Unknown version " + version);
+        }
+    }
+
+    @Override
+    public void write(DataOutputStream out) throws IOException {
+        out.writeInt(VERSION_INIT);
+        DurableUtils.writeNullableString(out, uri.toString());
+        DurableUtils.writeNullableString(out, mimeType);
+        DurableUtils.writeNullableString(out, displayName);
+        out.writeLong(lastModified);
+        out.writeInt(flags);
+        DurableUtils.writeNullableString(out, summary);
+        out.writeLong(size);
+        out.writeInt(icon);
+    }
+
+    public static DocumentInfo fromDirectoryCursor(Cursor cursor) {
+        final DocumentInfo doc = new DocumentInfo();
+        final String authority = getCursorString(cursor, RootCursorWrapper.COLUMN_AUTHORITY);
+        final String docId = getCursorString(cursor, Document.COLUMN_DOCUMENT_ID);
+        doc.uri = DocumentsContract.buildDocumentUri(authority, docId);
+        doc.mimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE);
+        doc.displayName = getCursorString(cursor, Document.COLUMN_DISPLAY_NAME);
+        doc.lastModified = getCursorLong(cursor, Document.COLUMN_LAST_MODIFIED);
+        doc.flags = getCursorInt(cursor, Document.COLUMN_FLAGS);
+        doc.summary = getCursorString(cursor, Document.COLUMN_SUMMARY);
+        doc.size = getCursorLong(cursor, Document.COLUMN_SIZE);
+        doc.icon = getCursorInt(cursor, Document.COLUMN_ICON);
+        return doc;
+    }
+
+    @Deprecated
+    public static DocumentInfo fromRecentOpenCursor(ContentResolver resolver, Cursor recentCursor)
+            throws FileNotFoundException {
+        final Uri uri = Uri.parse(getCursorString(recentCursor, RecentsProvider.COL_URI));
+        final long lastModified = getCursorLong(recentCursor, RecentsProvider.COL_TIMESTAMP);
+
+        Cursor cursor = null;
+        try {
+            cursor = resolver.query(uri, null, null, null, null);
+            if (!cursor.moveToFirst()) {
+                throw new FileNotFoundException("Missing details for " + uri);
+            }
+
+            final DocumentInfo doc = new DocumentInfo();
+            doc.uri = uri;
+            doc.mimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE);
+            doc.displayName = getCursorString(cursor, Document.COLUMN_DISPLAY_NAME);
+            doc.lastModified = lastModified;
+            doc.flags = getCursorInt(cursor, Document.COLUMN_FLAGS)
+                    & Document.FLAG_SUPPORTS_THUMBNAIL;
+            doc.summary = getCursorString(cursor, Document.COLUMN_SUMMARY);
+            doc.size = getCursorLong(cursor, Document.COLUMN_SIZE);
+            doc.icon = getCursorInt(cursor, Document.COLUMN_ICON);
+            return doc;
+        } catch (Throwable t) {
+            throw asFileNotFoundException(t);
+        } finally {
+            IoUtils.closeQuietly(cursor);
+        }
+    }
+
+    public static DocumentInfo fromUri(ContentResolver resolver, Uri uri) throws FileNotFoundException {
+        Cursor cursor = null;
+        try {
+            cursor = resolver.query(uri, null, null, null, null);
+            if (!cursor.moveToFirst()) {
+                throw new FileNotFoundException("Missing details for " + uri);
+            }
+            final DocumentInfo doc = new DocumentInfo();
+            doc.uri = uri;
+            doc.mimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE);
+            doc.displayName = getCursorString(cursor, Document.COLUMN_DISPLAY_NAME);
+            doc.lastModified = getCursorLong(cursor, Document.COLUMN_LAST_MODIFIED);
+            doc.flags = getCursorInt(cursor, Document.COLUMN_FLAGS);
+            doc.summary = getCursorString(cursor, Document.COLUMN_SUMMARY);
+            doc.size = getCursorLong(cursor, Document.COLUMN_SIZE);
+            doc.icon = getCursorInt(cursor, Document.COLUMN_ICON);
+            return doc;
+        } catch (Throwable t) {
+            throw asFileNotFoundException(t);
+        } finally {
+            IoUtils.closeQuietly(cursor);
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "Document{name=" + displayName + ", uri=" + uri + "}";
+    }
+
+    public boolean isCreateSupported() {
+        return (flags & Document.FLAG_DIR_SUPPORTS_CREATE) != 0;
+    }
+
+    public boolean isSearchSupported() {
+        return (flags & Document.FLAG_DIR_SUPPORTS_SEARCH) != 0;
+    }
+
+    public boolean isThumbnailSupported() {
+        return (flags & Document.FLAG_SUPPORTS_THUMBNAIL) != 0;
+    }
+
+    public boolean isDirectory() {
+        return Document.MIME_TYPE_DIR.equals(mimeType);
+    }
+
+    public boolean isGridPreferred() {
+        return (flags & Document.FLAG_DIR_PREFERS_GRID) != 0;
+    }
+
+    public boolean isDeleteSupported() {
+        return (flags & Document.FLAG_SUPPORTS_DELETE) != 0;
+    }
+
+    public Drawable loadIcon(Context context) {
+        return loadIcon(context, uri.getAuthority(), icon);
+    }
+
+    public static Drawable loadIcon(Context context, String authority, int icon) {
+        if (icon != 0) {
+            if (authority != null) {
+                final PackageManager pm = context.getPackageManager();
+                final ProviderInfo info = pm.resolveContentProvider(authority, 0);
+                if (info != null) {
+                    return pm.getDrawable(info.packageName, icon, info.applicationInfo);
+                }
+            } else {
+                return context.getResources().getDrawable(icon);
+            }
+        }
+        return null;
+    }
+
+    public static String getCursorString(Cursor cursor, String columnName) {
+        final int index = cursor.getColumnIndex(columnName);
+        return (index != -1) ? cursor.getString(index) : null;
+    }
+
+    /**
+     * Missing or null values are returned as -1.
+     */
+    public static long getCursorLong(Cursor cursor, String columnName) {
+        final int index = cursor.getColumnIndex(columnName);
+        if (index == -1) return -1;
+        final String value = cursor.getString(index);
+        if (value == null) return -1;
+        try {
+            return Long.parseLong(value);
+        } catch (NumberFormatException e) {
+            return -1;
+        }
+    }
+
+    public static int getCursorInt(Cursor cursor, String columnName) {
+        final int index = cursor.getColumnIndex(columnName);
+        return (index != -1) ? cursor.getInt(index) : 0;
+    }
+
+    @Deprecated
+    public static class DisplayNameComparator implements Comparator<DocumentInfo> {
+        @Override
+        public int compare(DocumentInfo lhs, DocumentInfo rhs) {
+            final boolean leftDir = lhs.isDirectory();
+            final boolean rightDir = rhs.isDirectory();
+
+            if (leftDir != rightDir) {
+                return leftDir ? -1 : 1;
+            } else {
+                return compareToIgnoreCaseNullable(lhs.displayName, rhs.displayName);
+            }
+        }
+    }
+
+    @Deprecated
+    public static class LastModifiedComparator implements Comparator<DocumentInfo> {
+        @Override
+        public int compare(DocumentInfo lhs, DocumentInfo rhs) {
+            return Long.compare(rhs.lastModified, lhs.lastModified);
+        }
+    }
+
+    @Deprecated
+    public static class SizeComparator implements Comparator<DocumentInfo> {
+        @Override
+        public int compare(DocumentInfo lhs, DocumentInfo rhs) {
+            return Long.compare(rhs.size, lhs.size);
+        }
+    }
+
+    public static FileNotFoundException asFileNotFoundException(Throwable t)
+            throws FileNotFoundException {
+        if (t instanceof FileNotFoundException) {
+            throw (FileNotFoundException) t;
+        }
+        final FileNotFoundException fnfe = new FileNotFoundException(t.getMessage());
+        fnfe.initCause(t);
+        throw fnfe;
+    }
+
+    public static int compareToIgnoreCaseNullable(String lhs, String rhs) {
+        if (lhs == null) return -1;
+        if (rhs == null) return 1;
+        return lhs.compareToIgnoreCase(rhs);
+    }
+}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java
index 81f75d2..64631ab 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java
@@ -16,57 +16,22 @@
 
 package com.android.documentsui.model;
 
-import static com.android.documentsui.DocumentsActivity.TAG;
-import static com.android.documentsui.model.Document.asFileNotFoundException;
-
-import android.content.ContentResolver;
-import android.net.Uri;
-import android.provider.DocumentsContract.DocumentRoot;
-import android.util.Log;
-
 import com.android.documentsui.RootsCache;
 
-import org.json.JSONArray;
-import org.json.JSONException;
-
-import java.io.FileNotFoundException;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.net.ProtocolException;
 import java.util.LinkedList;
 
 /**
- * Representation of a stack of {@link Document}, usually the result of a
+ * Representation of a stack of {@link DocumentInfo}, usually the result of a
  * user-driven traversal.
  */
-public class DocumentStack extends LinkedList<Document> {
+public class DocumentStack extends LinkedList<DocumentInfo> implements Durable {
+    private static final int VERSION_INIT = 1;
 
-    public static String serialize(DocumentStack stack) {
-        final JSONArray json = new JSONArray();
-        for (int i = 0; i < stack.size(); i++) {
-            json.put(stack.get(i).uri);
-        }
-        return json.toString();
-    }
-
-    public static DocumentStack deserialize(ContentResolver resolver, String raw)
-            throws FileNotFoundException {
-        Log.d(TAG, "deserialize: " + raw);
-
-        final DocumentStack stack = new DocumentStack();
-        try {
-            final JSONArray json = new JSONArray(raw);
-            for (int i = 0; i < json.length(); i++) {
-                final Uri uri = Uri.parse(json.getString(i));
-                final Document doc = Document.fromUri(resolver, uri);
-                stack.add(doc);
-            }
-        } catch (JSONException e) {
-            throw asFileNotFoundException(e);
-        }
-
-        // TODO: handle roots that have gone missing
-        return stack;
-    }
-
-    public DocumentRoot getRoot(RootsCache roots) {
+    public RootInfo getRoot(RootsCache roots) {
         return roots.findRoot(getLast().uri);
     }
 
@@ -79,4 +44,37 @@
             return null;
         }
     }
+
+    @Override
+    public void reset() {
+        clear();
+    }
+
+    @Override
+    public void read(DataInputStream in) throws IOException {
+        final int version = in.readInt();
+        switch (version) {
+            case VERSION_INIT:
+                final int size = in.readInt();
+                for (int i = 0; i < size; i++) {
+                    final DocumentInfo doc = new DocumentInfo();
+                    doc.read(in);
+                    add(doc);
+                }
+                break;
+            default:
+                throw new ProtocolException("Unknown version " + version);
+        }
+    }
+
+    @Override
+    public void write(DataOutputStream out) throws IOException {
+        out.writeInt(VERSION_INIT);
+        final int size = size();
+        out.writeInt(size);
+        for (int i = 0; i < size; i++) {
+            final DocumentInfo doc = get(i);
+            doc.write(out);
+        }
+    }
 }
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/scriptsupport/OnEverythingFinishedCallback.java b/packages/DocumentsUI/src/com/android/documentsui/model/Durable.java
similarity index 60%
rename from tests/DumpRenderTree2/src/com/android/dumprendertree2/scriptsupport/OnEverythingFinishedCallback.java
rename to packages/DocumentsUI/src/com/android/documentsui/model/Durable.java
index e1d4364..01633ed 100644
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/scriptsupport/OnEverythingFinishedCallback.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/model/Durable.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 The Android Open Source Project
+ * Copyright (C) 2013 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.
@@ -14,12 +14,14 @@
  * limitations under the License.
  */
 
-package com.android.dumprendertree2.scriptsupport;
+package com.android.documentsui.model;
 
-/**
- * Callback used to inform scriptsupport.Starter that everything is finished and
- * we can exit
- */
-public interface OnEverythingFinishedCallback {
-    public void onFinished();
-}
\ No newline at end of file
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public interface Durable {
+    public void reset();
+    public void read(DataInputStream in) throws IOException;
+    public void write(DataOutputStream out) throws IOException;
+}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/DurableUtils.java b/packages/DocumentsUI/src/com/android/documentsui/model/DurableUtils.java
new file mode 100644
index 0000000..214fb14
--- /dev/null
+++ b/packages/DocumentsUI/src/com/android/documentsui/model/DurableUtils.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2013 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.documentsui.model;
+
+import static com.android.documentsui.DocumentsActivity.TAG;
+
+import android.os.BadParcelableException;
+import android.os.Parcel;
+import android.util.Log;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class DurableUtils {
+    public static <D extends Durable> byte[] writeToArray(D d) throws IOException {
+        final ByteArrayOutputStream out = new ByteArrayOutputStream();
+        d.write(new DataOutputStream(out));
+        return out.toByteArray();
+    }
+
+    public static <D extends Durable> D readFromArray(byte[] data, D d) throws IOException {
+        final ByteArrayInputStream in = new ByteArrayInputStream(data);
+        d.reset();
+        try {
+            d.read(new DataInputStream(in));
+        } catch (IOException e) {
+            d.reset();
+            throw e;
+        }
+        return d;
+    }
+
+    public static <D extends Durable> byte[] writeToArrayOrNull(D d) {
+        try {
+            return writeToArray(d);
+        } catch (IOException e) {
+            Log.w(TAG, "Failed to write", e);
+            return null;
+        }
+    }
+
+    public static <D extends Durable> D readFromArrayOrNull(byte[] data, D d) {
+        try {
+            return readFromArray(data, d);
+        } catch (IOException e) {
+            Log.w(TAG, "Failed to read", e);
+            return null;
+        }
+    }
+
+    public static <D extends Durable> void writeToParcel(Parcel parcel, D d) {
+        try {
+            parcel.writeByteArray(writeToArray(d));
+        } catch (IOException e) {
+            throw new BadParcelableException(e);
+        }
+    }
+
+    public static <D extends Durable> D readFromParcel(Parcel parcel, D d) {
+        try {
+            return readFromArray(parcel.createByteArray(), d);
+        } catch (IOException e) {
+            throw new BadParcelableException(e);
+        }
+    }
+
+    public static void writeNullableString(DataOutputStream out, String value) throws IOException {
+        if (value != null) {
+            out.write(1);
+            out.writeUTF(value);
+        } else {
+            out.write(0);
+        }
+    }
+
+    public static String readNullableString(DataInputStream in) throws IOException {
+        if (in.read() != 0) {
+            return in.readUTF();
+        } else {
+            return null;
+        }
+    }
+}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/RootInfo.java b/packages/DocumentsUI/src/com/android/documentsui/model/RootInfo.java
new file mode 100644
index 0000000..189284b
--- /dev/null
+++ b/packages/DocumentsUI/src/com/android/documentsui/model/RootInfo.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2013 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.documentsui.model;
+
+import static com.android.documentsui.model.DocumentInfo.getCursorInt;
+import static com.android.documentsui.model.DocumentInfo.getCursorLong;
+import static com.android.documentsui.model.DocumentInfo.getCursorString;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.graphics.drawable.Drawable;
+import android.provider.DocumentsContract.Root;
+
+import java.util.Objects;
+
+/**
+ * Representation of a {@link Root}.
+ */
+public class RootInfo {
+    public String authority;
+    public String rootId;
+    public int rootType;
+    public int flags;
+    public int icon;
+    public String title;
+    public String summary;
+    public String documentId;
+    public long availableBytes;
+
+    public static RootInfo fromRootsCursor(String authority, Cursor cursor) {
+        final RootInfo root = new RootInfo();
+        root.authority = authority;
+        root.rootId = getCursorString(cursor, Root.COLUMN_ROOT_ID);
+        root.rootType = getCursorInt(cursor, Root.COLUMN_ROOT_TYPE);
+        root.flags = getCursorInt(cursor, Root.COLUMN_FLAGS);
+        root.icon = getCursorInt(cursor, Root.COLUMN_ICON);
+        root.title = getCursorString(cursor, Root.COLUMN_TITLE);
+        root.summary = getCursorString(cursor, Root.COLUMN_SUMMARY);
+        root.documentId = getCursorString(cursor, Root.COLUMN_DOCUMENT_ID);
+        root.availableBytes = getCursorLong(cursor, Root.COLUMN_AVAILABLE_BYTES);
+        return root;
+    }
+
+    public Drawable loadIcon(Context context) {
+        return DocumentInfo.loadIcon(context, authority, icon);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (o instanceof RootInfo) {
+            final RootInfo root = (RootInfo) o;
+            return Objects.equals(authority, root.authority) && Objects.equals(rootId, root.rootId);
+        } else {
+            return false;
+        }
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(authority, rootId);
+    }
+
+    public String getDirectoryString() {
+        return (summary != null) ? summary : title;
+    }
+}
diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
index 583ecc9..bbe3b45 100644
--- a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
+++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
@@ -26,9 +26,8 @@
 import android.os.CancellationSignal;
 import android.os.Environment;
 import android.os.ParcelFileDescriptor;
-import android.provider.DocumentsContract.DocumentColumns;
-import android.provider.DocumentsContract.DocumentRoot;
-import android.provider.DocumentsContract.Documents;
+import android.provider.DocumentsContract.Document;
+import android.provider.DocumentsContract.Root;
 import android.provider.DocumentsProvider;
 import android.webkit.MimeTypeMap;
 
@@ -41,7 +40,6 @@
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.LinkedList;
-import java.util.List;
 import java.util.Map;
 
 public class ExternalStorageProvider extends DocumentsProvider {
@@ -49,36 +47,52 @@
 
     // docId format: root:path/to/file
 
-    private static final String[] SUPPORTED_COLUMNS = new String[] {
-            DocumentColumns.DOC_ID, DocumentColumns.DISPLAY_NAME, DocumentColumns.SIZE,
-            DocumentColumns.MIME_TYPE, DocumentColumns.LAST_MODIFIED, DocumentColumns.FLAGS
+    private static final String[] DEFAULT_ROOT_PROJECTION = new String[] {
+            Root.COLUMN_ROOT_ID, Root.COLUMN_ROOT_TYPE, Root.COLUMN_FLAGS, Root.COLUMN_ICON,
+            Root.COLUMN_TITLE, Root.COLUMN_SUMMARY, Root.COLUMN_DOCUMENT_ID,
+            Root.COLUMN_AVAILABLE_BYTES,
     };
 
-    private ArrayList<DocumentRoot> mRoots;
-    private HashMap<String, DocumentRoot> mTagToRoot;
-    private HashMap<String, File> mTagToPath;
+    private static final String[] DEFAULT_DOCUMENT_PROJECTION = new String[] {
+            Document.COLUMN_DOCUMENT_ID, Document.COLUMN_MIME_TYPE, Document.COLUMN_DISPLAY_NAME,
+            Document.COLUMN_LAST_MODIFIED, Document.COLUMN_FLAGS, Document.COLUMN_SIZE,
+    };
+
+    private static class RootInfo {
+        public String rootId;
+        public int rootType;
+        public int flags;
+        public int icon;
+        public String title;
+        public String docId;
+    }
+
+    private ArrayList<RootInfo> mRoots;
+    private HashMap<String, RootInfo> mIdToRoot;
+    private HashMap<String, File> mIdToPath;
 
     @Override
     public boolean onCreate() {
         mRoots = Lists.newArrayList();
-        mTagToRoot = Maps.newHashMap();
-        mTagToPath = Maps.newHashMap();
+        mIdToRoot = Maps.newHashMap();
+        mIdToPath = Maps.newHashMap();
 
         // TODO: support multiple storage devices
 
         try {
-            final String tag = "primary";
+            final String rootId = "primary";
             final File path = Environment.getExternalStorageDirectory();
-            mTagToPath.put(tag, path);
+            mIdToPath.put(rootId, path);
 
-            final DocumentRoot root = new DocumentRoot();
-            root.docId = getDocIdForFile(path);
-            root.rootType = DocumentRoot.ROOT_TYPE_DEVICE_ADVANCED;
-            root.title = getContext().getString(R.string.root_internal_storage);
+            final RootInfo root = new RootInfo();
+            root.rootId = "primary";
+            root.rootType = Root.ROOT_TYPE_DEVICE;
+            root.flags = Root.FLAG_SUPPORTS_CREATE | Root.FLAG_LOCAL_ONLY | Root.FLAG_ADVANCED;
             root.icon = R.drawable.ic_pdf;
-            root.flags = DocumentRoot.FLAG_LOCAL_ONLY;
+            root.title = getContext().getString(R.string.root_internal_storage);
+            root.docId = getDocIdForFile(path);
             mRoots.add(root);
-            mTagToRoot.put(tag, root);
+            mIdToRoot.put(rootId, root);
         } catch (FileNotFoundException e) {
             throw new IllegalStateException(e);
         }
@@ -86,12 +100,20 @@
         return true;
     }
 
+    private static String[] resolveRootProjection(String[] projection) {
+        return projection != null ? projection : DEFAULT_ROOT_PROJECTION;
+    }
+
+    private static String[] resolveDocumentProjection(String[] projection) {
+        return projection != null ? projection : DEFAULT_DOCUMENT_PROJECTION;
+    }
+
     private String getDocIdForFile(File file) throws FileNotFoundException {
         String path = file.getAbsolutePath();
 
         // Find the most-specific root path
         Map.Entry<String, File> mostSpecific = null;
-        for (Map.Entry<String, File> root : mTagToPath.entrySet()) {
+        for (Map.Entry<String, File> root : mIdToPath.entrySet()) {
             final String rootPath = root.getValue().getPath();
             if (path.startsWith(rootPath) && (mostSpecific == null
                     || rootPath.length() > mostSpecific.getValue().getPath().length())) {
@@ -121,7 +143,7 @@
         final String tag = docId.substring(0, splitIndex);
         final String path = docId.substring(splitIndex + 1);
 
-        File target = mTagToPath.get(tag);
+        File target = mIdToPath.get(tag);
         if (target == null) {
             throw new FileNotFoundException("No root for " + tag);
         }
@@ -143,41 +165,48 @@
         int flags = 0;
 
         if (file.isDirectory()) {
-            flags |= Documents.FLAG_SUPPORTS_SEARCH;
+            flags |= Document.FLAG_DIR_SUPPORTS_SEARCH;
         }
         if (file.isDirectory() && file.canWrite()) {
-            flags |= Documents.FLAG_SUPPORTS_CREATE;
+            flags |= Document.FLAG_DIR_SUPPORTS_CREATE;
         }
         if (file.canWrite()) {
-            flags |= Documents.FLAG_SUPPORTS_WRITE;
-            flags |= Documents.FLAG_SUPPORTS_RENAME;
-            flags |= Documents.FLAG_SUPPORTS_DELETE;
+            flags |= Document.FLAG_SUPPORTS_WRITE;
+            flags |= Document.FLAG_SUPPORTS_DELETE;
         }
 
         final String displayName = file.getName();
         final String mimeType = getTypeForFile(file);
         if (mimeType.startsWith("image/")) {
-            flags |= Documents.FLAG_SUPPORTS_THUMBNAIL;
+            flags |= Document.FLAG_SUPPORTS_THUMBNAIL;
         }
 
         final RowBuilder row = result.newRow();
-        row.offer(DocumentColumns.DOC_ID, docId);
-        row.offer(DocumentColumns.DISPLAY_NAME, displayName);
-        row.offer(DocumentColumns.SIZE, file.length());
-        row.offer(DocumentColumns.MIME_TYPE, mimeType);
-        row.offer(DocumentColumns.LAST_MODIFIED, file.lastModified());
-        row.offer(DocumentColumns.FLAGS, flags);
+        row.offer(Document.COLUMN_DOCUMENT_ID, docId);
+        row.offer(Document.COLUMN_DISPLAY_NAME, displayName);
+        row.offer(Document.COLUMN_SIZE, file.length());
+        row.offer(Document.COLUMN_MIME_TYPE, mimeType);
+        row.offer(Document.COLUMN_LAST_MODIFIED, file.lastModified());
+        row.offer(Document.COLUMN_FLAGS, flags);
     }
 
     @Override
-    public List<DocumentRoot> getDocumentRoots() {
-        // Update free space
-        for (String tag : mTagToRoot.keySet()) {
-            final DocumentRoot root = mTagToRoot.get(tag);
-            final File path = mTagToPath.get(tag);
-            root.availableBytes = path.getFreeSpace();
+    public Cursor queryRoots(String[] projection) throws FileNotFoundException {
+        final MatrixCursor result = new MatrixCursor(resolveRootProjection(projection));
+        for (String rootId : mIdToPath.keySet()) {
+            final RootInfo root = mIdToRoot.get(rootId);
+            final File path = mIdToPath.get(rootId);
+
+            final RowBuilder row = result.newRow();
+            row.offer(Root.COLUMN_ROOT_ID, root.rootId);
+            row.offer(Root.COLUMN_ROOT_TYPE, root.rootType);
+            row.offer(Root.COLUMN_FLAGS, root.flags);
+            row.offer(Root.COLUMN_ICON, root.icon);
+            row.offer(Root.COLUMN_TITLE, root.title);
+            row.offer(Root.COLUMN_DOCUMENT_ID, root.docId);
+            row.offer(Root.COLUMN_AVAILABLE_BYTES, path.getFreeSpace());
         }
-        return mRoots;
+        return result;
     }
 
     @Override
@@ -187,7 +216,7 @@
         displayName = validateDisplayName(mimeType, displayName);
 
         final File file = new File(parent, displayName);
-        if (Documents.MIME_TYPE_DIR.equals(mimeType)) {
+        if (Document.MIME_TYPE_DIR.equals(mimeType)) {
             if (!file.mkdir()) {
                 throw new IllegalStateException("Failed to mkdir " + file);
             }
@@ -204,16 +233,6 @@
     }
 
     @Override
-    public void renameDocument(String docId, String displayName) throws FileNotFoundException {
-        final File file = getFileForDocId(docId);
-        final File newFile = new File(file.getParentFile(), displayName);
-        if (!file.renameTo(newFile)) {
-            throw new IllegalStateException("Failed to rename " + docId);
-        }
-        // TODO: update any outstanding grants
-    }
-
-    @Override
     public void deleteDocument(String docId) throws FileNotFoundException {
         final File file = getFileForDocId(docId);
         if (!file.delete()) {
@@ -222,16 +241,19 @@
     }
 
     @Override
-    public Cursor queryDocument(String docId) throws FileNotFoundException {
-        final MatrixCursor result = new MatrixCursor(SUPPORTED_COLUMNS);
-        includeFile(result, docId, null);
+    public Cursor queryDocument(String documentId, String[] projection)
+            throws FileNotFoundException {
+        final MatrixCursor result = new MatrixCursor(resolveDocumentProjection(projection));
+        includeFile(result, documentId, null);
         return result;
     }
 
     @Override
-    public Cursor queryDocumentChildren(String docId) throws FileNotFoundException {
-        final MatrixCursor result = new MatrixCursor(SUPPORTED_COLUMNS);
-        final File parent = getFileForDocId(docId);
+    public Cursor queryChildDocuments(
+            String parentDocumentId, String[] projection, String sortOrder)
+            throws FileNotFoundException {
+        final MatrixCursor result = new MatrixCursor(resolveDocumentProjection(projection));
+        final File parent = getFileForDocId(parentDocumentId);
         for (File file : parent.listFiles()) {
             includeFile(result, null, file);
         }
@@ -239,9 +261,10 @@
     }
 
     @Override
-    public Cursor querySearch(String docId, String query) throws FileNotFoundException {
-        final MatrixCursor result = new MatrixCursor(SUPPORTED_COLUMNS);
-        final File parent = getFileForDocId(docId);
+    public Cursor querySearchDocuments(String parentDocumentId, String query, String[] projection)
+            throws FileNotFoundException {
+        final MatrixCursor result = new MatrixCursor(resolveDocumentProjection(projection));
+        final File parent = getFileForDocId(parentDocumentId);
 
         final LinkedList<File> pending = new LinkedList<File>();
         pending.add(parent);
@@ -261,22 +284,24 @@
     }
 
     @Override
-    public String getType(String docId) throws FileNotFoundException {
-        final File file = getFileForDocId(docId);
+    public String getDocumentType(String documentId) throws FileNotFoundException {
+        final File file = getFileForDocId(documentId);
         return getTypeForFile(file);
     }
 
     @Override
-    public ParcelFileDescriptor openDocument(String docId, String mode, CancellationSignal signal)
+    public ParcelFileDescriptor openDocument(
+            String documentId, String mode, CancellationSignal signal)
             throws FileNotFoundException {
-        final File file = getFileForDocId(docId);
+        final File file = getFileForDocId(documentId);
         return ParcelFileDescriptor.open(file, ContentResolver.modeToMode(null, mode));
     }
 
     @Override
     public AssetFileDescriptor openDocumentThumbnail(
-            String docId, Point sizeHint, CancellationSignal signal) throws FileNotFoundException {
-        final File file = getFileForDocId(docId);
+            String documentId, Point sizeHint, CancellationSignal signal)
+            throws FileNotFoundException {
+        final File file = getFileForDocId(documentId);
         final ParcelFileDescriptor pfd = ParcelFileDescriptor.open(
                 file, ParcelFileDescriptor.MODE_READ_ONLY);
 
@@ -294,7 +319,7 @@
 
     private static String getTypeForFile(File file) {
         if (file.isDirectory()) {
-            return Documents.MIME_TYPE_DIR;
+            return Document.MIME_TYPE_DIR;
         } else {
             return getTypeForName(file.getName());
         }
@@ -314,7 +339,7 @@
     }
 
     private static String validateDisplayName(String mimeType, String displayName) {
-        if (Documents.MIME_TYPE_DIR.equals(mimeType)) {
+        if (Document.MIME_TYPE_DIR.equals(mimeType)) {
             return displayName;
         } else {
             // Try appending meaningful extension if needed
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java
index d4b79b7..eedb7d0 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java
@@ -1213,6 +1213,7 @@
 
     private void addWidgetsFromSettings() {
         if (mSafeModeEnabled || widgetsDisabled()) {
+            addDefaultStatusWidget(0);
             return;
         }
 
diff --git a/packages/PrintSpooler/res/drawable-hdpi/ic_menu_add.png b/packages/PrintSpooler/res/drawable-hdpi/ic_menu_add.png
deleted file mode 100644
index 4b68f52..0000000
--- a/packages/PrintSpooler/res/drawable-hdpi/ic_menu_add.png
+++ /dev/null
Binary files differ
diff --git a/packages/PrintSpooler/res/drawable-mdpi/ic_menu_add.png b/packages/PrintSpooler/res/drawable-mdpi/ic_menu_add.png
deleted file mode 100644
index 15ffadd..0000000
--- a/packages/PrintSpooler/res/drawable-mdpi/ic_menu_add.png
+++ /dev/null
Binary files differ
diff --git a/packages/PrintSpooler/res/drawable-xhdpi/ic_menu_add.png b/packages/PrintSpooler/res/drawable-xhdpi/ic_menu_add.png
deleted file mode 100644
index 420510e..0000000
--- a/packages/PrintSpooler/res/drawable-xhdpi/ic_menu_add.png
+++ /dev/null
Binary files differ
diff --git a/packages/PrintSpooler/res/menu/select_printer_activity.xml b/packages/PrintSpooler/res/menu/select_printer_activity.xml
index 28fbd35..d4ce1cf 100644
--- a/packages/PrintSpooler/res/menu/select_printer_activity.xml
+++ b/packages/PrintSpooler/res/menu/select_printer_activity.xml
@@ -29,7 +29,7 @@
     <item
         android:id="@+id/action_add_printer"
         android:title="@null"
-        android:icon="@drawable/ic_menu_add"
+        android:icon="@*android:drawable/create_contact"
         android:showAsAction="ifRoom"
         android:alphabeticShortcut="a">
     </item>
diff --git a/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java b/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java
index ad8d95a..88da21f 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java
@@ -47,7 +47,6 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -66,15 +65,16 @@
 
     private static final int MAX_FAVORITE_PRINTER_COUNT = 4;
 
-    private final Map<PrinterId, PrinterInfo> mPrinters =
-            new LinkedHashMap<PrinterId, PrinterInfo>();
+    private final List<PrinterInfo> mPrinters =
+            new ArrayList<PrinterInfo>();
+
+    private final List<PrinterInfo> mFavoritePrinters =
+            new ArrayList<PrinterInfo>();
 
     private final PersistenceManager mPersistenceManager;
 
     private PrinterDiscoverySession mDiscoverySession;
 
-    private List<PrinterInfo> mFavoritePrinters;
-
     private PrinterId mTrackedPrinter;
 
     public FusedPrintersProvider(Context context) {
@@ -86,15 +86,40 @@
         mPersistenceManager.addPrinterAndWritePrinterHistory(printer);
     }
 
-    public List<PrinterInfo> getPrinters() {
-        return new ArrayList<PrinterInfo>(mPrinters.values());
-    }
-
-    @Override
-    public void deliverResult(List<PrinterInfo> printers) {
-        if (isStarted()) {
-            super.deliverResult(printers);
+    private void computeAndDeliverResult() {
+        if (!isStarted()) {
+            return;
         }
+
+        List<PrinterInfo> printers = new ArrayList<PrinterInfo>();
+
+        // We want the first few favorite printers on top of the list.
+        final int favoriteCount = Math.min(mFavoritePrinters.size(),
+                MAX_FAVORITE_PRINTER_COUNT);
+        for (int i = 0; i < favoriteCount; i++) {
+            printers.add(mFavoritePrinters.get(i));
+        }
+
+        // Add discovered printers updating favorites if needed.
+        final int printerCount = mPrinters.size();
+        for (int i = 0; i < printerCount; i++) {
+            PrinterInfo discoveredPrinter = mPrinters.get(i);
+            boolean printerHandled = false;
+            for (int j = 0; j< favoriteCount; j++) {
+                PrinterInfo favoritePrinter = printers.get(j);
+                if (favoritePrinter.getId().equals(discoveredPrinter.getId())) {
+                    printers.set(j, discoveredPrinter);
+                    printerHandled = true;
+                    break;
+                }
+            }
+            if (!printerHandled) {
+                printers.add(discoveredPrinter);
+            }
+        }
+
+        // Deliver the printers.
+        deliverResult(printers);
     }
 
     @Override
@@ -104,14 +129,12 @@
         }
         // The contract is that if we already have a valid,
         // result the we have to deliver it immediately.
-        if (!mPrinters.isEmpty()) {
-            deliverResult(new ArrayList<PrinterInfo>(mPrinters.values()));
+        if (!mPrinters.isEmpty() || !mFavoritePrinters.isEmpty()) {
+            computeAndDeliverResult();
         }
-        // If the data has changed since the last load
-        // or is not available, start a load.
-        if (takeContentChanged() || mPrinters.isEmpty()) {
-            onForceLoad();
-        }
+        // Always load the data to ensure discovery period is
+        // started and to make sure obsolete printers are updated.
+        onForceLoad();
     }
 
     @Override
@@ -127,7 +150,6 @@
         if (DEBUG) {
             Log.i(LOG_TAG, "onForceLoad()" + FusedPrintersProvider.this.hashCode());
         }
-        onCancelLoad();
         loadInternal();
     }
 
@@ -139,8 +161,9 @@
             mDiscoverySession.setOnPrintersChangeListener(new OnPrintersChangeListener() {
                 @Override
                 public void onPrintersChanged() {
-                    deliverResult(new ArrayList<PrinterInfo>(
-                            mDiscoverySession.getPrinters()));
+                    mPrinters.clear();
+                    mPrinters.addAll(mDiscoverySession.getPrinters());
+                    computeAndDeliverResult();
                 }
             });
             mPersistenceManager.readPrinterHistory();
@@ -244,27 +267,20 @@
             @Override
             protected void onPostExecute(List<PrinterInfo> printers) {
                 if (DEBUG) {
-                    Log.i(LOG_TAG, "read history completed" + FusedPrintersProvider.this.hashCode());
+                    Log.i(LOG_TAG, "read history completed"
+                            + FusedPrintersProvider.this.hashCode());
                 }
 
                 mHistoricalPrinters = printers;
 
                 // Compute the favorite printers.
-                mFavoritePrinters = computeFavoritePrinters(printers);
-
-                // We want the first few favorite printers on top of the list.
-                final int favoriteCount = Math.min(mFavoritePrinters.size(),
-                        MAX_FAVORITE_PRINTER_COUNT);
-                for (int i = 0; i < favoriteCount; i++) {
-                    PrinterInfo favoritePrinter = mFavoritePrinters.get(i);
-                    mPrinters.put(favoritePrinter.getId(), favoritePrinter);
-                }
+                mFavoritePrinters.addAll(computeFavoritePrinters(printers));
 
                 mReadHistoryInProgress = false;
                 mReadHistoryCompleted = true;
 
                 // Deliver the favorites.
-                deliverResult(mFavoritePrinters);
+                computeAndDeliverResult();
 
                 // Start loading the available printers.
                 loadInternal();
@@ -420,8 +436,9 @@
                         serializer.startTag(null, TAG_PRINTER);
 
                         serializer.attribute(null, ATTR_NAME, printer.getName());
+                        // Historical printers are always stored as unavailable.
                         serializer.attribute(null, ATTR_STATUS, String.valueOf(
-                                printer.getStatus()));
+                                PrinterInfo.STATUS_UNAVAILABLE));
                         String description = printer.getDescription();
                         if (description != null) {
                             serializer.attribute(null, ATTR_DESCRIPTION, description);
@@ -488,7 +505,8 @@
                 mHistoricalPrinters.remove(0);
             }
             mHistoricalPrinters.add(printer);
-            mWriteTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, mHistoricalPrinters);
+            mWriteTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR,
+                    new ArrayList<PrinterInfo>(mHistoricalPrinters));
         }
 
         private List<PrinterInfo> computeFavoritePrinters(List<PrinterInfo> printers) {
diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
index 520331cb..5361a1e 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
@@ -817,6 +817,10 @@
                     }
 
                     if (id == DEST_ADAPTER_ITEM_ID_ALL_PRINTERS) {
+                        // The selection changed to the all printers item. We
+                        // want to select back the last selected printer.
+                        mIgnoreNextDestinationChange = true;
+                        mEditor.selectPrinter(mCurrentPrinter.getId());
                         startSelectPrinterActivity();
                         return;
                     }
@@ -1024,7 +1028,7 @@
             mDestinationSpinnerAdapter.registerDataSetObserver(new DataSetObserver() {
                 @Override
                 public void onChanged() {
-                    // Initially, we have only sage to PDF as a printer but after some
+                    // Initially, we have only safe to PDF as a printer but after some
                     // printers are loaded we want to select the user's favorite one
                     // which is the first.
                     if (!mFavoritePrinterSelected && mDestinationSpinnerAdapter.getCount() > 2) {
@@ -1044,6 +1048,15 @@
                                     continue;
                                 }
 
+                                // If the current printer became available and has no
+                                // capabilities, we refresh it.
+                                if (mCurrentPrinter.getStatus() == PrinterInfo.STATUS_UNAVAILABLE
+                                        && printer.getStatus() != PrinterInfo.STATUS_UNAVAILABLE
+                                        && printer.getCapabilities() == null) {
+                                    refreshCurrentPrinter();
+                                    return;
+                                }
+
                                 // Update the UI if capabilities changed.
                                 boolean capabilitiesChanged = false;
 
@@ -1127,6 +1140,18 @@
             }
         }
 
+        public void addCurrentPrinterToHistory() {
+            PrinterInfo printer = (PrinterInfo) mDestinationSpinner.getSelectedItem();
+            if (printer != null) {
+                FusedPrintersProvider printersLoader = (FusedPrintersProvider)
+                        (Loader<?>) getLoaderManager().getLoader(
+                                LOADER_ID_PRINTERS_LOADER);
+                if (printersLoader != null) {
+                    printersLoader.addHistoricalPrinter(printer);
+                }
+            }
+        }
+
         public void selectPrinter(PrinterId printerId) {
             mDestinationSpinnerAdapter.ensurePrinterShownPrinterShown(printerId);
             final int position = mDestinationSpinnerAdapter.getPrinterIndex(printerId);
@@ -1348,6 +1373,7 @@
         }
 
         public void confirmPrint() {
+            addCurrentPrinterToHistory();
             mEditorState = EDITOR_STATE_CONFIRMED_PRINT;
             showUi(UI_GENERATING_PRINT_JOB, null);
         }
@@ -1772,7 +1798,6 @@
                     mPageRangeEditText.setVisibility(View.INVISIBLE);
                     mPageRangeTitle.setVisibility(View.INVISIBLE);
                 }
-                mRangeOptionsSpinner.setEnabled(true);
 
                 // Print/Print preview
                 if (mDestinationSpinner.getSelectedItemId()
@@ -1871,8 +1896,6 @@
         }
 
         private void startSelectPrinterActivity() {
-            mIgnoreNextDestinationChange = true;
-            mDestinationSpinner.setSelection(0);
             Intent intent = new Intent(PrintJobConfigActivity.this,
                     SelectPrinterActivity.class);
             startActivityForResult(intent, ACTIVITY_REQUEST_SELECT_PRINTER);
@@ -1959,6 +1982,9 @@
                     if (position == 0) {
                         return DEST_ADAPTER_ITEM_ID_SAVE_AS_PDF;
                     }
+                    if (position == 1) {
+                        return DEST_ADAPTER_ITEM_ID_ALL_PRINTERS;
+                    }
                 } else {
                     if (position == 1) {
                         return DEST_ADAPTER_ITEM_ID_SAVE_AS_PDF;
@@ -2059,7 +2085,7 @@
                     PrinterInfo printer = (PrinterInfo) mPrinters.get(i);
                     if (printer.getId().equals(mLastShownPrinterId)) {
                         // If already in the list - do nothing.
-                        if (i < getCount() - 1) {
+                        if (i < getCount() - 2) {
                             return;
                         }
                         // Else replace the last one.
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_0.png
index 140bba3..be6bad3 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_0.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_100.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_100.png
index d4c767b..5382e0a 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_100.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_100.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_15.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_15.png
index 80e00cc..4c60c68 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_15.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_15.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_28.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_28.png
index 742ec7c..f526262 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_28.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_28.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_43.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_43.png
index 9182f26..dffa104 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_43.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_43.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_57.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_57.png
index b798c5c..5870080 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_57.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_57.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_71.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_71.png
index 5e85afa..017e5a1 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_71.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_71.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_85.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_85.png
index b2fb2c6..362b38d 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_85.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_85.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim0.png
index 9d8d881..b225e7f 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim0.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim100.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim100.png
index b39817e..e676c2a 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim100.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim100.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim15.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim15.png
index fb3e80d..b76a124 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim15.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim15.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim28.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim28.png
index d5458a5..843b833 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim28.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim28.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim43.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim43.png
index 1ddef7b..ac0b5ef 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim43.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim43.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim57.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim57.png
index f8cf27b..807fdc5 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim57.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim57.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim71.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim71.png
index 7bd14f1..cdbdea2 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim71.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim71.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim85.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim85.png
index f2190c7..269eab1 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim85.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim85.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth.png
index 46a71f3..1489b90 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_1x.png
index 203b0f9..073f285 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_1x.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_3g.png
index 98d1418..83759be 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_3g.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_4g.png
index 3d2d921..bec5e3b 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_4g.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_4g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_e.png
index 7737dad..cbf2cc7 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_e.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_g.png
index 77d1c18..90cb8c3 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_g.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_h.png
index 104797d..24d0606 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_h.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_lte.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_lte.png
index 19df124..1b1ac75 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_lte.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_lte.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_roam.png
index 2c81288..1e66cb9 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_roam.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_roam.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_no_sim.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_no_sim.png
index b217592..fe7d280 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_no_sim.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_no_sim.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_0.png
index 80d3e75..986e7fb 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_0.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1.png
index 7d8b7bec..a5795ed 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1_fully.png
index d3039d7..b647f45 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1_fully.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2.png
index 7760ba9..02144e5 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2_fully.png
index 491496b..7eb285f 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2_fully.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3.png
index c9ccc9c..20364a3 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3_fully.png
index eb46a00..169d684 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3_fully.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4.png
index c54d565..850150a 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4_fully.png
index df18ccc..7279d5a 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4_fully.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_null.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_null.png
index 88dfcb5..546a222 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_null.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_null.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_1x.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_1x.png
index ff8fd17..60a7341 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_1x.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_3g.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_3g.png
index 23a41ea..23b47b6 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_3g.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_4g.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_4g.png
index ba6aa1b..6601913 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_4g.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_4g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_e.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_e.png
index a767c99..2334bfc 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_e.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_g.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_g.png
index 5126b1c..b410ee1 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_g.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_h.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_h.png
index e38a907..91810f8 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_h.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_lte.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_lte.png
index 75d22cf..6a7eb08 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_lte.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_lte.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_roam.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_roam.png
index bf7c364..1c69293 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_roam.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_roam.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0.png
index 7a89d58..4ecb2a8 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0_fully.png
index 062b5a5..f0b0588 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1.png
index 9f782ea..2c86ddf 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1_fully.png
index c36ced8..508a073 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2.png
index 47c4492..6232c94 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2_fully.png
index 440288c..73c5c2c 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3.png
index 23cde12..49c0c0b 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3_fully.png
index 4b657fc..a03ac38 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4.png
index 6f0c344..21e5ae8 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4_fully.png
index d221ab7..8cfc0f8 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_null.png
index d0970d9..ecca5d5 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_null.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_null.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_1x.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_1x.png
index 4881c911..7f0e705 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_1x.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_3g.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_3g.png
index e130066..b4ee3ff 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_3g.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_4g.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_4g.png
index 468ad9e..38e009f 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_4g.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_4g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_e.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_e.png
index 0acd2ec..8cb3f6a 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_e.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_g.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_g.png
index b6bf038..bc68ae6 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_g.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_h.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_h.png
index f4a0192..65bc672 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_h.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_lte.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_lte.png
index f2324d2..a3c5aca 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_lte.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_lte.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_roam.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_roam.png
index aa12d4f..7234f40 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_roam.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_roam.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0.png
index ae17e09..bea4247 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0_fully.png
index fd018d4..3fda61d 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1.png
index 366b0f5..28dd0ab 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1_fully.png
index 41afb7d..7c01b40 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2.png
index 9ae4486..dbd3c59 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2_fully.png
index 9d1dfb8..2cf3eff 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3.png
index 6bcd8dd..19cdc61 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3_fully.png
index f062aa0..0478d4a 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4.png
index a7cc078..126e31d 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4_fully.png
index c396935..d32e309 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_null.png
index da9ba59..b961902 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_null.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_null.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_1x.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_1x.png
index 803c9de..fe0bb54 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_1x.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_3g.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_3g.png
index 0faddb6..d9f6f33 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_3g.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_4g.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_4g.png
index 669b15e..75bb86a 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_4g.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_4g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_e.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_e.png
index 2389b7d..0318f1a 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_e.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_g.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_g.png
index 64332d1..ef2f061 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_g.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_h.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_h.png
index c48ae79..6fbcc0e 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_h.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_lte.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_lte.png
index 8370507..1b6f7f5 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_lte.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_lte.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_roam.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_roam.png
index 098e702..2ccb681 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_roam.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_roam.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0.png
index e36ccf5..dca7457 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0_fully.png
index 194610a..474795c 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1.png
index bcade5d..8718fa8 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1_fully.png
index 69558d8..6710650 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2.png
index 2b894ba..dcfd2d1 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2_fully.png
index 72a4bbf..caa4189 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3.png
index 1c385ea..69cc6c4 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3_fully.png
index 6a7efed..7e0158f 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4.png
index a56bcdb..9d5b2c7 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4_fully.png
index b9c504a..03b5c55 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_null.png
index 29b85f6..2ef75ac 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_null.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_null.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_1x.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_1x.png
index 5eb8c7d..6ba908b 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_1x.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_3g.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_3g.png
index 6756bbe..c4de9e5 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_3g.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_4g.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_4g.png
index 68cf3fd..c5b5ec3 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_4g.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_4g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_e.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_e.png
index 5f733a0..80d8b40 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_e.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_g.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_g.png
index 0a45a9e..03377e2 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_g.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_h.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_h.png
index b483c2f..4dca8f2 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_h.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_lte.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_lte.png
index 227402b..9d3346fb 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_lte.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_lte.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_roam.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_roam.png
index c54954b..dd0d6b5 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_roam.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_roam.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0.png
index 783c194..db8d8c1 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0_fully.png
index 49e847d..db8d8c1 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1.png
index 8e88258..1d21ea1 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1_fully.png
index f6ea918..d1609d6 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2.png
index e31b4f2..fe80d3d 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2_fully.png
index e583414..ef731236 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3.png
index d030c84..a80d45a 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3_fully.png
index 03a0f619..d40cb3f 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4.png
index 48bcd0b..880a735 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4_fully.png
index bb7e7e3..f11bfff 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_null.png
index 8e41679..e0c5408 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_null.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_null.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_0.png
index b3211ea..017023e 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_0.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_100.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_100.png
index 71c2b02..09f30c3 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_100.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_100.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_15.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_15.png
index 31a88ba..580a81c 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_15.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_15.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_28.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_28.png
index bf61fb0..6b4383d 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_28.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_28.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_43.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_43.png
index 712b5f9..9d30447 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_43.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_43.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_57.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_57.png
index 50ee052..3c4c07f 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_57.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_57.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_71.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_71.png
index d29047b..b543639 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_71.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_71.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_85.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_85.png
index 9fb80df..3c59cbb 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_85.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_85.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim0.png
index 97bce0c..3ae1228 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim0.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim100.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim100.png
index ab917d7..cc4d343 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim100.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim100.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim15.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim15.png
index a170663..e26142f 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim15.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim15.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim28.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim28.png
index 38589cf..f088b6b 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim28.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim28.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim43.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim43.png
index 3e4b7be..bbbe14a 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim43.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim43.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim57.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim57.png
index ad69401..d4370fd 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim57.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim57.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim71.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim71.png
index 0985b4e..82057f8 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim71.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim71.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim85.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim85.png
index d0700fbd..faacde9 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim85.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim85.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth.png
index 891123e..a28235b 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_1x.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_1x.png
index 3dfe53a..a4c7ed0e 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_1x.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_3g.png
index 0f3350b..11e4762f 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_3g.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_4g.png
index 3ae9b4d..503e155 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_4g.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_4g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_e.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_e.png
index d110a86..2be8a4f 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_e.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_g.png
index da23dd8..8efc4ed 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_g.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_h.png
index 7b3bdba..e691780 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_h.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_lte.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_lte.png
index 6f07f33..df01445 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_lte.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_lte.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_roam.png
index ff107ca..0bc6e31 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_roam.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_roam.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_no_sim.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_no_sim.png
index 362dcd4..6a08773 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_no_sim.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_no_sim.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png
index 0999ac1..716cc7c 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1.png
index f0cbe4b..5891ff0 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.png
index d495b0d..188ea3d 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2.png
index 970aee9..b42650f 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.png
index 33e8390..17680ce 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3.png
index c1e5118..add0a93 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.png
index ce25a0b..7023c4f0 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4.png
index b4d24d11..6f2a767 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.png
index c4b47e0..318bfd5 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_null.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_null.png
index e1f2b75..26ea7b6 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_null.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_null.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw600dp-xxhdpi/heads_up_window_bg.9.png b/packages/SystemUI/res/drawable-sw600dp-xxhdpi/heads_up_window_bg.9.png
new file mode 100644
index 0000000..586a738
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw600dp-xxhdpi/heads_up_window_bg.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_0.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_0.png
index f3ccfd4..11305ea 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_0.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_100.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_100.png
index d6d9f61..9cd3dbb 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_100.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_100.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_15.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_15.png
index d81a581..2c6a018 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_15.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_15.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_28.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_28.png
index 66bcba5..045a080 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_28.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_28.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_43.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_43.png
index f2472944..91d9694 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_43.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_43.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_57.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_57.png
index f175737..c87bbf2 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_57.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_57.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_71.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_71.png
index b3b7f29..d629095 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_71.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_71.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_85.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_85.png
index 816f0ae..da7dc8f 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_85.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_85.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim0.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim0.png
index 1fbd6fc..3350a2d 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim0.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim100.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim100.png
index 6a1df52..8af8515 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim100.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim100.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim15.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim15.png
index 9a8e6b0..af3f5f5 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim15.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim15.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim28.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim28.png
index 428aa4f..919e71d 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim28.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim28.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim43.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim43.png
index f13d8b9..4d92503 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim43.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim43.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim57.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim57.png
index 8f2332f..b7aa3d1 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim57.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim57.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim71.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim71.png
index 33a2a24..0b25ab3 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim71.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim71.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim85.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim85.png
index ef398fa..b699296 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim85.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim85.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_bluetooth.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_bluetooth.png
index 61c5ee7..0896225 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_bluetooth.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_bluetooth.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_1x.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_1x.png
index 51a3c79..33c2b82 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_1x.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_3g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_3g.png
index 8e62d51..7a1d8d6 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_3g.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_4g.png
index 4546ad1..554953a 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_4g.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_4g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_e.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_e.png
index 112293d..b9e3b88 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_e.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_g.png
index 79d9447..137f76e4 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_g.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_h.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_h.png
index 4dafeba..e8b6d40 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_h.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_lte.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_lte.png
index 92e3873..227a105 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_lte.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_lte.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_roam.png
index a4cb86b..bdaafc9 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_roam.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_roam.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_no_sim.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_no_sim.png
index 8bba3c8..eeac6ad 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_no_sim.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_no_sim.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_0.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_0.png
index b609d3c..0ae59e3 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_0.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1.png
index 6d5454d..172ab5b 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1_fully.png
index 6eb8410..0368f172 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1_fully.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2.png
index 7ab5f6a..669750f 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2_fully.png
index e865805..2813464 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2_fully.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3.png
index a77bceb..5e11523 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3_fully.png
index 5cf396b..811038c 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3_fully.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4.png
index 056bec6..b6b6555 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4_fully.png
index e8d66bc..b4821d7 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4_fully.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_null.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_null.png
index ebc2d32..bdf7bca 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_null.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_null.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/heads_up_window_bg.9.png b/packages/SystemUI/res/drawable-xxhdpi/heads_up_window_bg.9.png
new file mode 100644
index 0000000..586a738
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xxhdpi/heads_up_window_bg.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_menu_share.png b/packages/SystemUI/res/drawable-xxhdpi/ic_menu_share.png
new file mode 100644
index 0000000..d450531
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xxhdpi/ic_menu_share.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_0.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_0.png
index 0c96e54..0795f3a 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_0.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_100.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_100.png
index 4a5ede4..5b002df 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_100.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_100.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_15.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_15.png
index eb3d607..c03248aa 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_15.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_15.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_28.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_28.png
index 6f61b8e..e489d2c 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_28.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_28.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_43.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_43.png
index 4eaf0e6..68a1be8 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_43.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_43.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_57.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_57.png
index e1297ed..e5f639d 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_57.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_57.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_71.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_71.png
index 8e58b76..ddfa424 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_71.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_71.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_85.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_85.png
index 5e55b28..3b3025b 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_85.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_85.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim0.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim0.png
index 0fce153..7ece3af 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim0.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim100.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim100.png
index 4cb166a..2f4cf03 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim100.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim100.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim15.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim15.png
index 0239c15..8179eba 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim15.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim15.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim28.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim28.png
index 96d2bd8..5c925c1 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim28.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim28.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim43.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim43.png
index 2d3ca6c..f527679 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim43.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim43.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim57.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim57.png
index d825f86..fab08f4 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim57.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim57.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim71.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim71.png
index 6f22b47..1f8dc5e 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim71.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim71.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim85.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim85.png
index 0077f86..7f1f977 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim85.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim85.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_bluetooth.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_bluetooth.png
index 235f756..b9825f9 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_bluetooth.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_bluetooth.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_1x.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_1x.png
index 2776d03..9baa623 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_1x.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_3g.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_3g.png
index 59309b0..af3a0d9 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_3g.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_4g.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_4g.png
index f95e3f1..717895b 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_4g.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_4g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_e.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_e.png
index ca93fac..989b236 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_e.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_g.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_g.png
index d2efd69..49cce0d 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_g.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_h.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_h.png
index 9f4ee4cc..caa5552 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_h.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_lte.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_lte.png
index cfdbe63..a0beb07 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_lte.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_lte.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_roam.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_roam.png
index b04e4b0..9cc3184 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_roam.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_roam.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_no_sim.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_no_sim.png
index a5031a3..32415c2 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_no_sim.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_no_sim.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_0.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_0.png
index c694e8b..93fd9b6 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_0.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1.png
index 9051ce9..a8681ec 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1_fully.png
index f696027..47a04cb 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1_fully.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2.png
index e3e0eaf..343eef9 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2_fully.png
index 5df60a1..033bced 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2_fully.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3.png
index e969dda..168f8ff 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3_fully.png
index 635989c..c546e08 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3_fully.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4.png
index 0c28616..a7b32c9 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4_fully.png
index 1c63257..1126d9b 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4_fully.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_null.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_null.png
index 19ee69e..5f8e67b 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_null.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_null.png
Binary files differ
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index 8fceaeb..f58872a 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -35,7 +35,7 @@
     <drawable name="notification_header_bg">#FF000000</drawable>
     <color name="notification_panel_scrim_color">#B0000000</color>
 
-    <color name="batterymeter_frame_color">#FF404040</color>
-    <color name="batterymeter_charge_color">#FF797979</color>
+    <color name="batterymeter_frame_color">#33FFFFFF</color>
+    <color name="batterymeter_charge_color">#7FFFFFFF</color>
     <color name="status_bar_clock_color">#FFFFFFFF</color>
 </resources>
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index 870202a..ddd7c8b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -1741,7 +1741,9 @@
             mGestureRec.add(event);
         }
 
-        setInteracting(true);
+        if (mStatusBarWindowState == WINDOW_STATE_SHOWING) {
+            setInteracting(true);
+        }
         return false;
     }
 
@@ -1769,7 +1771,6 @@
                 && mStatusBarWindowState != state) {
             mStatusBarWindowState = state;
             if (DEBUG_WINDOW_STATE) Log.d(TAG, "Status bar " + windowStateToString(state));
-            mStatusBarWindow.setEnabled(showing);
             if (!showing) {
                 mStatusBarView.collapseAllPanels(false);
             }
@@ -1779,7 +1780,6 @@
                 && mNavigationBarWindowState != state) {
             mNavigationBarWindowState = state;
             if (DEBUG_WINDOW_STATE) Log.d(TAG, "Navigation bar " + windowStateToString(state));
-            mNavigationBarView.setEnabled(showing);
         }
     }
 
diff --git a/services/java/com/android/server/accessibility/TouchExplorer.java b/services/java/com/android/server/accessibility/TouchExplorer.java
index 8fb3998..1b8876d 100644
--- a/services/java/com/android/server/accessibility/TouchExplorer.java
+++ b/services/java/com/android/server/accessibility/TouchExplorer.java
@@ -417,9 +417,6 @@
                     mSendTouchInteractionEndDelayed.forceSendAndRemove();
                 }
 
-                // Cache the event until we discern exploration from gesturing.
-                mSendHoverEnterAndMoveDelayed.addEvent(event);
-
                 // If we have the first tap, schedule a long press and break
                 // since we do not want to schedule hover enter because
                 // the delayed callback will kick in before the long click.
@@ -432,11 +429,16 @@
                     break;
                 }
                 if (!mTouchExplorationInProgress) {
-                    // Deliver hover enter with a delay to have a chance
-                    // to detect what the user is trying to do.
-                    final int pointerId = receivedTracker.getPrimaryPointerId();
-                    final int pointerIdBits = (1 << pointerId);
-                    mSendHoverEnterAndMoveDelayed.post(event, true, pointerIdBits, policyFlags);
+                    if (!mSendHoverEnterAndMoveDelayed.isPending()) {
+                        // Deliver hover enter with a delay to have a chance
+                        // to detect what the user is trying to do.
+                        final int pointerId = receivedTracker.getPrimaryPointerId();
+                        final int pointerIdBits = (1 << pointerId);
+                        mSendHoverEnterAndMoveDelayed.post(event, true, pointerIdBits,
+                                policyFlags);
+                    }
+                    // Cache the event until we discern exploration from gesturing.
+                    mSendHoverEnterAndMoveDelayed.addEvent(event);
                 }
             } break;
             case MotionEvent.ACTION_POINTER_DOWN: {
@@ -1719,7 +1721,7 @@
                 } break;
             }
             if (DEBUG) {
-                Slog.i(LOG_TAG_RECEIVED_POINTER_TRACKER, "Received pointer: " + toString());
+                Slog.i(LOG_TAG_RECEIVED_POINTER_TRACKER, "Received pointer:\n" + toString());
             }
         }
 
@@ -1777,7 +1779,7 @@
          */
         public int getPrimaryPointerId() {
             if (mPrimaryPointerId == INVALID_POINTER_ID) {
-                mPrimaryPointerId = findPrimaryPointer();
+                mPrimaryPointerId = findPrimaryPointerId();
             }
             return mPrimaryPointerId;
         }
@@ -1861,17 +1863,21 @@
         }
 
         /**
-         * @return The primary pointer.
+         * @return The primary pointer id.
          */
-        private int findPrimaryPointer() {
+        private int findPrimaryPointerId() {
             int primaryPointerId = INVALID_POINTER_ID;
             long minDownTime = Long.MAX_VALUE;
+
             // Find the pointer that went down first.
-            for (int i = 0, count = mReceivedPointerDownTime.length; i < count; i++) {
-                final long downPointerTime = mReceivedPointerDownTime[i];
+            int pointerIdBits = mReceivedPointersDown;
+            while (pointerIdBits > 0) {
+                final int pointerId = Integer.numberOfTrailingZeros(pointerIdBits);
+                pointerIdBits &= ~(1 << pointerId);
+                final long downPointerTime = mReceivedPointerDownTime[pointerId];
                 if (downPointerTime < minDownTime) {
                     minDownTime = downPointerTime;
-                    primaryPointerId = i;
+                    primaryPointerId = pointerId;
                 }
             }
             return primaryPointerId;
diff --git a/services/java/com/android/server/content/ContentService.java b/services/java/com/android/server/content/ContentService.java
index a56af08..7c82821 100644
--- a/services/java/com/android/server/content/ContentService.java
+++ b/services/java/com/android/server/content/ContentService.java
@@ -19,7 +19,6 @@
 import android.Manifest;
 import android.accounts.Account;
 import android.app.ActivityManager;
-import android.content.ComponentName;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.IContentService;
@@ -363,8 +362,8 @@
             if (syncManager != null) {
                 if (request.hasAuthority()) {
                     // Sync Adapter registered with the system - old API.
-                    final  Account account = request.getProviderInfo().first;
-                    final String provider = request.getProviderInfo().second;
+                    final  Account account = request.getAccount();
+                    final String provider = request.getProvider();
                     if (request.isPeriodic()) {
                         mContext.enforceCallingOrSelfPermission(
                                 Manifest.permission.WRITE_SYNC_SETTINGS,
@@ -386,20 +385,7 @@
                                 false /* onlyThoseWithUnknownSyncableState */);
                     }
                 } else {
-                    // Anonymous sync - new API.
-                    final ComponentName syncService = request.getService();
-                    if (request.isPeriodic()) {
-                        throw new RuntimeException("Periodic anonymous syncs not implemented yet.");
-                    } else {
-                        long beforeRuntimeMillis = (flextime) * 1000;
-                        long runtimeMillis = runAtTime * 1000;
-                        syncManager.scheduleSync(
-                              syncService, userId, uId, extras,
-                              beforeRuntimeMillis,
-                              runtimeMillis,
-                              false /* onlyThoseWithUnknownSyncableState */); // Empty function.
-                        throw new RuntimeException("One-off anonymous syncs not implemented yet.");
-                    }
+                    Log.w(TAG, "Unrecognised sync parameters, doing nothing.");
                 }
             }
         } finally {
diff --git a/services/java/com/android/server/content/SyncManager.java b/services/java/com/android/server/content/SyncManager.java
index a6b69a2..9a41166 100644
--- a/services/java/com/android/server/content/SyncManager.java
+++ b/services/java/com/android/server/content/SyncManager.java
@@ -87,6 +87,7 @@
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
@@ -539,177 +540,6 @@
     }
 
     /**
-     * Initiate a sync using the new anonymous service API.
-     * TODO: Implement.
-     * @param cname SyncService component bound to in order to perform the sync. 
-     * @param userId the id of the user whose accounts are to be synced. If userId is USER_ALL,
-     *          then all users' accounts are considered.
-     * @param uid Linux uid of the application that is performing the sync. 
-     * @param extras a Map of SyncAdapter-specific information to control
-     *          syncs of a specific provider. Can be null.
-     * @param beforeRunTimeMillis
-     *  @param runtimeMillis
-     */
-    public void scheduleSync(ComponentName cname, int userId, int uid, Bundle extras,
-            long beforeRunTimeMillis, long runtimeMillis,
-            boolean onlyThoseWithUnknownSyncableState) {
-/**
-        boolean isLoggable = Log.isLoggable(TAG, Log.VERBOSE);
-
-        final boolean backgroundDataUsageAllowed = !mBootCompleted ||
-                getConnectivityManager().getBackgroundDataSetting();
-
-        if (extras == null) {
-            extras = new Bundle();
-        }
-        if (isLoggable) {
-            Log.e(TAG, requestedAccount + " " + extras.toString() + " " + requestedAuthority);
-        }
-        Boolean expedited = extras.getBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, false);
-        if (expedited) {
-            runtimeMillis = -1; // this means schedule at the front of the queue
-        }
-
-        AccountAndUser[] accounts;
-        if (requestedAccount != null && userId != UserHandle.USER_ALL) {
-            accounts = new AccountAndUser[] { new AccountAndUser(requestedAccount, userId) };
-        } else {
-            // if the accounts aren't configured yet then we can't support an account-less
-            // sync request
-            accounts = mRunningAccounts;
-            if (accounts.length == 0) {
-                if (isLoggable) {
-                    Log.v(TAG, "scheduleSync: no accounts configured, dropping");
-                }
-                return;
-            }
-        }
-
-        final boolean uploadOnly = extras.getBoolean(ContentResolver.SYNC_EXTRAS_UPLOAD, false);
-        final boolean manualSync = extras.getBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, false);
-        if (manualSync) {
-            extras.putBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_BACKOFF, true);
-            extras.putBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_SETTINGS, true);
-        }
-        final boolean ignoreSettings =
-                extras.getBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_SETTINGS, false);
-
-        int source;
-        if (uploadOnly) {
-            source = SyncStorageEngine.SOURCE_LOCAL;
-        } else if (manualSync) {
-            source = SyncStorageEngine.SOURCE_USER;
-        } else if (requestedAuthority == null) {
-            source = SyncStorageEngine.SOURCE_POLL;
-        } else {
-            // this isn't strictly server, since arbitrary callers can (and do) request
-            // a non-forced two-way sync on a specific url
-            source = SyncStorageEngine.SOURCE_SERVER;
-        }
-
-        for (AccountAndUser account : accounts) {
-            // Compile a list of authorities that have sync adapters.
-            // For each authority sync each account that matches a sync adapter.
-            final HashSet<String> syncableAuthorities = new HashSet<String>();
-            for (RegisteredServicesCache.ServiceInfo<SyncAdapterType> syncAdapter :
-                    mSyncAdapters.getAllServices(account.userId)) {
-                syncableAuthorities.add(syncAdapter.type.authority);
-            }
-
-            // if the url was specified then replace the list of authorities
-            // with just this authority or clear it if this authority isn't
-            // syncable
-            if (requestedAuthority != null) {
-                final boolean hasSyncAdapter = syncableAuthorities.contains(requestedAuthority);
-                syncableAuthorities.clear();
-                if (hasSyncAdapter) syncableAuthorities.add(requestedAuthority);
-            }
-
-            for (String authority : syncableAuthorities) {
-                int isSyncable = getIsSyncable(account.account, account.userId,
-                        authority);
-                if (isSyncable == 0) {
-                    continue;
-                }
-                final RegisteredServicesCache.ServiceInfo<SyncAdapterType> syncAdapterInfo;
-                syncAdapterInfo = mSyncAdapters.getServiceInfo(
-                        SyncAdapterType.newKey(authority, account.account.type), account.userId);
-                if (syncAdapterInfo == null) {
-                    continue;
-                }
-                final boolean allowParallelSyncs = syncAdapterInfo.type.allowParallelSyncs();
-                final boolean isAlwaysSyncable = syncAdapterInfo.type.isAlwaysSyncable();
-                if (isSyncable < 0 && isAlwaysSyncable) {
-                    mSyncStorageEngine.setIsSyncable(account.account, account.userId, authority, 1);
-                    isSyncable = 1;
-                }
-                if (onlyThoseWithUnkownSyncableState && isSyncable >= 0) {
-                    continue;
-                }
-                if (!syncAdapterInfo.type.supportsUploading() && uploadOnly) {
-                    continue;
-                }
-
-                // always allow if the isSyncable state is unknown
-                boolean syncAllowed =
-                        (isSyncable < 0)
-                        || ignoreSettings
-                        || (backgroundDataUsageAllowed
-                                && mSyncStorageEngine.getMasterSyncAutomatically(account.userId)
-                                && mSyncStorageEngine.getSyncAutomatically(account.account,
-                                        account.userId, authority));
-                if (!syncAllowed) {
-                    if (isLoggable) {
-                        Log.d(TAG, "scheduleSync: sync of " + account + ", " + authority
-                                + " is not allowed, dropping request");
-                    }
-                    continue;
-                }
-
-                Pair<Long, Long> backoff = mSyncStorageEngine
-                        .getBackoff(account.account, account.userId, authority);
-                long delayUntil = mSyncStorageEngine.getDelayUntilTime(account.account,
-                        account.userId, authority);
-                final long backoffTime = backoff != null ? backoff.first : 0;
-                if (isSyncable < 0) {
-                    // Initialisation sync.
-                    Bundle newExtras = new Bundle();
-                    newExtras.putBoolean(ContentResolver.SYNC_EXTRAS_INITIALIZE, true);
-                    if (isLoggable) {
-                        Log.v(TAG, "schedule initialisation Sync:"
-                                + ", delay until " + delayUntil
-                                + ", run by " + 0
-                                + ", source " + source
-                                + ", account " + account
-                                + ", authority " + authority
-                                + ", extras " + newExtras);
-                    }
-                    scheduleSyncOperation(
-                            new SyncOperation(account.account, account.userId, reason, source,
-                                    authority, newExtras, 0 /* immediate , 0 /* No flex time,
-                                    backoffTime, delayUntil, allowParallelSyncs));
-                }
-                if (!onlyThoseWithUnkownSyncableState) {
-                    if (isLoggable) {
-                        Log.v(TAG, "scheduleSync:"
-                                + " delay until " + delayUntil
-                                + " run by " + runtimeMillis
-                                + " flex " + beforeRuntimeMillis
-                                + ", source " + source
-                                + ", account " + account
-                                + ", authority " + authority
-                                + ", extras " + extras);
-                    }
-                    scheduleSyncOperation(
-                            new SyncOperation(account.account, account.userId, reason, source,
-                                    authority, extras, runtimeMillis, beforeRuntimeMillis,
-                                    backoffTime, delayUntil, allowParallelSyncs));
-                }
-            }
-        }*/
-    }
-
-    /**
      * Initiate a sync. This can start a sync for all providers
      * (pass null to url, set onlyTicklable to false), only those
      * providers that are marked as ticklable (pass null to url,
@@ -2190,17 +2020,14 @@
                 for (int i = 0, N = authorityInfo.periodicSyncs.size(); i < N; i++) {
                     final PeriodicSync sync = authorityInfo.periodicSyncs.get(i);
                     final Bundle extras = sync.extras;
-                    final Long periodInMillis = sync.period * 1000;
-                    final Long flexInMillis = sync.flexTime * 1000;
+                    final long periodInMillis = sync.period * 1000;
+                    final long flexInMillis = sync.flexTime * 1000;
                     // Skip if the period is invalid.
                     if (periodInMillis <= 0) {
                         continue;
                     }
                     // Find when this periodic sync was last scheduled to run.
                     final long lastPollTimeAbsolute = status.getPeriodicSyncTime(i);
-                    final long shiftedLastPollTimeAbsolute =
-                            (0 < lastPollTimeAbsolute - mSyncRandomOffsetMillis) ?
-                                    (lastPollTimeAbsolute - mSyncRandomOffsetMillis) : 0;
                     long remainingMillis
                         = periodInMillis - (shiftedNowAbsolute % periodInMillis);
                     long timeSinceLastRunMillis
@@ -2217,7 +2044,6 @@
                         + " remaining: " + (remainingMillis)
                         + " time_since_last: " + timeSinceLastRunMillis
                         + " last poll absol: " + lastPollTimeAbsolute
-                        + " last poll shifed: " + shiftedLastPollTimeAbsolute
                         + " shifted now: " + shiftedNowAbsolute
                         + " run_early: " + runEarly);
                     }
@@ -2392,6 +2218,15 @@
                         }
                         continue;
                     }
+
+                    // If the op isn't allowed on metered networks and we're on one, drop it.
+                    if (getConnectivityManager().isActiveNetworkMetered()
+                            && op.isMeteredDisallowed()) {
+                        operationIterator.remove();
+                        mSyncStorageEngine.deleteFromPending(op.pendingOperation);
+                        continue;
+                    }
+
                     // TODO: change this behaviour for non-registered syncs.
                     final RegisteredServicesCache.ServiceInfo<SyncAdapterType> syncAdapterInfo;
                     syncAdapterInfo = mSyncAdapters.getServiceInfo(
diff --git a/services/java/com/android/server/content/SyncOperation.java b/services/java/com/android/server/content/SyncOperation.java
index ce1dde4..48567478 100644
--- a/services/java/com/android/server/content/SyncOperation.java
+++ b/services/java/com/android/server/content/SyncOperation.java
@@ -111,40 +111,6 @@
         this.key = toKey();
     }
 
-    public SyncOperation(SyncRequest request, int userId, int reason, int source, long backoff,
-            long delayUntil, boolean allowParallelSyncs) {
-        if (request.hasAuthority()) {
-            Pair<Account, String> providerInfo = request.getProviderInfo();
-            this.account = providerInfo.first;
-            this.authority = providerInfo.second;
-            this.service = null;
-        } else {
-            this.service = request.getService();
-            this.account = null;
-            this.authority = null;
-        }
-        this.userId = userId;
-        this.reason = reason;
-        this.syncSource = source;
-        this.allowParallelSyncs = allowParallelSyncs;
-        this.extras = new Bundle(extras);
-        cleanBundle(this.extras);
-        this.delayUntil = delayUntil;
-        this.backoff = backoff;
-        final long now = SystemClock.elapsedRealtime();
-        if (request.isExpedited()) {
-            this.expedited = true;
-            this.latestRunTime = now;
-            this.flexTime = 0;
-        } else {
-            this.expedited = false;
-            this.latestRunTime = now + (request.getSyncRunTime() * 1000);
-            this.flexTime = request.getSyncFlexTime() * 1000;
-        }
-        updateEffectiveRunTime();
-        this.key = toKey();
-    }
-
     /**
      * Make sure the bundle attached to this SyncOperation doesn't have unnecessary
      * flags set.
@@ -159,7 +125,7 @@
         removeFalseExtra(bundle, ContentResolver.SYNC_EXTRAS_DISCARD_LOCAL_DELETIONS);
         removeFalseExtra(bundle, ContentResolver.SYNC_EXTRAS_EXPEDITED);
         removeFalseExtra(bundle, ContentResolver.SYNC_EXTRAS_OVERRIDE_TOO_MANY_DELETIONS);
-        removeFalseExtra(bundle, ContentResolver.SYNC_EXTRAS_ALLOW_METERED);
+        removeFalseExtra(bundle, ContentResolver.SYNC_EXTRAS_DISALLOW_METERED);
 
         // Remove Config data.
         bundle.remove(ContentResolver.SYNC_EXTRAS_EXPECTED_UPLOAD);
@@ -245,8 +211,8 @@
         }
     }
 
-    public boolean isMetered() {
-        return extras.getBoolean(ContentResolver.SYNC_EXTRAS_ALLOW_METERED, false);
+    public boolean isMeteredDisallowed() {
+        return extras.getBoolean(ContentResolver.SYNC_EXTRAS_DISALLOW_METERED, false);
     }
 
     public boolean isInitialization() {
diff --git a/services/java/com/android/server/location/GeofenceProxy.java b/services/java/com/android/server/location/GeofenceProxy.java
index a86c923..bbc1f47 100644
--- a/services/java/com/android/server/location/GeofenceProxy.java
+++ b/services/java/com/android/server/location/GeofenceProxy.java
@@ -41,11 +41,15 @@
     private static final String TAG = "GeofenceProxy";
     private static final String SERVICE_ACTION =
             "com.android.location.service.GeofenceProvider";
-    private ServiceWatcher mServiceWatcher;
-    private Context mContext;
+    private final ServiceWatcher mServiceWatcher;
+    private final Context mContext;
+    private final IGpsGeofenceHardware mGpsGeofenceHardware;
+    private final IFusedGeofenceHardware mFusedGeofenceHardware;
+
+    private final Object mLock = new Object();
+
+    // Access to mGeofenceHardware needs to be synchronized by mLock.
     private IGeofenceHardware mGeofenceHardware;
-    private IGpsGeofenceHardware mGpsGeofenceHardware;
-    private IFusedGeofenceHardware mFusedGeofenceHardware;
 
     private static final int GEOFENCE_PROVIDER_CONNECTED = 1;
     private static final int GEOFENCE_HARDWARE_CONNECTED = 2;
@@ -90,10 +94,6 @@
         return mServiceWatcher.start();
     }
 
-    private IGeofenceProvider getGeofenceProviderService() {
-        return IGeofenceProvider.Stub.asInterface(mServiceWatcher.getBinder());
-    }
-
     private void bindHardwareGeofence() {
         mContext.bindServiceAsUser(new Intent(mContext, GeofenceHardwareService.class),
                 mServiceConnection, Context.BIND_AUTO_CREATE, UserHandle.OWNER);
@@ -102,26 +102,34 @@
     private ServiceConnection mServiceConnection = new ServiceConnection() {
         @Override
         public void onServiceConnected(ComponentName name, IBinder service) {
-            mGeofenceHardware = IGeofenceHardware.Stub.asInterface(service);
-            mHandler.sendEmptyMessage(GEOFENCE_HARDWARE_CONNECTED);
+            synchronized (mLock) {
+                mGeofenceHardware = IGeofenceHardware.Stub.asInterface(service);
+                mHandler.sendEmptyMessage(GEOFENCE_HARDWARE_CONNECTED);
+            }
         }
 
         @Override
         public void onServiceDisconnected(ComponentName name) {
-            mGeofenceHardware = null;
-            mHandler.sendEmptyMessage(GEOFENCE_HARDWARE_DISCONNECTED);
+            synchronized (mLock) {
+                mGeofenceHardware = null;
+                mHandler.sendEmptyMessage(GEOFENCE_HARDWARE_DISCONNECTED);
+            }
         }
     };
 
-    private void setGeofenceHardwareInProvider() {
+    private void setGeofenceHardwareInProviderLocked() {
         try {
-            getGeofenceProviderService().setGeofenceHardware(mGeofenceHardware);
+            IGeofenceProvider provider = IGeofenceProvider.Stub.asInterface(
+                      mServiceWatcher.getBinder());
+            if (provider != null) {
+                provider.setGeofenceHardware(mGeofenceHardware);
+            }
         } catch (RemoteException e) {
-            Log.e(TAG, "Remote Exception: setGeofenceHardwareInProvider: " + e);
+            Log.e(TAG, "Remote Exception: setGeofenceHardwareInProviderLocked: " + e);
         }
     }
 
-    private void setGpsGeofence() {
+    private void setGpsGeofenceLocked() {
         try {
             mGeofenceHardware.setGpsGeofenceHardware(mGpsGeofenceHardware);
         } catch (RemoteException e) {
@@ -129,7 +137,7 @@
         }
     }
 
-    private void setFusedGeofence() {
+    private void setFusedGeofenceLocked() {
         try {
             mGeofenceHardware.setFusedGeofenceHardware(mFusedGeofenceHardware);
         } catch(RemoteException e) {
@@ -140,30 +148,37 @@
     // This needs to be reworked, when more services get added,
     // Might need a state machine or add a framework utility class,
     private Handler mHandler = new Handler() {
-        private boolean mGeofenceHardwareConnected = false;
-        private boolean mGeofenceProviderConnected = false;
-
 
         @Override
         public void handleMessage(Message msg) {
             switch (msg.what) {
                 case GEOFENCE_PROVIDER_CONNECTED:
-                    mGeofenceProviderConnected = true;
-                    if (mGeofenceHardwareConnected) {
-                        setGeofenceHardwareInProvider();
+                    synchronized (mLock) {
+                        if (mGeofenceHardware != null) {
+                            setGeofenceHardwareInProviderLocked();
+                        }
+                        // else: the geofence provider will be notified when the connection to
+                        // GeofenceHardwareService is established.
                     }
                     break;
                 case GEOFENCE_HARDWARE_CONNECTED:
-                    setGpsGeofence();
-                    setFusedGeofence();
-                    mGeofenceHardwareConnected = true;
-                    if (mGeofenceProviderConnected) {
-                        setGeofenceHardwareInProvider();
+                    synchronized (mLock) {
+                        // Theoretically this won't happen because once the GeofenceHardwareService
+                        // is connected to, we won't lose connection to it because it's a system
+                        // service. But this check does make the code more robust.
+                        if (mGeofenceHardware != null) {
+                            setGpsGeofenceLocked();
+                            setFusedGeofenceLocked();
+                            setGeofenceHardwareInProviderLocked();
+                        }
                     }
                     break;
                 case GEOFENCE_HARDWARE_DISCONNECTED:
-                    mGeofenceHardwareConnected = false;
-                    setGeofenceHardwareInProvider();
+                    synchronized (mLock) {
+                        if (mGeofenceHardware == null) {
+                            setGeofenceHardwareInProviderLocked();
+                        }
+                    }
                     break;
             }
         }
diff --git a/services/java/com/android/server/pm/Settings.java b/services/java/com/android/server/pm/Settings.java
index ff1128d..415cda1 100644
--- a/services/java/com/android/server/pm/Settings.java
+++ b/services/java/com/android/server/pm/Settings.java
@@ -1385,6 +1385,11 @@
 
                 StringBuilder sb = new StringBuilder();
                 for (final PackageSetting pkg : mPackages.values()) {
+                    if (pkg.pkg == null || pkg.pkg.applicationInfo == null) {
+                        Slog.w(TAG, "Skipping " + pkg + " due to missing metadata");
+                        continue;
+                    }
+
                     final ApplicationInfo ai = pkg.pkg.applicationInfo;
                     final String dataPath = ai.dataDir;
                     final boolean isDebug = (ai.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
diff --git a/services/java/com/android/server/print/RemotePrintService.java b/services/java/com/android/server/print/RemotePrintService.java
index 14af9d8..3c67aa9 100644
--- a/services/java/com/android/server/print/RemotePrintService.java
+++ b/services/java/com/android/server/print/RemotePrintService.java
@@ -163,7 +163,7 @@
 
         if (isBound()) {
             if (DEBUG) {
-                Slog.i(LOG_TAG, "[user: " + mUserId + "] handleOnAllPrintJobsHandled()");
+                Slog.i(LOG_TAG, "[user: " + mUserId + "] onAllPrintJobsHandled()");
             }
 
             // If the service has a printer discovery session
@@ -185,7 +185,7 @@
         // which means that there are no print jobs to be cancelled.
         if (isBound()) {
             if (DEBUG) {
-                Slog.i(LOG_TAG, "[user: " + mUserId + "] handleRequestCancelPrintJob()");
+                Slog.i(LOG_TAG, "[user: " + mUserId + "] requestCancelPrintJob()");
             }
             try {
                 mPrintService.requestCancelPrintJob(printJob);
@@ -215,7 +215,7 @@
             });
         } else {
             if (DEBUG) {
-                Slog.i(LOG_TAG, "[user: " + mUserId + "] handleOnPrintJobQueued()");
+                Slog.i(LOG_TAG, "[user: " + mUserId + "] onPrintJobQueued()");
             }
             try {
                 mPrintService.onPrintJobQueued(printJob);
@@ -358,7 +358,7 @@
             });
         } else {
             if (DEBUG) {
-                Slog.i(LOG_TAG, "[user: " + mUserId + "] handleValidatePrinters()");
+                Slog.i(LOG_TAG, "[user: " + mUserId + "] validatePrinters()");
             }
             try {
                 mPrintService.validatePrinters(printerIds);
@@ -385,7 +385,7 @@
             });
         } else {
             if (DEBUG) {
-                Slog.i(LOG_TAG, "[user: " + mUserId + "] handleStartPrinterTracking()");
+                Slog.i(LOG_TAG, "[user: " + mUserId + "] startPrinterTracking()");
             }
             try {
                 mPrintService.startPrinterStateTracking(printerId);
@@ -412,7 +412,7 @@
             });
         } else {
             if (DEBUG) {
-                Slog.i(LOG_TAG, "[user: " + mUserId + "] handleStopPrinterTracking()");
+                Slog.i(LOG_TAG, "[user: " + mUserId + "] stopPrinterTracking()");
             }
             try {
                 mPrintService.stopPrinterStateTracking(printerId);
diff --git a/services/java/com/android/server/print/UserState.java b/services/java/com/android/server/print/UserState.java
index 4a1b96b..b9c676d 100644
--- a/services/java/com/android/server/print/UserState.java
+++ b/services/java/com/android/server/print/UserState.java
@@ -19,8 +19,6 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
-import android.content.SharedPreferences;
-import android.content.SharedPreferences.Editor;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
@@ -64,15 +62,10 @@
 
     private static final boolean DEBUG = true && Build.IS_DEBUGGABLE;
 
-    private static final int MAX_ITEMS_PER_CALLBACK = 100;
+    private static final int MAX_ITEMS_PER_CALLBACK = 50;
 
     private static final char COMPONENT_NAME_SEPARATOR = ':';
 
-    private static final String SHARED_PREFERENCES_FILE = "shared_prefs";
-
-    private static final String KEY_SYSTEM_PRINT_SERVICES_ENABLED =
-            "KEY_SYSTEM_PRINT_SERVICES_ENABLED";
-
     private final SimpleStringSplitter mStringColonSplitter =
             new SimpleStringSplitter(COMPONENT_NAME_SEPARATOR);
 
@@ -105,7 +98,9 @@
         mUserId = userId;
         mLock = lock;
         mSpooler = new RemotePrintSpooler(context, userId, this);
-        enableSystemPrintServicesOnce();
+        synchronized (mLock) {
+            enableSystemPrintServicesOnFirstBootLocked();
+        }
     }
 
     @Override
@@ -379,11 +374,23 @@
         return false;
     }
 
+
     private boolean readEnabledPrintServicesLocked() {
         Set<ComponentName> tempEnabledServiceNameSet = new HashSet<ComponentName>();
+        readPrintServicesFromSettingLocked(Settings.Secure.ENABLED_PRINT_SERVICES,
+                tempEnabledServiceNameSet);
+        if (!tempEnabledServiceNameSet.equals(mEnabledServices)) {
+            mEnabledServices.clear();
+            mEnabledServices.addAll(tempEnabledServiceNameSet);
+            return true;
+        }
+        return false;
+    }
 
+    private void readPrintServicesFromSettingLocked(String setting,
+            Set<ComponentName> outServiceNames) {
         String settingValue = Settings.Secure.getStringForUser(mContext.getContentResolver(),
-                Settings.Secure.ENABLED_PRINT_SERVICES, mUserId);
+                setting, mUserId);
         if (!TextUtils.isEmpty(settingValue)) {
             TextUtils.SimpleStringSplitter splitter = mStringColonSplitter;
             splitter.setString(settingValue);
@@ -394,48 +401,72 @@
                 }
                 ComponentName componentName = ComponentName.unflattenFromString(string);
                 if (componentName != null) {
-                    tempEnabledServiceNameSet.add(componentName);
+                    outServiceNames.add(componentName);
                 }
             }
         }
-
-        if (!tempEnabledServiceNameSet.equals(mEnabledServices)) {
-            mEnabledServices.clear();
-            mEnabledServices.addAll(tempEnabledServiceNameSet);
-            return true;
-        }
-
-        return false;
     }
 
-    private void enableSystemPrintServicesOnce() {
-        SharedPreferences preferences = mContext.getSharedPreferences(
-                SHARED_PREFERENCES_FILE, Context.MODE_PRIVATE);
-        if (preferences.getInt(KEY_SYSTEM_PRINT_SERVICES_ENABLED, 0) == 0) {
-            Editor editor = preferences.edit();
-            editor.putInt(KEY_SYSTEM_PRINT_SERVICES_ENABLED, 1);
-            editor.commit();
+    private void enableSystemPrintServicesOnFirstBootLocked() {
+        // Load enabled and installed services.
+        readEnabledPrintServicesLocked();
+        readInstalledPrintServicesLocked();
 
-            readInstalledPrintServicesLocked();
+        // Load the system services once enabled on first boot.
+        Set<ComponentName> enabledOnFirstBoot = new HashSet<ComponentName>();
+        readPrintServicesFromSettingLocked(
+                Settings.Secure.ENABLED_ON_FIRST_BOOT_SYSTEM_PRINT_SERVICES,
+                enabledOnFirstBoot);
 
-            StringBuilder builder = new StringBuilder();
+        StringBuilder builder = new StringBuilder();
 
-            final int serviceCount = mInstalledServices.size();
-            for (int i = 0; i < serviceCount; i++) {
-                ServiceInfo serviceInfo = mInstalledServices.get(i).getResolveInfo().serviceInfo;
-                if ((serviceInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
-                    ComponentName serviceName = new ComponentName(
-                            serviceInfo.packageName, serviceInfo.name);
+        final int serviceCount = mInstalledServices.size();
+        for (int i = 0; i < serviceCount; i++) {
+            ServiceInfo serviceInfo = mInstalledServices.get(i).getResolveInfo().serviceInfo;
+            // Enable system print services if we never did that and are not enabled.
+            if ((serviceInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
+                ComponentName serviceName = new ComponentName(
+                        serviceInfo.packageName, serviceInfo.name);
+                if (!mEnabledServices.contains(serviceName)
+                        && !enabledOnFirstBoot.contains(serviceName)) {
                     if (builder.length() > 0) {
                         builder.append(":");
                     }
                     builder.append(serviceName.flattenToString());
                 }
             }
-
-            Settings.Secure.putStringForUser(mContext.getContentResolver(),
-                    Settings.Secure.ENABLED_PRINT_SERVICES, builder.toString(), mUserId);
         }
+
+        // Nothing to be enabled - done.
+        if (builder.length() <= 0) {
+            return;
+        }
+
+        String servicesToEnable = builder.toString();
+
+        // Update the enabled services setting.
+        String enabledServices = Settings.Secure.getStringForUser(
+                mContext.getContentResolver(), Settings.Secure.ENABLED_PRINT_SERVICES, mUserId);
+        if (TextUtils.isEmpty(enabledServices)) {
+            enabledServices = servicesToEnable;
+        } else {
+            enabledServices = enabledServices + ":" + servicesToEnable;
+        }
+        Settings.Secure.putStringForUser(mContext.getContentResolver(),
+                Settings.Secure.ENABLED_PRINT_SERVICES, enabledServices, mUserId);
+
+        // Update the enabled on first boot services setting.
+        String enabledOnFirstBootServices = Settings.Secure.getStringForUser(
+                mContext.getContentResolver(),
+                Settings.Secure.ENABLED_ON_FIRST_BOOT_SYSTEM_PRINT_SERVICES, mUserId);
+        if (TextUtils.isEmpty(enabledOnFirstBootServices)) {
+            enabledOnFirstBootServices = servicesToEnable;
+        } else {
+            enabledOnFirstBootServices = enabledOnFirstBootServices + ":" + enabledServices;
+        }
+        Settings.Secure.putStringForUser(mContext.getContentResolver(),
+                Settings.Secure.ENABLED_ON_FIRST_BOOT_SYSTEM_PRINT_SERVICES,
+                enabledOnFirstBootServices, mUserId);
     }
 
     private void onConfigurationChangedLocked() {
@@ -545,10 +576,12 @@
 
             // Remember we got a start request to match with an end.
             mStartedPrinterDiscoveryTokens.add(observer.asBinder());
+
             // The service are already performing discovery - nothing to do.
             if (mStartedPrinterDiscoveryTokens.size() > 1) {
                 return;
             }
+
             List<RemotePrintService> services = new ArrayList<RemotePrintService>(
                     mActiveServices.values());
             SomeArgs args = SomeArgs.obtain();
@@ -827,11 +860,7 @@
             final int observerCount = mDiscoveryObservers.beginBroadcast();
             for (int i = 0; i < observerCount; i++) {
                 IPrinterDiscoveryObserver observer = mDiscoveryObservers.getBroadcastItem(i);
-                try {
-                    observer.onPrintersAdded(addedPrinters);
-                } catch (RemoteException re) {
-                    Log.i(LOG_TAG, "Error dispatching added printers", re);
-                }
+                handlePrintersAdded(observer, addedPrinters);
             }
             mDiscoveryObservers.finishBroadcast();
         }
@@ -840,11 +869,7 @@
             final int observerCount = mDiscoveryObservers.beginBroadcast();
             for (int i = 0; i < observerCount; i++) {
                 IPrinterDiscoveryObserver observer = mDiscoveryObservers.getBroadcastItem(i);
-                try {
-                    observer.onPrintersRemoved(removedPrinterIds);
-                } catch (RemoteException re) {
-                    Log.i(LOG_TAG, "Error dispatching removed printers", re);
-                }
+                handlePrintersRemoved(observer, removedPrinterIds);
             }
             mDiscoveryObservers.finishBroadcast();
         }
@@ -853,11 +878,7 @@
             final int observerCount = mDiscoveryObservers.beginBroadcast();
             for (int i = 0; i < observerCount; i++) {
                 IPrinterDiscoveryObserver observer = mDiscoveryObservers.getBroadcastItem(i);
-                try {
-                    observer.onPrintersUpdated(updatedPrinters);
-                } catch (RemoteException re) {
-                    Log.i(LOG_TAG, "Error dispatching updated printers", re);
-                }
+                handlePrintersUpdated(observer, updatedPrinters);
             }
             mDiscoveryObservers.finishBroadcast();
         }
@@ -926,7 +947,7 @@
                         final int start = i * MAX_ITEMS_PER_CALLBACK;
                         final int end = Math.min(start + MAX_ITEMS_PER_CALLBACK, printerCount);
                         List<PrinterInfo> subPrinters = printers.subList(start, end);
-                        observer.onPrintersAdded(subPrinters);
+                        observer.onPrintersAdded(subPrinters); 
                     }
                 }
             } catch (RemoteException re) {
@@ -955,6 +976,27 @@
             }
         }
 
+        private void handlePrintersUpdated(IPrinterDiscoveryObserver observer,
+                List<PrinterInfo> updatedPrinters) {
+            try {
+                final int printerCount = updatedPrinters.size();
+                if (printerCount <= MAX_ITEMS_PER_CALLBACK) {
+                    observer.onPrintersUpdated(updatedPrinters);
+                } else {
+                    // Send the added printers in chunks avoiding the binder transaction limit.
+                    final int transactionCount = (printerCount / MAX_ITEMS_PER_CALLBACK) + 1;
+                    for (int i = 0; i < transactionCount; i++) {
+                        final int start = i * MAX_ITEMS_PER_CALLBACK;
+                        final int end = Math.min(start + MAX_ITEMS_PER_CALLBACK, printerCount);
+                        List<PrinterInfo> subPrinters = updatedPrinters.subList(start, end);
+                        observer.onPrintersUpdated(subPrinters); 
+                    }
+                }
+            } catch (RemoteException re) {
+                Log.e(LOG_TAG, "Error sending updated printers", re);
+            }
+        }
+
         private final class SessionHandler extends Handler {
             public static final int MSG_PRINTERS_ADDED = 1;
             public static final int MSG_PRINTERS_REMOVED = 2;
diff --git a/tests/DumpRenderTree/Android.mk b/tests/DumpRenderTree/Android.mk
deleted file mode 100644
index 505a436..0000000
--- a/tests/DumpRenderTree/Android.mk
+++ /dev/null
@@ -1,12 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_SRC_FILES := $(call all-subdir-java-files)
-
-LOCAL_JAVA_LIBRARIES := android.test.runner
-
-LOCAL_PACKAGE_NAME := DumpRenderTree
-
-include $(BUILD_PACKAGE)
diff --git a/tests/DumpRenderTree/AndroidManifest.xml b/tests/DumpRenderTree/AndroidManifest.xml
deleted file mode 100644
index bcb821b..0000000
--- a/tests/DumpRenderTree/AndroidManifest.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 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.
-     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.dumprendertree">
-    <application android:name="HTMLHostApp">
-        <uses-library android:name="android.test.runner" />
-        <activity android:name="Menu" android:label="Dump Render Tree"
-          android:screenOrientation="portrait"
-          android:theme="@android:style/Theme.Light">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.TEST" />
-            </intent-filter>
-        </activity>
-        <activity android:name="TestShellActivity"
-          android:launchMode="singleTop"
-          android:hardwareAccelerated="true"
-          android:screenOrientation="portrait"
-          android:theme="@android:style/Theme.Light"/>
-        <activity android:name="ReliabilityTestActivity" android:screenOrientation="portrait"
-          android:theme="@android:style/Theme.Light"/>
-    </application>
-
-    <instrumentation android:name=".LayoutTestsAutoRunner"
-        android:targetPackage="com.android.dumprendertree"
-        android:label="Layout test automation runner"
-    />
-    <uses-permission android:name="android.permission.INTERNET" />
-    <uses-permission android:name="android.permission.WRITE_SDCARD" />
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
-    <uses-sdk android:minSdkVersion="5"
-              android:targetSdkVersion="5" />
-</manifest>
diff --git a/tests/DumpRenderTree/assets/results/layout_tests_crashed.txt b/tests/DumpRenderTree/assets/results/layout_tests_crashed.txt
deleted file mode 100644
index 89439d3..0000000
--- a/tests/DumpRenderTree/assets/results/layout_tests_crashed.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/basic-auth.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/failed-auth.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/cross-origin-authorization.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/cross-origin-no-authorization.html
diff --git a/tests/DumpRenderTree/assets/results/layout_tests_failed.txt b/tests/DumpRenderTree/assets/results/layout_tests_failed.txt
deleted file mode 100644
index 5b64b9a..0000000
--- a/tests/DumpRenderTree/assets/results/layout_tests_failed.txt
+++ /dev/null
@@ -1,1010 +0,0 @@
-/sdcard/android/layout_tests/accessibility/onclick-handlers.html
-/sdcard/android/layout_tests/accessibility/textarea-insertion-point-line-number.html
-/sdcard/android/layout_tests/accessibility/aria-readonly.html
-/sdcard/android/layout_tests/accessibility/radio-button-checkbox-size.html
-/sdcard/android/layout_tests/accessibility/th-as-title-ui.html
-/sdcard/android/layout_tests/accessibility/visible-elements.html
-/sdcard/android/layout_tests/accessibility/iframe-bastardization.html
-/sdcard/android/layout_tests/accessibility/button-press-action.html
-/sdcard/android/layout_tests/accessibility/img-aria-button-alt-tag.html
-/sdcard/android/layout_tests/accessibility/input-image-alt.html
-/sdcard/android/layout_tests/accessibility/radio-button-title-label.html
-/sdcard/android/layout_tests/accessibility/aria-hidden.html
-/sdcard/android/layout_tests/accessibility/secure-textfield-title-ui.html
-/sdcard/android/layout_tests/accessibility/canvas.html
-/sdcard/android/layout_tests/accessibility/textarea-selected-text-range.html
-/sdcard/android/layout_tests/accessibility/language-attribute.html
-/sdcard/android/layout_tests/accessibility/table-nofirstbody.html
-/sdcard/android/layout_tests/accessibility/editable-webarea-context-menu-point.html
-/sdcard/android/layout_tests/accessibility/table-modification-crash.html
-/sdcard/android/layout_tests/accessibility/aria-link-supports-press.html
-/sdcard/android/layout_tests/accessibility/table-notbody.html
-/sdcard/android/layout_tests/accessibility/ignore-spacer-elements.html
-/sdcard/android/layout_tests/accessibility/transformed-element.html
-/sdcard/android/layout_tests/accessibility/aria-disabled.html
-/sdcard/android/layout_tests/accessibility/placeholder.html
-/sdcard/android/layout_tests/accessibility/non-data-table-cell-title-ui-element.html
-/sdcard/android/layout_tests/accessibility/aria-label.html
-/sdcard/android/layout_tests/accessibility/textarea-line-for-index.html
-/sdcard/android/layout_tests/accessibility/nochildren-elements.html
-/sdcard/android/layout_tests/animations/keyframes-to-missing.html
-/sdcard/android/layout_tests/animations/animation-hit-test.html
-/sdcard/android/layout_tests/animations/animation-hit-test-transform.html
-/sdcard/android/layout_tests/animations/animation-controller-drt-api.html
-/sdcard/android/layout_tests/animations/keyframes-from-missing.html
-/sdcard/android/layout_tests/animations/change-keyframes-name.html
-/sdcard/android/layout_tests/animations/change-keyframes.html
-/sdcard/android/layout_tests/editing/style/remove-underline-from-stylesheet.html
-/sdcard/android/layout_tests/editing/style/remove-underline-in-bold.html
-/sdcard/android/layout_tests/editing/style/apply-through-end-of-document.html
-/sdcard/android/layout_tests/editing/inserting/typing-tab-designmode.html
-/sdcard/android/layout_tests/editing/inserting/space-after-removeformat.html
-/sdcard/android/layout_tests/editing/inserting/insert-thai-characters-001.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/4128080-2.html
-/sdcard/android/layout_tests/editing/execCommand/indent-nested-lists-6.html
-/sdcard/android/layout_tests/editing/execCommand/enabling-and-selection.html
-/sdcard/android/layout_tests/editing/execCommand/insert-line-break-no-scroll.html
-/sdcard/android/layout_tests/editing/execCommand/indent-nested-lists-3.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/switch-list-type.html
-/sdcard/android/layout_tests/editing/execCommand/19089.html
-/sdcard/android/layout_tests/editing/execCommand/outdent-nested-lists-2.html
-/sdcard/android/layout_tests/editing/execCommand/unlink.html
-/sdcard/android/layout_tests/editing/execCommand/remove-list-1.html
-/sdcard/android/layout_tests/editing/execCommand/indent-nested-lists-5.html
-/sdcard/android/layout_tests/editing/execCommand/indent-nested-lists-2.html
-/sdcard/android/layout_tests/editing/execCommand/copy-without-selection.html
-/sdcard/android/layout_tests/editing/execCommand/outdent-nested-lists-4.html
-/sdcard/android/layout_tests/editing/execCommand/outdent-nested-lists-1.html
-/sdcard/android/layout_tests/editing/execCommand/findString-diacriticals.html
-/sdcard/android/layout_tests/editing/execCommand/indent-nested-lists-7.html
-/sdcard/android/layout_tests/editing/execCommand/createLink.html
-/sdcard/android/layout_tests/editing/execCommand/remove-list-items.html
-/sdcard/android/layout_tests/editing/execCommand/indent-nested-lists-4.html
-/sdcard/android/layout_tests/editing/execCommand/5939887.html
-/sdcard/android/layout_tests/editing/execCommand/insertHTML.html
-/sdcard/android/layout_tests/editing/execCommand/convert-style-elements-to-spans.html
-/sdcard/android/layout_tests/editing/execCommand/indent-nested-lists-1.html
-/sdcard/android/layout_tests/editing/execCommand/outdent-nested-lists-3.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-into-anchor-text.html
-/sdcard/android/layout_tests/editing/pasteboard/19644-1.html
-/sdcard/android/layout_tests/editing/pasteboard/copy-crash.html
-/sdcard/android/layout_tests/editing/pasteboard/5665299.html
-/sdcard/android/layout_tests/editing/pasteboard/file-input-files-access.html
-/sdcard/android/layout_tests/editing/pasteboard/get-data-text-plain-drop.html
-/sdcard/android/layout_tests/editing/pasteboard/get-data-text-plain-paste.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-blockquote-before-blockquote.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/19644-2.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/paste-double-nested-blockquote-before-blockquote.html
-/sdcard/android/layout_tests/editing/pasteboard/copy-paste-float.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-table-002.html
-/sdcard/android/layout_tests/editing/selection/click-outside-editable-div.html
-/sdcard/android/layout_tests/editing/selection/drag-text-delay.html
-/sdcard/android/layout_tests/editing/selection/anchor-focus3.html
-/sdcard/android/layout_tests/editing/selection/home-end.html
-/sdcard/android/layout_tests/editing/selection/user-drag-element-and-user-select-none.html
-/sdcard/android/layout_tests/editing/selection/drag-start-event-client-x-y.html
-/sdcard/android/layout_tests/editing/selection/extend-selection-bidi.html
-/sdcard/android/layout_tests/editing/selection/find-in-text-control.html
-/sdcard/android/layout_tests/editing/selection/5209984.html
-/sdcard/android/layout_tests/editing/selection/toString-1.html
-/sdcard/android/layout_tests/editing/selection/hit-test-anonymous.html
-/sdcard/android/layout_tests/editing/selection/move-begin-end.html
-/sdcard/android/layout_tests/editing/selection/doubleclick-whitespace-img-crash.html
-/sdcard/android/layout_tests/editing/selection/click-after-nested-block.html
-/sdcard/android/layout_tests/editing/selection/move-by-line-003.html
-/sdcard/android/layout_tests/editing/selection/skip-non-editable-1.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/move-paragraph-document-edges.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/extend-selection-after-double-click.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/toString.html
-/sdcard/android/layout_tests/editing/selection/inactive-selection.html
-/sdcard/android/layout_tests/editing/selection/click-in-margins-inside-editable-div.html
-/sdcard/android/layout_tests/editing/selection/removeAllRanges.html
-/sdcard/android/layout_tests/editing/selection/skip-non-editable-2.html
-/sdcard/android/layout_tests/editing/selection/anchor-focus2.html
-/sdcard/android/layout_tests/editing/selection/click-in-padding-with-multiple-line-boxes.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/skip-virama-001.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/editing/text-iterator/basic-iteration.html
-/sdcard/android/layout_tests/editing/text-iterator/thai-cursor-movement.html
-/sdcard/android/layout_tests/fast/replaced/table-percent-height-text-controls.html
-/sdcard/android/layout_tests/fast/replaced/image-map-2.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/international/thai-offsetForPosition-inside-character.html
-/sdcard/android/layout_tests/fast/text/plain-text-line-breaks.html
-/sdcard/android/layout_tests/fast/text/offsetForPosition-cluster-at-zero.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/mailto-always-utf-8.html
-/sdcard/android/layout_tests/fast/encoding/percent-escaping.html
-/sdcard/android/layout_tests/fast/encoding/utf-32-big-endian-nobom.xml
-/sdcard/android/layout_tests/fast/encoding/hanarei-blog32-fc2-com.html
-/sdcard/android/layout_tests/fast/encoding/frame-default-enc.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/utf-32-little-endian-nobom.xml
-/sdcard/android/layout_tests/fast/encoding/char-encoding-mac.html
-/sdcard/android/layout_tests/fast/encoding/charset-koi8-u.html
-/sdcard/android/layout_tests/fast/workers/worker-location.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/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/anchor-empty-focus.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/related-target.html
-/sdcard/android/layout_tests/fast/events/context-onmousedown-event.html
-/sdcard/android/layout_tests/fast/events/mouse-drag-from-frame-to-other-frame.html
-/sdcard/android/layout_tests/fast/events/prevent-drag-to-navigate.html
-/sdcard/android/layout_tests/fast/events/stop-load-in-unload-handler-using-window-stop.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/stop-load-in-unload-handler-using-document-write.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/event-function-toString.html
-/sdcard/android/layout_tests/fast/events/right-click-focus.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/crash-on-mutate-during-drop.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/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/drag-to-navigate.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/mouse-drag-from-frame.html
-/sdcard/android/layout_tests/fast/events/keydown-keypress-preventDefault.html
-/sdcard/android/layout_tests/fast/events/onsearch-enter.html
-/sdcard/android/layout_tests/fast/events/mouse-click-events.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/resize-subframe.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/images/image-map-zoom.html
-/sdcard/android/layout_tests/fast/js/kde/Number.html
-/sdcard/android/layout_tests/fast/js/instanceof-operator.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/convert-nan-to-bool.html
-/sdcard/android/layout_tests/fast/dom/HTMLDocument/hasFocus.html
-/sdcard/android/layout_tests/fast/dom/Document/early-document-access.html
-/sdcard/android/layout_tests/fast/dom/DOMException/XPathException.html
-/sdcard/android/layout_tests/fast/dom/HTMLScriptElement/nested-execution.html
-/sdcard/android/layout_tests/fast/dom/HTMLDataGridElement/DataGridColumns-dom.html
-/sdcard/android/layout_tests/fast/dom/HTMLDataGridElement/DataGridColumns-basic.html
-/sdcard/android/layout_tests/fast/dom/HTMLDataGridElement/DataGridColumns-dom-attributes.html
-/sdcard/android/layout_tests/fast/dom/HTMLDataGridElement/DataGridDataSource-basic.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-xy-properties.html
-/sdcard/android/layout_tests/fast/dom/Window/window-screen-properties.html
-/sdcard/android/layout_tests/fast/dom/Window/new-window-opener.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/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-lookup-precedence.html
-/sdcard/android/layout_tests/fast/dom/Window/window-resize-and-move-arguments.html
-/sdcard/android/layout_tests/fast/dom/Window/custom-constructors.html
-/sdcard/android/layout_tests/fast/dom/Window/webkitConvertPoint.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/dom-access-from-closure-iframe.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/navigator-detached-no-crash.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/getClientRects.html
-/sdcard/android/layout_tests/fast/dom/null-document-location-href-put-crash.html
-/sdcard/android/layout_tests/fast/dom/prototype-inheritance-2.html
-/sdcard/android/layout_tests/fast/dom/location-new-window-no-crash.html
-/sdcard/android/layout_tests/fast/dom/gc-9.html
-/sdcard/android/layout_tests/fast/dom/wrapper-classes.html
-/sdcard/android/layout_tests/fast/dom/document-width-height-force-layout.html
-/sdcard/android/layout_tests/fast/dom/client-width-height.html
-/sdcard/android/layout_tests/fast/dom/constructed-objects-prototypes.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/getBoundingClientRect.html
-/sdcard/android/layout_tests/fast/dom/location-hash.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/prototype-inheritance.html
-/sdcard/android/layout_tests/fast/dom/getBoundingClientRect-getClientRects-relative-to-viewport.html
-/sdcard/android/layout_tests/fast/dom/frame-loading-via-document-write.html
-/sdcard/android/layout_tests/fast/xpath/py-dom-xpath/paths.html
-/sdcard/android/layout_tests/fast/xpath/py-dom-xpath/expressions.html
-/sdcard/android/layout_tests/fast/xpath/py-dom-xpath/predicates.html
-/sdcard/android/layout_tests/fast/xpath/py-dom-xpath/abbreviations.html
-/sdcard/android/layout_tests/fast/xpath/py-dom-xpath/axes.html
-/sdcard/android/layout_tests/fast/xpath/py-dom-xpath/functions.html
-/sdcard/android/layout_tests/fast/xpath/py-dom-xpath/nodetests.html
-/sdcard/android/layout_tests/fast/xpath/py-dom-xpath/data.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/detached-subtree-invalidate-iterator.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/id-simple.html
-/sdcard/android/layout_tests/fast/xpath/id-path.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/node-name-case-sensitivity.html
-/sdcard/android/layout_tests/fast/xpath/xpath-empty-string.html
-/sdcard/android/layout_tests/fast/xpath/attribute-node-predicate.html
-/sdcard/android/layout_tests/fast/xpath/nodeset-duplicates.html
-/sdcard/android/layout_tests/fast/xpath/name-null-namespace.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/complex-id.html
-/sdcard/android/layout_tests/fast/xpath/xpath-functional-test.html
-/sdcard/android/layout_tests/fast/xpath/attr-namespace.html
-/sdcard/android/layout_tests/fast/xpath/position.html
-/sdcard/android/layout_tests/fast/xpath/evaluate-twice.html
-/sdcard/android/layout_tests/fast/xpath/substring-after.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/reverse-axes.html
-/sdcard/android/layout_tests/fast/xpath/nan-to-boolean.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/focus2.html
-/sdcard/android/layout_tests/fast/forms/legend-access-key.html
-/sdcard/android/layout_tests/fast/forms/focus-selection-textarea.html
-/sdcard/android/layout_tests/fast/forms/select-popup-pagekeys.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/autofocus-opera-003.html
-/sdcard/android/layout_tests/fast/forms/search-click-in-placeholder.html
-/sdcard/android/layout_tests/fast/forms/onselect-textfield.html
-/sdcard/android/layout_tests/fast/forms/textfield-onchange-deletion.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-cancel-button-mouseup.html
-/sdcard/android/layout_tests/fast/forms/get-file-upload.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/option-mouseevents.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/input-select-on-click.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/slider-onchange-event.html
-/sdcard/android/layout_tests/fast/forms/textarea-input-event.html
-/sdcard/android/layout_tests/fast/forms/search-delete-while-cancel-button-clicked.html
-/sdcard/android/layout_tests/fast/forms/select-accesskey.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/slider-delete-while-dragging-thumb.html
-/sdcard/android/layout_tests/fast/forms/textfield-to-password-on-focus.html
-/sdcard/android/layout_tests/fast/forms/textarea-arrow-navigation.html
-/sdcard/android/layout_tests/fast/forms/search-abs-pos-cancel-button.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/search-hidden-cancel-button.html
-/sdcard/android/layout_tests/fast/forms/select-script-onchange.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/form-and-frame-interaction-retains-values.html
-/sdcard/android/layout_tests/fast/forms/slider-transformed.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/focus-selection-input.html
-/sdcard/android/layout_tests/fast/forms/slider-zoomed.html
-/sdcard/android/layout_tests/fast/forms/search-event-delay.html
-/sdcard/android/layout_tests/fast/forms/empty-textarea-toggle-disabled.html
-/sdcard/android/layout_tests/fast/forms/25153.html
-/sdcard/android/layout_tests/fast/forms/select-cache-desynchronization.html
-/sdcard/android/layout_tests/fast/forms/check-box-enter-key.html
-/sdcard/android/layout_tests/fast/forms/button-state-restore.html
-/sdcard/android/layout_tests/fast/forms/access-key.html
-/sdcard/android/layout_tests/fast/forms/textarea-selection-preservation.html
-/sdcard/android/layout_tests/fast/forms/textarea-metrics.html
-/sdcard/android/layout_tests/fast/forms/onchange-enter-submit.html
-/sdcard/android/layout_tests/fast/forms/onselect-textarea.html
-/sdcard/android/layout_tests/fast/forms/listbox-selection.html
-/sdcard/android/layout_tests/fast/css/getComputedStyle/computed-style.html
-/sdcard/android/layout_tests/fast/css/getComputedStyle/computed-style-without-renderer.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/resize-single-axis.html
-/sdcard/android/layout_tests/fast/css/percent-character-as-value.html
-/sdcard/android/layout_tests/fast/css/uri-token-parsing.html
-/sdcard/android/layout_tests/fast/css/zoom-body-scroll.html
-/sdcard/android/layout_tests/fast/css/invalid-percentage-property.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/tabindex-parsing.html
-/sdcard/android/layout_tests/fast/history/saves-state-after-fragment-nav.html
-/sdcard/android/layout_tests/fast/history/back-forward-is-asynchronous.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/location-port.html
-/sdcard/android/layout_tests/fast/loader/user-style-sheet-resource-load-callbacks.html
-/sdcard/android/layout_tests/fast/loader/policy-delegate-action-hit-test-zoomed.html
-/sdcard/android/layout_tests/fast/loader/subframe-navigate-during-main-frame-load.html
-/sdcard/android/layout_tests/fast/loader/onunload-form-submit-crash-2.html
-/sdcard/android/layout_tests/fast/loader/javascript-url-hierarchical-execution.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/subframe-self-close.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/reload-policy-delegate.html
-/sdcard/android/layout_tests/fast/loader/local-JavaScript-from-local.html
-/sdcard/android/layout_tests/fast/loader/main-document-url-for-non-http-loads.html
-/sdcard/android/layout_tests/fast/loader/data-url-encoding-svg.html
-/sdcard/android/layout_tests/fast/loader/data-url-encoding-html.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/xslt-fragment-in-empty-doc.html
-/sdcard/android/layout_tests/fast/xsl/mozilla-tests.xml
-/sdcard/android/layout_tests/fast/xmlhttprequest/xmlhttprequest-bad-mimetype.html
-/sdcard/android/layout_tests/fast/xmlhttprequest/xmlhttprequest-gc.html
-/sdcard/android/layout_tests/fast/canvas/canvas-alphaImageData-behavior.html
-/sdcard/android/layout_tests/fast/canvas/canvas-gradient-addStop-error.html
-/sdcard/android/layout_tests/fast/canvas/canvas-pattern-behaviour.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/translate-text.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-empty-image-pattern.html
-/sdcard/android/layout_tests/fast/canvas/canvas-transform-skewed.html
-/sdcard/android/layout_tests/fast/canvas/canvas-ImageData-behaviour.html
-/sdcard/android/layout_tests/fast/canvas/canvas-putImageData.html
-/sdcard/android/layout_tests/fast/canvas/canvas-pattern-modify.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/canvas-transform-nan.html
-/sdcard/android/layout_tests/fast/canvas/canvas-pattern-transform.html
-/sdcard/android/layout_tests/fast/canvas/canvas-transform-identity.html
-/sdcard/android/layout_tests/fast/canvas/set-colors.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/location-put-after-removal.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/frame-dead-region.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-unload-crash.html
-/sdcard/android/layout_tests/fast/frames/frame-js-url-clientWidth.html
-/sdcard/android/layout_tests/fast/frames/iframe-js-url-clientWidth.html
-/sdcard/android/layout_tests/fast/frames/frame-length-fractional.html
-/sdcard/android/layout_tests/fast/frames/iframe-name-and-id.html
-/sdcard/android/layout_tests/fast/loading/subframe-removes-itself.html
-/sdcard/android/layout_tests/http/tests/media/video-seekable-stall.html
-/sdcard/android/layout_tests/http/tests/media/remove-while-loading.html
-/sdcard/android/layout_tests/http/tests/media/video-play-stall.html
-/sdcard/android/layout_tests/http/tests/media/video-play-stall-seek.html
-/sdcard/android/layout_tests/http/tests/plugins/npapi-response-headers.html
-/sdcard/android/layout_tests/http/tests/plugins/get-url.html
-/sdcard/android/layout_tests/http/tests/plugins/interrupted-get-url.html
-/sdcard/android/layout_tests/http/tests/plugins/post-url-file.html
-/sdcard/android/layout_tests/http/tests/plugins/cross-frame-object-access.html
-/sdcard/android/layout_tests/http/tests/plugins/local-geturl-from-remote.html
-/sdcard/android/layout_tests/http/tests/plugins/geturlnotify-from-npp-destroystream.html
-/sdcard/android/layout_tests/http/tests/mime/standard-mode-does-not-load-stylesheet-with-text-plain-and-css-extension.html
-/sdcard/android/layout_tests/http/tests/mime/standard-mode-does-not-load-stylesheet-with-text-plain.html
-/sdcard/android/layout_tests/http/tests/local/drag-over-remote-content.html
-/sdcard/android/layout_tests/http/tests/misc/image-blocked-src-change.html
-/sdcard/android/layout_tests/http/tests/misc/acid3.html
-/sdcard/android/layout_tests/http/tests/misc/dns-prefetch-control.html
-/sdcard/android/layout_tests/http/tests/misc/will-send-request-returns-null-on-redirect.html
-/sdcard/android/layout_tests/http/tests/misc/isindex-formdata.html
-/sdcard/android/layout_tests/http/tests/misc/image-blocked-src-no-change.html
-/sdcard/android/layout_tests/http/tests/misc/policy-delegate-called-twice.html
-/sdcard/android/layout_tests/http/tests/misc/window-dot-stop.html
-/sdcard/android/layout_tests/http/tests/misc/css-reject-any-type-in-strict-mode.html
-/sdcard/android/layout_tests/http/tests/misc/favicon-loads-with-images-disabled.html
-/sdcard/android/layout_tests/http/tests/misc/SVGFont-delayed-load.html
-/sdcard/android/layout_tests/http/tests/misc/location-test-xsl-style-sheet.xml
-/sdcard/android/layout_tests/http/tests/misc/redirect-to-external-url.html
-/sdcard/android/layout_tests/http/tests/misc/submit-get-in-utf7.html
-/sdcard/android/layout_tests/http/tests/cookies/simple-cookies-max-age.html
-/sdcard/android/layout_tests/http/tests/cookies/simple-cookies-expired.html
-/sdcard/android/layout_tests/http/tests/cookies/multiple-cookies.html
-/sdcard/android/layout_tests/http/tests/wml/access-target-path-deny.html
-/sdcard/android/layout_tests/http/tests/wml/post-data-to-server.html
-/sdcard/android/layout_tests/http/tests/wml/go-task-get-method-accept-charset.html
-/sdcard/android/layout_tests/http/tests/wml/access-target.html
-/sdcard/android/layout_tests/http/tests/wml/access-target-domain-deny.html
-/sdcard/android/layout_tests/http/tests/wml/go-task-post-method-accept-charset.html
-/sdcard/android/layout_tests/http/tests/wml/go-task-get-method.html
-/sdcard/android/layout_tests/http/tests/wml/go-task-post-method.html
-/sdcard/android/layout_tests/http/tests/navigation/success200-reload.html
-/sdcard/android/layout_tests/http/tests/navigation/redirect-cycle.html
-/sdcard/android/layout_tests/http/tests/navigation/reload-subframe-frame.html
-/sdcard/android/layout_tests/http/tests/navigation/window-open-adds-history-item.html
-/sdcard/android/layout_tests/http/tests/navigation/success200-goback.html
-/sdcard/android/layout_tests/http/tests/navigation/timerredirect-basic.html
-/sdcard/android/layout_tests/http/tests/navigation/lockedhistory-iframe.html
-/sdcard/android/layout_tests/http/tests/navigation/document-location-click-timeout.html
-/sdcard/android/layout_tests/http/tests/navigation/post-goback2.html
-/sdcard/android/layout_tests/http/tests/navigation/onload-navigation-iframe-timeout.html
-/sdcard/android/layout_tests/http/tests/navigation/location-assign-adds-history-item.html
-/sdcard/android/layout_tests/http/tests/navigation/anchor-goback.html
-/sdcard/android/layout_tests/http/tests/navigation/redirect-load-no-form-restoration.html
-/sdcard/android/layout_tests/http/tests/navigation/metaredirect-subframeload.html
-/sdcard/android/layout_tests/http/tests/navigation/javascriptlink-subframeload.html
-/sdcard/android/layout_tests/http/tests/navigation/metaredirect-basic.html
-/sdcard/android/layout_tests/http/tests/navigation/success200-subframeload.html
-/sdcard/android/layout_tests/http/tests/navigation/post-goback-same-url.html
-/sdcard/android/layout_tests/http/tests/navigation/restore-form-state-https.html
-/sdcard/android/layout_tests/http/tests/navigation/success200-frames.html
-/sdcard/android/layout_tests/http/tests/navigation/redirect302-basic.html
-/sdcard/android/layout_tests/http/tests/navigation/document-location-mouseover.html
-/sdcard/android/layout_tests/http/tests/navigation/redirect302-goback.html
-/sdcard/android/layout_tests/http/tests/navigation/anchor-subframeload.html
-/sdcard/android/layout_tests/http/tests/navigation/target-frame-from-window.html
-/sdcard/android/layout_tests/http/tests/navigation/slowmetaredirect-basic.html
-/sdcard/android/layout_tests/http/tests/navigation/reload-subframe-iframe.html
-/sdcard/android/layout_tests/http/tests/navigation/success200-loadsame.html
-/sdcard/android/layout_tests/http/tests/navigation/relativeanchor-basic.html
-/sdcard/android/layout_tests/http/tests/navigation/redirect302-subframeload.html
-/sdcard/android/layout_tests/http/tests/navigation/relativeanchor-goback.html
-/sdcard/android/layout_tests/http/tests/navigation/metaredirect-goback.html
-/sdcard/android/layout_tests/http/tests/navigation/redirect302-frames.html
-/sdcard/android/layout_tests/http/tests/navigation/multiple-back-forward-entries.html
-/sdcard/android/layout_tests/http/tests/navigation/javascriptlink-goback.html
-/sdcard/android/layout_tests/http/tests/navigation/success200-basic.html
-/sdcard/android/layout_tests/http/tests/navigation/postredirect-goback2.html
-/sdcard/android/layout_tests/http/tests/navigation/timerredirect-goback.html
-/sdcard/android/layout_tests/http/tests/navigation/location-href-set-adds-history-item.html
-/sdcard/android/layout_tests/http/tests/navigation/anchor-basic.html
-/sdcard/android/layout_tests/http/tests/navigation/document-location-click.html
-/sdcard/android/layout_tests/http/tests/navigation/onload-navigation-iframe.html
-/sdcard/android/layout_tests/http/tests/navigation/relativeanchor-frames.html
-/sdcard/android/layout_tests/http/tests/navigation/metaredirect-frames.html
-/sdcard/android/layout_tests/http/tests/navigation/location-replace-adds-history-item.html
-/sdcard/android/layout_tests/http/tests/navigation/success200-frames-loadsame.html
-/sdcard/android/layout_tests/http/tests/navigation/back-to-slow-frame.html
-/sdcard/android/layout_tests/http/tests/navigation/new-window-redirect-history.html
-/sdcard/android/layout_tests/http/tests/navigation/javascriptlink-basic.html
-/sdcard/android/layout_tests/http/tests/navigation/timerredirect-subframeload.html
-/sdcard/android/layout_tests/http/tests/navigation/location-set-adds-history-item.html
-/sdcard/android/layout_tests/http/tests/navigation/onload-navigation-iframe-2.html
-/sdcard/android/layout_tests/http/tests/navigation/reload-subframe-object.html
-/sdcard/android/layout_tests/http/tests/navigation/timerredirect-frames.html
-/sdcard/android/layout_tests/http/tests/navigation/slowtimerredirect-basic.html
-/sdcard/android/layout_tests/http/tests/navigation/window-open-adds-history-item2.html
-/sdcard/android/layout_tests/http/tests/navigation/document-location-onload.html
-/sdcard/android/layout_tests/http/tests/history/redirect-meta-refresh-2-seconds.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-location-assign-before-load.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-location-href-0-seconds.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-location-href-2-seconds.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-form-submit-0-seconds.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-form-submit-2-seconds.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-location-0-seconds.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-location-2-seconds.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-location-href-before-load.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-location-replace-0-seconds.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-location-replace-2-seconds.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-document-location-0-seconds.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-document-location-2-seconds.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-form-submit-before-load.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-location-assign-0-seconds.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-location-assign-2-seconds.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-location-before-load.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-location-replace-before-load.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-document-location-before-load.html
-/sdcard/android/layout_tests/http/tests/history/redirect-meta-refresh-0-seconds.html
-/sdcard/android/layout_tests/http/tests/cache/subresource-expiration.html
-/sdcard/android/layout_tests/http/tests/appcache/local-content.html
-/sdcard/android/layout_tests/http/tests/appcache/max-size.html
-/sdcard/android/layout_tests/http/tests/security/aboutBlank/xss-DENIED-set-opener.html
-/sdcard/android/layout_tests/http/tests/security/aboutBlank/xss-DENIED-navigate-opener-javascript-url.html
-/sdcard/android/layout_tests/http/tests/security/aboutBlank/xss-DENIED-navigate-opener-document-write.html
-/sdcard/android/layout_tests/http/tests/security/dataURL/xss-DENIED-from-javascript-url-window-open.html
-/sdcard/android/layout_tests/http/tests/security/dataURL/xss-DENIED-to-data-url-sub-frame-2-level.html
-/sdcard/android/layout_tests/http/tests/security/dataURL/xss-DENIED-from-data-url-in-foreign-domain-subframe.html
-/sdcard/android/layout_tests/http/tests/security/dataURL/xss-DENIED-from-data-url-in-foreign-domain-window-open.html
-/sdcard/android/layout_tests/http/tests/security/dataURL/xss-DENIED-to-data-url-in-foreign-domain-subframe-location-change.html
-/sdcard/android/layout_tests/http/tests/security/dataURL/xss-DENIED-from-data-url-sub-frame.html
-/sdcard/android/layout_tests/http/tests/security/dataURL/xss-DENIED-to-data-url-in-foreign-domain-subframe.html
-/sdcard/android/layout_tests/http/tests/security/dataURL/xss-DENIED-to-data-url-in-foreign-domain-window-open.html
-/sdcard/android/layout_tests/http/tests/security/dataURL/xss-DENIED-from-data-url-sub-frame-2-level.html
-/sdcard/android/layout_tests/http/tests/security/dataURL/xss-DENIED-to-data-url-sub-frame-uppercase.html
-/sdcard/android/layout_tests/http/tests/security/dataURL/xss-DENIED-to-data-url-window-open.html
-/sdcard/android/layout_tests/http/tests/security/dataURL/xss-DENIED-from-data-url-sub-frame-to-data-url-sub-frame.html
-/sdcard/android/layout_tests/http/tests/security/dataURL/xss-DENIED-from-data-url-to-data-url.html
-/sdcard/android/layout_tests/http/tests/security/dataURL/xss-DENIED-to-data-url-from-data-url.html
-/sdcard/android/layout_tests/http/tests/security/dataURL/xss-DENIED-to-data-url-sub-frame.html
-/sdcard/android/layout_tests/http/tests/security/clipboard/clipboard-file-access.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/image-prototype.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/body-properties.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/number-prototype.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/body-prototype.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/global-variables.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/location-prototype.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/image-properties.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/document-open.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/document-prototype.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/window-properties.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/location-properties.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/all-window-prototypes.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/click-event.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/all-window-properties.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/document-properties.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/string-prototype.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/object-prototype.html
-/sdcard/android/layout_tests/http/tests/security/listener/xss-window-onclick-addEventListener.html
-/sdcard/android/layout_tests/http/tests/security/listener/xss-window-onclick-shortcut.html
-/sdcard/android/layout_tests/http/tests/security/XFrameOptions/x-frame-options-deny-meta-tag-parent-same-origin-allow.html
-/sdcard/android/layout_tests/http/tests/security/XFrameOptions/x-frame-options-deny-meta-tag-parent-same-origin-deny.html
-/sdcard/android/layout_tests/http/tests/security/XFrameOptions/x-frame-options-deny-meta-tag-in-body.html
-/sdcard/android/layout_tests/http/tests/security/XFrameOptions/x-frame-options-deny-meta-tag.html
-/sdcard/android/layout_tests/http/tests/security/XFrameOptions/x-frame-options-parent-same-origin-allow.html
-/sdcard/android/layout_tests/http/tests/security/XFrameOptions/x-frame-options-parent-same-origin-deny.html
-/sdcard/android/layout_tests/http/tests/security/XFrameOptions/x-frame-options-deny.html
-/sdcard/android/layout_tests/http/tests/security/frameNavigation/xss-ALLOWED-targeted-subframe-navigation-change.html
-/sdcard/android/layout_tests/http/tests/security/frameNavigation/xss-DENIED-targeted-link-navigation.html
-/sdcard/android/layout_tests/http/tests/security/frameNavigation/xss-DENIED-plugin-navigation.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/javascriptURL-execution-context-frame-src-setAttributeNode.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/javascriptURL-execution-context-frame-src-setAttributeNodeNS.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/javascriptURL-execution-context-iframe-src-setAttribute.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/javascriptURL-execution-context-iframe-src-setAttributeNS.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/javascriptURL-execution-context-iframe-src-setAttributeNode.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/javascriptURL-execution-context-iframe-src-setAttributeNodeNS.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/xss-ALLOWED-from-javascript-url-sub-frame-2-level.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/xss-ALLOWED-from-javascript-url-to-javscript-url.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/xss-ALLOWED-to-javascript-url-from-javscript-url.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/javascriptURL-execution-context-frame-src-getAttribute-value.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/javascriptURL-execution-context-iframe-src-htmldom.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/xss-ALLOWED-to-javascript-url-sub-frame-2-level.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/xss-ALLOWED-from-javascript-url-window-open.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/xss-DENIED-from-javascript-url-in-foreign-domain-window-open.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/javascriptURL-execution-context-frame-location-htmldom.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/javascriptURL-execution-context-iframe-src-getAttribute-value.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/xss-ALLOWED-from-javascript-url-sub-frame.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/xss-ALLOWED-from-javascript-url-sub-frame-to-javascript-url-sub-frame.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/xss-DENIED-to-javascript-url-in-foreign-domain-subframe.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/xss-ALLOWED-to-javascript-url-window-open.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/javascriptURL-execution-context-frame-src-htmldom.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/xss-DENIED-to-javascript-url-in-foreign-domain-window-open.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/xss-ALLOWED-to-javascript-url-sub-frame.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/javascriptURL-execution-context-frame-src-setAttribute.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/javascriptURL-execution-context-frame-src-setAttributeNS.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/xss-DENIED-from-javascript-url-in-foreign-domain-subframe.html
-/sdcard/android/layout_tests/http/tests/security/originHeader/origin-header-for-empty.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/base-href-null-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/base-href-control-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/faux-script1.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/javascript-link-control-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-convoluted.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/dom-write-location.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/javascript-link-HTML-entities-control-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/object-embed-tag-control-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/javascript-link-null-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/anchor-url-dom-write-location.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/link-onclick-ampersand.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-with-source-double-quote.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-with-source-no-quote.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/base-href-safe3.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/http-equiv-utf-7-encoded.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/link-onclick-control-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/base-href-scheme-relative.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-open-redirect.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/object-embed-tag-null-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/faux-script3.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/link-onclick-entities.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-post.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/embed-tag-control-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/property-escape.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-post-null-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/javascript-link-HTML-entities.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-null-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-addslashes-single-quote.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/dom-write-innerHTML.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-with-source-entities.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/dom-write-location-inline-event.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/malformed-HTML.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/javascript-link-ampersand.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/link-onclick.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/anchor-url-dom-write-location-inline-event.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/base-href-safe2.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/anchor-url-dom-write-location-inline-event-null-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/dom-write-URL.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-redirect.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/object-tag.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-addslashes-backslash.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/dom-write-location-javascript-URL.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/embed-tag.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/faux-script2.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/anchor-url-dom-write-location-javascript-URL.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-with-source-relative-scheme.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/img-onerror-tricky.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/javascript-link-HTML-entities-named.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/javascript-link-HTML-entities-null-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-addslashes-null-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/link-opens-new-window.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-utf-7-encoded.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-utf-7.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-with-source.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-addslashes-double-quote.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-safe.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/link-onclick-null-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/javascript-link.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-control-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-with-source-null-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/iframe-javascript-url.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-src-redirect-safe.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-with-source-control-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/get-from-iframe.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/inline-event-HTML-entities.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/post-from-iframe.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-post-control-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/object-embed-tag.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/base-href.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-entities.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/base-href-safe.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/embed-tag-null-char.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-location-get-override.html
-/sdcard/android/layout_tests/http/tests/security/protocol-compare-case-insensitive.html
-/sdcard/android/layout_tests/http/tests/security/xss-DENIED-xsl-external-entity.xml
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-history-get-override.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-get-override.html
-/sdcard/android/layout_tests/http/tests/security/cross-origin-xsl-BLOCKED.html
-/sdcard/android/layout_tests/http/tests/security/local-iFrame-from-remote.html
-/sdcard/android/layout_tests/http/tests/security/credentials-in-referer.html
-/sdcard/android/layout_tests/http/tests/security/xss-DENIED-xsl-external-entity-redirect.xml
-/sdcard/android/layout_tests/http/tests/security/local-video-poster-from-remote.html
-/sdcard/android/layout_tests/http/tests/security/local-CSS-from-remote.html
-/sdcard/android/layout_tests/http/tests/security/local-user-CSS-from-remote.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-object-prototype.html
-/sdcard/android/layout_tests/http/tests/security/dataTransfer-set-data-file-url.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-enumeration.html
-/sdcard/android/layout_tests/http/tests/security/host-compare-case-insensitive.html
-/sdcard/android/layout_tests/http/tests/security/xss-DENIED-xsl-document.xml
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-protocol.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-private-browsing.html
-/sdcard/android/layout_tests/http/tests/security/feed-urls-from-remote.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-put.html
-/sdcard/android/layout_tests/http/tests/security/canvas-remote-read-svg-image.html
-/sdcard/android/layout_tests/http/tests/security/window-properties-clear-domain.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-callback-explicit-domain-DENY.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-get.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-port.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-document-direct.html
-/sdcard/android/layout_tests/http/tests/security/window-properties-pass.html
-/sdcard/android/layout_tests/http/tests/security/local-video-src-from-remote.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-history-put.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-child-explicit-domain.html
-/sdcard/android/layout_tests/http/tests/security/local-video-source-from-remote.html
-/sdcard/android/layout_tests/http/tests/security/drag-over-remote-content-iframe.html
-/sdcard/android/layout_tests/http/tests/security/local-JavaScript-from-remote.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-parent-explicit-domain.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-location-put.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-history-get.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-get-custom-property-cached.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-location-get.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-delete.html
-/sdcard/android/layout_tests/http/tests/security/xss-DENIED-xsl-document-redirect.xml
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-protocol-explicit-domain.html
-/sdcard/android/layout_tests/http/tests/security/window-properties-clear-port.html
-/sdcard/android/layout_tests/http/tests/security/frame-loading-via-document-write.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-port-explicit-domain.html
-/sdcard/android/layout_tests/http/tests/security/local-image-from-remote.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/workers/methods-async.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/workers/methods.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/web-apps/008.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/methods-async.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/methods.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/uri-resolution-opera-open-005.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/upload-onload-event.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/small-chunks-response-text.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-non-simple-allow-async.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/uri-resolution-opera-open-009.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/frame-unload-abort-crash.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-non-simple-deny-cached.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-unsafe-redirect.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/uri-resolution-opera-open-006.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/upload-onprogress-event.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-allow.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/cache-override.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xhr-onunload.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/methods-lower-case.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/uri-resolution-opera-open-007.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/svg-created-by-xhr-disallowed-in-dashboard.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/uri-resolution-opera-open-004.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-missing-file-exception.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/cookies.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/uri-resolution-opera-open-010.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/redirect-cross-origin-tripmine.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/origin-header-same-origin-get-sync.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/response-encoding.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/frame-load-cancelled-abort.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/upload-progress-events.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xml-encoding.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/default-content-type-dashboard.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/abort-should-cancel-load.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-whitelist-request-headers.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/uri-resolution-opera-open-008.html
-/sdcard/android/layout_tests/http/tests/loading/preload-img-test.html
-/sdcard/android/layout_tests/http/tests/loading/gmail-assert-on-load.html
-/sdcard/android/layout_tests/http/tests/loading/text-content-type-with-binary-extension.html
-/sdcard/android/layout_tests/http/tests/loading/basic.html
-/sdcard/android/layout_tests/http/tests/loading/slow-parsing-subframe.html
-/sdcard/android/layout_tests/http/tests/loading/deleted-host-in-resource-load-delegate-callback.html
-/sdcard/android/layout_tests/http/tests/loading/bad-scheme-subframe.html
-/sdcard/android/layout_tests/http/tests/loading/location-hash-reload-cycle.html
-/sdcard/android/layout_tests/http/tests/loading/bad-server-subframe.html
-/sdcard/android/layout_tests/http/tests/loading/empty-subframe.html
-/sdcard/android/layout_tests/http/tests/loading/redirect-methods.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-play-empty-events.html
-/sdcard/android/layout_tests/media/video-append-source.html
-/sdcard/android/layout_tests/media/media-load-event.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-muted.html
-/sdcard/android/layout_tests/media/progress-event.html
-/sdcard/android/layout_tests/media/video-source-type.html
-/sdcard/android/layout_tests/media/audio-delete-while-step-button-clicked.html
-/sdcard/android/layout_tests/media/video-played-reset.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-loop.html
-/sdcard/android/layout_tests/media/video-src-change.html
-/sdcard/android/layout_tests/media/video-seekable.html
-/sdcard/android/layout_tests/media/video-played.html
-/sdcard/android/layout_tests/media/video-played-collapse.html
-/sdcard/android/layout_tests/media/video-click-dblckick-standalone.html
-/sdcard/android/layout_tests/media/video-can-play-type.html
-/sdcard/android/layout_tests/media/video-seeking.html
-/sdcard/android/layout_tests/media/video-controls-transformed.html
-/sdcard/android/layout_tests/media/video-controls-zoomed.html
-/sdcard/android/layout_tests/media/video-src-invalid-remove.html
-/sdcard/android/layout_tests/media/video-volume.html
-/sdcard/android/layout_tests/media/video-size.html
-/sdcard/android/layout_tests/media/controls-right-click-on-timebar.html
-/sdcard/android/layout_tests/media/video-currentTime.html
-/sdcard/android/layout_tests/media/audio-constructor-autobuffer.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-load-networkState.html
-/sdcard/android/layout_tests/media/unsupported-tracks.html
-/sdcard/android/layout_tests/media/video-source-add-src.html
-/sdcard/android/layout_tests/media/video-seek-past-end-paused.html
-/sdcard/android/layout_tests/media/media-startTime.html
-/sdcard/android/layout_tests/media/video-source-error.html
-/sdcard/android/layout_tests/media/video-autoplay.html
-/sdcard/android/layout_tests/media/video-controls.html
-/sdcard/android/layout_tests/media/video-canvas-source.html
-/sdcard/android/layout_tests/media/video-timeupdate-during-playback.html
-/sdcard/android/layout_tests/media/video-currentTime-set.html
-/sdcard/android/layout_tests/media/controls-css-overload.html
-/sdcard/android/layout_tests/media/video-source-type-params.html
-/sdcard/android/layout_tests/media/event-attributes.html
-/sdcard/android/layout_tests/media/audio-data-url.html
-/sdcard/android/layout_tests/media/video-src-plus-source.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-document-types.html
-/sdcard/android/layout_tests/media/video-src-remove.html
-/sdcard/android/layout_tests/media/audio-delete-while-slider-thumb-clicked.html
-/sdcard/android/layout_tests/media/video-error-abort.html
-/sdcard/android/layout_tests/media/video-size-intrinsic-scale.html
-/sdcard/android/layout_tests/media/progress-event-total.html
-/sdcard/android/layout_tests/media/audio-constructor-src.html
-/sdcard/android/layout_tests/media/audio-mpeg-supported.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/netscape-invoke-browserfuncs.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-map-data-to-src.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/get-empty-url.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/scrollbars/scrollbar-miss-mousemove-disabled.html
-/sdcard/android/layout_tests/security/set-form-autocomplete-attribute.html
-/sdcard/android/layout_tests/storage/execute-sql-args.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/transition-hit-test.html
-/sdcard/android/layout_tests/transitions/opacity-transition-zindex.html
-/sdcard/android/layout_tests/transitions/interrupted-all-transition.html
-/sdcard/android/layout_tests/transitions/hang-with-bad-transition-list.html
-/sdcard/android/layout_tests/transitions/zero-duration-with-non-zero-delay-end.html
-/sdcard/android/layout_tests/transitions/remove-transition-style.html
-/sdcard/android/layout_tests/transitions/transition-hit-test-transform.html
-/sdcard/android/layout_tests/transitions/repeated-firing-background-color.html
-/sdcard/android/layout_tests/webarchive/loading/test-loading-archive.html
-/sdcard/android/layout_tests/wml/onenterforward-event.html
-/sdcard/android/layout_tests/wml/go-task-get-method-external-deck-with-href.html
-/sdcard/android/layout_tests/wml/option-element-onpick.html
-/sdcard/android/layout_tests/wml/enter-first-card-with-events.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/wml/onenterforward-inline-event.html
-/sdcard/android/layout_tests/wml/ontimer-event.html
-/sdcard/android/layout_tests/wml/variable-reference-invalid-character.html
-/sdcard/android/layout_tests/wml/enter-card-with-events.html
-/sdcard/android/layout_tests/wml/ontimer-inline-event.html
-/sdcard/android/layout_tests/wml/select-element-variables.html
-/sdcard/android/layout_tests/wml/variable-reference-valid.html
-/sdcard/android/layout_tests/wml/access-target-deny.html
-/sdcard/android/layout_tests/wml/input-format.html
-/sdcard/android/layout_tests/wml/access-target.html
-/sdcard/android/layout_tests/wml/newcontext-same-deck.html
diff --git a/tests/DumpRenderTree/assets/results/layout_tests_nontext.txt b/tests/DumpRenderTree/assets/results/layout_tests_nontext.txt
deleted file mode 100644
index 665ef07..0000000
--- a/tests/DumpRenderTree/assets/results/layout_tests_nontext.txt
+++ /dev/null
@@ -1,4280 +0,0 @@
-/sdcard/android/layout_tests/accessibility/image-map1.html
-/sdcard/android/layout_tests/accessibility/aria-labelledby-on-input.html
-/sdcard/android/layout_tests/accessibility/aria-labelledby-stay-within.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/table-detection.html
-/sdcard/android/layout_tests/accessibility/table-with-aria-role.html
-/sdcard/android/layout_tests/accessibility/image-map2.html
-/sdcard/android/layout_tests/accessibility/table-cell-spans.html
-/sdcard/android/layout_tests/accessibility/table-cells.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/table-one-cell.html
-/sdcard/android/layout_tests/accessibility/internal-link-anchors2.html
-/sdcard/android/layout_tests/accessibility/radio-button-group-members.html
-/sdcard/android/layout_tests/accessibility/table-attributes.html
-/sdcard/android/layout_tests/accessibility/input-slider.html
-/sdcard/android/layout_tests/accessibility/aria-tables.html
-/sdcard/android/layout_tests/accessibility/legend.html
-/sdcard/android/layout_tests/accessibility/aria-roles.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/compositing/repaint/content-into-overflow.html
-/sdcard/android/layout_tests/compositing/repaint/overflow-into-content.html
-/sdcard/android/layout_tests/compositing/repaint/become-overlay-composited-layer.html
-/sdcard/android/layout_tests/compositing/repaint/layer-repaint-rects.html
-/sdcard/android/layout_tests/compositing/overflow/ancestor-overflow.html
-/sdcard/android/layout_tests/compositing/overflow/overflow-scroll.html
-/sdcard/android/layout_tests/compositing/overflow/overflow-positioning.html
-/sdcard/android/layout_tests/compositing/overflow/parent-overflow.html
-/sdcard/android/layout_tests/compositing/color-matching/image-color-matching.html
-/sdcard/android/layout_tests/compositing/geometry/root-layer-update.html
-/sdcard/android/layout_tests/compositing/geometry/outline-change.html
-/sdcard/android/layout_tests/compositing/reflections/reflection-on-composited.html
-/sdcard/android/layout_tests/compositing/self-painting-layers.html
-/sdcard/android/layout_tests/compositing/direct-image-compositing.html
-/sdcard/android/layout_tests/compositing/layers-inside-overflow-scroll.html
-/sdcard/android/layout_tests/compositing/generated-content.html
-/sdcard/android/layout_tests/compositing/sibling-positioning.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/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/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/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/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/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/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/5017613-2.html
-/sdcard/android/layout_tests/editing/style/underline.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/relative-font-size-change-003.html
-/sdcard/android/layout_tests/editing/style/table-selection.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/6633727.html
-/sdcard/android/layout_tests/editing/inserting/6703873.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/5510537.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/typing-around-image-001.html
-/sdcard/android/layout_tests/editing/inserting/insert-text-at-tabspan-003.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/paragraph-separator-01.html
-/sdcard/android/layout_tests/editing/inserting/insert-3851164-fix.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/multiple-lines-selected.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/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/insert-br-009.html
-/sdcard/android/layout_tests/editing/inserting/4278698.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/insert-div-014.html
-/sdcard/android/layout_tests/editing/inserting/edited-whitespace-1.html
-/sdcard/android/layout_tests/editing/inserting/insert-at-end-01.html
-/sdcard/android/layout_tests/editing/inserting/insert-div-026.html
-/sdcard/android/layout_tests/editing/inserting/break-blockquote-after-delete.html
-/sdcard/android/layout_tests/editing/inserting/redo.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/format-block-with-braces.html
-/sdcard/android/layout_tests/editing/execCommand/outdent-blockquote-test3.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/format-block-with-trailing-br.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/5482023.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/italicizeByCharacter.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/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/toggle-compound-styles.html
-/sdcard/android/layout_tests/editing/execCommand/5080333-2.html
-/sdcard/android/layout_tests/editing/execCommand/outdent-blockquote-test2.html
-/sdcard/android/layout_tests/editing/execCommand/5049671.html
-/sdcard/android/layout_tests/editing/execCommand/4920488.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/4916402.html
-/sdcard/android/layout_tests/editing/execCommand/5138441.html
-/sdcard/android/layout_tests/editing/execCommand/insert-list-empty-div.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/outdent-blockquote-test4.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/outdent-blockquote-test1.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/4641880-1.html
-/sdcard/android/layout_tests/editing/execCommand/4580583-1.html
-/sdcard/android/layout_tests/editing/execCommand/4747450.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/4242293-1.html
-/sdcard/android/layout_tests/editing/pasteboard/5032095.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/paste-blockquote-into-blockquote.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/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/5089327.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/paste-blockquote-after-blockquote.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/5075944-3.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-table-003.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-TIFF.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-text-007.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/mixed-editability-9.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/unrendered-002.html
-/sdcard/android/layout_tests/editing/selection/3690703-2.html
-/sdcard/android/layout_tests/editing/selection/extend-by-character-005.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/clear-selection.html
-/sdcard/android/layout_tests/editing/selection/mixed-editability-6.html
-/sdcard/android/layout_tests/editing/selection/drag-in-iframe.html
-/sdcard/android/layout_tests/editing/selection/unrendered-space.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/select-element-paragraph-boundary.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/editable-non-editable-crash.html
-/sdcard/android/layout_tests/editing/selection/mixed-editability-3.html
-/sdcard/android/layout_tests/editing/selection/replaced-boundaries-3.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/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/extend-by-word-002.html
-/sdcard/android/layout_tests/editing/selection/move-by-character-002.html
-/sdcard/android/layout_tests/editing/selection/14971.html
-/sdcard/android/layout_tests/editing/selection/5131716-2.html
-/sdcard/android/layout_tests/editing/selection/5081257-1.html
-/sdcard/android/layout_tests/editing/selection/move-3875641-fix.html
-/sdcard/android/layout_tests/editing/selection/5099303.html
-/sdcard/android/layout_tests/editing/selection/move-by-line-002.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/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/move-by-word-001.html
-/sdcard/android/layout_tests/editing/selection/select-all-004.html
-/sdcard/android/layout_tests/editing/selection/5076323-2.html
-/sdcard/android/layout_tests/editing/selection/move-3875618-fix.html
-/sdcard/android/layout_tests/editing/selection/inline-table.html
-/sdcard/android/layout_tests/editing/selection/4895428-3.html
-/sdcard/android/layout_tests/editing/selection/caret-before-select.html
-/sdcard/android/layout_tests/editing/selection/select-all-001.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/iframe.html
-/sdcard/android/layout_tests/editing/selection/mixed-editability-7.html
-/sdcard/android/layout_tests/editing/selection/select-all-iframe.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/drag-to-contenteditable-iframe.html
-/sdcard/android/layout_tests/editing/selection/selectNodeContents.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/designmode-no-caret.html
-/sdcard/android/layout_tests/editing/selection/5234383-1.html
-/sdcard/android/layout_tests/editing/selection/5232159.html
-/sdcard/android/layout_tests/editing/selection/4960137.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/replaced-boundaries-1.html
-/sdcard/android/layout_tests/editing/selection/move-by-character-003.html
-/sdcard/android/layout_tests/editing/selection/4776665.html
-/sdcard/android/layout_tests/editing/selection/move-by-character-6.html
-/sdcard/android/layout_tests/editing/selection/image-before-linebreak.html
-/sdcard/android/layout_tests/editing/selection/move-between-blocks-no-001.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/5354455-1.html
-/sdcard/android/layout_tests/editing/selection/expanding-selections2.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/table-caret-2.html
-/sdcard/android/layout_tests/editing/selection/expanding-selections.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/5076323-3.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/5136696.html
-/sdcard/android/layout_tests/editing/selection/4397952.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/4947387.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/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/4866671.html
-/sdcard/android/layout_tests/editing/selection/4895428-1.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/4402375.html
-/sdcard/android/layout_tests/editing/selection/unrendered-001.html
-/sdcard/android/layout_tests/editing/selection/extend-by-character-004.html
-/sdcard/android/layout_tests/editing/selection/contenteditable-click-inside.html
-/sdcard/android/layout_tests/editing/selection/addRange.html
-/sdcard/android/layout_tests/editing/selection/mixed-editability-5.html
-/sdcard/android/layout_tests/editing/selection/5007143.html
-/sdcard/android/layout_tests/editing/selection/fake-doubleclick.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/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/4818145.html
-/sdcard/android/layout_tests/editing/selection/move-backwords-by-word-001.html
-/sdcard/android/layout_tests/editing/selection/mixed-editability-2.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/4889598.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/5354455-2.html
-/sdcard/android/layout_tests/editing/selection/selection-background.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/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/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/after-line-wrap.html
-/sdcard/android/layout_tests/editing/selection/line-wrap-2.html
-/sdcard/android/layout_tests/editing/selection/move-by-line-001.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/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/select-all-003.html
-/sdcard/android/layout_tests/editing/selection/5076323-1.html
-/sdcard/android/layout_tests/editing/selection/5057506-2.html
-/sdcard/android/layout_tests/editing/selection/4975120.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/select-box.html
-/sdcard/android/layout_tests/editing/selection/4895428-2.html
-/sdcard/android/layout_tests/editing/selection/word-granularity.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-line-001.html
-/sdcard/android/layout_tests/editing/deleting/delete-block-contents-003.html
-/sdcard/android/layout_tests/editing/deleting/delete-after-span-ws-003.html
-/sdcard/android/layout_tests/editing/deleting/merge-into-empty-block-1.html
-/sdcard/android/layout_tests/editing/deleting/delete-line-013.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/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/delete-select-all-002.html
-/sdcard/android/layout_tests/editing/deleting/delete-contiguous-ws-001.html
-/sdcard/android/layout_tests/editing/deleting/delete-to-select-table.html
-/sdcard/android/layout_tests/editing/deleting/smart-delete-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/delete-at-paragraph-boundaries-011.html
-/sdcard/android/layout_tests/editing/deleting/5390681.html
-/sdcard/android/layout_tests/editing/deleting/delete-br-004.html
-/sdcard/android/layout_tests/editing/deleting/delete-at-paragraph-boundaries-007.html
-/sdcard/android/layout_tests/editing/deleting/forward-delete.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/delete-br-013.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/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/deleting/type-delete-after-quote.html
-/sdcard/android/layout_tests/editing/spelling/spelling.html
-/sdcard/android/layout_tests/editing/spelling/spellcheck-attribute.html
-/sdcard/android/layout_tests/editing/spelling/inline_spelling_markers.html
-/sdcard/android/layout_tests/editing/spelling/spelling-linebreak.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
-/sdcard/android/layout_tests/fast/media/mq-relative-constraints-09.html
-/sdcard/android/layout_tests/fast/media/mq-width-absolute-03.html
-/sdcard/android/layout_tests/fast/media/mq-invalid-media-feature-02.html
-/sdcard/android/layout_tests/fast/media/mq-simple-query-04.html
-/sdcard/android/layout_tests/fast/media/mq-min-pixel-ratio.html
-/sdcard/android/layout_tests/fast/media/implicit-media-all.html
-/sdcard/android/layout_tests/fast/media/media-descriptor-syntax-01.html
-/sdcard/android/layout_tests/fast/media/mq-simple-neg-query-03.html
-/sdcard/android/layout_tests/fast/media/viewport-media-query.html
-/sdcard/android/layout_tests/fast/media/media-descriptor-syntax-05.html
-/sdcard/android/layout_tests/fast/media/mq-invalid-syntax-01.html
-/sdcard/android/layout_tests/fast/media/mq-transition.html
-/sdcard/android/layout_tests/fast/media/mq-orientation.html
-/sdcard/android/layout_tests/fast/media/mq-invalid-syntax-05.html
-/sdcard/android/layout_tests/fast/media/mq-transform-04.html
-/sdcard/android/layout_tests/fast/media/mq-js-media-except-02.html
-/sdcard/android/layout_tests/fast/media/mq-relative-constraints-02.html
-/sdcard/android/layout_tests/fast/media/mq-js-stylesheet-media-03.html
-/sdcard/android/layout_tests/fast/media/mq-relative-constraints-06.html
-/sdcard/android/layout_tests/fast/media/mq-valueless.html
-/sdcard/android/layout_tests/fast/media/mq-compound-query-03.html
-/sdcard/android/layout_tests/fast/media/mq-simple-query-01.html
-/sdcard/android/layout_tests/fast/media/mq-invalid-media-feature-03.html
-/sdcard/android/layout_tests/fast/media/mq-width-absolute-04.html
-/sdcard/android/layout_tests/fast/media/mq-simple-query-05.html
-/sdcard/android/layout_tests/fast/media/mq-animation.html
-/sdcard/android/layout_tests/fast/media/media-descriptor-syntax-02.html
-/sdcard/android/layout_tests/fast/media/mq-simple-neg-query-04.html
-/sdcard/android/layout_tests/fast/media/media-type-syntax-01.html
-/sdcard/android/layout_tests/fast/media/media-descriptor-syntax-06.html
-/sdcard/android/layout_tests/fast/media/mq-invalid-syntax-02.html
-/sdcard/android/layout_tests/fast/media/mq-transform-01.html
-/sdcard/android/layout_tests/fast/media/monochrome.html
-/sdcard/android/layout_tests/fast/media/mq-pixel-ratio.html
-/sdcard/android/layout_tests/fast/media/mq-js-media-except-03.html
-/sdcard/android/layout_tests/fast/media/mq-relative-constraints-03.html
-/sdcard/android/layout_tests/fast/media/mq-js-stylesheet-media-04.html
-/sdcard/android/layout_tests/fast/media/mq-relative-constraints-07.html
-/sdcard/android/layout_tests/fast/media/mq-compound-query-04.html
-/sdcard/android/layout_tests/fast/media/mq-width-absolute-01.html
-/sdcard/android/layout_tests/fast/media/mq-simple-query-02.html
-/sdcard/android/layout_tests/fast/media/mq-invalid-media-feature-04.html
-/sdcard/android/layout_tests/fast/media/mq-max-pixel-ratio.html
-/sdcard/android/layout_tests/fast/media/mq-simple-neg-query-01.html
-/sdcard/android/layout_tests/fast/media/media-descriptor-syntax-03.html
-/sdcard/android/layout_tests/fast/media/mq-simple-neg-query-05.html
-/sdcard/android/layout_tests/fast/media/media-type-syntax-02.html
-/sdcard/android/layout_tests/fast/media/mq-transform-02.html
-/sdcard/android/layout_tests/fast/media/mq-invalid-syntax-03.html
-/sdcard/android/layout_tests/fast/media/mq-js-stylesheet-media-01.html
-/sdcard/android/layout_tests/fast/media/mq-relative-constraints-04.html
-/sdcard/android/layout_tests/fast/media/mq-grid-01.html
-/sdcard/android/layout_tests/fast/media/mq-compound-query-01.html
-/sdcard/android/layout_tests/fast/media/mq-min-constraint.html
-/sdcard/android/layout_tests/fast/media/mq-relative-constraints-08.html
-/sdcard/android/layout_tests/fast/media/mq-compound-query-05.html
-/sdcard/android/layout_tests/fast/media/mq-width-absolute-02.html
-/sdcard/android/layout_tests/fast/media/mq-invalid-media-feature-01.html
-/sdcard/android/layout_tests/fast/media/mq-simple-query-03.html
-/sdcard/android/layout_tests/fast/media/mq-js-media-forward-syntax.html
-/sdcard/android/layout_tests/fast/media/mq-simple-neg-query-02.html
-/sdcard/android/layout_tests/fast/media/media-descriptor-syntax-04.html
-/sdcard/android/layout_tests/fast/media/mq-aspect-ratio.html
-/sdcard/android/layout_tests/fast/media/mq-invalid-syntax-04.html
-/sdcard/android/layout_tests/fast/media/mq-transform-03.html
-/sdcard/android/layout_tests/fast/media/mq-js-media-except-01.html
-/sdcard/android/layout_tests/fast/media/mq-js-stylesheet-media-02.html
-/sdcard/android/layout_tests/fast/replaced/embed-display-none.html
-/sdcard/android/layout_tests/fast/replaced/width100percent-radio.html
-/sdcard/android/layout_tests/fast/replaced/selection-rect.html
-/sdcard/android/layout_tests/fast/replaced/applet-display-none.html
-/sdcard/android/layout_tests/fast/replaced/inline-box-wrapper-handover.html
-/sdcard/android/layout_tests/fast/replaced/maxheight-pxs.html
-/sdcard/android/layout_tests/fast/replaced/width100percent-searchfield.html
-/sdcard/android/layout_tests/fast/replaced/selection-rect-transform.html
-/sdcard/android/layout_tests/fast/replaced/minwidth-pxs.html
-/sdcard/android/layout_tests/fast/replaced/width100percent-textarea.html
-/sdcard/android/layout_tests/fast/replaced/maxwidth-pxs.html
-/sdcard/android/layout_tests/fast/replaced/absolute-position-percentage-height.html
-/sdcard/android/layout_tests/fast/replaced/004.html
-/sdcard/android/layout_tests/fast/replaced/applet-disabled-positioned.html
-/sdcard/android/layout_tests/fast/replaced/width100percent-checkbox.html
-/sdcard/android/layout_tests/fast/replaced/008.html
-/sdcard/android/layout_tests/fast/replaced/percent-height-in-anonymous-block-widget.html
-/sdcard/android/layout_tests/fast/replaced/maxheight-percent.html
-/sdcard/android/layout_tests/fast/replaced/minwidth-percent.html
-/sdcard/android/layout_tests/fast/replaced/maxwidth-percent.html
-/sdcard/android/layout_tests/fast/replaced/applet-rendering-java-disabled.html
-/sdcard/android/layout_tests/fast/replaced/width100percent-button.html
-/sdcard/android/layout_tests/fast/replaced/image-resize-width.html
-/sdcard/android/layout_tests/fast/replaced/absolute-image-sizing.html
-/sdcard/android/layout_tests/fast/replaced/001.html
-/sdcard/android/layout_tests/fast/replaced/005.html
-/sdcard/android/layout_tests/fast/replaced/object-display-none.html
-/sdcard/android/layout_tests/fast/replaced/absolute-position-percentage-width.html
-/sdcard/android/layout_tests/fast/replaced/object-align-hspace-vspace.html
-/sdcard/android/layout_tests/fast/replaced/width100percent-menulist.html
-/sdcard/android/layout_tests/fast/replaced/percent-height-in-anonymous-block-in-table.html
-/sdcard/android/layout_tests/fast/replaced/image-sizing.html
-/sdcard/android/layout_tests/fast/replaced/minheight-pxs.html
-/sdcard/android/layout_tests/fast/replaced/pdf-as-image.html
-/sdcard/android/layout_tests/fast/replaced/replaced-breaking-mixture.html
-/sdcard/android/layout_tests/fast/replaced/max-width-percent.html
-/sdcard/android/layout_tests/fast/replaced/002.html
-/sdcard/android/layout_tests/fast/replaced/006.html
-/sdcard/android/layout_tests/fast/replaced/minheight-percent.html
-/sdcard/android/layout_tests/fast/replaced/absolute-position-with-auto-width-and-left-and-right.html
-/sdcard/android/layout_tests/fast/replaced/selection-rect-in-table-cell.html
-/sdcard/android/layout_tests/fast/replaced/border-radius-clip.html
-/sdcard/android/layout_tests/fast/replaced/percent-height-in-anonymous-block.html
-/sdcard/android/layout_tests/fast/replaced/three-selects-break.html
-/sdcard/android/layout_tests/fast/replaced/image-tag.html
-/sdcard/android/layout_tests/fast/replaced/image-onload.html
-/sdcard/android/layout_tests/fast/replaced/replaced-breaking.html
-/sdcard/android/layout_tests/fast/replaced/width100percent-image.html
-/sdcard/android/layout_tests/fast/replaced/image-solid-color-with-alpha.html
-/sdcard/android/layout_tests/fast/replaced/003.html
-/sdcard/android/layout_tests/fast/replaced/replaced-child-of-absolute-with-auto-height.html
-/sdcard/android/layout_tests/fast/replaced/007.html
-/sdcard/android/layout_tests/fast/replaced/absolute-position-with-auto-height-and-top-and-bottom.html
-/sdcard/android/layout_tests/fast/replaced/width100percent-textfield.html
-/sdcard/android/layout_tests/fast/dynamic/positioned-movement-with-positioned-children.html
-/sdcard/android/layout_tests/fast/dynamic/subtree-table-cell-height.html
-/sdcard/android/layout_tests/fast/dynamic/move-node-with-selection.html
-/sdcard/android/layout_tests/fast/dynamic/create-renderer-for-whitespace-only-text.html
-/sdcard/android/layout_tests/fast/dynamic/outerHTML-doc.html
-/sdcard/android/layout_tests/fast/dynamic/window-scrollbars-test.html
-/sdcard/android/layout_tests/fast/dynamic/floating-to-positioned-2.html
-/sdcard/android/layout_tests/fast/dynamic/anchor-lock.html
-/sdcard/android/layout_tests/fast/dynamic/012.html
-/sdcard/android/layout_tests/fast/dynamic/004.html
-/sdcard/android/layout_tests/fast/dynamic/008.html
-/sdcard/android/layout_tests/fast/dynamic/float-no-longer-overhanging.html
-/sdcard/android/layout_tests/fast/dynamic/float-withdrawal-2.html
-/sdcard/android/layout_tests/fast/dynamic/float-in-trailing-whitespace-after-last-line-break.html
-/sdcard/android/layout_tests/fast/dynamic/selection-highlight-adjust.html
-/sdcard/android/layout_tests/fast/dynamic/subtree-no-common-root-static-y.html
-/sdcard/android/layout_tests/fast/dynamic/genContentDestroyChildren.html
-/sdcard/android/layout_tests/fast/dynamic/001.html
-/sdcard/android/layout_tests/fast/dynamic/link-href-change.html
-/sdcard/android/layout_tests/fast/dynamic/013.html
-/sdcard/android/layout_tests/fast/dynamic/005.html
-/sdcard/android/layout_tests/fast/dynamic/009.html
-/sdcard/android/layout_tests/fast/dynamic/float-withdrawal.html
-/sdcard/android/layout_tests/fast/dynamic/anonymous-block-layer-lost.html
-/sdcard/android/layout_tests/fast/dynamic/layer-hit-test-crash.html
-/sdcard/android/layout_tests/fast/dynamic/view-overflow.html
-/sdcard/android/layout_tests/fast/dynamic/window-resize-scrollbars-test.html
-/sdcard/android/layout_tests/fast/dynamic/010.html
-/sdcard/android/layout_tests/fast/dynamic/002.html
-/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
-/sdcard/android/layout_tests/fast/dynamic/noninlinebadness.html
-/sdcard/android/layout_tests/fast/dynamic/subtree-parent-static-y.html
-/sdcard/android/layout_tests/fast/dynamic/outerHTML-img.html
-/sdcard/android/layout_tests/fast/dynamic/staticY-marking-parents-regression.html
-/sdcard/android/layout_tests/fast/dynamic/floating-to-positioned.html
-/sdcard/android/layout_tests/fast/dynamic/subtree-boundary-percent-height.html
-/sdcard/android/layout_tests/fast/dynamic/011.html
-/sdcard/android/layout_tests/fast/dynamic/containing-block-change.html
-/sdcard/android/layout_tests/fast/dynamic/015.html
-/sdcard/android/layout_tests/fast/dynamic/007.html
-/sdcard/android/layout_tests/fast/text/firstline/001.html
-/sdcard/android/layout_tests/fast/text/firstline/002.html
-/sdcard/android/layout_tests/fast/text/firstline/003.html
-/sdcard/android/layout_tests/fast/text/international/hindi-spacing.html
-/sdcard/android/layout_tests/fast/text/international/bidi-L2-run-reordering.html
-/sdcard/android/layout_tests/fast/text/international/bidi-override.html
-/sdcard/android/layout_tests/fast/text/international/hindi-whitespace.html
-/sdcard/android/layout_tests/fast/text/international/bidi-european-terminators.html
-/sdcard/android/layout_tests/fast/text/international/bidi-LDB-2-formatting-characters.html
-/sdcard/android/layout_tests/fast/text/international/bidi-AN-after-L.html
-/sdcard/android/layout_tests/fast/text/international/bidi-LDB-2-CSS.html
-/sdcard/android/layout_tests/fast/text/international/bidi-control-chars-treated-as-ZWS.html
-/sdcard/android/layout_tests/fast/text/international/bidi-neutral-directionality-paragraph-start.html
-/sdcard/android/layout_tests/fast/text/international/bidi-linebreak-001.html
-/sdcard/android/layout_tests/fast/text/international/bidi-linebreak-003.html
-/sdcard/android/layout_tests/fast/text/international/002.html
-/sdcard/android/layout_tests/fast/text/international/bidi-explicit-embedding.html
-/sdcard/android/layout_tests/fast/text/international/rtl-white-space-pre-wrap.html
-/sdcard/android/layout_tests/fast/text/international/bidi-CS-after-AN.html
-/sdcard/android/layout_tests/fast/text/international/complex-character-based-fallback.html
-/sdcard/android/layout_tests/fast/text/international/wrap-CJK-001.html
-/sdcard/android/layout_tests/fast/text/international/bidi-listbox-atsui.html
-/sdcard/android/layout_tests/fast/text/international/thai-line-breaks.html
-/sdcard/android/layout_tests/fast/text/international/bidi-neutral-run.html
-/sdcard/android/layout_tests/fast/text/international/bidi-innertext.html
-/sdcard/android/layout_tests/fast/text/international/bidi-listbox.html
-/sdcard/android/layout_tests/fast/text/international/khmer-selection.html
-/sdcard/android/layout_tests/fast/text/international/thai-baht-space.html
-/sdcard/android/layout_tests/fast/text/international/rtl-caret.html
-/sdcard/android/layout_tests/fast/text/international/bidi-AN-after-empty-run.html
-/sdcard/android/layout_tests/fast/text/international/001.html
-/sdcard/android/layout_tests/fast/text/international/bidi-linebreak-002.html
-/sdcard/android/layout_tests/fast/text/international/danda-space.html
-/sdcard/android/layout_tests/fast/text/international/003.html
-/sdcard/android/layout_tests/fast/text/international/bidi-ignored-for-first-child-inline.html
-/sdcard/android/layout_tests/fast/text/international/bidi-layout-across-linebreak.html
-/sdcard/android/layout_tests/fast/text/international/bidi-menulist.html
-/sdcard/android/layout_tests/fast/text/international/bidi-LDB-2-HTML.html
-/sdcard/android/layout_tests/fast/text/whitespace/pre-wrap-overflow-selection.html
-/sdcard/android/layout_tests/fast/text/whitespace/pre-newline-box-test.html
-/sdcard/android/layout_tests/fast/text/whitespace/span-in-word-space-causes-overflow.html
-/sdcard/android/layout_tests/fast/text/whitespace/nowrap-clear-float.html
-/sdcard/android/layout_tests/fast/text/whitespace/pre-wrap-line-test.html
-/sdcard/android/layout_tests/fast/text/whitespace/010.html
-/sdcard/android/layout_tests/fast/text/whitespace/020.html
-/sdcard/android/layout_tests/fast/text/whitespace/002.html
-/sdcard/android/layout_tests/fast/text/whitespace/030.html
-/sdcard/android/layout_tests/fast/text/whitespace/012.html
-/sdcard/android/layout_tests/fast/text/whitespace/022.html
-/sdcard/android/layout_tests/fast/text/whitespace/004.html
-/sdcard/android/layout_tests/fast/text/whitespace/014.html
-/sdcard/android/layout_tests/fast/text/whitespace/024.html
-/sdcard/android/layout_tests/fast/text/whitespace/006.html
-/sdcard/android/layout_tests/fast/text/whitespace/016.html
-/sdcard/android/layout_tests/fast/text/whitespace/008.html
-/sdcard/android/layout_tests/fast/text/whitespace/026.html
-/sdcard/android/layout_tests/fast/text/whitespace/018.html
-/sdcard/android/layout_tests/fast/text/whitespace/028.html
-/sdcard/android/layout_tests/fast/text/whitespace/normal-after-nowrap-breaking.html
-/sdcard/android/layout_tests/fast/text/whitespace/pre-break-word.html
-/sdcard/android/layout_tests/fast/text/whitespace/nbsp-mode-and-linewraps.html
-/sdcard/android/layout_tests/fast/text/whitespace/001.html
-/sdcard/android/layout_tests/fast/text/whitespace/011.html
-/sdcard/android/layout_tests/fast/text/whitespace/tab-character-basics.html
-/sdcard/android/layout_tests/fast/text/whitespace/003.html
-/sdcard/android/layout_tests/fast/text/whitespace/021.html
-/sdcard/android/layout_tests/fast/text/whitespace/013.html
-/sdcard/android/layout_tests/fast/text/whitespace/023.html
-/sdcard/android/layout_tests/fast/text/whitespace/005.html
-/sdcard/android/layout_tests/fast/text/whitespace/015.html
-/sdcard/android/layout_tests/fast/text/whitespace/025.html
-/sdcard/android/layout_tests/fast/text/whitespace/007.html
-/sdcard/android/layout_tests/fast/text/whitespace/017.html
-/sdcard/android/layout_tests/fast/text/whitespace/pre-wrap-spaces-after-newline.html
-/sdcard/android/layout_tests/fast/text/whitespace/027.html
-/sdcard/android/layout_tests/fast/text/whitespace/009.html
-/sdcard/android/layout_tests/fast/text/whitespace/019.html
-/sdcard/android/layout_tests/fast/text/whitespace/pre-wrap-last-char.html
-/sdcard/android/layout_tests/fast/text/whitespace/029.html
-/sdcard/android/layout_tests/fast/text/basic/001.html
-/sdcard/android/layout_tests/fast/text/basic/002.html
-/sdcard/android/layout_tests/fast/text/basic/011.html
-/sdcard/android/layout_tests/fast/text/basic/generic-family-changes.html
-/sdcard/android/layout_tests/fast/text/basic/003.html
-/sdcard/android/layout_tests/fast/text/basic/012.html
-/sdcard/android/layout_tests/fast/text/basic/004.html
-/sdcard/android/layout_tests/fast/text/basic/013.html
-/sdcard/android/layout_tests/fast/text/basic/005.html
-/sdcard/android/layout_tests/fast/text/basic/014.html
-/sdcard/android/layout_tests/fast/text/basic/006.html
-/sdcard/android/layout_tests/fast/text/basic/015.html
-/sdcard/android/layout_tests/fast/text/basic/007.html
-/sdcard/android/layout_tests/fast/text/basic/008.html
-/sdcard/android/layout_tests/fast/text/basic/009.html
-/sdcard/android/layout_tests/fast/text/basic/generic-family-reset.html
-/sdcard/android/layout_tests/fast/text/in-rendered-text-rtl.html
-/sdcard/android/layout_tests/fast/text/selection-painted-separately.html
-/sdcard/android/layout_tests/fast/text/bidi-embedding-pop-and-push-same.html
-/sdcard/android/layout_tests/fast/text/wbr-in-pre-crash.html
-/sdcard/android/layout_tests/fast/text/atsui-spacing-features.html
-/sdcard/android/layout_tests/fast/text/textIteratorNilRenderer.html
-/sdcard/android/layout_tests/fast/text/drawBidiText.html
-/sdcard/android/layout_tests/fast/text/selection-hard-linebreak.html
-/sdcard/android/layout_tests/fast/text/word-break.html
-/sdcard/android/layout_tests/fast/text/break-word.html
-/sdcard/android/layout_tests/fast/text/font-initial.html
-/sdcard/android/layout_tests/fast/text/complex-text-opacity.html
-/sdcard/android/layout_tests/fast/text/stroking.html
-/sdcard/android/layout_tests/fast/text/midword-break-hang.html
-/sdcard/android/layout_tests/fast/text/atsui-partial-selection.html
-/sdcard/android/layout_tests/fast/text/embed-at-end-of-pre-wrap-line.html
-/sdcard/android/layout_tests/fast/text/atsui-multiple-renderers.html
-/sdcard/android/layout_tests/fast/text/shadow-translucent-fill.html
-/sdcard/android/layout_tests/fast/text/apply-start-width-after-skipped-text.html
-/sdcard/android/layout_tests/fast/text/capitalize-preserve-nbsp.html
-/sdcard/android/layout_tests/fast/text/updateNewFont.html
-/sdcard/android/layout_tests/fast/text/atsui-rtl-override-selection.html
-/sdcard/android/layout_tests/fast/text/align-center-rtl-spill.html
-/sdcard/android/layout_tests/fast/text/wbr.html
-/sdcard/android/layout_tests/fast/text/cg-vs-atsui.html
-/sdcard/android/layout_tests/fast/text/monospace-width-cache.html
-/sdcard/android/layout_tests/fast/text/soft-hyphen-2.html
-/sdcard/android/layout_tests/fast/text/atsui-pointtooffset-calls-cg.html
-/sdcard/android/layout_tests/fast/text/justified-selection.html
-/sdcard/android/layout_tests/fast/text/atsui-kerning-and-ligatures.html
-/sdcard/android/layout_tests/fast/text/wbr-pre.html
-/sdcard/android/layout_tests/fast/text/capitalize-boundaries.html
-/sdcard/android/layout_tests/fast/text/trailing-white-space.html
-/sdcard/android/layout_tests/fast/text/capitalize-empty-generated-string.html
-/sdcard/android/layout_tests/fast/text/stripNullFromText.html
-/sdcard/android/layout_tests/fast/text/letter-spacing-negative-opacity.html
-/sdcard/android/layout_tests/fast/text/atsui-small-caps-punctuation-size.html
-/sdcard/android/layout_tests/fast/text/word-break-soft-hyphen.html
-/sdcard/android/layout_tests/fast/text/fixed-pitch-control-characters.html
-/sdcard/android/layout_tests/fast/text/cg-fallback-bolding.html
-/sdcard/android/layout_tests/fast/text/line-breaks-after-white-space.html
-/sdcard/android/layout_tests/fast/text/text-letter-spacing.html
-/sdcard/android/layout_tests/fast/text/soft-hyphen-3.html
-/sdcard/android/layout_tests/fast/text/should-use-atsui.html
-/sdcard/android/layout_tests/fast/text/wide-zero-width-space.html
-/sdcard/android/layout_tests/fast/text/justified-selection-at-edge.html
-/sdcard/android/layout_tests/fast/text/trailing-white-space-2.html
-/sdcard/android/layout_tests/fast/text/word-break-run-rounding.html
-/sdcard/android/layout_tests/fast/text/softHyphen.html
-/sdcard/android/layout_tests/fast/text/delete-hard-break-character.html
-/sdcard/android/layout_tests/fast/text/line-breaks.html
-/sdcard/android/layout_tests/fast/text/wbr-styled.html
-/sdcard/android/layout_tests/fast/text/large-text-composed-char.html
-/sdcard/android/layout_tests/fast/text/shadow-no-blur.html
-/sdcard/android/layout_tests/fast/text/reset-emptyRun.html
-/sdcard/android/layout_tests/fast/text/word-space.html
-/sdcard/android/layout_tests/fast/text/midword-break-after-breakable-char.html
-/sdcard/android/layout_tests/fast/text/stroking-decorations.html
-/sdcard/android/layout_tests/fast/encoding/utf-16-little-endian.html
-/sdcard/android/layout_tests/fast/encoding/denormalised-voiced-japanese-chars.html
-/sdcard/android/layout_tests/fast/encoding/utf-16-no-bom.xml
-/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/column-rules-stacking.html
-/sdcard/android/layout_tests/fast/multicol/zeroColumnCount.html
-/sdcard/android/layout_tests/fast/multicol/columns-shorthand-parsing.html
-/sdcard/android/layout_tests/fast/multicol/float-multicol.html
-/sdcard/android/layout_tests/fast/doctypes/001.html
-/sdcard/android/layout_tests/fast/doctypes/002.html
-/sdcard/android/layout_tests/fast/doctypes/003.html
-/sdcard/android/layout_tests/fast/doctypes/004.html
-/sdcard/android/layout_tests/fast/css-generated-content/table-row-group-to-inline.html
-/sdcard/android/layout_tests/fast/css-generated-content/spellingToolTip-assert.html
-/sdcard/android/layout_tests/fast/css-generated-content/no-openclose-quote.html
-/sdcard/android/layout_tests/fast/css-generated-content/before-with-first-letter.html
-/sdcard/android/layout_tests/fast/css-generated-content/table-row-group-with-before.html
-/sdcard/android/layout_tests/fast/css-generated-content/010.html
-/sdcard/android/layout_tests/fast/css-generated-content/table-with-before.html
-/sdcard/android/layout_tests/fast/css-generated-content/002.html
-/sdcard/android/layout_tests/fast/css-generated-content/012.html
-/sdcard/android/layout_tests/fast/css-generated-content/004.html
-/sdcard/android/layout_tests/fast/css-generated-content/014.html
-/sdcard/android/layout_tests/fast/css-generated-content/016.html
-/sdcard/android/layout_tests/fast/css-generated-content/008.html
-/sdcard/android/layout_tests/fast/css-generated-content/after-order.html
-/sdcard/android/layout_tests/fast/css-generated-content/table-cell-before-content.html
-/sdcard/android/layout_tests/fast/css-generated-content/visibleContentHiddenParent.html
-/sdcard/android/layout_tests/fast/css-generated-content/inline-display-types.html
-/sdcard/android/layout_tests/fast/css-generated-content/positioned-background-hit-test-crash.html
-/sdcard/android/layout_tests/fast/css-generated-content/001.html
-/sdcard/android/layout_tests/fast/css-generated-content/011.html
-/sdcard/android/layout_tests/fast/css-generated-content/003.html
-/sdcard/android/layout_tests/fast/css-generated-content/beforeAfter-interdocument.html
-/sdcard/android/layout_tests/fast/css-generated-content/013.html
-/sdcard/android/layout_tests/fast/css-generated-content/005.html
-/sdcard/android/layout_tests/fast/css-generated-content/hover-style-change.html
-/sdcard/android/layout_tests/fast/css-generated-content/table-row-with-before.html
-/sdcard/android/layout_tests/fast/css-generated-content/absolute-position-inside-inline.html
-/sdcard/android/layout_tests/fast/css-generated-content/015.html
-/sdcard/android/layout_tests/fast/css-generated-content/hit-test-generated-content.html
-/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/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
-/sdcard/android/layout_tests/fast/lists/ol-start-dynamic.html
-/sdcard/android/layout_tests/fast/lists/numeric-markers-outside-list.html
-/sdcard/android/layout_tests/fast/lists/marker-image-error.html
-/sdcard/android/layout_tests/fast/lists/marker-before-empty-inline.html
-/sdcard/android/layout_tests/fast/lists/list-marker-with-line-height.html
-/sdcard/android/layout_tests/fast/lists/scrolled-marker-paint.html
-/sdcard/android/layout_tests/fast/lists/li-values.html
-/sdcard/android/layout_tests/fast/lists/002.html
-/sdcard/android/layout_tests/fast/lists/dynamic-marker-crash.html
-/sdcard/android/layout_tests/fast/lists/list-item-line-height.html
-/sdcard/android/layout_tests/fast/lists/004.html
-/sdcard/android/layout_tests/fast/lists/drag-into-marker.html
-/sdcard/android/layout_tests/fast/lists/list-style-none-crash.html
-/sdcard/android/layout_tests/fast/lists/alpha-list-wrap.html
-/sdcard/android/layout_tests/fast/lists/006.html
-/sdcard/android/layout_tests/fast/lists/ol-start-parsing.html
-/sdcard/android/layout_tests/fast/lists/008.html
-/sdcard/android/layout_tests/fast/lists/inlineBoxWrapperNullCheck.html
-/sdcard/android/layout_tests/fast/lists/w3-list-styles.html
-/sdcard/android/layout_tests/fast/lists/item-not-in-list-line-wrapping.html
-/sdcard/android/layout_tests/fast/lists/olstart.html
-/sdcard/android/layout_tests/fast/lists/big-list-marker.html
-/sdcard/android/layout_tests/fast/lists/markers-in-selection.html
-/sdcard/android/layout_tests/fast/lists/list-style-type-dynamic-change.html
-/sdcard/android/layout_tests/fast/lists/001.html
-/sdcard/android/layout_tests/fast/lists/ordered-list-with-no-ol-tag.html
-/sdcard/android/layout_tests/fast/lists/003.html
-/sdcard/android/layout_tests/fast/lists/005.html
-/sdcard/android/layout_tests/fast/lists/li-br.html
-/sdcard/android/layout_tests/fast/lists/007.html
-/sdcard/android/layout_tests/fast/lists/009.html
-/sdcard/android/layout_tests/fast/transforms/transform-overflow.html
-/sdcard/android/layout_tests/fast/transforms/transforms-with-opacity.html
-/sdcard/android/layout_tests/fast/transforms/transformed-caret.html
-/sdcard/android/layout_tests/fast/transforms/bounding-rect-zoom.html
-/sdcard/android/layout_tests/fast/transforms/matrix-01.html
-/sdcard/android/layout_tests/fast/transforms/matrix-02.html
-/sdcard/android/layout_tests/fast/transforms/overflow-with-transform.html
-/sdcard/android/layout_tests/fast/transforms/transformed-document-element.html
-/sdcard/android/layout_tests/fast/transforms/transforms-with-zoom.html
-/sdcard/android/layout_tests/fast/transforms/transformed-focused-text-input.html
-/sdcard/android/layout_tests/fast/transforms/identity-matrix.html
-/sdcard/android/layout_tests/fast/transforms/transform-on-inline.html
-/sdcard/android/layout_tests/fast/transforms/transform-positioned-ancestor.html
-/sdcard/android/layout_tests/fast/transforms/skew-with-unitless-zero.html
-/sdcard/android/layout_tests/fast/transforms/transform-table-row.html
-/sdcard/android/layout_tests/fast/transforms/shadows.html
-/sdcard/android/layout_tests/fast/transforms/diamond.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusSolid01.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusDouble01.html
-/sdcard/android/layout_tests/fast/borders/block-mask-overlay-image.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusDouble03.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusSolid03.html
-/sdcard/android/layout_tests/fast/borders/border-color-inherit.html
-/sdcard/android/layout_tests/fast/borders/svg-as-border-image-2.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusInvalidColor.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusDotted02.html
-/sdcard/android/layout_tests/fast/borders/border-image-scale-transform.html
-/sdcard/android/layout_tests/fast/borders/border-fit.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusArcs01.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusDashed01.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusDashed03.html
-/sdcard/android/layout_tests/fast/borders/fieldsetBorderRadius.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusAllStylesAllCorners.html
-/sdcard/android/layout_tests/fast/borders/border-radius-split-inline.html
-/sdcard/android/layout_tests/fast/borders/border-radius-constraints.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusGroove01.html
-/sdcard/android/layout_tests/fast/borders/border-image-omit-right-slice.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusDouble02.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusSolid02.html
-/sdcard/android/layout_tests/fast/borders/outline-offset-min-assert.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusSolid04.html
-/sdcard/android/layout_tests/fast/borders/border-radius-huge-assert.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusInset01.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusDotted01.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusOutset01.html
-/sdcard/android/layout_tests/fast/borders/svg-as-border-image.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusDotted03.html
-/sdcard/android/layout_tests/fast/borders/border-image-border-radius.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusDashed02.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusRidge01.html
-/sdcard/android/layout_tests/fast/borders/border-image-rotate-transform.html
-/sdcard/android/layout_tests/fast/borders/inline-mask-overlay-image.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusGroove02.html
-/sdcard/android/layout_tests/fast/borders/border-image-01.html
-/sdcard/android/layout_tests/fast/innerHTML/001.html
-/sdcard/android/layout_tests/fast/innerHTML/002.html
-/sdcard/android/layout_tests/fast/innerHTML/003.html
-/sdcard/android/layout_tests/fast/innerHTML/006.html
-/sdcard/android/layout_tests/fast/selectors/175a.html
-/sdcard/android/layout_tests/fast/selectors/155c.html
-/sdcard/android/layout_tests/fast/selectors/059.html
-/sdcard/android/layout_tests/fast/selectors/066b.html
-/sdcard/android/layout_tests/fast/selectors/168.html
-/sdcard/android/layout_tests/fast/selectors/177a.html
-/sdcard/android/layout_tests/fast/selectors/087b.html
-/sdcard/android/layout_tests/fast/selectors/020.html
-/sdcard/android/layout_tests/fast/selectors/012.html
-/sdcard/android/layout_tests/fast/selectors/040.html
-/sdcard/android/layout_tests/fast/selectors/004.html
-/sdcard/android/layout_tests/fast/selectors/032.html
-/sdcard/android/layout_tests/fast/selectors/060.html
-/sdcard/android/layout_tests/fast/selectors/016.html
-/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/064.html
-/sdcard/android/layout_tests/fast/selectors/056.html
-/sdcard/android/layout_tests/fast/selectors/018b.html
-/sdcard/android/layout_tests/fast/selectors/090b.html
-/sdcard/android/layout_tests/fast/selectors/045c.html
-/sdcard/android/layout_tests/fast/selectors/170d.html
-/sdcard/android/layout_tests/fast/selectors/157.html
-/sdcard/android/layout_tests/fast/selectors/039b.html
-/sdcard/android/layout_tests/fast/selectors/156b.html
-/sdcard/android/layout_tests/fast/selectors/175b.html
-/sdcard/android/layout_tests/fast/selectors/155d.html
-/sdcard/android/layout_tests/fast/selectors/167a.html
-/sdcard/android/layout_tests/fast/selectors/169.html
-/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/001.html
-/sdcard/android/layout_tests/fast/selectors/021.html
-/sdcard/android/layout_tests/fast/selectors/unqualified-hover-quirks.html
-/sdcard/android/layout_tests/fast/selectors/013.html
-/sdcard/android/layout_tests/fast/selectors/041.html
-/sdcard/android/layout_tests/fast/selectors/021b.html
-/sdcard/android/layout_tests/fast/selectors/005.html
-/sdcard/android/layout_tests/fast/selectors/061.html
-/sdcard/android/layout_tests/fast/selectors/170.html
-/sdcard/android/layout_tests/fast/selectors/017.html
-/sdcard/android/layout_tests/fast/selectors/170a.html
-/sdcard/android/layout_tests/fast/selectors/009.html
-/sdcard/android/layout_tests/fast/selectors/045.html
-/sdcard/android/layout_tests/fast/selectors/154.html
-/sdcard/android/layout_tests/fast/selectors/044b.html
-/sdcard/android/layout_tests/fast/selectors/065.html
-/sdcard/android/layout_tests/fast/selectors/155a.html
-/sdcard/android/layout_tests/fast/selectors/166.html
-/sdcard/android/layout_tests/fast/selectors/158.html
-/sdcard/android/layout_tests/fast/selectors/077.html
-/sdcard/android/layout_tests/fast/selectors/175c.html
-/sdcard/android/layout_tests/fast/selectors/089.html
-/sdcard/android/layout_tests/fast/selectors/088b.html
-/sdcard/android/layout_tests/fast/selectors/nondeterministic-combinators.html
-/sdcard/android/layout_tests/fast/selectors/unqualified-hover-strict.html
-/sdcard/android/layout_tests/fast/selectors/010.html
-/sdcard/android/layout_tests/fast/selectors/002.html
-/sdcard/android/layout_tests/fast/selectors/014.html
-/sdcard/android/layout_tests/fast/selectors/042.html
-/sdcard/android/layout_tests/fast/selectors/006.html
-/sdcard/android/layout_tests/fast/selectors/034.html
-/sdcard/android/layout_tests/fast/selectors/062.html
-/sdcard/android/layout_tests/fast/selectors/007a.html
-/sdcard/android/layout_tests/fast/selectors/054.html
-/sdcard/android/layout_tests/fast/selectors/018.html
-/sdcard/android/layout_tests/fast/selectors/046.html
-/sdcard/android/layout_tests/fast/selectors/170b.html
-/sdcard/android/layout_tests/fast/selectors/072b.html
-/sdcard/android/layout_tests/fast/selectors/044c.html
-/sdcard/android/layout_tests/fast/selectors/038.html
-/sdcard/android/layout_tests/fast/selectors/155.html
-/sdcard/android/layout_tests/fast/selectors/066.html
-/sdcard/android/layout_tests/fast/selectors/058.html
-/sdcard/android/layout_tests/fast/selectors/155b.html
-/sdcard/android/layout_tests/fast/selectors/166a.html
-/sdcard/android/layout_tests/fast/selectors/167.html
-/sdcard/android/layout_tests/fast/selectors/159.html
-/sdcard/android/layout_tests/fast/selectors/168a.html
-/sdcard/android/layout_tests/fast/selectors/078b.html
-/sdcard/android/layout_tests/fast/selectors/011.html
-/sdcard/android/layout_tests/fast/selectors/003.html
-/sdcard/android/layout_tests/fast/selectors/015.html
-/sdcard/android/layout_tests/fast/selectors/043.html
-/sdcard/android/layout_tests/fast/selectors/160.html
-/sdcard/android/layout_tests/fast/selectors/063.html
-/sdcard/android/layout_tests/fast/selectors/043b.html
-/sdcard/android/layout_tests/fast/selectors/007b.html
-/sdcard/android/layout_tests/fast/selectors/027.html
-/sdcard/android/layout_tests/fast/selectors/019.html
-/sdcard/android/layout_tests/fast/selectors/083.html
-/sdcard/android/layout_tests/fast/selectors/045b.html
-/sdcard/android/layout_tests/fast/selectors/170c.html
-/sdcard/android/layout_tests/fast/selectors/044d.html
-/sdcard/android/layout_tests/fast/selectors/039.html
-/sdcard/android/layout_tests/fast/overflow/overflow-focus-ring.html
-/sdcard/android/layout_tests/fast/overflow/overflow-x-y.html
-/sdcard/android/layout_tests/fast/overflow/overflow-text-hit-testing.html
-/sdcard/android/layout_tests/fast/overflow/unreachable-overflow-rtl-bug.html
-/sdcard/android/layout_tests/fast/overflow/overflow-auto-position-absolute.html
-/sdcard/android/layout_tests/fast/overflow/scrollRevealButton.html
-/sdcard/android/layout_tests/fast/overflow/overflow-rtl-inline-scrollbar.html
-/sdcard/android/layout_tests/fast/overflow/002.html
-/sdcard/android/layout_tests/fast/overflow/overflow-rtl.html
-/sdcard/android/layout_tests/fast/overflow/004.html
-/sdcard/android/layout_tests/fast/overflow/overflow-stacking.html
-/sdcard/android/layout_tests/fast/overflow/006.html
-/sdcard/android/layout_tests/fast/overflow/border-radius-clipping.html
-/sdcard/android/layout_tests/fast/overflow/scrollbar-position-update.html
-/sdcard/android/layout_tests/fast/overflow/008.html
-/sdcard/android/layout_tests/fast/overflow/overflow-float-stacking.html
-/sdcard/android/layout_tests/fast/overflow/scroll-nested-positioned-layer-in-overflow.html
-/sdcard/android/layout_tests/fast/overflow/image-selection-highlight.html
-/sdcard/android/layout_tests/fast/overflow/childFocusRingClip.html
-/sdcard/android/layout_tests/fast/overflow/position-relative.html
-/sdcard/android/layout_tests/fast/overflow/dynamic-hidden.html
-/sdcard/android/layout_tests/fast/overflow/overflow_hidden.html
-/sdcard/android/layout_tests/fast/overflow/clip-rects-fixed-ancestor.html
-/sdcard/android/layout_tests/fast/overflow/infiniteRecursionGuard.html
-/sdcard/android/layout_tests/fast/overflow/float-in-relpositioned.html
-/sdcard/android/layout_tests/fast/overflow/table-overflow-float.html
-/sdcard/android/layout_tests/fast/overflow/003.xml
-/sdcard/android/layout_tests/fast/overflow/overflow-auto-table.html
-/sdcard/android/layout_tests/fast/overflow/unreachable-content-test.html
-/sdcard/android/layout_tests/fast/overflow/infiniteRecursion.html
-/sdcard/android/layout_tests/fast/overflow/001.html
-/sdcard/android/layout_tests/fast/overflow/hit-test-overflow-controls.html
-/sdcard/android/layout_tests/fast/overflow/005.html
-/sdcard/android/layout_tests/fast/overflow/007.html
-/sdcard/android/layout_tests/fast/overflow/overflow-with-local-background-attachment.html
-/sdcard/android/layout_tests/fast/overflow/hidden-scrollbar-resize.html
-/sdcard/android/layout_tests/fast/events/context-no-deselect.html
-/sdcard/android/layout_tests/fast/events/autoscroll.html
-/sdcard/android/layout_tests/fast/events/5056619.html
-/sdcard/android/layout_tests/fast/events/updateLayoutForHitTest.html
-/sdcard/android/layout_tests/fast/events/label-focus.html
-/sdcard/android/layout_tests/fast/events/keydown-1.html
-/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/onload-re-entry.html
-/sdcard/android/layout_tests/fast/events/standalone-image-drag-to-editable.html
-/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/reveal-link-when-focused.html
-/sdcard/android/layout_tests/fast/events/mouseout-dead-node.html
-/sdcard/android/layout_tests/fast/html/keygen.html
-/sdcard/android/layout_tests/fast/html/marquee-scroll.html
-/sdcard/android/layout_tests/fast/html/link-rel-stylesheet.html
-/sdcard/android/layout_tests/fast/html/listing.html
-/sdcard/android/layout_tests/fast/images/svg-as-background.html
-/sdcard/android/layout_tests/fast/images/pdf-as-image-landscape.html
-/sdcard/android/layout_tests/fast/images/pdf-as-tiled-background.html
-/sdcard/android/layout_tests/fast/images/pdf-as-image.html
-/sdcard/android/layout_tests/fast/images/image-map-anchor-children.html
-/sdcard/android/layout_tests/fast/images/animated-gif-with-offsets.html
-/sdcard/android/layout_tests/fast/images/favicon-as-image.html
-/sdcard/android/layout_tests/fast/images/svg-width-100p-as-background.html
-/sdcard/android/layout_tests/fast/images/svg-as-tiled-background.html
-/sdcard/android/layout_tests/fast/images/svg-as-image.html
-/sdcard/android/layout_tests/fast/images/object-image.html
-/sdcard/android/layout_tests/fast/images/pdf-as-background.html
-/sdcard/android/layout_tests/fast/images/imagemap-case.html
-/sdcard/android/layout_tests/fast/images/svg-as-relative-image.html
-/sdcard/android/layout_tests/fast/images/embed-image.html
-/sdcard/android/layout_tests/fast/images/animated-svg-as-image.html
-/sdcard/android/layout_tests/fast/images/image-in-map.html
-/sdcard/android/layout_tests/fast/images/icon-decoding.html
-/sdcard/android/layout_tests/fast/inline-block/14498-positionForCoordinates.html
-/sdcard/android/layout_tests/fast/inline-block/001.html
-/sdcard/android/layout_tests/fast/inline-block/002.html
-/sdcard/android/layout_tests/fast/inline-block/003.html
-/sdcard/android/layout_tests/fast/inline-block/004.html
-/sdcard/android/layout_tests/fast/inline-block/005.html
-/sdcard/android/layout_tests/fast/inline-block/contenteditable-baseline.html
-/sdcard/android/layout_tests/fast/inline-block/006.html
-/sdcard/android/layout_tests/fast/inline-block/inline-block-vertical-align.html
-/sdcard/android/layout_tests/fast/inline-block/tricky-baseline.html
-/sdcard/android/layout_tests/fast/inline-block/overflow-clip.html
-/sdcard/android/layout_tests/fast/inspector/matchedrules.html
-/sdcard/android/layout_tests/fast/inspector/style.html
-/sdcard/android/layout_tests/fast/flexbox/010.html
-/sdcard/android/layout_tests/fast/flexbox/020.html
-/sdcard/android/layout_tests/fast/flexbox/002.html
-/sdcard/android/layout_tests/fast/flexbox/012.html
-/sdcard/android/layout_tests/fast/flexbox/022.html
-/sdcard/android/layout_tests/fast/flexbox/004.html
-/sdcard/android/layout_tests/fast/flexbox/014.html
-/sdcard/android/layout_tests/fast/flexbox/024.html
-/sdcard/android/layout_tests/fast/flexbox/006.html
-/sdcard/android/layout_tests/fast/flexbox/016.html
-/sdcard/android/layout_tests/fast/flexbox/026.html
-/sdcard/android/layout_tests/fast/flexbox/008.html
-/sdcard/android/layout_tests/fast/flexbox/018.html
-/sdcard/android/layout_tests/fast/flexbox/001.html
-/sdcard/android/layout_tests/fast/flexbox/011.html
-/sdcard/android/layout_tests/fast/flexbox/003.html
-/sdcard/android/layout_tests/fast/flexbox/021.html
-/sdcard/android/layout_tests/fast/flexbox/013.html
-/sdcard/android/layout_tests/fast/flexbox/005.html
-/sdcard/android/layout_tests/fast/flexbox/023.html
-/sdcard/android/layout_tests/fast/flexbox/015.html
-/sdcard/android/layout_tests/fast/flexbox/007.html
-/sdcard/android/layout_tests/fast/flexbox/025.html
-/sdcard/android/layout_tests/fast/flexbox/017.html
-/sdcard/android/layout_tests/fast/flexbox/009.html
-/sdcard/android/layout_tests/fast/flexbox/019.html
-/sdcard/android/layout_tests/fast/flexbox/flex-hang.html
-/sdcard/android/layout_tests/fast/tokenizer/missing-style-end-tag-1.html
-/sdcard/android/layout_tests/fast/tokenizer/002.html
-/sdcard/android/layout_tests/fast/tokenizer/missing-title-end-tag-2.html
-/sdcard/android/layout_tests/fast/tokenizer/script-after-frameset.html
-/sdcard/android/layout_tests/fast/tokenizer/missing-style-end-tag-2.html
-/sdcard/android/layout_tests/fast/tokenizer/external-script-document-write.html
-/sdcard/android/layout_tests/fast/tokenizer/script_extra_close.html
-/sdcard/android/layout_tests/fast/tokenizer/001.html
-/sdcard/android/layout_tests/fast/tokenizer/003.html
-/sdcard/android/layout_tests/fast/tokenizer/missing-title-end-tag-1.html
-/sdcard/android/layout_tests/fast/tokenizer/external-script-document-write_2.html
-/sdcard/android/layout_tests/fast/box-shadow/transform-fringing.html
-/sdcard/android/layout_tests/fast/box-shadow/spread.html
-/sdcard/android/layout_tests/fast/box-shadow/border-radius-big.html
-/sdcard/android/layout_tests/fast/box-shadow/inset.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/inline/continuation-outlines-with-layers.html
-/sdcard/android/layout_tests/fast/inline/inline-padding-disables-text-quirk.html
-/sdcard/android/layout_tests/fast/inline/emptyInlinesWithinLists.html
-/sdcard/android/layout_tests/fast/inline/drawStyledEmptyInlines.html
-/sdcard/android/layout_tests/fast/inline/long-wrapped-line.html
-/sdcard/android/layout_tests/fast/inline/inline-continuation-borders.html
-/sdcard/android/layout_tests/fast/inline/vertical-align-text-bottom.html
-/sdcard/android/layout_tests/fast/inline/25277-2.html
-/sdcard/android/layout_tests/fast/inline/25277.html
-/sdcard/android/layout_tests/fast/inline/drawStyledEmptyInlinesWithWS.html
-/sdcard/android/layout_tests/fast/inline/positionedLifetime.html
-/sdcard/android/layout_tests/fast/inline/dirtyLinesForInline.html
-/sdcard/android/layout_tests/fast/inline/001.html
-/sdcard/android/layout_tests/fast/inline/002.html
-/sdcard/android/layout_tests/fast/inline/inline-text-quirk-bpm.html
-/sdcard/android/layout_tests/fast/inline/inline-borders-with-bidi-override.html
-/sdcard/android/layout_tests/fast/inline/styledEmptyInlinesWithBRs.html
-/sdcard/android/layout_tests/fast/inline/continuation-outlines.html
-/sdcard/android/layout_tests/fast/inline/br-text-decoration.html
-/sdcard/android/layout_tests/fast/inline/outline-continuations.html
-/sdcard/android/layout_tests/fast/inline/percentage-margins.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
-/sdcard/android/layout_tests/fast/body-propagation/background-image/004.html
-/sdcard/android/layout_tests/fast/body-propagation/background-image/005.html
-/sdcard/android/layout_tests/fast/body-propagation/background-image/006.html
-/sdcard/android/layout_tests/fast/body-propagation/background-image/007.html
-/sdcard/android/layout_tests/fast/body-propagation/background-image/008.html
-/sdcard/android/layout_tests/fast/body-propagation/background-image/009.html
-/sdcard/android/layout_tests/fast/body-propagation/overflow/001.html
-/sdcard/android/layout_tests/fast/body-propagation/overflow/002.html
-/sdcard/android/layout_tests/fast/body-propagation/overflow/003.html
-/sdcard/android/layout_tests/fast/body-propagation/overflow/004.html
-/sdcard/android/layout_tests/fast/body-propagation/overflow/005.html
-/sdcard/android/layout_tests/fast/body-propagation/overflow/006.html
-/sdcard/android/layout_tests/fast/body-propagation/overflow/007.html
-/sdcard/android/layout_tests/fast/body-propagation/background-color/001.html
-/sdcard/android/layout_tests/fast/body-propagation/background-color/002.html
-/sdcard/android/layout_tests/fast/body-propagation/background-color/003.html
-/sdcard/android/layout_tests/fast/body-propagation/background-color/004.html
-/sdcard/android/layout_tests/fast/body-propagation/background-color/005.html
-/sdcard/android/layout_tests/fast/body-propagation/background-color/006.html
-/sdcard/android/layout_tests/fast/body-propagation/background-color/007.html
-/sdcard/android/layout_tests/fast/body-propagation/background-color/008.html
-/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/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/HTMLTableColElement/resize-table-using-col-width.html
-/sdcard/android/layout_tests/fast/dom/HTMLInputElement/input-image-alt-text.html
-/sdcard/android/layout_tests/fast/dom/Window/open-existing-pop-up-blocking.html
-/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
-/sdcard/android/layout_tests/fast/dom/Range/create-contextual-fragment.html
-/sdcard/android/layout_tests/fast/dom/HTMLHeadElement/textInHead1.html
-/sdcard/android/layout_tests/fast/dom/HTMLHeadElement/textInHead2.html
-/sdcard/android/layout_tests/fast/dom/HTMLHeadElement/textInHead3.html
-/sdcard/android/layout_tests/fast/dom/HTMLHeadElement/textInHead4.html
-/sdcard/android/layout_tests/fast/dom/HTMLHeadElement/textInHead5.html
-/sdcard/android/layout_tests/fast/dom/HTMLHeadElement/head-link-style-href-check.html
-/sdcard/android/layout_tests/fast/dom/HTMLTextAreaElement/reset-textarea.html
-/sdcard/android/layout_tests/fast/dom/HTMLImageElement/image-alt-text.html
-/sdcard/android/layout_tests/fast/dom/dom-parse-serialize.html
-/sdcard/android/layout_tests/fast/dom/focus-contenteditable.html
-/sdcard/android/layout_tests/fast/dom/jsDevicePixelRatio.html
-/sdcard/android/layout_tests/fast/dom/isindex-001.html
-/sdcard/android/layout_tests/fast/dom/css-cached-import-rule.html
-/sdcard/android/layout_tests/fast/dom/dom-parse-serialize-display.html
-/sdcard/android/layout_tests/fast/dom/css-rule-functions.html
-/sdcard/android/layout_tests/fast/dom/createDocumentType.html
-/sdcard/android/layout_tests/fast/dom/clientWidthAfterDocumentIsRemoved.html
-/sdcard/android/layout_tests/fast/dom/css-inline-style-important.html
-/sdcard/android/layout_tests/fast/dom/replaceChild.html
-/sdcard/android/layout_tests/fast/dom/anchor-text.html
-/sdcard/android/layout_tests/fast/dom/importNodeHTML.html
-/sdcard/android/layout_tests/fast/dom/gc-10.html
-/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/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
-/sdcard/android/layout_tests/fast/dom/children-nodes.html
-/sdcard/android/layout_tests/fast/dom/css-mediarule-deleteRule-update.html
-/sdcard/android/layout_tests/fast/dom/attr_dead_doc.html
-/sdcard/android/layout_tests/fast/dom/clone-contents-0-end-offset.html
-/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/css-insert-import-rule.html
-/sdcard/android/layout_tests/fast/dom/stripNullFromTextNodes.html
-/sdcard/android/layout_tests/fast/gradients/crash-on-zero-radius.html
-/sdcard/android/layout_tests/fast/gradients/generated-gradients.html
-/sdcard/android/layout_tests/fast/gradients/background-clipped.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
-/sdcard/android/layout_tests/fast/invalid/012.html
-/sdcard/android/layout_tests/fast/invalid/004.html
-/sdcard/android/layout_tests/fast/invalid/014.html
-/sdcard/android/layout_tests/fast/invalid/006.html
-/sdcard/android/layout_tests/fast/invalid/016.html
-/sdcard/android/layout_tests/fast/invalid/008.html
-/sdcard/android/layout_tests/fast/invalid/018.html
-/sdcard/android/layout_tests/fast/invalid/junk-data.xml
-/sdcard/android/layout_tests/fast/invalid/missing-dl-end-tag.html
-/sdcard/android/layout_tests/fast/invalid/td-inside-object.html
-/sdcard/android/layout_tests/fast/invalid/table-residual-style-crash.html
-/sdcard/android/layout_tests/fast/invalid/missing-font-end-tag.html
-/sdcard/android/layout_tests/fast/invalid/missing-dt-end-tag.html
-/sdcard/android/layout_tests/fast/invalid/020.xml
-/sdcard/android/layout_tests/fast/invalid/001.html
-/sdcard/android/layout_tests/fast/invalid/nestedh3s.html
-/sdcard/android/layout_tests/fast/invalid/011.html
-/sdcard/android/layout_tests/fast/invalid/003.html
-/sdcard/android/layout_tests/fast/invalid/021.html
-/sdcard/android/layout_tests/fast/invalid/013.html
-/sdcard/android/layout_tests/fast/invalid/005.html
-/sdcard/android/layout_tests/fast/invalid/015.html
-/sdcard/android/layout_tests/fast/invalid/007.html
-/sdcard/android/layout_tests/fast/invalid/residual-style.html
-/sdcard/android/layout_tests/fast/invalid/017.html
-/sdcard/android/layout_tests/fast/invalid/009.html
-/sdcard/android/layout_tests/fast/invalid/missing-address-end-tag.html
-/sdcard/android/layout_tests/fast/invalid/019.html
-/sdcard/android/layout_tests/fast/forms/input-width.html
-/sdcard/android/layout_tests/fast/forms/select-item-background-clip.html
-/sdcard/android/layout_tests/fast/forms/radio-nested-labels.html
-/sdcard/android/layout_tests/fast/forms/input-appearance-preventDefault.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/input-text-option-delete.html
-/sdcard/android/layout_tests/fast/forms/textfield-overflow.html
-/sdcard/android/layout_tests/fast/forms/search-zoomed.html
-/sdcard/android/layout_tests/fast/forms/HTMLOptionElement_label02.html
-/sdcard/android/layout_tests/fast/forms/input-appearance-visibility.html
-/sdcard/android/layout_tests/fast/forms/search-vertical-alignment.html
-/sdcard/android/layout_tests/fast/forms/file-input-direction.html
-/sdcard/android/layout_tests/fast/forms/select-change-listbox-size.html
-/sdcard/android/layout_tests/fast/forms/002.html
-/sdcard/android/layout_tests/fast/forms/textarea-align.html
-/sdcard/android/layout_tests/fast/forms/control-restrict-line-height.html
-/sdcard/android/layout_tests/fast/forms/basic-textareas.html
-/sdcard/android/layout_tests/fast/forms/button-generated-content.html
-/sdcard/android/layout_tests/fast/forms/input-text-paste-maxlength.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/listbox-clip.html
-/sdcard/android/layout_tests/fast/forms/textarea-setinnerhtml.html
-/sdcard/android/layout_tests/fast/forms/input-align.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/menulist-option-wrap.html
-/sdcard/android/layout_tests/fast/forms/select-empty-option-height.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/input-appearance-focus.html
-/sdcard/android/layout_tests/fast/forms/input-value.html
-/sdcard/android/layout_tests/fast/forms/select-selected.html
-/sdcard/android/layout_tests/fast/forms/control-clip-overflow.html
-/sdcard/android/layout_tests/fast/forms/input-appearance-default-bkcolor.html
-/sdcard/android/layout_tests/fast/forms/HTMLOptionElement_label03.html
-/sdcard/android/layout_tests/fast/forms/button-default-title.html
-/sdcard/android/layout_tests/fast/forms/hidden-listbox.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/003.html
-/sdcard/android/layout_tests/fast/forms/text-control-intrinsic-widths.html
-/sdcard/android/layout_tests/fast/forms/select-change-listbox-to-popup.html
-/sdcard/android/layout_tests/fast/forms/radio_checked_dynamic.html
-/sdcard/android/layout_tests/fast/forms/text-style-color.html
-/sdcard/android/layout_tests/fast/forms/button-sizes.html
-/sdcard/android/layout_tests/fast/forms/listbox-scrollbar-incremental-load.html
-/sdcard/android/layout_tests/fast/forms/password-placeholder.html
-/sdcard/android/layout_tests/fast/forms/button-style-color.html
-/sdcard/android/layout_tests/fast/forms/caret-rtl.html
-/sdcard/android/layout_tests/fast/forms/listbox-deselect-scroll.html
-/sdcard/android/layout_tests/fast/forms/select-initial-position.html
-/sdcard/android/layout_tests/fast/forms/placeholder-set-attribute.html
-/sdcard/android/layout_tests/fast/forms/radio-attr-order.html
-/sdcard/android/layout_tests/fast/forms/input-disabled-color.html
-/sdcard/android/layout_tests/fast/forms/fieldset-align.html
-/sdcard/android/layout_tests/fast/forms/select-baseline.html
-/sdcard/android/layout_tests/fast/forms/stuff-on-my-optgroup.html
-/sdcard/android/layout_tests/fast/forms/input-align-image.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/search-display-none-cancel-button.html
-/sdcard/android/layout_tests/fast/forms/HTMLOptionElement_label04.html
-/sdcard/android/layout_tests/fast/forms/input-appearance-disabled.html
-/sdcard/android/layout_tests/fast/forms/input-appearance-height.html
-/sdcard/android/layout_tests/fast/forms/004.html
-/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/input-type-text-min-width.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
-/sdcard/android/layout_tests/fast/forms/button-white-space.html
-/sdcard/android/layout_tests/fast/forms/slider-padding.html
-/sdcard/android/layout_tests/fast/forms/button-submit.html
-/sdcard/android/layout_tests/fast/forms/input-text-double-click.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/button-positioned.html
-/sdcard/android/layout_tests/fast/forms/control-clip.html
-/sdcard/android/layout_tests/fast/forms/listbox-hit-test-zoomed.html
-/sdcard/android/layout_tests/fast/forms/thumbslider-crash.html
-/sdcard/android/layout_tests/fast/forms/input-first-letter.html
-/sdcard/android/layout_tests/fast/forms/search-rtl.html
-/sdcard/android/layout_tests/fast/forms/isindex-placeholder.html
-/sdcard/android/layout_tests/fast/forms/plaintext-mode-2.html
-/sdcard/android/layout_tests/fast/forms/select-change-popup-to-listbox.html
-/sdcard/android/layout_tests/fast/forms/blankbuttons.html
-/sdcard/android/layout_tests/fast/forms/input-text-maxlength.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/005.html
-/sdcard/android/layout_tests/fast/forms/search-styled.html
-/sdcard/android/layout_tests/fast/forms/file-input-disabled.html
-/sdcard/android/layout_tests/fast/forms/select-disabled-appearance.html
-/sdcard/android/layout_tests/fast/forms/input-type-change2.html
-/sdcard/android/layout_tests/fast/forms/select-block-background.html
-/sdcard/android/layout_tests/fast/forms/select-dirty-parent-pref-widths.html
-/sdcard/android/layout_tests/fast/forms/range-thumb-height-percentage.html
-/sdcard/android/layout_tests/fast/forms/select-visual-hebrew.html
-/sdcard/android/layout_tests/fast/forms/textAreaLineHeight.html
-/sdcard/android/layout_tests/fast/forms/option-text-clip.html
-/sdcard/android/layout_tests/fast/forms/formmove.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/textarea-scroll-height.html
-/sdcard/android/layout_tests/fast/forms/button-table-styles.html
-/sdcard/android/layout_tests/fast/forms/box-shadow-override.html
-/sdcard/android/layout_tests/fast/forms/checkbox-radio-onchange.html
-/sdcard/android/layout_tests/fast/forms/searchfield-heights.html
-/sdcard/android/layout_tests/fast/forms/input-spaces.html
-/sdcard/android/layout_tests/fast/forms/textarea-scrollbar.html
-/sdcard/android/layout_tests/fast/forms/minWidthPercent.html
-/sdcard/android/layout_tests/fast/forms/HTMLOptionElement_label06.html
-/sdcard/android/layout_tests/fast/forms/placeholder-pseudo-style.html
-/sdcard/android/layout_tests/fast/forms/menulist-width-change.html
-/sdcard/android/layout_tests/fast/forms/input-text-drag-down.html
-/sdcard/android/layout_tests/fast/forms/option-strip-whitespace.html
-/sdcard/android/layout_tests/fast/forms/006.html
-/sdcard/android/layout_tests/fast/forms/input-no-renderer.html
-/sdcard/android/layout_tests/fast/forms/input-text-click-outside.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-align.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/slider-thumb-stylability.html
-/sdcard/android/layout_tests/fast/forms/input-readonly-dimmed.html
-/sdcard/android/layout_tests/fast/forms/input-appearance-width.html
-/sdcard/android/layout_tests/fast/forms/select-list-box-with-height.html
-/sdcard/android/layout_tests/fast/forms/textarea-rows-cols.html
-/sdcard/android/layout_tests/fast/forms/button-align.html
-/sdcard/android/layout_tests/fast/forms/input-appearance-readonly.html
-/sdcard/android/layout_tests/fast/forms/form-added-to-table.html
-/sdcard/android/layout_tests/fast/forms/menulist-no-overflow.html
-/sdcard/android/layout_tests/fast/forms/formmove2.html
-/sdcard/android/layout_tests/fast/forms/input-text-word-wrap.html
-/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/HTMLOptionElement_label07.html
-/sdcard/android/layout_tests/fast/forms/007.html
-/sdcard/android/layout_tests/fast/forms/indeterminate.html
-/sdcard/android/layout_tests/fast/forms/negativeLineHeight.html
-/sdcard/android/layout_tests/fast/forms/select-style.html
-/sdcard/android/layout_tests/fast/forms/select-size.html
-/sdcard/android/layout_tests/fast/forms/menulist-separator-painting.html
-/sdcard/android/layout_tests/fast/forms/HTMLOptionElement_label01.html
-/sdcard/android/layout_tests/fast/forms/fieldset-with-float.html
-/sdcard/android/layout_tests/fast/forms/floating-textfield-relayout.html
-/sdcard/android/layout_tests/fast/forms/button-inner-block-reuse.html
-/sdcard/android/layout_tests/fast/forms/001.html
-/sdcard/android/layout_tests/fast/forms/input-text-click-inside.html
-/sdcard/android/layout_tests/fast/forms/input-appearance-selection.html
-/sdcard/android/layout_tests/fast/forms/menulist-narrow-width.html
-/sdcard/android/layout_tests/fast/forms/linebox-overflow-in-textarea-padding.html
-/sdcard/android/layout_tests/fast/forms/menulist-restrict-line-height.html
-/sdcard/android/layout_tests/fast/forms/textarea-width.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/placeholder-set-value.html
-/sdcard/android/layout_tests/fast/forms/input-text-self-emptying-click.html
-/sdcard/android/layout_tests/fast/forms/input-appearance-bkcolor.html
-/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/form-in-malformed-markup.html
-/sdcard/android/layout_tests/fast/forms/menulist-style-color.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
-/sdcard/android/layout_tests/fast/clip/nestedTransparencyClip.html
-/sdcard/android/layout_tests/fast/clip/overflow-border-radius-clip.html
-/sdcard/android/layout_tests/fast/clip/outline-overflowClip.html
-/sdcard/android/layout_tests/fast/clip/001.html
-/sdcard/android/layout_tests/fast/clip/010.html
-/sdcard/android/layout_tests/fast/clip/002.html
-/sdcard/android/layout_tests/fast/clip/011.html
-/sdcard/android/layout_tests/fast/clip/003.html
-/sdcard/android/layout_tests/fast/clip/012.html
-/sdcard/android/layout_tests/fast/clip/004.html
-/sdcard/android/layout_tests/fast/clip/013.html
-/sdcard/android/layout_tests/fast/clip/005.html
-/sdcard/android/layout_tests/fast/clip/014.html
-/sdcard/android/layout_tests/fast/clip/006.html
-/sdcard/android/layout_tests/fast/clip/015.html
-/sdcard/android/layout_tests/fast/clip/016.html
-/sdcard/android/layout_tests/fast/clip/007.html
-/sdcard/android/layout_tests/fast/clip/008.html
-/sdcard/android/layout_tests/fast/clip/017.html
-/sdcard/android/layout_tests/fast/clip/009.html
-/sdcard/android/layout_tests/fast/table/border-collapsing/001.html
-/sdcard/android/layout_tests/fast/table/border-collapsing/002.html
-/sdcard/android/layout_tests/fast/table/border-collapsing/003.html
-/sdcard/android/layout_tests/fast/table/border-collapsing/004.html
-/sdcard/android/layout_tests/fast/table/border-collapsing/equal-precedence-resolution.html
-/sdcard/android/layout_tests/fast/table/border-collapsing/rtl-border-collapsing.html
-/sdcard/android/layout_tests/fast/table/border-collapsing/border-collapsing-head-foot.html
-/sdcard/android/layout_tests/fast/table/fixed-nested.html
-/sdcard/android/layout_tests/fast/table/frame-and-rules.html
-/sdcard/android/layout_tests/fast/table/empty-table-percent-height.html
-/sdcard/android/layout_tests/fast/table/100-percent-cell-width.html
-/sdcard/android/layout_tests/fast/table/stale-grid-crash.html
-/sdcard/android/layout_tests/fast/table/div-as-col-span.html
-/sdcard/android/layout_tests/fast/table/nobr.html
-/sdcard/android/layout_tests/fast/table/012.html
-/sdcard/android/layout_tests/fast/table/040.html
-/sdcard/android/layout_tests/fast/table/growCellForImageQuirk.html
-/sdcard/android/layout_tests/fast/table/024.html
-/sdcard/android/layout_tests/fast/table/cell-pref-width-invalidation.html
-/sdcard/android/layout_tests/fast/table/fixed-granular-cols.html
-/sdcard/android/layout_tests/fast/table/008.html
-/sdcard/android/layout_tests/fast/table/036.html
-/sdcard/android/layout_tests/fast/table/nested-percent-height-table.html
-/sdcard/android/layout_tests/fast/table/rules-attr-dynchange1.html
-/sdcard/android/layout_tests/fast/table/wide-column.html
-/sdcard/android/layout_tests/fast/table/fixed-with-auto-with-colspan.html
-/sdcard/android/layout_tests/fast/table/percent-heights.html
-/sdcard/android/layout_tests/fast/table/021.html
-/sdcard/android/layout_tests/fast/table/colspanMinWidth.html
-/sdcard/android/layout_tests/fast/table/005.html
-/sdcard/android/layout_tests/fast/table/033.html
-/sdcard/android/layout_tests/fast/table/floatingTablePaintBackground.html
-/sdcard/android/layout_tests/fast/table/017.html
-/sdcard/android/layout_tests/fast/table/029.html
-/sdcard/android/layout_tests/fast/table/cell-absolute-child.html
-/sdcard/android/layout_tests/fast/table/click-near-anonymous-table.html
-/sdcard/android/layout_tests/fast/table/auto-with-percent-height.html
-/sdcard/android/layout_tests/fast/table/insert-before-anonymous-ancestors.html
-/sdcard/android/layout_tests/fast/table/append-cells2.html
-/sdcard/android/layout_tests/fast/table/unused-percent-heights.html
-/sdcard/android/layout_tests/fast/table/max-width-integer-overflow.html
-/sdcard/android/layout_tests/fast/table/vertical-align-baseline-readjust.html
-/sdcard/android/layout_tests/fast/table/empty-row-crash.html
-/sdcard/android/layout_tests/fast/table/002.html
-/sdcard/android/layout_tests/fast/table/030.html
-/sdcard/android/layout_tests/fast/table/cell-width-auto.html
-/sdcard/android/layout_tests/fast/table/014.html
-/sdcard/android/layout_tests/fast/table/037.xml
-/sdcard/android/layout_tests/fast/table/large-width.html
-/sdcard/android/layout_tests/fast/table/026.html
-/sdcard/android/layout_tests/fast/table/unbreakable-images-quirk.html
-/sdcard/android/layout_tests/fast/table/038.html
-/sdcard/android/layout_tests/fast/table/dynamic-cellpadding.html
-/sdcard/android/layout_tests/fast/table/generated-caption.html
-/sdcard/android/layout_tests/fast/table/empty-cells.html
-/sdcard/android/layout_tests/fast/table/add-before-anonymous-child.html
-/sdcard/android/layout_tests/fast/table/011.html
-/sdcard/android/layout_tests/fast/table/table-display-types-strict.html
-/sdcard/android/layout_tests/fast/table/023.html
-/sdcard/android/layout_tests/fast/table/007.html
-/sdcard/android/layout_tests/fast/table/cellindex.html
-/sdcard/android/layout_tests/fast/table/035.html
-/sdcard/android/layout_tests/fast/table/colgroup-spanning-groups-rules.html
-/sdcard/android/layout_tests/fast/table/insert-row-before-form.html
-/sdcard/android/layout_tests/fast/table/rowspan-paint-order.html
-/sdcard/android/layout_tests/fast/table/rtl-cell-display-none-assert.html
-/sdcard/android/layout_tests/fast/table/insert-cell-before-form.html
-/sdcard/android/layout_tests/fast/table/replaced-percent-height.html
-/sdcard/android/layout_tests/fast/table/text-field-baseline.html
-/sdcard/android/layout_tests/fast/table/table-display-types.html
-/sdcard/android/layout_tests/fast/table/table-hspace-align-center.html
-/sdcard/android/layout_tests/fast/table/caption-relayout.html
-/sdcard/android/layout_tests/fast/table/020.html
-/sdcard/android/layout_tests/fast/table/fixed-table-non-cell-in-row.html
-/sdcard/android/layout_tests/fast/table/004.html
-/sdcard/android/layout_tests/fast/table/032.html
-/sdcard/android/layout_tests/fast/table/row-height-recalc.html
-/sdcard/android/layout_tests/fast/table/016.html
-/sdcard/android/layout_tests/fast/table/absolute-table-at-bottom.html
-/sdcard/android/layout_tests/fast/table/028.html
-/sdcard/android/layout_tests/fast/table/spanOverlapRepaint.html
-/sdcard/android/layout_tests/fast/table/invisible-cell-background.html
-/sdcard/android/layout_tests/fast/table/vertical-align-baseline.html
-/sdcard/android/layout_tests/fast/table/cell-coalescing.html
-/sdcard/android/layout_tests/fast/table/wide-colspan.html
-/sdcard/android/layout_tests/fast/table/rowindex.html
-/sdcard/android/layout_tests/fast/table/001.html
-/sdcard/android/layout_tests/fast/table/remove-td-display-none.html
-/sdcard/android/layout_tests/fast/table/013.html
-/sdcard/android/layout_tests/fast/table/041.html
-/sdcard/android/layout_tests/fast/table/colgroup-preceded-by-caption.html
-/sdcard/android/layout_tests/fast/table/025.html
-/sdcard/android/layout_tests/fast/table/giantCellspacing.html
-/sdcard/android/layout_tests/fast/table/009.html
-/sdcard/android/layout_tests/fast/table/edge-offsets.html
-/sdcard/android/layout_tests/fast/table/giantRowspan.html
-/sdcard/android/layout_tests/fast/table/inline-form-assert.html
-/sdcard/android/layout_tests/fast/table/overflowHidden.html
-/sdcard/android/layout_tests/fast/table/rules-attr-dynchange2.html
-/sdcard/android/layout_tests/fast/table/height-percent-test.html
-/sdcard/android/layout_tests/fast/table/multiple-percent-height-rows.html
-/sdcard/android/layout_tests/fast/table/giantRowspan2.html
-/sdcard/android/layout_tests/fast/table/010.html
-/sdcard/android/layout_tests/fast/table/tableInsideCaption.html
-/sdcard/android/layout_tests/fast/table/022.html
-/sdcard/android/layout_tests/fast/table/006.html
-/sdcard/android/layout_tests/fast/table/034.html
-/sdcard/android/layout_tests/fast/table/append-cells.html
-/sdcard/android/layout_tests/fast/table/018.html
-/sdcard/android/layout_tests/fast/table/percent-widths-stretch.html
-/sdcard/android/layout_tests/fast/table/prepend-in-anonymous-table.html
-/sdcard/android/layout_tests/fast/table/floating-th.html
-/sdcard/android/layout_tests/fast/table/empty-section-crash.html
-/sdcard/android/layout_tests/fast/table/form-with-table-style.html
-/sdcard/android/layout_tests/fast/table/003.html
-/sdcard/android/layout_tests/fast/table/031.html
-/sdcard/android/layout_tests/fast/table/015.html
-/sdcard/android/layout_tests/fast/table/027.html
-/sdcard/android/layout_tests/fast/table/039.html
-/sdcard/android/layout_tests/fast/css/counters/invalidate-cached-counter-node.html
-/sdcard/android/layout_tests/fast/css/counters/counter-text-security.html
-/sdcard/android/layout_tests/fast/css/counters/counter-text-transform.html
-/sdcard/android/layout_tests/fast/css/variables/multiple-term-test.html
-/sdcard/android/layout_tests/fast/css/variables/colors-test.html
-/sdcard/android/layout_tests/fast/css/variables/font-test.html
-/sdcard/android/layout_tests/fast/css/variables/multiple-blocks-test.html
-/sdcard/android/layout_tests/fast/css/variables/misplaced-variables-test.html
-/sdcard/android/layout_tests/fast/css/variables/invalid-variable-test.html
-/sdcard/android/layout_tests/fast/css/variables/misplaced-import-test.html
-/sdcard/android/layout_tests/fast/css/variables/import-test.html
-/sdcard/android/layout_tests/fast/css/variables/inline-style-test.html
-/sdcard/android/layout_tests/fast/css/variables/declaration-block-test.html
-/sdcard/android/layout_tests/fast/css/variables/margin-test.html
-/sdcard/android/layout_tests/fast/css/variables/set-variable-test.html
-/sdcard/android/layout_tests/fast/css/variables/override-test.html
-/sdcard/android/layout_tests/fast/css/variables/remove-variable-test.html
-/sdcard/android/layout_tests/fast/css/variables/variable-iteration-test.html
-/sdcard/android/layout_tests/fast/css/variables/image-test.html
-/sdcard/android/layout_tests/fast/css/variables/block-cycle-test.html
-/sdcard/android/layout_tests/fast/css/variables/shorthand-test.html
-/sdcard/android/layout_tests/fast/css/variables/print-test.html
-/sdcard/android/layout_tests/fast/css/namespaces/001.xml
-/sdcard/android/layout_tests/fast/css/namespaces/002.xml
-/sdcard/android/layout_tests/fast/css/namespaces/003.xml
-/sdcard/android/layout_tests/fast/css/namespaces/004.xml
-/sdcard/android/layout_tests/fast/css/namespaces/005.xml
-/sdcard/android/layout_tests/fast/css/namespaces/006.xml
-/sdcard/android/layout_tests/fast/css/namespaces/007.xml
-/sdcard/android/layout_tests/fast/css/font-face-in-media-rule.html
-/sdcard/android/layout_tests/fast/css/font-face-default-font.html
-/sdcard/android/layout_tests/fast/css/first-letter-float-after-float.html
-/sdcard/android/layout_tests/fast/css/invalidation-errors-2.html
-/sdcard/android/layout_tests/fast/css/line-height-negative.html
-/sdcard/android/layout_tests/fast/css/only-child-pseudo-class.html
-/sdcard/android/layout_tests/fast/css/008.html
-/sdcard/android/layout_tests/fast/css/first-of-type-pseudo-class.html
-/sdcard/android/layout_tests/fast/css/ZeroOpacityLayers2.html
-/sdcard/android/layout_tests/fast/css/target-fragment-match.html
-/sdcard/android/layout_tests/fast/css/attribute-selector-dynamic.xml
-/sdcard/android/layout_tests/fast/css/zoom-font-size.html
-/sdcard/android/layout_tests/fast/css/live-cssrules.html
-/sdcard/android/layout_tests/fast/css/005.html
-/sdcard/android/layout_tests/fast/css/first-letter-hover.html
-/sdcard/android/layout_tests/fast/css/clip-zooming.html
-/sdcard/android/layout_tests/fast/css/color-quirk.html
-/sdcard/android/layout_tests/fast/css/resize-corner-tracking-transformed.html
-/sdcard/android/layout_tests/fast/css/selector-set-attribute.html
-/sdcard/android/layout_tests/fast/css/attribute-selector-empty-value.html
-/sdcard/android/layout_tests/fast/css/line-height-overflow.html
-/sdcard/android/layout_tests/fast/css/002.html
-/sdcard/android/layout_tests/fast/css/empty-generated-content.html
-/sdcard/android/layout_tests/fast/css/border-radius-outline-offset.html
-/sdcard/android/layout_tests/fast/css/background-image-with-baseurl.html
-/sdcard/android/layout_tests/fast/css/hsla-color.html
-/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/pseudo-cache-stale.html
-/sdcard/android/layout_tests/fast/css/hover-subselector.html
-/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
-/sdcard/android/layout_tests/fast/css/list-outline.html
-/sdcard/android/layout_tests/fast/css/apple-prefix.html
-/sdcard/android/layout_tests/fast/css/line-height.html
-/sdcard/android/layout_tests/fast/css/first-letter-visibility.html
-/sdcard/android/layout_tests/fast/css/acid2.html
-/sdcard/android/layout_tests/fast/css/font_property_normal.html
-/sdcard/android/layout_tests/fast/css/css-imports.html
-/sdcard/android/layout_tests/fast/css/last-of-type-pseudo-class.html
-/sdcard/android/layout_tests/fast/css/last-child-pseudo-class.html
-/sdcard/android/layout_tests/fast/css/visibility-hit-test.html
-/sdcard/android/layout_tests/fast/css/absolute-poition-in-rtl-parent.html
-/sdcard/android/layout_tests/fast/css/content-dynamic.html
-/sdcard/android/layout_tests/fast/css/acid2-pixel.html
-/sdcard/android/layout_tests/fast/css/transition-color-unspecified.html
-/sdcard/android/layout_tests/fast/css/table-text-align-strict.html
-/sdcard/android/layout_tests/fast/css/transform-default-parameter.html
-/sdcard/android/layout_tests/fast/css/text-overflow-ellipsis-bidi.html
-/sdcard/android/layout_tests/fast/css/contentImage.html
-/sdcard/android/layout_tests/fast/css/value-list-out-of-bounds-crash.html
-/sdcard/android/layout_tests/fast/css/color-strict.html
-/sdcard/android/layout_tests/fast/css/ignore-text-zoom.html
-/sdcard/android/layout_tests/fast/css/max-height-none.html
-/sdcard/android/layout_tests/fast/css/invalidation-errors-3.html
-/sdcard/android/layout_tests/fast/css/empty-pseudo-class.html
-/sdcard/android/layout_tests/fast/css/begin-end-contain-selector-empty-value.html
-/sdcard/android/layout_tests/fast/css/find-next-layer.html
-/sdcard/android/layout_tests/fast/css/text-overflow-ellipsis.html
-/sdcard/android/layout_tests/fast/css/contentDiv.html
-/sdcard/android/layout_tests/fast/css/invalid-pseudo-classes.html
-/sdcard/android/layout_tests/fast/css/disabled-author-styles.html
-/sdcard/android/layout_tests/fast/css/text-security.html
-/sdcard/android/layout_tests/fast/css/font-weight-1.html
-/sdcard/android/layout_tests/fast/css/nested-floating-relative-position-percentages.html
-/sdcard/android/layout_tests/fast/css/margin-bottom-form-element-quirk.html
-/sdcard/android/layout_tests/fast/css/font-shorthand-weight-only.html
-/sdcard/android/layout_tests/fast/css/006.html
-/sdcard/android/layout_tests/fast/css/fieldset-display-row.html
-/sdcard/android/layout_tests/fast/css/border-height.html
-/sdcard/android/layout_tests/fast/css/css2-system-fonts.html
-/sdcard/android/layout_tests/fast/css/imageTileOpacity.html
-/sdcard/android/layout_tests/fast/css/font-face-remote.html
-/sdcard/android/layout_tests/fast/css/003.html
-/sdcard/android/layout_tests/fast/css/error-in-last-decl.html
-/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/positioned-overflow-scroll.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
-/sdcard/android/layout_tests/fast/css/xml-stylesheet-pi-not-in-prolog.xml
-/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/percent-top-value-with-relative-position.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
-/sdcard/android/layout_tests/fast/css/text-overflow-ellipsis-strict.html
-/sdcard/android/layout_tests/fast/css/font-face-unicode-range.html
-/sdcard/android/layout_tests/fast/css/layerZOrderCrash.html
-/sdcard/android/layout_tests/fast/css/compare-content-style.html
-/sdcard/android/layout_tests/fast/css/import-rule-regression-11590.html
-/sdcard/android/layout_tests/fast/css/last-child-style-sharing.html
-/sdcard/android/layout_tests/fast/css/css3-modsel-22.html
-/sdcard/android/layout_tests/fast/css/ex-after-font-variant.html
-/sdcard/android/layout_tests/fast/css/quirk-orphaned-units.html
-/sdcard/android/layout_tests/fast/css/outline-auto-location.html
-/sdcard/android/layout_tests/fast/css/margin-top-bottom-dynamic.html
-/sdcard/android/layout_tests/fast/css/font-face-descriptor-multiple-values.html
-/sdcard/android/layout_tests/fast/css/empty-body-test.html
-/sdcard/android/layout_tests/fast/css/007.html
-/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/rem-units-on-root.html
-/sdcard/android/layout_tests/fast/css/position-negative-top-margin.html
-/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
-/sdcard/android/layout_tests/fast/css/rtl-ordering.html
-/sdcard/android/layout_tests/fast/css/affected-by-hover-after-style-change.html
-/sdcard/android/layout_tests/fast/css/resize-corner-tracking.html
-/sdcard/android/layout_tests/fast/css/invalidation-errors.html
-/sdcard/android/layout_tests/fast/css/background-shorthand-invalid-url.html
-/sdcard/android/layout_tests/fast/css/MarqueeLayoutTest.html
-/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/rem-dynamic-scaling.html
-/sdcard/android/layout_tests/fast/css/inline-properties-important.html
-/sdcard/android/layout_tests/fast/css/dynamic-sibling-selector.html
-/sdcard/android/layout_tests/fast/css/table-text-align-quirk.html
-/sdcard/android/layout_tests/fast/css/nth-child-dynamic.html
-/sdcard/android/layout_tests/fast/css/outline-auto-empty-rects.html
-/sdcard/android/layout_tests/fast/css/font-face-multiple-faces.html
-/sdcard/android/layout_tests/fast/css/rgb-float.html
-/sdcard/android/layout_tests/fast/css/pendingStylesheetFontSize.html
-/sdcard/android/layout_tests/fast/css/contentDivWithChildren.html
-/sdcard/android/layout_tests/fast/css/universal-hover-quirk.html
-/sdcard/android/layout_tests/fast/css/css3-nth-child.html
-/sdcard/android/layout_tests/fast/css/style-parsed-outside-head.html
-/sdcard/android/layout_tests/fast/css/percentage-non-integer.html
-/sdcard/android/layout_tests/fast/css/nested-layers-with-hover.html
-/sdcard/android/layout_tests/fast/css/negative-nth-child.html
-/sdcard/android/layout_tests/fast/box-sizing/panels-one.html
-/sdcard/android/layout_tests/fast/box-sizing/percentage-height.html
-/sdcard/android/layout_tests/fast/box-sizing/box-sizing.html
-/sdcard/android/layout_tests/fast/box-sizing/panels-two.html
-/sdcard/android/layout_tests/fast/block/basic/minheight.html
-/sdcard/android/layout_tests/fast/block/basic/min-pref-width-nowrap-floats.html
-/sdcard/android/layout_tests/fast/block/basic/fieldset-stretch-to-legend.html
-/sdcard/android/layout_tests/fast/block/basic/white-space-pre-wraps.html
-/sdcard/android/layout_tests/fast/block/basic/adding-near-anonymous-block.html
-/sdcard/android/layout_tests/fast/block/basic/quirk-percent-height-grandchild.html
-/sdcard/android/layout_tests/fast/block/basic/001.html
-/sdcard/android/layout_tests/fast/block/basic/010.html
-/sdcard/android/layout_tests/fast/block/basic/quirk-height.html
-/sdcard/android/layout_tests/fast/block/basic/020.html
-/sdcard/android/layout_tests/fast/block/basic/002.html
-/sdcard/android/layout_tests/fast/block/basic/011.html
-/sdcard/android/layout_tests/fast/block/basic/text-indent-rtl.html
-/sdcard/android/layout_tests/fast/block/basic/021.html
-/sdcard/android/layout_tests/fast/block/basic/003.html
-/sdcard/android/layout_tests/fast/block/basic/012.html
-/sdcard/android/layout_tests/fast/block/basic/013.html
-/sdcard/android/layout_tests/fast/block/basic/004.html
-/sdcard/android/layout_tests/fast/block/basic/014.html
-/sdcard/android/layout_tests/fast/block/basic/005.html
-/sdcard/android/layout_tests/fast/block/basic/015.html
-/sdcard/android/layout_tests/fast/block/basic/006.html
-/sdcard/android/layout_tests/fast/block/basic/016.html
-/sdcard/android/layout_tests/fast/block/basic/007.html
-/sdcard/android/layout_tests/fast/block/basic/008.html
-/sdcard/android/layout_tests/fast/block/basic/009.html
-/sdcard/android/layout_tests/fast/block/basic/018.html
-/sdcard/android/layout_tests/fast/block/basic/019.html
-/sdcard/android/layout_tests/fast/block/positioning/auto/001.html
-/sdcard/android/layout_tests/fast/block/positioning/auto/002.html
-/sdcard/android/layout_tests/fast/block/positioning/auto/003.html
-/sdcard/android/layout_tests/fast/block/positioning/auto/004.html
-/sdcard/android/layout_tests/fast/block/positioning/auto/005.html
-/sdcard/android/layout_tests/fast/block/positioning/auto/006.html
-/sdcard/android/layout_tests/fast/block/positioning/auto/007.html
-/sdcard/android/layout_tests/fast/block/positioning/059.html
-/sdcard/android/layout_tests/fast/block/positioning/negative-rel-position.html
-/sdcard/android/layout_tests/fast/block/positioning/absolute-in-inline-short-rtl.html
-/sdcard/android/layout_tests/fast/block/positioning/absolute-in-inline-short-ltr.html
-/sdcard/android/layout_tests/fast/block/positioning/fixed-positioning-scrollbar-bug.html
-/sdcard/android/layout_tests/fast/block/positioning/relative-overflow-replaced-float.html
-/sdcard/android/layout_tests/fast/block/positioning/absolute-positioned-overconstrained.html
-/sdcard/android/layout_tests/fast/block/positioning/absolute-in-inline-rtl-2.html
-/sdcard/android/layout_tests/fast/block/positioning/absolute-in-inline-ltr-2.html
-/sdcard/android/layout_tests/fast/block/positioning/020.html
-/sdcard/android/layout_tests/fast/block/positioning/012.html
-/sdcard/android/layout_tests/fast/block/positioning/004.html
-/sdcard/android/layout_tests/fast/block/positioning/040.html
-/sdcard/android/layout_tests/fast/block/positioning/absolute-position-direction-strict.html
-/sdcard/android/layout_tests/fast/block/positioning/032.html
-/sdcard/android/layout_tests/fast/block/positioning/060.html
-/sdcard/android/layout_tests/fast/block/positioning/024.html
-/sdcard/android/layout_tests/fast/block/positioning/052.html
-/sdcard/android/layout_tests/fast/block/positioning/016.html
-/sdcard/android/layout_tests/fast/block/positioning/044.html
-/sdcard/android/layout_tests/fast/block/positioning/008.html
-/sdcard/android/layout_tests/fast/block/positioning/036.html
-/sdcard/android/layout_tests/fast/block/positioning/028.html
-/sdcard/android/layout_tests/fast/block/positioning/056.html
-/sdcard/android/layout_tests/fast/block/positioning/048.html
-/sdcard/android/layout_tests/fast/block/positioning/absolute-position-direction-quirk.html
-/sdcard/android/layout_tests/fast/block/positioning/replaced-inside-fixed-top-bottom.html
-/sdcard/android/layout_tests/fast/block/positioning/pref-width-change.html
-/sdcard/android/layout_tests/fast/block/positioning/absolute-in-inline-ltr-3.html
-/sdcard/android/layout_tests/fast/block/positioning/absolute-in-inline-ltr.html
-/sdcard/android/layout_tests/fast/block/positioning/absolute-in-inline-rtl-3.html
-/sdcard/android/layout_tests/fast/block/positioning/absolute-in-inline-rtl.html
-/sdcard/android/layout_tests/fast/block/positioning/001.html
-/sdcard/android/layout_tests/fast/block/positioning/021.html
-/sdcard/android/layout_tests/fast/block/positioning/013.html
-/sdcard/android/layout_tests/fast/block/positioning/relative-overflow-block.html
-/sdcard/android/layout_tests/fast/block/positioning/005.html
-/sdcard/android/layout_tests/fast/block/positioning/041.html
-/sdcard/android/layout_tests/fast/block/positioning/033.html
-/sdcard/android/layout_tests/fast/block/positioning/025.html
-/sdcard/android/layout_tests/fast/block/positioning/061.html
-/sdcard/android/layout_tests/fast/block/positioning/017.html
-/sdcard/android/layout_tests/fast/block/positioning/053.html
-/sdcard/android/layout_tests/fast/block/positioning/009.html
-/sdcard/android/layout_tests/fast/block/positioning/045.html
-/sdcard/android/layout_tests/fast/block/positioning/037.html
-/sdcard/android/layout_tests/fast/block/positioning/029.html
-/sdcard/android/layout_tests/fast/block/positioning/057.html
-/sdcard/android/layout_tests/fast/block/positioning/049.html
-/sdcard/android/layout_tests/fast/block/positioning/absolute-with-html-border-quirks.html
-/sdcard/android/layout_tests/fast/block/positioning/leftmargin-topmargin.html
-/sdcard/android/layout_tests/fast/block/positioning/absolute-length-of-neg-666666.html
-/sdcard/android/layout_tests/fast/block/positioning/complex-percentage-height.html
-/sdcard/android/layout_tests/fast/block/positioning/auto-height-with-top-and-bottom.html
-/sdcard/android/layout_tests/fast/block/positioning/010.html
-/sdcard/android/layout_tests/fast/block/positioning/002.html
-/sdcard/android/layout_tests/fast/block/positioning/030.html
-/sdcard/android/layout_tests/fast/block/positioning/relayout-on-position-change.html
-/sdcard/android/layout_tests/fast/block/positioning/022.html
-/sdcard/android/layout_tests/fast/block/positioning/padding-percent.html
-/sdcard/android/layout_tests/fast/block/positioning/014.html
-/sdcard/android/layout_tests/fast/block/positioning/050.html
-/sdcard/android/layout_tests/fast/block/positioning/042.html
-/sdcard/android/layout_tests/fast/block/positioning/006.html
-/sdcard/android/layout_tests/fast/block/positioning/034.html
-/sdcard/android/layout_tests/fast/block/positioning/offsetLeft-offsetTop-borders.html
-/sdcard/android/layout_tests/fast/block/positioning/062.html
-/sdcard/android/layout_tests/fast/block/positioning/026.html
-/sdcard/android/layout_tests/fast/block/positioning/054.html
-/sdcard/android/layout_tests/fast/block/positioning/018.html
-/sdcard/android/layout_tests/fast/block/positioning/046.html
-/sdcard/android/layout_tests/fast/block/positioning/abs-inside-inline-rel.html
-/sdcard/android/layout_tests/fast/block/positioning/038.html
-/sdcard/android/layout_tests/fast/block/positioning/absolute-with-html-border-strict.html
-/sdcard/android/layout_tests/fast/block/positioning/058.html
-/sdcard/android/layout_tests/fast/block/positioning/negative-right-pos.html
-/sdcard/android/layout_tests/fast/block/positioning/relative-overconstrained.html
-/sdcard/android/layout_tests/fast/block/positioning/child-of-absolute-with-auto-height.html
-/sdcard/android/layout_tests/fast/block/positioning/relative-overflow-replaced.html
-/sdcard/android/layout_tests/fast/block/positioning/height-change.html
-/sdcard/android/layout_tests/fast/block/positioning/window-height-change.html
-/sdcard/android/layout_tests/fast/block/positioning/011.html
-/sdcard/android/layout_tests/fast/block/positioning/003.html
-/sdcard/android/layout_tests/fast/block/positioning/move-with-auto-width.html
-/sdcard/android/layout_tests/fast/block/positioning/031.html
-/sdcard/android/layout_tests/fast/block/positioning/023.html
-/sdcard/android/layout_tests/fast/block/positioning/051.html
-/sdcard/android/layout_tests/fast/block/positioning/015.html
-/sdcard/android/layout_tests/fast/block/positioning/043.html
-/sdcard/android/layout_tests/fast/block/positioning/007.html
-/sdcard/android/layout_tests/fast/block/positioning/035.html
-/sdcard/android/layout_tests/fast/block/positioning/027.html
-/sdcard/android/layout_tests/fast/block/positioning/055.html
-/sdcard/android/layout_tests/fast/block/positioning/019.html
-/sdcard/android/layout_tests/fast/block/positioning/047.html
-/sdcard/android/layout_tests/fast/block/positioning/039.html
-/sdcard/android/layout_tests/fast/block/positioning/inline-block-relposition.html
-/sdcard/android/layout_tests/fast/block/float/vertical-move-relayout.html
-/sdcard/android/layout_tests/fast/block/float/overlapping-floats-with-overflow-hidden.html
-/sdcard/android/layout_tests/fast/block/float/tableshifting.html
-/sdcard/android/layout_tests/fast/block/float/table-relayout.html
-/sdcard/android/layout_tests/fast/block/float/nested-clearance.html
-/sdcard/android/layout_tests/fast/block/float/br-with-clear-2.html
-/sdcard/android/layout_tests/fast/block/float/020.html
-/sdcard/android/layout_tests/fast/block/float/012.html
-/sdcard/android/layout_tests/fast/block/float/004.html
-/sdcard/android/layout_tests/fast/block/float/032.html
-/sdcard/android/layout_tests/fast/block/float/024.html
-/sdcard/android/layout_tests/fast/block/float/016.html
-/sdcard/android/layout_tests/fast/block/float/008.html
-/sdcard/android/layout_tests/fast/block/float/028.html
-/sdcard/android/layout_tests/fast/block/float/shrink-to-fit-width.html
-/sdcard/android/layout_tests/fast/block/float/clamped-right-float.html
-/sdcard/android/layout_tests/fast/block/float/independent-align-positioning.html
-/sdcard/android/layout_tests/fast/block/float/float-on-zero-height-line.html
-/sdcard/android/layout_tests/fast/block/float/nowrap-clear-min-width.html
-/sdcard/android/layout_tests/fast/block/float/overhanging-after-height-decrease-offsets.html
-/sdcard/android/layout_tests/fast/block/float/001.html
-/sdcard/android/layout_tests/fast/block/float/021.html
-/sdcard/android/layout_tests/fast/block/float/013.html
-/sdcard/android/layout_tests/fast/block/float/nopaint-after-layer-destruction2.html
-/sdcard/android/layout_tests/fast/block/float/005.html
-/sdcard/android/layout_tests/fast/block/float/033.html
-/sdcard/android/layout_tests/fast/block/float/025.html
-/sdcard/android/layout_tests/fast/block/float/017.html
-/sdcard/android/layout_tests/fast/block/float/009.html
-/sdcard/android/layout_tests/fast/block/float/float-in-float-hit-testing.html
-/sdcard/android/layout_tests/fast/block/float/029.html
-/sdcard/android/layout_tests/fast/block/float/4145535Crash.html
-/sdcard/android/layout_tests/fast/block/float/editable-text-overlapping-float.html
-/sdcard/android/layout_tests/fast/block/float/nestedAnonymousBlocks.html
-/sdcard/android/layout_tests/fast/block/float/intruding-painted-twice.html
-/sdcard/android/layout_tests/fast/block/float/010.html
-/sdcard/android/layout_tests/fast/block/float/002.html
-/sdcard/android/layout_tests/fast/block/float/dynamic-unfloat-pref-width.html
-/sdcard/android/layout_tests/fast/block/float/marquee-shrink-to-avoid-floats.html
-/sdcard/android/layout_tests/fast/block/float/030.html
-/sdcard/android/layout_tests/fast/block/float/022.html
-/sdcard/android/layout_tests/fast/block/float/014.html
-/sdcard/android/layout_tests/fast/block/float/006.html
-/sdcard/android/layout_tests/fast/block/float/relative-painted-twice.html
-/sdcard/android/layout_tests/fast/block/float/034.html
-/sdcard/android/layout_tests/fast/block/float/026.html
-/sdcard/android/layout_tests/fast/block/float/018.html
-/sdcard/android/layout_tests/fast/block/float/width-update-after-clear.html
-/sdcard/android/layout_tests/fast/block/float/nopaint-after-layer-destruction.html
-/sdcard/android/layout_tests/fast/block/float/float-in-float-painting.html
-/sdcard/android/layout_tests/fast/block/float/overhanging-after-height-decrease.html
-/sdcard/android/layout_tests/fast/block/float/float-avoidance.html
-/sdcard/android/layout_tests/fast/block/float/narrow-after-wide.html
-/sdcard/android/layout_tests/fast/block/float/multiple-float-positioning.html
-/sdcard/android/layout_tests/fast/block/float/br-with-clear.html
-/sdcard/android/layout_tests/fast/block/float/011.html
-/sdcard/android/layout_tests/fast/block/float/negative-margin-clear.html
-/sdcard/android/layout_tests/fast/block/float/003.html
-/sdcard/android/layout_tests/fast/block/float/031.html
-/sdcard/android/layout_tests/fast/block/float/023.html
-/sdcard/android/layout_tests/fast/block/float/015.html
-/sdcard/android/layout_tests/fast/block/float/007.html
-/sdcard/android/layout_tests/fast/block/float/035.html
-/sdcard/android/layout_tests/fast/block/float/027.html
-/sdcard/android/layout_tests/fast/block/float/019.html
-/sdcard/android/layout_tests/fast/block/float/nestedAnonymousBlocks2.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/059.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/empty-clear-blocks.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/010.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/negative-margins.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/002.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/020.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/101.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/030.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/012.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/040.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/022.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/004.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/103.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/032.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/006.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/042.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/016.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/034.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/062.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/044.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/026.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/018.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/028.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/056.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/038.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/058.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/100.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/001.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/011.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/102.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/021.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/003.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/031.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/005.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/041.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/104.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/033.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/015.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/025.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/043.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/035.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/017.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/027.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/045.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/063.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/037.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/019.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/055.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/029.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/039.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/057.html
-/sdcard/android/layout_tests/fast/runin/generated.html
-/sdcard/android/layout_tests/fast/runin/001.html
-/sdcard/android/layout_tests/fast/runin/002.html
-/sdcard/android/layout_tests/fast/parser/comments.html
-/sdcard/android/layout_tests/fast/parser/title-error-test.html
-/sdcard/android/layout_tests/fast/parser/entity-comment-in-textarea.html
-/sdcard/android/layout_tests/fast/parser/parseCommentsInTitles.html
-/sdcard/android/layout_tests/fast/parser/open-comment-in-style.html
-/sdcard/android/layout_tests/fast/parser/document-write-option.html
-/sdcard/android/layout_tests/fast/parser/comment-in-textarea.html
-/sdcard/android/layout_tests/fast/parser/fonts.html
-/sdcard/android/layout_tests/fast/parser/comment-in-style.html
-/sdcard/android/layout_tests/fast/parser/comment-in-script.html
-/sdcard/android/layout_tests/fast/parser/broken-comments-vs-parsing-mode.html
-/sdcard/android/layout_tests/fast/parser/entity-comment-in-style.html
-/sdcard/android/layout_tests/fast/parser/xhtml-alternate-entities.xml
-/sdcard/android/layout_tests/fast/parser/nofoo-tags-inside-paragraph.html
-/sdcard/android/layout_tests/fast/parser/bad-xml-slash.html
-/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/remove-block-in-residual-style.html
-/sdcard/android/layout_tests/fast/parser/style-script-head-test.html
-/sdcard/android/layout_tests/fast/layers/zindex-ridonkulous.html
-/sdcard/android/layout_tests/fast/layers/self-painting-outline.html
-/sdcard/android/layout_tests/fast/layers/positioned-inside-root-with-margins.html
-/sdcard/android/layout_tests/fast/layers/video-layer.html
-/sdcard/android/layout_tests/fast/layers/inline-dirty-z-order-lists.html
-/sdcard/android/layout_tests/fast/layers/layer-visibility-sublayer.html
-/sdcard/android/layout_tests/fast/layers/opacity-outline.html
-/sdcard/android/layout_tests/fast/layers/add-layer-with-nested-stacking.html
-/sdcard/android/layout_tests/fast/layers/layer-content-visibility-change.html
-/sdcard/android/layout_tests/fast/layers/normal-flow-hit-test.html
-/sdcard/android/layout_tests/fast/layers/remove-layer-with-nested-stacking.html
-/sdcard/android/layout_tests/fast/layers/layer-visibility.html
-/sdcard/android/layout_tests/fast/layers/zindex-inherit.html
-/sdcard/android/layout_tests/fast/layers/overflow-scroll-auto-switch.html
-/sdcard/android/layout_tests/fast/layers/opacity-transforms.html
-/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/layers/remove-only-this-layer-update.html
-/sdcard/android/layout_tests/fast/history/clicked-link-is-visited.html
-/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
-/sdcard/android/layout_tests/fast/backgrounds/repeat/noRepeatCorrectClip.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize20.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize02.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize11.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize21.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize03.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize12.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize22.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize04.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize13.html
-/sdcard/android/layout_tests/fast/backgrounds/size/zero.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize05.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize14.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize06.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize15.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize07.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize16.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize08.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize17.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize09.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize18.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize19.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize10.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize01.html
-/sdcard/android/layout_tests/fast/backgrounds/svg-as-background-2.html
-/sdcard/android/layout_tests/fast/backgrounds/background-origin-root-element.html
-/sdcard/android/layout_tests/fast/backgrounds/svg-as-background-3.html
-/sdcard/android/layout_tests/fast/backgrounds/svg-as-background-4.html
-/sdcard/android/layout_tests/fast/backgrounds/svg-as-background-5.html
-/sdcard/android/layout_tests/fast/backgrounds/background-position-1.html
-/sdcard/android/layout_tests/fast/backgrounds/svg-as-background-6.html
-/sdcard/android/layout_tests/fast/backgrounds/opacity-on-document-element.html
-/sdcard/android/layout_tests/fast/backgrounds/background-clip-text.html
-/sdcard/android/layout_tests/fast/backgrounds/svg-as-mask.html
-/sdcard/android/layout_tests/fast/backgrounds/solid-color-context-restore.html
-/sdcard/android/layout_tests/fast/backgrounds/mask-composite.html
-/sdcard/android/layout_tests/fast/backgrounds/animated-svg-as-background.html
-/sdcard/android/layout_tests/fast/backgrounds/body-generated-image-propagated-to-root.html
-/sdcard/android/layout_tests/fast/backgrounds/001.html
-/sdcard/android/layout_tests/fast/backgrounds/animated-gif-as-background.html
-/sdcard/android/layout_tests/fast/backgrounds/background-position-rounding.html
-/sdcard/android/layout_tests/fast/backgrounds/bgCompositeCopy.html
-/sdcard/android/layout_tests/fast/backgrounds/background-inherit-color-bug.html
-/sdcard/android/layout_tests/fast/backgrounds/animated-svg-as-mask.html
-/sdcard/android/layout_tests/fast/backgrounds/svg-as-background-1.html
-/sdcard/android/layout_tests/fast/repaint/reflection-redraw.html
-/sdcard/android/layout_tests/fast/repaint/layer-full-repaint.html
-/sdcard/android/layout_tests/fast/repaint/subtree-root-clip.html
-/sdcard/android/layout_tests/fast/repaint/subtree-root-clip-3.html
-/sdcard/android/layout_tests/fast/repaint/layer-outline-horizontal.html
-/sdcard/android/layout_tests/fast/repaint/transform-layout-repaint.html
-/sdcard/android/layout_tests/fast/repaint/float-new-in-block.html
-/sdcard/android/layout_tests/fast/repaint/list-marker-2.html
-/sdcard/android/layout_tests/fast/repaint/layer-hide-when-needs-layout.html
-/sdcard/android/layout_tests/fast/repaint/layer-outline.html
-/sdcard/android/layout_tests/fast/repaint/table-section-overflow.html
-/sdcard/android/layout_tests/fast/repaint/body-background-image.html
-/sdcard/android/layout_tests/fast/repaint/shadow-multiple-strict-vertical.html
-/sdcard/android/layout_tests/fast/repaint/inline-outline-repaint.html
-/sdcard/android/layout_tests/fast/repaint/line-flow-with-floats-4.html
-/sdcard/android/layout_tests/fast/repaint/change-transform.html
-/sdcard/android/layout_tests/fast/repaint/fixed.html
-/sdcard/android/layout_tests/fast/repaint/line-flow-with-floats-8.html
-/sdcard/android/layout_tests/fast/repaint/erase-overflow.html
-/sdcard/android/layout_tests/fast/repaint/outline-child-repaint.html
-/sdcard/android/layout_tests/fast/repaint/float-overflow.html
-/sdcard/android/layout_tests/fast/repaint/containing-block-position-change.html
-/sdcard/android/layout_tests/fast/repaint/text-selection-rect-in-overflow.html
-/sdcard/android/layout_tests/fast/repaint/flexible-box-overflow-horizontal.html
-/sdcard/android/layout_tests/fast/repaint/table-cell-move.html
-/sdcard/android/layout_tests/fast/repaint/transform-absolute-child.html
-/sdcard/android/layout_tests/fast/repaint/line-flow-with-floats-10.html
-/sdcard/android/layout_tests/fast/repaint/opacity-change-on-overflow-float.html
-/sdcard/android/layout_tests/fast/repaint/float-move-during-layout.html
-/sdcard/android/layout_tests/fast/repaint/overflow-clip-subtree-layout.html
-/sdcard/android/layout_tests/fast/repaint/invisible-objects.html
-/sdcard/android/layout_tests/fast/repaint/shadow-multiple-strict-horizontal.html
-/sdcard/android/layout_tests/fast/repaint/focus-layers.html
-/sdcard/android/layout_tests/fast/repaint/inline-color-change.html
-/sdcard/android/layout_tests/fast/repaint/table-col-background.html
-/sdcard/android/layout_tests/fast/repaint/selection-after-remove.html
-/sdcard/android/layout_tests/fast/repaint/dynamic-table-vertical-alignment-change.html
-/sdcard/android/layout_tests/fast/repaint/flexible-box-overflow.html
-/sdcard/android/layout_tests/fast/repaint/table-two-pass-layout-overpaint.html
-/sdcard/android/layout_tests/fast/repaint/overflow-into-content.html
-/sdcard/android/layout_tests/fast/repaint/shadow-multiple-vertical.html
-/sdcard/android/layout_tests/fast/repaint/border-repaint-glitch.html
-/sdcard/android/layout_tests/fast/repaint/continuation-after-outline.html
-/sdcard/android/layout_tests/fast/repaint/intermediate-layout-position.html
-/sdcard/android/layout_tests/fast/repaint/table-section-repaint.html
-/sdcard/android/layout_tests/fast/repaint/clipped-relative.html
-/sdcard/android/layout_tests/fast/repaint/line-flow-with-floats-1.html
-/sdcard/android/layout_tests/fast/repaint/backgroundSizeRepaint.html
-/sdcard/android/layout_tests/fast/repaint/box-shadow-dynamic.html
-/sdcard/android/layout_tests/fast/repaint/line-flow-with-floats-5.html
-/sdcard/android/layout_tests/fast/repaint/text-shadow-horizontal.html
-/sdcard/android/layout_tests/fast/repaint/caret-outside-block.html
-/sdcard/android/layout_tests/fast/repaint/renderer-destruction-by-invalidateSelection-crash.html
-/sdcard/android/layout_tests/fast/repaint/line-flow-with-floats-9.html
-/sdcard/android/layout_tests/fast/repaint/float-in-new-block-with-layout-delta.html
-/sdcard/android/layout_tests/fast/repaint/transform-repaint-descendants.html
-/sdcard/android/layout_tests/fast/repaint/layout-state-relative.html
-/sdcard/android/layout_tests/fast/repaint/shadow-multiple-horizontal.html
-/sdcard/android/layout_tests/fast/repaint/border-fit-lines.html
-/sdcard/android/layout_tests/fast/repaint/repaint-resized-overflow.html
-/sdcard/android/layout_tests/fast/repaint/bugzilla-3509.html
-/sdcard/android/layout_tests/fast/repaint/inline-block-overflow.html
-/sdcard/android/layout_tests/fast/repaint/search-field-cancel.html
-/sdcard/android/layout_tests/fast/repaint/background-generated.html
-/sdcard/android/layout_tests/fast/repaint/bugzilla-6278.html
-/sdcard/android/layout_tests/fast/repaint/button-spurious-layout-hint.html
-/sdcard/android/layout_tests/fast/repaint/box-shadow-v.html
-/sdcard/android/layout_tests/fast/repaint/float-overflow-right.html
-/sdcard/android/layout_tests/fast/repaint/delete-into-nested-block.html
-/sdcard/android/layout_tests/fast/repaint/table-cell-collapsed-border.html
-/sdcard/android/layout_tests/fast/repaint/selection-after-delete.html
-/sdcard/android/layout_tests/fast/repaint/layout-state-only-positioned.html
-/sdcard/android/layout_tests/fast/repaint/lines-with-layout-delta.html
-/sdcard/android/layout_tests/fast/repaint/table-extra-bottom-grow.html
-/sdcard/android/layout_tests/fast/repaint/transform-relative-position.html
-/sdcard/android/layout_tests/fast/repaint/selection-gap-overflow-scroll.html
-/sdcard/android/layout_tests/fast/repaint/subtree-root-skipped.html
-/sdcard/android/layout_tests/fast/repaint/line-overflow.html
-/sdcard/android/layout_tests/fast/repaint/background-misaligned.html
-/sdcard/android/layout_tests/fast/repaint/line-flow-with-floats-2.html
-/sdcard/android/layout_tests/fast/repaint/text-append-dirty-lines.html
-/sdcard/android/layout_tests/fast/repaint/table-row.html
-/sdcard/android/layout_tests/fast/repaint/line-flow-with-floats-6.html
-/sdcard/android/layout_tests/fast/repaint/table-outer-border.html
-/sdcard/android/layout_tests/fast/repaint/transform-replaced-shadows.html
-/sdcard/android/layout_tests/fast/repaint/overflow-scroll-delete.html
-/sdcard/android/layout_tests/fast/repaint/layer-visibility.html
-/sdcard/android/layout_tests/fast/repaint/border-radius-repaint.html
-/sdcard/android/layout_tests/fast/repaint/table-collapsed-border.html
-/sdcard/android/layout_tests/fast/repaint/transform-translate.html
-/sdcard/android/layout_tests/fast/repaint/bugzilla-7235.html
-/sdcard/android/layout_tests/fast/repaint/reflection-repaint-test.html
-/sdcard/android/layout_tests/fast/repaint/4776765.html
-/sdcard/android/layout_tests/fast/repaint/selection-clear.html
-/sdcard/android/layout_tests/fast/repaint/bugzilla-6473.html
-/sdcard/android/layout_tests/fast/repaint/intermediate-layout-position-clip.html
-/sdcard/android/layout_tests/fast/repaint/focus-ring.html
-/sdcard/android/layout_tests/fast/repaint/table-cell-vertical-overflow.html
-/sdcard/android/layout_tests/fast/repaint/create-layer-repaint.html
-/sdcard/android/layout_tests/fast/repaint/subtree-root-clip-2.html
-/sdcard/android/layout_tests/fast/repaint/bugzilla-6388.html
-/sdcard/android/layout_tests/fast/repaint/overflow-outline-repaint.html
-/sdcard/android/layout_tests/fast/repaint/content-into-overflow.html
-/sdcard/android/layout_tests/fast/repaint/static-to-positioned.html
-/sdcard/android/layout_tests/fast/repaint/bugzilla-5699.html
-/sdcard/android/layout_tests/fast/repaint/transform-absolute-in-positioned-container.html
-/sdcard/android/layout_tests/fast/repaint/outline-repaint-glitch.html
-/sdcard/android/layout_tests/fast/repaint/overflow-delete-line.html
-/sdcard/android/layout_tests/fast/repaint/transform-disable-layoutstate.html
-/sdcard/android/layout_tests/fast/repaint/list-marker.html
-/sdcard/android/layout_tests/fast/repaint/line-flow-with-floats-3.html
-/sdcard/android/layout_tests/fast/repaint/line-flow-with-floats-7.html
-/sdcard/android/layout_tests/fast/repaint/outline-inset.html
-/sdcard/android/layout_tests/fast/repaint/box-shadow-h.html
-/sdcard/android/layout_tests/fast/repaint/4774354.html
-/sdcard/android/layout_tests/fast/repaint/clip-with-layout-delta.html
-/sdcard/android/layout_tests/fast/repaint/control-clip.html
-/sdcard/android/layout_tests/fast/repaint/selected-replaced.html
-/sdcard/android/layout_tests/fast/repaint/text-selection-rect-in-overflow-2.html
-/sdcard/android/layout_tests/fast/repaint/make-children-non-inline.html
-/sdcard/android/layout_tests/fast/repaint/text-shadow.html
-/sdcard/android/layout_tests/fast/repaint/outline-shrinking.html
-/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/image-pattern-rotate.html
-/sdcard/android/layout_tests/fast/canvas/shadow-offset-4.html
-/sdcard/android/layout_tests/fast/canvas/drawImage-with-globalAlpha.html
-/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/zero-size-fill-rect.html
-/sdcard/android/layout_tests/fast/canvas/shadow-offset-6.html
-/sdcard/android/layout_tests/fast/canvas/patternfill-repeat.html
-/sdcard/android/layout_tests/fast/canvas/image-object-in-canvas.html
-/sdcard/android/layout_tests/fast/canvas/shadow-offset-3.html
-/sdcard/android/layout_tests/fast/canvas/canvas-composite.html
-/sdcard/android/layout_tests/fast/canvas/quadraticCurveTo.xml
-/sdcard/android/layout_tests/fast/canvas/gradient-add-second-start-end-stop.html
-/sdcard/android/layout_tests/fast/canvas/fill-stroke-clip-reset-path.html
-/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/canvas-bg-zoom.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/shadow-offset-5.html
-/sdcard/android/layout_tests/fast/canvas/fillrect_gradient.html
-/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
-/sdcard/android/layout_tests/fast/frames/content-opacity-2.html
-/sdcard/android/layout_tests/fast/frames/frame-src-attribute.html
-/sdcard/android/layout_tests/fast/frames/frameElement-frame.html
-/sdcard/android/layout_tests/fast/frames/empty-cols-attribute.html
-/sdcard/android/layout_tests/fast/frames/iframe-scrolling-attribute.html
-/sdcard/android/layout_tests/fast/frames/inline-object-inside-frameset.html
-/sdcard/android/layout_tests/fast/frames/valid.html
-/sdcard/android/layout_tests/fast/frames/no-frame-borders.html
-/sdcard/android/layout_tests/fast/frames/empty-frame-src.html
-/sdcard/android/layout_tests/fast/frames/calculate-round.html
-/sdcard/android/layout_tests/fast/frames/frame-navigation.html
-/sdcard/android/layout_tests/fast/frames/001.html
-/sdcard/android/layout_tests/fast/frames/viewsource-on-image-file.html
-/sdcard/android/layout_tests/fast/frames/invalid.html
-/sdcard/android/layout_tests/fast/frames/frameset-style-recalc.html
-/sdcard/android/layout_tests/fast/frames/viewsource-attribute.html
-/sdcard/android/layout_tests/fast/frames/002.html
-/sdcard/android/layout_tests/fast/frames/calculate-relative.html
-/sdcard/android/layout_tests/fast/frames/calculate-order.html
-/sdcard/android/layout_tests/fast/frames/calculate-percentage.html
-/sdcard/android/layout_tests/fast/frames/content-opacity-1.html
-/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/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/reflections/inline-crash.html
-/sdcard/android/layout_tests/fast/reflections/reflection-masks-opacity.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/fonts/cursive.html
-/sdcard/android/layout_tests/fonts/default.html
-/sdcard/android/layout_tests/fonts/monospace.html
-/sdcard/android/layout_tests/fonts/fantasy.html
-/sdcard/android/layout_tests/fonts/serif.html
-/sdcard/android/layout_tests/fonts/sans-serif.html
-/sdcard/android/layout_tests/http/tests/webarchive/test-css-url-encoding-shift-jis.html
-/sdcard/android/layout_tests/http/tests/webarchive/test-css-url-encoding.html
-/sdcard/android/layout_tests/http/tests/webarchive/test-css-url-encoding-utf-8.html
-/sdcard/android/layout_tests/http/tests/webarchive/test-preload-resources.html
-/sdcard/android/layout_tests/http/tests/multipart/invalid-image-data.html
-/sdcard/android/layout_tests/http/tests/multipart/invalid-image-data-standalone.html
-/sdcard/android/layout_tests/http/tests/local/file-url-sent-as-referer.html
-/sdcard/android/layout_tests/http/tests/misc/location-replace-crossdomain.html
-/sdcard/android/layout_tests/http/tests/misc/acid2.html
-/sdcard/android/layout_tests/http/tests/misc/acid2-pixel.html
-/sdcard/android/layout_tests/http/tests/misc/favicon-as-image.html
-/sdcard/android/layout_tests/http/tests/misc/generated-content-inside-table.html
-/sdcard/android/layout_tests/http/tests/misc/willCacheResponse-delegate-callback.html
-/sdcard/android/layout_tests/http/tests/misc/iframe404.html
-/sdcard/android/layout_tests/http/tests/misc/frame-access-during-load.html
-/sdcard/android/layout_tests/http/tests/navigation/postredirect-goback1.html
-/sdcard/android/layout_tests/http/tests/navigation/error404-subframeload.html
-/sdcard/android/layout_tests/http/tests/navigation/error404-basic.html
-/sdcard/android/layout_tests/http/tests/navigation/anchor-frames.html
-/sdcard/android/layout_tests/http/tests/navigation/postredirect-basic.html
-/sdcard/android/layout_tests/http/tests/navigation/post-goback1.html
-/sdcard/android/layout_tests/http/tests/navigation/post-basic.html
-/sdcard/android/layout_tests/http/tests/navigation/post-frames.html
-/sdcard/android/layout_tests/http/tests/navigation/error404-goback.html
-/sdcard/android/layout_tests/http/tests/navigation/javascriptlink-frames.html
-/sdcard/android/layout_tests/http/tests/navigation/postredirect-frames.html
-/sdcard/android/layout_tests/http/tests/navigation/error404-frames.html
-/sdcard/android/layout_tests/http/tests/loading/simple-subframe.html
-/sdcard/android/layout_tests/media/video-display-toggle.html
-/sdcard/android/layout_tests/media/video-transformed.html
-/sdcard/android/layout_tests/media/video-empty-source.html
-/sdcard/android/layout_tests/media/controls-strict.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/audio-no-installed-engines.html
-/sdcard/android/layout_tests/media/video-zoom.html
-/sdcard/android/layout_tests/media/video-zoom-controls.html
-/sdcard/android/layout_tests/media/video-controls-rendering.html
-/sdcard/android/layout_tests/media/controls-styling.html
-/sdcard/android/layout_tests/media/video-aspect-ratio.html
-/sdcard/android/layout_tests/media/controls-after-reload.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/printing/media-queries-print.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/security/block-test-no-port.html
-/sdcard/android/layout_tests/security/block-test.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/transforms/2d/transform-borderbox.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/compound-transforms-vs-containers.html
-/sdcard/android/layout_tests/transforms/3d/hit-testing/backface-hit-test.html
-/sdcard/android/layout_tests/transforms/3d/hit-testing/backface-no-transform-hit-test.html
-/sdcard/android/layout_tests/transforms/3d/hit-testing/rotated-hit-test.html
-/sdcard/android/layout_tests/transforms/3d/point-mapping/3d-point-mapping-origins.html
-/sdcard/android/layout_tests/transforms/3d/point-mapping/3d-point-mapping-deep.html
-/sdcard/android/layout_tests/transforms/3d/point-mapping/3d-point-mapping-coplanar.html
-/sdcard/android/layout_tests/transforms/3d/point-mapping/3d-point-mapping-preserve-3d.html
-/sdcard/android/layout_tests/transforms/3d/point-mapping/3d-point-mapping-2.html
-/sdcard/android/layout_tests/transforms/3d/point-mapping/3d-point-mapping-3.html
-/sdcard/android/layout_tests/transforms/3d/point-mapping/3d-point-mapping.html
-/sdcard/android/layout_tests/transforms/3d/point-mapping/3d-point-mapping-overlapping.html
-/sdcard/android/layout_tests/transforms/3d/general/perspective-units.html
-/sdcard/android/layout_tests/transforms/3d/general/perspective-non-layer.html
-/sdcard/android/layout_tests/transforms/no_transform_hit_testing.html
-/sdcard/android/layout_tests/transitions/transition-drt-api.html
-/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/test-link-rel-icon.html
-/sdcard/android/layout_tests/webarchive/adopt-attribute-styled-body-webarchive.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/adopt-inline-styled-node-webarchive.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/webarchive/adopt-attribute-styled-node-webarchive.html
diff --git a/tests/DumpRenderTree/assets/results/layout_tests_passed.txt b/tests/DumpRenderTree/assets/results/layout_tests_passed.txt
deleted file mode 100644
index 942b647..0000000
--- a/tests/DumpRenderTree/assets/results/layout_tests_passed.txt
+++ /dev/null
@@ -1,2960 +0,0 @@
-/sdcard/android/layout_tests/accessibility/non-native-image-crash.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/play-state.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/transform-origin-vs-functions.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/multiple-keyframes.html
-/sdcard/android/layout_tests/animations/change-one-anim.html
-/sdcard/android/layout_tests/animations/keyframes-comma-separated.html
-/sdcard/android/layout_tests/animations/matrix-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/keyframe-timing-functions.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/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/combo-transform-rotate+scale.html
-/sdcard/android/layout_tests/animations/keyframes-out-of-order.html
-/sdcard/android/layout_tests/css1/units/zero-duration-without-units.html
-/sdcard/android/layout_tests/css2.1/atrule_longest_match.html
-/sdcard/android/layout_tests/css3/khtml-background-size-0x0-bmp.html
-/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/HTMLSelectElement19.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/HTMLFormElement10.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/HTMLSelectElement16.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/editing/style/temporary-span-crash.html
-/sdcard/android/layout_tests/editing/style/4230923.html
-/sdcard/android/layout_tests/editing/style/textdecoration-outside-of-unsplittable-element.html
-/sdcard/android/layout_tests/editing/style/textdecoration-outside-of-rooteditable.html
-/sdcard/android/layout_tests/editing/style/highlight-insert-paragraph.html
-/sdcard/android/layout_tests/editing/inserting/6609479-1.html
-/sdcard/android/layout_tests/editing/inserting/6609479.html
-/sdcard/android/layout_tests/editing/inserting/5549929-1.html
-/sdcard/android/layout_tests/editing/inserting/font-size-clears-from-typing-style.html
-/sdcard/android/layout_tests/editing/inserting/6104369.html
-/sdcard/android/layout_tests/editing/inserting/return-with-object-element.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/insert-br-quoted-007.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/inserting/6703873-2.html
-/sdcard/android/layout_tests/editing/execCommand/toggle-style-2.html
-/sdcard/android/layout_tests/editing/execCommand/19403.html
-/sdcard/android/layout_tests/editing/execCommand/indent-nested-div.html
-/sdcard/android/layout_tests/editing/execCommand/25256.html
-/sdcard/android/layout_tests/editing/execCommand/default-parameters.html
-/sdcard/android/layout_tests/editing/execCommand/5120591.html
-/sdcard/android/layout_tests/editing/execCommand/19455.html
-/sdcard/android/layout_tests/editing/execCommand/19087.html
-/sdcard/android/layout_tests/editing/execCommand/5543472-3.html
-/sdcard/android/layout_tests/editing/execCommand/5207369.html
-/sdcard/android/layout_tests/editing/execCommand/empty-span-removal.html
-/sdcard/android/layout_tests/editing/execCommand/4916583.html
-/sdcard/android/layout_tests/editing/execCommand/5658933-2.html
-/sdcard/android/layout_tests/editing/execCommand/5469868.html
-/sdcard/android/layout_tests/editing/execCommand/insert-list-with-id.html
-/sdcard/android/layout_tests/editing/execCommand/indent-div-inside-list.html
-/sdcard/android/layout_tests/editing/execCommand/5575101-1.html
-/sdcard/android/layout_tests/editing/execCommand/5432254-1.html
-/sdcard/android/layout_tests/editing/execCommand/indent-nested-blockquotes.html
-/sdcard/android/layout_tests/editing/execCommand/5062376.html
-/sdcard/android/layout_tests/editing/execCommand/indent-second-paragraph-in-blockquote.html
-/sdcard/android/layout_tests/editing/execCommand/findString-3.html
-/sdcard/android/layout_tests/editing/execCommand/toggle-text-decorations.html
-/sdcard/android/layout_tests/editing/execCommand/5142012-3.html
-/sdcard/android/layout_tests/editing/execCommand/indent-empty-table-cell.html
-/sdcard/android/layout_tests/editing/execCommand/5700414-1.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/5685604-1.html
-/sdcard/android/layout_tests/editing/execCommand/4128080-1.html
-/sdcard/android/layout_tests/editing/execCommand/5575101-3.html
-/sdcard/android/layout_tests/editing/execCommand/5119244.html
-/sdcard/android/layout_tests/editing/execCommand/5543472-2.html
-/sdcard/android/layout_tests/editing/execCommand/inline-style-after-indentoutdent.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/5164796.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/outdent-regular-blockquote.html
-/sdcard/android/layout_tests/editing/execCommand/6444148.html
-/sdcard/android/layout_tests/editing/execCommand/5763082.html
-/sdcard/android/layout_tests/editing/execCommand/4976800.html
-/sdcard/android/layout_tests/editing/execCommand/4928635.html
-/sdcard/android/layout_tests/editing/execCommand/list-wrapping-image-crash.html
-/sdcard/android/layout_tests/editing/execCommand/4920742-2.html
-/sdcard/android/layout_tests/editing/execCommand/4917055.html
-/sdcard/android/layout_tests/editing/execCommand/5658933-3.html
-/sdcard/android/layout_tests/editing/execCommand/5575101-2.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/5543472-1.html
-/sdcard/android/layout_tests/editing/execCommand/25320.html
-/sdcard/android/layout_tests/editing/execCommand/5210032.html
-/sdcard/android/layout_tests/editing/execCommand/12244.html
-/sdcard/android/layout_tests/editing/execCommand/15381.html
-/sdcard/android/layout_tests/editing/execCommand/5700414-2.html
-/sdcard/android/layout_tests/editing/execCommand/19653-2.html
-/sdcard/android/layout_tests/editing/execCommand/boldSelection.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/copy-crash-with-extraneous-attribute.html
-/sdcard/android/layout_tests/editing/pasteboard/4930986-3.html
-/sdcard/android/layout_tests/editing/pasteboard/5245519.html
-/sdcard/android/layout_tests/editing/pasteboard/copy-display-none.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/4840662.html
-/sdcard/android/layout_tests/editing/pasteboard/5480736.html
-/sdcard/android/layout_tests/editing/selection/5825350-1.html
-/sdcard/android/layout_tests/editing/selection/selection-invalid-offset.html
-/sdcard/android/layout_tests/editing/selection/move-by-line-005.html
-/sdcard/android/layout_tests/editing/selection/rangeCount.html
-/sdcard/android/layout_tests/editing/selection/containsNode.html
-/sdcard/android/layout_tests/editing/selection/selectAllChildren.html
-/sdcard/android/layout_tests/editing/selection/cleared-by-relayout.html
-/sdcard/android/layout_tests/editing/selection/extend-selection.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/deleteFromDocument.html
-/sdcard/android/layout_tests/editing/selection/5497643.html
-/sdcard/android/layout_tests/editing/selection/setBaseAndExtent-revert-selection.html
-/sdcard/android/layout_tests/editing/selection/crash-on-drag-with-mutation-events.html
-/sdcard/android/layout_tests/editing/selection/5714333.html
-/sdcard/android/layout_tests/editing/selection/select-all-user-select-none.html
-/sdcard/android/layout_tests/editing/selection/thai-word-at-document-end.html
-/sdcard/android/layout_tests/editing/selection/extend.html
-/sdcard/android/layout_tests/editing/selection/5241148.html
-/sdcard/android/layout_tests/editing/selection/5213963.html
-/sdcard/android/layout_tests/editing/selection/move-by-line-004.html
-/sdcard/android/layout_tests/editing/selection/extend-by-line-anonymous-content-crash.html
-/sdcard/android/layout_tests/editing/selection/5779984-1.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/25322-2.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/5156801.html
-/sdcard/android/layout_tests/editing/deleting/4866671.html
-/sdcard/android/layout_tests/editing/deleting/type-delete-after-quote-2.html
-/sdcard/android/layout_tests/editing/deleting/25322-1.html
-/sdcard/android/layout_tests/editing/deleting/merge-at-end-of-document.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/removeNodeCommand-assert.html
-/sdcard/android/layout_tests/editing/deleting/25322-3.html
-/sdcard/android/layout_tests/editing/deleting/2610675-3.html
-/sdcard/android/layout_tests/editing/deleting/5890684.html
-/sdcard/android/layout_tests/editing/deleting/in-visibly-empty-root.html
-/sdcard/android/layout_tests/editing/deleting/4875189.html
-/sdcard/android/layout_tests/fast/media/matchmedium-query-api.html
-/sdcard/android/layout_tests/fast/replaced/object-param-no-name.html
-/sdcard/android/layout_tests/fast/ruby/parse-rp.html
-/sdcard/android/layout_tests/fast/dynamic/subtree-common-root.html
-/sdcard/android/layout_tests/fast/dynamic/hovered-detach.html
-/sdcard/android/layout_tests/fast/dynamic/insertAdjacentHTML.html
-/sdcard/android/layout_tests/fast/dynamic/style-access-late-stylesheet-load.html
-/sdcard/android/layout_tests/fast/dynamic/insertAdjacentText.html
-/sdcard/android/layout_tests/fast/dynamic/insertAdjacentHTML-allowed-parents.html
-/sdcard/android/layout_tests/fast/dynamic/checkbox-selection-crash.html
-/sdcard/android/layout_tests/fast/dynamic/outerHTML-no-element.html
-/sdcard/android/layout_tests/fast/dynamic/5872671.html
-/sdcard/android/layout_tests/fast/dynamic/ancestor-to-absolute.html
-/sdcard/android/layout_tests/fast/dynamic/float-remove-above-line.html
-/sdcard/android/layout_tests/fast/dynamic/recursive-layout.html
-/sdcard/android/layout_tests/fast/dynamic/inline-to-block-crash.html
-/sdcard/android/layout_tests/fast/text/whitespace/nowrap-line-break-after-white-space.html
-/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-quotes.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/find-hidden-text.html
-/sdcard/android/layout_tests/fast/text/line-breaks-after-ideographic-comma-or-full-stop.html
-/sdcard/android/layout_tests/fast/text/find-spaces.html
-/sdcard/android/layout_tests/fast/text/text-large-negative-letter-spacing-with-opacity.html
-/sdcard/android/layout_tests/fast/encoding/gbk/chinese.html
-/sdcard/android/layout_tests/fast/encoding/gbk/x-euc-cn.html
-/sdcard/android/layout_tests/fast/encoding/gbk/gb_2312-80.html
-/sdcard/android/layout_tests/fast/encoding/gbk/cn-gb.html
-/sdcard/android/layout_tests/fast/encoding/gbk/csgb2312.html
-/sdcard/android/layout_tests/fast/encoding/gbk/iso-ir-58.html
-/sdcard/android/layout_tests/fast/encoding/gbk/csgb231280.html
-/sdcard/android/layout_tests/fast/encoding/gbk/gb2312.html
-/sdcard/android/layout_tests/fast/encoding/gbk/gbk.html
-/sdcard/android/layout_tests/fast/encoding/gbk/x-gbk.html
-/sdcard/android/layout_tests/fast/encoding/gbk/EUC-CN.html
-/sdcard/android/layout_tests/fast/encoding/gbk/close-gbk-converter.html
-/sdcard/android/layout_tests/fast/encoding/hebrew/hebrew.html
-/sdcard/android/layout_tests/fast/encoding/hebrew/csISO88598I.html
-/sdcard/android/layout_tests/fast/encoding/hebrew/8859-8.html
-/sdcard/android/layout_tests/fast/encoding/hebrew/8859-8-e.html
-/sdcard/android/layout_tests/fast/encoding/hebrew/8859-8-i.html
-/sdcard/android/layout_tests/fast/encoding/hebrew/logical.html
-/sdcard/android/layout_tests/fast/encoding/hebrew/iso-ir-138.html
-/sdcard/android/layout_tests/fast/encoding/pseudo-xml-4.html
-/sdcard/android/layout_tests/fast/encoding/no-charset-on-dynamic-script-load.html
-/sdcard/android/layout_tests/fast/encoding/utf-32-little-endian-bom.html
-/sdcard/android/layout_tests/fast/encoding/bandai-co-jp-releases.html
-/sdcard/android/layout_tests/fast/encoding/utf-32-big-endian-bom.html
-/sdcard/android/layout_tests/fast/encoding/css-charset-evil.html
-/sdcard/android/layout_tests/fast/encoding/css-charset.html
-/sdcard/android/layout_tests/fast/encoding/xml-charset-utf16.html
-/sdcard/android/layout_tests/fast/encoding/pseudo-xml-3.html
-/sdcard/android/layout_tests/fast/encoding/tag-in-title.html
-/sdcard/android/layout_tests/fast/encoding/noscript-in-head.html
-/sdcard/android/layout_tests/fast/encoding/css-cached-bom.html
-/sdcard/android/layout_tests/fast/encoding/preload-encoding.html
-/sdcard/android/layout_tests/fast/encoding/charset-invalid.html
-/sdcard/android/layout_tests/fast/encoding/pseudo-tags-in-attributes.html
-/sdcard/android/layout_tests/fast/encoding/decoder-allow-null-chars.html
-/sdcard/android/layout_tests/fast/encoding/css-charset-dom.html
-/sdcard/android/layout_tests/fast/encoding/charset-utf16.html
-/sdcard/android/layout_tests/fast/encoding/char-encoding.html
-/sdcard/android/layout_tests/fast/encoding/css-link-charset.html
-/sdcard/android/layout_tests/fast/encoding/latin1-winlatin.html
-/sdcard/android/layout_tests/fast/encoding/high-bit-latin1.html
-/sdcard/android/layout_tests/fast/encoding/bom-in-content.html
-/sdcard/android/layout_tests/fast/encoding/bom-in-content-utf16.html
-/sdcard/android/layout_tests/fast/encoding/namespace-tolerance.html
-/sdcard/android/layout_tests/fast/encoding/misplaced-xml-declaration.html
-/sdcard/android/layout_tests/fast/encoding/euckr-name.html
-/sdcard/android/layout_tests/fast/encoding/charset-xuser-defined.html
-/sdcard/android/layout_tests/fast/encoding/pseudo-xml-2.html
-/sdcard/android/layout_tests/fast/encoding/floraexpress-ru.html
-/sdcard/android/layout_tests/fast/encoding/charset-cp1251.html
-/sdcard/android/layout_tests/fast/encoding/charset-unicode.html
-/sdcard/android/layout_tests/fast/encoding/meta-charset.html
-/sdcard/android/layout_tests/fast/encoding/xml-utf-8-default.xml
-/sdcard/android/layout_tests/fast/encoding/pseudo-xml.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/script-in-head.html
-/sdcard/android/layout_tests/fast/encoding/mispositioned-meta.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
-/sdcard/android/layout_tests/fast/doctypes/005-case-preserving.html
-/sdcard/android/layout_tests/fast/doctypes/doctype-in-element.html
-/sdcard/android/layout_tests/fast/doctypes/doctype-after-comment.html
-/sdcard/android/layout_tests/fast/doctypes/doctype-parsing.html
-/sdcard/android/layout_tests/fast/doctypes/html-doctype.html
-/sdcard/android/layout_tests/fast/cookies/local-file-can-set-cookies.html
-/sdcard/android/layout_tests/fast/css-generated-content/empty-content-with-float-crash.html
-/sdcard/android/layout_tests/fast/css-generated-content/reset-content-to-initial.html
-/sdcard/android/layout_tests/fast/workers/worker-close.html
-/sdcard/android/layout_tests/fast/workers/worker-context-gc.html
-/sdcard/android/layout_tests/fast/workers/worker-constructor.html
-/sdcard/android/layout_tests/fast/workers/worker-timeout.html
-/sdcard/android/layout_tests/fast/workers/worker-messageport.html
-/sdcard/android/layout_tests/fast/workers/worker-gc.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/workers/worker-cloneport.html
-/sdcard/android/layout_tests/fast/workers/worker-call.html
-/sdcard/android/layout_tests/fast/workers/worker-messageport-gc.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/use-machine-stack.html
-/sdcard/android/layout_tests/fast/workers/worker-navigator.html
-/sdcard/android/layout_tests/fast/workers/worker-script-error.html
-/sdcard/android/layout_tests/fast/workers/worker-replace-global-constructor.html
-/sdcard/android/layout_tests/fast/transforms/container-transform-crash.html
-/sdcard/android/layout_tests/fast/leaks/001.html
-/sdcard/android/layout_tests/fast/leaks/002.html
-/sdcard/android/layout_tests/fast/borders/border-radius-parsing.html
-/sdcard/android/layout_tests/fast/innerHTML/innerHTML-custom-tag.html
-/sdcard/android/layout_tests/fast/innerHTML/additional-inline-style.html
-/sdcard/android/layout_tests/fast/innerHTML/005.html
-/sdcard/android/layout_tests/fast/innerHTML/javascript-url.html
-/sdcard/android/layout_tests/fast/innerHTML/innerHTML-case.html
-/sdcard/android/layout_tests/fast/overflow/onscroll-layer-self-destruct.html
-/sdcard/android/layout_tests/fast/overflow/generated-content-crash.html
-/sdcard/android/layout_tests/fast/overflow/overflow-y-scroll.html
-/sdcard/android/layout_tests/fast/events/dispatch-to-handle-event.html
-/sdcard/android/layout_tests/fast/events/scroll-during-zoom-change.html
-/sdcard/android/layout_tests/fast/events/scroll-event-does-not-bubble.html
-/sdcard/android/layout_tests/fast/events/onload-after-document-close-with-subresource.html
-/sdcard/android/layout_tests/fast/events/message-channel-gc-4.html
-/sdcard/android/layout_tests/fast/events/message-channel-listener-circular-ownership.html
-/sdcard/android/layout_tests/fast/events/message-port-constructor-for-deleted-document.html
-/sdcard/android/layout_tests/fast/events/dispatchEvent-crash.html
-/sdcard/android/layout_tests/fast/events/programmatic-check-no-change-event.html
-/sdcard/android/layout_tests/fast/events/message-port-inactive-document.html
-/sdcard/android/layout_tests/fast/events/onunload-body-property.html
-/sdcard/android/layout_tests/fast/events/event-trace.html
-/sdcard/android/layout_tests/fast/events/init-event-after-dispatch.html
-/sdcard/android/layout_tests/fast/events/delayed-style-mutation-event-crash.html
-/sdcard/android/layout_tests/fast/events/keydown-keypress-focus-change.html
-/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/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
-/sdcard/android/layout_tests/fast/events/keypress-removed-node.html
-/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/message-port-deleted-frame.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/message-port-no-wrapper.html
-/sdcard/android/layout_tests/fast/events/mousedown_in_scrollbar.html
-/sdcard/android/layout_tests/fast/events/onload-single-line-comment.html
-/sdcard/android/layout_tests/fast/events/message-channel-gc-2.html
-/sdcard/android/layout_tests/fast/events/window-load-capture.html
-/sdcard/android/layout_tests/fast/events/message-port-deleted-document.html
-/sdcard/android/layout_tests/fast/events/event-instanceof.html
-/sdcard/android/layout_tests/fast/events/message-channel-gc.html
-/sdcard/android/layout_tests/fast/events/event-creation.html
-/sdcard/android/layout_tests/fast/events/event-listener-sharing.html
-/sdcard/android/layout_tests/fast/events/caller-access-from-event-listener.html
-/sdcard/android/layout_tests/fast/events/stopPropagation-submit.html
-/sdcard/android/layout_tests/fast/events/remove-event-listener.html
-/sdcard/android/layout_tests/fast/events/mouseup-outside-button.html
-/sdcard/android/layout_tests/fast/events/iframe-object-onload.html
-/sdcard/android/layout_tests/fast/events/no-window-load.html
-/sdcard/android/layout_tests/fast/events/event-listener-html-non-html-confusion.html
-/sdcard/android/layout_tests/fast/events/onerror-bubbling.html
-/sdcard/android/layout_tests/fast/events/keydown-remove-frame.html
-/sdcard/android/layout_tests/fast/events/message-channel-gc-3.html
-/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/message-port-clone.html
-/sdcard/android/layout_tests/fast/events/tab-crash-with-image-map.html
-/sdcard/android/layout_tests/fast/events/simulated-key-state.html
-/sdcard/android/layout_tests/fast/events/init-event-null-view.html
-/sdcard/android/layout_tests/fast/events/init-events.html
-/sdcard/android/layout_tests/fast/events/onunload-window-property.html
-/sdcard/android/layout_tests/fast/events/message-port.html
-/sdcard/android/layout_tests/fast/html/tab-order.html
-/sdcard/android/layout_tests/fast/html/xhtml-serialize.html
-/sdcard/android/layout_tests/fast/html/empty-fragment-id-goto-top.html
-/sdcard/android/layout_tests/fast/html/script-allowed-types-languages.html
-/sdcard/android/layout_tests/fast/html/text-field-input-types.html
-/sdcard/android/layout_tests/fast/html/draggable.html
-/sdcard/android/layout_tests/fast/html/body-offset-properties.html
-/sdcard/android/layout_tests/fast/images/image-empty-data.html
-/sdcard/android/layout_tests/fast/images/text-content-crash.html
-/sdcard/android/layout_tests/fast/images/border.html
-/sdcard/android/layout_tests/fast/images/animated-background-image-crash.html
-/sdcard/android/layout_tests/fast/images/load-img-with-empty-src.html
-/sdcard/android/layout_tests/fast/images/text-content-crash-2.html
-/sdcard/android/layout_tests/fast/inspector/cssURLQuotes.html
-/sdcard/android/layout_tests/fast/flexbox/repaint-scrollbar.html
-/sdcard/android/layout_tests/fast/flexbox/inline-children-crash.html
-/sdcard/android/layout_tests/fast/tokenizer/nested-cached-scripts.html
-/sdcard/android/layout_tests/fast/tokenizer/image-empty-crash.html
-/sdcard/android/layout_tests/fast/tokenizer/lessthan-terminates-tags-and-attrs.html
-/sdcard/android/layout_tests/fast/tokenizer/ignore-tags-in-iframe.html
-/sdcard/android/layout_tests/fast/tokenizer/write-partial-entity.html
-/sdcard/android/layout_tests/fast/tokenizer/external-script-document-open.html
-/sdcard/android/layout_tests/fast/tokenizer/004.html
-/sdcard/android/layout_tests/fast/tokenizer/write-inline-script-open.html
-/sdcard/android/layout_tests/fast/tokenizer/write-external-script-open.html
-/sdcard/android/layout_tests/fast/tokenizer/doctype-search-reset.html
-/sdcard/android/layout_tests/fast/tokenizer/nested-multiple-scripts.html
-/sdcard/android/layout_tests/fast/tokenizer/nested-cached-scripts-and-stylesheet.html
-/sdcard/android/layout_tests/fast/tokenizer/ampersand-in-special-tag.html
-/sdcard/android/layout_tests/fast/tokenizer/write-unclosed-script.html
-/sdcard/android/layout_tests/fast/tokenizer/badscript.html
-/sdcard/android/layout_tests/fast/regex/quantified-assertions.html
-/sdcard/android/layout_tests/fast/regex/non-pattern-characters.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/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/box-shadow/box-shadow-overflow-scroll.html
-/sdcard/android/layout_tests/fast/js/kde/Boolean.html
-/sdcard/android/layout_tests/fast/js/kde/garbage-n.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/string-2-n.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/encode_decode_uri.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/string-1-n.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
-/sdcard/android/layout_tests/fast/js/pic/get-set-proxy-object.html
-/sdcard/android/layout_tests/fast/js/pic/rehash-poisons-structure.html
-/sdcard/android/layout_tests/fast/js/pic/cached-array-length-access.html
-/sdcard/android/layout_tests/fast/js/pic/cached-prototype-then-immediate.html
-/sdcard/android/layout_tests/fast/js/pic/cached-getter-setter.html
-/sdcard/android/layout_tests/fast/js/pic/cached-getter-dictionary-and-proto.html
-/sdcard/android/layout_tests/fast/js/pic/delete-global-object.html
-/sdcard/android/layout_tests/fast/js/pic/cached-deleted-properties.html
-/sdcard/android/layout_tests/fast/js/pic/dictionary-prototype.html
-/sdcard/android/layout_tests/fast/js/bitwise-and-on-undefined.html
-/sdcard/android/layout_tests/fast/js/exception-sequencing-binops.html
-/sdcard/android/layout_tests/fast/js/exception-thrown-from-eval-inside-closure.html
-/sdcard/android/layout_tests/fast/js/recursion-limit-equal.html
-/sdcard/android/layout_tests/fast/js/string_replace.html
-/sdcard/android/layout_tests/fast/js/ignored-result-ref-crash.html
-/sdcard/android/layout_tests/fast/js/function-toString-object-literals.html
-/sdcard/android/layout_tests/fast/js/numeric-conversion.html
-/sdcard/android/layout_tests/fast/js/select-options-remove.html
-/sdcard/android/layout_tests/fast/js/array-tostring-ignore-separator.html
-/sdcard/android/layout_tests/fast/js/exception-sequencing-binops2.html
-/sdcard/android/layout_tests/fast/js/function-declaration.html
-/sdcard/android/layout_tests/fast/js/number-toExponential.html
-/sdcard/android/layout_tests/fast/js/direct-entry-to-function-code.html
-/sdcard/android/layout_tests/fast/js/number-parsing-crash.html
-/sdcard/android/layout_tests/fast/js/vardecl-preserve-vardecl.html
-/sdcard/android/layout_tests/fast/js/unexpected-constant-crash.html
-/sdcard/android/layout_tests/fast/js/var-shadows-arg-gc-crash.html
-/sdcard/android/layout_tests/fast/js/arguments-bad-index.html
-/sdcard/android/layout_tests/fast/js/resize-array-assign.html
-/sdcard/android/layout_tests/fast/js/number-toString.html
-/sdcard/android/layout_tests/fast/js/this-non-object-proto.html
-/sdcard/android/layout_tests/fast/js/exception-thrown-from-new.html
-/sdcard/android/layout_tests/fast/js/cyclic-proto.html
-/sdcard/android/layout_tests/fast/js/vardecl-preserve-arguments.html
-/sdcard/android/layout_tests/fast/js/regexp-compile-crash.html
-/sdcard/android/layout_tests/fast/js/var-declarations-shadowing.html
-/sdcard/android/layout_tests/fast/js/ignored-result-null-comparison-crash.html
-/sdcard/android/layout_tests/fast/js/array-sort-reentrance.html
-/sdcard/android/layout_tests/fast/js/toString-for-var-decl.html
-/sdcard/android/layout_tests/fast/js/string-slice-abnormal-values.html
-/sdcard/android/layout_tests/fast/js/exception-linenums-in-html-1.html
-/sdcard/android/layout_tests/fast/js/do-while-without-semicolon.html
-/sdcard/android/layout_tests/fast/js/object-prototype-toLocaleString.html
-/sdcard/android/layout_tests/fast/js/function-redefinition.html
-/sdcard/android/layout_tests/fast/js/function-name.html
-/sdcard/android/layout_tests/fast/js/logical-or-jless.html
-/sdcard/android/layout_tests/fast/js/regexp-non-character.html
-/sdcard/android/layout_tests/fast/js/JSON-parse.html
-/sdcard/android/layout_tests/fast/js/assign.html
-/sdcard/android/layout_tests/fast/js/for-in-avoid-duplicates.html
-/sdcard/android/layout_tests/fast/js/math-transforms.html
-/sdcard/android/layout_tests/fast/js/sort-stability.html
-/sdcard/android/layout_tests/fast/js/try-catch-crash.html
-/sdcard/android/layout_tests/fast/js/duplicate-param-gc-crash.html
-/sdcard/android/layout_tests/fast/js/regexp-stack-overflow.html
-/sdcard/android/layout_tests/fast/js/function-argument-evaluation-before-exception.html
-/sdcard/android/layout_tests/fast/js/number-toprecision.html
-/sdcard/android/layout_tests/fast/js/string-property-iteration.html
-/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
-/sdcard/android/layout_tests/fast/js/object-extra-comma.html
-/sdcard/android/layout_tests/fast/js/number-tofixed.html
-/sdcard/android/layout_tests/fast/js/function-declarations-in-switch-statement.html
-/sdcard/android/layout_tests/fast/js/regexp-extended-characters-crash.html
-/sdcard/android/layout_tests/fast/js/typeof-codegen-crash.html
-/sdcard/android/layout_tests/fast/js/array-indexof.html
-/sdcard/android/layout_tests/fast/js/mod-crash.html
-/sdcard/android/layout_tests/fast/js/eval-keyword-vs-function.html
-/sdcard/android/layout_tests/fast/js/debugger.html
-/sdcard/android/layout_tests/fast/js/rehash-assign.html
-/sdcard/android/layout_tests/fast/js/object-prototype-constructor.html
-/sdcard/android/layout_tests/fast/js/function-call-aliased.html
-/sdcard/android/layout_tests/fast/js/string-replace-exception-crash.html
-/sdcard/android/layout_tests/fast/js/date-big-setmonth.html
-/sdcard/android/layout_tests/fast/js/array-enumerators-functions.html
-/sdcard/android/layout_tests/fast/js/exception-linenums-in-html-2.html
-/sdcard/android/layout_tests/fast/js/select-options-add.html
-/sdcard/android/layout_tests/fast/js/toString-dontEnum.html
-/sdcard/android/layout_tests/fast/js/toString-elision-trailing-comma.html
-/sdcard/android/layout_tests/fast/js/regexp-negative-special-characters.html
-/sdcard/android/layout_tests/fast/js/getter-setter-gc.html
-/sdcard/android/layout_tests/fast/js/string-substr.html
-/sdcard/android/layout_tests/fast/js/for-in-var-scope.html
-/sdcard/android/layout_tests/fast/js/exec-state-marking.html
-/sdcard/android/layout_tests/fast/js/primitive-method-this.html
-/sdcard/android/layout_tests/fast/js/string-sort.html
-/sdcard/android/layout_tests/fast/js/for-in-cached.html
-/sdcard/android/layout_tests/fast/js/delete-getters-setters.html
-/sdcard/android/layout_tests/fast/js/const-without-initializer.html
-/sdcard/android/layout_tests/fast/js/function-apply-aliased.html
-/sdcard/android/layout_tests/fast/js/sparse-array.html
-/sdcard/android/layout_tests/fast/js/same-origin-subframe-about-blank.html
-/sdcard/android/layout_tests/fast/js/nested-function-scope.html
-/sdcard/android/layout_tests/fast/js/function-constructor-single-line-comment.html
-/sdcard/android/layout_tests/fast/js/JSON-stringify.html
-/sdcard/android/layout_tests/fast/js/uncaught-exception-line-number.html
-/sdcard/android/layout_tests/fast/js/const.html
-/sdcard/android/layout_tests/fast/js/reparsing-semicolon-insertion.html
-/sdcard/android/layout_tests/fast/js/regexp-non-capturing-groups.html
-/sdcard/android/layout_tests/fast/js/has-own-property.html
-/sdcard/android/layout_tests/fast/js/window-location-href-file-urls.html
-/sdcard/android/layout_tests/fast/js/regexp-extended-characters-more.html
-/sdcard/android/layout_tests/fast/js/prefix-syntax.html
-/sdcard/android/layout_tests/fast/js/exceptions-thrown-in-callbacks.html
-/sdcard/android/layout_tests/fast/js/exception-with-handler-inside-eval-with-dynamic-scope.html
-/sdcard/android/layout_tests/fast/js/for-in-exeception.html
-/sdcard/android/layout_tests/fast/js/array-lastIndexOf.html
-/sdcard/android/layout_tests/fast/js/modify-non-references.html
-/sdcard/android/layout_tests/fast/js/exception-for-nonobject.html
-/sdcard/android/layout_tests/fast/js/regexp-find-first-asserted.html
-/sdcard/android/layout_tests/fast/js/sort-randomly.html
-/sdcard/android/layout_tests/fast/js/array-indexing.html
-/sdcard/android/layout_tests/fast/js/registerCachingAcrossBranchTargets.html
-/sdcard/android/layout_tests/fast/js/regexp-caching.html
-/sdcard/android/layout_tests/fast/js/typeof-syntax.html
-/sdcard/android/layout_tests/fast/js/regexp-character-match-out-of-order.html
-/sdcard/android/layout_tests/fast/js/date-toisostring.html
-/sdcard/android/layout_tests/fast/js/function-call-register-allocation.html
-/sdcard/android/layout_tests/fast/js/arguments.html
-/sdcard/android/layout_tests/fast/js/constant-folding.html
-/sdcard/android/layout_tests/fast/js/activation-object-function-lifetime.html
-/sdcard/android/layout_tests/fast/js/array-filter.html
-/sdcard/android/layout_tests/fast/js/implicit-global-to-global-reentry.html
-/sdcard/android/layout_tests/fast/js/array-reduceRight.html
-/sdcard/android/layout_tests/fast/js/array-foreach.html
-/sdcard/android/layout_tests/fast/js/regexp-many-brackets.html
-/sdcard/android/layout_tests/fast/js/activation-proto.html
-/sdcard/android/layout_tests/fast/js/toString-overrides.html
-/sdcard/android/layout_tests/fast/js/regexp-unicode-overflow.html
-/sdcard/android/layout_tests/fast/js/postfix-syntax.html
-/sdcard/android/layout_tests/fast/js/global-recursion-on-full-stack.html
-/sdcard/android/layout_tests/fast/js/closure-inside-extra-arg-call.html
-/sdcard/android/layout_tests/fast/js/number-cell-reuse.html
-/sdcard/android/layout_tests/fast/js/removing-Cf-characters.html
-/sdcard/android/layout_tests/fast/js/pretty-print.html
-/sdcard/android/layout_tests/fast/js/isPrototypeOf.html
-/sdcard/android/layout_tests/fast/js/prototypes.html
-/sdcard/android/layout_tests/fast/js/math.html
-/sdcard/android/layout_tests/fast/js/string-from-char-code.html
-/sdcard/android/layout_tests/fast/js/sort-no-jit-code-crash.html
-/sdcard/android/layout_tests/fast/js/eval-overriding.html
-/sdcard/android/layout_tests/fast/js/regexp-char-insensitive.html
-/sdcard/android/layout_tests/fast/js/array-float-delete.html
-/sdcard/android/layout_tests/fast/js/array-index-immediate-types.html
-/sdcard/android/layout_tests/fast/js/integer-extremes.html
-/sdcard/android/layout_tests/fast/js/console-non-string-values.html
-/sdcard/android/layout_tests/fast/js/regexp-non-bmp.html
-/sdcard/android/layout_tests/fast/js/regexp-range-bound-ffff.html
-/sdcard/android/layout_tests/fast/js/delete-then-put.html
-/sdcard/android/layout_tests/fast/js/nested-object-gc.html
-/sdcard/android/layout_tests/fast/js/string-replace-2.html
-/sdcard/android/layout_tests/fast/js/cached-eval-gc.html
-/sdcard/android/layout_tests/fast/js/property-getters-and-setters.html
-/sdcard/android/layout_tests/fast/js/array-reset-large-index.html
-/sdcard/android/layout_tests/fast/js/date-proto-generic-invocation.html
-/sdcard/android/layout_tests/fast/js/lastModified.html
-/sdcard/android/layout_tests/fast/js/encode-URI-test.html
-/sdcard/android/layout_tests/fast/js/codegen-loops-logical-nodes.html
-/sdcard/android/layout_tests/fast/js/string-capitalization.html
-/sdcard/android/layout_tests/fast/js/caller-property.html
-/sdcard/android/layout_tests/fast/js/regexp-overflow-too-big.html
-/sdcard/android/layout_tests/fast/js/repeat-cached-vm-reentry.html
-/sdcard/android/layout_tests/fast/js/date-DST-time-cusps.html
-/sdcard/android/layout_tests/fast/js/regexp-unicode-handling.html
-/sdcard/android/layout_tests/fast/js/unmatching-argument-count.html
-/sdcard/android/layout_tests/fast/js/text-field-resize.html
-/sdcard/android/layout_tests/fast/js/delete-multiple-global-blocks.html
-/sdcard/android/layout_tests/fast/js/eval-throw-return.html
-/sdcard/android/layout_tests/fast/js/duplicate-param-crash.html
-/sdcard/android/layout_tests/fast/js/switch-behaviour.html
-/sdcard/android/layout_tests/fast/js/delete-syntax.html
-/sdcard/android/layout_tests/fast/js/date-DST-pre-1970.html
-/sdcard/android/layout_tests/fast/js/array-splice.html
-/sdcard/android/layout_tests/fast/js/statement-list-register-crash.html
-/sdcard/android/layout_tests/fast/js/date-set-to-nan.html
-/sdcard/android/layout_tests/fast/js/code-serialize-paren.html
-/sdcard/android/layout_tests/fast/js/parse-backslash-before-newline.html
-/sdcard/android/layout_tests/fast/js/delete-function-parameter.html
-/sdcard/android/layout_tests/fast/js/exception-expression-offset.html
-/sdcard/android/layout_tests/fast/js/JSON-stringify-replacer.html
-/sdcard/android/layout_tests/fast/js/invalid-syntax-for-function.html
-/sdcard/android/layout_tests/fast/js/toString-and-valueOf-override.html
-/sdcard/android/layout_tests/fast/js/cyclic-prototypes.html
-/sdcard/android/layout_tests/fast/js/equality.html
-/sdcard/android/layout_tests/fast/js/order-of-operations.html
-/sdcard/android/layout_tests/fast/js/regexp-no-extensions.html
-/sdcard/android/layout_tests/fast/js/stack-unwinding.html
-/sdcard/android/layout_tests/fast/js/toString-try-else.html
-/sdcard/android/layout_tests/fast/js/reserved-words.html
-/sdcard/android/layout_tests/fast/js/function-dot-arguments-and-caller.html
-/sdcard/android/layout_tests/fast/js/do-while-expression-value.html
-/sdcard/android/layout_tests/fast/js/bom-in-file-retains-correct-offset.html
-/sdcard/android/layout_tests/fast/js/string-split-ignore-case.html
-/sdcard/android/layout_tests/fast/js/date-constructor.html
-/sdcard/android/layout_tests/fast/js/global-function-resolve.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/array-functions-non-arrays.html
-/sdcard/android/layout_tests/fast/js/function-toString-parentheses.html
-/sdcard/android/layout_tests/fast/js/while-expression-value.html
-/sdcard/android/layout_tests/fast/js/string-replace-3.html
-/sdcard/android/layout_tests/fast/js/avl-crash.html
-/sdcard/android/layout_tests/fast/js/vardecl-blocks-init.html
-/sdcard/android/layout_tests/fast/js/null-char-in-string.html
-/sdcard/android/layout_tests/fast/js/codegen-temporaries-multiple-global-blocks.html
-/sdcard/android/layout_tests/fast/js/char-at.html
-/sdcard/android/layout_tests/fast/js/function-constructor-newline-after-brace.html
-/sdcard/android/layout_tests/fast/js/propertyIsEnumerable.html
-/sdcard/android/layout_tests/fast/js/exception-thrown-from-equal.html
-/sdcard/android/layout_tests/fast/js/constructor.html
-/sdcard/android/layout_tests/fast/js/regexp-backreferences.html
-/sdcard/android/layout_tests/fast/js/regexp-overflow.html
-/sdcard/android/layout_tests/fast/js/var-declarations.html
-/sdcard/android/layout_tests/fast/js/continue-break-multiple-labels.html
-/sdcard/android/layout_tests/fast/js/toString-exception.html
-/sdcard/android/layout_tests/fast/js/regexp-test-null-string.html
-/sdcard/android/layout_tests/fast/js/date-parse-comments-test.html
-/sdcard/android/layout_tests/fast/js/select-options-remove-gc.html
-/sdcard/android/layout_tests/fast/js/implicit-call-with-global-reentry.html
-/sdcard/android/layout_tests/fast/js/array-tostring-and-join.html
-/sdcard/android/layout_tests/fast/js/function-names.html
-/sdcard/android/layout_tests/fast/js/primitive-property-access-edge-cases.html
-/sdcard/android/layout_tests/fast/js/date-preserve-milliseconds.html
-/sdcard/android/layout_tests/fast/js/sort-large-array.html
-/sdcard/android/layout_tests/fast/js/for-in-to-text.html
-/sdcard/android/layout_tests/fast/js/global-var-limit.html
-/sdcard/android/layout_tests/fast/js/static-scope-object.html
-/sdcard/android/layout_tests/fast/js/var-shadows-arg-crash.html
-/sdcard/android/layout_tests/fast/js/function-apply.html
-/sdcard/android/layout_tests/fast/js/array-reduce.html
-/sdcard/android/layout_tests/fast/js/function-prototype.html
-/sdcard/android/layout_tests/fast/js/tostring-exception-in-property-access.html
-/sdcard/android/layout_tests/fast/js/function-declaration-statement.html
-/sdcard/android/layout_tests/fast/js/large-expressions.html
-/sdcard/android/layout_tests/fast/js/date-negative-setmonth.html
-/sdcard/android/layout_tests/fast/js/reentrant-call-unwind.html
-/sdcard/android/layout_tests/fast/js/dictionary-no-cache.html
-/sdcard/android/layout_tests/fast/js/regexp-lastindex.html
-/sdcard/android/layout_tests/fast/js/finally-codegen-failure.html
-/sdcard/android/layout_tests/fast/js/instance-of-immediates.html
-/sdcard/android/layout_tests/fast/js/read-modify-eval.html
-/sdcard/android/layout_tests/fast/js/exception-thrown-from-function-with-lazy-activation.html
-/sdcard/android/layout_tests/fast/js/cyclic-ref-toString.html
-/sdcard/android/layout_tests/fast/js/function-toString-semicolon-insertion.html
-/sdcard/android/layout_tests/fast/js/exception-sequencing.html
-/sdcard/android/layout_tests/fast/js/date-big-constructor.html
-/sdcard/android/layout_tests/fast/js/gmail-re-re.html
-/sdcard/android/layout_tests/fast/js/deep-recursion-test.html
-/sdcard/android/layout_tests/fast/js/lexical-lookup-in-function-constructor.html
-/sdcard/android/layout_tests/fast/js/regexp-range-out-of-order.html
-/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
-/sdcard/android/layout_tests/fast/js/declaration-in-block.html
-/sdcard/android/layout_tests/fast/js/eval-var-decl.html
-/sdcard/android/layout_tests/fast/js/eval-cross-window.html
-/sdcard/android/layout_tests/fast/js/function-decompilation-operators.html
-/sdcard/android/layout_tests/fast/js/sort-non-numbers.html
-/sdcard/android/layout_tests/fast/js/excessive-comma-usage.html
-/sdcard/android/layout_tests/fast/js/method-check.html
-/sdcard/android/layout_tests/fast/js/function-declarations.html
-/sdcard/android/layout_tests/fast/js/regexp-extended-characters-match.html
-/sdcard/android/layout_tests/fast/js/non-object-proto.html
-/sdcard/android/layout_tests/fast/js/toString-number-dot-expr.html
-/sdcard/android/layout_tests/fast/js/date-parse-test.html
-/sdcard/android/layout_tests/fast/js/exception-try-finally-scope-error.html
-/sdcard/android/layout_tests/fast/js/function-dot-arguments.html
-/sdcard/android/layout_tests/fast/js/toString-prefix-postfix-preserve-parens.html
-/sdcard/android/layout_tests/fast/js/regexp-ranges-and-escaped-hyphens.html
-/sdcard/android/layout_tests/fast/js/construct-global-object.html
-/sdcard/android/layout_tests/fast/js/array-holes.html
-/sdcard/android/layout_tests/fast/js/exception-linenums.html
-/sdcard/android/layout_tests/fast/js/codegen-temporaries.html
-/sdcard/android/layout_tests/fast/js/array-join-bug-11524.html
-/sdcard/android/layout_tests/fast/js/with-scope-gc.html
-/sdcard/android/layout_tests/fast/js/string-index-overflow.html
-/sdcard/android/layout_tests/fast/js/eval-cache-crash.html
-/sdcard/android/layout_tests/fast/js/array-map.html
-/sdcard/android/layout_tests/fast/js/exception-codegen-crash.html
-/sdcard/android/layout_tests/fast/js/comparefn-sort-stability.html
-/sdcard/android/layout_tests/fast/js/typeof-constant-string.html
-/sdcard/android/layout_tests/fast/js/navigator-plugins-crash.html
-/sdcard/android/layout_tests/fast/js/vardecl-preserve-parameters.html
-/sdcard/android/layout_tests/fast/inline/clean-after-removing-temp-boxes.html
-/sdcard/android/layout_tests/fast/inline/continuation-positioned-reparenting.html
-/sdcard/android/layout_tests/fast/dom/HTMLTableElement/early-acid3-65-excerpt.html
-/sdcard/android/layout_tests/fast/dom/HTMLTableElement/early-acid3-66-excerpt.html
-/sdcard/android/layout_tests/fast/dom/HTMLTableElement/cellpadding-attribute.html
-/sdcard/android/layout_tests/fast/dom/HTMLTableElement/insert-row.html
-/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/activeElement.html
-/sdcard/android/layout_tests/fast/dom/HTMLDocument/hasFocus-frameless-crash.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
-/sdcard/android/layout_tests/fast/dom/HTMLDocument/object-by-name-unknown-child-element.html
-/sdcard/android/layout_tests/fast/dom/HTMLDocument/object-by-name-or-id.html
-/sdcard/android/layout_tests/fast/dom/HTMLDocument/title-set.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/write-call.html
-/sdcard/android/layout_tests/fast/dom/HTMLDocument/document-open-return-value.html
-/sdcard/android/layout_tests/fast/dom/HTMLDocument/writeln-multiple-calls.html
-/sdcard/android/layout_tests/fast/dom/HTMLLabelElement/form/test1.html
-/sdcard/android/layout_tests/fast/dom/Document/replace-child.html
-/sdcard/android/layout_tests/fast/dom/Document/title-property-creates-title-element.html
-/sdcard/android/layout_tests/fast/dom/Document/createElementNS-namespace-err.html
-/sdcard/android/layout_tests/fast/dom/Document/title-property-set-multiple-times.html
-/sdcard/android/layout_tests/fast/dom/Document/document-reopen.html
-/sdcard/android/layout_tests/fast/dom/Document/document-charset.html
-/sdcard/android/layout_tests/fast/dom/Document/replaceChild-null-oldChild.html
-/sdcard/android/layout_tests/fast/dom/Document/createAttributeNS-namespace-err.html
-/sdcard/android/layout_tests/fast/dom/Document/open-with-pending-load.html
-/sdcard/android/layout_tests/fast/dom/Document/document-write-doctype.html
-/sdcard/android/layout_tests/fast/dom/Document/doc-open-while-parsing.html
-/sdcard/android/layout_tests/fast/dom/HTMLSelectElement/named-options.html
-/sdcard/android/layout_tests/fast/dom/HTMLSelectElement/length-not-overridden.html
-/sdcard/android/layout_tests/fast/dom/HTMLSelectElement/options-collection-set-string-length.html
-/sdcard/android/layout_tests/fast/dom/HTMLSelectElement/listbox-select-reset.html
-/sdcard/android/layout_tests/fast/dom/HTMLSelectElement/options-collection-detached.html
-/sdcard/android/layout_tests/fast/dom/HTMLSelectElement/remove-element-from-within-focus-handler-crash.html
-/sdcard/android/layout_tests/fast/dom/Selection/getRangeAt.html
-/sdcard/android/layout_tests/fast/dom/HTMLMetaElement/meta-attributes.html
-/sdcard/android/layout_tests/fast/dom/Element/fixed-position-offset-parent.html
-/sdcard/android/layout_tests/fast/dom/Element/getAttribute-check-case-sensitivity.html
-/sdcard/android/layout_tests/fast/dom/Element/attr-param-typechecking.html
-/sdcard/android/layout_tests/fast/dom/Element/attribute-uppercase.html
-/sdcard/android/layout_tests/fast/dom/Element/element-traversal.html
-/sdcard/android/layout_tests/fast/dom/Element/onclick-case.html
-/sdcard/android/layout_tests/fast/dom/Element/offsetLeft-offsetTop-body-quirk.html
-/sdcard/android/layout_tests/fast/dom/Element/contains-method.html
-/sdcard/android/layout_tests/fast/dom/Element/scrollWidth.html
-/sdcard/android/layout_tests/fast/dom/Element/setAttribute-with-colon.html
-/sdcard/android/layout_tests/fast/dom/Element/setAttribute-case-insensitivity.html
-/sdcard/android/layout_tests/fast/dom/Element/dimension-properties-unrendered.html
-/sdcard/android/layout_tests/fast/dom/Element/offsetLeft-offsetTop-html.html
-/sdcard/android/layout_tests/fast/dom/Element/offsetTop-table-cell.html
-/sdcard/android/layout_tests/fast/dom/DOMException/EventException.html
-/sdcard/android/layout_tests/fast/dom/DOMException/prototype-object.html
-/sdcard/android/layout_tests/fast/dom/DOMException/RangeException.html
-/sdcard/android/layout_tests/fast/dom/HTMLButtonElement/value/getset.html
-/sdcard/android/layout_tests/fast/dom/HTMLScriptElement/script-for-attribute-unexpected-execution.html
-/sdcard/android/layout_tests/fast/dom/HTMLScriptElement/script-reexecution.html
-/sdcard/android/layout_tests/fast/dom/HTMLScriptElement/script-set-src.html
-/sdcard/android/layout_tests/fast/dom/HTMLScriptElement/script-load-events.html
-/sdcard/android/layout_tests/fast/dom/HTMLScriptElement/script-decoding-error-after-setting-src.html
-/sdcard/android/layout_tests/fast/dom/HTMLOptionElement/collection-setter-getter.html
-/sdcard/android/layout_tests/fast/dom/HTMLOptionElement/set-option-index-text.html
-/sdcard/android/layout_tests/fast/dom/HTMLOptionElement/option-text.html
-/sdcard/android/layout_tests/fast/dom/HTMLOptionElement/option-prototype.html
-/sdcard/android/layout_tests/fast/dom/NodeList/5725058-crash-scenario-1.html
-/sdcard/android/layout_tests/fast/dom/NodeList/5725058-crash-scenario-2.html
-/sdcard/android/layout_tests/fast/dom/NodeList/childNodes-reset-cache.html
-/sdcard/android/layout_tests/fast/dom/NodeList/5725058-crash-scenario-3.html
-/sdcard/android/layout_tests/fast/dom/NodeList/invalidate-node-lists-when-parsing.html
-/sdcard/android/layout_tests/fast/dom/NodeList/item-by-id-with-no-document.html
-/sdcard/android/layout_tests/fast/dom/NodeList/nodelist-item-with-name.html
-/sdcard/android/layout_tests/fast/dom/DOMImplementation/createDocument-namespace-err.html
-/sdcard/android/layout_tests/fast/dom/DOMImplementation/createDocumentType-err.html
-/sdcard/android/layout_tests/fast/dom/CSSStyleDeclaration/transition-property-names.html
-/sdcard/android/layout_tests/fast/dom/CSSStyleDeclaration/css-properties-case-sensitive.html
-/sdcard/android/layout_tests/fast/dom/CSSStyleDeclaration/empty-string-property.html
-/sdcard/android/layout_tests/fast/dom/Node/normalize.html
-/sdcard/android/layout_tests/fast/dom/Node/initial-values.html
-/sdcard/android/layout_tests/fast/dom/Node/DOMNodeRemovedEvent.html
-/sdcard/android/layout_tests/fast/dom/SelectorAPI/viewless-document.html
-/sdcard/android/layout_tests/fast/dom/SelectorAPI/caseID-almost-strict.html
-/sdcard/android/layout_tests/fast/dom/SelectorAPI/elementRoot.html
-/sdcard/android/layout_tests/fast/dom/SelectorAPI/caseID-strict.html
-/sdcard/android/layout_tests/fast/dom/SelectorAPI/not-supported-namespace-in-selector.html
-/sdcard/android/layout_tests/fast/dom/SelectorAPI/id-fastpath.html
-/sdcard/android/layout_tests/fast/dom/SelectorAPI/dumpNodeList.html
-/sdcard/android/layout_tests/fast/dom/SelectorAPI/caseTag.html
-/sdcard/android/layout_tests/fast/dom/SelectorAPI/undefined-null-stringify.html
-/sdcard/android/layout_tests/fast/dom/SelectorAPI/detached-element.html
-/sdcard/android/layout_tests/fast/dom/SelectorAPI/caseID.html
-/sdcard/android/layout_tests/fast/dom/SelectorAPI/bug-17313.html
-/sdcard/android/layout_tests/fast/dom/SelectorAPI/id-fastpath-almost-strict.html
-/sdcard/android/layout_tests/fast/dom/SelectorAPI/id-fastpath-strict.html
-/sdcard/android/layout_tests/fast/dom/SelectorAPI/dumpNodeList-almost-strict.html
-/sdcard/android/layout_tests/fast/dom/HTMLTableSectionElement/rows.html
-/sdcard/android/layout_tests/fast/dom/HTMLInputElement/checked-pseudo-selector.html
-/sdcard/android/layout_tests/fast/dom/HTMLInputElement/input-text-reset.html
-/sdcard/android/layout_tests/fast/dom/HTMLInputElement/size-as-number.html
-/sdcard/android/layout_tests/fast/dom/HTMLInputElement/duplicate-element-names.html
-/sdcard/android/layout_tests/fast/dom/HTMLInputElement/input-hidden-value.html
-/sdcard/android/layout_tests/fast/dom/HTMLInputElement/input-checked-reset.html
-/sdcard/android/layout_tests/fast/dom/HTMLInputElement/size-attribute.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/array/001.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/array/002.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/array/003.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/array/004.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/002.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/012.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/004.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/014.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/006.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/008.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/dumpNodeList.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/001.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/003.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/013.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/005.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/015.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/007.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/009.html
-/sdcard/android/layout_tests/fast/dom/TreeWalker/TreeWalker-currentNode.html
-/sdcard/android/layout_tests/fast/dom/HTMLDivElement/align/getset.html
-/sdcard/android/layout_tests/fast/dom/Text/replaceWholeText.html
-/sdcard/android/layout_tests/fast/dom/HTMLFormElement/adopt-assertion.html
-/sdcard/android/layout_tests/fast/dom/HTMLFormElement/document-deactivation-callback-crash.html
-/sdcard/android/layout_tests/fast/dom/HTMLFormElement/htmlformelement-indexed-getter.html
-/sdcard/android/layout_tests/fast/dom/HTMLFormElement/elements-not-in-document.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/window-override-window-using-defineGetter.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/window-override-location-using-defineGetter.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/location-override-valueOf-using-with.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/location-override-valueOf-on-proto-using-defineGetter.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/window-shadow-location-using-string.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/location-override-valueOf-on-proto-using-with.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/location-override-toString.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/location-override-valueOf-on-proto.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/window-shadow-window-using-js-object-with-location-field.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/window-shadow-location-using-js-object-with-toString.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/location-override-toString-using-defineGetter.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/location-override-valueOf.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/location-override-toString-using-with.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/location-override-toString-on-proto-using-defineGetter.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/location-override-toString-on-proto-using-with.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/location-override-toString-on-proto.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/location-override-valueOf-using-defineGetter.html
-/sdcard/android/layout_tests/fast/dom/Window/window-closed-crash.html
-/sdcard/android/layout_tests/fast/dom/Window/window-function-name-getter-precedence.html
-/sdcard/android/layout_tests/fast/dom/Window/window-open-self.html
-/sdcard/android/layout_tests/fast/dom/Window/console-functions.html
-/sdcard/android/layout_tests/fast/dom/Window/window-postmessage-args.html
-/sdcard/android/layout_tests/fast/dom/Window/attr-constructor.html
-/sdcard/android/layout_tests/fast/dom/Window/window-remove-event-listener.html
-/sdcard/android/layout_tests/fast/dom/Window/window-frames-self-referential.html
-/sdcard/android/layout_tests/fast/dom/Window/redirect-with-timer.html
-/sdcard/android/layout_tests/fast/dom/Window/setting-properties-on-closed-window.html
-/sdcard/android/layout_tests/fast/dom/Window/window-open-parent.html
-/sdcard/android/layout_tests/fast/dom/Window/window-access-after-navigation.html
-/sdcard/android/layout_tests/fast/dom/Window/window-appendages-cleared.html
-/sdcard/android/layout_tests/fast/dom/Window/window-special-properties.html
-/sdcard/android/layout_tests/fast/dom/Window/window-custom-prototype.html
-/sdcard/android/layout_tests/fast/dom/Window/window-collection-length-no-crash.html
-/sdcard/android/layout_tests/fast/dom/Window/setTimeout-no-arguments.html
-/sdcard/android/layout_tests/fast/dom/Window/getMatchedCSSRules-null-crash.html
-/sdcard/android/layout_tests/fast/dom/Window/window-open-self-from-other-frame.html
-/sdcard/android/layout_tests/fast/dom/Window/window-custom-prototype-crash.html
-/sdcard/android/layout_tests/fast/dom/Window/setTimeout-string-argument.html
-/sdcard/android/layout_tests/fast/dom/Window/window-object-cross-frame-calls.html
-/sdcard/android/layout_tests/fast/dom/Window/window-location-replace-functions.html
-/sdcard/android/layout_tests/fast/dom/Window/dispatchEvent.html
-/sdcard/android/layout_tests/fast/dom/Window/window-function-frame-getter-precedence.html
-/sdcard/android/layout_tests/fast/dom/Window/atob-btoa.html
-/sdcard/android/layout_tests/fast/dom/Window/clear-timeout.html
-/sdcard/android/layout_tests/fast/dom/Window/window-early-properties-xhr.html
-/sdcard/android/layout_tests/fast/dom/Window/window-property-clearing.html
-/sdcard/android/layout_tests/fast/dom/Window/element-constructors-on-window.html
-/sdcard/android/layout_tests/fast/dom/Window/orphaned-frame-access.html
-/sdcard/android/layout_tests/fast/dom/Window/window-open-pending-url.html
-/sdcard/android/layout_tests/fast/dom/Window/window-resize-and-move-sub-frame.html
-/sdcard/android/layout_tests/fast/dom/Window/console-trace.html
-/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/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/customized-property-survives-gc.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
-/sdcard/android/layout_tests/fast/dom/HTMLTableRowElement/insertCell.html
-/sdcard/android/layout_tests/fast/dom/HTMLFontElement/size-attribute.html
-/sdcard/android/layout_tests/fast/dom/HTMLObjectElement/form/test1.html
-/sdcard/android/layout_tests/fast/dom/HTMLObjectElement/object-as-frame.html
-/sdcard/android/layout_tests/fast/dom/HTMLElement/innerHTML-selection-crash.html
-/sdcard/android/layout_tests/fast/dom/HTMLElement/set-inner-outer-optimization.html
-/sdcard/android/layout_tests/fast/dom/Range/compareBoundaryPoints-1.html
-/sdcard/android/layout_tests/fast/dom/Range/range-compareNode.html
-/sdcard/android/layout_tests/fast/dom/Range/range-comparePoint.html
-/sdcard/android/layout_tests/fast/dom/Range/acid3-surround-contents.html
-/sdcard/android/layout_tests/fast/dom/Range/mutation.html
-/sdcard/android/layout_tests/fast/dom/Range/deleted-range-endpoints.html
-/sdcard/android/layout_tests/fast/dom/Range/13000.html
-/sdcard/android/layout_tests/fast/dom/Range/range-processing-instructions.html
-/sdcard/android/layout_tests/fast/dom/Range/range-insertNode-separate-endContainer.html
-/sdcard/android/layout_tests/fast/dom/Range/range-intersectsNode.html
-/sdcard/android/layout_tests/fast/dom/Range/range-isPointInRange.html
-/sdcard/android/layout_tests/fast/dom/Range/compareBoundaryPoints-2.html
-/sdcard/android/layout_tests/fast/dom/Range/range-clone-empty.html
-/sdcard/android/layout_tests/fast/dom/Range/range-modifycontents.html
-/sdcard/android/layout_tests/fast/dom/Range/bug-19527.html
-/sdcard/android/layout_tests/fast/dom/Range/range-insertNode-splittext.html
-/sdcard/android/layout_tests/fast/dom/Range/surroundContents-check-boundary-points.html
-/sdcard/android/layout_tests/fast/dom/Range/range-exceptions.html
-/sdcard/android/layout_tests/fast/dom/HTMLHeadElement/head-check.html
-/sdcard/android/layout_tests/fast/dom/HTMLHtmlElement/set-version.html
-/sdcard/android/layout_tests/fast/dom/HTMLHtmlElement/duplicate-html-element-crash.html
-/sdcard/android/layout_tests/fast/dom/HTMLImageElement/image-lowsrc-getset.html
-/sdcard/android/layout_tests/fast/dom/HTMLImageElement/image-src-absolute-url.html
-/sdcard/android/layout_tests/fast/dom/HTMLImageElement/image-loading-gc.html
-/sdcard/android/layout_tests/fast/dom/HTMLImageElement/image-longdesc-absolute-url.html
-/sdcard/android/layout_tests/fast/dom/HTMLImageElement/constructor-mutation-event-dispatch.html
-/sdcard/android/layout_tests/fast/dom/HTMLImageElement/image-load-cross-document.html
-/sdcard/android/layout_tests/fast/dom/HTMLImageElement/image-without-renderer-width.html
-/sdcard/android/layout_tests/fast/dom/HTMLImageElement/image-natural-width-height.html
-/sdcard/android/layout_tests/fast/dom/StyleSheet/ownerNode-lifetime.html
-/sdcard/android/layout_tests/fast/dom/EntityReference/readonly-exceptions.html
-/sdcard/android/layout_tests/fast/dom/script-element-remove-self.html
-/sdcard/android/layout_tests/fast/dom/remove-named-attribute-crash.html
-/sdcard/android/layout_tests/fast/dom/style-sheet-candidate-remove-unrendered-document.html
-/sdcard/android/layout_tests/fast/dom/node-item.html
-/sdcard/android/layout_tests/fast/dom/clone-node-style.html
-/sdcard/android/layout_tests/fast/dom/script-element-without-frame-crash.html
-/sdcard/android/layout_tests/fast/dom/script-element-gc.html
-/sdcard/android/layout_tests/fast/dom/empty-hash-and-search.html
-/sdcard/android/layout_tests/fast/dom/duplicate-ids.html
-/sdcard/android/layout_tests/fast/dom/prototypes.html
-/sdcard/android/layout_tests/fast/dom/clone-node-form-elements.html
-/sdcard/android/layout_tests/fast/dom/import-attribute-node.html
-/sdcard/android/layout_tests/fast/dom/getter-on-window-object2.html
-/sdcard/android/layout_tests/fast/dom/objc-big-method-name.html
-/sdcard/android/layout_tests/fast/dom/importNode-prefix.html
-/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/cssTarget-crash.html
-/sdcard/android/layout_tests/fast/dom/DOMParser-assign-variable.html
-/sdcard/android/layout_tests/fast/dom/offset-parent-positioned-and-inline.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/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/select-selectedIndex-multiple.html
-/sdcard/android/layout_tests/fast/dom/importNode-null.html
-/sdcard/android/layout_tests/fast/dom/space-to-text.html
-/sdcard/android/layout_tests/fast/dom/css-set-property-exception.html
-/sdcard/android/layout_tests/fast/dom/java-applet-calls.html
-/sdcard/android/layout_tests/fast/dom/plugin-attributes-enumeration.html
-/sdcard/android/layout_tests/fast/dom/html-attribute-types.html
-/sdcard/android/layout_tests/fast/dom/resource-locations-in-created-html-document.html
-/sdcard/android/layout_tests/fast/dom/comment-document-fragment.html
-/sdcard/android/layout_tests/fast/dom/createAttribute-exception.html
-/sdcard/android/layout_tests/fast/dom/noscript-style.html
-/sdcard/android/layout_tests/fast/dom/serialize-cdata.html
-/sdcard/android/layout_tests/fast/dom/createDocument.html
-/sdcard/android/layout_tests/fast/dom/getelementbyname-invalidation.html
-/sdcard/android/layout_tests/fast/dom/setAttributeNS-empty-namespace.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/inner-text-rtl.html
-/sdcard/android/layout_tests/fast/dom/createDocument-empty.html
-/sdcard/android/layout_tests/fast/dom/documenturi-assigned-junk-implies-baseuri-null.html
-/sdcard/android/layout_tests/fast/dom/option-properties.html
-/sdcard/android/layout_tests/fast/dom/background-shorthand-csstext.html
-/sdcard/android/layout_tests/fast/dom/Range-insertNode-crash.html
-/sdcard/android/layout_tests/fast/dom/NamedNodeMap-setNamedItem-crash.html
-/sdcard/android/layout_tests/fast/dom/early-frame-url.html
-/sdcard/android/layout_tests/fast/dom/everything-to-string.html
-/sdcard/android/layout_tests/fast/dom/attribute-empty-value-no-children.html
-/sdcard/android/layout_tests/fast/dom/length-attribute-mapping.html
-/sdcard/android/layout_tests/fast/dom/documenturi-loses-to-base-tag.html
-/sdcard/android/layout_tests/fast/dom/createDocumentType2.html
-/sdcard/android/layout_tests/fast/dom/gc-6.html
-/sdcard/android/layout_tests/fast/dom/attribute-case-sensitivity.html
-/sdcard/android/layout_tests/fast/dom/compatMode-Compat.html
-/sdcard/android/layout_tests/fast/dom/namespaces-1.html
-/sdcard/android/layout_tests/fast/dom/getter-on-window-object.html
-/sdcard/android/layout_tests/fast/dom/constructors-overriding.html
-/sdcard/android/layout_tests/fast/dom/defaultView.html
-/sdcard/android/layout_tests/fast/dom/collection-null-like-arguments.html
-/sdcard/android/layout_tests/fast/dom/gc-3.html
-/sdcard/android/layout_tests/fast/dom/event-attribute-availability.html
-/sdcard/android/layout_tests/fast/dom/select-selectedIndex.html
-/sdcard/android/layout_tests/fast/dom/compatMode-Strict.html
-/sdcard/android/layout_tests/fast/dom/attribute-downcast-right.html
-/sdcard/android/layout_tests/fast/dom/document-all-select.html
-/sdcard/android/layout_tests/fast/dom/wrapper-context.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
-/sdcard/android/layout_tests/fast/dom/dir-no-body.html
-/sdcard/android/layout_tests/fast/dom/null-document-window-open-crash.html
-/sdcard/android/layout_tests/fast/dom/css-RGBValue.html
-/sdcard/android/layout_tests/fast/dom/documentElement-null.html
-/sdcard/android/layout_tests/fast/dom/innerHTML-nbsp.html
-/sdcard/android/layout_tests/fast/dom/createElementNS-empty-namespace.html
-/sdcard/android/layout_tests/fast/dom/class-all-whitespace.html
-/sdcard/android/layout_tests/fast/dom/wrapper-identity.html
-/sdcard/android/layout_tests/fast/dom/null-document-location-assign-crash.html
-/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/css-shortHands.html
-/sdcard/android/layout_tests/fast/dom/generic-form-element-assert.html
-/sdcard/android/layout_tests/fast/dom/dom-instanceof.html
-/sdcard/android/layout_tests/fast/dom/array-special-accessors-should-ignore-items.html
-/sdcard/android/layout_tests/fast/dom/element-attribute-js-null.html
-/sdcard/android/layout_tests/fast/dom/css-dom-read-2.html
-/sdcard/android/layout_tests/fast/dom/navigator-cookieEnabled-no-crash.html
-/sdcard/android/layout_tests/fast/dom/import-document-fragment.html
-/sdcard/android/layout_tests/fast/dom/setter-type-enforcement.html
-/sdcard/android/layout_tests/fast/dom/XMLSerializer.html
-/sdcard/android/layout_tests/fast/dom/navigator-vendorSub.html
-/sdcard/android/layout_tests/fast/dom/outerText-no-element.html
-/sdcard/android/layout_tests/fast/dom/replace-child-siblings.html
-/sdcard/android/layout_tests/fast/dom/xmlhttprequest-constructor-in-detached-document.html
-/sdcard/android/layout_tests/fast/dom/constants.html
-/sdcard/android/layout_tests/fast/dom/inner-text-with-no-renderer.html
-/sdcard/android/layout_tests/fast/dom/gc-7.html
-/sdcard/android/layout_tests/fast/dom/onerror-img.html
-/sdcard/android/layout_tests/fast/dom/document-attribute-js-null.html
-/sdcard/android/layout_tests/fast/dom/css-element-attribute-js-null.html
-/sdcard/android/layout_tests/fast/dom/gc-11.html
-/sdcard/android/layout_tests/fast/dom/mutation-event-remove-inserted-node.html
-/sdcard/android/layout_tests/fast/dom/constructors-cached.html
-/sdcard/android/layout_tests/fast/dom/null-chardata-crash.html
-/sdcard/android/layout_tests/fast/dom/compatMode-AlmostStrict.html
-/sdcard/android/layout_tests/fast/dom/createElement-with-column.html
-/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
-/sdcard/android/layout_tests/fast/dom/createElementNS.html
-/sdcard/android/layout_tests/fast/dom/undetectable-document-all.html
-/sdcard/android/layout_tests/fast/dom/prototype-chain.html
-/sdcard/android/layout_tests/fast/dom/gc-1.html
-/sdcard/android/layout_tests/fast/dom/script-add.html
-/sdcard/android/layout_tests/fast/dom/select-selectedIndex-bug-12942.html
-/sdcard/android/layout_tests/fast/dom/text-control-crash-on-select.html
-/sdcard/android/layout_tests/fast/dom/frame-contentWindow-crash.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/domListEnumeration.html
-/sdcard/android/layout_tests/fast/dom/destroy-selected-radio-button-crash.html
-/sdcard/android/layout_tests/fast/dom/tabindex-clamp.html
-/sdcard/android/layout_tests/fast/dom/iframe-contentWindow-crash.html
-/sdcard/android/layout_tests/fast/dom/comment-dom-node.html
-/sdcard/android/layout_tests/fast/dom/constructors-cached-navigate.html
-/sdcard/android/layout_tests/fast/dom/features.html
-/sdcard/android/layout_tests/fast/dom/canvasContext2d-element-attribute-js-null.html
-/sdcard/android/layout_tests/fast/dom/remove-style-element.html
-/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-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/dom/cloneNode.html
-/sdcard/android/layout_tests/fast/dom/onload-open.html
-/sdcard/android/layout_tests/fast/gradients/crash-on-remove.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/HTMLOptionElement_selected.html
-/sdcard/android/layout_tests/fast/forms/option-value-and-label.html
-/sdcard/android/layout_tests/fast/forms/menulist-selection-reset.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-customError-001.html
-/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/textarea-trailing-newline.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-patternMismatch-002.html
-/sdcard/android/layout_tests/fast/forms/selection-functions.html
-/sdcard/android/layout_tests/fast/forms/select-no-name.html
-/sdcard/android/layout_tests/fast/forms/multiple-selected-options-innerHTML.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
-/sdcard/android/layout_tests/fast/forms/4628409.html
-/sdcard/android/layout_tests/fast/forms/numeric-input-name.html
-/sdcard/android/layout_tests/fast/forms/activate-and-disabled-elements.html
-/sdcard/android/layout_tests/fast/forms/tabs-with-modifiers.html
-/sdcard/android/layout_tests/fast/forms/form-get-multipart2.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-002.html
-/sdcard/android/layout_tests/fast/forms/menulist-no-renderer-onmousedown.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/willvalidate-007.html
-/sdcard/android/layout_tests/fast/forms/double-focus.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-valueMissing-004.html
-/sdcard/android/layout_tests/fast/forms/form-data-encoding-2.html
-/sdcard/android/layout_tests/fast/forms/inline-ignored-on-legend.html
-/sdcard/android/layout_tests/fast/forms/focus.html
-/sdcard/android/layout_tests/fast/forms/input-text-enter.html
-/sdcard/android/layout_tests/fast/forms/input-implicit-length-limit.html
-/sdcard/android/layout_tests/fast/forms/element-order.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-customError-002.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/ValidityState-patternMismatch-003.html
-/sdcard/android/layout_tests/fast/forms/8250.html
-/sdcard/android/layout_tests/fast/forms/var-name-conflict-in-form-event-handler.html
-/sdcard/android/layout_tests/fast/forms/listbox-select-all.html
-/sdcard/android/layout_tests/fast/forms/range-reset.html
-/sdcard/android/layout_tests/fast/forms/select-remove-option.html
-/sdcard/android/layout_tests/fast/forms/onselect-selectall.html
-/sdcard/android/layout_tests/fast/forms/input-select-webkit-user-select-none.html
-/sdcard/android/layout_tests/fast/forms/paste-multiline-text-input.html
-/sdcard/android/layout_tests/fast/forms/textarea-no-scroll-on-blur.html
-/sdcard/android/layout_tests/fast/forms/select-reset-multiple-selections-4-single-selection.html
-/sdcard/android/layout_tests/fast/forms/tab-in-input.html
-/sdcard/android/layout_tests/fast/forms/button-click-DOM.html
-/sdcard/android/layout_tests/fast/forms/submit-nil-value-field-assert.html
-/sdcard/android/layout_tests/fast/forms/domstring-replace-crash.html
-/sdcard/android/layout_tests/fast/forms/select-max-length.html
-/sdcard/android/layout_tests/fast/forms/form-get-multipart3.html
-/sdcard/android/layout_tests/fast/forms/select-out-of-bounds-index.html
-/sdcard/android/layout_tests/fast/forms/selected-index-assert.html
-/sdcard/android/layout_tests/fast/forms/legend-display-none.html
-/sdcard/android/layout_tests/fast/forms/form-collection-lookup.html
-/sdcard/android/layout_tests/fast/forms/autofocus-opera-004.html
-/sdcard/android/layout_tests/fast/forms/select-list-box-mouse-focus.html
-/sdcard/android/layout_tests/fast/forms/willvalidate-008.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-valueMissing-005.html
-/sdcard/android/layout_tests/fast/forms/required-attribute-001.html
-/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/ValidityState-customError-003.html
-/sdcard/android/layout_tests/fast/forms/input-selection-hidden.html
-/sdcard/android/layout_tests/fast/forms/willvalidate-002.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-patternMismatch-004.html
-/sdcard/android/layout_tests/fast/forms/select-set-inner.html
-/sdcard/android/layout_tests/fast/forms/input-appearance-elementFromPoint.html
-/sdcard/android/layout_tests/fast/forms/missing-action.html
-/sdcard/android/layout_tests/fast/forms/listbox-typeahead-empty.html
-/sdcard/android/layout_tests/fast/forms/submit-to-url-fragment.html
-/sdcard/android/layout_tests/fast/forms/autofocus-opera-005.html
-/sdcard/android/layout_tests/fast/forms/willvalidate-009.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-valueMissing-006.html
-/sdcard/android/layout_tests/fast/forms/old-names.html
-/sdcard/android/layout_tests/fast/forms/required-attribute-002.html
-/sdcard/android/layout_tests/fast/forms/add-and-remove-option.html
-/sdcard/android/layout_tests/fast/forms/focus-style-pending.html
-/sdcard/android/layout_tests/fast/forms/textarea-initial-caret-position.html
-/sdcard/android/layout_tests/fast/forms/input-type-change-in-onfocus-mouse.html
-/sdcard/android/layout_tests/fast/forms/mutation-event-recalc.html
-/sdcard/android/layout_tests/fast/forms/slow-click.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-customError-004.html
-/sdcard/android/layout_tests/fast/forms/autofocus-attribute.html
-/sdcard/android/layout_tests/fast/forms/element-by-name.html
-/sdcard/android/layout_tests/fast/forms/willvalidate-003.html
-/sdcard/android/layout_tests/fast/forms/radio-button-no-change-event.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-patternMismatch-005.html
-/sdcard/android/layout_tests/fast/forms/input-maxlength.html
-/sdcard/android/layout_tests/fast/forms/select-reset.html
-/sdcard/android/layout_tests/fast/forms/input-hit-test-border.html
-/sdcard/android/layout_tests/fast/forms/pattern-attribute-001.html
-/sdcard/android/layout_tests/fast/forms/range-default-value.html
-/sdcard/android/layout_tests/fast/forms/shadow-tree-exposure.html
-/sdcard/android/layout_tests/fast/forms/paste-into-textarea.html
-/sdcard/android/layout_tests/fast/forms/radio-no-theme-padding.html
-/sdcard/android/layout_tests/fast/forms/textfield-drag-into-disabled.html
-/sdcard/android/layout_tests/fast/forms/autofocus-opera-006.html
-/sdcard/android/layout_tests/fast/forms/saved-state-adoptNode-crash.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-valueMissing-007.html
-/sdcard/android/layout_tests/fast/forms/radio-check-click-and-drag.html
-/sdcard/android/layout_tests/fast/forms/11423.html
-/sdcard/android/layout_tests/fast/forms/cursor-position.html
-/sdcard/android/layout_tests/fast/forms/input-changing-value.html
-/sdcard/android/layout_tests/fast/forms/willvalidate-004.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-valueMissing-001.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-patternMismatch-006.html
-/sdcard/android/layout_tests/fast/forms/button-in-forms-collection.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/option-constructor-selected.html
-/sdcard/android/layout_tests/fast/forms/input-multiple.html
-/sdcard/android/layout_tests/fast/forms/input-zero-height-focus.html
-/sdcard/android/layout_tests/fast/forms/pattern-attribute-002.html
-/sdcard/android/layout_tests/fast/forms/textarea-linewrap-dynamic.html
-/sdcard/android/layout_tests/fast/forms/placeholder-dom-property.html
-/sdcard/android/layout_tests/fast/forms/select-width-font-change.html
-/sdcard/android/layout_tests/fast/forms/text-field-setvalue-crash.html
-/sdcard/android/layout_tests/fast/forms/form-get-multipart.html
-/sdcard/android/layout_tests/fast/forms/autofocus-opera-007.html
-/sdcard/android/layout_tests/fast/forms/select-type-ahead-list-box-no-selection.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-valueMissing-008.html
-/sdcard/android/layout_tests/fast/forms/textarea-crlf.html
-/sdcard/android/layout_tests/fast/forms/remove-radio-button-assert.html
-/sdcard/android/layout_tests/fast/forms/text-set-value-crash.html
-/sdcard/android/layout_tests/fast/forms/autofocus-opera-001.html
-/sdcard/android/layout_tests/fast/forms/select-namedItem.html
-/sdcard/android/layout_tests/fast/forms/willvalidate-005.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-valueMissing-002.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-patternMismatch-007.html
-/sdcard/android/layout_tests/fast/forms/add-remove-option-modification-event.html
-/sdcard/android/layout_tests/fast/forms/input-type-change-in-onfocus-keyboard.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/pattern-attribute-003.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-patternMismatch-001.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/add-remove-form-elements-stress-test.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-valueMissing-009.html
-/sdcard/android/layout_tests/fast/forms/textarea-setvalue-without-renderer.html
-/sdcard/android/layout_tests/fast/forms/hidden-input-not-enabled.html
-/sdcard/android/layout_tests/fast/forms/input-appearance-maxlength.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-001.html
-/sdcard/android/layout_tests/fast/forms/submit-with-base.html
-/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/textarea-appearance-wrap.html
-/sdcard/android/layout_tests/fast/forms/add-selected-option.html
-/sdcard/android/layout_tests/fast/forms/willvalidate-006.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-valueMissing-003.html
-/sdcard/android/layout_tests/fast/forms/textarea-hard-linewrap-empty.html
-/sdcard/android/layout_tests/fast/forms/document-write.html
-/sdcard/android/layout_tests/fast/table/incomplete-table-in-fragment-hang.html
-/sdcard/android/layout_tests/fast/table/section-in-table-before-misnested-text-crash-css.html
-/sdcard/android/layout_tests/fast/table/large-rowspan-crash.html
-/sdcard/android/layout_tests/fast/table/colgroup-relative.html
-/sdcard/android/layout_tests/fast/table/border-changes.html
-/sdcard/android/layout_tests/fast/table/table-row-compositing-repaint-crash.html
-/sdcard/android/layout_tests/fast/table/cell-in-row-before-misnested-text-crash-css.html
-/sdcard/android/layout_tests/fast/table/incomplete-table-in-fragment-2.html
-/sdcard/android/layout_tests/fast/table/rowindex-comment-nodes.html
-/sdcard/android/layout_tests/fast/table/td-display-nowrap.html
-/sdcard/android/layout_tests/fast/table/row-in-tbody-before-misnested-text-crash-css.html
-/sdcard/android/layout_tests/fast/table/empty-auto-column-zero-divide.html
-/sdcard/android/layout_tests/fast/table/form-in-tbody-before-misnested-text-crash-css.html
-/sdcard/android/layout_tests/fast/table/form-in-table-before-misnested-text-crash-css.html
-/sdcard/android/layout_tests/fast/table/destroy-cell-with-selection-crash.html
-/sdcard/android/layout_tests/fast/table/form-in-row-before-misnested-text-crash-css.html
-/sdcard/android/layout_tests/fast/css/counters/counter-function-input-2.html
-/sdcard/android/layout_tests/fast/css/counters/counter-function-input.html
-/sdcard/android/layout_tests/fast/css/counters/counter-number-input.html
-/sdcard/android/layout_tests/fast/css/variables/color-hex-test.html
-/sdcard/android/layout_tests/fast/css/variables/invalid-identifier.html
-/sdcard/android/layout_tests/fast/css/getComputedStyle/computed-style-negative-top.html
-/sdcard/android/layout_tests/fast/css/getComputedStyle/getComputedStyle-borderRadius.html
-/sdcard/android/layout_tests/fast/css/getComputedStyle/getComputedStyle-background-size.html
-/sdcard/android/layout_tests/fast/css/getComputedStyle/getComputedStyle-border-image.html
-/sdcard/android/layout_tests/fast/css/getComputedStyle/getComputedStyle-border-spacing.html
-/sdcard/android/layout_tests/fast/css/getComputedStyle/computed-style-font-family.html
-/sdcard/android/layout_tests/fast/css/getComputedStyle/getComputedStyle-zIndex-auto.html
-/sdcard/android/layout_tests/fast/css/getComputedStyle/getComputedStyle-transform.html
-/sdcard/android/layout_tests/fast/css/getComputedStyle/computed-style-display-none.html
-/sdcard/android/layout_tests/fast/css/getComputedStyle/getComputedStyle-background-position.html
-/sdcard/android/layout_tests/fast/css/getComputedStyle/getComputedStyle-text-overflow.html
-/sdcard/android/layout_tests/fast/css/getComputedStyle/getComputedStyle-border-box.html
-/sdcard/android/layout_tests/fast/css/getComputedStyle/getComputedStyle-relayout.html
-/sdcard/android/layout_tests/fast/css/getComputedStyle/getComputedStyle-text-decoration.html
-/sdcard/android/layout_tests/fast/css/media-rule-dyn.html
-/sdcard/android/layout_tests/fast/css/transform-function-lowercase-assert.html
-/sdcard/android/layout_tests/fast/css/word-break-user-modify-allowed-values.html
-/sdcard/android/layout_tests/fast/css/import-style-update.html
-/sdcard/android/layout_tests/fast/css/outline-invert-assertion.html
-/sdcard/android/layout_tests/fast/css/insertRule-font-face.html
-/sdcard/android/layout_tests/fast/css/readonly-pseudoclass-opera-004.html
-/sdcard/android/layout_tests/fast/css/zoom-in-length-round-trip.html
-/sdcard/android/layout_tests/fast/css/transform-inline-style-remove.html
-/sdcard/android/layout_tests/fast/css/padding-no-renderer.html
-/sdcard/android/layout_tests/fast/css/transition_shorthand_parsing.html
-/sdcard/android/layout_tests/fast/css/css-selector-text.html
-/sdcard/android/layout_tests/fast/css/dashboard-regions-attr-crash.html
-/sdcard/android/layout_tests/fast/css/readonly-pseudoclass-opera-001.html
-/sdcard/android/layout_tests/fast/css/pseudo-required-optional-006.html
-/sdcard/android/layout_tests/fast/css/font-property-priority.html
-/sdcard/android/layout_tests/fast/css/number-parsing-crash.html
-/sdcard/android/layout_tests/fast/css/device-aspect-ratio.html
-/sdcard/android/layout_tests/fast/css/pseudostyle-anonymous-text.html
-/sdcard/android/layout_tests/fast/css/css-properties-case-insensitive.html
-/sdcard/android/layout_tests/fast/css/sheet-collection-link.html
-/sdcard/android/layout_tests/fast/css/pseudo-required-optional-003.html
-/sdcard/android/layout_tests/fast/css/resize-value-compared.html
-/sdcard/android/layout_tests/fast/css/font-face-descriptor-multiple-values-parsing.html
-/sdcard/android/layout_tests/fast/css/hexColor-isDigit-assert.html
-/sdcard/android/layout_tests/fast/css/transform-inline-style.html
-/sdcard/android/layout_tests/fast/css/child-selector-implicit-tbody.html
-/sdcard/android/layout_tests/fast/css/outline-hidden-illegal-value.html
-/sdcard/android/layout_tests/fast/css/emptyStyleTag.html
-/sdcard/android/layout_tests/fast/css/stale-style-selector-crash-1.html
-/sdcard/android/layout_tests/fast/css/display-none-inline-style-change-crash.html
-/sdcard/android/layout_tests/fast/css/getPropertyValue-clip.html
-/sdcard/android/layout_tests/fast/css/border-image-crash.html
-/sdcard/android/layout_tests/fast/css/readonly-pseudoclass-opera-005.html
-/sdcard/android/layout_tests/fast/css/insertRule-media.html
-/sdcard/android/layout_tests/fast/css/html-attr-case-sensitivity.html
-/sdcard/android/layout_tests/fast/css/font-face-multiple-families.html
-/sdcard/android/layout_tests/fast/css/getPropertyValue-border.html
-/sdcard/android/layout_tests/fast/css/readonly-pseudoclass-opera-002.html
-/sdcard/android/layout_tests/fast/css/invalid-rule-value.html
-/sdcard/android/layout_tests/fast/css/max-device-aspect-ratio.html
-/sdcard/android/layout_tests/fast/css/background-currentcolor.html
-/sdcard/android/layout_tests/fast/css/pseudo-required-optional-004.html
-/sdcard/android/layout_tests/fast/css/orphaned_units_crash.html
-/sdcard/android/layout_tests/fast/css/invalid-cursor-property-crash.html
-/sdcard/android/layout_tests/fast/css/sheet-title.html
-/sdcard/android/layout_tests/fast/css/large-list-of-rules-crash.html
-/sdcard/android/layout_tests/fast/css/pseudo-required-optional-001.html
-/sdcard/android/layout_tests/fast/css/background-position-serialize.html
-/sdcard/android/layout_tests/fast/css/stale-style-selector-crash-2.html
-/sdcard/android/layout_tests/fast/css/webkit-marquee-speed-unit-in-quirksmode.html
-/sdcard/android/layout_tests/fast/css/CSSPrimitiveValue-exceptions.html
-/sdcard/android/layout_tests/fast/css/empty-script.html
-/sdcard/android/layout_tests/fast/css/mask-missing-image-crash.html
-/sdcard/android/layout_tests/fast/css/parse-timing-function-crash.html
-/sdcard/android/layout_tests/fast/css/background-position-inherit.html
-/sdcard/android/layout_tests/fast/css/readonly-pseudoclass-opera-003.html
-/sdcard/android/layout_tests/fast/css/font-family-builtins.html
-/sdcard/android/layout_tests/fast/css/remove-shorthand.html
-/sdcard/android/layout_tests/fast/css/overflow-property.html
-/sdcard/android/layout_tests/fast/css/pseudo-required-optional-005.html
-/sdcard/android/layout_tests/fast/css/min-device-aspect-ratio.html
-/sdcard/android/layout_tests/fast/css/nested-rule-parent-sheet.html
-/sdcard/android/layout_tests/fast/css/case-transform.html
-/sdcard/android/layout_tests/fast/css/number-parsing-crash-2.html
-/sdcard/android/layout_tests/fast/css/matrix-as-function-crash.html
-/sdcard/android/layout_tests/fast/css/pseudo-required-optional-002.html
-/sdcard/android/layout_tests/fast/css/attr-parsing.html
-/sdcard/android/layout_tests/fast/css/font-family-initial.html
-/sdcard/android/layout_tests/fast/css/small-caps-crash.html
-/sdcard/android/layout_tests/fast/css/max-height-and-max-width.html
-/sdcard/android/layout_tests/fast/css/legacy-opacity-styles.html
-/sdcard/android/layout_tests/fast/css/transition-timing-function.html
-/sdcard/android/layout_tests/fast/block/positioning/absolute-in-inline-rtl-4.html
-/sdcard/android/layout_tests/fast/block/float/selection-gap-clip-out-tiger-crash.html
-/sdcard/android/layout_tests/fast/block/float/crash-on-absolute-positioning.html
-/sdcard/android/layout_tests/fast/block/float/crash-replaced-display-block.html
-/sdcard/android/layout_tests/fast/parser/implicit-head-in-fragment-crash.html
-/sdcard/android/layout_tests/fast/parser/smart-quotes-in-tag.html
-/sdcard/android/layout_tests/fast/parser/entity-comment-in-iframe.html
-/sdcard/android/layout_tests/fast/parser/remove-node-stack.html
-/sdcard/android/layout_tests/fast/parser/remove-current-node-parent.html
-/sdcard/android/layout_tests/fast/parser/entity-end-iframe-tag.html
-/sdcard/android/layout_tests/fast/parser/nsup-entity.html
-/sdcard/android/layout_tests/fast/parser/block-nesting-cap.html
-/sdcard/android/layout_tests/fast/parser/residual-style-close-across-n-blocks.html
-/sdcard/android/layout_tests/fast/parser/tag-with-exclamation-point.html
-/sdcard/android/layout_tests/fast/parser/p-in-scope-strict.html
-/sdcard/android/layout_tests/fast/parser/entity-end-style-tag.html
-/sdcard/android/layout_tests/fast/parser/entity-end-xmp-tag.html
-/sdcard/android/layout_tests/fast/parser/external-entities.xml
-/sdcard/android/layout_tests/fast/parser/head-comment.html
-/sdcard/android/layout_tests/fast/parser/test-unicode-characters-in-attribute-name.html
-/sdcard/android/layout_tests/fast/parser/entity-end-textarea-tag.html
-/sdcard/android/layout_tests/fast/parser/script-tag-with-trailing-slash.html
-/sdcard/android/layout_tests/fast/parser/empty-text-resource.html
-/sdcard/android/layout_tests/fast/parser/comment-in-title.html
-/sdcard/android/layout_tests/fast/parser/residual-style-close-across-removed-block.html
-/sdcard/android/layout_tests/fast/parser/entity-comment-in-title.html
-/sdcard/android/layout_tests/fast/parser/entity-end-title-tag.html
-/sdcard/android/layout_tests/fast/parser/head-content-after-head-removal.html
-/sdcard/android/layout_tests/fast/parser/pre-first-line-break.html
-/sdcard/android/layout_tests/fast/parser/number-sign-in-map-name.html
-/sdcard/android/layout_tests/fast/parser/input-textarea-inside-select-element.html
-/sdcard/android/layout_tests/fast/parser/entity-end-script-tag.html
-/sdcard/android/layout_tests/fast/parser/area-in-div.html
-/sdcard/android/layout_tests/fast/parser/entity-surrogate-pairs.html
-/sdcard/android/layout_tests/fast/parser/eightdigithexentity.html
-/sdcard/android/layout_tests/fast/parser/parse-wbr.html
-/sdcard/android/layout_tests/fast/parser/open-comment-in-script-tricky.html
-/sdcard/android/layout_tests/fast/parser/head-element-for-yahoo-player.html
-/sdcard/android/layout_tests/fast/parser/hex-entities-length.html
-/sdcard/android/layout_tests/fast/parser/html-whitespace.html
-/sdcard/android/layout_tests/fast/parser/script-after-frameset-assert.html
-/sdcard/android/layout_tests/fast/parser/comment-in-iframe.html
-/sdcard/android/layout_tests/fast/parser/duplicate-html-body-element-IDs.html
-/sdcard/android/layout_tests/fast/parser/assertion-empty-attribute.html
-/sdcard/android/layout_tests/fast/parser/comment-in-script-tricky.html
-/sdcard/android/layout_tests/fast/parser/rewrite-form.html
-/sdcard/android/layout_tests/fast/parser/entity-comment-in-script-tricky.html
-/sdcard/android/layout_tests/fast/parser/head-parsing-19517.html
-/sdcard/android/layout_tests/fast/parser/entities-in-html.html
-/sdcard/android/layout_tests/fast/parser/remove-parser-current-node.html
-/sdcard/android/layout_tests/fast/parser/rewrite-map.html
-/sdcard/android/layout_tests/fast/parser/strict-img-in-map.html
-/sdcard/android/layout_tests/fast/parser/p-in-scope.html
-/sdcard/android/layout_tests/fast/layers/removed-by-scroll-handler.html
-/sdcard/android/layout_tests/fast/layers/generated-layer-scrollbar-crash.html
-/sdcard/android/layout_tests/fast/layers/zindex-hit-test.html
-/sdcard/android/layout_tests/fast/layers/resize-layer-deletion-crash.html
-/sdcard/android/layout_tests/fast/history/subframe-is-visited.html
-/sdcard/android/layout_tests/fast/loader/early-load-cancel.html
-/sdcard/android/layout_tests/fast/loader/iframe-recursive-synchronous-load.html
-/sdcard/android/layout_tests/fast/loader/local-css-allowed-in-strict-mode.html
-/sdcard/android/layout_tests/fast/loader/url-strip-cr-lf-tab.html
-/sdcard/android/layout_tests/fast/loader/hashchange-event.html
-/sdcard/android/layout_tests/fast/loader/unloadable-script.html
-/sdcard/android/layout_tests/fast/loader/url-parse-1.html
-/sdcard/android/layout_tests/fast/loader/redirect-with-open-subframe-2.html
-/sdcard/android/layout_tests/fast/loader/simultaneous-reloads-assert.html
-/sdcard/android/layout_tests/fast/loader/invalid-charset-on-script-crashes-loader.html
-/sdcard/android/layout_tests/fast/loader/javascript-url-encoding.html
-/sdcard/android/layout_tests/fast/loader/empty-embed-src-attribute.html
-/sdcard/android/layout_tests/fast/loader/charset-parse.html
-/sdcard/android/layout_tests/fast/loader/meta-refresh-vs-open.html
-/sdcard/android/layout_tests/fast/loader/submit-form-while-parsing-2.html
-/sdcard/android/layout_tests/fast/loader/url-data-replace-backslash.html
-/sdcard/android/layout_tests/fast/loader/redirect-with-open-subframe.html
-/sdcard/android/layout_tests/fast/loader/empty-ref-versus-no-ref.html
-/sdcard/android/layout_tests/fast/loader/javascript-url-encoding-2.html
-/sdcard/android/layout_tests/fast/loader/window-clearing.html
-/sdcard/android/layout_tests/fast/loader/frame-creation-removal.html
-/sdcard/android/layout_tests/fast/loader/external-script-URL-location.html
-/sdcard/android/layout_tests/fast/loader/link-no-URL.html
-/sdcard/android/layout_tests/fast/loader/loadInProgress.html
-/sdcard/android/layout_tests/fast/loader/inherit-charset-to-empty-frame.html
-/sdcard/android/layout_tests/fast/loader/font-face-empty.html
-/sdcard/android/layout_tests/fast/loader/goto-anchor-infinite-layout.html
-/sdcard/android/layout_tests/fast/loader/file-URL-with-port-number.html
-/sdcard/android/layout_tests/fast/xmlhttprequest/xmlhttprequest-default-attributes.html
-/sdcard/android/layout_tests/fast/xmlhttprequest/xmlhttprequest-missing-file-exception.html
-/sdcard/android/layout_tests/fast/xmlhttprequest/xmlhttprequest-invalid-values.html
-/sdcard/android/layout_tests/fast/xmlhttprequest/xmlhttprequest-html-response-encoding.html
-/sdcard/android/layout_tests/fast/xmlhttprequest/null-document-xmlhttprequest-open.html
-/sdcard/android/layout_tests/fast/xmlhttprequest/xmlhttprequest-nonexistent-file.html
-/sdcard/android/layout_tests/fast/xmlhttprequest/xmlhttprequest-open-after-iframe-onload-remove-self.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
-/sdcard/android/layout_tests/fast/canvas/radialGradient-infinite-values.html
-/sdcard/android/layout_tests/fast/canvas/drawImage-with-negative-source-destination.html
-/sdcard/android/layout_tests/fast/canvas/drawImage-with-invalid-args.html
-/sdcard/android/layout_tests/fast/canvas/canvas-stroke-empty-fill.html
-/sdcard/android/layout_tests/fast/canvas/canvas-lineWidth.html
-/sdcard/android/layout_tests/fast/canvas/access-zero-sized-canvas.html
-/sdcard/android/layout_tests/fast/canvas/script-inside-canvas-fallback.html
-/sdcard/android/layout_tests/fast/canvas/unclosed-canvas-2.html
-/sdcard/android/layout_tests/fast/canvas/create-pattern-does-not-crash.html
-/sdcard/android/layout_tests/fast/canvas/gradient-with-clip.html
-/sdcard/android/layout_tests/fast/canvas/canvas-hides-fallback.html
-/sdcard/android/layout_tests/fast/canvas/arc-crash.html
-/sdcard/android/layout_tests/fast/canvas/canvas-modify-emptyPath.html
-/sdcard/android/layout_tests/fast/canvas/unclosed-canvas-4.html
-/sdcard/android/layout_tests/fast/canvas/canvas-invalid-fillstyle.html
-/sdcard/android/layout_tests/fast/canvas/unclosed-canvas-1.html
-/sdcard/android/layout_tests/fast/canvas/toDataURL-noData.html
-/sdcard/android/layout_tests/fast/canvas/canvas-with-incorrect-args.html
-/sdcard/android/layout_tests/fast/canvas/canvas-path-with-inf-nan-dimensions.html
-/sdcard/android/layout_tests/fast/canvas/canvas-radial-gradient-spreadMethod.html
-/sdcard/android/layout_tests/fast/canvas/canvas-set-properties-with-non-invertible-ctm.html
-/sdcard/android/layout_tests/fast/canvas/canvas-invalid-strokestyle.html
-/sdcard/android/layout_tests/fast/canvas/canvas-strokeRect.html
-/sdcard/android/layout_tests/fast/canvas/canvas-composite-alpha.html
-/sdcard/android/layout_tests/fast/canvas/canvas-transparency-and-composite.html
-/sdcard/android/layout_tests/fast/canvas/unclosed-canvas-3.html
-/sdcard/android/layout_tests/fast/canvas/linearGradient-infinite-values.html
-/sdcard/android/layout_tests/fast/canvas/canvas-setTransform.html
-/sdcard/android/layout_tests/fast/frames/frame-set-same-location.html
-/sdcard/android/layout_tests/fast/frames/viewsource-unfinished-tags.html
-/sdcard/android/layout_tests/fast/frames/set-unloaded-frame-location.html
-/sdcard/android/layout_tests/fast/frames/negative-remaining-length-crash.html
-/sdcard/android/layout_tests/fast/frames/frame-name-reset.html
-/sdcard/android/layout_tests/fast/frames/frame-set-same-src.html
-/sdcard/android/layout_tests/fast/frames/crash-removed-iframe.html
-/sdcard/android/layout_tests/fast/frames/empty-frame-document.html
-/sdcard/android/layout_tests/fast/frames/viewsource-plain-text-tags.html
-/sdcard/android/layout_tests/fast/frames/repaint-display-none-crash.html
-/sdcard/android/layout_tests/fast/frames/remove-frame-with-scrollbars-crash.html
-/sdcard/android/layout_tests/fast/frames/cross-site-this.html
-/sdcard/android/layout_tests/fast/frames/onload-remove-iframe-crash.html
-/sdcard/android/layout_tests/fast/frames/iframe-set-inner-html.html
-/sdcard/android/layout_tests/fast/frames/iframe-remove-after-id-change.html
-/sdcard/android/layout_tests/fast/frames/iframe-target.html
-/sdcard/android/layout_tests/fast/frames/viewsource-link-on-href-value.html
-/sdcard/android/layout_tests/fast/frames/hover-timer-crash.html
-/sdcard/android/layout_tests/fast/frames/iframe-no-src-set-location.html
-/sdcard/android/layout_tests/fast/frames/iframe-set-same-src.html
-/sdcard/android/layout_tests/fast/frames/iframe-double-attach.html
-/sdcard/android/layout_tests/fast/frames/iframe-set-same-location.html
-/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/javascript-url-as-framesrc-crash.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/reflections/teardown-crash.html
-/sdcard/android/layout_tests/fast/reflections/reflection-computed-style.html
-/sdcard/android/layout_tests/fast/reflections/reflection-overflow-scroll.html
-/sdcard/android/layout_tests/http/tests/multipart/win-boundary-crash.html
-/sdcard/android/layout_tests/http/tests/multipart/stop-crash.html
-/sdcard/android/layout_tests/http/tests/mime/standard-mode-loads-stylesheet-with-text-css-and-invalid-type.html
-/sdcard/android/layout_tests/http/tests/mime/standard-mode-loads-stylesheet-with-empty-content-type.html
-/sdcard/android/layout_tests/http/tests/mime/standard-mode-loads-stylesheet-with-charset-and-css-extension.html
-/sdcard/android/layout_tests/http/tests/mime/standard-mode-loads-stylesheet-with-charset.html
-/sdcard/android/layout_tests/http/tests/local/style-access-before-stylesheet-loaded.html
-/sdcard/android/layout_tests/http/tests/local/stylesheet-and-script-load-order-http.html
-/sdcard/android/layout_tests/http/tests/local/link-stylesheet-preferred.html
-/sdcard/android/layout_tests/http/tests/local/stylesheet-and-script-load-order.html
-/sdcard/android/layout_tests/http/tests/misc/uncacheable-script-repeated.html
-/sdcard/android/layout_tests/http/tests/misc/embedCrasher.html
-/sdcard/android/layout_tests/http/tests/misc/multiple-submit.html
-/sdcard/android/layout_tests/http/tests/misc/empty-file-formdata.html
-/sdcard/android/layout_tests/http/tests/misc/submit-post-in-utf7.html
-/sdcard/android/layout_tests/http/tests/misc/text-refresh.html
-/sdcard/android/layout_tests/http/tests/misc/window-open-then-write.html
-/sdcard/android/layout_tests/http/tests/misc/submit-post-in-utf16be.html
-/sdcard/android/layout_tests/http/tests/misc/frame-default-enc-same-domain.html
-/sdcard/android/layout_tests/http/tests/misc/submit-post-in-utf32le.html
-/sdcard/android/layout_tests/http/tests/misc/iframe-domain-test.html
-/sdcard/android/layout_tests/http/tests/misc/frame-default-enc-different-domain.html
-/sdcard/android/layout_tests/http/tests/misc/css-accept-any-type.html
-/sdcard/android/layout_tests/http/tests/misc/url-in-utf7.html
-/sdcard/android/layout_tests/http/tests/misc/submit-get-in-utf32be.html
-/sdcard/android/layout_tests/http/tests/misc/meta-refresh-stray-single-quote.html
-/sdcard/android/layout_tests/http/tests/misc/canvas-pattern-from-incremental-image.html
-/sdcard/android/layout_tests/http/tests/misc/submit-get-in-utf16le.html
-/sdcard/android/layout_tests/http/tests/misc/url-in-utf32be.html
-/sdcard/android/layout_tests/http/tests/misc/timer-vs-loading.html
-/sdcard/android/layout_tests/http/tests/misc/font-face-in-multiple-segmented-faces.html
-/sdcard/android/layout_tests/http/tests/misc/url-in-utf16le.html
-/sdcard/android/layout_tests/http/tests/misc/refresh-meta-with-newline.html
-/sdcard/android/layout_tests/http/tests/misc/post-submit-button.html
-/sdcard/android/layout_tests/http/tests/misc/redirect-to-about-blank.html
-/sdcard/android/layout_tests/http/tests/misc/javascript-url-stop-loaders.html
-/sdcard/android/layout_tests/http/tests/misc/iframe-invalid-source-crash.html
-/sdcard/android/layout_tests/http/tests/misc/slow-preload-cancel.html
-/sdcard/android/layout_tests/http/tests/misc/object-image-error-with-onload.html
-/sdcard/android/layout_tests/http/tests/misc/image-error.html
-/sdcard/android/layout_tests/http/tests/misc/referrer.html
-/sdcard/android/layout_tests/http/tests/misc/cached-scripts.html
-/sdcard/android/layout_tests/http/tests/misc/empty-cookie.html
-/sdcard/android/layout_tests/http/tests/misc/submit-post-in-utf32be.html
-/sdcard/android/layout_tests/http/tests/misc/missing-style-sheet.html
-/sdcard/android/layout_tests/http/tests/misc/submit-post-in-utf16le.html
-/sdcard/android/layout_tests/http/tests/misc/submit-get-in-utf16be.html
-/sdcard/android/layout_tests/http/tests/misc/DOMContentLoaded-event.html
-/sdcard/android/layout_tests/http/tests/misc/onload-remove-iframe-crash-2.html
-/sdcard/android/layout_tests/http/tests/misc/submit-get-in-utf32le.html
-/sdcard/android/layout_tests/http/tests/misc/object-image-error.html
-/sdcard/android/layout_tests/http/tests/misc/createElementNamespace3.html
-/sdcard/android/layout_tests/http/tests/misc/url-in-utf16be.html
-/sdcard/android/layout_tests/http/tests/misc/url-in-utf32le.html
-/sdcard/android/layout_tests/http/tests/misc/crash-multiple-family-fontface.html
-/sdcard/android/layout_tests/http/tests/misc/BOM-override-script.html
-/sdcard/android/layout_tests/http/tests/misc/createElementNamespace1.xml
-/sdcard/android/layout_tests/http/tests/workers/text-encoding.html
-/sdcard/android/layout_tests/http/tests/workers/worker-redirect.html
-/sdcard/android/layout_tests/http/tests/workers/worker-importScripts.html
-/sdcard/android/layout_tests/http/tests/cookies/double-quoted-value-with-semi-colon.html
-/sdcard/android/layout_tests/http/tests/uri/resolve-encoding-relative.html
-/sdcard/android/layout_tests/http/tests/uri/escaped-entity.html
-/sdcard/android/layout_tests/http/tests/uri/utf8-path.html
-/sdcard/android/layout_tests/http/tests/navigation/changing-frame-hierarchy-in-onload.html
-/sdcard/android/layout_tests/http/tests/navigation/fallback-anchor-reload.html
-/sdcard/android/layout_tests/http/tests/navigation/back-send-referrer.html
-/sdcard/android/layout_tests/http/tests/incremental/slow-utf8-css.html
-/sdcard/android/layout_tests/http/tests/incremental/frame-focus-before-load.html
-/sdcard/android/layout_tests/http/tests/appcache/crash-when-navigating-away-then-back.html
-/sdcard/android/layout_tests/http/tests/appcache/offline-access.html
-/sdcard/android/layout_tests/http/tests/appcache/update-cache.html
-/sdcard/android/layout_tests/http/tests/appcache/manifest-with-empty-file.html
-/sdcard/android/layout_tests/http/tests/appcache/simple.html
-/sdcard/android/layout_tests/http/tests/appcache/wrong-signature-2.html
-/sdcard/android/layout_tests/http/tests/appcache/top-frame-3.html
-/sdcard/android/layout_tests/http/tests/appcache/online-whitelist.html
-/sdcard/android/layout_tests/http/tests/appcache/fallback.html
-/sdcard/android/layout_tests/http/tests/appcache/different-origin-manifest.html
-/sdcard/android/layout_tests/http/tests/appcache/empty-manifest.html
-/sdcard/android/layout_tests/http/tests/appcache/manifest-redirect.html
-/sdcard/android/layout_tests/http/tests/appcache/navigating-away-while-cache-attempt-in-progress.html
-/sdcard/android/layout_tests/http/tests/appcache/top-frame-4.html
-/sdcard/android/layout_tests/http/tests/appcache/wrong-signature.html
-/sdcard/android/layout_tests/http/tests/appcache/fail-on-update.html
-/sdcard/android/layout_tests/http/tests/appcache/foreign-iframe-main.html
-/sdcard/android/layout_tests/http/tests/appcache/xhr-foreign-resource.html
-/sdcard/android/layout_tests/http/tests/appcache/manifest-containing-itself.html
-/sdcard/android/layout_tests/http/tests/appcache/resource-redirect.html
-/sdcard/android/layout_tests/http/tests/appcache/idempotent-update.html
-/sdcard/android/layout_tests/http/tests/appcache/top-frame-1.html
-/sdcard/android/layout_tests/http/tests/appcache/main-resource-hash.html
-/sdcard/android/layout_tests/http/tests/appcache/manifest-parsing.html
-/sdcard/android/layout_tests/http/tests/appcache/404-manifest.html
-/sdcard/android/layout_tests/http/tests/appcache/wrong-content-type.html
-/sdcard/android/layout_tests/http/tests/appcache/resource-redirect-2.html
-/sdcard/android/layout_tests/http/tests/appcache/top-frame-2.html
-/sdcard/android/layout_tests/http/tests/appcache/404-resource.html
-/sdcard/android/layout_tests/http/tests/appcache/remove-cache.html
-/sdcard/android/layout_tests/http/tests/appcache/manifest-redirect-2.html
-/sdcard/android/layout_tests/http/tests/appcache/reload.html
-/sdcard/android/layout_tests/http/tests/appcache/cyrillic-uri.html
-/sdcard/android/layout_tests/http/tests/security/aboutBlank/security-context-alias.html
-/sdcard/android/layout_tests/http/tests/security/aboutBlank/security-context-write.html
-/sdcard/android/layout_tests/http/tests/security/aboutBlank/security-context-grandchildren-alias.html
-/sdcard/android/layout_tests/http/tests/security/aboutBlank/security-context-with-base-tag.html
-/sdcard/android/layout_tests/http/tests/security/aboutBlank/security-context.html
-/sdcard/android/layout_tests/http/tests/security/aboutBlank/window-open-self-about-blank.html
-/sdcard/android/layout_tests/http/tests/security/aboutBlank/security-context-grandchildren.html
-/sdcard/android/layout_tests/http/tests/security/aboutBlank/security-context-grandchildren-writeln-lexical.html
-/sdcard/android/layout_tests/http/tests/security/aboutBlank/security-context-window-open.html
-/sdcard/android/layout_tests/http/tests/security/aboutBlank/security-context-grandchildren-write-lexical.html
-/sdcard/android/layout_tests/http/tests/security/aboutBlank/security-context-grandchildren-lexical.html
-/sdcard/android/layout_tests/http/tests/security/aboutBlank/security-context-writeln.html
-/sdcard/android/layout_tests/http/tests/security/cookies/document-open.html
-/sdcard/android/layout_tests/http/tests/security/cookies/create-document.html
-/sdcard/android/layout_tests/http/tests/security/cookies/assign-document-url.html
-/sdcard/android/layout_tests/http/tests/security/cookies/basic.html
-/sdcard/android/layout_tests/http/tests/security/cookies/base-tag.html
-/sdcard/android/layout_tests/http/tests/security/cookies/base-about-blank.html
-/sdcard/android/layout_tests/http/tests/security/cookies/xmlhttprequest.html
-/sdcard/android/layout_tests/http/tests/security/listener/xss-JSTargetNode-onclick-shortcut.html
-/sdcard/android/layout_tests/http/tests/security/listener/xss-XMLHttpRequest-shortcut.html
-/sdcard/android/layout_tests/http/tests/security/listener/xss-JSTargetNode-onclick-addEventListener.html
-/sdcard/android/layout_tests/http/tests/security/listener/xss-XMLHttpRequest-addEventListener.html
-/sdcard/android/layout_tests/http/tests/security/MessagePort/event-listener-context.html
-/sdcard/android/layout_tests/http/tests/security/postMessage/delivery-order.html
-/sdcard/android/layout_tests/http/tests/security/postMessage/data-url-sends-null-origin.html
-/sdcard/android/layout_tests/http/tests/security/postMessage/origin-unaffected-by-base-tag.html
-/sdcard/android/layout_tests/http/tests/security/postMessage/origin-unaffected-by-document-domain.html
-/sdcard/android/layout_tests/http/tests/security/postMessage/javascript-page-still-sends-origin.html
-/sdcard/android/layout_tests/http/tests/security/postMessage/invalid-origin-throws-exception.html
-/sdcard/android/layout_tests/http/tests/security/postMessage/target-origin.html
-/sdcard/android/layout_tests/http/tests/security/frameNavigation/context-for-window-open.html
-/sdcard/android/layout_tests/http/tests/security/frameNavigation/context-for-location.html
-/sdcard/android/layout_tests/http/tests/security/frameNavigation/not-opener.html
-/sdcard/android/layout_tests/http/tests/security/frameNavigation/opener.html
-/sdcard/android/layout_tests/http/tests/security/frameNavigation/context-for-location-assign.html
-/sdcard/android/layout_tests/http/tests/security/frameNavigation/context-for-location-href.html
-/sdcard/android/layout_tests/http/tests/security/frameNavigation/xss-ALLOWED-parent-navigation-change.html
-/sdcard/android/layout_tests/http/tests/security/originHeader/origin-header-for-get.html
-/sdcard/android/layout_tests/http/tests/security/originHeader/origin-header-for-https.html
-/sdcard/android/layout_tests/http/tests/security/originHeader/origin-header-for-post.html
-/sdcard/android/layout_tests/http/tests/security/originHeader/origin-header-for-data.html
-/sdcard/android/layout_tests/http/tests/security/xss-DENIED-assign-location-hash.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-history-prototype.html
-/sdcard/android/layout_tests/http/tests/security/xss-DENIED-synchronous-form.html
-/sdcard/android/layout_tests/http/tests/security/canvas-remote-read-redirect-to-remote-image.html
-/sdcard/android/layout_tests/http/tests/security/xss-DENIED-assign-location-nonstandardProperty.html
-/sdcard/android/layout_tests/http/tests/security/xss-DENIED-assign-location-pathname.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-frames.html
-/sdcard/android/layout_tests/http/tests/security/object-literals.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-location-prototype.html
-/sdcard/android/layout_tests/http/tests/security/xss-DENIED-assign-location-search.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-selection.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-name-getter.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-call.html
-/sdcard/android/layout_tests/http/tests/security/xss-DENIED-assign-location-reload.html
-/sdcard/android/layout_tests/http/tests/security/xss-DENIED-invalid-domain-change.html
-/sdcard/android/layout_tests/http/tests/security/canvas-remote-read-remote-image.html
-/sdcard/android/layout_tests/http/tests/security/xss-DENIED-assign-location-protocol.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-first-time.html
-/sdcard/android/layout_tests/http/tests/security/xss-eval.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-DOMImplementation.html
-/sdcard/android/layout_tests/http/tests/security/xss-DENIED-assign-location-hostname.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-custom.html
-/sdcard/android/layout_tests/http/tests/security/xss-DENIED-assign-location-host.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-callback-explicit-domain-ALLOW.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/workers/xmlhttprequest-file-not-found.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/workers/abort-exception-assert.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/workers/close.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/web-apps/010.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/web-apps/002.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/web-apps/012.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/web-apps/004.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/web-apps/014.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/web-apps/018.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/web-apps/002-simple.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/web-apps/001.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/web-apps/011.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/web-apps/003.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/web-apps/013.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/web-apps/005.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/web-apps/015.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/web-apps/007.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/cross-site-denied-response.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/encode-request-url.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-allow-async.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-non-simple-allow.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-allow-preflight-cache.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/inject-header.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-LSProgressEvent-ProgressEvent-should-match.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/origin-header-same-origin-post-async.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-denied.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/origin-header-cross-origin-post-sync.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-InvalidStateException-getAllRequestHeaders.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/simple-cross-origin-denied-events-post-sync.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/binary-x-user-defined.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/onloadstart-event.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-no-content-length-onProgress.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/readystatechange.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-contenttype-empty.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-post-fail-non-simple-content-type.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-forbidden-methods-exception.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-allow-preflight-cache-invalidation-by-method.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/serialize-document.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/onerror-event.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/close-window.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/redirect-cross-origin-post-sync.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/detaching-frame-2.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/encode-request-url-2.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/set-dangerous-headers.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/event-target.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-addEventListener-onProgress.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/send-on-abort.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/document-domain-set.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-allow-preflight-cache-timeout.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-responseXML-exception.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/cross-site-denied-response-sync.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/upload-onloadstart-event.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/supported-xml-content-types.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/simple-cross-origin-denied-events.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/request-encoding.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/zero-length-response.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/connection-error-sync.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-allow-access-control-origin-header-data-url.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-allow-preflight-cache-invalidation-by-header.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/redirect-cross-origin.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-allow-star.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-crlf-getAllResponseHeader.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/event-listener-gc.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/interactive-state.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/state-after-network-error.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/abort-crash.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/get-dangerous-headers.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-image-not-loaded.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/exceptions.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-test-send-flag.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/origin-header-cross-origin-post-async.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/referer.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-invalidHeader-getRequestHeader.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/infoOnProgressEvent.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-allow-access-control-origin-header.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/docLoaderFrame.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/simple-cross-origin-denied-events-sync.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/post-content-type.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-whitelist-response-headers.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/onabort-event.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/origin-header-same-origin-get-async.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/detaching-frame.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/redirect-cross-origin-sync.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-get-fail-non-simple.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/zero-length-response-sync.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-denied-preflight-cache.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/authorization-header.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-post-crash.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/origin-header-cross-origin-get-sync.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/origin-header-cross-origin-get-async.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/redirect-cross-origin-sync-double.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-abort-readyState-shouldDispatchEvent.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-responseText-exception.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/redirect-cross-origin-2.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-abort-readyState-shouldNotDispatchEvent.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/status-after-abort.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/XMLHttpRequestException.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-onProgress-open-should-zero-length.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/broken-xml-encoding.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/simple-cross-origin-denied-events-post.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/extra-parameters.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-multiple-open.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-InvalidStateException-getRequestHeader.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/origin-header-same-origin-post-sync.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/cross-site-denied-response-sync-2.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/request-from-popup.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/redirect-cross-origin-post.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/simple-cross-origin-progress-events.html
-/sdcard/android/layout_tests/http/tests/messaging/cross-domain-message-event-dispatch.html
-/sdcard/android/layout_tests/http/tests/messaging/cross-domain-message-send.html
-/sdcard/android/layout_tests/media/constructors.html
-/sdcard/android/layout_tests/media/video-poster.html
-/sdcard/android/layout_tests/media/video-source-media.html
-/sdcard/android/layout_tests/media/video-controls-with-mutation-event-handler.html
-/sdcard/android/layout_tests/media/video-src-set.html
-/sdcard/android/layout_tests/media/video-display-none-crash.html
-/sdcard/android/layout_tests/media/video-width-height.html
-/sdcard/android/layout_tests/media/video-source.html
-/sdcard/android/layout_tests/media/fallback.html
-/sdcard/android/layout_tests/media/remove-from-document-no-load.html
-/sdcard/android/layout_tests/media/before-load-member-access.html
-/sdcard/android/layout_tests/media/video-play-pause-events.html
-/sdcard/android/layout_tests/media/media-constants.html
-/sdcard/android/layout_tests/media/video-src-source.html
-/sdcard/android/layout_tests/media/video-play-pause-exception.html
-/sdcard/android/layout_tests/media/video-dom-autobuffer.html
-/sdcard/android/layout_tests/media/video-seek-no-src-exception.html
-/sdcard/android/layout_tests/media/video-src.html
-/sdcard/android/layout_tests/plugins/createScriptableObject-before-start.html
-/sdcard/android/layout_tests/plugins/return-error-from-new-stream-callback-in-full-frame-plugin.html
-/sdcard/android/layout_tests/scrollbars/scrollbar-crash-on-refresh.html
-/sdcard/android/layout_tests/scrollbars/scrollbar-miss-mousemove.html
-/sdcard/android/layout_tests/security/autocomplete-cleared-on-back.html
-/sdcard/android/layout_tests/storage/domstorage/localstorage/complex-keys.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/remove-item.html
-/sdcard/android/layout_tests/storage/domstorage/localstorage/string-conversion.html
-/sdcard/android/layout_tests/storage/domstorage/localstorage/simple-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/localstorage/index-get-and-set.html
-/sdcard/android/layout_tests/storage/domstorage/localstorage/onstorage-attribute-setattribute.html
-/sdcard/android/layout_tests/storage/domstorage/localstorage/onstorage-attribute-setwindow.html
-/sdcard/android/layout_tests/storage/domstorage/localstorage/simple-usage.html
-/sdcard/android/layout_tests/storage/domstorage/localstorage/onstorage-attribute-markup.html
-/sdcard/android/layout_tests/storage/domstorage/localstorage/enumerate-with-length-and-key.html
-/sdcard/android/layout_tests/storage/domstorage/localstorage/complex-values.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/onstorage-attribute-setwindow.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/string-conversion.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/enumerate-with-length-and-key.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/hash-change-with-xhr.html
-/sdcard/android/layout_tests/storage/open-database-empty-version.html
-/sdcard/android/layout_tests/storage/quota-tracking.html
-/sdcard/android/layout_tests/storage/close-during-stress-test.html
-/sdcard/android/layout_tests/storage/database-lock-after-reload.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/transaction-error-callback.html
-/sdcard/android/layout_tests/storage/sql-data-types.html
-/sdcard/android/layout_tests/storage/transaction-callback-exception-crash.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/computed-style-origin.html
-/sdcard/android/layout_tests/transforms/2d/transform-accuracy.html
-/sdcard/android/layout_tests/transforms/2d/transform-value-types.html
-/sdcard/android/layout_tests/transforms/3d/hit-testing/hit-preserves-3d.html
-/sdcard/android/layout_tests/transitions/cancel-transition.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/text-indent-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/min-max-width-height-transitions.html
-/sdcard/android/layout_tests/transitions/shorthand-transitions.html
-/sdcard/android/layout_tests/transitions/mask-transitions.html
-/sdcard/android/layout_tests/transitions/zero-duration-with-non-zero-delay-start.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/inherit-other-props.html
-/sdcard/android/layout_tests/transitions/transition-end-event-multiple-04.html
-/sdcard/android/layout_tests/transitions/background-transitions.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/transition-end-event-left.html
-/sdcard/android/layout_tests/transitions/override-transition-crash.html
-/sdcard/android/layout_tests/transitions/transition-end-event-multiple-01.html
-/sdcard/android/layout_tests/transitions/matched-transform-functions.html
-/sdcard/android/layout_tests/transitions/transform-op-list-match.html
-/sdcard/android/layout_tests/transitions/transition-end-event-container.html
-/sdcard/android/layout_tests/transitions/interrupt-transform-transition.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/shadow.html
-/sdcard/android/layout_tests/transitions/transition-end-event-multiple-02.html
-/sdcard/android/layout_tests/transitions/transition-end-event-transform.html
-/sdcard/android/layout_tests/transitions/start-transform-transition.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/bad-transition-shorthand-crash.html
-/sdcard/android/layout_tests/transitions/transition-end-event-destroy-renderer.html
-/sdcard/android/layout_tests/transitions/extra-transition.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/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
diff --git a/tests/DumpRenderTree/assets/run_layout_tests.py b/tests/DumpRenderTree/assets/run_layout_tests.py
deleted file mode 100755
index 21c02ec..0000000
--- a/tests/DumpRenderTree/assets/run_layout_tests.py
+++ /dev/null
@@ -1,320 +0,0 @@
-#!/usr/bin/python
-
-"""Run layout tests using Android emulator and instrumentation.
-
-  First, you need to get an SD card or sdcard image that has layout tests on it.
-  Layout tests are in following directory:
-    /sdcard/webkit/layout_tests
-  For example, /sdcard/webkit/layout_tests/fast
-
-  Usage:
-    Run all tests under fast/ directory:
-      run_layout_tests.py, or
-      run_layout_tests.py fast
-
-    Run all tests under a sub directory:
-      run_layout_tests.py fast/dom
-
-    Run a single test:
-      run_layout_tests.py fast/dom/
-
-  After a merge, if there are changes of layout tests in SD card, you need to
-  use --refresh-test-list option *once* to re-generate test list on the card.
-
-  Some other options are:
-    --rebaseline generates expected layout tests results under /sdcard/webkit/expected_result/
-    --time-out-ms (default is 8000 millis) for each test
-    --adb-options="-e" passes option string to adb
-    --results-directory=..., (default is ./layout-test-results) directory name under which results are stored.
-    --js-engine the JavaScript engine currently in use, determines which set of Android-specific expected results we should use, should be 'jsc' or 'v8'
-"""
-
-import logging
-import optparse
-import os
-import subprocess
-import sys
-import time
-
-def CountLineNumber(filename):
-  """Compute the number of lines in a given file.
-
-  Args:
-    filename: a file name related to the current directory.
-  """
-
-  fp = open(os.path.abspath(filename), "r");
-  lines = 0
-  for line in fp.readlines():
-    lines = lines + 1
-  fp.close()
-  return lines
-
-def DumpRenderTreeFinished(adb_cmd):
-  """ Check if DumpRenderTree finished running tests
-
-  Args:
-    output: adb_cmd string
-  """
-
-  # pull /sdcard/webkit/running_test.txt, if the content is "#DONE", it's done
-  shell_cmd_str = adb_cmd + " shell cat /sdcard/webkit/running_test.txt"
-  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,
-                new_count_first=True):
-   """ Given two result files, generate diff and
-       write to diff_results file. All arguments are absolute paths
-       to files.
-   """
-   old_file = open(old_results, "r")
-   new_file = open(new_results, "r")
-   diff_file = open(diff_results, "a")
-
-   # Read lines from each file
-   ndict = new_file.readlines()
-   cdict = old_file.readlines()
-
-   # Write marker to diff file
-   diff_file.writelines(marker + "\n")
-   diff_file.writelines("###############\n")
-
-   # Strip reason from result lines
-   if strip_reason is True:
-     for i in range(0, len(ndict)):
-       ndict[i] = ndict[i].split(' ')[0] + "\n"
-     for i in range(0, len(cdict)):
-       cdict[i] = cdict[i].split(' ')[0] + "\n"
-
-   params = {
-       "new": [0, ndict, cdict, "+"],
-       "miss": [0, cdict, ndict, "-"]
-       }
-   if new_count_first:
-     order = ["new", "miss"]
-   else:
-     order = ["miss", "new"]
-
-   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(params["new"][0]) + " new, " +
-                str(params["miss"][0]) + " misses")
-
-   diff_file.writelines("\n\n")
-
-   old_file.close()
-   new_file.close()
-   diff_file.close()
-   return
-
-def CompareResults(ref_dir, results_dir):
-  """Compare results in two directories
-
-  Args:
-    ref_dir: the reference directory having layout results as references
-    results_dir: the results directory
-  """
-  logging.info("Comparing results to " + ref_dir)
-
-  diff_result = os.path.join(results_dir, "layout_tests_diff.txt")
-  if os.path.exists(diff_result):
-    os.remove(diff_result)
-
-  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,
-                False, f != "passed")
-  logging.info("Detailed diffs are in " + diff_result)
-
-def main(options, args):
-  """Run the tests. Will call sys.exit when complete.
-
-  Args:
-    options: a dictionary of command line options
-    args: a list of sub directories or files to test
-  """
-
-  # Set up logging format.
-  log_level = logging.INFO
-  if options.verbose:
-    log_level = logging.DEBUG
-  logging.basicConfig(level=log_level,
-                      format='%(message)s')
-
-  # Include all tests if none are specified.
-  if not args:
-    path = '/';
-  else:
-    path = ' '.join(args);
-
-  adb_cmd = "adb ";
-  if options.adb_options:
-    adb_cmd += options.adb_options
-
-  # Re-generate the test list if --refresh-test-list is on
-  if options.refresh_test_list:
-    logging.info("Generating test list.");
-    generate_test_list_cmd_str = adb_cmd + " shell am instrument -e class com.android.dumprendertree.LayoutTestsAutoTest#generateTestList -e path \"" + path + "\" -w com.android.dumprendertree/.LayoutTestsAutoRunner"
-    adb_output = subprocess.Popen(generate_test_list_cmd_str, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0]
-
-    if adb_output.find('Process crashed') != -1:
-       logging.info("Aborting because cannot generate test list.\n" + adb_output)
-       sys.exit(1)
-
-
-  logging.info("Running tests")
-
-  # Count crashed tests.
-  crashed_tests = []
-
-  timeout_ms = '15000'
-  if options.time_out_ms:
-    timeout_ms = options.time_out_ms
-
-  # Run test until it's done
-
-  run_layout_test_cmd_prefix = adb_cmd + " shell am instrument"
-
-  run_layout_test_cmd_postfix = " -e path \"" + path + "\" -e timeout " + timeout_ms
-  if options.rebaseline:
-    run_layout_test_cmd_postfix += " -e rebaseline true"
-
-  # If the JS engine is not specified on the command line, try reading the
-  # JS_ENGINE environment  variable, which is used by the build system in
-  # external/webkit/Android.mk.
-  js_engine = options.js_engine
-  if not js_engine and os.environ.has_key('JS_ENGINE'):
-    js_engine = os.environ['JS_ENGINE']
-  if js_engine:
-    run_layout_test_cmd_postfix += " -e jsengine " + js_engine
-
-  run_layout_test_cmd_postfix += " -w com.android.dumprendertree/.LayoutTestsAutoRunner"
-
-  # Call LayoutTestsAutoTest::startLayoutTests.
-  run_layout_test_cmd = run_layout_test_cmd_prefix + " -e class com.android.dumprendertree.LayoutTestsAutoTest#startLayoutTests" + run_layout_test_cmd_postfix
-
-  adb_output = subprocess.Popen(run_layout_test_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0]
-  while not DumpRenderTreeFinished(adb_cmd):
-    # Get the running_test.txt
-    logging.error("DumpRenderTree crashed, output:\n" + adb_output)
-
-    shell_cmd_str = adb_cmd + " shell cat /sdcard/webkit/running_test.txt"
-    crashed_test = ""
-    while not crashed_test:
-      (crashed_test, err) = subprocess.Popen(
-          shell_cmd_str, shell=True, stdout=subprocess.PIPE,
-          stderr=subprocess.PIPE).communicate()
-      crashed_test = crashed_test.strip()
-      if not crashed_test:
-        logging.error('Cannot get crashed test name, device offline?')
-        logging.error('stderr: ' + err)
-        logging.error('retrying in 10s...')
-        time.sleep(10)
-
-    logging.info(crashed_test + " CRASHED");
-    crashed_tests.append(crashed_test);
-
-    logging.info("Resuming layout test runner...");
-    # Call LayoutTestsAutoTest::resumeLayoutTests
-    run_layout_test_cmd = run_layout_test_cmd_prefix + " -e class com.android.dumprendertree.LayoutTestsAutoTest#resumeLayoutTests" + run_layout_test_cmd_postfix
-
-    adb_output = subprocess.Popen(run_layout_test_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0]
-
-  if adb_output.find('INSTRUMENTATION_FAILED') != -1:
-    logging.error("Error happened : " + adb_output)
-    sys.exit(1)
-
-  logging.debug(adb_output);
-  logging.info("Done\n");
-
-  # Pull results from /sdcard
-  results_dir = options.results_directory
-  if not os.path.exists(results_dir):
-    os.makedirs(results_dir)
-  if not os.path.isdir(results_dir):
-    logging.error("Cannot create results dir: " + results_dir);
-    sys.exit(1);
-
-  result_files = ["/sdcard/layout_tests_passed.txt",
-                  "/sdcard/layout_tests_failed.txt",
-                  "/sdcard/layout_tests_ignored.txt",
-                  "/sdcard/layout_tests_nontext.txt"]
-  for file in result_files:
-    shell_cmd_str = adb_cmd + " pull " + file + " " + results_dir
-    adb_output = subprocess.Popen(shell_cmd_str, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0]
-    logging.debug(adb_output)
-
-  # Create the crash list.
-  fp = open(results_dir + "/layout_tests_crashed.txt", "w");
-  for crashed_test in crashed_tests:
-    fp.writelines(crashed_test + '\n')
-  fp.close()
-
-  # Count the number of tests in each category.
-  passed_tests = CountLineNumber(results_dir + "/layout_tests_passed.txt")
-  logging.info(str(passed_tests) + " passed")
-  failed_tests = CountLineNumber(results_dir + "/layout_tests_failed.txt")
-  logging.info(str(failed_tests) + " failed")
-  ignored_tests = CountLineNumber(results_dir + "/layout_tests_ignored.txt")
-  logging.info(str(ignored_tests) + " ignored results")
-  crashed_tests = CountLineNumber(results_dir + "/layout_tests_crashed.txt")
-  logging.info(str(crashed_tests) + " crashed")
-  nontext_tests = CountLineNumber(results_dir + "/layout_tests_nontext.txt")
-  logging.info(str(nontext_tests) + " no dumpAsText")
-  logging.info(str(passed_tests + failed_tests + ignored_tests + crashed_tests + nontext_tests) + " TOTAL")
-
-  logging.info("Results are stored under: " + results_dir + "\n")
-
-  # Comparing results to references to find new fixes and regressions.
-  results_dir = os.path.abspath(options.results_directory)
-  ref_dir = options.ref_directory
-
-  # if ref_dir is null, cannonify ref_dir to the script dir.
-  if not ref_dir:
-    script_self = sys.argv[0]
-    script_dir = os.path.dirname(script_self)
-    ref_dir = os.path.join(script_dir, "results")
-
-  ref_dir = os.path.abspath(ref_dir)
-
-  CompareResults(ref_dir, results_dir)
-
-if '__main__' == __name__:
-  option_parser = optparse.OptionParser()
-  option_parser.add_option("", "--rebaseline", action="store_true",
-                           default=False,
-                           help="generate expected results for those tests not having one")
-  option_parser.add_option("", "--time-out-ms",
-                           default=None,
-                           help="set the timeout for each test")
-  option_parser.add_option("", "--verbose", action="store_true",
-                           default=False,
-                           help="include debug-level logging")
-  option_parser.add_option("", "--refresh-test-list", action="store_true",
-                           default=False,
-                           help="re-generate test list, it may take some time.")
-  option_parser.add_option("", "--adb-options",
-                           default=None,
-                           help="pass options to adb, such as -d -e, etc");
-  option_parser.add_option("", "--results-directory",
-                           default="layout-test-results",
-                           help="directory which results are stored.")
-  option_parser.add_option("", "--ref-directory",
-                           default=None,
-                           dest="ref_directory",
-                           help="directory where reference results are stored.")
-  option_parser.add_option("", "--js-engine",
-                           default=None,
-                           help="The JavaScript engine currently in use, which determines which set of Android-specific expected results we should use. Should be 'jsc' or 'v8'.");
-
-  options, args = option_parser.parse_args();
-  main(options, args)
diff --git a/tests/DumpRenderTree/assets/run_page_cycler.py b/tests/DumpRenderTree/assets/run_page_cycler.py
deleted file mode 100755
index f995086..0000000
--- a/tests/DumpRenderTree/assets/run_page_cycler.py
+++ /dev/null
@@ -1,163 +0,0 @@
-#!/usr/bin/python
-
-"""Run page cycler tests using Android instrumentation.
-
-  First, you need to get an SD card or sdcard image that has page cycler tests.
-
-  Usage:
-    Run a single page cycler test:
-      run_page_cycler.py "file:///sdcard/webkit/page_cycler/moz/start.html\?auto=1\&iterations=10"
-"""
-
-import logging
-import optparse
-import os
-import subprocess
-import sys
-import time
-
-
-
-def main(options, args):
-  """Run the tests. Will call sys.exit when complete.
-
-  """
-
-  # Set up logging format.
-  log_level = logging.INFO
-  if options.verbose:
-    log_level = logging.DEBUG
-  logging.basicConfig(level=log_level,
-                      format='%(message)s')
-
-  # Include all tests if none are specified.
-  if not args:
-    print "need a URL, e.g. file:///sdcard/webkit/page_cycler/moz/start.html\?auto=1\&iterations=10"
-    print "  or remote:android-browser-test:80/page_cycler/"
-    sys.exit(1)
-  else:
-    path = ' '.join(args);
-
-  if path[:7] == "remote:":
-    remote_path = path[7:]
-  else:
-    remote_path = None
-
-  adb_cmd = "adb ";
-  if options.adb_options:
-    adb_cmd += options.adb_options
-
-  logging.info("Running the test ...")
-
-  # Count crashed tests.
-  crashed_tests = []
-
-  timeout_ms = '0'
-  if options.time_out_ms:
-    timeout_ms = options.time_out_ms
-
-  # Run test until it's done
-
-  run_load_test_cmd_prefix = adb_cmd + " shell am instrument"
-  run_load_test_cmd_postfix = " -w com.android.dumprendertree/.LayoutTestsAutoRunner"
-
-  # Call LoadTestsAutoTest::runTest.
-  run_load_test_cmd = run_load_test_cmd_prefix + " -e class com.android.dumprendertree.LoadTestsAutoTest#runPageCyclerTest -e timeout " + timeout_ms
-
-  if remote_path:
-    if options.suite:
-      run_load_test_cmd += " -e suite %s -e forward %s " % (options.suite,
-                                                            remote_path)
-    else:
-      print "for network mode, need to specify --suite as well."
-      sys.exit(1)
-    if options.iteration:
-      run_load_test_cmd += " -e iteration %s" % options.iteration
-  else:
-    run_load_test_cmd += " -e path \"%s\" " % path
-
-
-  if options.drawtime:
-    run_load_test_cmd += " -e drawtime true "
-
-  if options.save_image:
-    run_load_test_cmd += " -e saveimage \"%s\"" % options.save_image
-
-  run_load_test_cmd += run_load_test_cmd_postfix
-
-  (adb_output, adb_error) = subprocess.Popen(run_load_test_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
-  fail_flag = False
-  for line in adb_output.splitlines():
-    line = line.strip()
-    if line.find('INSTRUMENTATION_CODE') == 0:
-      if not line[22:] == '-1':
-        fail_flag = True
-        break
-    if (line.find('INSTRUMENTATION_FAILED') != -1 or
-        line.find('Process crashed.') != -1):
-      fail_flag = True
-      break
-  if fail_flag:
-    logging.error("Error happened : " + adb_output)
-    sys.exit(1)
-
-  logging.info(adb_output);
-  logging.info(adb_error);
-  logging.info("Done\n");
-
-  # Pull results from /sdcard/load_test_result.txt
-  results_dir = options.results_directory
-  if not os.path.exists(results_dir):
-    os.makedirs(results_dir)
-  if not os.path.isdir(results_dir):
-    logging.error("Cannot create results dir: " + results_dir)
-    sys.exit(1)
-
-  result_file = "/sdcard/load_test_result.txt"
-  shell_cmd_str = adb_cmd + " pull " + result_file + " " + results_dir
-  (adb_output, err) = subprocess.Popen(
-      shell_cmd_str, shell=True,
-      stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
-  if not os.path.isfile(os.path.join(results_dir, "load_test_result.txt")):
-    logging.error("Failed to pull result file.")
-    logging.error("adb stdout:")
-    logging.error(adb_output)
-    logging.error("adb stderr:")
-    logging.error(err)
-  logging.info("Results are stored under: " + results_dir + "/load_test_result.txt\n")
-
-if '__main__' == __name__:
-  option_parser = optparse.OptionParser()
-  option_parser.add_option("-t", "--time-out-ms",
-                           default=None,
-                           help="set the timeout for each test")
-  option_parser.add_option("-v", "--verbose", action="store_true",
-                           default=False,
-                           help="include debug-level logging")
-  option_parser.add_option("-a", "--adb-options",
-                           default=None,
-                           help="pass options to adb, such as -d -e, etc");
-  option_parser.add_option("-r", "--results-directory",
-                           default="layout-test-results",
-                           help="directory which results are stored.")
-
-  option_parser.add_option("-d", "--drawtime", action="store_true",
-                           default=False,
-                           help="log draw time for each page rendered.")
-
-  option_parser.add_option("-s", "--save-image",
-                           default=None,
-                           help="stores rendered page to a location on device.")
-
-  option_parser.add_option("-u", "--suite",
-                           default=None,
-                           help="(for network mode) specify the suite to"
-                           " run by name")
-
-  option_parser.add_option("-i", "--iteration",
-                           default="5",
-                           help="(for network mode) specify how many iterations"
-                           " to run")
-
-  options, args = option_parser.parse_args();
-  main(options, args)
diff --git a/tests/DumpRenderTree/assets/run_reliability_tests.py b/tests/DumpRenderTree/assets/run_reliability_tests.py
deleted file mode 100755
index 59ac4a3..0000000
--- a/tests/DumpRenderTree/assets/run_reliability_tests.py
+++ /dev/null
@@ -1,276 +0,0 @@
-#!/usr/bin/python2.4
-
-"""Run reliability tests using Android instrumentation.
-
-  A test file consists of list web sites to test is needed as a parameter
-
-  Usage:
-    run_reliability_tests.py path/to/url/list
-"""
-
-import logging
-import optparse
-import os
-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"
-TEST_TIMEOUT_FILE = "/sdcard/android/reliability_timeout_test.txt"
-TEST_LOAD_TIME_FILE = "/sdcard/android/reliability_load_time.txt"
-HTTP_URL_FILE = "urllist_http"
-HTTPS_URL_FILE = "urllist_https"
-NUM_URLS = 25
-
-
-def DumpRenderTreeFinished(adb_cmd):
-  """Check if DumpRenderTree finished running.
-
-  Args:
-    adb_cmd: adb command string
-
-  Returns:
-    True if DumpRenderTree has finished, False otherwise
-  """
-
-  # pull test status file and look for "#DONE"
-  shell_cmd_str = adb_cmd + " shell cat " + TEST_STATUS_FILE
-  adb_output = subprocess.Popen(shell_cmd_str,
-                                shell=True, stdout=subprocess.PIPE,
-                                stderr=subprocess.PIPE).communicate()[0]
-  return adb_output.strip() == "#DONE"
-
-
-def RemoveDeviceFile(adb_cmd, file_name):
-  shell_cmd_str = adb_cmd + " shell rm " + file_name
-  subprocess.Popen(shell_cmd_str,
-                   shell=True, stdout=subprocess.PIPE,
-                   stderr=subprocess.PIPE).communicate()
-
-
-def Bugreport(url, bugreport_dir, adb_cmd):
-  """Pull a bugreport from the device."""
-  bugreport_filename = "%s/reliability_bugreport_%d.txt" % (bugreport_dir,
-                                                            int(time.time()))
-
-  # prepend the report with url
-  handle = open(bugreport_filename, "w")
-  handle.writelines("Bugreport for crash in url - %s\n\n" % url)
-  handle.close()
-
-  cmd = "%s bugreport >> %s" % (adb_cmd, bugreport_filename)
-  os.system(cmd)
-
-
-def ProcessPageLoadTime(raw_log):
-  """Processes the raw page load time logged by test app."""
-  log_handle = open(raw_log, "r")
-  load_times = {}
-
-  for line in log_handle:
-    line = line.strip()
-    pair = line.split("|")
-    if len(pair) != 2:
-      logging.info("Line has more than one '|': " + line)
-      continue
-    if pair[0] not in load_times:
-      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]].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():
-    # 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()
-
-
-def main(options, args):
-  """Send the url list to device and start testing, restart if crashed."""
-
-  # Set up logging format.
-  log_level = logging.INFO
-  if options.verbose:
-    log_level = logging.DEBUG
-  logging.basicConfig(level=log_level,
-                      format="%(message)s")
-
-  # Include all tests if none are specified.
-  if not args:
-    print "Missing URL list file"
-    sys.exit(1)
-  else:
-    path = args[0]
-
-  if not options.crash_file:
-    print "Missing crash file name, use --crash-file to specify"
-    sys.exit(1)
-  else:
-    crashed_file = options.crash_file
-
-  if not options.timeout_file:
-    print "Missing timeout file, use --timeout-file to specify"
-    sys.exit(1)
-  else:
-    timedout_file = options.timeout_file
-
-  if not options.delay:
-    manual_delay = 0
-  else:
-    manual_delay = options.delay
-
-  if not options.bugreport:
-    bugreport_dir = "."
-  else:
-    bugreport_dir = options.bugreport
-  if not os.path.exists(bugreport_dir):
-    os.makedirs(bugreport_dir)
-  if not os.path.isdir(bugreport_dir):
-    logging.error("Cannot create results dir: " + bugreport_dir)
-    sys.exit(1)
-
-  adb_cmd = "adb "
-  if options.adb_options:
-    adb_cmd += options.adb_options + " "
-
-  # push url list to device
-  test_cmd = adb_cmd + " push \"" + path + "\" \"" + TEST_LIST_FILE + "\""
-  proc = subprocess.Popen(test_cmd, shell=True,
-                          stdout=subprocess.PIPE,
-                          stderr=subprocess.PIPE)
-  (adb_output, adb_error) = proc.communicate()
-  if proc.returncode != 0:
-    logging.error("failed to push url list to device.")
-    logging.error(adb_output)
-    logging.error(adb_error)
-    sys.exit(1)
-
-  # 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 ...")
-
-  # Count crashed tests.
-  crashed_tests = []
-
-  if options.time_out_ms:
-    timeout_ms = options.time_out_ms
-
-  # Run test until it's done
-  test_cmd_prefix = adb_cmd + " shell am instrument"
-  test_cmd_postfix = " -w com.android.dumprendertree/.LayoutTestsAutoRunner"
-
-  # Call ReliabilityTestsAutoTest#startReliabilityTests
-  test_cmd = (test_cmd_prefix + " -e class "
-              "com.android.dumprendertree.ReliabilityTest#"
-              "runReliabilityTest -e timeout %s -e delay %s" %
-              (str(timeout_ms), str(manual_delay)))
-
-  if options.logtime:
-    test_cmd += " -e logtime true"
-
-  test_cmd += test_cmd_postfix
-
-  adb_output = subprocess.Popen(test_cmd, shell=True,
-                                stdout=subprocess.PIPE,
-                                stderr=subprocess.PIPE).communicate()[0]
-  while not DumpRenderTreeFinished(adb_cmd):
-    logging.error("DumpRenderTree exited before all URLs are visited.")
-    shell_cmd_str = adb_cmd + " shell cat " + TEST_STATUS_FILE
-    crashed_test = ""
-    while not crashed_test:
-      (crashed_test, err) = subprocess.Popen(
-          shell_cmd_str, shell=True, stdout=subprocess.PIPE,
-          stderr=subprocess.PIPE).communicate()
-      crashed_test = crashed_test.strip()
-      if not crashed_test:
-        logging.error('Cannot get crashed test name, device offline?')
-        logging.error('stderr: ' + err)
-        logging.error('retrying in 10s...')
-        time.sleep(10)
-
-    logging.info(crashed_test + " CRASHED")
-    crashed_tests.append(crashed_test)
-    Bugreport(crashed_test, bugreport_dir, adb_cmd)
-    logging.info("Resuming reliability test runner...")
-
-    adb_output = subprocess.Popen(test_cmd, shell=True, stdout=subprocess.PIPE,
-                                  stderr=subprocess.PIPE).communicate()[0]
-
-  if (adb_output.find("INSTRUMENTATION_FAILED") != -1 or
-      adb_output.find("Process crashed.") != -1):
-    logging.error("Error happened : " + adb_output)
-    sys.exit(1)
-
-  logging.info(adb_output)
-  logging.info("Done\n")
-
-  if crashed_tests:
-    file_handle = open(crashed_file, "w")
-    file_handle.writelines("\n".join(crashed_tests))
-    logging.info("Crashed URL list stored in: " + crashed_file)
-    file_handle.close()
-  else:
-    logging.info("No crash found.")
-
-  # get timeout file from sdcard
-  test_cmd = (adb_cmd + "pull \"" + TEST_TIMEOUT_FILE + "\" \""
-              + timedout_file +  "\"")
-  subprocess.Popen(test_cmd, shell=True, stdout=subprocess.PIPE,
-                   stderr=subprocess.PIPE).communicate()
-
-  if options.logtime:
-    # get logged page load times from sdcard
-    test_cmd = (adb_cmd + "pull \"" + TEST_LOAD_TIME_FILE + "\" \""
-                + options.logtime +  "\"")
-    subprocess.Popen(test_cmd, shell=True, stdout=subprocess.PIPE,
-                     stderr=subprocess.PIPE).communicate()
-    ProcessPageLoadTime(options.logtime)
-
-
-if "__main__" == __name__:
-  option_parser = optparse.OptionParser()
-  option_parser.add_option("-t", "--time-out-ms",
-                           default=60000,
-                           help="set the timeout for each test")
-  option_parser.add_option("-v", "--verbose", action="store_true",
-                           default=False,
-                           help="include debug-level logging")
-  option_parser.add_option("-a", "--adb-options",
-                           default=None,
-                           help="pass options to adb, such as -d -e, etc")
-  option_parser.add_option("-c", "--crash-file",
-                           default="reliability_crashed_sites.txt",
-                           help="the list of sites that cause browser to crash")
-  option_parser.add_option("-f", "--timeout-file",
-                           default="reliability_timedout_sites.txt",
-                           help="the list of sites that timedout during test")
-  option_parser.add_option("-d", "--delay",
-                           default=0,
-                           help="add a manual delay between pages (in ms)")
-  option_parser.add_option("-b", "--bugreport",
-                           default=".",
-                           help="the directory to store bugreport for crashes")
-  option_parser.add_option("-l", "--logtime",
-                           default=None,
-                           help="Logs page load time for each url to the file")
-  opts, arguments = option_parser.parse_args()
-  main(opts, arguments)
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/CallbackProxy.java b/tests/DumpRenderTree/src/com/android/dumprendertree/CallbackProxy.java
deleted file mode 100644
index 9d621d6..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/CallbackProxy.java
+++ /dev/null
@@ -1,529 +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 com.android.dumprendertree;
-
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.webkit.WebStorage;
-
-import java.util.HashMap;
-
-public class CallbackProxy extends Handler implements EventSender, LayoutTestController {
-
-    private EventSender mEventSender;
-    private LayoutTestController mLayoutTestController;
-
-    private static final int EVENT_DOM_LOG = 1;
-    private static final int EVENT_FIRE_KBD = 2;
-    private static final int EVENT_KEY_DOWN_1 = 3;
-    private static final int EVENT_KEY_DOWN_2 = 4;
-    private static final int EVENT_LEAP = 5;
-    private static final int EVENT_MOUSE_CLICK = 6;
-    private static final int EVENT_MOUSE_DOWN = 7;
-    private static final int EVENT_MOUSE_MOVE = 8;
-    private static final int EVENT_MOUSE_UP = 9;
-    private static final int EVENT_TOUCH_START = 10;
-    private static final int EVENT_TOUCH_MOVE = 11;
-    private static final int EVENT_TOUCH_END = 12;
-    private static final int EVENT_TOUCH_CANCEL = 13;
-    private static final int EVENT_ADD_TOUCH_POINT = 14;
-    private static final int EVENT_UPDATE_TOUCH_POINT = 15;
-    private static final int EVENT_RELEASE_TOUCH_POINT = 16;
-    private static final int EVENT_CLEAR_TOUCH_POINTS = 17;
-    private static final int EVENT_CANCEL_TOUCH_POINT = 18;
-    private static final int EVENT_SET_TOUCH_MODIFIER = 19;
-    private static final int LAYOUT_CLEAR_LIST = 20;
-    private static final int LAYOUT_DISPLAY = 21;
-    private static final int LAYOUT_DUMP_TEXT = 22;
-    private static final int LAYOUT_DUMP_HISTORY = 23;
-    private static final int LAYOUT_DUMP_CHILD_SCROLL = 24;
-    private static final int LAYOUT_DUMP_EDIT_CB = 25;
-    private static final int LAYOUT_DUMP_SEL_RECT = 26;
-    private static final int LAYOUT_DUMP_TITLE_CHANGES = 27;
-    private static final int LAYOUT_KEEP_WEB_HISTORY = 28;
-    private static final int LAYOUT_NOTIFY_DONE = 29;
-    private static final int LAYOUT_QUEUE_BACK_NAV = 30;
-    private static final int LAYOUT_QUEUE_FWD_NAV = 31;
-    private static final int LAYOUT_QUEUE_LOAD = 32;
-    private static final int LAYOUT_QUEUE_RELOAD = 33;
-    private static final int LAYOUT_QUEUE_SCRIPT = 34;
-    private static final int LAYOUT_REPAINT_HORZ = 35;
-    private static final int LAYOUT_SET_ACCEPT_EDIT = 36;
-    private static final int LAYOUT_MAIN_FIRST_RESP = 37;
-    private static final int LAYOUT_SET_WINDOW_KEY = 38;
-    private static final int LAYOUT_TEST_REPAINT = 39;
-    private static final int LAYOUT_WAIT_UNTIL_DONE = 40;
-    private static final int LAYOUT_DUMP_DATABASE_CALLBACKS = 41;
-    private static final int LAYOUT_SET_CAN_OPEN_WINDOWS = 42;
-    private static final int OVERRIDE_PREFERENCE = 43;
-    private static final int LAYOUT_DUMP_CHILD_FRAMES_TEXT = 44;
-    private static final int SET_XSS_AUDITOR_ENABLED = 45;
-    
-    CallbackProxy(EventSender eventSender, 
-            LayoutTestController layoutTestController) {
-        mEventSender = eventSender;
-        mLayoutTestController = layoutTestController;
-    }
-    
-    public void handleMessage(Message msg) {
-        switch (msg.what) {
-        case EVENT_DOM_LOG:
-            mEventSender.enableDOMUIEventLogging(msg.arg1);
-            break;
-        case EVENT_FIRE_KBD:
-            mEventSender.fireKeyboardEventsToElement(msg.arg1);
-            break;
-        case EVENT_KEY_DOWN_1:
-            HashMap map = (HashMap) msg.obj;
-            mEventSender.keyDown((String) map.get("character"), 
-                    (String[]) map.get("withModifiers"));
-            break;
-
-        case EVENT_KEY_DOWN_2:
-            mEventSender.keyDown((String)msg.obj);
-            break;
-
-        case EVENT_LEAP:
-            mEventSender.leapForward(msg.arg1);
-            break;
-
-        case EVENT_MOUSE_CLICK:
-            mEventSender.mouseClick();
-            break;
-
-        case EVENT_MOUSE_DOWN:
-            mEventSender.mouseDown();
-            break;
-
-        case EVENT_MOUSE_MOVE:
-            mEventSender.mouseMoveTo(msg.arg1, msg.arg2);
-            break;
-
-        case EVENT_MOUSE_UP:
-            mEventSender.mouseUp();
-            break;
-
-        case EVENT_TOUCH_START:
-            mEventSender.touchStart();
-            break;
-
-        case EVENT_TOUCH_MOVE:
-            mEventSender.touchMove();
-            break;
-
-        case EVENT_TOUCH_END:
-            mEventSender.touchEnd();
-            break;
-
-        case EVENT_TOUCH_CANCEL:
-            mEventSender.touchCancel();
-            break;
-
-        case EVENT_ADD_TOUCH_POINT:
-            mEventSender.addTouchPoint(msg.arg1, msg.arg2);
-            break;
-
-        case EVENT_UPDATE_TOUCH_POINT:
-            Bundle args = (Bundle) msg.obj;
-            int x = args.getInt("x");
-            int y = args.getInt("y");
-            int id = args.getInt("id");
-            mEventSender.updateTouchPoint(id, x, y);
-            break;
-
-        case EVENT_SET_TOUCH_MODIFIER:
-            Bundle modifierArgs = (Bundle) msg.obj;
-            String modifier = modifierArgs.getString("modifier");
-            boolean enabled = modifierArgs.getBoolean("enabled");
-            mEventSender.setTouchModifier(modifier, enabled);
-            break;
-
-        case EVENT_RELEASE_TOUCH_POINT:
-            mEventSender.releaseTouchPoint(msg.arg1);
-            break;
-
-        case EVENT_CLEAR_TOUCH_POINTS:
-            mEventSender.clearTouchPoints();
-            break;
-
-        case EVENT_CANCEL_TOUCH_POINT:
-            mEventSender.cancelTouchPoint(msg.arg1);
-            break;
-
-        case LAYOUT_CLEAR_LIST:
-            mLayoutTestController.clearBackForwardList();
-            break;
-
-        case LAYOUT_DISPLAY:
-            mLayoutTestController.display();
-            break;
-
-        case LAYOUT_DUMP_TEXT:
-            mLayoutTestController.dumpAsText(msg.arg1 == 1);
-            break;
-
-        case LAYOUT_DUMP_CHILD_FRAMES_TEXT:
-            mLayoutTestController.dumpChildFramesAsText();
-            break;
-
-        case LAYOUT_DUMP_HISTORY:
-            mLayoutTestController.dumpBackForwardList();
-            break;
-
-        case LAYOUT_DUMP_CHILD_SCROLL:
-            mLayoutTestController.dumpChildFrameScrollPositions();
-            break;
-
-        case LAYOUT_DUMP_EDIT_CB:
-            mLayoutTestController.dumpEditingCallbacks();
-            break;
-
-        case LAYOUT_DUMP_SEL_RECT:
-            mLayoutTestController.dumpSelectionRect();
-            break;
-
-        case LAYOUT_DUMP_TITLE_CHANGES:
-            mLayoutTestController.dumpTitleChanges();
-            break;
-
-        case LAYOUT_KEEP_WEB_HISTORY:
-            mLayoutTestController.keepWebHistory();
-            break;
-
-        case LAYOUT_NOTIFY_DONE:
-            mLayoutTestController.notifyDone();
-            break;
-
-        case LAYOUT_QUEUE_BACK_NAV:
-            mLayoutTestController.queueBackNavigation(msg.arg1);
-            break;
-
-        case LAYOUT_QUEUE_FWD_NAV:
-            mLayoutTestController.queueForwardNavigation(msg.arg1);
-            break;
-
-        case LAYOUT_QUEUE_LOAD:
-            HashMap<String, String> loadMap = 
-                (HashMap<String, String>) msg.obj;
-            mLayoutTestController.queueLoad(loadMap.get("Url"), 
-                    loadMap.get("frameTarget"));
-            break;
-
-        case LAYOUT_QUEUE_RELOAD:
-            mLayoutTestController.queueReload();
-            break;
-
-        case LAYOUT_QUEUE_SCRIPT:
-            mLayoutTestController.queueScript((String)msg.obj);
-            break;
-
-        case LAYOUT_REPAINT_HORZ:
-            mLayoutTestController.repaintSweepHorizontally();
-            break;
-
-        case LAYOUT_SET_ACCEPT_EDIT:
-            mLayoutTestController.setAcceptsEditing(
-                    msg.arg1 == 1 ? true : false);
-            break;
-        case LAYOUT_MAIN_FIRST_RESP:
-            mLayoutTestController.setMainFrameIsFirstResponder(
-                    msg.arg1 == 1 ? true : false);
-            break;
-
-        case LAYOUT_SET_WINDOW_KEY:
-            mLayoutTestController.setWindowIsKey(
-                    msg.arg1 == 1 ? true : false);
-            break;
-
-        case LAYOUT_TEST_REPAINT:
-            mLayoutTestController.testRepaint();
-            break;
-
-        case LAYOUT_WAIT_UNTIL_DONE:
-            mLayoutTestController.waitUntilDone();
-            break;
-
-        case LAYOUT_DUMP_DATABASE_CALLBACKS:
-            mLayoutTestController.dumpDatabaseCallbacks();
-            break;
-
-        case LAYOUT_SET_CAN_OPEN_WINDOWS:
-            mLayoutTestController.setCanOpenWindows();
-            break;
-
-        case OVERRIDE_PREFERENCE:
-            String key = msg.getData().getString("key");
-            boolean value = msg.getData().getBoolean("value");
-            mLayoutTestController.overridePreference(key, value);
-            break;
-
-        case SET_XSS_AUDITOR_ENABLED:
-            mLayoutTestController.setXSSAuditorEnabled(msg.arg1 == 1);
-            break;
-        }
-    }
-
-    // EventSender Methods
-    
-    public void enableDOMUIEventLogging(int DOMNode) {
-        obtainMessage(EVENT_DOM_LOG, DOMNode, 0).sendToTarget();
-    }
-
-    public void fireKeyboardEventsToElement(int DOMNode) {
-        obtainMessage(EVENT_FIRE_KBD, DOMNode, 0).sendToTarget();
-    }
-
-    public void keyDown(String character, String[] withModifiers) {
-        // TODO Auto-generated method stub
-        HashMap map = new HashMap();
-        map.put("character", character);
-        map.put("withModifiers", withModifiers);
-        obtainMessage(EVENT_KEY_DOWN_1, map).sendToTarget();
-    }
-
-    public void keyDown(String character) {
-        obtainMessage(EVENT_KEY_DOWN_2, character).sendToTarget();
-    }
-
-    public void leapForward(int milliseconds) {
-        obtainMessage(EVENT_LEAP, milliseconds, 0).sendToTarget(); 
-    }
-
-    public void mouseClick() {
-        obtainMessage(EVENT_MOUSE_CLICK).sendToTarget();
-    }
-
-    public void mouseDown() {
-        obtainMessage(EVENT_MOUSE_DOWN).sendToTarget();
-    }
-
-    public void mouseMoveTo(int X, int Y) {
-        obtainMessage(EVENT_MOUSE_MOVE, X, Y).sendToTarget();
-    }
-
-    public void mouseUp() {
-        obtainMessage(EVENT_MOUSE_UP).sendToTarget();
-    }
-
-    public void touchStart() {
-        obtainMessage(EVENT_TOUCH_START).sendToTarget();
-    }
-
-    public void addTouchPoint(int x, int y) {
-        obtainMessage(EVENT_ADD_TOUCH_POINT, x, y).sendToTarget();
-    }
-
-    public void updateTouchPoint(int id, int x, int y) {
-        Bundle map = new Bundle();
-        map.putInt("x", x);
-        map.putInt("y", y);
-        map.putInt("id", id);
-        obtainMessage(EVENT_UPDATE_TOUCH_POINT, map).sendToTarget();
-    }
-
-    public void setTouchModifier(String modifier, boolean enabled) {
-        Bundle map = new Bundle();
-        map.putString("modifier", modifier);
-        map.putBoolean("enabled", enabled);
-        obtainMessage(EVENT_SET_TOUCH_MODIFIER, map).sendToTarget();
-    }
-
-    public void touchMove() {
-        obtainMessage(EVENT_TOUCH_MOVE).sendToTarget();
-    }
-
-    public void releaseTouchPoint(int id) {
-        obtainMessage(EVENT_RELEASE_TOUCH_POINT, id, 0).sendToTarget();
-    }
-
-    public void touchEnd() {
-        obtainMessage(EVENT_TOUCH_END).sendToTarget();
-    }
-
-    public void touchCancel() {
-        obtainMessage(EVENT_TOUCH_CANCEL).sendToTarget();
-    }
-
-
-    public void clearTouchPoints() {
-        obtainMessage(EVENT_CLEAR_TOUCH_POINTS).sendToTarget();
-    }
-
-    public void cancelTouchPoint(int id) {
-        obtainMessage(EVENT_CANCEL_TOUCH_POINT, id, 0).sendToTarget();
-    }
-    
-    // LayoutTestController Methods
-
-    public void clearBackForwardList() {
-        obtainMessage(LAYOUT_CLEAR_LIST).sendToTarget();
-    }
-
-    public void display() {
-        obtainMessage(LAYOUT_DISPLAY).sendToTarget();
-    }
-
-    public void dumpAsText() {
-        obtainMessage(LAYOUT_DUMP_TEXT, 0).sendToTarget();
-    }
-
-    public void dumpAsText(boolean enablePixelTests) {
-        obtainMessage(LAYOUT_DUMP_TEXT, enablePixelTests ? 1 : 0).sendToTarget();
-    }
-
-    public void dumpChildFramesAsText() {
-        obtainMessage(LAYOUT_DUMP_CHILD_FRAMES_TEXT).sendToTarget();
-    }
-
-    public void dumpBackForwardList() {
-        obtainMessage(LAYOUT_DUMP_HISTORY).sendToTarget();
-    }
-
-    public void dumpChildFrameScrollPositions() {
-        obtainMessage(LAYOUT_DUMP_CHILD_SCROLL).sendToTarget();
-    }
-
-    public void dumpEditingCallbacks() {
-        obtainMessage(LAYOUT_DUMP_EDIT_CB).sendToTarget(); 
-    }
-
-    public void dumpSelectionRect() {
-        obtainMessage(LAYOUT_DUMP_SEL_RECT).sendToTarget(); 
-    }
-
-    public void dumpTitleChanges() {
-        obtainMessage(LAYOUT_DUMP_TITLE_CHANGES).sendToTarget();
-    }
-
-    public void keepWebHistory() {
-        obtainMessage(LAYOUT_KEEP_WEB_HISTORY).sendToTarget();
-    }
-
-    public void notifyDone() {
-        obtainMessage(LAYOUT_NOTIFY_DONE).sendToTarget();
-    }
-
-    public void queueBackNavigation(int howfar) {
-        obtainMessage(LAYOUT_QUEUE_BACK_NAV, howfar, 0).sendToTarget();
-    }
-
-    public void queueForwardNavigation(int howfar) {
-        obtainMessage(LAYOUT_QUEUE_FWD_NAV, howfar, 0).sendToTarget();
-    }
-
-    public void queueLoad(String Url, String frameTarget) {
-        HashMap <String, String>map = new HashMap<String, String>();
-        map.put("Url", Url);
-        map.put("frameTarget", frameTarget);
-        obtainMessage(LAYOUT_QUEUE_LOAD, map).sendToTarget();
-    }
-
-    public void queueReload() {
-        obtainMessage(LAYOUT_QUEUE_RELOAD).sendToTarget();
-    }
-
-    public void queueScript(String scriptToRunInCurrentContext) {
-        obtainMessage(LAYOUT_QUEUE_SCRIPT, 
-                scriptToRunInCurrentContext).sendToTarget();
-    }
-
-    public void repaintSweepHorizontally() {
-        obtainMessage(LAYOUT_REPAINT_HORZ).sendToTarget();
-    }
-
-    public void setAcceptsEditing(boolean b) {
-        obtainMessage(LAYOUT_SET_ACCEPT_EDIT, b ? 1 : 0, 0).sendToTarget();
-    }
-
-    public void setMainFrameIsFirstResponder(boolean b) {
-        obtainMessage(LAYOUT_MAIN_FIRST_RESP, b ? 1 : 0, 0).sendToTarget();
-    }
-
-    public void setWindowIsKey(boolean b) {
-        obtainMessage(LAYOUT_SET_WINDOW_KEY, b ? 1 : 0, 0).sendToTarget();
-    }
-
-    public void testRepaint() {
-        obtainMessage(LAYOUT_TEST_REPAINT).sendToTarget(); 
-    }
-
-    public void waitUntilDone() {
-        obtainMessage(LAYOUT_WAIT_UNTIL_DONE).sendToTarget();
-    }
-
-    public void dumpDatabaseCallbacks() {
-        obtainMessage(LAYOUT_DUMP_DATABASE_CALLBACKS).sendToTarget();
-    }
-
-    public void clearAllDatabases() {
-        WebStorage.getInstance().deleteAllData();
-    }
-
-    public void setDatabaseQuota(long quota) {
-        WebStorage.getInstance().setQuotaForOrigin("file://", quota);
-    }
-
-    public void setAppCacheMaximumSize(long size) {
-        android.webkit.WebStorageClassic.getInstance().setAppCacheMaximumSize(size);
-    }
-
-    public void setCanOpenWindows() {
-        obtainMessage(LAYOUT_SET_CAN_OPEN_WINDOWS).sendToTarget();
-    }
-
-    public void setMockGeolocationPosition(double latitude,
-                                           double longitude,
-                                           double accuracy) {
-        // Configuration is in WebKit, so stay on WebCore thread, but go via the TestShellActivity
-        // as we need access to the Webview.
-        mLayoutTestController.setMockGeolocationPosition(latitude,
-                                                         longitude,
-                                                         accuracy);
-    }
-
-    public void setMockGeolocationError(int code, String message) {
-        // Configuration is in WebKit, so stay on WebCore thread, but go via the TestShellActivity
-        // as we need access to the Webview.
-        mLayoutTestController.setMockGeolocationError(code, message);
-    }
-
-    public void setGeolocationPermission(boolean allow) {
-        // Configuration is in WebKit, so stay on WebCore thread, but go via the TestShellActivity
-        // as we need access to the Webview.
-        mLayoutTestController.setGeolocationPermission(allow);
-    }
-
-    public void setMockDeviceOrientation(boolean canProvideAlpha, double alpha,
-            boolean canProvideBeta, double beta, boolean canProvideGamma, double gamma) {
-        // Configuration is in WebKit, so stay on WebCore thread, but go via the TestShellActivity
-        // as we need access to the Webview.
-        mLayoutTestController.setMockDeviceOrientation(canProvideAlpha, alpha, canProvideBeta, beta,
-                canProvideGamma, gamma);
-    }
-
-    public void overridePreference(String key, boolean value) {
-        Message message = obtainMessage(OVERRIDE_PREFERENCE);
-        message.getData().putString("key", key);
-        message.getData().putBoolean("value", value);
-        message.sendToTarget();
-    }
-
-    public void setXSSAuditorEnabled(boolean flag) {
-        obtainMessage(SET_XSS_AUDITOR_ENABLED, flag ? 1 : 0, 0).sendToTarget();
-    }
-}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/EventSender.java b/tests/DumpRenderTree/src/com/android/dumprendertree/EventSender.java
deleted file mode 100644
index 23cc8f5..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/EventSender.java
+++ /dev/null
@@ -1,39 +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 com.android.dumprendertree;
-
-public interface EventSender {
-    	public void mouseDown();
-    	public void mouseUp();
-        public void mouseClick();
-        public void mouseMoveTo(int X, int Y);
-        public void leapForward(int milliseconds);
-        public void keyDown (String character, String[] withModifiers);
-        public void keyDown (String character);
-        public void enableDOMUIEventLogging(int DOMNode);
-        public void fireKeyboardEventsToElement(int DOMNode);
-        public void touchStart();
-        public void touchMove();
-        public void touchEnd();
-        public void touchCancel();
-        public void addTouchPoint(int x, int y);
-        public void updateTouchPoint(int id, int x, int y);
-        public void setTouchModifier(String modifier, boolean enabled);
-        public void releaseTouchPoint(int id);
-        public void clearTouchPoints();
-        public void cancelTouchPoint(int id);
-}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/FileFilter.java b/tests/DumpRenderTree/src/com/android/dumprendertree/FileFilter.java
deleted file mode 100644
index d373d8d..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/FileFilter.java
+++ /dev/null
@@ -1,229 +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 com.android.dumprendertree;
-
-import java.util.Vector;
-import android.util.*;
-
-public class FileFilter {
-
-    private static final String LOGTAG = "FileFilter";
-
-    // Returns whether we should ignore this test and skip running it.
-    // Currently we use this only for tests that crash or hang DumpRenderTree.
-    // TODO: Fix these and eliminate this method.
-    public static boolean ignoreTest(String file) {
-        for (int i = 0; i < ignoreTestList.length; i++) {
-            if (file.endsWith(ignoreTestList[i])) {
-                Log.v(LOGTAG, "File path in list of ignored tests: " + file);
-                return true;
-            }
-        }
-        return false;
-    }
-
-    // Returns whether a directory does not contain layout tests and so can be
-    // ignored.
-    public static boolean isNonTestDir(String file) {
-        for (int i = 0; i < nonTestDirs.length; i++) {
-            if (file.endsWith(nonTestDirs[i])) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    // Returns whether we should ignore the result of this test.
-    public static boolean ignoreResult(String file) {
-        for (int i = 0; i < ignoreResultList.size(); i++) {
-            if (file.endsWith(ignoreResultList.get(i))) {
-                Log.v(LOGTAG, "File path in list of ignored results: " + file);
-                return true;
-            }
-        }
-        return false;
-    }
-
-    final static Vector<String> ignoreResultList = new Vector<String>();
-
-    static {
-        fillIgnoreResultList();
-    }
-
-    static final String[] nonTestDirs = {
-        ".", // ignore hidden directories and files
-        "resources", // ignore resource directories
-        ".svn", // don't run anything under .svn folder
-        "platform"  // No-Android specific tests
-    };
-
-    static final String[] ignoreTestList = {
-        "canvas/philip/tests/2d.drawImage.broken.html", // blocks test, http://b/2982500
-        "editing/selection/move-left-right.html", // Causes DumpRenderTree to hang
-        "fast/js/excessive-comma-usage.html", // Tests huge initializer list, causes OOM.
-        "fast/js/regexp-charclass-crash.html", // RegExp is too large, causing OOM
-        "fast/js/regexp-overflow.html", // Result is too large, causing OOM when reading by DRT, http://b/2697589
-        "fast/regex/test1.html", // Causes DumpRenderTree to hang with V8
-        "fast/regex/slow.html", // Causes DumpRenderTree to hang with V8
-    };
-
-    static void fillIgnoreResultList() {
-        // This first block of tests are for features for which Android
-        // should pass all tests. They are skipped only temporarily.
-        // TODO: Fix these failing tests and remove them from this list.
-        ignoreResultList.add("fast/dom/HTMLKeygenElement/keygen.html"); // Missing layoutTestController.shadowRoot()
-        ignoreResultList.add("fast/dom/Geolocation/window-close-crash.html"); // Missing layoutTestContoller.setCloseRemainingWindowsWhenComplete()
-        ignoreResultList.add("fast/dom/Geolocation/page-reload-cancel-permission-requests.html"); // Missing layoutTestController.numberOfPendingGeolocationPermissionRequests()
-        ignoreResultList.add("fast/dom/HTMLLinkElement/link-and-subresource-test.html"); // Missing layoutTestController.dumpResourceResponseMIMETypes()
-        ignoreResultList.add("fast/dom/HTMLLinkElement/prefetch.html"); // Missing layoutTestController.dumpResourceResponseMIMETypes()
-        ignoreResultList.add("fast/dom/HTMLLinkElement/subresource.html"); // Missing layoutTestController.dumpResourceResponseMIMETypes()
-        ignoreResultList.add("fast/encoding/char-decoding.html"); // fails in Java HTTP stack, see http://b/issue?id=3047156
-        ignoreResultList.add("fast/encoding/hanarei-blog32-fc2-com.html"); // fails in Java HTTP stack, see http://b/issue?id=3046986
-        ignoreResultList.add("fast/encoding/mailto-always-utf-8.html"); // Requires waitForPolicyDelegate(), see http://b/issue?id=3043468
-        ignoreResultList.add("fast/encoding/percent-escaping.html"); // fails in Java HTTP stack, see http://b/issue?id=3046984
-        ignoreResultList.add("http/tests/appcache/empty-manifest.html"); // flaky
-        ignoreResultList.add("http/tests/appcache/fallback.html"); // http://b/issue?id=2713004
-        ignoreResultList.add("http/tests/appcache/foreign-fallback.html"); // Flaky, may be due to DRT, see http://b/3285647
-        ignoreResultList.add("http/tests/appcache/foreign-iframe-main.html"); // flaky - skips states
-        ignoreResultList.add("http/tests/appcache/manifest-with-empty-file.html"); // flaky
-        ignoreResultList.add("http/tests/appcache/origin-quota.html"); // needs clearAllApplicationCaches(), see http://b/issue?id=2944196
-        ignoreResultList.add("storage/database-lock-after-reload.html"); // Succeeds but DumpRenderTree does not read result correctly
-        ignoreResultList.add("storage/hash-change-with-xhr.html"); // Succeeds but DumpRenderTree does not read result correctly
-        ignoreResultList.add("storage/open-database-creation-callback-isolated-world.html"); // Requires layoutTestController.evaluateScriptInIsolatedWorld()
-        ignoreResultList.add("storage/statement-error-callback-isolated-world.html"); // Requires layoutTestController.evaluateScriptInIsolatedWorld()
-        ignoreResultList.add("storage/statement-success-callback-isolated-world.html"); // Requires layoutTestController.evaluateScriptInIsolatedWorld()
-        ignoreResultList.add("storage/storageinfo-query-usage.html"); // Need window.webkitStorageInfo
-        ignoreResultList.add("storage/transaction-callback-isolated-world.html"); // Requires layoutTestController.evaluateScriptInIsolatedWorld()
-        ignoreResultList.add("storage/transaction-error-callback-isolated-world.html"); // Requires layoutTestController.evaluateScriptInIsolatedWorld()
-        ignoreResultList.add("storage/transaction-success-callback-isolated-world.html"); // Requires layoutTestController.evaluateScriptInIsolatedWorld()
-        ignoreResultList.add("storage/domstorage/localstorage/storagetracker/storage-tracker-1-prepare.html"); // Missing layoutTestController.originsWithLocalStorage()
-        ignoreResultList.add("storage/domstorage/localstorage/storagetracker/storage-tracker-2-create.html"); // Missing layoutTestController.originsWithLocalStorage()
-        ignoreResultList.add("storage/domstorage/localstorage/storagetracker/storage-tracker-3-delete-all.html"); // Missing layoutTestController.originsWithLocalStorage()
-        ignoreResultList.add("storage/domstorage/localstorage/storagetracker/storage-tracker-4-create.html"); // Missing layoutTestController.originsWithLocalStorage()
-        ignoreResultList.add("storage/domstorage/localstorage/storagetracker/storage-tracker-5-delete-one.html"); // Missing layoutTestController.originsWithLocalStorage()
-
-
-        // Expected failures due to unsupported features or tests unsuitable for Android.
-        ignoreResultList.add("fast/encoding/char-decoding-mac.html"); // Mac-specific encodings (also marked Won't Fix in Chromium, bug 7388)
-        ignoreResultList.add("fast/encoding/char-encoding-mac.html"); // Mac-specific encodings (also marked Won't Fix in Chromium, bug 7388)
-        ignoreResultList.add("fast/encoding/idn-security.html"); // Mac-specific IDN checks (also marked Won't Fix in Chromium, bug 21814)
-        ignoreResultList.add("fast/events/touch/basic-multi-touch-events.html"); // Requires multi-touch gestures not supported by Android system
-        ignoreResultList.add("fast/events/touch/touch-coords-in-zoom-and-scroll.html"); // Requires eventSender.zoomPageIn(),zoomPageOut()
-        ignoreResultList.add("fast/events/touch/touch-target.html"); // Requires multi-touch gestures not supported by Android system
-        ignoreResultList.add("fast/workers"); // workers not supported
-        ignoreResultList.add("http/tests/cookies/third-party-cookie-relaxing.html"); // We don't support conditional acceptance of third-party cookies
-        ignoreResultList.add("http/tests/eventsource/workers"); // workers not supported
-        ignoreResultList.add("http/tests/workers"); // workers not supported
-        ignoreResultList.add("http/tests/xmlhttprequest/workers"); // workers not supported
-        ignoreResultList.add("storage/domstorage/localstorage/private-browsing-affects-storage.html"); // private browsing not supported
-        ignoreResultList.add("storage/domstorage/sessionstorage/private-browsing-affects-storage.html"); // private browsing not supported
-        ignoreResultList.add("storage/indexeddb"); // indexeddb not supported
-        ignoreResultList.add("storage/private-browsing-noread-nowrite.html"); // private browsing not supported
-        ignoreResultList.add("storage/private-browsing-readonly.html"); // private browsing not supported
-        ignoreResultList.add("websocket/tests/workers"); // workers not supported
-        ignoreResultList.add("dom/xhtml/level2/html/htmldocument04.xhtml"); // /mnt/sdcard on SR uses lowercase filesystem, this test checks filename and is case senstive.
-        ignoreResultList.add("dom/html/level2/html/htmldocument04.html"); // ditto
-
-        // Expected failures due to missing expected results
-        ignoreResultList.add("dom/xhtml/level3/core/canonicalform08.xhtml");
-        ignoreResultList.add("dom/xhtml/level3/core/canonicalform09.xhtml");
-        ignoreResultList.add("dom/xhtml/level3/core/documentgetinputencoding03.xhtml");
-        ignoreResultList.add("dom/xhtml/level3/core/entitygetinputencoding02.xhtml");
-        ignoreResultList.add("dom/xhtml/level3/core/entitygetxmlversion02.xhtml");
-        ignoreResultList.add("dom/xhtml/level3/core/nodegetbaseuri05.xhtml");
-        ignoreResultList.add("dom/xhtml/level3/core/nodegetbaseuri07.xhtml");
-        ignoreResultList.add("dom/xhtml/level3/core/nodegetbaseuri09.xhtml");
-        ignoreResultList.add("dom/xhtml/level3/core/nodegetbaseuri10.xhtml");
-        ignoreResultList.add("dom/xhtml/level3/core/nodegetbaseuri11.xhtml");
-        ignoreResultList.add("dom/xhtml/level3/core/nodegetbaseuri15.xhtml");
-        ignoreResultList.add("dom/xhtml/level3/core/nodegetbaseuri17.xhtml");
-        ignoreResultList.add("dom/xhtml/level3/core/nodegetbaseuri18.xhtml");
-        ignoreResultList.add("dom/xhtml/level3/core/nodelookupnamespaceuri01.xhtml");
-        ignoreResultList.add("dom/xhtml/level3/core/nodelookupprefix19.xhtml");
-
-        // TODO: These need to be triaged
-        ignoreResultList.add("fast/css/case-transform.html"); // will not fix #619707
-        ignoreResultList.add("fast/dom/Element/offsetLeft-offsetTop-body-quirk.html"); // different screen size result in extra spaces in Apple compared to us
-        ignoreResultList.add("fast/dom/Window/Plug-ins.html"); // need test plugin
-        ignoreResultList.add("fast/dom/Window/window-screen-properties.html"); // pixel depth
-        ignoreResultList.add("fast/dom/Window/window-xy-properties.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/dom/attribute-namespaces-get-set.html"); // http://b/733229
-        ignoreResultList.add("fast/dom/object-embed-plugin-scripting.html"); // dynamic plugins not supported
-        ignoreResultList.add("fast/dom/tabindex-clamp.html"); // there is extra spacing in the file due to multiple input boxes fitting on one line on Apple, ours are wrapped. Space at line ends are stripped.
-        ignoreResultList.add("fast/events/anchor-image-scrolled-x-y.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/arrow-navigation.html"); // http://b/735233
-        ignoreResultList.add("fast/events/capture-on-target.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/dblclick-addEventListener.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/drag-in-frames.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/drag-outside-window.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/event-view-toString.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/frame-click-focus.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/frame-tab-focus.html"); // http://b/734308
-        ignoreResultList.add("fast/events/iframe-object-onload.html"); // there is extra spacing in the file due to multiple frame boxes fitting on one line on Apple, ours are wrapped. Space at line ends are stripped.
-        ignoreResultList.add("fast/events/input-image-scrolled-x-y.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/mouseclick-target-and-positioning.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/mouseover-mouseout.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/mouseover-mouseout2.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/mouseup-outside-button.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/mouseup-outside-document.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/onclick-list-marker.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/ondragenter.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/onload-webkit-before-webcore.html"); // missing space in textrun, ok as text is wrapped. ignore. #714933
-        ignoreResultList.add("fast/events/option-tab.html"); // http://b/734308
-        ignoreResultList.add("fast/events/window-events-bubble.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/window-events-bubble2.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/window-events-capture.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/forms/drag-into-textarea.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/forms/focus-control-to-page.html"); // http://b/716638
-        ignoreResultList.add("fast/forms/focus2.html"); // http://b/735111
-        ignoreResultList.add("fast/forms/form-data-encoding-2.html"); // charset convert. #516936 ignore, won't fix
-        ignoreResultList.add("fast/forms/form-data-encoding.html"); // charset convert. #516936 ignore, won't fix
-        ignoreResultList.add("fast/forms/input-appearance-maxlength.html"); // execCommand "insertText" not supported
-        ignoreResultList.add("fast/forms/input-select-on-click.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/forms/listbox-onchange.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/forms/listbox-selection.html"); // http://b/735116
-        ignoreResultList.add("fast/forms/onselect-textarea.html"); // requires eventSender.mouseMoveTo, mouseDown & mouseUp and abs. position of mouse to select a word. ignore, won't fix #716583
-        ignoreResultList.add("fast/forms/onselect-textfield.html"); // requires eventSender.mouseMoveTo, mouseDown & mouseUp and abs. position of mouse to select a word. ignore, won't fix #716583
-        ignoreResultList.add("fast/forms/plaintext-mode-1.html"); // not implemented queryCommandEnabled:BackColor, Undo & Redo
-        ignoreResultList.add("fast/forms/search-cancel-button-mouseup.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/forms/search-event-delay.html"); // http://b/735120
-        ignoreResultList.add("fast/forms/select-empty-list.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/forms/select-type-ahead-non-latin.html"); // http://b/735244
-        ignoreResultList.add("fast/forms/selected-index-assert.html"); // not capturing the console messages
-        ignoreResultList.add("fast/forms/selection-functions.html"); // there is extra spacing as the text areas and input boxes fit next to each other on Apple, but are wrapped on our screen.
-        ignoreResultList.add("fast/forms/textarea-appearance-wrap.html"); // Our text areas are a little thinner than Apples. Also RTL test failes
-        ignoreResultList.add("fast/forms/textarea-initial-caret-position.html"); // Text selection done differently on our platform. When a inputbox gets focus, the entire block is selected.
-        ignoreResultList.add("fast/forms/textarea-no-scroll-on-blur.html"); // Text selection done differently on our platform. When a inputbox gets focus, the entire block is selected.
-        ignoreResultList.add("fast/forms/textarea-paste-newline.html"); // Copy&Paste commands not supported
-        ignoreResultList.add("fast/forms/textarea-scrolled-endline-caret.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/frames/iframe-window-focus.html"); // http://b/735140
-        ignoreResultList.add("fast/frames/frameElement-widthheight.html"); // screen width&height are different
-        ignoreResultList.add("fast/frames/frame-js-url-clientWidth.html"); // screen width&height are different
-        ignoreResultList.add("fast/html/tab-order.html"); // http://b/719289
-        ignoreResultList.add("fast/js/navigator-mimeTypes-length.html"); // dynamic plugins not supported
-        ignoreResultList.add("fast/js/string-capitalization.html"); // http://b/516936
-        ignoreResultList.add("fast/loader/local-JavaScript-from-local.html"); // Requires LayoutTests to exist at /tmp/LayoutTests
-        ignoreResultList.add("fast/loader/local-iFrame-source-from-local.html"); // Requires LayoutTests to exist at /tmp/LayoutTests
-        ignoreResultList.add("fast/loader/opaque-base-url.html"); // extra spacing because iFrames rendered next to each other on Apple
-        ignoreResultList.add("fast/overflow/scroll-vertical-not-horizontal.html"); // http://b/735196
-        ignoreResultList.add("fast/parser/script-tag-with-trailing-slash.html"); // not capturing the console messages
-        ignoreResultList.add("fast/replaced/image-map.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/text/plain-text-line-breaks.html"); // extra spacing because iFrames rendered next to each other on Apple
-        ignoreResultList.add("profiler"); // profiler is not supported
-    }
-
-}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/FileList.java b/tests/DumpRenderTree/src/com/android/dumprendertree/FileList.java
deleted file mode 100644
index 4a47a0e..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/FileList.java
+++ /dev/null
@@ -1,196 +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 com.android.dumprendertree;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.io.File;
-
-import android.app.AlertDialog;
-import android.app.ListActivity;
-import android.content.DialogInterface;
-import android.view.KeyEvent;
-import android.view.View;
-import android.widget.ListView;
-import android.widget.SimpleAdapter;
-import android.os.Bundle;
-import android.os.Environment;
-
-
-public abstract class FileList extends ListActivity
-{
-	public boolean onKeyDown(int keyCode, KeyEvent event) {
-		switch (keyCode)
-		{
-			case KeyEvent.KEYCODE_DPAD_LEFT:
-				if (mPath.length() > mBaseLength) {
-					File f = new File(mPath);
-					mFocusFile = f.getName();
-					mFocusIndex = 0;
-					f = f.getParentFile();
-					mPath = f.getPath();
-					updateList();
-					return true;
-				}
-				break;
-
-			case KeyEvent.KEYCODE_DPAD_RIGHT:
-				{
-					Map map = (Map) getListView().getItemAtPosition(getListView().getSelectedItemPosition());
-					String path = (String)map.get("path");
-					if ((new File(path)).isDirectory()) {
-						mPath = path;
-				        mFocusFile = null;
-						updateList();
-					} else {
-						processFile(path, false);
-					}
-                    return true;
-				}
-
-			default:
-				break;
-		}
-		return super.onKeyDown(keyCode, event);
-	}
-
-	public void onCreate(Bundle icicle)
-    {
-        super.onCreate(icicle);
-        setupPath();
-        updateList();
-    }
-
-    protected List getData()
-    {
-        List myData = new ArrayList<HashMap>();
-
-        File f = new File(mPath);
-        if (!f.exists()) {
-        	addItem(myData, "!LayoutTests path missing!", "");
-        	return myData;
-        }
-        String[] files = f.list();
-        Arrays.sort(files);
-
-        for (int i = 0; i < files.length; i++) {
-        	StringBuilder sb = new StringBuilder(mPath);
-        	sb.append(File.separatorChar);
-        	sb.append(files[i]);
-        	String path = sb.toString();
-        	File c = new File(path);
-        	if (fileFilter(c)) {
-	        	if (c.isDirectory()) {
-	        		addItem(myData, "<"+files[i]+">", path);
-	        		if (mFocusFile != null && mFocusFile.equals(files[i]))
-	        			mFocusIndex = myData.size()-1;
-	        	}
-	        	else
-	        	    addItem(myData, files[i], path);
-        	}
-        }
-
-        return myData;
-    }
-
-    protected void addItem(List<Map> data, String name, String path)
-    {
-        HashMap temp = new HashMap();
-        temp.put("title", name);
-        temp.put("path", path);
-        data.add(temp);
-    }
-
-    protected void onListItemClick(ListView l, View v, int position, long id)
-    {
-        Map map = (Map) l.getItemAtPosition(position);
-        final String path = (String)map.get("path");
-
-        if ((new File(path)).isDirectory()) {
-            final CharSequence[] items = {"Open", "Run"};
-            AlertDialog.Builder builder = new AlertDialog.Builder(this);
-            builder.setTitle("Select an Action");
-            builder.setSingleChoiceItems(items, -1,
-                    new DialogInterface.OnClickListener(){
-                public void onClick(DialogInterface dialog, int which) {
-                    switch (which) {
-                        case OPEN_DIRECTORY:
-                            dialog.dismiss();
-                            mPath = path;
-                            mFocusFile = null;
-                            updateList();
-                            break;
-                        case RUN_TESTS:
-                            dialog.dismiss();
-                            processDirectory(path, false);
-                            break;
-                    }
-                }
-            });
-            builder.create().show();
-        } else {
-            processFile(path, false);
-        }
-    }
-
-    /*
-     * This function is called when the user has selected a directory in the
-     * list and wants to perform an action on it instead of navigating into
-     * the directory.
-     */
-    abstract void processDirectory(String path, boolean selection);
-    /*
-     * This function is called when the user has selected a file in the
-     * file list. The selected file could be a file or a directory.
-     * The flag indicates if this was from a selection or not.
-     */
-    abstract void processFile(String filename, boolean selection);
-
-    /*
-     * This function is called when the file list is being built. Return
-     * true if the file is to be added to the file list.
-     */
-    abstract boolean fileFilter(File f);
-
-    protected void updateList() {
-        setListAdapter(new SimpleAdapter(this,
-                getData(),
-                android.R.layout.simple_list_item_1,
-                new String[] {"title"},
-                new int[] {android.R.id.text1}));
-        String title = mPath; //.substring(mBaseLength-11); // show the word LayoutTests
-        setTitle(title);
-        getListView().setSelection(mFocusIndex);
-    }
-
-    protected void setupPath() {
-        mPath = Environment.getExternalStorageDirectory() + "/webkit/layout_tests";
-        mBaseLength = mPath.length();
-    }
-
-    protected String mPath;
-    protected int mBaseLength;
-    protected String mFocusFile;
-    protected int mFocusIndex;
-
-    private final static int OPEN_DIRECTORY = 0;
-    private final static int RUN_TESTS = 1;
-
-}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/FsUtils.java b/tests/DumpRenderTree/src/com/android/dumprendertree/FsUtils.java
deleted file mode 100644
index b7d2c26..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/FsUtils.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * 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.dumprendertree;
-
-import com.android.dumprendertree.forwarder.ForwardService;
-
-import android.os.Environment;
-import android.util.Log;
-
-import java.io.BufferedOutputStream;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.regex.Pattern;
-
-public class FsUtils {
-
-    private static final String LOGTAG = "FsUtils";
-    static final String EXTERNAL_DIR = Environment.getExternalStorageDirectory().toString();
-    static final String HTTP_TESTS_PREFIX =
-        EXTERNAL_DIR + "/webkit/layout_tests/http/tests/";
-    static final String HTTPS_TESTS_PREFIX =
-        EXTERNAL_DIR + "/webkit/layout_tests/http/tests/ssl/";
-    static final String HTTP_LOCAL_TESTS_PREFIX =
-        EXTERNAL_DIR + "/webkit/layout_tests/http/tests/local/";
-    static final String HTTP_MEDIA_TESTS_PREFIX =
-        EXTERNAL_DIR + "/webkit/layout_tests/http/tests/media/";
-    static final String HTTP_WML_TESTS_PREFIX =
-        EXTERNAL_DIR + "/webkit/layout_tests/http/tests/wml/";
-
-    private FsUtils() {
-        //no creation of instances
-    }
-
-    /**
-     * @return the number of tests in the list.
-     */
-    public static int writeLayoutTestListRecursively(BufferedOutputStream bos,
-            String dir, boolean ignoreResultsInDir) throws IOException {
-
-        int testCount = 0;
-        Log.v(LOGTAG, "Searching tests under " + dir);
-
-        File d = new File(dir);
-        if (!d.isDirectory()) {
-            throw new AssertionError("A directory expected, but got " + dir);
-        }
-        ignoreResultsInDir |= FileFilter.ignoreResult(dir);
-
-        String[] files = d.list();
-        for (int i = 0; i < files.length; i++) {
-            String s = dir + "/" + files[i];
-
-            File f = new File(s);
-            if (f.isDirectory()) {
-                // If this is not a test directory, we don't recurse into it.
-                if (!FileFilter.isNonTestDir(s)) {
-                    Log.v(LOGTAG, "Recursing on " + s);
-                    testCount += writeLayoutTestListRecursively(bos, s, ignoreResultsInDir);
-                }
-                continue;
-            }
-
-            // If this test should be ignored, we skip it completely.
-            if (FileFilter.ignoreTest(s)) {
-                Log.v(LOGTAG, "Ignoring: " + s);
-                continue;
-            }
-
-            if ((s.toLowerCase().endsWith(".html")
-                    || s.toLowerCase().endsWith(".xml")
-                    || s.toLowerCase().endsWith(".xhtml"))
-                    && !s.endsWith("TEMPLATE.html")) {
-                Log.v(LOGTAG, "Recording " + s);
-                bos.write(s.getBytes());
-                // If the result of this test should be ignored, we still run the test.
-                if (ignoreResultsInDir || FileFilter.ignoreResult(s)) {
-                    bos.write((" IGNORE_RESULT").getBytes());
-                }
-                bos.write('\n');
-                testCount++;
-            }
-        }
-        return testCount;
-    }
-
-    public static void updateTestStatus(String statusFile, String s) {
-        try {
-            BufferedOutputStream bos = new BufferedOutputStream(
-                    new FileOutputStream(statusFile));
-            bos.write(s.getBytes());
-            bos.close();
-        } catch (Exception e) {
-            Log.e(LOGTAG, "Cannot update file " + statusFile);
-        }
-    }
-
-    public static String readTestStatus(String statusFile) {
-        // read out the test name it stopped last time.
-        String status = null;
-        File testStatusFile = new File(statusFile);
-        if(testStatusFile.exists()) {
-            try {
-                BufferedReader inReader = new BufferedReader(
-                        new FileReader(testStatusFile));
-                status = inReader.readLine();
-                inReader.close();
-            } catch (IOException e) {
-                Log.e(LOGTAG, "Error reading test status.", e);
-            }
-        }
-        return status;
-    }
-
-    public static String getTestUrl(String path) {
-        String url = null;
-        if (!path.startsWith(HTTP_TESTS_PREFIX)) {
-            url = "file://" + path;
-        } else {
-            ForwardService.getForwardService().startForwardService();
-            if (path.startsWith(HTTPS_TESTS_PREFIX)) {
-                // still cut the URL after "http/tests/"
-                url = "https://127.0.0.1:8443/" + path.substring(HTTP_TESTS_PREFIX.length());
-            } else if (!path.startsWith(HTTP_LOCAL_TESTS_PREFIX)
-                    && !path.startsWith(HTTP_MEDIA_TESTS_PREFIX)
-                    && !path.startsWith(HTTP_WML_TESTS_PREFIX)) {
-                url = "http://127.0.0.1:8000/" + path.substring(HTTP_TESTS_PREFIX.length());
-            } else {
-                url = "file://" + path;
-            }
-        }
-        return url;
-    }
-
-    public static boolean diffIgnoreSpaces(String file1, String file2)  throws IOException {
-        BufferedReader br1 = new BufferedReader(new FileReader(file1));
-        BufferedReader br2 = new BufferedReader(new FileReader(file2));
-        boolean same = true;
-        Pattern trailingSpace = Pattern.compile("\\s+$");
-
-        while(true) {
-            String line1 = br1.readLine();
-            String line2 = br2.readLine();
-
-            if (line1 == null && line2 == null)
-                break;
-            if (line1 != null) {
-                line1 = trailingSpace.matcher(line1).replaceAll("");
-            } else {
-                line1 = "";
-            }
-            if (line2 != null) {
-                line2 = trailingSpace.matcher(line2).replaceAll("");
-            } else {
-                line2 = "";
-            }
-            if(!line1.equals(line2)) {
-                same = false;
-                break;
-            }
-        }
-
-        br1.close();
-        br2.close();
-
-        return same;
-    }
-
-    public static boolean isTestPageUrl(String url) {
-        int qmPostion = url.indexOf('?');
-        int slashPostion = url.lastIndexOf('/');
-        if (slashPostion < qmPostion) {
-            String fileName = url.substring(slashPostion + 1, qmPostion);
-            if ("index.html".equals(fileName)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public static String getLastSegmentInPath(String path) {
-        int endPos = path.lastIndexOf('/');
-        path = path.substring(0, endPos);
-        endPos = path.lastIndexOf('/');
-        return path.substring(endPos + 1);
-    }
-
-    public static void writeDrawTime(String fileName, String url, long[] times) {
-        StringBuffer lineBuffer = new StringBuffer();
-        // grab the last segment of path in url
-        lineBuffer.append(getLastSegmentInPath(url));
-        for (long time : times) {
-            lineBuffer.append('\t');
-            lineBuffer.append(time);
-        }
-        lineBuffer.append('\n');
-        String line = lineBuffer.toString();
-        Log.v(LOGTAG, "logging draw times: " + line);
-        try {
-            FileWriter fw = new FileWriter(fileName, true);
-            fw.write(line);
-            fw.close();
-        } catch (IOException ioe) {
-            Log.e(LOGTAG, "Failed to log draw times", ioe);
-        }
-    }
-
-}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/HTMLHostApp.java b/tests/DumpRenderTree/src/com/android/dumprendertree/HTMLHostApp.java
deleted file mode 100644
index f610f5a..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/HTMLHostApp.java
+++ /dev/null
@@ -1,33 +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 com.android.dumprendertree;
-
-import android.app.Application;
-
-public class HTMLHostApp extends Application { 
-
-	public HTMLHostApp() {
-    }
-
-    public void onCreate() {
-    }
-
-    public void onTerminate() {
-    }
-	
-}
-
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestController.java b/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestController.java
deleted file mode 100644
index c936a6c..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestController.java
+++ /dev/null
@@ -1,82 +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 com.android.dumprendertree;
-
-public interface LayoutTestController {
-
-    public void dumpAsText(boolean enablePixelTests);
-    public void dumpChildFramesAsText();
-    public void waitUntilDone();
-    public void notifyDone();
-
-    // Force a redraw of the page
-    public void display();
-    // Used with pixel dumps of content
-    public void testRepaint();
-
-    // If the page title changes, add the information to the output.
-    public void dumpTitleChanges();
-    public void dumpBackForwardList();
-    public void dumpChildFrameScrollPositions();
-    public void dumpEditingCallbacks();
-
-    // Show/Hide window for window.onBlur() testing
-    public void setWindowIsKey(boolean b);
-    // Mac function, used to disable events going to the window
-    public void setMainFrameIsFirstResponder(boolean b);
-
-    public void dumpSelectionRect();
-
-    // invalidate and draw one line at a time of the web view.
-    public void repaintSweepHorizontally();
-    
-    // History testing functions
-    public void keepWebHistory();
-    public void clearBackForwardList();
-    // navigate after page load has finished
-    public void queueBackNavigation(int howfar);
-    public void queueForwardNavigation(int howfar);
-    
-    // Reload when the page load has finished
-    public void queueReload();
-    // Execute the provided script in current context when page load has finished.
-    public void queueScript(String scriptToRunInCurrentContext);
-    // Load the provided URL into the provided frame
-    public void queueLoad(String Url, String frameTarget);
-
-    public void setAcceptsEditing(boolean b);
-
-    // For storage tests
-    public void dumpDatabaseCallbacks();
-    public void setCanOpenWindows();
-
-    // For Geolocation tests
-    public void setGeolocationPermission(boolean allow);
-
-    public void overridePreference(String key, boolean value);
-
-    // For XSSAuditor tests
-    public void setXSSAuditorEnabled(boolean flag);
-
-    // For Geolocation tests
-    public void setMockGeolocationPosition(double latitude, double longitude, double accuracy);
-    public void setMockGeolocationError(int code, String message);
-
-    // For DeviceOrientation tests
-    public void setMockDeviceOrientation(boolean canProvideAlpha, double alpha,
-            boolean canProvideBeta, double beta, boolean canProvideGamma, double gamma);
-}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestsAutoRunner.java b/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestsAutoRunner.java
deleted file mode 100644
index fb2a1f4..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestsAutoRunner.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 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.
- * 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.dumprendertree;
-
-import android.os.Bundle;
-import android.test.InstrumentationTestRunner;
-import android.test.InstrumentationTestSuite;
-
-import junit.framework.TestSuite;
-
-
-/**
- * Instrumentation Test Runner for all DumpRenderTree tests.
- *
- * Running all tests:
- *
- * adb shell am instrument \
- *   -w com.android.dumprendertree.LayoutTestsAutoRunner
- */
-
-public class LayoutTestsAutoRunner extends InstrumentationTestRunner {
-    @Override
-    public TestSuite getAllTests() {
-        TestSuite suite = new InstrumentationTestSuite(this);
-        suite.addTestSuite(LayoutTestsAutoTest.class);
-        suite.addTestSuite(LoadTestsAutoTest.class);
-        return suite;
-    }
-
-    @Override
-    public ClassLoader getLoader() {
-        return LayoutTestsAutoRunner.class.getClassLoader();
-    }
-
-    @Override
-    public void onCreate(Bundle icicle) {
-        this.mTestPath = (String) icicle.get("path");
-        String timeout_str = (String) icicle.get("timeout");
-        if (timeout_str != null) {
-            try {
-                this.mTimeoutInMillis = Integer.parseInt(timeout_str);
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-        }
-
-        String r = icicle.getString("rebaseline");
-        this.mRebaseline = (r != null && r.toLowerCase().equals("true"));
-
-        mJsEngine = icicle.getString("jsengine");
-
-        mPageCyclerSuite = icicle.getString("suite");
-        mPageCyclerForwardHost = icicle.getString("forward");
-        mPageCyclerIteration = icicle.getString("iteration", "5");
-
-        super.onCreate(icicle);
-    }
-
-    String mPageCyclerSuite;
-    String mPageCyclerForwardHost;
-    String mPageCyclerIteration;
-    String mTestPath;
-    int mTimeoutInMillis = 0;
-    boolean mRebaseline;
-    String mJsEngine;
-}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestsAutoTest.java b/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestsAutoTest.java
deleted file mode 100644
index 3fe4e70..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestsAutoTest.java
+++ /dev/null
@@ -1,494 +0,0 @@
-/*
- * Copyright (C) 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.
- * 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.dumprendertree;
-
-import com.android.dumprendertree.TestShellActivity.DumpDataType;
-import com.android.dumprendertree.forwarder.AdbUtils;
-import com.android.dumprendertree.forwarder.ForwardService;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Environment;
-import android.test.ActivityInstrumentationTestCase2;
-import android.util.Log;
-
-import java.io.BufferedOutputStream;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Vector;
-
-// TestRecorder creates four files ...
-// - passing tests
-// - failing tests
-// - tests for which results are ignored
-// - tests with no text results available
-// TestRecorder does not have the ability to clear the results.
-class MyTestRecorder {
-    private BufferedOutputStream mBufferedOutputPassedStream;
-    private BufferedOutputStream mBufferedOutputFailedStream;
-    private BufferedOutputStream mBufferedOutputIgnoreResultStream;
-    private BufferedOutputStream mBufferedOutputNoResultStream;
-
-    public void passed(String layout_file) {
-        try {
-            mBufferedOutputPassedStream.write(layout_file.getBytes());
-            mBufferedOutputPassedStream.write('\n');
-            mBufferedOutputPassedStream.flush();
-        } catch(Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    public void failed(String layout_file) {
-        try {
-            mBufferedOutputFailedStream.write(layout_file.getBytes());
-            mBufferedOutputFailedStream.write('\n');
-            mBufferedOutputFailedStream.flush();
-        } catch(Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    public void ignoreResult(String layout_file) {
-        try {
-            mBufferedOutputIgnoreResultStream.write(layout_file.getBytes());
-            mBufferedOutputIgnoreResultStream.write('\n');
-            mBufferedOutputIgnoreResultStream.flush();
-        } catch(Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    public void noResult(String layout_file) {
-        try {
-            mBufferedOutputNoResultStream.write(layout_file.getBytes());
-            mBufferedOutputNoResultStream.write('\n');
-            mBufferedOutputNoResultStream.flush();
-        } catch(Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    public MyTestRecorder(boolean resume) {
-        try {
-            File externalDir = Environment.getExternalStorageDirectory();
-            File resultsPassedFile = new File(externalDir, "layout_tests_passed.txt");
-            File resultsFailedFile = new File(externalDir, "layout_tests_failed.txt");
-            File resultsIgnoreResultFile = new File(externalDir, "layout_tests_ignored.txt");
-            File noExpectedResultFile = new File(externalDir, "layout_tests_nontext.txt");
-
-            mBufferedOutputPassedStream =
-                new BufferedOutputStream(new FileOutputStream(resultsPassedFile, resume));
-            mBufferedOutputFailedStream =
-                new BufferedOutputStream(new FileOutputStream(resultsFailedFile, resume));
-            mBufferedOutputIgnoreResultStream =
-                new BufferedOutputStream(new FileOutputStream(resultsIgnoreResultFile, resume));
-            mBufferedOutputNoResultStream =
-                new BufferedOutputStream(new FileOutputStream(noExpectedResultFile, resume));
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    public void close() {
-        try {
-            mBufferedOutputPassedStream.close();
-            mBufferedOutputFailedStream.close();
-            mBufferedOutputIgnoreResultStream.close();
-            mBufferedOutputNoResultStream.close();
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-}
-
-
-public class LayoutTestsAutoTest extends ActivityInstrumentationTestCase2<TestShellActivity> {
-
-    private static final String LOGTAG = "LayoutTests";
-    static final int DEFAULT_TIMEOUT_IN_MILLIS = 5000;
-
-    static final String EXTERNAL_DIR = Environment.getExternalStorageDirectory().toString();
-    static final String LAYOUT_TESTS_ROOT = EXTERNAL_DIR + "/webkit/layout_tests/";
-    static final String LAYOUT_TESTS_RESULT_DIR = EXTERNAL_DIR + "/webkit/layout_tests_results/";
-    static final String ANDROID_EXPECTED_RESULT_DIR = EXTERNAL_DIR + "/webkit/expected_results/";
-    static final String LAYOUT_TESTS_LIST_FILE = EXTERNAL_DIR + "/webkit/layout_tests_list.txt";
-    static final String TEST_STATUS_FILE = EXTERNAL_DIR + "/webkit/running_test.txt";
-    static final String LAYOUT_TESTS_RESULTS_REFERENCE_FILES[] = {
-          "results/layout_tests_passed.txt",
-          "results/layout_tests_failed.txt",
-          "results/layout_tests_nontext.txt",
-          "results/layout_tests_crashed.txt",
-          "run_layout_tests.py"
-    };
-
-    static final String LAYOUT_RESULTS_FAILED_RESULT_FILE = "results/layout_tests_failed.txt";
-    static final String LAYOUT_RESULTS_NONTEXT_RESULT_FILE = "results/layout_tests_nontext.txt";
-    static final String LAYOUT_RESULTS_CRASHED_RESULT_FILE = "results/layout_tests_crashed.txt";
-    static final String LAYOUT_TESTS_RUNNER = "run_layout_tests.py";
-
-    private MyTestRecorder mResultRecorder;
-    private Vector<String> mTestList;
-    // Whether we should ignore the result for the corresponding test. Ordered same as mTestList.
-    private Vector<Boolean> mTestListIgnoreResult;
-    private boolean mRebaselineResults;
-    // The JavaScript engine currently in use. This determines which set of Android-specific
-    // expected test results we use.
-    private String mJsEngine;
-    private String mTestPathPrefix;
-    private boolean mFinished;
-    private int mTestCount;
-    private int mResumeIndex;
-
-    public LayoutTestsAutoTest() {
-      super(TestShellActivity.class);
-    }
-
-    private void getTestList() {
-        // Read test list.
-        try {
-            BufferedReader inReader = new BufferedReader(new FileReader(LAYOUT_TESTS_LIST_FILE));
-            String line = inReader.readLine();
-            while (line != null) {
-                if (line.startsWith(mTestPathPrefix)) {
-                    String[] components = line.split(" ");
-                    mTestList.add(components[0]);
-                    mTestListIgnoreResult.add(components.length > 1 && components[1].equals("IGNORE_RESULT"));
-                }
-                line = inReader.readLine();
-            }
-            inReader.close();
-            Log.v(LOGTAG, "Test list has " + mTestList.size() + " test(s).");
-        } catch (Exception e) {
-            Log.e(LOGTAG, "Error while reading test list : " + e.getMessage());
-        }
-        mTestCount = mTestList.size();
-    }
-
-    private void resumeTestList() {
-        // read out the test name it stoped last time.
-        try {
-            String line = FsUtils.readTestStatus(TEST_STATUS_FILE);
-            for (int i = 0; i < mTestList.size(); i++) {
-                if (mTestList.elementAt(i).equals(line)) {
-                    mTestList = new Vector<String>(mTestList.subList(i+1, mTestList.size()));
-                    mTestListIgnoreResult = new Vector<Boolean>(mTestListIgnoreResult.subList(i+1, mTestListIgnoreResult.size()));
-                    mResumeIndex = i + 1;
-                    break;
-                }
-            }
-        } catch (Exception e) {
-            Log.e(LOGTAG, "Error reading " + TEST_STATUS_FILE);
-        }
-    }
-
-    private void clearTestStatus() {
-        // Delete TEST_STATUS_FILE
-        try {
-            File f = new File(TEST_STATUS_FILE);
-            if (f.delete())
-                Log.v(LOGTAG, "Deleted " + TEST_STATUS_FILE);
-            else
-                Log.e(LOGTAG, "Fail to delete " + TEST_STATUS_FILE);
-        } catch (Exception e) {
-            Log.e(LOGTAG, "Fail to delete " + TEST_STATUS_FILE + " : " + e.getMessage());
-        }
-    }
-
-    private String getResultFile(String test) {
-        String shortName = test.substring(0, test.lastIndexOf('.'));
-        // Write actual results to result directory.
-        return shortName.replaceFirst(LAYOUT_TESTS_ROOT, LAYOUT_TESTS_RESULT_DIR) + "-result.txt";
-    }
-
-    // Gets the file which contains WebKit's expected results for this test.
-    private String getExpectedResultFile(String test) {
-        // The generic result is at <path>/<name>-expected.txt
-        // First try the Android-specific result at
-        // platform/android-<js-engine>/<path>/<name>-expected.txt
-        // then
-        // platform/android/<path>/<name>-expected.txt
-        int pos = test.lastIndexOf('.');
-        if (pos == -1)
-            return null;
-        String genericExpectedResult = test.substring(0, pos) + "-expected.txt";
-        String androidExpectedResultsDir = "platform/android-" + mJsEngine + "/";
-        String androidExpectedResult = genericExpectedResult.replaceFirst(LAYOUT_TESTS_ROOT,
-                LAYOUT_TESTS_ROOT + androidExpectedResultsDir);
-        File f = new File(androidExpectedResult);
-        if (f.exists())
-            return androidExpectedResult;
-        androidExpectedResultsDir = "platform/android/";
-        androidExpectedResult = genericExpectedResult.replaceFirst(LAYOUT_TESTS_ROOT,
-                LAYOUT_TESTS_ROOT + androidExpectedResultsDir);
-        f = new File(androidExpectedResult);
-        return f.exists() ? androidExpectedResult : genericExpectedResult;
-    }
-
-    // Gets the file which contains the actual results of running the test on
-    // Android, generated by a previous run which set a new baseline.
-    private String getAndroidExpectedResultFile(String expectedResultFile) {
-        return expectedResultFile.replaceFirst(LAYOUT_TESTS_ROOT, ANDROID_EXPECTED_RESULT_DIR);
-    }
-
-    // Wrap up
-    private void failedCase(String file) {
-        Log.w("Layout test: ", file + " failed");
-        mResultRecorder.failed(file);
-    }
-
-    private void passedCase(String file) {
-        Log.v("Layout test:", file + " passed");
-        mResultRecorder.passed(file);
-    }
-
-    private void ignoreResultCase(String file) {
-        Log.v("Layout test:", file + " ignore result");
-        mResultRecorder.ignoreResult(file);
-    }
-
-    private void noResultCase(String file) {
-        Log.v("Layout test:", file + " no expected result");
-        mResultRecorder.noResult(file);
-    }
-
-    private void processResult(String testFile, String actualResultFile, String expectedResultFile, boolean ignoreResult) {
-        Log.v(LOGTAG, "  Processing result: " + testFile);
-
-        if (ignoreResult) {
-            ignoreResultCase(testFile);
-            return;
-        }
-
-        File actual = new File(actualResultFile);
-        File expected = new File(expectedResultFile);
-        if (actual.exists() && expected.exists()) {
-            try {
-                if (FsUtils.diffIgnoreSpaces(actualResultFile, expectedResultFile)) {
-                    passedCase(testFile);
-                } else {
-                    failedCase(testFile);
-                }
-            } catch (FileNotFoundException ex) {
-                Log.e(LOGTAG, "File not found : " + ex.getMessage());
-            } catch (IOException ex) {
-                Log.e(LOGTAG, "IO Error : " + ex.getMessage());
-            }
-            return;
-        }
-
-        if (!expected.exists()) {
-            noResultCase(testFile);
-        }
-    }
-
-    private void runTestAndWaitUntilDone(TestShellActivity activity, String test, int timeout, boolean ignoreResult, int testNumber) {
-        activity.setCallback(new TestShellCallback() {
-            public void finished() {
-                synchronized (LayoutTestsAutoTest.this) {
-                    mFinished = true;
-                    LayoutTestsAutoTest.this.notifyAll();
-                }
-            }
-
-            public void timedOut(String url) {
-                Log.v(LOGTAG, "layout timeout: " + url);
-            }
-
-            @Override
-            public void dumpResult(String webViewDump) {
-            }
-        });
-
-        String resultFile = getResultFile(test);
-        if (resultFile == null) {
-            // Simply ignore this test.
-            return;
-        }
-        if (mRebaselineResults) {
-            String expectedResultFile = getExpectedResultFile(test);
-            File f = new File(expectedResultFile);
-            if (f.exists()) {
-                return;  // don't run test and don't overwrite default tests.
-            }
-
-            resultFile = getAndroidExpectedResultFile(expectedResultFile);
-        }
-
-        mFinished = false;
-        Intent intent = new Intent(Intent.ACTION_VIEW);
-        intent.setClass(activity, TestShellActivity.class);
-        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
-        intent.putExtra(TestShellActivity.TEST_URL, FsUtils.getTestUrl(test));
-        intent.putExtra(TestShellActivity.RESULT_FILE, resultFile);
-        intent.putExtra(TestShellActivity.TIMEOUT_IN_MILLIS, timeout);
-        intent.putExtra(TestShellActivity.TOTAL_TEST_COUNT, mTestCount);
-        intent.putExtra(TestShellActivity.CURRENT_TEST_NUMBER, testNumber);
-        intent.putExtra(TestShellActivity.STOP_ON_REF_ERROR, true);
-        activity.startActivity(intent);
-
-        // Wait until done.
-        synchronized (this) {
-            while(!mFinished){
-                try {
-                    this.wait();
-                } catch (InterruptedException e) { }
-            }
-        }
-
-        if (!mRebaselineResults) {
-            String expectedResultFile = getExpectedResultFile(test);
-            File f = new File(expectedResultFile);
-            if (!f.exists()) {
-                expectedResultFile = getAndroidExpectedResultFile(expectedResultFile);
-            }
-
-            processResult(test, resultFile, expectedResultFile, ignoreResult);
-        }
-    }
-
-    // Invokes running of layout tests
-    // and waits till it has finished running.
-    public void executeLayoutTests(boolean resume) {
-        LayoutTestsAutoRunner runner = (LayoutTestsAutoRunner) getInstrumentation();
-        // A convenient method to be called by another activity.
-
-        if (runner.mTestPath == null) {
-            Log.e(LOGTAG, "No test specified");
-            return;
-        }
-
-        this.mTestList = new Vector<String>();
-        this.mTestListIgnoreResult = new Vector<Boolean>();
-
-        // Read settings
-        mTestPathPrefix = (new File(LAYOUT_TESTS_ROOT + runner.mTestPath)).getAbsolutePath();
-        mRebaselineResults = runner.mRebaseline;
-        // V8 is the default JavaScript engine.
-        mJsEngine = runner.mJsEngine == null ? "v8" : runner.mJsEngine;
-
-        int timeout = runner.mTimeoutInMillis;
-        if (timeout <= 0) {
-            timeout = DEFAULT_TIMEOUT_IN_MILLIS;
-        }
-
-        this.mResultRecorder = new MyTestRecorder(resume);
-
-        if (!resume)
-            clearTestStatus();
-
-        getTestList();
-        if (resume)
-            resumeTestList();
-
-        TestShellActivity activity = getActivity();
-        activity.setDefaultDumpDataType(DumpDataType.EXT_REPR);
-
-        // Run tests.
-        for (int i = 0; i < mTestList.size(); i++) {
-            String s = mTestList.elementAt(i);
-            boolean ignoreResult = mTestListIgnoreResult.elementAt(i);
-            FsUtils.updateTestStatus(TEST_STATUS_FILE, s);
-            // Run tests
-            // i is 0 based, but test count is 1 based so add 1 to i here.
-            runTestAndWaitUntilDone(activity, s, runner.mTimeoutInMillis, ignoreResult,
-                    i + 1 + mResumeIndex);
-        }
-
-        FsUtils.updateTestStatus(TEST_STATUS_FILE, "#DONE");
-        ForwardService.getForwardService().stopForwardService();
-        activity.finish();
-    }
-
-    private String getTestPath() {
-        LayoutTestsAutoRunner runner = (LayoutTestsAutoRunner) getInstrumentation();
-
-        String test_path = LAYOUT_TESTS_ROOT;
-        if (runner.mTestPath != null) {
-            test_path += runner.mTestPath;
-        }
-        test_path = new File(test_path).getAbsolutePath();
-        Log.v("LayoutTestsAutoTest", " Test path : " + test_path);
-
-        return test_path;
-    }
-
-    public void generateTestList() {
-        try {
-            File tests_list = new File(LAYOUT_TESTS_LIST_FILE);
-            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(tests_list, false));
-            FsUtils.writeLayoutTestListRecursively(bos, getTestPath(), false); // Don't ignore results
-            bos.flush();
-            bos.close();
-       } catch (Exception e) {
-           Log.e(LOGTAG, "Error when creating test list: " + e.getMessage());
-       }
-    }
-
-    // Running all the layout tests at once sometimes
-    // causes the dumprendertree to run out of memory.
-    // So, additional tests are added to run the tests
-    // in chunks.
-    public void startLayoutTests() {
-        try {
-            File tests_list = new File(LAYOUT_TESTS_LIST_FILE);
-            if (!tests_list.exists())
-              generateTestList();
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-
-        executeLayoutTests(false);
-    }
-
-    public void resumeLayoutTests() {
-        executeLayoutTests(true);
-    }
-
-    public void copyResultsAndRunnerAssetsToCache() {
-        try {
-            Context targetContext = getInstrumentation().getTargetContext();
-            File cacheDir = targetContext.getCacheDir();
-
-            for( int i=0; i< LAYOUT_TESTS_RESULTS_REFERENCE_FILES.length; i++) {
-                InputStream in = targetContext.getAssets().open(
-                        LAYOUT_TESTS_RESULTS_REFERENCE_FILES[i]);
-                OutputStream out = new FileOutputStream(new File(cacheDir,
-                        LAYOUT_TESTS_RESULTS_REFERENCE_FILES[i]));
-
-                byte[] buf = new byte[2048];
-                int len;
-
-                while ((len = in.read(buf)) >= 0 ) {
-                    out.write(buf, 0, len);
-                }
-                out.close();
-                in.close();
-            }
-        }catch (IOException e) {
-          e.printStackTrace();
-        }
-
-    }
-
-}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/LoadTestsAutoTest.java b/tests/DumpRenderTree/src/com/android/dumprendertree/LoadTestsAutoTest.java
deleted file mode 100644
index 4b86a0b..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/LoadTestsAutoTest.java
+++ /dev/null
@@ -1,298 +0,0 @@
-/*
- * Copyright (C) 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.
- * 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.dumprendertree;
-
-import com.android.dumprendertree.forwarder.AdbUtils;
-import com.android.dumprendertree.forwarder.ForwardServer;
-
-import android.app.Activity;
-import android.app.Instrumentation;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.Debug;
-import android.os.Environment;
-import android.os.Process;
-import android.test.ActivityInstrumentationTestCase2;
-import android.util.Log;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PrintStream;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class LoadTestsAutoTest extends ActivityInstrumentationTestCase2<TestShellActivity> {
-
-    private final static String LOGTAG = "LoadTest";
-    private final static String LOAD_TEST_RESULT =
-        Environment.getExternalStorageDirectory() + "/load_test_result.txt";
-    private final static int MAX_GC_WAIT_SEC = 10;
-    private final static int LOCAL_PORT = 17171;
-    private boolean mFinished;
-    static final String LOAD_TEST_RUNNER_FILES[] = {
-        "run_page_cycler.py"
-    };
-    private ForwardServer mForwardServer;
-
-    public LoadTestsAutoTest() {
-        super(TestShellActivity.class);
-    }
-
-    // This function writes the result of the layout test to
-    // Am status so that it can be picked up from a script.
-    public void passOrFailCallback(String file, boolean result) {
-        Instrumentation inst = getInstrumentation();
-        Bundle bundle = new Bundle();
-        bundle.putBoolean(file, result);
-        inst.sendStatus(0, bundle);
-    }
-
-    private String setUpForwarding(String forwardInfo, String suite, String iteration) throws IOException {
-        // read forwarding information first
-        Pattern forwardPattern = Pattern.compile("(.*):(\\d+)/(.*)/");
-        Matcher matcher = forwardPattern.matcher(forwardInfo);
-        if (!matcher.matches()) {
-            throw new RuntimeException("Invalid forward information");
-        }
-        String host = matcher.group(1);
-        int port = Integer.parseInt(matcher.group(2));
-        mForwardServer = new ForwardServer(LOCAL_PORT, AdbUtils.resolve(host), port);
-        mForwardServer.start();
-        return String.format("http://127.0.0.1:%d/%s/%s/start.html?auto=1&iterations=%s",
-                LOCAL_PORT, matcher.group(3), suite, iteration);
-    }
-
-    // Invokes running of layout tests
-    // and waits till it has finished running.
-    public void runPageCyclerTest() throws IOException {
-        LayoutTestsAutoRunner runner = (LayoutTestsAutoRunner) getInstrumentation();
-
-        if (runner.mPageCyclerSuite != null) {
-            // start forwarder to use page cycler suites hosted on external web server
-            if (runner.mPageCyclerForwardHost == null) {
-                throw new RuntimeException("no forwarder information provided");
-            }
-            runner.mTestPath = setUpForwarding(runner.mPageCyclerForwardHost,
-                    runner.mPageCyclerSuite, runner.mPageCyclerIteration);
-            Log.d(LOGTAG, "using path: " + runner.mTestPath);
-        }
-
-        if (runner.mTestPath == null) {
-            throw new RuntimeException("No test specified");
-        }
-
-        final TestShellActivity activity = (TestShellActivity) getActivity();
-
-        Log.v(LOGTAG, "About to run tests, calling gc first...");
-        freeMem();
-
-        // Run tests
-        runTestAndWaitUntilDone(activity, runner.mTestPath, runner.mTimeoutInMillis);
-
-        getInstrumentation().runOnMainSync(new Runnable() {
-
-            @Override
-            public void run() {
-                activity.clearCache();
-            }
-        });
-        if (mForwardServer != null) {
-            mForwardServer.stop();
-            mForwardServer = null;
-        }
-        try {
-            Thread.sleep(5000);
-        } catch (InterruptedException e) {
-        }
-        dumpMemoryInfo();
-
-        // Kill activity
-        activity.finish();
-    }
-
-    private void freeMem() {
-        Log.v(LOGTAG, "freeMem: calling gc...");
-        final CountDownLatch latch = new CountDownLatch(1);
-        @SuppressWarnings("unused")
-        Object dummy = new Object() {
-            // this object instance is used to track gc
-            @Override
-            protected void finalize() throws Throwable {
-                latch.countDown();
-                super.finalize();
-            }
-        };
-        dummy = null;
-        System.gc();
-        try {
-            if (!latch.await(MAX_GC_WAIT_SEC, TimeUnit.SECONDS)) {
-                Log.w(LOGTAG, "gc did not happen in 10s");
-            }
-        } catch (InterruptedException e) {
-            //ignore
-        }
-    }
-
-    private void printRow(PrintStream ps, String format, Object...objs) {
-        ps.println(String.format(format, objs));
-    }
-
-    private void dumpMemoryInfo() {
-        try {
-            freeMem();
-            Log.v(LOGTAG, "Dumping memory information.");
-
-            FileOutputStream out = new FileOutputStream(LOAD_TEST_RESULT, true);
-            PrintStream ps = new PrintStream(out);
-
-            ps.print("\n\n\n");
-            ps.println("** MEMINFO in pid " + Process.myPid()
-                    + " [com.android.dumprendertree] **");
-            String formatString = "%17s %8s %8s %8s %8s";
-
-            long nativeMax = Debug.getNativeHeapSize() / 1024;
-            long nativeAllocated = Debug.getNativeHeapAllocatedSize() / 1024;
-            long nativeFree = Debug.getNativeHeapFreeSize() / 1024;
-            Runtime runtime = Runtime.getRuntime();
-            long dalvikMax = runtime.totalMemory() / 1024;
-            long dalvikFree = runtime.freeMemory() / 1024;
-            long dalvikAllocated = dalvikMax - dalvikFree;
-
-
-            Debug.MemoryInfo memInfo = new Debug.MemoryInfo();
-            Debug.getMemoryInfo(memInfo);
-
-            final int nativeShared = memInfo.nativeSharedDirty;
-            final int dalvikShared = memInfo.dalvikSharedDirty;
-            final int otherShared = memInfo.otherSharedDirty;
-
-            final int nativePrivate = memInfo.nativePrivateDirty;
-            final int dalvikPrivate = memInfo.dalvikPrivateDirty;
-            final int otherPrivate = memInfo.otherPrivateDirty;
-
-            printRow(ps, formatString, "", "native", "dalvik", "other", "total");
-            printRow(ps, formatString, "size:", nativeMax, dalvikMax, "N/A", nativeMax + dalvikMax);
-            printRow(ps, formatString, "allocated:", nativeAllocated, dalvikAllocated, "N/A",
-                    nativeAllocated + dalvikAllocated);
-            printRow(ps, formatString, "free:", nativeFree, dalvikFree, "N/A",
-                    nativeFree + dalvikFree);
-
-            printRow(ps, formatString, "(Pss):", memInfo.nativePss, memInfo.dalvikPss,
-                    memInfo.otherPss, memInfo.nativePss + memInfo.dalvikPss + memInfo.otherPss);
-
-            printRow(ps, formatString, "(shared dirty):", nativeShared, dalvikShared, otherShared,
-                    nativeShared + dalvikShared + otherShared);
-            printRow(ps, formatString, "(priv dirty):", nativePrivate, dalvikPrivate, otherPrivate,
-                    nativePrivate + dalvikPrivate + otherPrivate);
-            ps.print("\n\n\n");
-            ps.flush();
-            ps.close();
-            out.flush();
-            out.close();
-        } catch (IOException e) {
-            Log.e(LOGTAG, e.getMessage());
-        }
-    }
-
-    // A convenient method to be called by another activity.
-    private void runTestAndWaitUntilDone(TestShellActivity activity, String url, int timeout) {
-        activity.setCallback(new TestShellCallback() {
-            @Override
-            public void finished() {
-                synchronized (LoadTestsAutoTest.this) {
-                    mFinished = true;
-                    LoadTestsAutoTest.this.notifyAll();
-                }
-            }
-
-            @Override
-            public void timedOut(String url) {
-            }
-
-            @Override
-            public void dumpResult(String webViewDump) {
-                String lines[] = webViewDump.split("\\r?\\n");
-                for (String line : lines) {
-                    line = line.trim();
-                    // parse for a line like this:
-                    // totals:   9620.00 11947.00    10099.75    380.38
-                    // and return the 3rd number, which is mean
-                    if (line.startsWith("totals:")) {
-                        line = line.substring(7).trim(); // strip "totals:"
-                        String[] numbers = line.split("\\s+");
-                        if (numbers.length == 4) {
-                            Bundle b = new Bundle();
-                            b.putString("mean", numbers[2]);
-                            getInstrumentation().sendStatus(Activity.RESULT_FIRST_USER, b);
-                        }
-                    }
-                }
-            }
-        });
-
-        mFinished = false;
-        Intent intent = new Intent(Intent.ACTION_VIEW);
-        intent.setClass(activity, TestShellActivity.class);
-        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
-        intent.putExtra(TestShellActivity.TEST_URL, url);
-        intent.putExtra(TestShellActivity.TIMEOUT_IN_MILLIS, timeout);
-        intent.putExtra(TestShellActivity.RESULT_FILE, LOAD_TEST_RESULT);
-        activity.startActivity(intent);
-
-        // Wait until done.
-        synchronized (this) {
-            while(!mFinished) {
-                try {
-                    this.wait();
-                } catch (InterruptedException e) { }
-            }
-        }
-    }
-
-    public void copyRunnerAssetsToCache() {
-        try {
-            Context targetContext = getInstrumentation().getTargetContext();
-            File cacheDir = targetContext.getCacheDir();
-
-            for( int i=0; i< LOAD_TEST_RUNNER_FILES.length; i++) {
-                InputStream in = targetContext.getAssets().open(
-                        LOAD_TEST_RUNNER_FILES[i]);
-                OutputStream out = new FileOutputStream(
-                        new File(cacheDir, LOAD_TEST_RUNNER_FILES[i]));
-
-                byte[] buf = new byte[2048];
-                int len;
-
-                while ((len = in.read(buf)) >= 0 ) {
-                    out.write(buf, 0, len);
-                }
-                out.close();
-                in.close();
-            }
-        }catch (IOException e) {
-          e.printStackTrace();
-        }
-
-    }
-
-}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/Menu.java b/tests/DumpRenderTree/src/com/android/dumprendertree/Menu.java
deleted file mode 100644
index 0b00d65..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/Menu.java
+++ /dev/null
@@ -1,90 +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 com.android.dumprendertree;
-
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.Environment;
-import android.util.Log;
-
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-
-public class Menu extends FileList {
-
-    private static final int MENU_START = 0x01;
-    private static String LOGTAG = "MenuActivity";
-    static final String LAYOUT_TESTS_LIST_FILE =
-        Environment.getExternalStorageDirectory() + "/android/layout_tests_list.txt";
-
-    public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-    }
-
-    boolean fileFilter(File f) {
-    	if (f.getName().startsWith("."))
-    		return false;
-    	if (f.getName().equalsIgnoreCase("resources"))
-    		return false;
-    	if (f.isDirectory())
-    		return true;
-    	if (f.getPath().toLowerCase().endsWith("ml"))
-    		return true;
-    	return false;
-    }
-
-    void processFile(String filename, boolean selection) {
-        Intent intent = new Intent(Intent.ACTION_VIEW);
-        intent.setClass(this, TestShellActivity.class);
-        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
-        intent.putExtra(TestShellActivity.TEST_URL, "file://" + filename);
-        intent.putExtra(TestShellActivity.TOTAL_TEST_COUNT, 1);
-        intent.putExtra(TestShellActivity.CURRENT_TEST_NUMBER, 1);
-        startActivity(intent);
-    }
-
-    @Override
-    void processDirectory(String path, boolean selection) {
-        int testCount = generateTestList(path);
-        Intent intent = new Intent(Intent.ACTION_VIEW);
-        intent.setClass(this, TestShellActivity.class);
-        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
-        intent.putExtra(TestShellActivity.UI_AUTO_TEST, LAYOUT_TESTS_LIST_FILE);
-        intent.putExtra(TestShellActivity.TOTAL_TEST_COUNT, testCount);
-        // TestShellActivity will process this intent once and increment the test index
-        // before running the first test, so pass 0 here to allow for that.
-        intent.putExtra(TestShellActivity.CURRENT_TEST_NUMBER, 0);
-        startActivity(intent);
-    }
-
-    private int generateTestList(String path) {
-        int testCount = 0;
-        try {
-            File tests_list = new File(LAYOUT_TESTS_LIST_FILE);
-            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(tests_list, false));
-            testCount = FsUtils.writeLayoutTestListRecursively(
-                    bos, path, false); // Don't ignore results
-            bos.flush();
-            bos.close();
-       } catch (Exception e) {
-           Log.e(LOGTAG, "Error when creating test list: " + e.getMessage());
-       }
-       return testCount;
-    }
-
-}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/ReliabilityTestActivity.java b/tests/DumpRenderTree/src/com/android/dumprendertree/ReliabilityTestActivity.java
deleted file mode 100644
index 22b587f..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/ReliabilityTestActivity.java
+++ /dev/null
@@ -1,308 +0,0 @@
-/*
- * 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.dumprendertree;
-
-import android.app.Activity;
-import android.app.ActivityThread;
-import android.graphics.Bitmap;
-import android.net.http.SslError;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.util.Log;
-import android.view.ViewGroup;
-import android.webkit.HttpAuthHandler;
-import android.webkit.JsPromptResult;
-import android.webkit.JsResult;
-import android.webkit.SslErrorHandler;
-import android.webkit.WebChromeClient;
-import android.webkit.WebView;
-import android.webkit.WebViewClient;
-import android.webkit.WebSettings.LayoutAlgorithm;
-import android.widget.LinearLayout;
-import android.widget.LinearLayout.LayoutParams;
-
-public class ReliabilityTestActivity extends Activity {
-
-    public static final String TEST_URL_ACTION = "com.andrdoid.dumprendertree.TestUrlAction";
-    public static final String PARAM_URL = "URL";
-    public static final String PARAM_TIMEOUT = "Timeout";
-    public static final int RESULT_TIMEOUT = 0xDEAD;
-    public static final int MSG_TIMEOUT = 0xC001;
-    public static final int MSG_NAVIGATE = 0xC002;
-    public static final String MSG_NAV_URL = "url";
-    public static final String MSG_NAV_LOGTIME = "logtime";
-
-    private static final String LOGTAG = "ReliabilityTestActivity";
-
-    private WebView webView;
-    private SimpleWebViewClient webViewClient;
-    private SimpleChromeClient chromeClient;
-    private Handler handler;
-    private boolean timeoutFlag;
-    private boolean logTime;
-    private boolean pageDone;
-    private Object pageDoneLock;
-    private int pageStartCount;
-    private int manualDelay;
-    private long startTime;
-    private long pageLoadTime;
-    private PageDoneRunner pageDoneRunner = new PageDoneRunner();
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        Log.v(LOGTAG, "onCreate, inst=" + Integer.toHexString(hashCode()));
-
-        LinearLayout contentView = new LinearLayout(this);
-        contentView.setOrientation(LinearLayout.VERTICAL);
-        setContentView(contentView);
-        setTitle("Idle");
-
-        webView = new WebView(this);
-        webView.getSettings().setJavaScriptEnabled(true);
-        webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(false);
-        webView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.NORMAL);
-
-        webViewClient = new SimpleWebViewClient();
-        chromeClient = new SimpleChromeClient();
-        webView.setWebViewClient(webViewClient);
-        webView.setWebChromeClient(chromeClient);
-
-        contentView.addView(webView, new LayoutParams(
-                ViewGroup.LayoutParams.MATCH_PARENT,
-                ViewGroup.LayoutParams.MATCH_PARENT, 0.0f));
-
-        handler = new Handler() {
-            @Override
-            public void handleMessage(Message msg) {
-                switch (msg.what) {
-                    case MSG_TIMEOUT:
-                        handleTimeout();
-                        return;
-                    case MSG_NAVIGATE:
-                        manualDelay = msg.arg2;
-                        navigate(msg.getData().getString(MSG_NAV_URL), msg.arg1);
-                        logTime = msg.getData().getBoolean(MSG_NAV_LOGTIME);
-                        return;
-                }
-            }
-        };
-
-        pageDoneLock = new Object();
-    }
-
-    public void reset() {
-        synchronized (pageDoneLock) {
-            pageDone = false;
-        }
-        timeoutFlag = false;
-        pageStartCount = 0;
-        chromeClient.resetJsTimeout();
-    }
-
-    private void navigate(String url, int timeout) {
-        if(url == null) {
-            Log.v(LOGTAG, "URL is null, cancelling...");
-            finish();
-        }
-        webView.stopLoading();
-        if(logTime) {
-            webView.clearCache(true);
-        }
-        startTime = System.currentTimeMillis();
-        Log.v(LOGTAG, "Navigating to URL: " + url);
-        webView.loadUrl(url);
-
-        if(timeout != 0) {
-            //set a timer with specified timeout (in ms)
-            handler.sendMessageDelayed(handler.obtainMessage(MSG_TIMEOUT),
-                    timeout);
-        }
-    }
-
-    @Override
-    protected void onDestroy() {
-        super.onDestroy();
-        Log.v(LOGTAG, "onDestroy, inst=" + Integer.toHexString(hashCode()));
-        webView.clearCache(true);
-        webView.destroy();
-    }
-
-    private boolean isPageDone() {
-        synchronized (pageDoneLock) {
-            return pageDone;
-        }
-    }
-
-    private void setPageDone(boolean pageDone) {
-        synchronized (pageDoneLock) {
-            this.pageDone = pageDone;
-            pageDoneLock.notifyAll();
-        }
-    }
-
-    private void handleTimeout() {
-        int progress = webView.getProgress();
-        webView.stopLoading();
-        Log.v(LOGTAG, "Page timeout triggered, progress = " + progress);
-        timeoutFlag = true;
-        handler.postDelayed(pageDoneRunner, manualDelay);
-    }
-
-    public boolean waitUntilDone() {
-        validateNotAppThread();
-        synchronized (pageDoneLock) {
-            while(!isPageDone()) {
-                try {
-                    pageDoneLock.wait();
-                } catch (InterruptedException ie) {
-                    //no-op
-                }
-            }
-        }
-        return timeoutFlag;
-    }
-
-    public Handler getHandler() {
-        return handler;
-    }
-
-    private final void validateNotAppThread() {
-        if (Looper.myLooper() == Looper.getMainLooper()) {
-            throw new RuntimeException(
-                "This method can not be called from the main application thread");
-        }
-    }
-
-    public long getPageLoadTime() {
-        return pageLoadTime;
-    }
-
-    class SimpleWebViewClient extends WebViewClient {
-
-        @Override
-        public void onReceivedError(WebView view, int errorCode, String description,
-                String failingUrl) {
-            Log.v(LOGTAG, "Received WebCore error: code=" + errorCode
-                    + ", description=" + description
-                    + ", url=" + failingUrl);
-        }
-
-        @Override
-        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
-            //ignore certificate error
-            Log.v(LOGTAG, "Received SSL error: " + error.toString());
-            handler.proceed();
-        }
-
-        @Override
-        public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host,
-                String realm) {
-            // cancel http auth request
-            handler.cancel();
-        }
-
-        @Override
-        public void onPageStarted(WebView view, String url, Bitmap favicon) {
-            pageStartCount++;
-            Log.v(LOGTAG, "onPageStarted: " + url);
-        }
-
-        @Override
-        public void onPageFinished(WebView view, String url) {
-            Log.v(LOGTAG, "onPageFinished: " + url);
-            // let handleTimeout take care of finishing the page
-            if(!timeoutFlag)
-                handler.postDelayed(new WebViewStatusChecker(), 500);
-        }
-    }
-
-    class SimpleChromeClient extends WebChromeClient {
-
-        private int timeoutCounter = 0;
-
-        @Override
-        public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
-            result.confirm();
-            return true;
-        }
-
-        @Override
-        public boolean onJsBeforeUnload(WebView view, String url, String message, JsResult result) {
-            result.confirm();
-            return true;
-        }
-
-        @Override
-        public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
-            result.confirm();
-            return true;
-        }
-
-        @Override
-        public boolean onJsPrompt(WebView view, String url, String message, String defaultValue,
-                JsPromptResult result) {
-            result.confirm();
-            return true;
-        }
-
-        @Override
-        public boolean onJsTimeout() {
-            timeoutCounter++;
-            Log.v(LOGTAG, "JavaScript timeout, count=" + timeoutCounter);
-            return timeoutCounter > 2;
-        }
-
-        public void resetJsTimeout() {
-            timeoutCounter = 0;
-        }
-
-        @Override
-        public void onReceivedTitle(WebView view, String title) {
-            ReliabilityTestActivity.this.setTitle(title);
-        }
-    }
-
-    class WebViewStatusChecker implements Runnable {
-
-        private int initialStartCount;
-
-        public WebViewStatusChecker() {
-            initialStartCount = pageStartCount;
-        }
-
-        public void run() {
-            if (initialStartCount == pageStartCount && !isPageDone()) {
-                handler.removeMessages(MSG_TIMEOUT);
-                webView.stopLoading();
-                handler.postDelayed(pageDoneRunner, manualDelay);
-            }
-        }
-    }
-
-    class PageDoneRunner implements Runnable {
-
-        public void run() {
-            Log.v(LOGTAG, "Finishing URL: " + webView.getUrl());
-            pageLoadTime = System.currentTimeMillis() - startTime;
-            setPageDone(true);
-        }
-    }
-}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java b/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java
deleted file mode 100644
index 42d6457..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java
+++ /dev/null
@@ -1,946 +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 com.android.dumprendertree;
-
-import com.android.dumprendertree.forwarder.ForwardService;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnClickListener;
-import android.content.Intent;
-import android.graphics.Bitmap;
-import android.net.http.SslError;
-import android.os.Bundle;
-import android.os.Environment;
-import android.os.Handler;
-import android.os.Message;
-import android.util.Log;
-import android.view.ViewGroup;
-import android.view.Window;
-import android.webkit.ConsoleMessage;
-import android.webkit.CookieManager;
-import android.webkit.GeolocationPermissions;
-import android.webkit.HttpAuthHandler;
-import android.webkit.JsPromptResult;
-import android.webkit.JsResult;
-import android.webkit.SslErrorHandler;
-import android.webkit.WebChromeClient;
-import android.webkit.WebSettings;
-import android.webkit.WebSettingsClassic;
-import android.webkit.WebStorage;
-import android.webkit.WebView;
-import android.webkit.WebViewClassic;
-import android.webkit.WebViewClient;
-import android.widget.LinearLayout;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.FileReader;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Vector;
-
-public class TestShellActivity extends Activity implements LayoutTestController {
-
-    static enum DumpDataType {DUMP_AS_TEXT, EXT_REPR, NO_OP}
-
-    // String constants for use with layoutTestController.overridePreferences
-    private final String WEBKIT_OFFLINE_WEB_APPLICATION_CACHE_ENABLED =
-            "WebKitOfflineWebApplicationCacheEnabled";
-    private final String WEBKIT_USES_PAGE_CACHE_PREFERENCE_KEY = "WebKitUsesPageCachePreferenceKey";
-
-    public class AsyncHandler extends Handler {
-        @Override
-        public void handleMessage(Message msg) {
-            if (msg.what == MSG_TIMEOUT) {
-                mTimedOut = true;
-                mWebView.stopLoading();
-                if (mCallback != null)
-                    mCallback.timedOut(mWebView.getUrl());
-                if (!mRequestedWebKitData) {
-                    requestWebKitData();
-                } else {
-                    // if timed out and webkit data has been dumped before
-                    // finish directly
-                    finished();
-                }
-                return;
-            } else if (msg.what == MSG_WEBKIT_DATA) {
-                Log.v(LOGTAG, "Received WebView dump data");
-                mHandler.removeMessages(MSG_DUMP_TIMEOUT);
-                TestShellActivity.this.dump(mTimedOut, (String)msg.obj);
-                return;
-            } else if (msg.what == MSG_DUMP_TIMEOUT) {
-                throw new RuntimeException("WebView dump timeout, is it pegged?");
-            }
-            super.handleMessage(msg);
-        }
-    }
-
-    public void requestWebKitData() {
-        setDumpTimeout(DUMP_TIMEOUT_MS);
-        Message callback = mHandler.obtainMessage(MSG_WEBKIT_DATA);
-
-        if (mRequestedWebKitData)
-            throw new AssertionError("Requested webkit data twice: " + mWebView.getUrl());
-
-        mRequestedWebKitData = true;
-        Log.v(LOGTAG, "message sent to WebView to dump text.");
-        switch (mDumpDataType) {
-            case DUMP_AS_TEXT:
-                callback.arg1 = mDumpTopFrameAsText ? 1 : 0;
-                callback.arg2 = mDumpChildFramesAsText ? 1 : 0;
-                mWebViewClassic.documentAsText(callback);
-                break;
-            case EXT_REPR:
-                mWebViewClassic.externalRepresentation(callback);
-                break;
-            default:
-                finished();
-                break;
-        }
-    }
-
-    private void setDumpTimeout(long timeout) {
-        Log.v(LOGTAG, "setting dump timeout at " + timeout);
-        Message msg = mHandler.obtainMessage(MSG_DUMP_TIMEOUT);
-        mHandler.sendMessageDelayed(msg, timeout);
-    }
-
-    public void clearCache() {
-      mWebView.freeMemory();
-    }
-
-    @Override
-    protected void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-        requestWindowFeature(Window.FEATURE_PROGRESS);
-
-        LinearLayout contentView = new LinearLayout(this);
-        contentView.setOrientation(LinearLayout.VERTICAL);
-        setContentView(contentView);
-
-        CookieManager.setAcceptFileSchemeCookies(true);
-        mWebView = new WebView(this);
-        mWebViewClassic = WebViewClassic.fromWebView(mWebView);
-        mEventSender = new WebViewEventSender(mWebView);
-        mCallbackProxy = new CallbackProxy(mEventSender, this);
-
-        mWebView.addJavascriptInterface(mCallbackProxy, "layoutTestController");
-        mWebView.addJavascriptInterface(mCallbackProxy, "eventSender");
-        setupWebViewForLayoutTests(mWebView, mCallbackProxy);
-
-        contentView.addView(mWebView, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, 0.0f));
-
-        mWebView.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);
-
-        // Expose window.gc function to JavaScript. JSC build exposes
-        // this function by default, but V8 requires the flag to turn it on.
-        // WebView::setJsFlags is noop in JSC build.
-        mWebViewClassic.setJsFlags("--expose_gc");
-
-        mHandler = new AsyncHandler();
-
-        Intent intent = getIntent();
-        if (intent != null) {
-            executeIntent(intent);
-        }
-
-        // This is asynchronous, but it gets processed by WebCore before it starts loading pages.
-        mWebViewClassic.setUseMockDeviceOrientation();
-    }
-
-    @Override
-    protected void onNewIntent(Intent intent) {
-        super.onNewIntent(intent);
-        executeIntent(intent);
-    }
-
-    private void executeIntent(Intent intent) {
-        resetTestStatus();
-        if (!Intent.ACTION_VIEW.equals(intent.getAction())) {
-            return;
-        }
-
-        mTotalTestCount = intent.getIntExtra(TOTAL_TEST_COUNT, mTotalTestCount);
-        mCurrentTestNumber = intent.getIntExtra(CURRENT_TEST_NUMBER, mCurrentTestNumber);
-
-        mTestUrl = intent.getStringExtra(TEST_URL);
-        if (mTestUrl == null) {
-            mUiAutoTestPath = intent.getStringExtra(UI_AUTO_TEST);
-            if(mUiAutoTestPath != null) {
-                beginUiAutoTest();
-            }
-            return;
-        }
-
-        mResultFile = intent.getStringExtra(RESULT_FILE);
-        mTimeoutInMillis = intent.getIntExtra(TIMEOUT_IN_MILLIS, 0);
-        mStopOnRefError = intent.getBooleanExtra(STOP_ON_REF_ERROR, false);
-        setTitle("Test " + mCurrentTestNumber + " of " + mTotalTestCount);
-        float ratio = (float)mCurrentTestNumber / mTotalTestCount;
-        int progress = (int)(ratio * Window.PROGRESS_END);
-        getWindow().setFeatureInt(Window.FEATURE_PROGRESS, progress);
-
-        Log.v(LOGTAG, "  Loading " + mTestUrl);
-
-        if (mTestUrl.contains("/dumpAsText/")) {
-            dumpAsText(false);
-        }
-
-        mWebView.loadUrl(mTestUrl);
-
-        if (mTimeoutInMillis > 0) {
-            // Create a timeout timer
-            Message m = mHandler.obtainMessage(MSG_TIMEOUT);
-            mHandler.sendMessageDelayed(m, mTimeoutInMillis);
-        }
-    }
-
-    private void beginUiAutoTest() {
-        try {
-            mTestListReader = new BufferedReader(
-                    new FileReader(mUiAutoTestPath));
-        } catch (IOException ioe) {
-            Log.e(LOGTAG, "Failed to open test list for read.", ioe);
-            finishUiAutoTest();
-            return;
-        }
-        moveToNextTest();
-    }
-
-    private void finishUiAutoTest() {
-        try {
-            if(mTestListReader != null)
-                mTestListReader.close();
-        } catch (IOException ioe) {
-            Log.w(LOGTAG, "Failed to close test list file.", ioe);
-        }
-        ForwardService.getForwardService().stopForwardService();
-        finished();
-    }
-
-    private void moveToNextTest() {
-        String url = null;
-        try {
-            url = mTestListReader.readLine();
-        } catch (IOException ioe) {
-            Log.e(LOGTAG, "Failed to read next test.", ioe);
-            finishUiAutoTest();
-            return;
-        }
-        if (url == null) {
-            mUiAutoTestPath = null;
-            finishUiAutoTest();
-            AlertDialog.Builder builder = new AlertDialog.Builder(this);
-            builder.setMessage("All tests finished. Exit?")
-                   .setCancelable(false)
-                   .setPositiveButton("Yes", new OnClickListener(){
-                       @Override
-                    public void onClick(DialogInterface dialog, int which) {
-                           TestShellActivity.this.finish();
-                       }
-                   })
-                   .setNegativeButton("No", new OnClickListener(){
-                       @Override
-                    public void onClick(DialogInterface dialog, int which) {
-                           dialog.cancel();
-                       }
-                   });
-            builder.create().show();
-            return;
-        }
-        Intent intent = new Intent(Intent.ACTION_VIEW);
-        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
-        intent.putExtra(TestShellActivity.TEST_URL, FsUtils.getTestUrl(url));
-        intent.putExtra(TestShellActivity.CURRENT_TEST_NUMBER, ++mCurrentTestNumber);
-        intent.putExtra(TIMEOUT_IN_MILLIS, 10000);
-        executeIntent(intent);
-    }
-
-    @Override
-    protected void onStop() {
-        super.onStop();
-        mWebView.stopLoading();
-    }
-
-    @Override
-    protected void onDestroy() {
-        super.onDestroy();
-        mWebView.destroy();
-        mWebView = null;
-        mWebViewClassic = null;
-    }
-
-    @Override
-    public void onLowMemory() {
-        super.onLowMemory();
-        Log.e(LOGTAG, "Low memory, clearing caches");
-        mWebView.freeMemory();
-    }
-
-    // Dump the page
-    public void dump(boolean timeout, String webkitData) {
-        mDumpWebKitData = true;
-        if (mResultFile == null || mResultFile.length() == 0) {
-            finished();
-            return;
-        }
-
-        if (mCallback != null) {
-            mCallback.dumpResult(webkitData);
-        }
-
-        try {
-            File parentDir = new File(mResultFile).getParentFile();
-            if (!parentDir.exists()) {
-                parentDir.mkdirs();
-            }
-
-            FileOutputStream os = new FileOutputStream(mResultFile);
-            if (timeout) {
-                Log.w("Layout test: Timeout", mResultFile);
-                os.write(TIMEOUT_STR.getBytes());
-                os.write('\n');
-            }
-            if (mDumpTitleChanges)
-                os.write(mTitleChanges.toString().getBytes());
-            if (mDialogStrings != null)
-                os.write(mDialogStrings.toString().getBytes());
-            mDialogStrings = null;
-            if (mDatabaseCallbackStrings != null)
-                os.write(mDatabaseCallbackStrings.toString().getBytes());
-            mDatabaseCallbackStrings = null;
-            if (mConsoleMessages != null)
-                os.write(mConsoleMessages.toString().getBytes());
-            mConsoleMessages = null;
-            if (webkitData != null)
-                os.write(webkitData.getBytes());
-            os.flush();
-            os.close();
-        } catch (IOException ex) {
-            Log.e(LOGTAG, "Cannot write to " + mResultFile + ", " + ex.getMessage());
-        }
-
-        finished();
-    }
-
-    public void setCallback(TestShellCallback callback) {
-        mCallback = callback;
-    }
-
-    public boolean finished() {
-        if (canMoveToNextTest()) {
-            mHandler.removeMessages(MSG_TIMEOUT);
-            if (mUiAutoTestPath != null) {
-                //don't really finish here
-                moveToNextTest();
-            } else {
-                if (mCallback != null) {
-                    mCallback.finished();
-                }
-            }
-            return true;
-        }
-        return false;
-    }
-
-    public void setDefaultDumpDataType(DumpDataType defaultDumpDataType) {
-        mDefaultDumpDataType = defaultDumpDataType;
-    }
-
-    // .......................................
-    // LayoutTestController Functions
-    @Override
-    public void dumpAsText(boolean enablePixelTests) {
-        // Added after webkit update to r63859. See trac.webkit.org/changeset/63730.
-        if (enablePixelTests) {
-            Log.v(LOGTAG, "dumpAsText(enablePixelTests == true) not implemented on Android!");
-        }
-
-        mDumpDataType = DumpDataType.DUMP_AS_TEXT;
-        mDumpTopFrameAsText = true;
-        if (mWebView != null) {
-            String url = mWebView.getUrl();
-            Log.v(LOGTAG, "dumpAsText called: "+url);
-        }
-    }
-
-    @Override
-    public void dumpChildFramesAsText() {
-        mDumpDataType = DumpDataType.DUMP_AS_TEXT;
-        mDumpChildFramesAsText = true;
-        if (mWebView != null) {
-            String url = mWebView.getUrl();
-            Log.v(LOGTAG, "dumpChildFramesAsText called: "+url);
-        }
-    }
-
-    @Override
-    public void waitUntilDone() {
-        mWaitUntilDone = true;
-        String url = mWebView.getUrl();
-        Log.v(LOGTAG, "waitUntilDone called: " + url);
-    }
-
-    @Override
-    public void notifyDone() {
-        String url = mWebView.getUrl();
-        Log.v(LOGTAG, "notifyDone called: " + url);
-        if (mWaitUntilDone) {
-            mWaitUntilDone = false;
-            if (!mRequestedWebKitData && !mTimedOut && !finished()) {
-                requestWebKitData();
-            }
-        }
-    }
-
-    @Override
-    public void display() {
-        mWebView.invalidate();
-    }
-
-    @Override
-    public void clearBackForwardList() {
-        mWebView.clearHistory();
-
-    }
-
-    @Override
-    public void dumpBackForwardList() {
-        //printf("\n============== Back Forward List ==============\n");
-        // mWebHistory
-        //printf("===============================================\n");
-
-    }
-
-    @Override
-    public void dumpChildFrameScrollPositions() {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void dumpEditingCallbacks() {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void dumpSelectionRect() {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void dumpTitleChanges() {
-        if (!mDumpTitleChanges) {
-            mTitleChanges = new StringBuffer();
-        }
-        mDumpTitleChanges = true;
-    }
-
-    @Override
-    public void keepWebHistory() {
-        if (!mKeepWebHistory) {
-            mWebHistory = new Vector();
-        }
-        mKeepWebHistory = true;
-    }
-
-    @Override
-    public void queueBackNavigation(int howfar) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void queueForwardNavigation(int howfar) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void queueLoad(String Url, String frameTarget) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void queueReload() {
-        mWebView.reload();
-    }
-
-    @Override
-    public void queueScript(String scriptToRunInCurrentContext) {
-        mWebView.loadUrl("javascript:"+scriptToRunInCurrentContext);
-    }
-
-    @Override
-    public void repaintSweepHorizontally() {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void setAcceptsEditing(boolean b) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void setMainFrameIsFirstResponder(boolean b) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void setWindowIsKey(boolean b) {
-        // This is meant to show/hide the window. The best I can find
-        // is setEnabled()
-        mWebView.setEnabled(b);
-    }
-
-    @Override
-    public void testRepaint() {
-        mWebView.invalidate();
-    }
-
-    @Override
-    public void dumpDatabaseCallbacks() {
-        Log.v(LOGTAG, "dumpDatabaseCallbacks called.");
-        mDumpDatabaseCallbacks = true;
-    }
-
-    @Override
-    public void setCanOpenWindows() {
-        Log.v(LOGTAG, "setCanOpenWindows called.");
-        mCanOpenWindows = true;
-    }
-
-    @Override
-    public void setMockGeolocationPosition(double latitude, double longitude, double accuracy) {
-        WebViewClassic.fromWebView(mWebView).setMockGeolocationPosition(latitude, longitude,
-                accuracy);
-    }
-
-    @Override
-    public void setMockGeolocationError(int code, String message) {
-        WebViewClassic.fromWebView(mWebView).setMockGeolocationError(code, message);
-    }
-
-    @Override
-    public void setGeolocationPermission(boolean allow) {
-        Log.v(LOGTAG, "setGeolocationPermission() allow=" + allow);
-        WebViewClassic.fromWebView(mWebView).setMockGeolocationPermission(allow);
-    }
-
-    @Override
-    public void setMockDeviceOrientation(boolean canProvideAlpha, double alpha,
-            boolean canProvideBeta, double beta, boolean canProvideGamma, double gamma) {
-        WebViewClassic.fromWebView(mWebView).setMockDeviceOrientation(canProvideAlpha, alpha,
-                canProvideBeta, beta, canProvideGamma, gamma);
-    }
-
-    @Override
-    public void overridePreference(String key, boolean value) {
-        // TODO: We should look up the correct WebView for the frame which
-        // called the layoutTestController method. Currently, we just use the
-        // WebView for the main frame. EventSender suffers from the same
-        // problem.
-        if (WEBKIT_OFFLINE_WEB_APPLICATION_CACHE_ENABLED.equals(key)) {
-            mWebViewClassic.getSettings().setAppCacheEnabled(value);
-        } else if (WEBKIT_USES_PAGE_CACHE_PREFERENCE_KEY.equals(key)) {
-            // Cache the maximum possible number of pages.
-            mWebViewClassic.getSettings().setPageCacheCapacity(Integer.MAX_VALUE);
-        } else {
-            Log.w(LOGTAG, "LayoutTestController.overridePreference(): " +
-                  "Unsupported preference '" + key + "'");
-        }
-    }
-
-    @Override
-    public void setXSSAuditorEnabled (boolean flag) {
-        mWebViewClassic.getSettings().setXSSAuditorEnabled(flag);
-    }
-
-    private final WebViewClient mViewClient = new WebViewClient(){
-        @Override
-        public void onPageFinished(WebView view, String url) {
-            Log.v(LOGTAG, "onPageFinished, url=" + url);
-            mPageFinished = true;
-
-            // Calling finished() will check if we've met all the conditions for completing
-            // this test and move to the next one if we are ready. Otherwise we ask WebCore to
-            // dump the page.
-            if (finished()) {
-                return;
-            }
-
-            if (!mWaitUntilDone && !mRequestedWebKitData && !mTimedOut) {
-                requestWebKitData();
-            } else {
-                if (mWaitUntilDone) {
-                    Log.v(LOGTAG, "page finished loading but waiting for notifyDone to be called: " + url);
-                }
-
-                if (mRequestedWebKitData) {
-                    Log.v(LOGTAG, "page finished loading but webkit data has already been requested: " + url);
-                }
-
-                if (mTimedOut) {
-                    Log.v(LOGTAG, "page finished loading but already timed out: " + url);
-                }
-            }
-
-            super.onPageFinished(view, url);
-        }
-
-        @Override
-        public void onPageStarted(WebView view, String url, Bitmap favicon) {
-            Log.v(LOGTAG, "onPageStarted, url=" + url);
-            mPageFinished = false;
-            super.onPageStarted(view, url, favicon);
-        }
-
-        @Override
-        public void onReceivedError(WebView view, int errorCode, String description,
-                String failingUrl) {
-            Log.v(LOGTAG, "onReceivedError, errorCode=" + errorCode
-                    + ", desc=" + description + ", url=" + failingUrl);
-            super.onReceivedError(view, errorCode, description, failingUrl);
-        }
-
-        @Override
-        public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler,
-                String host, String realm) {
-            if (handler.useHttpAuthUsernamePassword() && view != null) {
-                String[] credentials = view.getHttpAuthUsernamePassword(host, realm);
-                if (credentials != null && credentials.length == 2) {
-                    handler.proceed(credentials[0], credentials[1]);
-                    return;
-                }
-            }
-            handler.cancel();
-        }
-
-        @Override
-        public void onReceivedSslError(WebView view, SslErrorHandler handler,
-                SslError error) {
-            handler.proceed();
-        }
-    };
-
-
-    private final WebChromeClient mChromeClient = new WebChromeClient() {
-        @Override
-        public void onReceivedTitle(WebView view, String title) {
-            setTitle("Test " + mCurrentTestNumber + " of " + mTotalTestCount + ": "+ title);
-            if (mDumpTitleChanges) {
-                mTitleChanges.append("TITLE CHANGED: ");
-                mTitleChanges.append(title);
-                mTitleChanges.append("\n");
-            }
-        }
-
-        @Override
-        public boolean onJsAlert(WebView view, String url, String message,
-                JsResult result) {
-            if (mDialogStrings == null) {
-                mDialogStrings = new StringBuffer();
-            }
-            mDialogStrings.append("ALERT: ");
-            mDialogStrings.append(message);
-            mDialogStrings.append('\n');
-            result.confirm();
-            return true;
-        }
-
-        @Override
-        public boolean onJsConfirm(WebView view, String url, String message,
-                JsResult result) {
-            if (mDialogStrings == null) {
-                mDialogStrings = new StringBuffer();
-            }
-            mDialogStrings.append("CONFIRM: ");
-            mDialogStrings.append(message);
-            mDialogStrings.append('\n');
-            result.confirm();
-            return true;
-        }
-
-        @Override
-        public boolean onJsPrompt(WebView view, String url, String message,
-                String defaultValue, JsPromptResult result) {
-            if (mDialogStrings == null) {
-                mDialogStrings = new StringBuffer();
-            }
-            mDialogStrings.append("PROMPT: ");
-            mDialogStrings.append(message);
-            mDialogStrings.append(", default text: ");
-            mDialogStrings.append(defaultValue);
-            mDialogStrings.append('\n');
-            result.confirm();
-            return true;
-        }
-
-        @Override
-        public boolean onJsTimeout() {
-            Log.v(LOGTAG, "JavaScript timeout");
-            return false;
-        }
-
-        @Override
-        public void onExceededDatabaseQuota(String url_str,
-                String databaseIdentifier, long currentQuota,
-                long estimatedSize, long totalUsedQuota,
-                WebStorage.QuotaUpdater callback) {
-            if (mDumpDatabaseCallbacks) {
-                if (mDatabaseCallbackStrings == null) {
-                    mDatabaseCallbackStrings = new StringBuffer();
-                }
-
-                String protocol = "";
-                String host = "";
-                int port = 0;
-
-                try {
-                    URL url = new URL(url_str);
-                    protocol = url.getProtocol();
-                    host = url.getHost();
-                    if (url.getPort() > -1) {
-                        port = url.getPort();
-                    }
-                } catch (MalformedURLException e) {}
-
-                String databaseCallbackString =
-                        "UI DELEGATE DATABASE CALLBACK: " +
-                        "exceededDatabaseQuotaForSecurityOrigin:{" + protocol +
-                        ", " + host + ", " + port + "} database:" +
-                        databaseIdentifier + "\n";
-                Log.v(LOGTAG, "LOG: "+databaseCallbackString);
-                mDatabaseCallbackStrings.append(databaseCallbackString);
-            }
-            // Give 5MB more quota.
-            callback.updateQuota(currentQuota + 1024 * 1024 * 5);
-        }
-
-        @Override
-        public void onGeolocationPermissionsShowPrompt(String origin,
-                GeolocationPermissions.Callback callback) {
-            throw new RuntimeException(
-                    "The WebCore mock used by DRT should bypass the usual permissions flow.");
-        }
-
-        @Override
-        public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
-            String msg = "CONSOLE MESSAGE: line " + consoleMessage.lineNumber() + ": "
-                    + consoleMessage.message() + "\n";
-            if (mConsoleMessages == null) {
-                mConsoleMessages = new StringBuffer();
-            }
-            mConsoleMessages.append(msg);
-            Log.v(LOGTAG, "LOG: " + msg);
-            // the rationale here is that if there's an error of either type, and the test was
-            // waiting for "notifyDone" signal to finish, then there's no point in waiting
-            // anymore because the JS execution is already terminated at this point and a
-            // "notifyDone" will never come out so it's just wasting time till timeout kicks in
-            if ((msg.contains("Uncaught ReferenceError:") || msg.contains("Uncaught TypeError:"))
-                    && mWaitUntilDone && mStopOnRefError) {
-                Log.w(LOGTAG, "Terminating test case on uncaught ReferenceError or TypeError.");
-                mHandler.postDelayed(new Runnable() {
-                    @Override
-                    public void run() {
-                        notifyDone();
-                    }
-                }, 500);
-            }
-            return true;
-        }
-
-        @Override
-        public boolean onCreateWindow(WebView view, boolean dialog,
-                boolean userGesture, Message resultMsg) {
-            if (!mCanOpenWindows) {
-                // We can't open windows, so just send null back.
-                WebView.WebViewTransport transport =
-                        (WebView.WebViewTransport) resultMsg.obj;
-                transport.setWebView(null);
-                resultMsg.sendToTarget();
-                return true;
-            }
-
-            // We never display the new window, just create the view and
-            // allow it's content to execute and be recorded by the test
-            // runner.
-
-            HashMap<String, Object> jsIfaces = new HashMap<String, Object>();
-            jsIfaces.put("layoutTestController", mCallbackProxy);
-            jsIfaces.put("eventSender", mCallbackProxy);
-            WebView newWindowView = new NewWindowWebView(TestShellActivity.this, jsIfaces);
-            setupWebViewForLayoutTests(newWindowView, mCallbackProxy);
-            WebView.WebViewTransport transport =
-                    (WebView.WebViewTransport) resultMsg.obj;
-            transport.setWebView(newWindowView);
-            resultMsg.sendToTarget();
-            return true;
-        }
-
-        @Override
-        public void onCloseWindow(WebView view) {
-            view.destroy();
-        }
-    };
-
-    private static class NewWindowWebView extends WebView {
-        public NewWindowWebView(Context context, Map<String, Object> jsIfaces) {
-            super(context, null, 0, jsIfaces, false);
-        }
-    }
-
-    private void resetTestStatus() {
-        mWaitUntilDone = false;
-        mDumpDataType = mDefaultDumpDataType;
-        mDumpTopFrameAsText = false;
-        mDumpChildFramesAsText = false;
-        mTimedOut = false;
-        mDumpTitleChanges = false;
-        mRequestedWebKitData = false;
-        mDumpDatabaseCallbacks = false;
-        mCanOpenWindows = false;
-        mEventSender.resetMouse();
-        mEventSender.clearTouchPoints();
-        mEventSender.clearTouchMetaState();
-        mPageFinished = false;
-        mDumpWebKitData = false;
-        setDefaultWebSettings(mWebView);
-        CookieManager.getInstance().removeAllCookie();
-        mWebViewClassic.setUseMockGeolocation();
-    }
-
-    private boolean canMoveToNextTest() {
-        return (mDumpWebKitData && mPageFinished && !mWaitUntilDone) || mTimedOut;
-    }
-
-    private void setupWebViewForLayoutTests(WebView webview, CallbackProxy callbackProxy) {
-        if (webview == null) {
-            return;
-        }
-
-        setDefaultWebSettings(webview);
-
-        webview.setWebChromeClient(mChromeClient);
-        webview.setWebViewClient(mViewClient);
-        // Setting a touch interval of -1 effectively disables the optimisation in WebView
-        // that stops repeated touch events flooding WebCore. The Event Sender only sends a
-        // single event rather than a stream of events (like what would generally happen in
-        // a real use of touch events in a WebView)  and so if the WebView drops the event,
-        // the test will fail as the test expects one callback for every touch it synthesizes.
-        WebViewClassic.fromWebView(webview).setTouchInterval(-1);
-    }
-
-    public void setDefaultWebSettings(WebView webview) {
-        WebSettingsClassic settings = WebViewClassic.fromWebView(webview).getSettings();
-        settings.setAppCacheEnabled(true);
-        settings.setAppCachePath(getApplicationContext().getCacheDir().getPath());
-        settings.setAppCacheMaxSize(Long.MAX_VALUE);
-        settings.setJavaScriptEnabled(true);
-        settings.setJavaScriptCanOpenWindowsAutomatically(true);
-        settings.setSupportMultipleWindows(true);
-        settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);
-        settings.setDatabaseEnabled(true);
-        settings.setDatabasePath(getDir("databases",0).getAbsolutePath());
-        settings.setDomStorageEnabled(true);
-        settings.setWorkersEnabled(false);
-        settings.setXSSAuditorEnabled(false);
-        settings.setPageCacheCapacity(0);
-        settings.setProperty("use_minimal_memory", "false");
-        settings.setAllowUniversalAccessFromFileURLs(true);
-        settings.setAllowFileAccessFromFileURLs(true);
-    }
-
-    private WebViewClassic mWebViewClassic;
-    private WebView mWebView;
-    private WebViewEventSender mEventSender;
-    private AsyncHandler mHandler;
-    private TestShellCallback mCallback;
-
-    private CallbackProxy mCallbackProxy;
-
-    private String mTestUrl;
-    private String mResultFile;
-    private int mTimeoutInMillis;
-    private String mUiAutoTestPath;
-    private BufferedReader mTestListReader;
-    private int mTotalTestCount;
-    private int mCurrentTestNumber;
-    private boolean mStopOnRefError;
-
-    // States
-    private boolean mTimedOut;
-    private boolean mRequestedWebKitData;
-    private boolean mFinishedRunning;
-
-    // Layout test controller variables.
-    private DumpDataType mDumpDataType;
-    private DumpDataType mDefaultDumpDataType = DumpDataType.EXT_REPR;
-    private boolean mDumpTopFrameAsText;
-    private boolean mDumpChildFramesAsText;
-    private boolean mWaitUntilDone;
-    private boolean mDumpTitleChanges;
-    private StringBuffer mTitleChanges;
-    private StringBuffer mDialogStrings;
-    private boolean mKeepWebHistory;
-    private Vector mWebHistory;
-    private boolean mDumpDatabaseCallbacks;
-    private StringBuffer mDatabaseCallbackStrings;
-    private StringBuffer mConsoleMessages;
-    private boolean mCanOpenWindows;
-
-    private boolean mPageFinished = false;
-    private boolean mDumpWebKitData = false;
-
-    static final String TIMEOUT_STR = "**Test timeout";
-    static final long DUMP_TIMEOUT_MS = 100000; // 100s timeout for dumping webview content
-
-    static final int MSG_TIMEOUT = 0;
-    static final int MSG_WEBKIT_DATA = 1;
-    static final int MSG_DUMP_TIMEOUT = 2;
-
-    static final String LOGTAG="TestShell";
-
-    static final String TEST_URL = "TestUrl";
-    static final String RESULT_FILE = "ResultFile";
-    static final String TIMEOUT_IN_MILLIS = "TimeoutInMillis";
-    static final String UI_AUTO_TEST = "UiAutoTest";
-    static final String GET_DRAW_TIME = "GetDrawTime";
-    static final String SAVE_IMAGE = "SaveImage";
-    static final String TOTAL_TEST_COUNT = "TestCount";
-    static final String CURRENT_TEST_NUMBER = "TestNumber";
-    static final String STOP_ON_REF_ERROR = "StopOnReferenceError";
-
-    static final int DRAW_RUNS = 5;
-    static final String DRAW_TIME_LOG = Environment.getExternalStorageDirectory() +
-        "/android/page_draw_time.txt";
-}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellCallback.java b/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellCallback.java
deleted file mode 100644
index 5220d579..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellCallback.java
+++ /dev/null
@@ -1,23 +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 com.android.dumprendertree;
-
-public interface TestShellCallback {
-    public void finished();
-    public void dumpResult(String webViewDump);
-    public void timedOut(String url);
-}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/WebViewEventSender.java b/tests/DumpRenderTree/src/com/android/dumprendertree/WebViewEventSender.java
deleted file mode 100644
index 17345ae..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/WebViewEventSender.java
+++ /dev/null
@@ -1,413 +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 com.android.dumprendertree;
-
-import android.os.SystemClock;
-import android.util.*;
-import android.view.KeyEvent;
-import android.view.MotionEvent;
-import android.webkit.WebView;
-
-import java.util.Arrays;
-import java.util.Vector;
-
-public class WebViewEventSender implements EventSender {
-
-    private static final String LOGTAG = "WebViewEventSender";
-	
-    WebViewEventSender(WebView webView) {
-        mWebView = webView;
-        mWebView.getSettings().setBuiltInZoomControls(true);
-        mTouchPoints = new Vector<TouchPoint>();
-    }
-	
-	public void resetMouse() {
-		mouseX = mouseY = 0;
-	}
-
-	public void enableDOMUIEventLogging(int DOMNode) {
-		// TODO Auto-generated method stub
-
-	}
-
-	public void fireKeyboardEventsToElement(int DOMNode) {
-		// TODO Auto-generated method stub
-
-	}
-
-	public void keyDown(String character, String[] withModifiers) {
-        Log.e("EventSender", "KeyDown: " + character + "("
-                + character.getBytes()[0] + ") Modifiers: "
-                + Arrays.toString(withModifiers));
-        KeyEvent modifier = null;
-        if (withModifiers != null && withModifiers.length > 0) {
-            for (int i = 0; i < withModifiers.length; i++) {
-                int keyCode = modifierMapper(withModifiers[i]);
-                modifier = new KeyEvent(KeyEvent.ACTION_DOWN, keyCode);
-                mWebView.onKeyDown(modifier.getKeyCode(), modifier);
-            }
-        }
-        int keyCode = keyMapper(character.toLowerCase().toCharArray()[0]);
-        KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, keyCode);
-        mWebView.onKeyDown(event.getKeyCode(), event);
-
-    }
-	
-	public void keyDown(String character) {
-        keyDown(character, null);
-	}
-
-	public void leapForward(int milliseconds) {
-		// TODO Auto-generated method stub
-
-	}
-
-	public void mouseClick() {
-		mouseDown();
-		mouseUp();
-	}
-
-    public void mouseDown() {
-        long ts = SystemClock.uptimeMillis();
-        MotionEvent event = MotionEvent.obtain(ts, ts, MotionEvent.ACTION_DOWN, mouseX, mouseY, 0);
-        mWebView.onTouchEvent(event);
-    }
-
-    public void mouseMoveTo(int X, int Y) {
-        mouseX= X;
-        mouseY= Y;
-    }
-
-     public void mouseUp() {
-        long ts = SystemClock.uptimeMillis();
-        MotionEvent event = MotionEvent.obtain(ts, ts, MotionEvent.ACTION_UP, mouseX, mouseY, 0);
-        mWebView.onTouchEvent(event);
-    }
-
-	// Assumes lowercase chars, case needs to be
-	// handled by calling function.
-	static int keyMapper(char c) {
-		// handle numbers
-		if (c >= '0' && c<= '9') {
-			int offset = c - '0';
-			return KeyEvent.KEYCODE_0 + offset;
-		}
-
-		// handle characters
-		if (c >= 'a' && c <= 'z') {
-			int offset = c - 'a';
-			return KeyEvent.KEYCODE_A + offset;
-		}
-
-		// handle all others
-		switch (c) {
-		case '*':
-			return KeyEvent.KEYCODE_STAR;
-		case '#':
-			return KeyEvent.KEYCODE_POUND;
-		case ',':
-			return KeyEvent.KEYCODE_COMMA;
-		case '.':
-			return KeyEvent.KEYCODE_PERIOD;
-		case '\t':
-			return KeyEvent.KEYCODE_TAB;
-		case ' ':
-			return KeyEvent.KEYCODE_SPACE;
-		case '\n':
-			return KeyEvent.KEYCODE_ENTER;
-		case '\b':
-        case 0x7F:
-			return KeyEvent.KEYCODE_DEL;
-		case '~':
-			return KeyEvent.KEYCODE_GRAVE;
-		case '-':
-			return KeyEvent.KEYCODE_MINUS;
-		case '=':
-			return KeyEvent.KEYCODE_EQUALS;
-		case '(':
-			return KeyEvent.KEYCODE_LEFT_BRACKET;
-		case ')':
-			return KeyEvent.KEYCODE_RIGHT_BRACKET;
-		case '\\':
-			return KeyEvent.KEYCODE_BACKSLASH;
-		case ';':
-			return KeyEvent.KEYCODE_SEMICOLON;
-		case '\'':
-			return KeyEvent.KEYCODE_APOSTROPHE;
-		case '/':
-			return KeyEvent.KEYCODE_SLASH;
-		default:
-			break;
-		}
-
-		return c;
-	}
-	
-	static int modifierMapper(String modifier) {
-		if (modifier.equals("ctrlKey")) {
-			return KeyEvent.KEYCODE_ALT_LEFT;
-		} else if (modifier.equals("shiftKey")) {
-			return KeyEvent.KEYCODE_SHIFT_LEFT;
-		} else if (modifier.equals("altKey")) {
-			return KeyEvent.KEYCODE_SYM;
-		} else if (modifier.equals("metaKey")) {
-			return KeyEvent.KEYCODE_UNKNOWN;
-		}
-		return KeyEvent.KEYCODE_UNKNOWN;
-	}
-
-    public void touchStart() {
-        final int numPoints = mTouchPoints.size();
-        if (numPoints == 0) {
-            return;
-        }
-
-        int[] pointerIds = new int[numPoints];
-        MotionEvent.PointerCoords[] pointerCoords = new MotionEvent.PointerCoords[numPoints];
-        long downTime = SystemClock.uptimeMillis();
-
-        for (int i = 0; i < numPoints; ++i) {
-            pointerIds[i] = mTouchPoints.get(i).getId();
-            pointerCoords[i] = new MotionEvent.PointerCoords();
-            pointerCoords[i].x = mTouchPoints.get(i).getX();
-            pointerCoords[i].y = mTouchPoints.get(i).getY();
-            mTouchPoints.get(i).setDownTime(downTime);
-        }
-
-        MotionEvent event = MotionEvent.obtain(downTime, downTime,
-            MotionEvent.ACTION_DOWN, numPoints, pointerIds, pointerCoords,
-            mTouchMetaState, 1.0f, 1.0f, 0, 0, 0, 0);
-
-        mWebView.onTouchEvent(event);
-    }
-
-    public void touchMove() {
-        final int numPoints = mTouchPoints.size();
-        if (numPoints == 0) {
-            return;
-        }
-
-        int[] pointerIds = new int[numPoints];
-        MotionEvent.PointerCoords[] pointerCoords = new MotionEvent.PointerCoords[numPoints];
-        int numMovedPoints = 0;
-        for (int i = 0; i < numPoints; ++i) {
-            TouchPoint tp = mTouchPoints.get(i);
-            if (tp.hasMoved()) {
-                pointerIds[numMovedPoints] = mTouchPoints.get(i).getId();
-                pointerCoords[i] = new MotionEvent.PointerCoords();
-                pointerCoords[numMovedPoints].x = mTouchPoints.get(i).getX();
-                pointerCoords[numMovedPoints].y = mTouchPoints.get(i).getY();
-                ++numMovedPoints;
-                tp.setMoved(false);
-            }
-        }
-
-        if (numMovedPoints == 0) {
-            return;
-        }
-
-        MotionEvent event = MotionEvent.obtain(mTouchPoints.get(0).downTime(),
-                SystemClock.uptimeMillis(), MotionEvent.ACTION_MOVE,
-                numMovedPoints, pointerIds, pointerCoords,
-                mTouchMetaState, 1.0f, 1.0f, 0, 0, 0, 0);
-        mWebView.onTouchEvent(event);
-    }
-
-    public void touchEnd() {
-        final int numPoints = mTouchPoints.size();
-        if (numPoints == 0) {
-            return;
-        }
-
-        int[] pointerIds = new int[numPoints];
-        MotionEvent.PointerCoords[] pointerCoords = new MotionEvent.PointerCoords[numPoints];
-
-        for (int i = 0; i < numPoints; ++i) {
-            pointerIds[i] = mTouchPoints.get(i).getId();
-            pointerCoords[i] = new MotionEvent.PointerCoords();
-            pointerCoords[i].x = mTouchPoints.get(i).getX();
-            pointerCoords[i].y = mTouchPoints.get(i).getY();
-        }
-
-        MotionEvent event = MotionEvent.obtain(mTouchPoints.get(0).downTime(),
-                SystemClock.uptimeMillis(), MotionEvent.ACTION_UP,
-                numPoints, pointerIds, pointerCoords,
-                mTouchMetaState, 1.0f, 1.0f, 0, 0, 0, 0);
-        mWebView.onTouchEvent(event);
-
-        for (int i = numPoints - 1; i >= 0; --i) {  // remove released points.
-            TouchPoint tp = mTouchPoints.get(i);
-            if (tp.isReleased()) {
-              mTouchPoints.remove(i);
-            }
-        }
-    }
-
-    public void touchCancel() {
-        final int numPoints = mTouchPoints.size();
-        if (numPoints == 0) {
-            return;
-        }
-
-        int[] pointerIds = new int[numPoints];
-        MotionEvent.PointerCoords[] pointerCoords = new MotionEvent.PointerCoords[numPoints];
-        long cancelTime = SystemClock.uptimeMillis();
-        int numCanceledPoints = 0;
-
-        for (int i = 0; i < numPoints; ++i) {
-            TouchPoint tp = mTouchPoints.get(i);
-            if (tp.cancelled()) {
-                pointerIds[numCanceledPoints] = mTouchPoints.get(i).getId();
-                pointerCoords[numCanceledPoints] = new MotionEvent.PointerCoords();
-                pointerCoords[numCanceledPoints].x = mTouchPoints.get(i).getX();
-                pointerCoords[numCanceledPoints].y = mTouchPoints.get(i).getY();
-                ++numCanceledPoints;
-            }
-        }
-
-        if (numCanceledPoints == 0) {
-            return;
-        }
-
-        MotionEvent event = MotionEvent.obtain(mTouchPoints.get(0).downTime(),
-            SystemClock.uptimeMillis(), MotionEvent.ACTION_CANCEL,
-            numCanceledPoints, pointerIds, pointerCoords,
-            mTouchMetaState, 1.0f, 1.0f, 0, 0, 0, 0);
-
-        mWebView.onTouchEvent(event);
-    }
-
-    public void cancelTouchPoint(int id) {
-        TouchPoint tp = mTouchPoints.get(id);
-        if (tp == null) {
-            return;
-        }
-
-        tp.cancel();
-    }
-
-    public void addTouchPoint(int x, int y) {
-        final int numPoints = mTouchPoints.size();
-        int id;
-        if (numPoints == 0) {
-          id = 0;
-        } else {
-          id = mTouchPoints.get(numPoints - 1).getId() + 1;
-        }
-
-        mTouchPoints.add(new TouchPoint(id, contentsToWindowX(x), contentsToWindowY(y)));
-    }
-
-    public void updateTouchPoint(int i, int x, int y) {
-        TouchPoint tp = mTouchPoints.get(i);
-        if (tp == null) {
-            return;
-        }
-
-        tp.update(contentsToWindowX(x), contentsToWindowY(y));
-        tp.setMoved(true);
-    }
-
-    public void setTouchModifier(String modifier, boolean enabled) {
-        int mask = 0;
-        if ("alt".equals(modifier.toLowerCase())) {
-            mask = KeyEvent.META_ALT_ON;
-        } else if ("shift".equals(modifier.toLowerCase())) {
-            mask = KeyEvent.META_SHIFT_ON;
-        } else if ("ctrl".equals(modifier.toLowerCase())) {
-            mask = KeyEvent.META_SYM_ON;
-        }
-
-        if (enabled) {
-            mTouchMetaState |= mask;
-        } else {
-            mTouchMetaState &= ~mask;
-        }
-    }
-
-    public void releaseTouchPoint(int id) {
-        TouchPoint tp = mTouchPoints.get(id);
-        if (tp == null) {
-            return;
-        }
-
-        tp.release();
-    }
-
-    public void clearTouchPoints() {
-        mTouchPoints.clear();
-    }
-
-    public void clearTouchMetaState() {
-        mTouchMetaState = 0;
-    }
-
-    private int contentsToWindowX(int x) {
-        return Math.round(x * mWebView.getScale()) - mWebView.getScrollX();
-    }
-
-    private int contentsToWindowY(int y) {
-        return Math.round(y * mWebView.getScale()) - mWebView.getScrollY();
-    }
-
-    private WebView mWebView = null;
-    private int mouseX;
-    private int mouseY;
-
-    private class TouchPoint {
-        private int mId;
-        private int mX;
-        private int mY;
-        private long mDownTime;
-        private boolean mReleased;
-        private boolean mMoved;
-        private boolean mCancelled;
-
-        public TouchPoint(int id, int x, int y) {
-            mId = id;
-            mX = x;
-            mY = y;
-            mReleased = false;
-            mMoved = false;
-            mCancelled = false;
-        }
-
-        public void setDownTime(long downTime) { mDownTime = downTime; }
-        public long downTime() { return mDownTime; }
-        public void cancel() { mCancelled = true; }
-
-        public boolean cancelled() { return mCancelled; }
-
-        public void release() { mReleased = true; }
-        public boolean isReleased() { return mReleased; }
-
-        public void setMoved(boolean moved) { mMoved = moved; }
-        public boolean hasMoved() { return mMoved; }
-
-        public int getId() { return mId; }
-        public int getX() { return mX; }
-        public int getY() { return mY; }
-
-        public void update(int x, int y) {
-            mX = x;
-            mY = y;
-        }
-    }
-
-    private Vector<TouchPoint> mTouchPoints;
-    private int mTouchMetaState;
-}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/forwarder/AdbUtils.java b/tests/DumpRenderTree/src/com/android/dumprendertree/forwarder/AdbUtils.java
deleted file mode 100644
index c2ecf3a..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/forwarder/AdbUtils.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * 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.dumprendertree.forwarder;
-
-import android.util.Log;
-
-import java.io.DataInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.Socket;
-
-public class AdbUtils {
-
-    private static final String ADB_OK = "OKAY";
-    private static final int ADB_PORT = 5037;
-    private static final String ADB_HOST = "127.0.0.1";
-    private static final int ADB_RESPONSE_SIZE = 4;
-
-    private static final String LOGTAG = "AdbUtils";
-
-    /**
-     *
-     * Convert integer format IP into xxx.xxx.xxx.xxx format
-     *
-     * @param host IP address in integer format
-     * @return human readable format
-     */
-    public static String convert(int host) {
-        return ((host >> 24) & 0xFF) + "."
-        + ((host >> 16) & 0xFF) + "."
-        + ((host >> 8) & 0xFF) + "."
-        + (host & 0xFF);
-    }
-
-    /**
-     *
-     * Resolve DNS name into IP address
-     *
-     * @param host DNS name
-     * @return IP address in integer format
-     * @throws IOException
-     */
-    public static int resolve(String host)  throws IOException {
-        Socket localSocket = new Socket(ADB_HOST, ADB_PORT);
-        DataInputStream dis = new DataInputStream(localSocket.getInputStream());
-        OutputStream os = localSocket.getOutputStream();
-        int count_read = 0;
-
-        if (localSocket == null || dis == null || os == null)
-            return -1;
-        String cmd = "dns:" + host;
-
-        if(!sendAdbCmd(dis, os, cmd))
-            return -1;
-
-        count_read = dis.readInt();
-        localSocket.close();
-        return count_read;
-    }
-
-    /**
-     *
-     * Send an ADB command using existing socket connection
-     *
-     * the streams provided must be from a socket connected to adbd already
-     *
-     * @param is input stream of the socket connection
-     * @param os output stream of the socket
-     * @param cmd the adb command to send
-     * @return if adb gave a success response
-     * @throws IOException
-     */
-    public static boolean sendAdbCmd(InputStream is, OutputStream os,
-            String cmd) throws IOException {
-        byte[] buf = new byte[ADB_RESPONSE_SIZE];
-
-        cmd = String.format("%04X", cmd.length()) + cmd;
-        os.write(cmd.getBytes());
-        int read = is.read(buf);
-        if(read != ADB_RESPONSE_SIZE || !ADB_OK.equals(new String(buf))) {
-            Log.w(LOGTAG, "adb cmd faild.");
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     *
-     * Get a tcp socket connection to specified IP address and port proxied by adb
-     *
-     * The proxying is transparent, e.g. if a socket is returned, then it can be written to and
-     * read from as if it is directly connected to the target
-     *
-     * @param remoteAddress IP address of the host to connect to
-     * @param remotePort port of the host to connect to
-     * @return a valid Socket instance if successful, null otherwise
-     */
-    public static Socket getForwardedSocket(int remoteAddress, int remotePort) {
-        try {
-            Socket socket = new Socket(ADB_HOST, ADB_PORT);
-            String cmd = "tcp:" + remotePort + ":" + convert(remoteAddress);
-            if(!sendAdbCmd(socket.getInputStream(), socket.getOutputStream(), cmd)) {
-                socket.close();
-                return null;
-            }
-            return socket;
-        } catch (IOException ioe) {
-            Log.w(LOGTAG, "error creating adb socket", ioe);
-            return null;
-        }
-    }
-}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/forwarder/ForwardServer.java b/tests/DumpRenderTree/src/com/android/dumprendertree/forwarder/ForwardServer.java
deleted file mode 100644
index 14f8fbe..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/forwarder/ForwardServer.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * 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.dumprendertree.forwarder;
-
-import android.util.Log;
-
-import java.io.IOException;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- *
- * A port forwarding server. Listens at specified local port and forward the tcp communications to
- * external host/port via adb networking proxy.
- *
- */
-public class ForwardServer {
-
-    private static final String LOGTAG = "ForwardServer";
-
-    private int remotePort;
-    private int remoteAddress;
-    private int localPort;
-    private ServerSocket serverSocket;
-    private boolean started;
-
-    private Set<Forwarder> forwarders;
-
-    public ForwardServer(int localPort, int remoteAddress, int remotePort) {
-        this.localPort = localPort;
-        this.remoteAddress = remoteAddress;
-        this.remotePort = remotePort;
-        started = false;
-        forwarders = new HashSet<Forwarder>();
-    }
-
-    public synchronized void start() throws IOException {
-        if(!started) {
-            serverSocket = new ServerSocket(localPort);
-            Thread serverThread = new Thread(new ServerRunner(serverSocket));
-            serverThread.setName(LOGTAG);
-            serverThread.start();
-            started = true;
-        }
-    }
-
-    public synchronized void stop() {
-        if(started) {
-            synchronized (forwarders) {
-                for(Forwarder forwarder : forwarders)
-                    forwarder.stop();
-                forwarders.clear();
-            }
-            try {
-                serverSocket.close();
-            } catch (IOException ioe) {
-                Log.v(LOGTAG, "exception while closing", ioe);
-            } finally {
-                started = false;
-            }
-        }
-    }
-
-    public synchronized boolean isRunning() {
-        return started;
-    }
-
-    private class ServerRunner implements Runnable {
-
-        private ServerSocket socket;
-
-        public ServerRunner(ServerSocket socket) {
-            this.socket = socket;
-        }
-
-        public void run() {
-            try {
-                while (true) {
-                    Socket localSocket = socket.accept();
-                    Socket remoteSocket = AdbUtils.getForwardedSocket(remoteAddress, remotePort);
-                    if(remoteSocket == null) {
-                        try {
-                            localSocket.close();
-                        } catch (IOException ioe) {
-                            Log.w(LOGTAG, "error while closing socket", ioe);
-                        } finally {
-                            Log.w(LOGTAG, "failed to start forwarding from " + localSocket);
-                        }
-                    } else {
-                        Forwarder forwarder = new Forwarder(localSocket, remoteSocket,
-                                ForwardServer.this);
-                        forwarder.start();
-                    }
-                }
-            } catch (IOException ioe) {
-                return;
-            }
-        }
-    }
-
-    public void register(Forwarder forwarder) {
-        synchronized (forwarders) {
-            if(!forwarders.contains(forwarder)) {
-                forwarders.add(forwarder);
-            }
-        }
-    }
-
-    public void unregister(Forwarder recyclable) {
-        synchronized (forwarders) {
-            if(forwarders.contains(recyclable)) {
-                recyclable.stop();
-                forwarders.remove(recyclable);
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/forwarder/ForwardService.java b/tests/DumpRenderTree/src/com/android/dumprendertree/forwarder/ForwardService.java
deleted file mode 100644
index 25dd04fd..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/forwarder/ForwardService.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * 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.dumprendertree.forwarder;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-
-import android.os.Environment;
-import android.util.Log;
-
-public class ForwardService {
-
-    private ForwardServer fs8000, fs8080, fs8443;
-
-    private static ForwardService inst;
-
-    private static final String LOGTAG = "ForwardService";
-
-    private static final String DEFAULT_TEST_HOST = "android-browser-test.mtv.corp.google.com";
-
-    private static final String FORWARD_HOST_CONF =
-        Environment.getExternalStorageDirectory() + "/drt_forward_host.txt";
-
-    private ForwardService() {
-        int addr = getForwardHostAddr();
-        if (addr != -1) {
-            fs8000 = new ForwardServer(8000, addr, 8000);
-            fs8080 = new ForwardServer(8080, addr, 8080);
-            fs8443 = new ForwardServer(8443, addr, 8443);
-        }
-    }
-
-    public static ForwardService getForwardService() {
-        if (inst == null) {
-            inst = new ForwardService();
-        }
-        return inst;
-    }
-
-    public void startForwardService() {
-        try {
-            if (fs8000 != null)
-                fs8000.start();
-            if (fs8080 != null)
-                fs8080.start();
-            if (fs8443 != null)
-                fs8443.start();
-        } catch (IOException ioe) {
-            Log.w(LOGTAG, "failed to start forwarder. http tests will fail.", ioe);
-            return;
-        }
-    }
-
-    public void stopForwardService() {
-        if (fs8000 != null) {
-            fs8000.stop();
-            fs8000 = null;
-        }
-        if (fs8080 != null) {
-            fs8080.stop();
-            fs8080 = null;
-        }
-        if (fs8443 != null) {
-            fs8443.stop();
-            fs8443 = null;
-        }
-        Log.v(LOGTAG, "forwarders stopped.");
-    }
-
-    private static int getForwardHostAddr() {
-        int addr = -1;
-        String host = null;
-        File forwardHostConf = new File(FORWARD_HOST_CONF);
-        if (forwardHostConf.isFile()) {
-            BufferedReader hostReader = null;
-            try {
-                hostReader = new BufferedReader(new FileReader(forwardHostConf));
-                host = hostReader.readLine();
-                Log.v(LOGTAG, "read forward host from file: " + host);
-            } catch (IOException ioe) {
-                Log.v(LOGTAG, "cannot read forward host from file", ioe);
-            } finally {
-                if (hostReader != null) {
-                    try {
-                        hostReader.close();
-                    } catch (IOException ioe) {
-                        // burn!!!
-                    }
-                }
-            }
-        }
-        if (host == null || host.length() == 0)
-            host = DEFAULT_TEST_HOST;
-        try {
-            addr = AdbUtils.resolve(host);
-        } catch (IOException ioe) {
-            Log.e(LOGTAG, "failed to resolve server address", ioe);
-        }
-        return addr;
-    }
-}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/forwarder/Forwarder.java b/tests/DumpRenderTree/src/com/android/dumprendertree/forwarder/Forwarder.java
deleted file mode 100644
index a971e7b..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/forwarder/Forwarder.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * 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.dumprendertree.forwarder;
-
-import android.util.Log;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.Socket;
-
-/**
- *
- * Worker class for {@link ForwardServer}. A Forwarder will be created once the ForwardServer
- * accepts an incoming connection, and it will then forward the incoming/outgoing streams to a
- * connection already proxied by adb networking (see also {@link AdbUtils}).
- *
- */
-public class Forwarder {
-
-    private ForwardServer server;
-    private Socket from, to;
-
-    private static final String LOGTAG = "Forwarder";
-    private static final int BUFFER_SIZE = 16384;
-
-    public Forwarder (Socket from, Socket to, ForwardServer server) {
-        this.server = server;
-        this.from = from;
-        this.to = to;
-        server.register(this);
-    }
-
-    public void start() {
-        Thread outgoing = new Thread(new SocketPipe(from, to));
-        Thread incoming = new Thread(new SocketPipe(to, from));
-        outgoing.setName(LOGTAG);
-        incoming.setName(LOGTAG);
-        outgoing.start();
-        incoming.start();
-    }
-
-    public void stop() {
-        shutdown(from);
-        shutdown(to);
-    }
-
-    private void shutdown(Socket socket) {
-        try {
-            socket.shutdownInput();
-        } catch (IOException e) {
-            Log.v(LOGTAG, "Socket#shutdownInput", e);
-        }
-        try {
-            socket.shutdownOutput();
-        } catch (IOException e) {
-            Log.v(LOGTAG, "Socket#shutdownOutput", e);
-        }
-        try {
-            socket.close();
-        } catch (IOException e) {
-            Log.v(LOGTAG, "Socket#close", e);
-        }
-    }
-
-    private class SocketPipe implements Runnable {
-
-        private Socket in, out;
-
-        public SocketPipe(Socket in, Socket out) {
-            this.in = in;
-            this.out = out;
-        }
-
-        public void run() {
-            try {
-                int length;
-                InputStream is = in.getInputStream();
-                OutputStream os = out.getOutputStream();
-                byte[] buffer = new byte[BUFFER_SIZE];
-                while ((length = is.read(buffer)) > 0) {
-                    os.write(buffer, 0, length);
-                }
-            } catch (IOException ioe) {
-            } finally {
-                server.unregister(Forwarder.this);
-            }
-        }
-
-        @Override
-        public String toString() {
-            return "SocketPipe{" + in + "=>" + out  + "}";
-        }
-    }
-}
diff --git a/tests/DumpRenderTree2/Android.mk b/tests/DumpRenderTree2/Android.mk
deleted file mode 100644
index 81fc633..0000000
--- a/tests/DumpRenderTree2/Android.mk
+++ /dev/null
@@ -1,29 +0,0 @@
-#
-# Copyright (C) 2010 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.
-#
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_SRC_FILES := $(call all-subdir-java-files)
-
-LOCAL_JAVA_LIBRARIES := android.test.runner
-
-LOCAL_STATIC_JAVA_LIBRARIES := diff_match_patch
-
-LOCAL_PACKAGE_NAME := DumpRenderTree2
-
-include $(BUILD_PACKAGE)
\ No newline at end of file
diff --git a/tests/DumpRenderTree2/AndroidManifest.xml b/tests/DumpRenderTree2/AndroidManifest.xml
deleted file mode 100644
index ea6571e..0000000
--- a/tests/DumpRenderTree2/AndroidManifest.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2010 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.
--->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.dumprendertree2">
-    <application>
-        <uses-library android:name="android.test.runner" />
-
-        <activity android:name=".ui.DirListActivity"
-                  android:label="Dump Render Tree 2"
-                  android:configChanges="orientation">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.TEST" />
-            </intent-filter>
-        </activity>
-
-        <!-- android:launchMode="singleTask" is there so we only have a one instance
-             of this activity. However, it doesn't seem to work exactly like described in the
-             documentation, because the behaviour of the application suggest
-             there is only a single task for all 3 activities. We don't understand
-             how exactly it all works, but at the moment it works just fine.
-             It can lead to some weird behaviour in the future. -->
-        <activity android:name=".TestsListActivity"
-                  android:label="Tests' list activity"
-                  android:launchMode="singleTask"
-                  android:configChanges="orientation">
-        </activity>
-
-        <activity android:name=".LayoutTestsExecutor"
-                  android:theme="@style/WhiteBackground"
-                  android:label="Layout tests' executor"
-                  android:process=":executor">
-        </activity>
-
-        <service android:name="ManagerService">
-        </service>
-    </application>
-
-    <instrumentation android:name="com.android.dumprendertree2.scriptsupport.ScriptTestRunner"
-                     android:targetPackage="com.android.dumprendertree2"
-                     android:label="Layout tests script runner" />
-
-    <uses-permission android:name="android.permission.INTERNET" />
-    <uses-permission android:name="android.permission.WRITE_SDCARD" />
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
-    <uses-permission android:name="android.permission.WAKE_LOCK" />
-</manifest>
diff --git a/tests/DumpRenderTree2/assets/run_apache2.py b/tests/DumpRenderTree2/assets/run_apache2.py
deleted file mode 100755
index 3806599..0000000
--- a/tests/DumpRenderTree2/assets/run_apache2.py
+++ /dev/null
@@ -1,163 +0,0 @@
-#!/usr/bin/python
-#
-# Copyright (C) 2010 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.
-#
-"""Start, stop, or restart apache2 server.
-
-  Apache2 must be installed with mod_php!
-
-  Usage:
-    run_apache2.py start|stop|restart
-"""
-
-import sys
-import os
-import subprocess
-import logging
-import optparse
-import time
-
-def main(run_cmd, options):
-  # Setup logging class
-  logging.basicConfig(level=logging.INFO, format='%(message)s')
-
-  if not run_cmd in ("start", "stop", "restart"):
-    logging.info("illegal argument: " + run_cmd)
-    logging.info("Usage: python run_apache2.py start|stop|restart")
-    return False
-
-  # Create /tmp/WebKit if it doesn't exist. This is needed for various files used by apache2
-  tmp_WebKit = os.path.join("/tmp", "WebKit")
-  if not os.path.exists(tmp_WebKit):
-    os.mkdir(tmp_WebKit)
-
-  # Get the path to android tree root based on the script location.
-  # Basically we go 5 levels up
-  parent = os.pardir
-  script_location = os.path.abspath(os.path.dirname(sys.argv[0]))
-  android_tree_root = os.path.join(script_location, parent, parent, parent, parent, parent)
-  android_tree_root = os.path.normpath(android_tree_root)
-
-  # If any of these is relative, then it's relative to ServerRoot (in our case android_tree_root)
-  webkit_path = os.path.join("external", "webkit")
-  if (options.tests_root_directory != None):
-    # if options.tests_root_directory is absolute, os.getcwd() is discarded!
-    layout_tests_path = os.path.normpath(os.path.join(os.getcwd(), options.tests_root_directory))
-  else:
-    layout_tests_path = os.path.join(webkit_path, "LayoutTests")
-  http_conf_path = os.path.join(layout_tests_path, "http", "conf")
-
-  # Prepare the command to set ${APACHE_RUN_USER} and ${APACHE_RUN_GROUP}
-  envvars_path = os.path.join("/etc", "apache2", "envvars")
-  export_envvars_cmd = "source " + envvars_path
-
-  error_log_path = os.path.join(tmp_WebKit, "apache2-error.log")
-  custom_log_path = os.path.join(tmp_WebKit, "apache2-access.log")
-
-  # Prepare the command to (re)start/stop the server with specified settings
-  apache2_restart_template = "apache2 -k %s"
-  directives  = " -c \"ServerRoot " + android_tree_root + "\""
-
-  # The default config in apache2-debian-httpd.conf listens on ports 8080 and
-  # 8443. We also need to listen on port 8000 for HTTP tests.
-  directives += " -c \"Listen 8000\""
-
-  # We use http/tests as the document root as the HTTP tests use hardcoded
-  # resources at the server root. We then use aliases to make available the
-  # complete set of tests and the required scripts.
-  directives += " -c \"DocumentRoot " + os.path.join(layout_tests_path, "http", "tests/") + "\""
-  directives += " -c \"Alias /LayoutTests " + layout_tests_path + "\""
-  directives += " -c \"Alias /Tools/DumpRenderTree/android " + \
-    os.path.join(webkit_path, "Tools", "DumpRenderTree", "android") + "\""
-  directives += " -c \"Alias /ThirdPartyProject.prop " + \
-    os.path.join(webkit_path, "ThirdPartyProject.prop") + "\""
-
-  # This directive is commented out in apache2-debian-httpd.conf for some reason
-  # However, it is useful to browse through tests in the browser, so it's added here.
-  # One thing to note is that because of problems with mod_dir and port numbers, mod_dir
-  # is turned off. That means that there _must_ be a trailing slash at the end of URL
-  # for auto indexes to work correctly.
-  directives += " -c \"LoadModule autoindex_module /usr/lib/apache2/modules/mod_autoindex.so\""
-
-  directives += " -c \"ErrorLog " + error_log_path +"\""
-  directives += " -c \"CustomLog " + custom_log_path + " combined\""
-  directives += " -c \"SSLCertificateFile " + os.path.join(http_conf_path, "webkit-httpd.pem") + \
-    "\""
-  directives += " -c \"User ${APACHE_RUN_USER}\""
-  directives += " -c \"Group ${APACHE_RUN_GROUP}\""
-  directives += " -C \"TypesConfig " + \
-    os.path.join(android_tree_root, http_conf_path, "mime.types") + "\""
-  conf_file_cmd = " -f " + \
-    os.path.join(android_tree_root, http_conf_path, "apache2-debian-httpd.conf")
-
-  # Try to execute the commands
-  logging.info("Will " + run_cmd + " apache2 server.")
-
-  # It is worth noting here that if the configuration file with which we restart the server points
-  # to a different PidFile it will not work and will result in a second apache2 instance.
-  if (run_cmd == 'restart'):
-    logging.info("First will stop...")
-    if execute_cmd(envvars_path, error_log_path,
-                   export_envvars_cmd + " && " + (apache2_restart_template % ('stop')) + directives + conf_file_cmd) == False:
-      logging.info("Failed to stop Apache2")
-      return False
-    logging.info("Stopped. Will start now...")
-    # We need to sleep breifly to avoid errors with apache being stopped and started too quickly
-    time.sleep(0.5)
-
-  if execute_cmd(envvars_path, error_log_path,
-                 export_envvars_cmd + " && " +
-                 (apache2_restart_template % (run_cmd)) + directives +
-                 conf_file_cmd) == False:
-    logging.info("Failed to start Apache2")
-    return False
-
-  logging.info("Successfully started")
-  return True
-
-def execute_cmd(envvars_path, error_log_path, cmd):
-  p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-  (out, err) = p.communicate()
-
-  # Output the stdout from the command to console
-  logging.info(out)
-
-  # Report any errors
-  if p.returncode != 0:
-    logging.info("!! ERRORS:")
-
-    if err.find(envvars_path) != -1:
-      logging.info(err)
-    elif err.find('command not found') != -1:
-      logging.info("apache2 is probably not installed")
-    else:
-      logging.info(err)
-      logging.info("Try looking in " + error_log_path + " for details")
-    return False
-
-  return True
-
-if __name__ == "__main__":
-  option_parser = optparse.OptionParser(usage="Usage: %prog [options] start|stop|restart")
-  option_parser.add_option("", "--tests-root-directory",
-                           help="The directory from which to take the tests, default is external/webkit/LayoutTests in this checkout of the Android tree")
-  options, args = option_parser.parse_args();
-
-  if len(args) < 1:
-    run_cmd = ""
-  else:
-    run_cmd = args[0]
-
-  main(run_cmd, options)
diff --git a/tests/DumpRenderTree2/assets/run_layout_tests.py b/tests/DumpRenderTree2/assets/run_layout_tests.py
deleted file mode 100755
index 161416a..0000000
--- a/tests/DumpRenderTree2/assets/run_layout_tests.py
+++ /dev/null
@@ -1,99 +0,0 @@
-#!/usr/bin/python
-
-"""Run layout tests on the device.
-
-  It runs the specified tests on the device, downloads the summaries to the temporary directory
-  and optionally shows the detailed results the host's default browser.
-
-  Usage:
-    run_layout_tests.py --show-results-in-browser test-relative-path
-"""
-
-import logging
-import optparse
-import os
-import re
-import sys
-import subprocess
-import tempfile
-import webbrowser
-
-import run_apache2
-
-#TODO: These should not be hardcoded
-RESULTS_ABSOLUTE_PATH = "/sdcard/layout-test-results/"
-DETAILS_HTML = "details.html"
-SUMMARY_TXT = "summary.txt"
-
-def main(path, options):
-  tmpdir = tempfile.gettempdir()
-
-  # Restart the server
-  if run_apache2.main("restart", options) == False:
-    return
-
-  # Run the tests in path
-  adb_cmd = "adb"
-  if options.serial:
-    adb_cmd += " -s " + options.serial
-  cmd = adb_cmd + " shell am instrument "
-  cmd += "-e class com.android.dumprendertree2.scriptsupport.Starter#startLayoutTests "
-  cmd += "-e path \"" + path + "\" "
-  cmd += "-w com.android.dumprendertree2/com.android.dumprendertree2.scriptsupport.ScriptTestRunner"
-
-  logging.info("Running the tests...")
-  logging.debug("Command = %s" % cmd)
-  (stdoutdata, stderrdata) = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
-  if stderrdata != "":
-    logging.info("Failed to start tests:\n%s", stderrdata)
-    return
-  if re.search("^INSTRUMENTATION_STATUS_CODE: -1", stdoutdata, re.MULTILINE) != None:
-    logging.info("Failed to run the tests. Is DumpRenderTree2 installed on the device?")
-    return
-  if re.search("^OK \([0-9]+ tests?\)", stdoutdata, re.MULTILINE) == None:
-    logging.info("DumpRenderTree2 failed to run correctly:\n%s", stdoutdata)
-    return
-
-  logging.info("Downloading the summaries...")
-
-  # Download the txt summary to tmp folder
-  summary_txt_tmp_path = os.path.join(tmpdir, SUMMARY_TXT)
-  cmd = "rm -f " + summary_txt_tmp_path + ";"
-  cmd += adb_cmd + " pull " + RESULTS_ABSOLUTE_PATH + SUMMARY_TXT + " " + summary_txt_tmp_path
-  subprocess.Popen(cmd, shell=True).wait()
-
-  # Download the html summary to tmp folder
-  details_html_tmp_path = os.path.join(tmpdir, DETAILS_HTML)
-  cmd = "rm -f " + details_html_tmp_path + ";"
-  cmd += adb_cmd + " pull " + RESULTS_ABSOLUTE_PATH + DETAILS_HTML + " " + details_html_tmp_path
-  subprocess.Popen(cmd, shell=True).wait()
-
-  # Print summary to console
-  logging.info("All done.\n")
-  cmd = "cat " + summary_txt_tmp_path
-  os.system(cmd)
-  logging.info("")
-
-  # Open the browser with summary
-  if options.show_results_in_browser != "false":
-    webbrowser.open(details_html_tmp_path)
-
-if __name__ == "__main__":
-  option_parser = optparse.OptionParser(usage="Usage: %prog [options] test-relative-path")
-  option_parser.add_option("", "--show-results-in-browser", default="true",
-                           help="Show the results the host's default web browser, default=true")
-  option_parser.add_option("", "--tests-root-directory",
-                           help="The directory from which to take the tests, default is external/webkit/LayoutTests in this checkout of the Android tree")
-  option_parser.add_option("-s", "--serial", default=None, help="Specify the serial number of device to run test on")
-  options, args = option_parser.parse_args();
-
-  logging.basicConfig(level=logging.INFO, format='%(message)s')
-
-  if len(args) > 1:
-    logging.fatal("Usage: run_layout_tests.py [options] test-relative-path")
-  else:
-    if len(args) < 1:
-      path = "";
-    else:
-      path = args[0]
-    main(path, options);
diff --git a/tests/DumpRenderTree2/res/drawable/folder.png b/tests/DumpRenderTree2/res/drawable/folder.png
deleted file mode 100644
index 5b3fcec..0000000
--- a/tests/DumpRenderTree2/res/drawable/folder.png
+++ /dev/null
Binary files differ
diff --git a/tests/DumpRenderTree2/res/drawable/runtest.png b/tests/DumpRenderTree2/res/drawable/runtest.png
deleted file mode 100644
index 910c654..0000000
--- a/tests/DumpRenderTree2/res/drawable/runtest.png
+++ /dev/null
Binary files differ
diff --git a/tests/DumpRenderTree2/res/layout/dirlist_row.xml b/tests/DumpRenderTree2/res/layout/dirlist_row.xml
deleted file mode 100644
index e5578a6..0000000
--- a/tests/DumpRenderTree2/res/layout/dirlist_row.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2010 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.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="horizontal"
-    android:gravity="center_vertical"
-    android:layout_width="fill_parent"
-    android:layout_height="wrap_content">
-
-    <ImageView
-        android:id="@+id/icon"
-        android:layout_width="80px"
-        android:adjustViewBounds="true"
-        android:paddingLeft="15px"
-        android:paddingRight="15px"
-        android:paddingTop="15px"
-        android:paddingBottom="15px"
-        android:layout_height="wrap_content"
-    />
-
-    <TextView
-        android:id="@+id/label"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:minHeight="60px"
-        android:gravity="center_vertical"
-        android:textSize="14sp"
-    />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/tests/DumpRenderTree2/res/menu/gui_menu.xml b/tests/DumpRenderTree2/res/menu/gui_menu.xml
deleted file mode 100644
index a5b2b65..0000000
--- a/tests/DumpRenderTree2/res/menu/gui_menu.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2010 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.
--->
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:id="@+id/run_all"
-          android:title="@string/run_all_tests" />
-</menu>
\ No newline at end of file
diff --git a/tests/DumpRenderTree2/res/values/strings.xml b/tests/DumpRenderTree2/res/values/strings.xml
deleted file mode 100644
index 0496404..0000000
--- a/tests/DumpRenderTree2/res/values/strings.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2010 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.
--->
-<resources>
-    <string name="dialog_run_abort_dir_title_prefix">Directory:</string>
-    <string name="dialog_run_abort_dir_msg">This will run all the tests in this directory and all
-            the subdirectories. It may take a few hours!</string>
-    <string name="dialog_run_abort_dir_ok_button">Run tests!</string>
-    <string name="dialog_run_abort_dir_abort_button">Abort</string>
-
-    <string name="dialog_progress_title">Loading items.</string>
-    <string name="dialog_progress_msg">Please wait...</string>
-
-    <string name="runner_preloading_title">Preloading tests...</string>
-
-    <string name="run_all_tests">Run all tests in the current directory</string>
-</resources>
\ No newline at end of file
diff --git a/tests/DumpRenderTree2/res/values/style.xml b/tests/DumpRenderTree2/res/values/style.xml
deleted file mode 100644
index 35f3419..0000000
--- a/tests/DumpRenderTree2/res/values/style.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2010 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.
--->
-<resources>
-    <style name="WhiteBackground">
-        <item name="android:background">@android:color/white</item>
-    </style>
-</resources>
\ No newline at end of file
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/AbstractResult.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/AbstractResult.java
deleted file mode 100644
index 614b03c..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/AbstractResult.java
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
- * Copyright (C) 2010 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.dumprendertree2;
-
-import android.os.Bundle;
-import android.os.Message;
-import android.util.Log;
-import android.webkit.WebView;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-
-/**
- * A class that represent a result of the test. It is responsible for returning the result's
- * raw data and generating its own diff in HTML format.
- */
-public abstract class AbstractResult implements Comparable<AbstractResult>, Serializable {
-
-    private static final String LOG_TAG = "AbstractResult";
-
-    public enum TestType {
-        TEXT {
-            @Override
-            public AbstractResult createResult(Bundle bundle) {
-                return new TextResult(bundle);
-            }
-        },
-        RENDER_TREE {
-            @Override
-            public AbstractResult createResult(Bundle bundle) {
-                /** TODO: RenderTree tests are not yet supported */
-                return null;
-            }
-        };
-
-        public abstract AbstractResult createResult(Bundle bundle);
-    }
-
-    /**
-     * A code representing the result of comparing actual and expected results.
-     */
-    public enum ResultCode implements Serializable {
-        RESULTS_MATCH("Results match"),
-        RESULTS_DIFFER("Results differ"),
-        NO_EXPECTED_RESULT("No expected result"),
-        NO_ACTUAL_RESULT("No actual result");
-
-        private String mTitle;
-
-        private ResultCode(String title) {
-            mTitle = title;
-        }
-
-        @Override
-        public String toString() {
-            return mTitle;
-        }
-    }
-
-    String mAdditionalTextOutputString;
-
-    public int compareTo(AbstractResult another) {
-        return getRelativePath().compareTo(another.getRelativePath());
-    }
-
-    public void setAdditionalTextOutputString(String additionalTextOutputString) {
-        mAdditionalTextOutputString = additionalTextOutputString;
-    }
-
-    public String getAdditionalTextOutputString() {
-        return mAdditionalTextOutputString;
-    }
-
-    public byte[] getBytes() {
-        ByteArrayOutputStream baos = null;
-        ObjectOutputStream oos = null;
-        try {
-            try {
-                baos = new ByteArrayOutputStream();
-                oos = new ObjectOutputStream(baos);
-                oos.writeObject(this);
-            } finally {
-                if (baos != null) {
-                    baos.close();
-                }
-                if (oos != null) {
-                    oos.close();
-                }
-            }
-        } catch (IOException e) {
-            Log.e(LOG_TAG, "Unable to serialize result: " + getRelativePath(), e);
-        }
-
-        return baos == null ? null : baos.toByteArray();
-    }
-
-    public static AbstractResult create(byte[] bytes) {
-        ByteArrayInputStream bais = null;
-        ObjectInputStream ois = null;
-        AbstractResult result = null;
-        try {
-            try {
-                bais = new ByteArrayInputStream(bytes);
-                ois = new ObjectInputStream(bais);
-                result = (AbstractResult)ois.readObject();
-            } finally {
-                if (bais != null) {
-                    bais.close();
-                }
-                if (ois != null) {
-                    ois.close();
-                }
-            }
-        } catch (IOException e) {
-            Log.e(LOG_TAG, "Unable to deserialize result!", e);
-        } catch (ClassNotFoundException e) {
-            Log.e(LOG_TAG, "Unable to deserialize result!", e);
-        }
-        return result;
-    }
-
-    public void clearResults() {
-        mAdditionalTextOutputString = null;
-    }
-
-    /**
-     * Makes the result object obtain the results of the test from the webview
-     * and store them in the format that suits itself bests. This method is asynchronous.
-     * The message passed as a parameter is a message that should be sent to its target
-     * when the result finishes obtaining the result.
-     *
-     * @param webview
-     * @param resultObtainedMsg
-     */
-    public abstract void obtainActualResults(WebView webview, Message resultObtainedMsg);
-
-    public abstract void setExpectedImageResult(byte[] expectedResult);
-
-    public abstract void setExpectedImageResultPath(String relativePath);
-
-    public abstract String getExpectedImageResultPath();
-
-    public abstract void setExpectedTextResult(String expectedResult);
-
-    public abstract void setExpectedTextResultPath(String relativePath);
-
-    public abstract String getExpectedTextResultPath();
-
-    /**
-     * Returns result's image data that can be written to the disk. It can be null
-     * if there is an error of some sort or for example the test times out.
-     *
-     * <p> Some tests will not provide data (like text tests)
-     *
-     * @return
-     *      results image data
-     */
-    public abstract byte[] getActualImageResult();
-
-    /**
-     * Returns result's text data. It can be null
-     * if there is an error of some sort or for example the test times out.
-     *
-     * @return
-     *      results text data
-     */
-    public abstract String getActualTextResult();
-
-    /**
-     * Returns the status code representing the result of comparing actual and expected results.
-     *
-     * @return
-     *      the status code from comparing actual and expected results
-     */
-    public abstract ResultCode getResultCode();
-
-    /**
-     * Returns whether this test crashed.
-     *
-     * @return
-     *      whether this test crashed
-     */
-    public abstract boolean didCrash();
-
-    /**
-     * Returns whether this test timed out.
-     *
-     * @return
-     *      whether this test timed out
-     */
-    public abstract boolean didTimeOut();
-
-    /**
-     * Sets that this test timed out.
-     */
-    public abstract void setDidTimeOut();
-
-    /**
-     * Returns whether the test passed.
-     *
-     * @return
-     *      whether the test passed
-     */
-    public boolean didPass() {
-        // Tests that crash can't have timed out or have an actual result.
-        assert !(didCrash() && didTimeOut());
-        assert !(didCrash() && getResultCode() != ResultCode.NO_ACTUAL_RESULT);
-        return !didCrash() && !didTimeOut() && getResultCode() == ResultCode.RESULTS_MATCH;
-    }
-
-    /**
-     * Return the type of the result data.
-     *
-     * @return
-     *      the type of the result data.
-     */
-    public abstract TestType getType();
-
-    public abstract String getRelativePath();
-
-    /**
-     * Returns a piece of HTML code that presents a visual diff between a result and
-     * the expected result.
-     *
-     * @return
-     *      a piece of HTML code with a visual diff between the result and the expected result
-     */
-    public abstract String getDiffAsHtml();
-
-    public abstract Bundle getBundle();
-}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/AdditionalTextOutput.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/AdditionalTextOutput.java
deleted file mode 100644
index bb9a916..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/AdditionalTextOutput.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (C) 2010 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.dumprendertree2;
-
-import android.util.Log;
-import android.webkit.ConsoleMessage;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-/**
- * A class that stores consoles messages, database callbacks, alert messages, etc.
- */
-public class AdditionalTextOutput {
-    private static final String LOG_TAG = "AdditionalTextOutput";
-
-    /**
-     * Ordering of enums is important as it determines ordering of the toString method!
-     * StringBuilders will be printed in the order the corresponding types appear here.
-     */
-    private enum OutputType {
-        JS_DIALOG,
-        EXCEEDED_DB_QUOTA_MESSAGE,
-        CONSOLE_MESSAGE;
-    }
-
-    StringBuilder[] mOutputs = new StringBuilder[OutputType.values().length];
-
-    private StringBuilder getStringBuilderForType(OutputType outputType) {
-        int index = outputType.ordinal();
-        if (mOutputs[index] == null) {
-            mOutputs[index] = new StringBuilder();
-        }
-        return mOutputs[index];
-    }
-
-    public void appendExceededDbQuotaMessage(String urlString, String databaseIdentifier) {
-        StringBuilder output = getStringBuilderForType(OutputType.EXCEEDED_DB_QUOTA_MESSAGE);
-
-        String protocol = "";
-        String host = "";
-        int port = 0;
-
-        try {
-            URL url = new URL(urlString);
-            protocol = url.getProtocol();
-            host = url.getHost();
-            if (url.getPort() > -1) {
-                port = url.getPort();
-            }
-        } catch (MalformedURLException e) {
-            Log.e(LOG_TAG, "urlString=" + urlString + " databaseIdentifier=" + databaseIdentifier,
-                    e);
-        }
-
-        output.append("UI DELEGATE DATABASE CALLBACK: ");
-        output.append("exceededDatabaseQuotaForSecurityOrigin:{");
-        output.append(protocol + ", " + host + ", " + port + "} ");
-        output.append("database:" + databaseIdentifier + "\n");
-    }
-
-    public void appendConsoleMessage(ConsoleMessage consoleMessage) {
-        StringBuilder output = getStringBuilderForType(OutputType.CONSOLE_MESSAGE);
-
-        output.append("CONSOLE MESSAGE: line " + consoleMessage.lineNumber());
-        output.append(": " + consoleMessage.message() + "\n");
-    }
-
-    public void appendJsAlert(String message) {
-        StringBuilder output = getStringBuilderForType(OutputType.JS_DIALOG);
-
-        output.append("ALERT: ");
-        output.append(message);
-        output.append('\n');
-    }
-
-    public void appendJsConfirm(String message) {
-        StringBuilder output = getStringBuilderForType(OutputType.JS_DIALOG);
-
-        output.append("CONFIRM: ");
-        output.append(message);
-        output.append('\n');
-    }
-
-    public void appendJsPrompt(String message, String defaultValue) {
-        StringBuilder output = getStringBuilderForType(OutputType.JS_DIALOG);
-
-        output.append("PROMPT: ");
-        output.append(message);
-        output.append(", default text: ");
-        output.append(defaultValue);
-        output.append('\n');
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder result = new StringBuilder();
-        for (int i = 0; i < mOutputs.length; i++) {
-            if (mOutputs[i] != null) {
-                result.append(mOutputs[i].toString());
-            }
-        }
-        return result.toString();
-    }
-}
\ No newline at end of file
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/CrashedDummyResult.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/CrashedDummyResult.java
deleted file mode 100644
index 4831168..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/CrashedDummyResult.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (C) 2010 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.dumprendertree2;
-
-import android.os.Bundle;
-import android.os.Message;
-import android.webkit.WebView;
-
-/**
- * A dummy class representing test that crashed.
- *
- * TODO: All the methods regarding expected results need implementing.
- */
-public class CrashedDummyResult extends AbstractResult {
-    String mRelativePath;
-
-    public CrashedDummyResult(String relativePath) {
-        mRelativePath = relativePath;
-    }
-
-    @Override
-    public byte[] getActualImageResult() {
-        return null;
-    }
-
-    @Override
-    public String getActualTextResult() {
-        return null;
-    }
-
-    @Override
-    public Bundle getBundle() {
-        /** TODO:  */
-        return null;
-    }
-
-    @Override
-    public String getDiffAsHtml() {
-        /** TODO: Probably show at least expected results */
-        return "Ooops, I crashed...";
-    }
-
-    @Override
-    public String getRelativePath() {
-        return mRelativePath;
-    }
-
-    @Override
-    public ResultCode getResultCode() {
-        return ResultCode.NO_ACTUAL_RESULT;
-    }
-
-    @Override
-    public boolean didCrash() {
-        return true;
-    }
-
-    @Override
-    public boolean didTimeOut() {
-        return false;
-    }
-
-    @Override
-    public void setDidTimeOut() {
-        /** This method is not applicable for this type of result */
-        assert false;
-    }
-
-    @Override
-    public TestType getType() {
-        return null;
-    }
-
-    @Override
-    public void obtainActualResults(WebView webview, Message resultObtainedMsg) {
-        /** This method is not applicable for this type of result */
-        assert false;
-    }
-
-    @Override
-    public void setExpectedImageResult(byte[] expectedResult) {
-        /** TODO */
-    }
-
-    @Override
-    public void setExpectedTextResult(String expectedResult) {
-        /** TODO */
-    }
-
-    @Override
-    public String getExpectedImageResultPath() {
-        /** TODO */
-        return null;
-    }
-
-    @Override
-    public String getExpectedTextResultPath() {
-        /** TODO */
-        return null;
-    }
-
-    @Override
-    public void setExpectedImageResultPath(String relativePath) {
-        /** TODO */
-    }
-
-    @Override
-    public void setExpectedTextResultPath(String relativePath) {
-        /** TODO */
-    }
-}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/EventSender.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/EventSender.java
deleted file mode 100644
index 5b7cbc4..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/EventSender.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (C) 2010 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.dumprendertree2;
-
-import android.webkit.WebView;
-
-/**
- * A class that acts as a JS interface for webview to mock various touch events,
- * mouse actions and key presses.
- *
- * The methods here just call corresponding methods on EventSenderImpl
- * that contains the logic of how to execute the methods.
- */
-public class EventSender {
-    EventSenderImpl mEventSenderImpl = new EventSenderImpl();
-
-    public void reset(WebView webView) {
-        mEventSenderImpl.reset(webView);
-    }
-
-    public void enableDOMUIEventLogging(int domNode) {
-        mEventSenderImpl.enableDOMUIEventLogging(domNode);
-    }
-
-    public void fireKeyboardEventsToElement(int domNode) {
-        mEventSenderImpl.fireKeyboardEventsToElement(domNode);
-    }
-
-    public void keyDown(String character, String[] withModifiers) {
-        mEventSenderImpl.keyDown(character, withModifiers);
-    }
-
-    public void keyDown(String character) {
-        keyDown(character, null);
-    }
-
-    public void leapForward(int milliseconds) {
-        mEventSenderImpl.leapForward(milliseconds);
-    }
-
-    public void mouseClick() {
-        mEventSenderImpl.mouseClick();
-    }
-
-    public void mouseDown() {
-        mEventSenderImpl.mouseDown();
-    }
-
-    public void mouseMoveTo(int x, int y) {
-        mEventSenderImpl.mouseMoveTo(x, y);
-    }
-
-    public void mouseUp() {
-        mEventSenderImpl.mouseUp();
-    }
-
-    public void touchStart() {
-        mEventSenderImpl.touchStart();
-    }
-
-    public void addTouchPoint(int x, int y) {
-        mEventSenderImpl.addTouchPoint(x, y);
-    }
-
-    public void updateTouchPoint(int id, int x, int y) {
-        mEventSenderImpl.updateTouchPoint(id, x, y);
-    }
-
-    public void setTouchModifier(String modifier, boolean enabled) {
-        mEventSenderImpl.setTouchModifier(modifier, enabled);
-    }
-
-    public void touchMove() {
-        mEventSenderImpl.touchMove();
-    }
-
-    public void releaseTouchPoint(int id) {
-        mEventSenderImpl.releaseTouchPoint(id);
-    }
-
-    public void touchEnd() {
-        mEventSenderImpl.touchEnd();
-    }
-
-    public void touchCancel() {
-        mEventSenderImpl.touchCancel();
-    }
-
-    public void clearTouchPoints() {
-        mEventSenderImpl.clearTouchPoints();
-    }
-
-    public void cancelTouchPoint(int id) {
-        mEventSenderImpl.cancelTouchPoint(id);
-    }
-}
\ No newline at end of file
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/EventSenderImpl.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/EventSenderImpl.java
deleted file mode 100644
index af22039..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/EventSenderImpl.java
+++ /dev/null
@@ -1,590 +0,0 @@
-/*
- * Copyright (C) 2010 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.dumprendertree2;
-
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.os.SystemClock;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.MotionEvent;
-import android.webkit.WebView;
-
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * An implementation of EventSender
- */
-public class EventSenderImpl {
-    private static final String LOG_TAG = "EventSenderImpl";
-
-    private static final int MSG_ENABLE_DOM_UI_EVENT_LOGGING = 0;
-    private static final int MSG_FIRE_KEYBOARD_EVENTS_TO_ELEMENT = 1;
-    private static final int MSG_LEAP_FORWARD = 2;
-
-    private static final int MSG_KEY_DOWN = 3;
-
-    private static final int MSG_MOUSE_DOWN = 4;
-    private static final int MSG_MOUSE_UP = 5;
-    private static final int MSG_MOUSE_CLICK = 6;
-    private static final int MSG_MOUSE_MOVE_TO = 7;
-
-    private static final int MSG_ADD_TOUCH_POINT = 8;
-    private static final int MSG_TOUCH_START = 9;
-    private static final int MSG_UPDATE_TOUCH_POINT = 10;
-    private static final int MSG_TOUCH_MOVE = 11;
-    private static final int MSG_CLEAR_TOUCH_POINTS = 12;
-    private static final int MSG_TOUCH_CANCEL = 13;
-    private static final int MSG_RELEASE_TOUCH_POINT = 14;
-    private static final int MSG_TOUCH_END = 15;
-    private static final int MSG_SET_TOUCH_MODIFIER = 16;
-    private static final int MSG_CANCEL_TOUCH_POINT = 17;
-
-    private static class Point {
-        private int mX;
-        private int mY;
-
-        public Point(int x, int y) {
-            mX = x;
-            mY = y;
-        }
-        public int x() {
-            return mX;
-        }
-        public int y() {
-            return mY;
-        }
-    }
-
-    private Point createViewPointFromContentCoordinates(int x, int y) {
-        return new Point(Math.round(x * mWebView.getScale()) - mWebView.getScrollX(),
-                         Math.round(y * mWebView.getScale()) - mWebView.getScrollY());
-    }
-
-    public static class TouchPoint {
-        private int mId;
-        private Point mPoint;
-        private long mDownTime;
-        private boolean mReleased = false;
-        private boolean mMoved = false;
-        private boolean mCancelled = false;
-
-        public TouchPoint(int id, Point point) {
-            mId = id;
-            mPoint = point;
-        }
-
-        public int getId() {
-          return mId;
-        }
-
-        public int getX() {
-            return mPoint.x();
-        }
-
-        public int getY() {
-            return mPoint.y();
-        }
-
-        public boolean hasMoved() {
-            return mMoved;
-        }
-
-        public void move(Point point) {
-            mPoint = point;
-            mMoved = true;
-        }
-
-        public void resetHasMoved() {
-            mMoved = false;
-        }
-
-        public long getDownTime() {
-            return mDownTime;
-        }
-
-        public void setDownTime(long downTime) {
-            mDownTime = downTime;
-        }
-
-        public boolean isReleased() {
-            return mReleased;
-        }
-
-        public void release() {
-            mReleased = true;
-        }
-
-        public boolean isCancelled() {
-            return mCancelled;
-        }
-
-        public void cancel() {
-            mCancelled = true;
-        }
-    }
-
-    private List<TouchPoint> mTouchPoints;
-    private int mTouchMetaState;
-    private Point mMousePoint;
-
-    private WebView mWebView;
-
-    private Handler mEventSenderHandler = new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-            Bundle bundle;
-            MotionEvent event;
-            long ts;
-
-            switch (msg.what) {
-                case MSG_ENABLE_DOM_UI_EVENT_LOGGING:
-                    /** TODO: implement */
-                    break;
-
-                case MSG_FIRE_KEYBOARD_EVENTS_TO_ELEMENT:
-                    /** TODO: implement */
-                    break;
-
-                case MSG_LEAP_FORWARD:
-                    /** TODO: implement */
-                    break;
-
-                case MSG_KEY_DOWN:
-                    bundle = (Bundle)msg.obj;
-                    String character = bundle.getString("character");
-                    String[] withModifiers = bundle.getStringArray("withModifiers");
-
-                    if (withModifiers != null && withModifiers.length > 0) {
-                        for (int i = 0; i < withModifiers.length; i++) {
-                            executeKeyEvent(KeyEvent.ACTION_DOWN,
-                                    modifierToKeyCode(withModifiers[i]));
-                        }
-                    }
-                    executeKeyEvent(KeyEvent.ACTION_DOWN,
-                            charToKeyCode(character.toLowerCase().toCharArray()[0]));
-                    break;
-
-                /** MOUSE */
-
-                case MSG_MOUSE_DOWN:
-                    if (mMousePoint != null) {
-                        ts = SystemClock.uptimeMillis();
-                        event = MotionEvent.obtain(ts, ts, MotionEvent.ACTION_DOWN, mMousePoint.x(), mMousePoint.y(), 0);
-                        mWebView.onTouchEvent(event);
-                    }
-                    break;
-
-                case MSG_MOUSE_UP:
-                    if (mMousePoint != null) {
-                        ts = SystemClock.uptimeMillis();
-                        event = MotionEvent.obtain(ts, ts, MotionEvent.ACTION_UP, mMousePoint.x(), mMousePoint.y(), 0);
-                        mWebView.onTouchEvent(event);
-                    }
-                    break;
-
-                case MSG_MOUSE_CLICK:
-                    mouseDown();
-                    mouseUp();
-                    break;
-
-                case MSG_MOUSE_MOVE_TO:
-                    mMousePoint = createViewPointFromContentCoordinates(msg.arg1, msg.arg2);
-                    break;
-
-                /** TOUCH */
-
-                case MSG_ADD_TOUCH_POINT:
-                    int numPoints = getTouchPoints().size();
-                    int id;
-                    if (numPoints == 0) {
-                        id = 0;
-                    } else {
-                        id = getTouchPoints().get(numPoints - 1).getId() + 1;
-                    }
-                    getTouchPoints().add(
-                            new TouchPoint(id, createViewPointFromContentCoordinates(msg.arg1, msg.arg2)));
-                    break;
-
-                case MSG_TOUCH_START:
-                    if (getTouchPoints().isEmpty()) {
-                        return;
-                    }
-                    for (int i = 0; i < getTouchPoints().size(); ++i) {
-                        getTouchPoints().get(i).setDownTime(SystemClock.uptimeMillis());
-                    }
-                    executeTouchEvent(MotionEvent.ACTION_DOWN);
-                    break;
-
-                case MSG_UPDATE_TOUCH_POINT:
-                    bundle = (Bundle)msg.obj;
-
-                    int index = bundle.getInt("id");
-                    if (index >= getTouchPoints().size()) {
-                        Log.w(LOG_TAG + "::MSG_UPDATE_TOUCH_POINT", "TouchPoint out of bounds: "
-                                + index);
-                        break;
-                    }
-
-                    getTouchPoints().get(index).move(
-                            createViewPointFromContentCoordinates(bundle.getInt("x"), bundle.getInt("y")));
-                    break;
-
-                case MSG_TOUCH_MOVE:
-                    /**
-                     * FIXME: At the moment we don't support multi-touch. Hence, we only examine
-                     * the first touch point. In future this method will need rewriting.
-                     */
-                    if (getTouchPoints().isEmpty()) {
-                        return;
-                    }
-                    executeTouchEvent(MotionEvent.ACTION_MOVE);
-                    for (int i = 0; i < getTouchPoints().size(); ++i) {
-                        getTouchPoints().get(i).resetHasMoved();
-                    }
-                    break;
-
-                case MSG_CANCEL_TOUCH_POINT:
-                    if (msg.arg1 >= getTouchPoints().size()) {
-                        Log.w(LOG_TAG + "::MSG_RELEASE_TOUCH_POINT", "TouchPoint out of bounds: "
-                                + msg.arg1);
-                        break;
-                    }
-
-                    getTouchPoints().get(msg.arg1).cancel();
-                    break;
-
-                case MSG_TOUCH_CANCEL:
-                    /**
-                     * FIXME: At the moment we don't support multi-touch. Hence, we only examine
-                     * the first touch point. In future this method will need rewriting.
-                     */
-                    if (getTouchPoints().isEmpty()) {
-                        return;
-                    }
-                    executeTouchEvent(MotionEvent.ACTION_CANCEL);
-                    break;
-
-                case MSG_RELEASE_TOUCH_POINT:
-                    if (msg.arg1 >= getTouchPoints().size()) {
-                        Log.w(LOG_TAG + "::MSG_RELEASE_TOUCH_POINT", "TouchPoint out of bounds: "
-                                + msg.arg1);
-                        break;
-                    }
-
-                    getTouchPoints().get(msg.arg1).release();
-                    break;
-
-                case MSG_TOUCH_END:
-                    /**
-                     * FIXME: At the moment we don't support multi-touch. Hence, we only examine
-                     * the first touch point. In future this method will need rewriting.
-                     */
-                    if (getTouchPoints().isEmpty()) {
-                        return;
-                    }
-                    executeTouchEvent(MotionEvent.ACTION_UP);
-                    // remove released points.
-                    for (int i = getTouchPoints().size() - 1; i >= 0; --i) {
-                        if (getTouchPoints().get(i).isReleased()) {
-                            getTouchPoints().remove(i);
-                        }
-                    }
-                    break;
-
-                case MSG_SET_TOUCH_MODIFIER:
-                    bundle = (Bundle)msg.obj;
-                    String modifier = bundle.getString("modifier");
-                    boolean enabled = bundle.getBoolean("enabled");
-
-                    int mask = 0;
-                    if ("alt".equals(modifier.toLowerCase())) {
-                        mask = KeyEvent.META_ALT_ON;
-                    } else if ("shift".equals(modifier.toLowerCase())) {
-                        mask = KeyEvent.META_SHIFT_ON;
-                    } else if ("ctrl".equals(modifier.toLowerCase())) {
-                        mask = KeyEvent.META_SYM_ON;
-                    }
-
-                    if (enabled) {
-                        mTouchMetaState |= mask;
-                    } else {
-                        mTouchMetaState &= ~mask;
-                    }
-
-                    break;
-
-                case MSG_CLEAR_TOUCH_POINTS:
-                    getTouchPoints().clear();
-                    break;
-
-                default:
-                    break;
-            }
-        }
-    };
-
-    public void reset(WebView webView) {
-        mWebView = webView;
-        mTouchPoints = null;
-        mTouchMetaState = 0;
-        mMousePoint = null;
-    }
-
-    public void enableDOMUIEventLogging(int domNode) {
-        Message msg = mEventSenderHandler.obtainMessage(MSG_ENABLE_DOM_UI_EVENT_LOGGING);
-        msg.arg1 = domNode;
-        msg.sendToTarget();
-    }
-
-    public void fireKeyboardEventsToElement(int domNode) {
-        Message msg = mEventSenderHandler.obtainMessage(MSG_FIRE_KEYBOARD_EVENTS_TO_ELEMENT);
-        msg.arg1 = domNode;
-        msg.sendToTarget();
-    }
-
-    public void leapForward(int milliseconds) {
-        Message msg = mEventSenderHandler.obtainMessage(MSG_LEAP_FORWARD);
-        msg.arg1 = milliseconds;
-        msg.sendToTarget();
-    }
-
-    public void keyDown(String character, String[] withModifiers) {
-        Bundle bundle = new Bundle();
-        bundle.putString("character", character);
-        bundle.putStringArray("withModifiers", withModifiers);
-        mEventSenderHandler.obtainMessage(MSG_KEY_DOWN, bundle).sendToTarget();
-    }
-
-    /** MOUSE */
-
-    public void mouseDown() {
-        mEventSenderHandler.sendEmptyMessage(MSG_MOUSE_DOWN);
-    }
-
-    public void mouseUp() {
-        mEventSenderHandler.sendEmptyMessage(MSG_MOUSE_UP);
-    }
-
-    public void mouseClick() {
-        mEventSenderHandler.sendEmptyMessage(MSG_MOUSE_CLICK);
-    }
-
-    public void mouseMoveTo(int x, int y) {
-        mEventSenderHandler.obtainMessage(MSG_MOUSE_MOVE_TO, x, y).sendToTarget();
-    }
-
-    /** TOUCH */
-
-    public void addTouchPoint(int x, int y) {
-        mEventSenderHandler.obtainMessage(MSG_ADD_TOUCH_POINT, x, y).sendToTarget();
-    }
-
-    public void touchStart() {
-        mEventSenderHandler.sendEmptyMessage(MSG_TOUCH_START);
-    }
-
-    public void updateTouchPoint(int id, int x, int y) {
-        Bundle bundle = new Bundle();
-        bundle.putInt("id", id);
-        bundle.putInt("x", x);
-        bundle.putInt("y", y);
-        mEventSenderHandler.obtainMessage(MSG_UPDATE_TOUCH_POINT, bundle).sendToTarget();
-    }
-
-    public void touchMove() {
-        mEventSenderHandler.sendEmptyMessage(MSG_TOUCH_MOVE);
-    }
-
-    public void cancelTouchPoint(int id) {
-        Message msg = mEventSenderHandler.obtainMessage(MSG_CANCEL_TOUCH_POINT);
-        msg.arg1 = id;
-        msg.sendToTarget();
-    }
-
-    public void touchCancel() {
-        mEventSenderHandler.sendEmptyMessage(MSG_TOUCH_CANCEL);
-    }
-
-    public void releaseTouchPoint(int id) {
-        Message msg = mEventSenderHandler.obtainMessage(MSG_RELEASE_TOUCH_POINT);
-        msg.arg1 = id;
-        msg.sendToTarget();
-    }
-
-    public void touchEnd() {
-        mEventSenderHandler.sendEmptyMessage(MSG_TOUCH_END);
-    }
-
-    public void setTouchModifier(String modifier, boolean enabled) {
-        Bundle bundle = new Bundle();
-        bundle.putString("modifier", modifier);
-        bundle.putBoolean("enabled", enabled);
-        mEventSenderHandler.obtainMessage(MSG_SET_TOUCH_MODIFIER, bundle).sendToTarget();
-    }
-
-    public void clearTouchPoints() {
-        mEventSenderHandler.sendEmptyMessage(MSG_CLEAR_TOUCH_POINTS);
-    }
-
-    private List<TouchPoint> getTouchPoints() {
-        if (mTouchPoints == null) {
-            mTouchPoints = new LinkedList<TouchPoint>();
-        }
-
-        return mTouchPoints;
-    }
-
-    private void executeTouchEvent(int action) {
-        int numPoints = getTouchPoints().size();
-        int[] pointerIds = new int[numPoints];
-        MotionEvent.PointerCoords[] pointerCoords = new MotionEvent.PointerCoords[numPoints];
-
-        for (int i = 0; i < numPoints; ++i) {
-            boolean isNeeded = false;
-            switch(action) {
-            case MotionEvent.ACTION_DOWN:
-            case MotionEvent.ACTION_UP:
-                isNeeded = true;
-                break;
-            case MotionEvent.ACTION_MOVE:
-                isNeeded = getTouchPoints().get(i).hasMoved();
-                break;
-            case MotionEvent.ACTION_CANCEL:
-                isNeeded = getTouchPoints().get(i).isCancelled();
-                break;
-            default:
-                Log.w(LOG_TAG + "::executeTouchEvent(),", "action not supported:" + action);
-                break;
-            }
-
-            numPoints = 0;
-            if (isNeeded) {
-                pointerIds[numPoints] = getTouchPoints().get(i).getId();
-                pointerCoords[numPoints] = new MotionEvent.PointerCoords();
-                pointerCoords[numPoints].x = getTouchPoints().get(i).getX();
-                pointerCoords[numPoints].y = getTouchPoints().get(i).getY();
-                ++numPoints;
-            }
-        }
-
-        if (numPoints == 0) {
-            return;
-        }
-
-        MotionEvent event = MotionEvent.obtain(mTouchPoints.get(0).getDownTime(),
-                SystemClock.uptimeMillis(), action,
-                numPoints, pointerIds, pointerCoords,
-                mTouchMetaState, 1.0f, 1.0f, 0, 0, 0, 0);
-
-        mWebView.onTouchEvent(event);
-    }
-
-    private void executeKeyEvent(int action, int keyCode) {
-        KeyEvent event = new KeyEvent(action, keyCode);
-        mWebView.onKeyDown(event.getKeyCode(), event);
-    }
-
-    /**
-     * Assumes lowercase chars, case needs to be handled by calling function.
-     */
-    private static int charToKeyCode(char c) {
-        // handle numbers
-        if (c >= '0' && c <= '9') {
-            int offset = c - '0';
-            return KeyEvent.KEYCODE_0 + offset;
-        }
-
-        // handle characters
-        if (c >= 'a' && c <= 'z') {
-            int offset = c - 'a';
-            return KeyEvent.KEYCODE_A + offset;
-        }
-
-        // handle all others
-        switch (c) {
-            case '*':
-                return KeyEvent.KEYCODE_STAR;
-
-            case '#':
-                return KeyEvent.KEYCODE_POUND;
-
-            case ',':
-                return KeyEvent.KEYCODE_COMMA;
-
-            case '.':
-                return KeyEvent.KEYCODE_PERIOD;
-
-            case '\t':
-                return KeyEvent.KEYCODE_TAB;
-
-            case ' ':
-                return KeyEvent.KEYCODE_SPACE;
-
-            case '\n':
-                return KeyEvent.KEYCODE_ENTER;
-
-            case '\b':
-            case 0x7F:
-                return KeyEvent.KEYCODE_DEL;
-
-            case '~':
-                return KeyEvent.KEYCODE_GRAVE;
-
-            case '-':
-                return KeyEvent.KEYCODE_MINUS;
-
-            case '=':
-                return KeyEvent.KEYCODE_EQUALS;
-
-            case '(':
-                return KeyEvent.KEYCODE_LEFT_BRACKET;
-
-            case ')':
-                return KeyEvent.KEYCODE_RIGHT_BRACKET;
-
-            case '\\':
-                return KeyEvent.KEYCODE_BACKSLASH;
-
-            case ';':
-                return KeyEvent.KEYCODE_SEMICOLON;
-
-            case '\'':
-                return KeyEvent.KEYCODE_APOSTROPHE;
-
-            case '/':
-                return KeyEvent.KEYCODE_SLASH;
-
-            default:
-                return c;
-        }
-    }
-
-    private static int modifierToKeyCode(String modifier) {
-        if (modifier.equals("ctrlKey")) {
-            return KeyEvent.KEYCODE_ALT_LEFT;
-        } else if (modifier.equals("shiftKey")) {
-            return KeyEvent.KEYCODE_SHIFT_LEFT;
-        } else if (modifier.equals("altKey")) {
-            return KeyEvent.KEYCODE_SYM;
-        }
-
-        return KeyEvent.KEYCODE_UNKNOWN;
-    }
-}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/FileFilter.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/FileFilter.java
deleted file mode 100644
index 5360e3d..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/FileFilter.java
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
- * Copyright (C) 2010 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.dumprendertree2;
-
-import android.util.Log;
-
-import com.android.dumprendertree2.forwarder.ForwarderManager;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.StringReader;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * A utility to filter out some files/directories from the views and tests that run.
- */
-public class FileFilter {
-    private static final String LOG_TAG = "FileFilter";
-
-    private static final String TEST_EXPECTATIONS_TXT_PATH =
-            "platform/android/test_expectations.txt";
-
-    private static final String HTTP_TESTS_PATH = "http/tests/";
-    private static final String SSL_PATH = "ssl/";
-
-    private static final String TOKEN_CRASH = "CRASH";
-    private static final String TOKEN_FAIL = "FAIL";
-    private static final String TOKEN_SLOW = "SLOW";
-
-    private final Set<String> mCrashList = new HashSet<String>();
-    private final Set<String> mFailList = new HashSet<String>();
-    private final Set<String> mSlowList = new HashSet<String>();
-
-    public FileFilter() {
-        loadTestExpectations();
-    }
-
-    private static final String trimTrailingSlashIfPresent(String path) {
-        File file = new File(path);
-        return file.getPath();
-    }
-
-    public void loadTestExpectations() {
-        URL url = null;
-        try {
-            url = new URL(ForwarderManager.getHostSchemePort(false) +
-                    "LayoutTests/" + TEST_EXPECTATIONS_TXT_PATH);
-        } catch (MalformedURLException e) {
-            assert false;
-        }
-
-        try {
-            InputStream inputStream = null;
-            BufferedReader bufferedReader = null;
-            try {
-                byte[] httpAnswer = FsUtils.readDataFromUrl(url);
-                if (httpAnswer == null) {
-                    Log.w(LOG_TAG, "loadTestExpectations(): File not found: " +
-                            TEST_EXPECTATIONS_TXT_PATH);
-                    return;
-                }
-                bufferedReader = new BufferedReader(new StringReader(
-                        new String(httpAnswer)));
-                String line;
-                String entry;
-                String[] parts;
-                String path;
-                Set<String> tokens;
-                while (true) {
-                    line = bufferedReader.readLine();
-                    if (line == null) {
-                        break;
-                    }
-
-                    /** Remove the comment and trim */
-                    entry = line.split("//", 2)[0].trim();
-
-                    /** Omit empty lines, advance to next line */
-                    if (entry.isEmpty()) {
-                        continue;
-                    }
-
-                    /** Split on whitespace into path part and the rest */
-                    parts = entry.split("\\s", 2);
-
-                    /** At this point parts.length >= 1 */
-                    if (parts.length == 1) {
-                        Log.w(LOG_TAG + "::reloadConfiguration",
-                                "There are no options specified for the test!");
-                        continue;
-                    }
-
-                    path = trimTrailingSlashIfPresent(parts[0]);
-
-                    /** Split on whitespace */
-                    tokens = new HashSet<String>(Arrays.asList(
-                            parts[1].split("\\s", 0)));
-
-                    /** Chose the right collections to add to */
-                    if (tokens.contains(TOKEN_CRASH)) {
-                        mCrashList.add(path);
-
-                        /** If test is on skip list we ignore any further options */
-                        continue;
-                    }
-
-                    if (tokens.contains(TOKEN_FAIL)) {
-                        mFailList.add(path);
-                    }
-                    if (tokens.contains(TOKEN_SLOW)) {
-                        mSlowList.add(path);
-                    }
-                }
-            } finally {
-                if (inputStream != null) {
-                    inputStream.close();
-                }
-                if (bufferedReader != null) {
-                    bufferedReader.close();
-                }
-            }
-        } catch (IOException e) {
-            Log.e(LOG_TAG, "url=" + url, e);
-        }
-    }
-
-    /**
-     * Checks if test is expected to crash.
-     *
-     * <p>
-     * Path given should relative within LayoutTests folder, e.g. fast/dom/foo.html
-     *
-     * @param testPath
-     *            - a relative path within LayoutTests folder
-     * @return if the test is supposed to be skipped
-     */
-    public boolean isCrash(String testPath) {
-        for (String prefix : getPrefixes(testPath)) {
-            if (mCrashList.contains(prefix)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Checks if test result is supposed to be "failed".
-     *
-     * <p>
-     * Path given should relative within LayoutTests folder, e.g. fast/dom/foo.html
-     *
-     * @param testPath
-     *            - a relative path within LayoutTests folder
-     * @return if the test result is supposed to be "failed"
-     */
-    public boolean isFail(String testPath) {
-        for (String prefix : getPrefixes(testPath)) {
-            if (mFailList.contains(prefix)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Checks if test is slow and should have timeout increased.
-     *
-     * <p>
-     * Path given should relative within LayoutTests folder, e.g. fast/dom/foo.html
-     *
-     * @param testPath
-     *            - a relative path within LayoutTests folder
-     * @return if the test is slow and should have timeout increased.
-     */
-    public boolean isSlow(String testPath) {
-        for (String prefix : getPrefixes(testPath)) {
-            if (mSlowList.contains(prefix)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns the list of all path prefixes of the given path.
-     *
-     * <p>
-     * e.g. this/is/a/path returns the list: this this/is this/is/a this/is/a/path
-     *
-     * @param path
-     * @return the list of all path prefixes of the given path.
-     */
-    private static List<String> getPrefixes(String path) {
-        File file = new File(path);
-        List<String> prefixes = new ArrayList<String>(8);
-
-        do {
-            prefixes.add(file.getPath());
-            file = file.getParentFile();
-        } while (file != null);
-
-        return prefixes;
-    }
-
-    /**
-     * Checks if the directory may contain tests or contains just helper files.
-     *
-     * @param dirName
-     * @return
-     *      if the directory may contain tests
-     */
-    public static boolean isTestDir(String dirName) {
-        return (!dirName.equals("script-tests")
-                && !dirName.equals("resources") && !dirName.startsWith("."));
-    }
-
-    /**
-     * Checks if the file is a test.
-     * Currently we run .html, .xhtml and .php tests.
-     *
-     * @warning You MUST also call isTestDir() on the parent directory before
-     * assuming that a file is a test.
-     *
-     * @param testName
-     * @return if the file is a test
-     */
-    public static boolean isTestFile(String testName) {
-        return testName.endsWith(".html")
-            || testName.endsWith(".xhtml")
-            || testName.endsWith(".php");
-    }
-
-    /**
-     * Return a URL of the test on the server.
-     *
-     * @param relativePath
-     * @param allowHttps Whether to allow the use of HTTPS, even if the file is in the SSL
-     *     directory.
-     * @return a URL of the test on the server
-     */
-    public static URL getUrl(String relativePath, boolean allowHttps) {
-        String urlBase = ForwarderManager.getHostSchemePort(false);
-
-        /**
-         * URL is formed differently for HTTP vs non-HTTP tests, because HTTP tests
-         * expect different document root. See run_apache2.py and .conf file for details
-         */
-        if (relativePath.startsWith(HTTP_TESTS_PATH)) {
-            relativePath = relativePath.substring(HTTP_TESTS_PATH.length());
-            if (relativePath.startsWith(SSL_PATH) && allowHttps) {
-                urlBase = ForwarderManager.getHostSchemePort(true);
-            }
-        } else {
-            relativePath = "LayoutTests/" + relativePath;
-        }
-
-        try {
-            return new URL(urlBase + relativePath);
-        } catch (MalformedURLException e) {
-            Log.e(LOG_TAG, "Malformed URL!", e);
-        }
-
-        return null;
-    }
-
-    /**
-     * If the path contains extension (e.g .foo at the end of the file) then it changes
-     * this (.foo) into newEnding (so it has to contain the dot if we want to preserve it).
-     *
-     * <p>If the path doesn't contain an extension, it adds the ending to the path.
-     *
-     * @param relativePath
-     * @param newEnding
-     * @return
-     *      a new path, containing the newExtension
-     */
-    public static String setPathEnding(String relativePath, String newEnding) {
-        int dotPos = relativePath.lastIndexOf('.');
-        if (dotPos == -1) {
-            return relativePath + newEnding;
-        }
-
-        return relativePath.substring(0, dotPos) + newEnding;
-    }
-}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/FsUtils.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/FsUtils.java
deleted file mode 100644
index 54cbfda..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/FsUtils.java
+++ /dev/null
@@ -1,314 +0,0 @@
-/*
- * Copyright (C) 2010 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.dumprendertree2;
-
-import android.util.Log;
-
-import com.android.dumprendertree2.forwarder.ForwarderManager;
-
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.ResponseHandler;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.conn.ClientConnectionManager;
-import org.apache.http.conn.scheme.PlainSocketFactory;
-import org.apache.http.conn.scheme.Scheme;
-import org.apache.http.conn.scheme.SchemeRegistry;
-import org.apache.http.conn.ssl.SSLSocketFactory;
-import org.apache.http.impl.client.DefaultHttpClient;
-import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
-import org.apache.http.params.BasicHttpParams;
-import org.apache.http.params.HttpConnectionParams;
-import org.apache.http.params.HttpParams;
-import org.apache.http.util.EntityUtils;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.net.MalformedURLException;
-import java.net.SocketTimeoutException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- *
- */
-public class FsUtils {
-    public static final String LOG_TAG = "FsUtils";
-
-    private static final String SCRIPT_URL = ForwarderManager.getHostSchemePort(false) +
-            "Tools/DumpRenderTree/android/get_layout_tests_dir_contents.php";
-
-    private static final int HTTP_TIMEOUT_MS = 5000;
-
-    private static HttpClient sHttpClient;
-
-    private static HttpClient getHttpClient() {
-        if (sHttpClient == null) {
-            HttpParams params = new BasicHttpParams();
-
-            SchemeRegistry schemeRegistry = new SchemeRegistry();
-            schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(),
-                    ForwarderManager.HTTP_PORT));
-            schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(),
-                    ForwarderManager.HTTPS_PORT));
-
-            ClientConnectionManager connectionManager = new ThreadSafeClientConnManager(params,
-                    schemeRegistry);
-            sHttpClient = new DefaultHttpClient(connectionManager, params);
-            HttpConnectionParams.setSoTimeout(sHttpClient.getParams(), HTTP_TIMEOUT_MS);
-            HttpConnectionParams.setConnectionTimeout(sHttpClient.getParams(), HTTP_TIMEOUT_MS);
-        }
-        return sHttpClient;
-    }
-
-    public static void writeDataToStorage(File file, byte[] bytes, boolean append) {
-        Log.d(LOG_TAG, "writeDataToStorage(): " + file.getAbsolutePath());
-        try {
-            OutputStream outputStream = null;
-            try {
-                file.getParentFile().mkdirs();
-                file.createNewFile();
-                Log.d(LOG_TAG, "writeDataToStorage(): File created: " + file.getAbsolutePath());
-                outputStream = new FileOutputStream(file, append);
-                outputStream.write(bytes);
-            } finally {
-                if (outputStream != null) {
-                    outputStream.close();
-                }
-            }
-        } catch (IOException e) {
-            Log.e(LOG_TAG, "file.getAbsolutePath=" + file.getAbsolutePath() + " append=" + append,
-                    e);
-        }
-    }
-
-    public static byte[] readDataFromStorage(File file) {
-        if (!file.exists()) {
-            Log.d(LOG_TAG, "readDataFromStorage(): File does not exist: "
-                    + file.getAbsolutePath());
-            return null;
-        }
-
-        byte[] bytes = null;
-        try {
-            FileInputStream fis = null;
-            try {
-                fis = new FileInputStream(file);
-                bytes = new byte[(int)file.length()];
-                fis.read(bytes);
-            } finally {
-                if (fis != null) {
-                    fis.close();
-                }
-            }
-        } catch (IOException e) {
-            Log.e(LOG_TAG, "file.getAbsolutePath=" + file.getAbsolutePath(), e);
-        }
-
-        return bytes;
-    }
-
-    static class UrlDataGetter extends Thread {
-        private URL mUrl;
-        private byte[] mBytes;
-        private boolean mGetComplete;
-        public UrlDataGetter(URL url) {
-            mUrl = url;
-        }
-        public byte[] get() {
-            start();
-            synchronized(this) {
-                while (!mGetComplete) {
-                    try{
-                        wait();
-                    } catch(InterruptedException e) {
-                    }
-                }
-            }
-            return mBytes;
-        }
-        public synchronized void run() {
-            mGetComplete = false;
-            HttpGet httpRequest = new HttpGet(mUrl.toString());
-            ResponseHandler<byte[]> handler = new ResponseHandler<byte[]>() {
-                @Override
-                public byte[] handleResponse(HttpResponse response) throws IOException {
-                    if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
-                        return null;
-                    }
-                    HttpEntity entity = response.getEntity();
-                    return (entity == null ? null : EntityUtils.toByteArray(entity));
-                }
-            };
-
-            mBytes = null;
-            try {
-                /**
-                 * TODO: Not exactly sure why some requests hang indefinitely, but adding this
-                 * timeout (in static getter for http client) in loop helps.
-                 */
-                boolean timedOut;
-                do {
-                    timedOut = false;
-                    try {
-                        mBytes = getHttpClient().execute(httpRequest, handler);
-                    } catch (SocketTimeoutException e) {
-                        timedOut = true;
-                        Log.w(LOG_TAG, "Expected SocketTimeoutException: " + mUrl, e);
-                    }
-                } while (timedOut);
-            } catch (IOException e) {
-                Log.e(LOG_TAG, "url=" + mUrl, e);
-            }
-
-            mGetComplete = true;
-            notify();
-        }
-    }
-
-    public static byte[] readDataFromUrl(URL url) {
-        if (url == null) {
-            Log.w(LOG_TAG, "readDataFromUrl(): url is null!");
-            return null;
-        }
-
-        UrlDataGetter getter = new UrlDataGetter(url);
-        return getter.get();
-    }
-
-    public static List<String> getLayoutTestsDirContents(String dirRelativePath, boolean recurse,
-            boolean mode) {
-        String modeString = (mode ? "folders" : "files");
-
-        URL url = null;
-        try {
-            url = new URL(SCRIPT_URL +
-                    "?path=" + dirRelativePath +
-                    "&recurse=" + recurse +
-                    "&mode=" + modeString);
-        } catch (MalformedURLException e) {
-            Log.e(LOG_TAG, "path=" + dirRelativePath + " recurse=" + recurse + " mode=" +
-                    modeString, e);
-            return new LinkedList<String>();
-        }
-
-        HttpGet httpRequest = new HttpGet(url.toString());
-        ResponseHandler<LinkedList<String>> handler = new ResponseHandler<LinkedList<String>>() {
-            @Override
-            public LinkedList<String> handleResponse(HttpResponse response)
-                    throws IOException {
-                LinkedList<String> lines = new LinkedList<String>();
-
-                if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
-                    return lines;
-                }
-                HttpEntity entity = response.getEntity();
-                if (entity == null) {
-                    return lines;
-                }
-
-                BufferedReader reader =
-                        new BufferedReader(new InputStreamReader(entity.getContent()));
-                String line;
-                try {
-                    while ((line = reader.readLine()) != null) {
-                        lines.add(line);
-                    }
-                } finally {
-                    if (reader != null) {
-                        reader.close();
-                    }
-                }
-
-                return lines;
-            }
-        };
-
-        try {
-            return getHttpClient().execute(httpRequest, handler);
-        } catch (IOException e) {
-            Log.e(LOG_TAG, "getLayoutTestsDirContents(): HTTP GET failed for URL " + url);
-            return null;
-        }
-    }
-
-    public static void closeInputStream(InputStream inputStream) {
-        try {
-            if (inputStream != null) {
-                inputStream.close();
-            }
-        } catch (IOException e) {
-            Log.e(LOG_TAG, "Couldn't close stream!", e);
-        }
-    }
-
-    public static void closeOutputStream(OutputStream outputStream) {
-        try {
-            if (outputStream != null) {
-                outputStream.close();
-            }
-        } catch (IOException e) {
-            Log.e(LOG_TAG, "Couldn't close stream!", e);
-        }
-    }
-
-    public static List<String> loadTestListFromStorage(String path) {
-        List<String> list = new ArrayList<String>();
-        if (path != null && !path.isEmpty()) {
-            try {
-                File file = new File(path);
-                Log.d(LOG_TAG, "test list loaded from " + path);
-                BufferedReader reader = new BufferedReader(new FileReader(file));
-                String line = null;
-                while ((line = reader.readLine()) != null) {
-                    list.add(line);
-                }
-                reader.close();
-            } catch (IOException ioe) {
-                Log.e(LOG_TAG, "failed to load test list", ioe);
-            }
-        }
-        return list;
-    }
-
-    public static void saveTestListToStorage(File file, int start, List<String> testList) {
-        try {
-            BufferedWriter writer = new BufferedWriter(
-                    new FileWriter(file));
-            for (String line : testList.subList(start, testList.size())) {
-                writer.write(line + '\n');
-            }
-            writer.flush();
-            writer.close();
-        } catch (IOException e) {
-            Log.e(LOG_TAG, "failed to write test list", e);
-        }
-    }
-}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestController.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestController.java
deleted file mode 100644
index c9c35ce..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestController.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2010 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.dumprendertree2;
-
-import android.net.Uri;
-import android.util.Log;
-import android.webkit.MockGeolocation;
-import android.webkit.WebStorage;
-
-import java.io.File;
-
-/**
- * A class that is registered as JS interface for webview in LayoutTestExecutor
- */
-public class LayoutTestController {
-    private static final String LOG_TAG = "LayoutTestController";
-
-    LayoutTestsExecutor mLayoutTestsExecutor;
-
-    public LayoutTestController(LayoutTestsExecutor layoutTestsExecutor) {
-        mLayoutTestsExecutor = layoutTestsExecutor;
-    }
-
-    public void clearAllDatabases() {
-        Log.i(LOG_TAG, "clearAllDatabases() called");
-        WebStorage.getInstance().deleteAllData();
-    }
-
-    public void dumpAsText() {
-        dumpAsText(false);
-    }
-
-    public void dumpAsText(boolean enablePixelTest) {
-        mLayoutTestsExecutor.dumpAsText(enablePixelTest);
-    }
-
-    public void dumpChildFramesAsText() {
-        mLayoutTestsExecutor.dumpChildFramesAsText();
-    }
-
-    public void dumpDatabaseCallbacks() {
-        mLayoutTestsExecutor.dumpDatabaseCallbacks();
-    }
-
-    public void notifyDone() {
-        mLayoutTestsExecutor.notifyDone();
-    }
-
-    public void overridePreference(String key, boolean value) {
-        mLayoutTestsExecutor.overridePreference(key, value);
-    }
-
-    public void setAppCacheMaximumSize(long size) {
-        Log.i(LOG_TAG, "setAppCacheMaximumSize() called with: " + size);
-        android.webkit.WebStorageClassic.getInstance().setAppCacheMaximumSize(size);
-    }
-
-    public void setCanOpenWindows() {
-        mLayoutTestsExecutor.setCanOpenWindows();
-    }
-
-    public void setDatabaseQuota(long quota) {
-        /** TODO: Reset this before every test! */
-        Log.i(LOG_TAG, "setDatabaseQuota() called with: " + quota);
-        WebStorage.getInstance().setQuotaForOrigin(Uri.fromFile(new File("")).toString(),
-                quota);
-    }
-
-    public void setMockGeolocationPosition(double latitude, double longitude, double accuracy) {
-        Log.i(LOG_TAG, "setMockGeolocationPosition(): " + "latitude=" + latitude +
-                " longitude=" + longitude + " accuracy=" + accuracy);
-        mLayoutTestsExecutor.setMockGeolocationPosition(latitude, longitude, accuracy);
-    }
-
-    public void setMockGeolocationError(int code, String message) {
-        Log.i(LOG_TAG, "setMockGeolocationError(): " + "code=" + code + " message=" + message);
-        mLayoutTestsExecutor.setMockGeolocationError(code, message);
-    }
-
-    public void setGeolocationPermission(boolean allow) {
-        mLayoutTestsExecutor.setGeolocationPermission(allow);
-    }
-
-    public void setMockDeviceOrientation(boolean canProvideAlpha, double alpha,
-            boolean canProvideBeta, double beta, boolean canProvideGamma, double gamma) {
-        // Configuration is in WebKit, so stay on WebCore thread, but go via LayoutTestsExecutor
-        // as we need access to the Webview.
-        Log.i(LOG_TAG, "setMockDeviceOrientation(" + canProvideAlpha +
-                ", " + alpha + ", " + canProvideBeta + ", " + beta + ", " + canProvideGamma +
-                ", " + gamma + ")");
-        mLayoutTestsExecutor.setMockDeviceOrientation(
-                canProvideAlpha, alpha, canProvideBeta, beta, canProvideGamma, gamma);
-    }
-
-    public void setXSSAuditorEnabled(boolean flag) {
-        mLayoutTestsExecutor.setXSSAuditorEnabled(flag);
-    }
-
-    public void waitUntilDone() {
-        mLayoutTestsExecutor.waitUntilDone();
-    }
-}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java
deleted file mode 100644
index 25ac700..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java
+++ /dev/null
@@ -1,732 +0,0 @@
-/*
- * Copyright (C) 2010 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.dumprendertree2;
-
-import android.app.Activity;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.net.http.SslError;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Message;
-import android.os.Messenger;
-import android.os.PowerManager;
-import android.os.PowerManager.WakeLock;
-import android.os.Process;
-import android.os.RemoteException;
-import android.util.Log;
-import android.view.Window;
-import android.webkit.ConsoleMessage;
-import android.webkit.GeolocationPermissions;
-import android.webkit.HttpAuthHandler;
-import android.webkit.JsPromptResult;
-import android.webkit.JsResult;
-import android.webkit.SslErrorHandler;
-import android.webkit.WebChromeClient;
-import android.webkit.WebSettings;
-import android.webkit.WebSettingsClassic;
-import android.webkit.WebStorage;
-import android.webkit.WebStorage.QuotaUpdater;
-import android.webkit.WebView;
-import android.webkit.WebViewClassic;
-import android.webkit.WebViewClient;
-
-import java.lang.Thread.UncaughtExceptionHandler;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-/**
- * This activity executes the test. It contains WebView and logic of LayoutTestController
- * functions. It runs in a separate process and sends the results of running the test
- * to ManagerService. The reason why is to handle crashing (test that crashes brings down
- * whole process with it).
- */
-public class LayoutTestsExecutor extends Activity {
-
-    private enum CurrentState {
-        IDLE,
-        RENDERING_PAGE,
-        WAITING_FOR_ASYNCHRONOUS_TEST,
-        OBTAINING_RESULT;
-
-        public boolean isRunningState() {
-            return this == CurrentState.RENDERING_PAGE ||
-                    this == CurrentState.WAITING_FOR_ASYNCHRONOUS_TEST;
-        }
-    }
-
-    private static final String LOG_TAG = "LayoutTestsExecutor";
-
-    public static final String EXTRA_TESTS_FILE = "TestsList";
-    public static final String EXTRA_TEST_INDEX = "TestIndex";
-
-    private static final int MSG_ACTUAL_RESULT_OBTAINED = 0;
-    private static final int MSG_TEST_TIMED_OUT = 1;
-
-    private static final int DEFAULT_TIME_OUT_MS = 15 * 1000;
-
-    /** A list of tests that remain to run since last crash */
-    private List<String> mTestsList;
-
-    /**
-     * This is a number of currently running test. It is 0-based and doesn't reset after
-     * the crash. Initial index is passed to LayoutTestsExecuter in the intent that starts
-     * it.
-     */
-    private int mCurrentTestIndex;
-
-    /** The total number of tests to run, doesn't reset after crash */
-    private int mTotalTestCount;
-
-    private WebView mCurrentWebView;
-    private String mCurrentTestRelativePath;
-    private String mCurrentTestUri;
-    private CurrentState mCurrentState = CurrentState.IDLE;
-
-    private boolean mCurrentTestTimedOut;
-    private AbstractResult mCurrentResult;
-    private AdditionalTextOutput mCurrentAdditionalTextOutput;
-
-    private LayoutTestController mLayoutTestController = new LayoutTestController(this);
-    private boolean mCanOpenWindows;
-    private boolean mDumpDatabaseCallbacks;
-
-    private EventSender mEventSender = new EventSender();
-
-    private WakeLock mScreenDimLock;
-
-    /** COMMUNICATION WITH ManagerService */
-
-    private Messenger mManagerServiceMessenger;
-
-    private ServiceConnection mServiceConnection = new ServiceConnection() {
-
-        @Override
-        public void onServiceConnected(ComponentName name, IBinder service) {
-            mManagerServiceMessenger = new Messenger(service);
-            startTests();
-        }
-
-        @Override
-        public void onServiceDisconnected(ComponentName name) {
-            /** TODO */
-        }
-    };
-
-    private final Handler mResultHandler = new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-                case MSG_ACTUAL_RESULT_OBTAINED:
-                    onActualResultsObtained();
-                    break;
-
-                case MSG_TEST_TIMED_OUT:
-                    onTestTimedOut();
-                    break;
-
-                default:
-                    break;
-            }
-        }
-    };
-
-    /** WEBVIEW CONFIGURATION */
-
-    private WebViewClient mWebViewClient = new WebViewClient() {
-        @Override
-        public void onPageFinished(WebView view, String url) {
-            /** Some tests fire up many page loads, we don't want to detect them */
-            if (!url.equals(mCurrentTestUri)) {
-                return;
-            }
-
-            if (mCurrentState == CurrentState.RENDERING_PAGE) {
-                onTestFinished();
-            }
-        }
-
-         @Override
-         public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler,
-                 String host, String realm) {
-             if (handler.useHttpAuthUsernamePassword() && view != null) {
-                 String[] credentials = view.getHttpAuthUsernamePassword(host, realm);
-                 if (credentials != null && credentials.length == 2) {
-                     handler.proceed(credentials[0], credentials[1]);
-                     return;
-                 }
-             }
-             handler.cancel();
-         }
-
-         @Override
-         public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
-             // We ignore SSL errors. In particular, the certificate used by the LayoutTests server
-             // produces an error as it lacks a CN field.
-             handler.proceed();
-         }
-    };
-
-    private WebChromeClient mWebChromeClient = new WebChromeClient() {
-        @Override
-        public void onExceededDatabaseQuota(String url, String databaseIdentifier,
-                long currentQuota, long estimatedSize, long totalUsedQuota,
-                QuotaUpdater quotaUpdater) {
-            /** TODO: This should be recorded as part of the text result */
-            /** TODO: The quota should also probably be reset somehow for every test? */
-            if (mDumpDatabaseCallbacks) {
-                getCurrentAdditionalTextOutput().appendExceededDbQuotaMessage(url,
-                        databaseIdentifier);
-            }
-            quotaUpdater.updateQuota(currentQuota + 5 * 1024 * 1024);
-        }
-
-        @Override
-        public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
-            getCurrentAdditionalTextOutput().appendJsAlert(message);
-            result.confirm();
-            return true;
-        }
-
-        @Override
-        public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
-            getCurrentAdditionalTextOutput().appendJsConfirm(message);
-            result.confirm();
-            return true;
-        }
-
-        @Override
-        public boolean onJsPrompt(WebView view, String url, String message, String defaultValue,
-                JsPromptResult result) {
-            getCurrentAdditionalTextOutput().appendJsPrompt(message, defaultValue);
-            result.confirm();
-            return true;
-        }
-
-        @Override
-        public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
-            getCurrentAdditionalTextOutput().appendConsoleMessage(consoleMessage);
-            return true;
-        }
-
-        @Override
-        public boolean onCreateWindow(WebView view, boolean dialog, boolean userGesture,
-                Message resultMsg) {
-            WebView.WebViewTransport transport = (WebView.WebViewTransport)resultMsg.obj;
-            /** By default windows cannot be opened, so just send null back. */
-            WebView newWindowWebView = null;
-
-            if (mCanOpenWindows) {
-                /**
-                 * We never display the new window, just create the view and allow it's content to
-                 * execute and be recorded by the executor.
-                 */
-                newWindowWebView = createWebViewWithJavascriptInterfaces();
-                setupWebView(newWindowWebView);
-            }
-
-            transport.setWebView(newWindowWebView);
-            resultMsg.sendToTarget();
-            return true;
-        }
-
-        @Override
-        public void onGeolocationPermissionsShowPrompt(String origin,
-                GeolocationPermissions.Callback callback) {
-            throw new RuntimeException(
-                    "The WebCore mock used by DRT should bypass the usual permissions flow.");
-        }
-    };
-
-    /** IMPLEMENTATION */
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        /**
-         * It detects the crash by catching all the uncaught exceptions. However, we
-         * still have to kill the process, because after catching the exception the
-         * activity remains in a strange state, where intents don't revive it.
-         * However, we send the message to the service to speed up the rebooting
-         * (we don't have to wait for time-out to kick in).
-         */
-        Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
-            @Override
-            public void uncaughtException(Thread thread, Throwable e) {
-                Log.w(LOG_TAG,
-                        "onTestCrashed(): " + mCurrentTestRelativePath + " thread=" + thread, e);
-
-                try {
-                    Message serviceMsg =
-                            Message.obtain(null, ManagerService.MSG_CURRENT_TEST_CRASHED);
-
-                    mManagerServiceMessenger.send(serviceMsg);
-                } catch (RemoteException e2) {
-                    Log.e(LOG_TAG, "mCurrentTestRelativePath=" + mCurrentTestRelativePath, e2);
-                }
-
-                Process.killProcess(Process.myPid());
-            }
-        });
-
-        requestWindowFeature(Window.FEATURE_PROGRESS);
-
-        Intent intent = getIntent();
-        mTestsList = FsUtils.loadTestListFromStorage(intent.getStringExtra(EXTRA_TESTS_FILE));
-        mCurrentTestIndex = intent.getIntExtra(EXTRA_TEST_INDEX, -1);
-        mTotalTestCount = mCurrentTestIndex + mTestsList.size();
-
-        PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
-        mScreenDimLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK
-                | PowerManager.ON_AFTER_RELEASE, "WakeLock in LayoutTester");
-        mScreenDimLock.acquire();
-
-        bindService(new Intent(this, ManagerService.class), mServiceConnection,
-                Context.BIND_AUTO_CREATE);
-    }
-
-    private void reset() {
-        WebView previousWebView = mCurrentWebView;
-
-        resetLayoutTestController();
-
-        mCurrentTestTimedOut = false;
-        mCurrentResult = null;
-        mCurrentAdditionalTextOutput = null;
-
-        mCurrentWebView = createWebViewWithJavascriptInterfaces();
-        // When we create the first WebView, we need to pause to wait for the WebView thread to spin
-        // and up and for it to register its message handlers.
-        if (previousWebView == null) {
-            try {
-                Thread.currentThread().sleep(1000);
-            } catch (Exception e) {}
-        }
-        setupWebView(mCurrentWebView);
-
-        mEventSender.reset(mCurrentWebView);
-
-        setContentView(mCurrentWebView);
-        if (previousWebView != null) {
-            Log.d(LOG_TAG + "::reset", "previousWebView != null");
-            previousWebView.destroy();
-        }
-    }
-
-    private static class WebViewWithJavascriptInterfaces extends WebView {
-        public WebViewWithJavascriptInterfaces(
-                Context context, Map<String, Object> javascriptInterfaces) {
-            super(context,
-                  null, // attribute set
-                  0, // default style resource ID
-                  javascriptInterfaces,
-                  false); // is private browsing
-        }
-    }
-    private WebView createWebViewWithJavascriptInterfaces() {
-        Map<String, Object> javascriptInterfaces = new HashMap<String, Object>();
-        javascriptInterfaces.put("layoutTestController", mLayoutTestController);
-        javascriptInterfaces.put("eventSender", mEventSender);
-        return new WebViewWithJavascriptInterfaces(this, javascriptInterfaces);
-    }
-
-    private void setupWebView(WebView webView) {
-        webView.setWebViewClient(mWebViewClient);
-        webView.setWebChromeClient(mWebChromeClient);
-
-        /**
-         * Setting a touch interval of -1 effectively disables the optimisation in WebView
-         * that stops repeated touch events flooding WebCore. The Event Sender only sends a
-         * single event rather than a stream of events (like what would generally happen in
-         * a real use of touch events in a WebView)  and so if the WebView drops the event,
-         * the test will fail as the test expects one callback for every touch it synthesizes.
-         */
-        WebViewClassic webViewClassic = WebViewClassic.fromWebView(webView);
-        webViewClassic.setTouchInterval(-1);
-
-        webViewClassic.clearCache(true);
-
-        WebSettingsClassic webViewSettings = webViewClassic.getSettings();
-        webViewSettings.setAppCacheEnabled(true);
-        webViewSettings.setAppCachePath(getApplicationContext().getCacheDir().getPath());
-        // Use of larger values causes unexplained AppCache database corruption.
-        // TODO: Investigate what's really going on here.
-        webViewSettings.setAppCacheMaxSize(100 * 1024 * 1024);
-        webViewSettings.setJavaScriptEnabled(true);
-        webViewSettings.setJavaScriptCanOpenWindowsAutomatically(true);
-        webViewSettings.setSupportMultipleWindows(true);
-        webViewSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);
-        webViewSettings.setDatabaseEnabled(true);
-        webViewSettings.setDatabasePath(getDir("databases", 0).getAbsolutePath());
-        webViewSettings.setDomStorageEnabled(true);
-        webViewSettings.setWorkersEnabled(false);
-        webViewSettings.setXSSAuditorEnabled(false);
-        webViewSettings.setPageCacheCapacity(0);
-
-        // This is asynchronous, but it gets processed by WebCore before it starts loading pages.
-        WebViewClassic.fromWebView(mCurrentWebView).setUseMockGeolocation();
-        WebViewClassic.fromWebView(mCurrentWebView).setUseMockDeviceOrientation();
-
-        // Must do this after setting the AppCache path.
-        WebStorage.getInstance().deleteAllData();
-    }
-
-    private void startTests() {
-        // This is called when the tests are started and after each crash.
-        // We only send the reset message in the former case.
-        if (mCurrentTestIndex <= 0) {
-            sendResetMessage();
-        }
-        if (mCurrentTestIndex == 0) {
-            sendFirstTestMessage();
-        }
-
-        runNextTest();
-    }
-
-    private void sendResetMessage() {
-        try {
-            Message serviceMsg = Message.obtain(null, ManagerService.MSG_RESET);
-            mManagerServiceMessenger.send(serviceMsg);
-        } catch (RemoteException e) {
-            Log.e(LOG_TAG, "Error sending message to manager service:", e);
-        }
-    }
-
-    private void sendFirstTestMessage() {
-        try {
-            Message serviceMsg = Message.obtain(null, ManagerService.MSG_FIRST_TEST);
-
-            Bundle bundle = new Bundle();
-            bundle.putString("firstTest", mTestsList.get(0));
-            bundle.putInt("index", mCurrentTestIndex);
-
-            serviceMsg.setData(bundle);
-            mManagerServiceMessenger.send(serviceMsg);
-        } catch (RemoteException e) {
-            Log.e(LOG_TAG, "Error sending message to manager service:", e);
-        }
-    }
-
-    private void runNextTest() {
-        assert mCurrentState == CurrentState.IDLE : "mCurrentState = " + mCurrentState.name();
-
-        if (mTestsList.isEmpty()) {
-            onAllTestsFinished();
-            return;
-        }
-
-        mCurrentTestRelativePath = mTestsList.remove(0);
-
-        Log.i(LOG_TAG, "runNextTest(): Start: " + mCurrentTestRelativePath +
-                " (" + mCurrentTestIndex + ")");
-
-        mCurrentTestUri = FileFilter.getUrl(mCurrentTestRelativePath, true).toString();
-
-        reset();
-
-        /** Start time-out countdown and the test */
-        mCurrentState = CurrentState.RENDERING_PAGE;
-        mResultHandler.sendEmptyMessageDelayed(MSG_TEST_TIMED_OUT, DEFAULT_TIME_OUT_MS);
-        mCurrentWebView.loadUrl(mCurrentTestUri);
-    }
-
-    private void onTestTimedOut() {
-        assert mCurrentState.isRunningState() : "mCurrentState = " + mCurrentState.name();
-
-        Log.w(LOG_TAG, "onTestTimedOut(): " + mCurrentTestRelativePath);
-        mCurrentTestTimedOut = true;
-
-        /**
-         * While it is theoretically possible that the test times out because
-         * of webview becoming unresponsive, it is very unlikely. Therefore it's
-         * assumed that obtaining results (that calls various webview methods)
-         * will not itself hang.
-         */
-        obtainActualResultsFromWebView();
-    }
-
-    private void onTestFinished() {
-        assert mCurrentState.isRunningState() : "mCurrentState = " + mCurrentState.name();
-
-        Log.i(LOG_TAG, "onTestFinished(): " + mCurrentTestRelativePath);
-        mResultHandler.removeMessages(MSG_TEST_TIMED_OUT);
-        obtainActualResultsFromWebView();
-    }
-
-    private void obtainActualResultsFromWebView() {
-        /**
-         * If the result has not been set by the time the test finishes we create
-         * a default type of result.
-         */
-        if (mCurrentResult == null) {
-            /** TODO: Default type should be RenderTreeResult. We don't support it now. */
-            mCurrentResult = new TextResult(mCurrentTestRelativePath);
-        }
-
-        mCurrentState = CurrentState.OBTAINING_RESULT;
-
-        if (mCurrentTestTimedOut) {
-            mCurrentResult.setDidTimeOut();
-        }
-        mCurrentResult.obtainActualResults(mCurrentWebView,
-                mResultHandler.obtainMessage(MSG_ACTUAL_RESULT_OBTAINED));
-    }
-
-    private void onActualResultsObtained() {
-        assert mCurrentState == CurrentState.OBTAINING_RESULT
-                : "mCurrentState = " + mCurrentState.name();
-
-        Log.i(LOG_TAG, "onActualResultsObtained(): " + mCurrentTestRelativePath);
-        mCurrentState = CurrentState.IDLE;
-
-        reportResultToService();
-        mCurrentTestIndex++;
-        updateProgressBar();
-        runNextTest();
-    }
-
-    private void reportResultToService() {
-        if (mCurrentAdditionalTextOutput != null) {
-            mCurrentResult.setAdditionalTextOutputString(mCurrentAdditionalTextOutput.toString());
-        }
-
-        try {
-            Message serviceMsg =
-                    Message.obtain(null, ManagerService.MSG_PROCESS_ACTUAL_RESULTS);
-
-            Bundle bundle = mCurrentResult.getBundle();
-            bundle.putInt("testIndex", mCurrentTestIndex);
-            if (!mTestsList.isEmpty()) {
-                bundle.putString("nextTest", mTestsList.get(0));
-            }
-
-            serviceMsg.setData(bundle);
-            mManagerServiceMessenger.send(serviceMsg);
-        } catch (RemoteException e) {
-            Log.e(LOG_TAG, "mCurrentTestRelativePath=" + mCurrentTestRelativePath, e);
-        }
-    }
-
-    private void updateProgressBar() {
-        getWindow().setFeatureInt(Window.FEATURE_PROGRESS,
-                mCurrentTestIndex * Window.PROGRESS_END / mTotalTestCount);
-        setTitle(mCurrentTestIndex * 100 / mTotalTestCount + "% " +
-                "(" + mCurrentTestIndex + "/" + mTotalTestCount + ")");
-    }
-
-    private void onAllTestsFinished() {
-        mScreenDimLock.release();
-
-        try {
-            Message serviceMsg =
-                    Message.obtain(null, ManagerService.MSG_ALL_TESTS_FINISHED);
-            mManagerServiceMessenger.send(serviceMsg);
-        } catch (RemoteException e) {
-            Log.e(LOG_TAG, "mCurrentTestRelativePath=" + mCurrentTestRelativePath, e);
-        }
-
-        unbindService(mServiceConnection);
-    }
-
-    private AdditionalTextOutput getCurrentAdditionalTextOutput() {
-        if (mCurrentAdditionalTextOutput == null) {
-            mCurrentAdditionalTextOutput = new AdditionalTextOutput();
-        }
-        return mCurrentAdditionalTextOutput;
-    }
-
-    /** LAYOUT TEST CONTROLLER */
-
-    private static final int MSG_WAIT_UNTIL_DONE = 0;
-    private static final int MSG_NOTIFY_DONE = 1;
-    private static final int MSG_DUMP_AS_TEXT = 2;
-    private static final int MSG_DUMP_CHILD_FRAMES_AS_TEXT = 3;
-    private static final int MSG_SET_CAN_OPEN_WINDOWS = 4;
-    private static final int MSG_DUMP_DATABASE_CALLBACKS = 5;
-    private static final int MSG_OVERRIDE_PREFERENCE = 6;
-    private static final int MSG_SET_XSS_AUDITOR_ENABLED = 7;
-
-    /** String constants for use with layoutTestController.overridePreference() */
-    private final String WEBKIT_OFFLINE_WEB_APPLICATION_CACHE_ENABLED =
-            "WebKitOfflineWebApplicationCacheEnabled";
-    private final String WEBKIT_USES_PAGE_CACHE_PREFERENCE_KEY = "WebKitUsesPageCachePreferenceKey";
-
-    Handler mLayoutTestControllerHandler = new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-            assert mCurrentState.isRunningState() : "mCurrentState = " + mCurrentState.name();
-
-            switch (msg.what) {
-                case MSG_DUMP_AS_TEXT:
-                    if (mCurrentResult == null) {
-                        mCurrentResult = new TextResult(mCurrentTestRelativePath);
-                    }
-                    assert mCurrentResult instanceof TextResult
-                            : "mCurrentResult instanceof" + mCurrentResult.getClass().getName();
-                    break;
-
-                case MSG_DUMP_CHILD_FRAMES_AS_TEXT:
-                    /** If dumpAsText was not called we assume that the result should be text */
-                    if (mCurrentResult == null) {
-                        mCurrentResult = new TextResult(mCurrentTestRelativePath);
-                    }
-
-                    assert mCurrentResult instanceof TextResult
-                            : "mCurrentResult instanceof" + mCurrentResult.getClass().getName();
-
-                    ((TextResult)mCurrentResult).setDumpChildFramesAsText(true);
-                    break;
-
-                case MSG_DUMP_DATABASE_CALLBACKS:
-                    mDumpDatabaseCallbacks = true;
-                    break;
-
-                case MSG_NOTIFY_DONE:
-                    if (mCurrentState == CurrentState.WAITING_FOR_ASYNCHRONOUS_TEST) {
-                        onTestFinished();
-                    }
-                    break;
-
-                case MSG_OVERRIDE_PREFERENCE:
-                    /**
-                     * TODO: We should look up the correct WebView for the frame which
-                     * called the layoutTestController method. Currently, we just use the
-                     * WebView for the main frame. EventSender suffers from the same
-                     * problem.
-                     */
-                    String key = msg.getData().getString("key");
-                    boolean value = msg.getData().getBoolean("value");
-                    if (WEBKIT_OFFLINE_WEB_APPLICATION_CACHE_ENABLED.equals(key)) {
-                        WebViewClassic.fromWebView(mCurrentWebView).getSettings().
-                                setAppCacheEnabled(value);
-                    } else if (WEBKIT_USES_PAGE_CACHE_PREFERENCE_KEY.equals(key)) {
-                        // Cache the maximum possible number of pages.
-                        WebViewClassic.fromWebView(mCurrentWebView).getSettings().
-                                setPageCacheCapacity(Integer.MAX_VALUE);
-                    } else {
-                        Log.w(LOG_TAG, "LayoutTestController.overridePreference(): " +
-                              "Unsupported preference '" + key + "'");
-                    }
-                    break;
-
-                case MSG_SET_CAN_OPEN_WINDOWS:
-                    mCanOpenWindows = true;
-                    break;
-
-                case MSG_SET_XSS_AUDITOR_ENABLED:
-                    WebViewClassic.fromWebView(mCurrentWebView).getSettings().
-                            setXSSAuditorEnabled(msg.arg1 == 1);
-                    break;
-
-                case MSG_WAIT_UNTIL_DONE:
-                    mCurrentState = CurrentState.WAITING_FOR_ASYNCHRONOUS_TEST;
-                    break;
-
-                default:
-                    assert false : "msg.what=" + msg.what;
-                    break;
-            }
-        }
-    };
-
-    private void resetLayoutTestController() {
-        mCanOpenWindows = false;
-        mDumpDatabaseCallbacks = false;
-    }
-
-    public void dumpAsText(boolean enablePixelTest) {
-        Log.i(LOG_TAG, mCurrentTestRelativePath + ": dumpAsText(" + enablePixelTest + ") called");
-        /** TODO: Implement */
-        if (enablePixelTest) {
-            Log.w(LOG_TAG, "enablePixelTest not implemented, switching to false");
-        }
-        mLayoutTestControllerHandler.sendEmptyMessage(MSG_DUMP_AS_TEXT);
-    }
-
-    public void dumpChildFramesAsText() {
-        Log.i(LOG_TAG, mCurrentTestRelativePath + ": dumpChildFramesAsText() called");
-        mLayoutTestControllerHandler.sendEmptyMessage(MSG_DUMP_CHILD_FRAMES_AS_TEXT);
-    }
-
-    public void dumpDatabaseCallbacks() {
-        Log.i(LOG_TAG, mCurrentTestRelativePath + ": dumpDatabaseCallbacks() called");
-        mLayoutTestControllerHandler.sendEmptyMessage(MSG_DUMP_DATABASE_CALLBACKS);
-    }
-
-    public void notifyDone() {
-        Log.i(LOG_TAG, mCurrentTestRelativePath + ": notifyDone() called");
-        mLayoutTestControllerHandler.sendEmptyMessage(MSG_NOTIFY_DONE);
-    }
-
-    public void overridePreference(String key, boolean value) {
-        Log.i(LOG_TAG, mCurrentTestRelativePath + ": overridePreference(" + key + ", " + value +
-        ") called");
-        Message msg = mLayoutTestControllerHandler.obtainMessage(MSG_OVERRIDE_PREFERENCE);
-        msg.getData().putString("key", key);
-        msg.getData().putBoolean("value", value);
-        msg.sendToTarget();
-    }
-
-    public void setCanOpenWindows() {
-        Log.i(LOG_TAG, mCurrentTestRelativePath + ": setCanOpenWindows() called");
-        mLayoutTestControllerHandler.sendEmptyMessage(MSG_SET_CAN_OPEN_WINDOWS);
-    }
-
-    public void setMockGeolocationPosition(double latitude, double longitude, double accuracy) {
-        WebViewClassic.fromWebView(mCurrentWebView).setMockGeolocationPosition(latitude, longitude,
-                accuracy);
-    }
-
-    public void setMockGeolocationError(int code, String message) {
-        WebViewClassic.fromWebView(mCurrentWebView).setMockGeolocationError(code, message);
-    }
-
-    public void setGeolocationPermission(boolean allow) {
-        Log.i(LOG_TAG, mCurrentTestRelativePath + ": setGeolocationPermission(" + allow +
-                ") called");
-        WebViewClassic.fromWebView(mCurrentWebView).setMockGeolocationPermission(allow);
-    }
-
-    public void setMockDeviceOrientation(boolean canProvideAlpha, double alpha,
-            boolean canProvideBeta, double beta, boolean canProvideGamma, double gamma) {
-        Log.i(LOG_TAG, mCurrentTestRelativePath + ": setMockDeviceOrientation(" + canProvideAlpha +
-                ", " + alpha + ", " + canProvideBeta + ", " + beta + ", " + canProvideGamma +
-                ", " + gamma + ")");
-        WebViewClassic.fromWebView(mCurrentWebView).setMockDeviceOrientation(canProvideAlpha,
-                alpha, canProvideBeta, beta, canProvideGamma, gamma);
-    }
-
-    public void setXSSAuditorEnabled(boolean flag) {
-        Log.i(LOG_TAG, mCurrentTestRelativePath + ": setXSSAuditorEnabled(" + flag + ") called");
-        Message msg = mLayoutTestControllerHandler.obtainMessage(MSG_SET_XSS_AUDITOR_ENABLED);
-        msg.arg1 = flag ? 1 : 0;
-        msg.sendToTarget();
-    }
-
-    public void waitUntilDone() {
-        Log.i(LOG_TAG, mCurrentTestRelativePath + ": waitUntilDone() called");
-        mLayoutTestControllerHandler.sendEmptyMessage(MSG_WAIT_UNTIL_DONE);
-    }
-
-}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/ManagerService.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/ManagerService.java
deleted file mode 100644
index 4783cc7..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/ManagerService.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * Copyright (C) 2010 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.dumprendertree2;
-
-import android.app.Service;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.Environment;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Message;
-import android.os.Messenger;
-import android.util.Log;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A service that handles managing the results of tests, informing of crashes, generating
- * summaries, etc.
- */
-public class ManagerService extends Service {
-
-    private static final String LOG_TAG = "ManagerService";
-
-    private static final int MSG_CRASH_TIMEOUT_EXPIRED = 0;
-    private static final int MSG_SUMMARIZER_DONE = 1;
-
-    private static final int CRASH_TIMEOUT_MS = 20 * 1000;
-
-    /** TODO: make it a setting */
-    static final String RESULTS_ROOT_DIR_PATH =
-            Environment.getExternalStorageDirectory() + File.separator + "layout-test-results";
-
-    /** TODO: Make it a setting */
-    private static final List<String> EXPECTED_RESULT_LOCATION_RELATIVE_DIR_PREFIXES =
-            new ArrayList<String>(3);
-    {
-        EXPECTED_RESULT_LOCATION_RELATIVE_DIR_PREFIXES.add("platform" + File.separator +
-                "android-v8" + File.separator);
-        EXPECTED_RESULT_LOCATION_RELATIVE_DIR_PREFIXES.add("platform" + File.separator +
-                "android" + File.separator);
-        EXPECTED_RESULT_LOCATION_RELATIVE_DIR_PREFIXES.add("");
-    }
-
-    /** TODO: Make these settings */
-    private static final String TEXT_RESULT_EXTENSION = "txt";
-    private static final String IMAGE_RESULT_EXTENSION = "png";
-
-    static final int MSG_PROCESS_ACTUAL_RESULTS = 0;
-    static final int MSG_ALL_TESTS_FINISHED = 1;
-    static final int MSG_FIRST_TEST = 2;
-    static final int MSG_CURRENT_TEST_CRASHED = 3;
-    static final int MSG_RESET = 4;
-
-    /**
-     * This handler is purely for IPC. It is used to create mMessenger
-     * that generates a binder returned in onBind method.
-     */
-    private Handler mIncomingHandler = new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-                case MSG_RESET:
-                    mSummarizer.reset();
-                    break;
-
-                case MSG_FIRST_TEST:
-                    Bundle bundle = msg.getData();
-                    ensureNextTestSetup(bundle.getString("firstTest"), bundle.getInt("index"));
-                    break;
-
-                case MSG_PROCESS_ACTUAL_RESULTS:
-                    Log.d(LOG_TAG,"mIncomingHandler: " + msg.getData().getString("relativePath"));
-                    onActualResultsObtained(msg.getData());
-                    break;
-
-                case MSG_CURRENT_TEST_CRASHED:
-                    mInternalMessagesHandler.removeMessages(MSG_CRASH_TIMEOUT_EXPIRED);
-                    onTestCrashed();
-                    break;
-
-                case MSG_ALL_TESTS_FINISHED:
-                    /** We run it in a separate thread to avoid ANR */
-                    new Thread() {
-                        @Override
-                        public void run() {
-                            mSummarizer.setTestsRelativePath(mAllTestsRelativePath);
-                            Message msg = Message.obtain(mInternalMessagesHandler,
-                                    MSG_SUMMARIZER_DONE);
-                            mSummarizer.summarize(msg);
-                        }
-                    }.start();
-            }
-        }
-    };
-
-    private Messenger mMessenger = new Messenger(mIncomingHandler);
-
-    private Handler mInternalMessagesHandler = new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-                case MSG_CRASH_TIMEOUT_EXPIRED:
-                    onTestCrashed();
-                    break;
-
-                case MSG_SUMMARIZER_DONE:
-                    Intent intent = new Intent(ManagerService.this, TestsListActivity.class);
-                    intent.setAction(Intent.ACTION_SHUTDOWN);
-                    /** This flag is needed because we send the intent from the service */
-                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-                    startActivity(intent);
-                    break;
-            }
-        }
-    };
-
-    private Summarizer mSummarizer;
-
-    private String mCurrentlyRunningTest;
-    private int mCurrentlyRunningTestIndex;
-
-    /**
-     * These are implementation details of getExpectedResultPath() used to reduce the number
-     * of requests required to the host server.
-     */
-    private String mLastExpectedResultPathRequested;
-    private String mLastExpectedResultPathFetched;
-
-    private String mAllTestsRelativePath;
-
-    @Override
-    public void onCreate() {
-        super.onCreate();
-
-        mSummarizer = new Summarizer(RESULTS_ROOT_DIR_PATH, getApplicationContext());
-    }
-
-    @Override
-    public int onStartCommand(Intent intent, int flags, int startId) {
-        mAllTestsRelativePath = intent.getStringExtra("path");
-        assert mAllTestsRelativePath != null;
-        return START_STICKY;
-    }
-
-    @Override
-    public IBinder onBind(Intent intent) {
-        return mMessenger.getBinder();
-    }
-
-    private void onActualResultsObtained(Bundle bundle) {
-        mInternalMessagesHandler.removeMessages(MSG_CRASH_TIMEOUT_EXPIRED);
-        ensureNextTestSetup(bundle.getString("nextTest"), bundle.getInt("testIndex") + 1);
-
-        AbstractResult results =
-                AbstractResult.TestType.valueOf(bundle.getString("type")).createResult(bundle);
-
-        Log.i(LOG_TAG, "onActualResultObtained: " + results.getRelativePath());
-        handleResults(results);
-    }
-
-    private void ensureNextTestSetup(String nextTest, int index) {
-        if (nextTest == null) {
-            Log.w(LOG_TAG, "ensureNextTestSetup(): nextTest=null");
-            return;
-        }
-
-        mCurrentlyRunningTest = nextTest;
-        mCurrentlyRunningTestIndex = index;
-        mInternalMessagesHandler.sendEmptyMessageDelayed(MSG_CRASH_TIMEOUT_EXPIRED, CRASH_TIMEOUT_MS);
-    }
-
-    /**
-     * This sends an intent to TestsListActivity to restart LayoutTestsExecutor.
-     * The more detailed description of the flow is in the comment of onNewIntent
-     * method in TestsListActivity.
-     */
-    private void onTestCrashed() {
-        handleResults(new CrashedDummyResult(mCurrentlyRunningTest));
-
-        Log.w(LOG_TAG, "onTestCrashed(): " + mCurrentlyRunningTest +
-                " (" + mCurrentlyRunningTestIndex + ")");
-
-        Intent intent = new Intent(this, TestsListActivity.class);
-        intent.setAction(Intent.ACTION_REBOOT);
-        /** This flag is needed because we send the intent from the service */
-        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-        intent.putExtra("crashedTestIndex", mCurrentlyRunningTestIndex);
-        startActivity(intent);
-    }
-
-    private void handleResults(AbstractResult results) {
-        String relativePath = results.getRelativePath();
-        results.setExpectedTextResult(getExpectedTextResult(relativePath));
-        results.setExpectedTextResultPath(getExpectedTextResultPath(relativePath));
-        results.setExpectedImageResult(getExpectedImageResult(relativePath));
-        results.setExpectedImageResultPath(getExpectedImageResultPath(relativePath));
-
-        dumpActualTextResult(results);
-        dumpActualImageResult(results);
-
-        mSummarizer.appendTest(results);
-    }
-
-    private void dumpActualTextResult(AbstractResult result) {
-        String testPath = result.getRelativePath();
-        String actualTextResult = result.getActualTextResult();
-        if (actualTextResult == null) {
-            return;
-        }
-
-        String resultPath = FileFilter.setPathEnding(testPath, "-actual." + TEXT_RESULT_EXTENSION);
-        FsUtils.writeDataToStorage(new File(RESULTS_ROOT_DIR_PATH, resultPath),
-                actualTextResult.getBytes(), false);
-    }
-
-    private void dumpActualImageResult(AbstractResult result) {
-        String testPath = result.getRelativePath();
-        byte[] actualImageResult = result.getActualImageResult();
-        if (actualImageResult == null) {
-            return;
-        }
-
-        String resultPath = FileFilter.setPathEnding(testPath,
-                "-actual." + IMAGE_RESULT_EXTENSION);
-        FsUtils.writeDataToStorage(new File(RESULTS_ROOT_DIR_PATH, resultPath),
-                actualImageResult, false);
-    }
-
-    public String getExpectedTextResult(String relativePath) {
-        byte[] result = getExpectedResult(relativePath, TEXT_RESULT_EXTENSION);
-        if (result != null) {
-            return new String(result);
-        }
-        return null;
-    }
-
-    public byte[] getExpectedImageResult(String relativePath) {
-        return getExpectedResult(relativePath, IMAGE_RESULT_EXTENSION);
-    }
-
-    private byte[] getExpectedResult(String relativePath, String extension) {
-        String originalRelativePath =
-                FileFilter.setPathEnding(relativePath, "-expected." + extension);
-        mLastExpectedResultPathRequested = originalRelativePath;
-
-        byte[] bytes = null;
-        List<String> locations = EXPECTED_RESULT_LOCATION_RELATIVE_DIR_PREFIXES;
-
-        int size = EXPECTED_RESULT_LOCATION_RELATIVE_DIR_PREFIXES.size();
-        for (int i = 0; bytes == null && i < size; i++) {
-            relativePath = locations.get(i) + originalRelativePath;
-            bytes = FsUtils.readDataFromUrl(FileFilter.getUrl(relativePath, false));
-        }
-
-        mLastExpectedResultPathFetched = bytes == null ? null : relativePath;
-        return bytes;
-    }
-
-    private String getExpectedTextResultPath(String relativePath) {
-        return getExpectedResultPath(relativePath, TEXT_RESULT_EXTENSION);
-    }
-
-    private String getExpectedImageResultPath(String relativePath) {
-        return getExpectedResultPath(relativePath, IMAGE_RESULT_EXTENSION);
-    }
-
-    private String getExpectedResultPath(String relativePath, String extension) {
-        String originalRelativePath =
-            FileFilter.setPathEnding(relativePath, "-expected." + extension);
-        if (!originalRelativePath.equals(mLastExpectedResultPathRequested)) {
-            getExpectedResult(relativePath, extension);
-        }
-
-        return mLastExpectedResultPathFetched;
-    }
-}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/Summarizer.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/Summarizer.java
deleted file mode 100644
index bae8e6b..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/Summarizer.java
+++ /dev/null
@@ -1,578 +0,0 @@
-/*
- * Copyright (C) 2010 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.dumprendertree2;
-
-import android.content.Context;
-import android.content.res.AssetManager;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.database.Cursor;
-import android.os.Build;
-import android.os.Message;
-import android.util.DisplayMetrics;
-import android.util.Log;
-
-import com.android.dumprendertree2.forwarder.ForwarderManager;
-
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URL;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * A class that collects information about tests that ran and can create HTML
- * files with summaries and easy navigation.
- */
-public class Summarizer {
-
-    private static final String LOG_TAG = "Summarizer";
-
-    private static final String CSS =
-            "<style type=\"text/css\">" +
-            "* {" +
-            "       font-family: Verdana;" +
-            "       border: 0;" +
-            "       margin: 0;" +
-            "       padding: 0;}" +
-            "body {" +
-            "       margin: 10px;}" +
-            "h1 {" +
-            "       font-size: 24px;" +
-            "       margin: 4px 0 4px 0;}" +
-            "h2 {" +
-            "       font-size:18px;" +
-            "       text-transform: uppercase;" +
-            "       margin: 20px 0 3px 0;}" +
-            "h3, h3 a {" +
-            "       font-size: 14px;" +
-            "       color: black;" +
-            "       text-decoration: none;" +
-            "       margin-top: 4px;" +
-            "       margin-bottom: 2px;}" +
-            "h3 a span.path {" +
-            "       text-decoration: underline;}" +
-            "h3 span.tri {" +
-            "       text-decoration: none;" +
-            "       float: left;" +
-            "       width: 20px;}" +
-            "h3 span.sqr {" +
-            "       text-decoration: none;" +
-            "       float: left;" +
-            "       width: 20px;}" +
-            "h3 span.sqr_pass {" +
-            "       color: #8ee100;}" +
-            "h3 span.sqr_fail {" +
-            "       color: #c30000;}" +
-            "span.source {" +
-            "       display: block;" +
-            "       font-size: 10px;" +
-            "       color: #888;" +
-            "       margin-left: 20px;" +
-            "       margin-bottom: 1px;}" +
-            "span.source a {" +
-            "       font-size: 10px;" +
-            "       color: #888;}" +
-            "h3 img {" +
-            "       width: 8px;" +
-            "       margin-right: 4px;}" +
-            "div.diff {" +
-            "       margin-bottom: 25px;}" +
-            "div.diff a {" +
-            "       font-size: 12px;" +
-            "       color: #888;}" +
-            "table.visual_diff {" +
-            "       border-bottom: 0px solid;" +
-            "       border-collapse: collapse;" +
-            "       width: 100%;" +
-            "       margin-bottom: 2px;}" +
-            "table.visual_diff tr.headers td {" +
-            "       border-bottom: 1px solid;" +
-            "       border-top: 0;" +
-            "       padding-bottom: 3px;}" +
-            "table.visual_diff tr.results td {" +
-            "       border-top: 1px dashed;" +
-            "       border-right: 1px solid;" +
-            "       font-size: 15px;" +
-            "       vertical-align: top;}" +
-            "table.visual_diff tr.results td.line_count {" +
-            "       background-color:#aaa;" +
-            "       min-width:20px;" +
-            "       text-align: right;" +
-            "       border-right: 1px solid;" +
-            "       border-left: 1px solid;" +
-            "       padding: 2px 1px 2px 0px;}" +
-            "table.visual_diff tr.results td.line {" +
-            "       padding: 2px 0px 2px 4px;" +
-            "       border-right: 1px solid;" +
-            "       width: 49.8%;}" +
-            "table.visual_diff tr.footers td {" +
-            "       border-top: 1px solid;" +
-            "       border-bottom: 0;}" +
-            "table.visual_diff tr td.space {" +
-            "       border: 0;" +
-            "       width: 0.4%}" +
-            "div.space {" +
-            "       margin-top:4px;}" +
-            "span.eql {" +
-            "       background-color: #f3f3f3;}" +
-            "span.del {" +
-            "       background-color: #ff8888; }" +
-            "span.ins {" +
-            "       background-color: #88ff88; }" +
-            "table.summary {" +
-            "       border: 1px solid black;" +
-            "       margin-top: 20px;}" +
-            "table.summary td {" +
-            "       padding: 3px;}" +
-            "span.listItem {" +
-            "       font-size: 11px;" +
-            "       font-weight: normal;" +
-            "       text-transform: uppercase;" +
-            "       padding: 3px;" +
-            "       -webkit-border-radius: 4px;}" +
-            "span." + AbstractResult.ResultCode.RESULTS_DIFFER.name() + "{" +
-            "       background-color: #ccc;" +
-            "       color: black;}" +
-            "span." + AbstractResult.ResultCode.NO_EXPECTED_RESULT.name() + "{" +
-            "       background-color: #a700e4;" +
-            "       color: #fff;}" +
-            "span.timed_out {" +
-            "       background-color: #f3cb00;" +
-            "       color: black;}" +
-            "span.crashed {" +
-            "       background-color: #c30000;" +
-            "       color: #fff;}" +
-            "span.noLtc {" +
-            "       background-color: #944000;" +
-            "       color: #fff;}" +
-            "span.noEventSender {" +
-            "       background-color: #815600;" +
-            "       color: #fff;}" +
-            "</style>";
-
-    private static final String SCRIPT =
-            "<script type=\"text/javascript\">" +
-            "    function toggleDisplay(id) {" +
-            "        element = document.getElementById(id);" +
-            "        triangle = document.getElementById('tri.' + id);" +
-            "        if (element.style.display == 'none') {" +
-            "            element.style.display = 'inline';" +
-            "            triangle.innerHTML = '&#x25bc; ';" +
-            "        } else {" +
-            "            element.style.display = 'none';" +
-            "            triangle.innerHTML = '&#x25b6; ';" +
-            "        }" +
-            "    }" +
-            "</script>";
-
-    /** TODO: Make it a setting */
-    private static final String HTML_DETAILS_RELATIVE_PATH = "details.html";
-    private static final String TXT_SUMMARY_RELATIVE_PATH = "summary.txt";
-
-    private static final int RESULTS_PER_DUMP = 500;
-    private static final int RESULTS_PER_DB_ACCESS = 50;
-
-    private int mCrashedTestsCount = 0;
-    private List<AbstractResult> mUnexpectedFailures = new ArrayList<AbstractResult>();
-    private List<AbstractResult> mExpectedFailures = new ArrayList<AbstractResult>();
-    private List<AbstractResult> mExpectedPasses = new ArrayList<AbstractResult>();
-    private List<AbstractResult> mUnexpectedPasses = new ArrayList<AbstractResult>();
-
-    private Cursor mUnexpectedFailuresCursor;
-    private Cursor mExpectedFailuresCursor;
-    private Cursor mUnexpectedPassesCursor;
-    private Cursor mExpectedPassesCursor;
-
-    private FileFilter mFileFilter;
-    private String mResultsRootDirPath;
-    private String mTestsRelativePath;
-    private Date mDate;
-
-    private int mResultsSinceLastHtmlDump = 0;
-    private int mResultsSinceLastDbAccess = 0;
-
-    private SummarizerDBHelper mDbHelper;
-
-    public Summarizer(String resultsRootDirPath, Context context) {
-        mFileFilter = new FileFilter();
-        mResultsRootDirPath = resultsRootDirPath;
-
-        /**
-         * We don't run the database I/O in a separate thread to avoid consumer/producer problem
-         * and to simplify code.
-         */
-        mDbHelper = new SummarizerDBHelper(context);
-        mDbHelper.open();
-    }
-
-    public static URI getDetailsUri() {
-        return new File(ManagerService.RESULTS_ROOT_DIR_PATH + File.separator +
-                HTML_DETAILS_RELATIVE_PATH).toURI();
-    }
-
-    public void appendTest(AbstractResult result) {
-        String relativePath = result.getRelativePath();
-
-        if (result.didCrash()) {
-            mCrashedTestsCount++;
-        }
-
-        if (result.didPass()) {
-            result.clearResults();
-            if (mFileFilter.isFail(relativePath)) {
-                mUnexpectedPasses.add(result);
-            } else {
-                mExpectedPasses.add(result);
-            }
-        } else {
-            if (mFileFilter.isFail(relativePath)) {
-                mExpectedFailures.add(result);
-            } else {
-                mUnexpectedFailures.add(result);
-            }
-        }
-
-        if (++mResultsSinceLastDbAccess == RESULTS_PER_DB_ACCESS) {
-            persistLists();
-            clearLists();
-        }
-    }
-
-    private void clearLists() {
-        mUnexpectedFailures.clear();
-        mExpectedFailures.clear();
-        mUnexpectedPasses.clear();
-        mExpectedPasses.clear();
-    }
-
-    private void persistLists() {
-        persistListToTable(mUnexpectedFailures, SummarizerDBHelper.UNEXPECTED_FAILURES_TABLE);
-        persistListToTable(mExpectedFailures, SummarizerDBHelper.EXPECTED_FAILURES_TABLE);
-        persistListToTable(mUnexpectedPasses, SummarizerDBHelper.UNEXPECTED_PASSES_TABLE);
-        persistListToTable(mExpectedPasses, SummarizerDBHelper.EXPECTED_PASSES_TABLE);
-        mResultsSinceLastDbAccess = 0;
-    }
-
-    private void persistListToTable(List<AbstractResult> results, String table) {
-        for (AbstractResult abstractResult : results) {
-            mDbHelper.insertAbstractResult(abstractResult, table);
-        }
-    }
-
-    public void setTestsRelativePath(String testsRelativePath) {
-        mTestsRelativePath = testsRelativePath;
-    }
-
-    public void summarize(Message onFinishMessage) {
-        persistLists();
-        clearLists();
-
-        mUnexpectedFailuresCursor =
-            mDbHelper.getAbstractResults(SummarizerDBHelper.UNEXPECTED_FAILURES_TABLE);
-        mUnexpectedPassesCursor =
-            mDbHelper.getAbstractResults(SummarizerDBHelper.UNEXPECTED_PASSES_TABLE);
-        mExpectedFailuresCursor =
-            mDbHelper.getAbstractResults(SummarizerDBHelper.EXPECTED_FAILURES_TABLE);
-        mExpectedPassesCursor =
-            mDbHelper.getAbstractResults(SummarizerDBHelper.EXPECTED_PASSES_TABLE);
-
-        String webKitRevision = getWebKitRevision();
-        createHtmlDetails(webKitRevision);
-        createTxtSummary(webKitRevision);
-
-        clearLists();
-        mUnexpectedFailuresCursor.close();
-        mUnexpectedPassesCursor.close();
-        mExpectedFailuresCursor.close();
-        mExpectedPassesCursor.close();
-
-        onFinishMessage.sendToTarget();
-    }
-
-    public void reset() {
-        mCrashedTestsCount = 0;
-        clearLists();
-        mDbHelper.reset();
-        mDate = new Date();
-    }
-
-    private void dumpHtmlToFile(StringBuilder html, boolean append) {
-        FsUtils.writeDataToStorage(new File(mResultsRootDirPath, HTML_DETAILS_RELATIVE_PATH),
-                html.toString().getBytes(), append);
-        html.setLength(0);
-        mResultsSinceLastHtmlDump = 0;
-    }
-
-    private void createTxtSummary(String webKitRevision) {
-        StringBuilder txt = new StringBuilder();
-
-        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
-        txt.append("Path: " + mTestsRelativePath + "\n");
-        txt.append("Date: " + dateFormat.format(mDate) + "\n");
-        txt.append("Build fingerprint: " + Build.FINGERPRINT + "\n");
-        txt.append("WebKit version: " + getWebKitVersionFromUserAgentString() + "\n");
-        txt.append("WebKit revision: " + webKitRevision + "\n");
-
-        txt.append("TOTAL:                     " + getTotalTestCount() + "\n");
-        txt.append("CRASHED (among all tests): " + mCrashedTestsCount + "\n");
-        txt.append("UNEXPECTED FAILURES:       " + mUnexpectedFailuresCursor.getCount() + "\n");
-        txt.append("UNEXPECTED PASSES:         " + mUnexpectedPassesCursor.getCount() + "\n");
-        txt.append("EXPECTED FAILURES:         " + mExpectedFailuresCursor.getCount() + "\n");
-        txt.append("EXPECTED PASSES:           " + mExpectedPassesCursor.getCount() + "\n");
-
-        FsUtils.writeDataToStorage(new File(mResultsRootDirPath, TXT_SUMMARY_RELATIVE_PATH),
-                txt.toString().getBytes(), false);
-    }
-
-    private void createHtmlDetails(String webKitRevision) {
-        StringBuilder html = new StringBuilder();
-
-        html.append("<html><head>");
-        html.append(CSS);
-        html.append(SCRIPT);
-        html.append("</head><body>");
-
-        createTopSummaryTable(webKitRevision, html);
-        dumpHtmlToFile(html, false);
-
-        createResultsList(html, "Unexpected failures", mUnexpectedFailuresCursor);
-        createResultsList(html, "Unexpected passes", mUnexpectedPassesCursor);
-        createResultsList(html, "Expected failures", mExpectedFailuresCursor);
-        createResultsList(html, "Expected passes", mExpectedPassesCursor);
-
-        html.append("</body></html>");
-        dumpHtmlToFile(html, true);
-    }
-
-    private int getTotalTestCount() {
-        return mUnexpectedFailuresCursor.getCount() +
-                mUnexpectedPassesCursor.getCount() +
-                mExpectedPassesCursor.getCount() +
-                mExpectedFailuresCursor.getCount();
-    }
-
-    private String getWebKitVersionFromUserAgentString() {
-        Resources resources = new Resources(new AssetManager(), new DisplayMetrics(),
-                new Configuration());
-        String userAgent =
-                resources.getString(com.android.internal.R.string.web_user_agent);
-
-        Matcher matcher = Pattern.compile("AppleWebKit/([0-9]+?\\.[0-9])").matcher(userAgent);
-        if (matcher.find()) {
-            return matcher.group(1);
-        }
-        return "unknown";
-    }
-
-    private String getWebKitRevision() {
-        URL url = null;
-        try {
-            url = new URL(ForwarderManager.getHostSchemePort(false) + "ThirdPartyProject.prop");
-        } catch (MalformedURLException e) {
-            assert false;
-        }
-
-        String thirdPartyProjectContents = new String(FsUtils.readDataFromUrl(url));
-        Matcher matcher = Pattern.compile("^version=([0-9]+)", Pattern.MULTILINE).matcher(
-                thirdPartyProjectContents);
-        if (matcher.find()) {
-            return matcher.group(1);
-        }
-        return "unknown";
-    }
-
-    private void createTopSummaryTable(String webKitRevision, StringBuilder html) {
-        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
-        html.append("<h1>" + "Layout tests' results for: " +
-                (mTestsRelativePath.equals("") ? "all tests" : mTestsRelativePath) + "</h1>");
-        html.append("<h3>" + "Date: " + dateFormat.format(new Date()) + "</h3>");
-        html.append("<h3>" + "Build fingerprint: " + Build.FINGERPRINT + "</h3>");
-        html.append("<h3>" + "WebKit version: " + getWebKitVersionFromUserAgentString() + "</h3>");
-
-        html.append("<h3>" + "WebKit revision: ");
-        html.append("<a href=\"http://trac.webkit.org/browser/trunk?rev=" + webKitRevision +
-                "\" target=\"_blank\"><span class=\"path\">" + webKitRevision + "</span></a>");
-        html.append("</h3>");
-
-        html.append("<table class=\"summary\">");
-        createSummaryTableRow(html, "TOTAL", getTotalTestCount());
-        createSummaryTableRow(html, "CRASHED (among all tests)", mCrashedTestsCount);
-        createSummaryTableRow(html, "UNEXPECTED FAILURES", mUnexpectedFailuresCursor.getCount());
-        createSummaryTableRow(html, "UNEXPECTED PASSES", mUnexpectedPassesCursor.getCount());
-        createSummaryTableRow(html, "EXPECTED FAILURES", mExpectedFailuresCursor.getCount());
-        createSummaryTableRow(html, "EXPECTED PASSES", mExpectedPassesCursor.getCount());
-        html.append("</table>");
-    }
-
-    private void createSummaryTableRow(StringBuilder html, String caption, int size) {
-        html.append("<tr>");
-        html.append("    <td>" + caption + "</td>");
-        html.append("    <td>" + size + "</td>");
-        html.append("</tr>");
-    }
-
-    private void createResultsList(
-            StringBuilder html, String title, Cursor cursor) {
-        String relativePath;
-        String id = "";
-        AbstractResult.ResultCode resultCode;
-
-        html.append("<h2>" + title + " [" + cursor.getCount() + "]</h2>");
-
-        if (!cursor.moveToFirst()) {
-            return;
-        }
-
-        AbstractResult result;
-        do {
-            result = SummarizerDBHelper.getAbstractResult(cursor);
-
-            relativePath = result.getRelativePath();
-            resultCode = result.getResultCode();
-
-            html.append("<h3>");
-
-            /**
-             * Technically, two different paths could end up being the same, because
-             * ':' is a valid  character in a path. However, it is probably not going
-             * to cause any problems in this case
-             */
-            id = relativePath.replace(File.separator, ":");
-
-            /** Write the test name */
-            if (resultCode == AbstractResult.ResultCode.RESULTS_DIFFER) {
-                html.append("<a href=\"#\" onClick=\"toggleDisplay('" + id + "');");
-                html.append("return false;\">");
-                html.append("<span class=\"tri\" id=\"tri." + id + "\">&#x25b6; </span>");
-                html.append("<span class=\"path\">" + relativePath + "</span>");
-                html.append("</a>");
-            } else {
-                html.append("<a href=\"" + getViewSourceUrl(result.getRelativePath()).toString() + "\"");
-                html.append(" target=\"_blank\">");
-                html.append("<span class=\"sqr sqr_" + (result.didPass() ? "pass" : "fail"));
-                html.append("\">&#x25a0; </span>");
-                html.append("<span class=\"path\">" + result.getRelativePath() + "</span>");
-                html.append("</a>");
-            }
-
-            if (!result.didPass()) {
-                appendTags(html, result);
-            }
-
-            html.append("</h3>");
-            appendExpectedResultsSources(result, html);
-
-            if (resultCode == AbstractResult.ResultCode.RESULTS_DIFFER) {
-                html.append("<div class=\"diff\" style=\"display: none;\" id=\"" + id + "\">");
-                html.append(result.getDiffAsHtml());
-                html.append("<a href=\"#\" onClick=\"toggleDisplay('" + id + "');");
-                html.append("return false;\">Hide</a>");
-                html.append(" | ");
-                html.append("<a href=\"" + getViewSourceUrl(relativePath).toString() + "\"");
-                html.append(" target=\"_blank\">Show source</a>");
-                html.append("</div>");
-            }
-
-            html.append("<div class=\"space\"></div>");
-
-            if (++mResultsSinceLastHtmlDump == RESULTS_PER_DUMP) {
-                dumpHtmlToFile(html, true);
-            }
-
-            cursor.moveToNext();
-        } while (!cursor.isAfterLast());
-    }
-
-    private void appendTags(StringBuilder html, AbstractResult result) {
-        /** Tag tests which crash, time out or where results don't match */
-        if (result.didCrash()) {
-            html.append(" <span class=\"listItem crashed\">Crashed</span>");
-        } else {
-            if (result.didTimeOut()) {
-                html.append(" <span class=\"listItem timed_out\">Timed out</span>");
-            }
-            AbstractResult.ResultCode resultCode = result.getResultCode();
-            if (resultCode != AbstractResult.ResultCode.RESULTS_MATCH) {
-                html.append(" <span class=\"listItem " + resultCode.name() + "\">");
-                html.append(resultCode.toString());
-                html.append("</span>");
-            }
-        }
-
-        /** Detect missing LTC function */
-        String additionalTextOutputString = result.getAdditionalTextOutputString();
-        if (additionalTextOutputString != null &&
-                additionalTextOutputString.contains("com.android.dumprendertree") &&
-                additionalTextOutputString.contains("has no method")) {
-            if (additionalTextOutputString.contains("LayoutTestController")) {
-                html.append(" <span class=\"listItem noLtc\">LTC function missing</span>");
-            }
-            if (additionalTextOutputString.contains("EventSender")) {
-                html.append(" <span class=\"listItem noEventSender\">");
-                html.append("ES function missing</span>");
-            }
-        }
-    }
-
-    private static final void appendExpectedResultsSources(AbstractResult result,
-            StringBuilder html) {
-        String textSource = result.getExpectedTextResultPath();
-        String imageSource = result.getExpectedImageResultPath();
-
-        if (result.didCrash()) {
-            html.append("<span class=\"source\">Did not look for expected results</span>");
-            return;
-        }
-
-        if (textSource == null) {
-            // Show if a text result is missing. We may want to revisit this decision when we add
-            // support for image results.
-            html.append("<span class=\"source\">Expected textual result missing</span>");
-        } else {
-            html.append("<span class=\"source\">Expected textual result from: ");
-            html.append("<a href=\"" + ForwarderManager.getHostSchemePort(false) + "LayoutTests/" +
-                    textSource + "\"");
-            html.append(" target=\"_blank\">");
-            html.append(textSource + "</a></span>");
-        }
-        if (imageSource != null) {
-            html.append("<span class=\"source\">Expected image result from: ");
-            html.append("<a href=\"" + ForwarderManager.getHostSchemePort(false) + "LayoutTests/" +
-                    imageSource + "\"");
-            html.append(" target=\"_blank\">");
-            html.append(imageSource + "</a></span>");
-        }
-    }
-
-    private static final URL getViewSourceUrl(String relativePath) {
-        URL url = null;
-        try {
-            url = new URL("http", "localhost", ForwarderManager.HTTP_PORT,
-                    "/Tools/DumpRenderTree/android/view_source.php?src=" +
-                    relativePath);
-        } catch (MalformedURLException e) {
-            assert false : "relativePath=" + relativePath;
-        }
-        return url;
-    }
-}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/SummarizerDBHelper.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/SummarizerDBHelper.java
deleted file mode 100644
index 23e13ec..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/SummarizerDBHelper.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (C) 2010 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.dumprendertree2;
-
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.Cursor;
-import android.database.SQLException;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteOpenHelper;
-
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * A basic class that wraps database accesses inside itself and provides functionality to
- * store and retrieve AbstractResults.
- */
-public class SummarizerDBHelper {
-    private static final String KEY_ID = "id";
-    private static final String KEY_PATH = "path";
-    private static final String KEY_BYTES = "bytes";
-
-    private static final String DATABASE_NAME = "SummarizerDB";
-    private static final int DATABASE_VERSION = 1;
-
-    static final String EXPECTED_FAILURES_TABLE = "expectedFailures";
-    static final String UNEXPECTED_FAILURES_TABLE = "unexpectedFailures";
-    static final String EXPECTED_PASSES_TABLE = "expextedPasses";
-    static final String UNEXPECTED_PASSES_TABLE = "unexpextedPasses";
-    private static final Set<String> TABLES_NAMES = new HashSet<String>();
-    {
-        TABLES_NAMES.add(EXPECTED_FAILURES_TABLE);
-        TABLES_NAMES.add(EXPECTED_PASSES_TABLE);
-        TABLES_NAMES.add(UNEXPECTED_FAILURES_TABLE);
-        TABLES_NAMES.add(UNEXPECTED_PASSES_TABLE);
-    }
-
-    private static final void createTables(SQLiteDatabase db) {
-        String cmd;
-        for (String tableName : TABLES_NAMES) {
-            cmd = "create table " + tableName + " ("
-                    + KEY_ID + " integer primary key autoincrement, "
-                    + KEY_PATH + " text not null, "
-                    + KEY_BYTES + " blob not null);";
-            db.execSQL(cmd);
-        }
-    }
-
-    private static final void dropTables(SQLiteDatabase db) {
-        for (String tableName : TABLES_NAMES) {
-            db.execSQL("DROP TABLE IF EXISTS " + tableName);
-        }
-    }
-
-    private static class DatabaseHelper extends SQLiteOpenHelper {
-        DatabaseHelper(Context context) {
-            super(context, DATABASE_NAME, null, DATABASE_VERSION);
-        }
-
-        @Override
-        public void onCreate(SQLiteDatabase db) {
-            dropTables(db);
-            createTables(db);
-        }
-
-        @Override
-        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
-            /** NOOP for now, because we will never upgrade the db */
-        }
-
-        public void reset(SQLiteDatabase db) {
-            dropTables(db);
-            createTables(db);
-        }
-    }
-
-    private DatabaseHelper mDbHelper;
-    private SQLiteDatabase mDb;
-
-    private final Context mContext;
-
-    public SummarizerDBHelper(Context ctx) {
-        mContext = ctx;
-        mDbHelper = new DatabaseHelper(mContext);
-    }
-
-    public void reset() {
-        mDbHelper.reset(this.mDb);
-    }
-
-    public void open() throws SQLException {
-        mDb = mDbHelper.getWritableDatabase();
-    }
-
-    public void close() {
-        mDbHelper.close();
-    }
-
-    public void insertAbstractResult(AbstractResult result, String table) {
-        ContentValues cv = new ContentValues();
-        cv.put(KEY_PATH, result.getRelativePath());
-        cv.put(KEY_BYTES, result.getBytes());
-        mDb.insert(table, null, cv);
-    }
-
-    public Cursor getAbstractResults(String table) throws SQLException {
-        return mDb.query(false, table, new String[] {KEY_BYTES}, null, null, null, null,
-                KEY_PATH + " ASC", null);
-    }
-
-    public static AbstractResult getAbstractResult(Cursor cursor) {
-        return AbstractResult.create(cursor.getBlob(cursor.getColumnIndex(KEY_BYTES)));
-    }
-}
\ No newline at end of file
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/TestsListActivity.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/TestsListActivity.java
deleted file mode 100644
index e374c1b..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/TestsListActivity.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Copyright (C) 2010 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.dumprendertree2;
-
-import com.android.dumprendertree2.scriptsupport.OnEverythingFinishedCallback;
-
-import android.app.Activity;
-import android.app.ProgressDialog;
-import android.content.Intent;
-import android.content.res.Configuration;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.view.Gravity;
-import android.view.Window;
-import android.webkit.WebView;
-import android.widget.Toast;
-
-import java.io.File;
-import java.util.ArrayList;
-
-/**
- * An Activity that generates a list of tests and sends the intent to
- * LayoutTestsExecuter to run them. It also restarts the LayoutTestsExecuter
- * after it crashes.
- */
-public class TestsListActivity extends Activity {
-
-    private static final int MSG_TEST_LIST_PRELOADER_DONE = 0;
-
-    /** Constants for adding extras to an intent */
-    public static final String EXTRA_TEST_PATH = "TestPath";
-
-    private static ProgressDialog sProgressDialog;
-
-    private Handler mHandler = new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-                case MSG_TEST_LIST_PRELOADER_DONE:
-                    sProgressDialog.dismiss();
-                    mTestsList = (ArrayList<String>)msg.obj;
-                    mTotalTestCount = mTestsList.size();
-                    restartExecutor(0);
-                    break;
-            }
-        }
-    };
-
-    private ArrayList<String> mTestsList;
-    private int mTotalTestCount;
-
-    private OnEverythingFinishedCallback mOnEverythingFinishedCallback;
-    private boolean mEverythingFinished;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        /** Prepare the progress dialog */
-        sProgressDialog = new ProgressDialog(TestsListActivity.this);
-        sProgressDialog.setCancelable(false);
-        sProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
-        sProgressDialog.setTitle(R.string.dialog_progress_title);
-        sProgressDialog.setMessage(getText(R.string.dialog_progress_msg));
-
-        requestWindowFeature(Window.FEATURE_PROGRESS);
-
-        Intent intent = getIntent();
-        if (!intent.getAction().equals(Intent.ACTION_RUN)) {
-            return;
-        }
-        String path = intent.getStringExtra(EXTRA_TEST_PATH);
-
-        sProgressDialog.show();
-        Message doneMsg = Message.obtain(mHandler, MSG_TEST_LIST_PRELOADER_DONE);
-
-        Intent serviceIntent = new Intent(this, ManagerService.class);
-        serviceIntent.putExtra("path", path);
-        startService(serviceIntent);
-
-        new TestsListPreloaderThread(path, doneMsg).start();
-    }
-
-    @Override
-    protected void onNewIntent(Intent intent) {
-        if (intent.getAction().equals(Intent.ACTION_REBOOT)) {
-            onCrashIntent(intent);
-        } else if (intent.getAction().equals(Intent.ACTION_SHUTDOWN)) {
-            onEverythingFinishedIntent(intent);
-        }
-    }
-
-    /**
-     * This method handles an intent that comes from ManageService when crash is detected.
-     * The intent contains an index in mTestsList of the test that crashed. TestsListActivity
-     * restarts the LayoutTestsExecutor from the following test in mTestsList, by sending
-     * an intent to it. This new intent contains a list of remaining tests to run,
-     * total count of all tests, and the index of the first test to run after restarting.
-     * LayoutTestExecutor runs then as usual, sending reports to ManagerService. If it
-     * detects the crash it sends a new intent and the flow repeats.
-     */
-    private void onCrashIntent(Intent intent) {
-        int nextTestToRun = intent.getIntExtra("crashedTestIndex", -1) + 1;
-        if (nextTestToRun > 0 && nextTestToRun <= mTotalTestCount) {
-            restartExecutor(nextTestToRun);
-        }
-    }
-
-    public void registerOnEverythingFinishedCallback(OnEverythingFinishedCallback callback) {
-        mOnEverythingFinishedCallback = callback;
-        if (mEverythingFinished) {
-            mOnEverythingFinishedCallback.onFinished();
-        }
-    }
-
-    private void onEverythingFinishedIntent(Intent intent) {
-        Toast toast = Toast.makeText(this,
-                "All tests finished.\nPress back key to return to the tests' list.",
-                Toast.LENGTH_LONG);
-        toast.setGravity(Gravity.CENTER, -40, 0);
-        toast.show();
-
-        /** Show the details to the user */
-        WebView webView = new WebView(this);
-        webView.getSettings().setJavaScriptEnabled(true);
-        webView.getSettings().setBuiltInZoomControls(true);
-        webView.getSettings().setEnableSmoothTransition(true);
-        /** This enables double-tap to zoom */
-        webView.getSettings().setUseWideViewPort(true);
-
-        setContentView(webView);
-        webView.loadUrl(Summarizer.getDetailsUri().toString());
-
-        mEverythingFinished = true;
-        if (mOnEverythingFinishedCallback != null) {
-            mOnEverythingFinishedCallback.onFinished();
-        }
-    }
-
-    /**
-     * This, together with android:configChanges="orientation" in manifest file, prevents
-     * the activity from restarting on orientation change.
-     */
-    @Override
-    public void onConfigurationChanged(Configuration newConfig) {
-        super.onConfigurationChanged(newConfig);
-    }
-
-    @Override
-    protected void onSaveInstanceState(Bundle outState) {
-        outState.putStringArrayList("testsList", mTestsList);
-        outState.putInt("totalCount", mTotalTestCount);
-
-        super.onSaveInstanceState(outState);
-    }
-
-    @Override
-    protected void onRestoreInstanceState(Bundle savedInstanceState) {
-        super.onRestoreInstanceState(savedInstanceState);
-
-        mTestsList = savedInstanceState.getStringArrayList("testsList");
-        mTotalTestCount = savedInstanceState.getInt("totalCount");
-    }
-
-    /**
-     * (Re)starts the executer activity from the given test number (inclusive, 0-based).
-     * This number is an index in mTestsList, not the sublist passed in the intent.
-     *
-     * @param startFrom
-     *      test index in mTestsList to start the tests from (inclusive, 0-based)
-     */
-    private void restartExecutor(int startFrom) {
-        Intent intent = new Intent();
-        intent.setClass(this, LayoutTestsExecutor.class);
-        intent.setAction(Intent.ACTION_RUN);
-
-        if (startFrom < mTotalTestCount) {
-            File testListFile = new File(getExternalFilesDir(null), "test_list.txt");
-            FsUtils.saveTestListToStorage(testListFile, startFrom, mTestsList);
-            intent.putExtra(LayoutTestsExecutor.EXTRA_TESTS_FILE, testListFile.getAbsolutePath());
-            intent.putExtra(LayoutTestsExecutor.EXTRA_TEST_INDEX, startFrom);
-        } else {
-            intent.putExtra(LayoutTestsExecutor.EXTRA_TESTS_FILE, "");
-        }
-
-        startActivity(intent);
-    }
-}
\ No newline at end of file
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/TestsListPreloaderThread.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/TestsListPreloaderThread.java
deleted file mode 100644
index ab98830..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/TestsListPreloaderThread.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (C) 2010 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.dumprendertree2;
-
-import android.os.Environment;
-import android.os.Message;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * A Thread that is responsible for generating a lists of tests to run.
- */
-public class TestsListPreloaderThread extends Thread {
-
-    private static final String LOG_TAG = "TestsListPreloaderThread";
-
-    /** A list containing relative paths of tests to run */
-    private ArrayList<String> mTestsList = new ArrayList<String>();
-
-    private FileFilter mFileFilter;
-
-    /**
-     * A relative path to the directory with the tests we want to run or particular test.
-     * Used up to and including preloadTests().
-     */
-    private String mRelativePath;
-
-    private Message mDoneMsg;
-
-    /**
-     * The given path must be relative to the root dir.
-     *
-     * @param path
-     * @param doneMsg
-     */
-    public TestsListPreloaderThread(String path, Message doneMsg) {
-        mRelativePath = path;
-        mDoneMsg = doneMsg;
-    }
-
-    @Override
-    public void run() {
-        mFileFilter = new FileFilter();
-        if (FileFilter.isTestFile(mRelativePath)) {
-            mTestsList.add(mRelativePath);
-        } else {
-            loadTestsFromUrl(mRelativePath);
-        }
-
-        mDoneMsg.obj = mTestsList;
-        mDoneMsg.sendToTarget();
-    }
-
-    /**
-     * Loads all the tests from the given directories and all the subdirectories
-     * into mTestsList.
-     *
-     * @param dirRelativePath
-     */
-    private void loadTestsFromUrl(String rootRelativePath) {
-        LinkedList<String> directoriesList = new LinkedList<String>();
-        directoriesList.add(rootRelativePath);
-
-        String relativePath;
-        String itemName;
-        while (!directoriesList.isEmpty()) {
-            relativePath = directoriesList.removeFirst();
-
-            List<String> dirRelativePaths = FsUtils.getLayoutTestsDirContents(relativePath, false, true);
-            if (dirRelativePaths != null) {
-                for (String dirRelativePath : dirRelativePaths) {
-                    itemName = new File(dirRelativePath).getName();
-                    if (FileFilter.isTestDir(itemName)) {
-                        directoriesList.add(dirRelativePath);
-                    }
-                }
-            }
-
-            List<String> testRelativePaths = FsUtils.getLayoutTestsDirContents(relativePath, false, false);
-            if (testRelativePaths != null) {
-                for (String testRelativePath : testRelativePaths) {
-                    itemName = new File(testRelativePath).getName();
-                    if (FileFilter.isTestFile(itemName)) {
-                        /** We choose to skip all the tests that are expected to crash. */
-                        if (!mFileFilter.isCrash(testRelativePath)) {
-                            mTestsList.add(testRelativePath);
-                        } else {
-                            /**
-                             * TODO: Summarizer is now in service - figure out how to send the info.
-                             * Previously: mSummarizer.addSkippedTest(relativePath);
-                             */
-                        }
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/TextResult.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/TextResult.java
deleted file mode 100644
index fd1c0ad..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/TextResult.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- * Copyright (C) 2010 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.dumprendertree2;
-
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.webkit.WebView;
-import android.webkit.WebViewClassic;
-
-import name.fraser.neil.plaintext.diff_match_patch;
-
-import java.util.LinkedList;
-
-/**
- * A result object for which the expected output is text. It does not have an image
- * expected result.
- *
- * <p>Created if layoutTestController.dumpAsText() was called.
- */
-public class TextResult extends AbstractResult {
-
-    private static final int MSG_DOCUMENT_AS_TEXT = 0;
-
-    private String mExpectedResult;
-    private String mExpectedResultPath;
-    private String mActualResult;
-    private String mRelativePath;
-    private boolean mDidTimeOut;
-    private ResultCode mResultCode;
-    transient private Message mResultObtainedMsg;
-
-    private boolean mDumpChildFramesAsText;
-
-    transient private Handler mHandler = new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-            if (msg.what == MSG_DOCUMENT_AS_TEXT) {
-                mActualResult = (String)msg.obj;
-                mResultObtainedMsg.sendToTarget();
-            }
-        }
-    };
-
-    public TextResult(String relativePath) {
-        mRelativePath = relativePath;
-    }
-
-    public void setDumpChildFramesAsText(boolean dumpChildFramesAsText) {
-        mDumpChildFramesAsText = dumpChildFramesAsText;
-    }
-
-    /**
-     * Used to recreate the Result when received by the service.
-     *
-     * @param bundle
-     *      bundle with data used to recreate the result
-     */
-    public TextResult(Bundle bundle) {
-        mExpectedResult = bundle.getString("expectedTextualResult");
-        mExpectedResultPath = bundle.getString("expectedTextualResultPath");
-        mActualResult = bundle.getString("actualTextualResult");
-        setAdditionalTextOutputString(bundle.getString("additionalTextOutputString"));
-        mRelativePath = bundle.getString("relativePath");
-        mDidTimeOut = bundle.getBoolean("didTimeOut");
-    }
-
-    @Override
-    public void clearResults() {
-        super.clearResults();
-        mExpectedResult = null;
-        mActualResult = null;
-    }
-
-    @Override
-    public ResultCode getResultCode() {
-        if (mResultCode == null) {
-            mResultCode = resultsMatch() ? AbstractResult.ResultCode.RESULTS_MATCH
-                    : AbstractResult.ResultCode.RESULTS_DIFFER;
-        }
-        return mResultCode;
-    }
-
-    private boolean resultsMatch() {
-        assert mExpectedResult != null;
-        assert mActualResult != null;
-        // Trim leading and trailing empty lines, as other WebKit platforms do.
-        String leadingEmptyLines = "^\\n+";
-        String trailingEmptyLines = "\\n+$";
-        String trimmedExpectedResult = mExpectedResult.replaceFirst(leadingEmptyLines, "")
-                .replaceFirst(trailingEmptyLines, "");
-        String trimmedActualResult = mActualResult.replaceFirst(leadingEmptyLines, "")
-                .replaceFirst(trailingEmptyLines, "");
-        return trimmedExpectedResult.equals(trimmedActualResult);
-    }
-
-    @Override
-    public boolean didCrash() {
-        return false;
-    }
-
-    @Override
-    public boolean didTimeOut() {
-        return mDidTimeOut;
-    }
-
-    @Override
-    public void setDidTimeOut() {
-        mDidTimeOut = true;
-    }
-
-    @Override
-    public byte[] getActualImageResult() {
-        return null;
-    }
-
-    @Override
-    public String getActualTextResult() {
-        String additionalTextResultString = getAdditionalTextOutputString();
-        if (additionalTextResultString != null) {
-            return additionalTextResultString + mActualResult;
-        }
-
-        return mActualResult;
-    }
-
-    @Override
-    public void setExpectedImageResult(byte[] expectedResult) {
-        /** This method is not applicable to this type of result */
-    }
-
-    @Override
-    public void setExpectedImageResultPath(String relativePath) {
-        /** This method is not applicable to this type of result */
-    }
-
-    @Override
-    public String getExpectedImageResultPath() {
-        /** This method is not applicable to this type of result */
-        return null;
-    }
-
-    @Override
-    public void setExpectedTextResultPath(String relativePath) {
-        mExpectedResultPath = relativePath;
-    }
-
-    @Override
-    public String getExpectedTextResultPath() {
-        return mExpectedResultPath;
-    }
-
-    @Override
-    public void setExpectedTextResult(String expectedResult) {
-        // For text results, we use an empty string for the expected result when none is
-        // present, as other WebKit platforms do.
-        mExpectedResult = expectedResult == null ? "" : expectedResult;
-    }
-
-    @Override
-    public String getDiffAsHtml() {
-        assert mExpectedResult != null;
-        assert mActualResult != null;
-
-        StringBuilder html = new StringBuilder();
-        html.append("<table class=\"visual_diff\">");
-        html.append("    <tr class=\"headers\">");
-        html.append("        <td colspan=\"2\">Expected result:</td>");
-        html.append("        <td class=\"space\"></td>");
-        html.append("        <td colspan=\"2\">Actual result:</td>");
-        html.append("    </tr>");
-
-        appendDiffHtml(html);
-
-        html.append("    <tr class=\"footers\">");
-        html.append("        <td colspan=\"2\"></td>");
-        html.append("        <td class=\"space\"></td>");
-        html.append("        <td colspan=\"2\"></td>");
-        html.append("    </tr>");
-        html.append("</table>");
-
-        return html.toString();
-    }
-
-    private void appendDiffHtml(StringBuilder html) {
-        LinkedList<diff_match_patch.Diff> diffs =
-                new diff_match_patch().diff_main(mExpectedResult, mActualResult);
-
-        diffs = VisualDiffUtils.splitDiffsOnNewline(diffs);
-
-        LinkedList<String> expectedLines = new LinkedList<String>();
-        LinkedList<Integer> expectedLineNums = new LinkedList<Integer>();
-        LinkedList<String> actualLines = new LinkedList<String>();
-        LinkedList<Integer> actualLineNums = new LinkedList<Integer>();
-
-        VisualDiffUtils.generateExpectedResultLines(diffs, expectedLineNums, expectedLines);
-        VisualDiffUtils.generateActualResultLines(diffs, actualLineNums, actualLines);
-        // TODO: We should use a map for each line number and lines pair.
-        assert expectedLines.size() == expectedLineNums.size();
-        assert actualLines.size() == actualLineNums.size();
-        assert expectedLines.size() == actualLines.size();
-
-        html.append(VisualDiffUtils.getHtml(expectedLineNums, expectedLines,
-                actualLineNums, actualLines));
-    }
-
-    @Override
-    public TestType getType() {
-        return TestType.TEXT;
-    }
-
-    @Override
-    public void obtainActualResults(WebView webview, Message resultObtainedMsg) {
-        mResultObtainedMsg = resultObtainedMsg;
-        Message msg = mHandler.obtainMessage(MSG_DOCUMENT_AS_TEXT);
-
-        /**
-         * arg1 - should dump top frame as text
-         * arg2 - should dump child frames as text
-         */
-        msg.arg1 = 1;
-        msg.arg2 = mDumpChildFramesAsText ? 1 : 0;
-        WebViewClassic.fromWebView(webview).documentAsText(msg);
-    }
-
-    @Override
-    public Bundle getBundle() {
-        Bundle bundle = new Bundle();
-        bundle.putString("expectedTextualResult", mExpectedResult);
-        bundle.putString("expectedTextualResultPath", mExpectedResultPath);
-        bundle.putString("actualTextualResult", getActualTextResult());
-        bundle.putString("additionalTextOutputString", getAdditionalTextOutputString());
-        bundle.putString("relativePath", mRelativePath);
-        bundle.putBoolean("didTimeOut", mDidTimeOut);
-        bundle.putString("type", getType().name());
-        return bundle;
-    }
-
-    @Override
-    public String getRelativePath() {
-        return mRelativePath;
-    }
-}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/VisualDiffUtils.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/VisualDiffUtils.java
deleted file mode 100644
index d7f7313..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/VisualDiffUtils.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Copyright (C) 2010 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.dumprendertree2;
-
-import name.fraser.neil.plaintext.diff_match_patch;
-
-import java.util.LinkedList;
-
-/**
- * Helper methods fo TextResult.getDiffAsHtml()
- */
-public class VisualDiffUtils {
-
-    private static final int DONT_PRINT_LINE_NUMBER = -1;
-
-    /**
-     * Preprocesses the list of diffs so that new line characters appear only at the end of
-     * diff.text
-     *
-     * @param diffs
-     * @return
-     *      LinkedList of diffs where new line character appears only on the end of
-     *      diff.text
-     */
-    public static LinkedList<diff_match_patch.Diff> splitDiffsOnNewline(
-            LinkedList<diff_match_patch.Diff> diffs) {
-        LinkedList<diff_match_patch.Diff> newDiffs = new LinkedList<diff_match_patch.Diff>();
-
-        String[] parts;
-        int lengthMinusOne;
-        for (diff_match_patch.Diff diff : diffs) {
-            parts = diff.text.split("\n", -1);
-            if (parts.length == 1) {
-                newDiffs.add(diff);
-                continue;
-            }
-
-            lengthMinusOne = parts.length - 1;
-            for (int i = 0; i < lengthMinusOne; i++) {
-                newDiffs.add(new diff_match_patch.Diff(diff.operation, parts[i] + "\n"));
-            }
-            if (!parts[lengthMinusOne].isEmpty()) {
-                newDiffs.add(new diff_match_patch.Diff(diff.operation, parts[lengthMinusOne]));
-            }
-        }
-
-        return newDiffs;
-    }
-
-    public static void generateExpectedResultLines(LinkedList<diff_match_patch.Diff> diffs,
-            LinkedList<Integer> lineNums, LinkedList<String> lines) {
-        String delSpan = "<span class=\"del\">";
-        String eqlSpan = "<span class=\"eql\">";
-
-        String line = "";
-        int i = 1;
-        diff_match_patch.Diff diff;
-        int size = diffs.size();
-        boolean isLastDiff;
-        for (int j = 0; j < size; j++) {
-            diff = diffs.get(j);
-            isLastDiff = j == size - 1;
-            switch (diff.operation) {
-                case DELETE:
-                    line = processDiff(diff, lineNums, lines, line, i, delSpan, isLastDiff);
-                    if (line.equals("")) {
-                        i++;
-                    }
-                    break;
-
-                case INSERT:
-                    // If the line is currently empty and this insertion is the entire line, the
-                    // expected line is absent, so it has no line number.
-                    if (diff.text.endsWith("\n") || isLastDiff) {
-                        lineNums.add(line.equals("") ? DONT_PRINT_LINE_NUMBER : i++);
-                        lines.add(line);
-                        line = "";
-                    }
-                    break;
-
-                case EQUAL:
-                    line = processDiff(diff, lineNums, lines, line, i, eqlSpan, isLastDiff);
-                    if (line.equals("")) {
-                        i++;
-                    }
-                    break;
-            }
-        }
-    }
-
-    public static void generateActualResultLines(LinkedList<diff_match_patch.Diff> diffs,
-            LinkedList<Integer> lineNums, LinkedList<String> lines) {
-        String insSpan = "<span class=\"ins\">";
-        String eqlSpan = "<span class=\"eql\">";
-
-        String line = "";
-        int i = 1;
-        diff_match_patch.Diff diff;
-        int size = diffs.size();
-        boolean isLastDiff;
-        for (int j = 0; j < size; j++) {
-            diff = diffs.get(j);
-            isLastDiff = j == size - 1;
-            switch (diff.operation) {
-                case INSERT:
-                    line = processDiff(diff, lineNums, lines, line, i, insSpan, isLastDiff);
-                    if (line.equals("")) {
-                        i++;
-                    }
-                    break;
-
-                case DELETE:
-                    // If the line is currently empty and deletion is the entire line, the
-                    // actual line is absent, so it has no line number.
-                    if (diff.text.endsWith("\n") || isLastDiff) {
-                        lineNums.add(line.equals("") ? DONT_PRINT_LINE_NUMBER : i++);
-                        lines.add(line);
-                        line = "";
-                    }
-                    break;
-
-                case EQUAL:
-                    line = processDiff(diff, lineNums, lines, line, i, eqlSpan, isLastDiff);
-                    if (line.equals("")) {
-                        i++;
-                    }
-                    break;
-            }
-        }
-    }
-
-    /**
-     * Generate or append a line for a given diff and add it to given collections if necessary.
-     * It puts diffs in HTML spans.
-     *
-     * @param diff
-     * @param lineNums
-     * @param lines
-     * @param line
-     * @param i
-     * @param begSpan
-     * @param forceOutputLine Force the current line to be output
-     * @return
-     */
-    public static String processDiff(diff_match_patch.Diff diff, LinkedList<Integer> lineNums,
-            LinkedList<String> lines, String line, int i, String begSpan, boolean forceOutputLine) {
-        String endSpan = "</span>";
-        String br = "&nbsp;";
-
-        if (diff.text.endsWith("\n") || forceOutputLine) {
-            lineNums.add(i);
-            /** TODO: Think of better way to replace stuff */
-            line += begSpan + diff.text.replace("  ", "&nbsp;&nbsp;")
-                    + endSpan + br;
-            lines.add(line);
-            line = "";
-        } else {
-            line += begSpan + diff.text.replace("  ", "&nbsp;&nbsp;") + endSpan;
-        }
-
-        return line;
-    }
-
-    public static String getHtml(LinkedList<Integer> lineNums1, LinkedList<String> lines1,
-            LinkedList<Integer> lineNums2, LinkedList<String> lines2) {
-        StringBuilder html = new StringBuilder();
-        int lineNum;
-        int size = lines1.size();
-        for (int i = 0; i < size; i++) {
-            html.append("<tr class=\"results\">");
-
-            html.append("    <td class=\"line_count\">");
-            lineNum = lineNums1.removeFirst();
-            if (lineNum > 0) {
-                html.append(lineNum);
-            }
-            html.append("    </td>");
-
-            html.append("    <td class=\"line\">");
-            html.append(lines1.removeFirst());
-            html.append("    </td>");
-
-            html.append("    <td class=\"space\"></td>");
-
-            html.append("    <td class=\"line_count\">");
-            lineNum = lineNums2.removeFirst();
-            if (lineNum > 0) {
-                html.append(lineNum);
-            }
-            html.append("    </td>");
-
-            html.append("    <td class=\"line\">");
-            html.append(lines2.removeFirst());
-            html.append("    </td>");
-
-            html.append("</tr>");
-        }
-        return html.toString();
-    }
-}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/AdbUtils.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/AdbUtils.java
deleted file mode 100644
index 224509d..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/AdbUtils.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2010 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.dumprendertree2.forwarder;
-
-import android.util.Log;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.Socket;
-
-/**
- * The utility class that can setup a socket allowing the device to communicate with remote
- * machines through the machine that the device is connected to via adb.
- */
-public class AdbUtils {
-    private static final String LOG_TAG = "AdbUtils";
-
-    private static final String ADB_OK = "OKAY";
-    private static final int ADB_PORT = 5037;
-    private static final String ADB_HOST = "127.0.0.1";
-    private static final int ADB_RESPONSE_SIZE = 4;
-
-    /**
-     * Creates a new socket that can be configured to serve as a transparent proxy to a
-     * remote machine. This can be achieved by calling configureSocket()
-     *
-     * @return a socket that can be configured to link to remote machine
-     * @throws IOException
-     */
-    public static Socket createSocket() throws IOException{
-        return new Socket(ADB_HOST, ADB_PORT);
-    }
-
-    /**
-     * Configures the connection to serve as a transparent proxy to a remote machine.
-     * The given streams must belong to a socket created by createSocket().
-     *
-     * @param inputStream inputStream of the socket we want to configure
-     * @param outputStream outputStream of the socket we want to configure
-     * @param remoteAddress address of the remote machine (as you would type in a browser
-     *      in a machine that the device is connected to via adb)
-     * @param remotePort port on which to connect
-     * @return if the configuration suceeded
-     * @throws IOException
-     */
-    public static boolean configureConnection(InputStream inputStream, OutputStream outputStream,
-            String remoteAddress, int remotePort) throws IOException {
-        String cmd = "tcp:" + remotePort + ":" + remoteAddress;
-        cmd = String.format("%04X", cmd.length()) + cmd;
-
-        byte[] buf = new byte[ADB_RESPONSE_SIZE];
-        outputStream.write(cmd.getBytes());
-        int read = inputStream.read(buf);
-        if (read != ADB_RESPONSE_SIZE || !ADB_OK.equals(new String(buf))) {
-            Log.w(LOG_TAG, "adb cmd failed.");
-            return false;
-        }
-        return true;
-    }
-}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/ConnectionHandler.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/ConnectionHandler.java
deleted file mode 100644
index f19cd41..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/ConnectionHandler.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright (C) 2010 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.dumprendertree2.forwarder;
-
-import android.util.Log;
-
-import com.android.dumprendertree2.FsUtils;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.Socket;
-
-/**
- * Worker class for {@link Forwarder}. A ConnectionHandler will be created once the Forwarder
- * accepts an incoming connection, and it will then forward the incoming/outgoing streams to a
- * connection already proxied by adb networking (see also {@link AdbUtils}).
- */
-public class ConnectionHandler {
-
-    private static final String LOG_TAG = "ConnectionHandler";
-
-    public static interface OnFinishedCallback {
-        public void onFinished();
-    }
-
-    private class SocketPipeThread extends Thread {
-
-        private InputStream mInputStream;
-        private OutputStream mOutputStream;
-
-        public SocketPipeThread(InputStream inputStream, OutputStream outputStream) {
-            mInputStream = inputStream;
-            mOutputStream = outputStream;
-            setName("SocketPipeThread: " + getName());
-        }
-
-        @Override
-        public void run() {
-            byte[] buffer = new byte[4096];
-            int length;
-            while (true) {
-                try {
-                    if ((length = mInputStream.read(buffer)) < 0) {
-                        break;
-                    }
-                    mOutputStream.write(buffer, 0, length);
-                } catch (IOException e) {
-                    /** This exception means one of the streams is closed */
-                    Log.v(LOG_TAG, this.toString(), e);
-                    break;
-                }
-            }
-
-            synchronized (mThreadsRunning) {
-                mThreadsRunning--;
-                if (mThreadsRunning == 0) {
-                    ConnectionHandler.this.stop();
-                    mOnFinishedCallback.onFinished();
-                }
-            }
-        }
-
-        @Override
-        public String toString() {
-            return getName();
-        }
-    }
-
-    private Integer mThreadsRunning;
-
-    private Socket mFromSocket, mToSocket;
-    private SocketPipeThread mFromToPipe, mToFromPipe;
-    private InputStream mFromSocketInputStream, mToSocketInputStream;
-    private OutputStream mFromSocketOutputStream, mToSocketOutputStream;
-
-    private int mPort;
-    private String mRemoteMachineIpAddress;
-
-    private OnFinishedCallback mOnFinishedCallback;
-
-    public ConnectionHandler(String remoteMachineIp, int port, Socket fromSocket, Socket toSocket)
-            throws IOException {
-        mRemoteMachineIpAddress = remoteMachineIp;
-        mPort = port;
-
-        mFromSocket = fromSocket;
-        mToSocket = toSocket;
-
-        try {
-            mFromSocketInputStream = mFromSocket.getInputStream();
-            mToSocketInputStream = mToSocket.getInputStream();
-            mFromSocketOutputStream = mFromSocket.getOutputStream();
-            mToSocketOutputStream = mToSocket.getOutputStream();
-            AdbUtils.configureConnection(mToSocketInputStream, mToSocketOutputStream,
-                    mRemoteMachineIpAddress, mPort);
-        } catch (IOException e) {
-            Log.e(LOG_TAG, "Unable to start ConnectionHandler", e);
-            closeStreams();
-            throw e;
-        }
-
-        mFromToPipe = new SocketPipeThread(mFromSocketInputStream, mToSocketOutputStream);
-        mToFromPipe = new SocketPipeThread(mToSocketInputStream, mFromSocketOutputStream);
-    }
-
-    public void registerOnConnectionHandlerFinishedCallback(OnFinishedCallback callback) {
-        mOnFinishedCallback = callback;
-    }
-
-    private void closeStreams() {
-        FsUtils.closeInputStream(mFromSocketInputStream);
-        FsUtils.closeInputStream(mToSocketInputStream);
-        FsUtils.closeOutputStream(mFromSocketOutputStream);
-        FsUtils.closeOutputStream(mToSocketOutputStream);
-    }
-
-    public void start() {
-        /** We have 2 threads running, one for each pipe, that we start here. */
-        mThreadsRunning = 2;
-        mFromToPipe.start();
-        mToFromPipe.start();
-    }
-
-    public void stop() {
-        shutdown(mFromSocket);
-        shutdown(mToSocket);
-    }
-
-    private void shutdown(Socket socket) {
-        synchronized (mFromToPipe) {
-            synchronized (mToFromPipe) {
-                /** This will stop the while loop in the run method */
-                try {
-                    if (!socket.isInputShutdown()) {
-                        socket.shutdownInput();
-                    }
-                } catch (IOException e) {
-                    Log.e(LOG_TAG, "mFromToPipe=" + mFromToPipe + " mToFromPipe=" + mToFromPipe, e);
-                }
-                try {
-                    if (!socket.isOutputShutdown()) {
-                        socket.shutdownOutput();
-                    }
-                } catch (IOException e) {
-                    Log.e(LOG_TAG, "mFromToPipe=" + mFromToPipe + " mToFromPipe=" + mToFromPipe, e);
-                }
-                try {
-                    if (!socket.isClosed()) {
-                        socket.close();
-                    }
-                } catch (IOException e) {
-                    Log.e(LOG_TAG, "mFromToPipe=" + mFromToPipe + " mToFromPipe=" + mToFromPipe, e);
-                }
-            }
-        }
-    }
-}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/Forwarder.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/Forwarder.java
deleted file mode 100644
index ce22fa0..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/Forwarder.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (C) 2010 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.dumprendertree2.forwarder;
-
-import android.util.Log;
-
-import java.io.IOException;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * A port forwarding server. Listens on localhost on specified port and forwards the tcp
- * communications to external socket via adb networking proxy.
- */
-public class Forwarder extends Thread {
-    private static final String LOG_TAG = "Forwarder";
-
-    private int mPort;
-    private String mRemoteMachineIpAddress;
-
-    private ServerSocket mServerSocket;
-
-    private Set<ConnectionHandler> mConnectionHandlers = new HashSet<ConnectionHandler>();
-
-    public Forwarder(int port, String remoteMachineIpAddress) {
-        mPort = port;
-        mRemoteMachineIpAddress = remoteMachineIpAddress;
-    }
-
-    @Override
-    public void start() {
-        Log.i(LOG_TAG, "start(): Starting fowarder on port: " + mPort);
-
-        try {
-            mServerSocket = new ServerSocket(mPort);
-        } catch (IOException e) {
-            Log.e(LOG_TAG, "mPort=" + mPort, e);
-            return;
-        }
-
-        super.start();
-    }
-
-    @Override
-    public void run() {
-        while (true) {
-            Socket localSocket;
-            try {
-                localSocket = mServerSocket.accept();
-            } catch (IOException e) {
-                /** This most likely means that mServerSocket is already closed */
-                Log.w(LOG_TAG, "mPort=" + mPort, e);
-                break;
-            }
-
-            Socket remoteSocket = null;
-            final ConnectionHandler connectionHandler;
-            try {
-                remoteSocket = AdbUtils.createSocket();
-                connectionHandler = new ConnectionHandler(
-                        mRemoteMachineIpAddress, mPort, localSocket, remoteSocket);
-            } catch (IOException exception) {
-                try {
-                    localSocket.close();
-                } catch (IOException e) {
-                    Log.e(LOG_TAG, "mPort=" + mPort, e);
-                }
-                if (remoteSocket != null) {
-                    try {
-                        remoteSocket.close();
-                    } catch (IOException e) {
-                        Log.e(LOG_TAG, "mPort=" + mPort, e);
-                    }
-                }
-                continue;
-            }
-
-            /**
-             * We have to close the sockets after the ConnectionHandler finishes, so we
-             * don't get "Too may open files" exception. We also remove the ConnectionHandler
-             * from the collection to avoid memory issues.
-             * */
-            ConnectionHandler.OnFinishedCallback callback =
-                    new ConnectionHandler.OnFinishedCallback() {
-                @Override
-                public void onFinished() {
-                    synchronized (this) {
-                        if (!mConnectionHandlers.remove(connectionHandler)) {
-                            assert false : "removeConnectionHandler(): not in the collection";
-                        }
-                    }
-                }
-            };
-            connectionHandler.registerOnConnectionHandlerFinishedCallback(callback);
-
-            synchronized (this) {
-                mConnectionHandlers.add(connectionHandler);
-            }
-            connectionHandler.start();
-        }
-
-        synchronized (this) {
-            for (ConnectionHandler connectionHandler : mConnectionHandlers) {
-                connectionHandler.stop();
-            }
-        }
-    }
-
-    public void finish() {
-        try {
-            mServerSocket.close();
-        } catch (IOException e) {
-            Log.e(LOG_TAG, "mPort=" + mPort, e);
-        }
-    }
-}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/ForwarderManager.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/ForwarderManager.java
deleted file mode 100644
index cff436ff..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/ForwarderManager.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (C) 2010 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.dumprendertree2.forwarder;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import android.util.Log;
-
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * A simple class to start and stop Forwarders running on some ports.
- *
- * It uses a singleton pattern and is thread safe.
- */
-public class ForwarderManager {
-    private static final String LOG_TAG = "ForwarderManager";
-
-    /**
-     * The IP address of the server serving the tests.
-     */
-    private static final String HOST_IP = "127.0.0.1";
-
-    /**
-     * We use these ports because other webkit platforms do. They are set up in
-     * external/webkit/LayoutTests/http/conf/apache2-debian-httpd.conf
-     */
-    public static final int HTTP_PORT = 8000;
-    public static final int HTTPS_PORT = 8443;
-
-    private static ForwarderManager forwarderManager;
-
-    private Set<Forwarder> mForwarders;
-    private boolean mIsStarted;
-
-    private ForwarderManager() {
-        mForwarders = new HashSet<Forwarder>(2);
-        mForwarders.add(new Forwarder(HTTP_PORT, HOST_IP));
-        mForwarders.add(new Forwarder(HTTPS_PORT, HOST_IP));
-    }
-
-    /**
-     * Returns the main part of the URL with the trailing slash
-     *
-     * @param isHttps
-     * @return
-     */
-    public static final String getHostSchemePort(boolean isHttps) {
-        int port;
-        String protocol;
-        if (isHttps) {
-            protocol = "https";
-            port = HTTPS_PORT;
-        } else {
-            protocol = "http";
-            port = HTTP_PORT;
-        }
-
-        URL url = null;
-        try {
-            url = new URL(protocol, HOST_IP, port, "/");
-        } catch (MalformedURLException e) {
-            assert false : "isHttps=" + isHttps;
-        }
-
-        return url.toString();
-    }
-
-    public static synchronized ForwarderManager getForwarderManager() {
-        if (forwarderManager == null) {
-            forwarderManager = new ForwarderManager();
-        }
-        return forwarderManager;
-    }
-
-    @Override
-    public Object clone() throws CloneNotSupportedException {
-        throw new CloneNotSupportedException();
-    }
-
-    public synchronized void start() {
-        if (mIsStarted) {
-            Log.w(LOG_TAG, "start(): ForwarderManager already running! NOOP.");
-            return;
-        }
-
-        for (Forwarder forwarder : mForwarders) {
-            forwarder.start();
-        }
-
-        mIsStarted = true;
-        Log.i(LOG_TAG, "ForwarderManager started.");
-    }
-
-    public synchronized void stop() {
-        if (!mIsStarted) {
-            Log.w(LOG_TAG, "stop(): ForwarderManager already stopped! NOOP.");
-            return;
-        }
-
-        for (Forwarder forwarder : mForwarders) {
-            forwarder.finish();
-        }
-
-        mIsStarted = false;
-        Log.i(LOG_TAG, "ForwarderManager stopped.");
-    }
-}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/scriptsupport/ScriptTestRunner.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/scriptsupport/ScriptTestRunner.java
deleted file mode 100644
index 78f58d5..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/scriptsupport/ScriptTestRunner.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2010 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.dumprendertree2.scriptsupport;
-
-import android.os.Bundle;
-import android.test.InstrumentationTestRunner;
-
-/**
- * Extends InstrumentationTestRunner to allow the script to pass arguments to the application
- */
-public class ScriptTestRunner extends InstrumentationTestRunner {
-    String mTestsRelativePath;
-
-    @Override
-    public void onCreate(Bundle arguments) {
-        mTestsRelativePath = arguments.getString("path");
-        super.onCreate(arguments);
-    }
-
-    public String getTestsRelativePath() {
-        return mTestsRelativePath;
-    }
-}
\ No newline at end of file
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/scriptsupport/Starter.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/scriptsupport/Starter.java
deleted file mode 100644
index 6f41a0f..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/scriptsupport/Starter.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2010 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.dumprendertree2.scriptsupport;
-
-import android.content.Intent;
-import android.test.ActivityInstrumentationTestCase2;
-import android.util.Log;
-
-import com.android.dumprendertree2.TestsListActivity;
-import com.android.dumprendertree2.forwarder.ForwarderManager;
-
-/**
- * A class which provides methods that can be invoked by a script running on the host machine to
- * run the tests.
- *
- * It starts a TestsListActivity and does not return until all the tests finish executing.
- */
-public class Starter extends ActivityInstrumentationTestCase2<TestsListActivity> {
-    private static final String LOG_TAG = "Starter";
-    private boolean mEverythingFinished;
-
-    public Starter() {
-        super(TestsListActivity.class);
-    }
-
-    /**
-     * This method is called from adb to start executing the tests. It doesn't return
-     * until everything is finished so that the script can wait for the end if it needs
-     * to.
-     */
-    public void startLayoutTests() {
-        ScriptTestRunner runner = (ScriptTestRunner)getInstrumentation();
-        String relativePath = runner.getTestsRelativePath();
-
-        ForwarderManager.getForwarderManager().start();
-
-        Intent intent = new Intent();
-        intent.setClassName("com.android.dumprendertree2", "TestsListActivity");
-        intent.setAction(Intent.ACTION_RUN);
-        intent.putExtra(TestsListActivity.EXTRA_TEST_PATH, relativePath);
-        setActivityIntent(intent);
-        getActivity().registerOnEverythingFinishedCallback(new OnEverythingFinishedCallback() {
-            /** This method is safe to call on any thread */
-            @Override
-            public void onFinished() {
-                synchronized (Starter.this) {
-                    mEverythingFinished = true;
-                    Starter.this.notifyAll();
-                }
-            }
-        });
-
-        synchronized (this) {
-            while (!mEverythingFinished) {
-                try {
-                    this.wait();
-                } catch (InterruptedException e) {
-                    Log.e(LOG_TAG, "startLayoutTests()", e);
-                }
-            }
-        }
-
-        ForwarderManager.getForwarderManager().stop();
-    }
-}
\ No newline at end of file
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/ui/DirListActivity.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/ui/DirListActivity.java
deleted file mode 100644
index 5de69a7..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/ui/DirListActivity.java
+++ /dev/null
@@ -1,426 +0,0 @@
-/*
- * Copyright (C) 2010 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.dumprendertree2.ui;
-
-import com.android.dumprendertree2.FileFilter;
-import com.android.dumprendertree2.FsUtils;
-import com.android.dumprendertree2.TestsListActivity;
-import com.android.dumprendertree2.R;
-import com.android.dumprendertree2.forwarder.ForwarderManager;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.ListActivity;
-import android.app.ProgressDialog;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.res.Configuration;
-import android.os.Bundle;
-import android.os.Environment;
-import android.os.Handler;
-import android.os.Message;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
-import android.widget.ImageView;
-import android.widget.ListView;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * An Activity that allows navigating through tests folders and choosing folders or tests to run.
- */
-public class DirListActivity extends ListActivity {
-
-    private static final String LOG_TAG = "DirListActivity";
-
-    /** TODO: This is just a guess - think of a better way to achieve it */
-    private static final int MEAN_TITLE_CHAR_SIZE = 13;
-
-    private static final int PROGRESS_DIALOG_DELAY_MS = 200;
-
-    /** Code for the dialog, used in showDialog and onCreateDialog */
-    private static final int DIALOG_RUN_ABORT_DIR = 0;
-
-    /** Messages codes */
-    private static final int MSG_LOADED_ITEMS = 0;
-    private static final int MSG_SHOW_PROGRESS_DIALOG = 1;
-
-    private static final CharSequence NO_RESPONSE_MESSAGE =
-            "No response from host when getting directory contents. Is the host server running?";
-
-    /** Initialized lazily before first sProgressDialog.show() */
-    private static ProgressDialog sProgressDialog;
-
-    private ListView mListView;
-
-    /** This is a relative path! */
-    private String mCurrentDirPath;
-
-    /**
-     * A thread responsible for loading the contents of the directory from sd card
-     * and sending them via Message to main thread that then loads them into
-     * ListView
-     */
-    private class LoadListItemsThread extends Thread {
-        private Handler mHandler;
-        private String mRelativePath;
-
-        public LoadListItemsThread(String relativePath, Handler handler) {
-            mRelativePath = relativePath;
-            mHandler = handler;
-        }
-
-        @Override
-        public void run() {
-            Message msg = mHandler.obtainMessage(MSG_LOADED_ITEMS);
-            msg.obj = getDirList(mRelativePath);
-            mHandler.sendMessage(msg);
-        }
-    }
-
-    /**
-     * Very simple object to use inside ListView as an item.
-     */
-    private static class ListItem implements Comparable<ListItem> {
-        private String mRelativePath;
-        private String mName;
-        private boolean mIsDirectory;
-
-        public ListItem(String relativePath, boolean isDirectory) {
-            mRelativePath = relativePath;
-            mName = new File(relativePath).getName();
-            mIsDirectory = isDirectory;
-        }
-
-        public boolean isDirectory() {
-            return mIsDirectory;
-        }
-
-        public String getRelativePath() {
-            return mRelativePath;
-        }
-
-        public String getName() {
-            return mName;
-        }
-
-        @Override
-        public int compareTo(ListItem another) {
-            return mRelativePath.compareTo(another.getRelativePath());
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (!(o instanceof ListItem)) {
-                return false;
-            }
-
-            return mRelativePath.equals(((ListItem)o).getRelativePath());
-        }
-
-        @Override
-        public int hashCode() {
-            return mRelativePath.hashCode();
-        }
-
-    }
-
-    /**
-     * A custom adapter that sets the proper icon and label in the list view.
-     */
-    private static class DirListAdapter extends ArrayAdapter<ListItem> {
-        private Activity mContext;
-        private ListItem[] mItems;
-
-        public DirListAdapter(Activity context, ListItem[] items) {
-            super(context, R.layout.dirlist_row, items);
-
-            mContext = context;
-            mItems = items;
-        }
-
-        @Override
-        public View getView(int position, View convertView, ViewGroup parent) {
-            LayoutInflater inflater = mContext.getLayoutInflater();
-            View row = inflater.inflate(R.layout.dirlist_row, null);
-
-            TextView label = (TextView)row.findViewById(R.id.label);
-            label.setText(mItems[position].getName());
-
-            ImageView icon = (ImageView)row.findViewById(R.id.icon);
-            if (mItems[position].isDirectory()) {
-                icon.setImageResource(R.drawable.folder);
-            } else {
-                icon.setImageResource(R.drawable.runtest);
-            }
-
-            return row;
-        }
-    }
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        ForwarderManager.getForwarderManager().start();
-
-        mListView = getListView();
-
-        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
-            @Override
-            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-                ListItem item = (ListItem)parent.getItemAtPosition(position);
-
-                if (item.isDirectory()) {
-                    showDir(item.getRelativePath());
-                } else {
-                    /** Run the test */
-                    runAllTestsUnder(item.getRelativePath());
-                }
-            }
-        });
-
-        mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
-            @Override
-            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
-                ListItem item = (ListItem)parent.getItemAtPosition(position);
-
-                if (item.isDirectory()) {
-                    Bundle arguments = new Bundle(1);
-                    arguments.putString("name", item.getName());
-                    arguments.putString("relativePath", item.getRelativePath());
-                    showDialog(DIALOG_RUN_ABORT_DIR, arguments);
-                } else {
-                    /** TODO: Maybe show some info about a test? */
-                }
-
-                return true;
-            }
-        });
-
-        /** All the paths are relative to test root dir where possible */
-        showDir("");
-    }
-
-    private void runAllTestsUnder(String relativePath) {
-        Intent intent = new Intent();
-        intent.setClass(DirListActivity.this, TestsListActivity.class);
-        intent.setAction(Intent.ACTION_RUN);
-        intent.putExtra(TestsListActivity.EXTRA_TEST_PATH, relativePath);
-        startActivity(intent);
-    }
-
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        MenuInflater inflater = getMenuInflater();
-        inflater.inflate(R.menu.gui_menu, menu);
-        return true;
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        switch (item.getItemId()) {
-            case R.id.run_all:
-                runAllTestsUnder(mCurrentDirPath);
-                return true;
-            default:
-                return super.onOptionsItemSelected(item);
-        }
-    }
-
-    @Override
-    /**
-     * Moves to the parent directory if one exists. Does not allow to move above
-     * the test 'root' directory.
-     */
-    public void onBackPressed() {
-        File currentDirParent = new File(mCurrentDirPath).getParentFile();
-        if (currentDirParent != null) {
-            showDir(currentDirParent.getPath());
-        } else {
-            showDir("");
-        }
-    }
-
-    /**
-     * Prevents the activity from recreating on change of orientation. The title needs to
-     * be recalculated.
-     */
-    @Override
-    public void onConfigurationChanged(Configuration newConfig) {
-        super.onConfigurationChanged(newConfig);
-
-        setTitle(shortenTitle(mCurrentDirPath));
-    }
-
-    @Override
-    protected Dialog onCreateDialog(int id, final Bundle args) {
-        Dialog dialog = null;
-        AlertDialog.Builder builder = new AlertDialog.Builder(this);
-
-        switch (id) {
-            case DIALOG_RUN_ABORT_DIR:
-                builder.setTitle(getText(R.string.dialog_run_abort_dir_title_prefix) + " " +
-                        args.getString("name"));
-                builder.setMessage(R.string.dialog_run_abort_dir_msg);
-                builder.setCancelable(true);
-
-                builder.setPositiveButton(R.string.dialog_run_abort_dir_ok_button,
-                        new DialogInterface.OnClickListener() {
-                    @Override
-                    public void onClick(DialogInterface dialog, int which) {
-                        removeDialog(DIALOG_RUN_ABORT_DIR);
-                        runAllTestsUnder(args.getString("relativePath"));
-                    }
-                });
-
-                builder.setNegativeButton(R.string.dialog_run_abort_dir_abort_button,
-                        new DialogInterface.OnClickListener() {
-                    @Override
-                    public void onClick(DialogInterface dialog, int which) {
-                        removeDialog(DIALOG_RUN_ABORT_DIR);
-                    }
-                });
-
-                dialog = builder.create();
-                dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
-                    @Override
-                    public void onCancel(DialogInterface dialog) {
-                        removeDialog(DIALOG_RUN_ABORT_DIR);
-                    }
-                });
-                break;
-        }
-
-        return dialog;
-    }
-
-    /**
-     * Loads the contents of dir into the list view.
-     *
-     * @param dirPath
-     *      directory to load into list view
-     */
-    private void showDir(String dirPath) {
-        mCurrentDirPath = dirPath;
-
-        /** Show progress dialog with a delay */
-        final Handler delayedDialogHandler = new Handler() {
-            @Override
-            public void handleMessage(Message msg) {
-                if (msg.what == MSG_SHOW_PROGRESS_DIALOG) {
-                    if (sProgressDialog == null) {
-                        sProgressDialog = new ProgressDialog(DirListActivity.this);
-                        sProgressDialog.setCancelable(false);
-                        sProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
-                        sProgressDialog.setTitle(R.string.dialog_progress_title);
-                        sProgressDialog.setMessage(getText(R.string.dialog_progress_msg));
-                    }
-                    sProgressDialog.show();
-                }
-            }
-        };
-        Message msgShowDialog = delayedDialogHandler.obtainMessage(MSG_SHOW_PROGRESS_DIALOG);
-        delayedDialogHandler.sendMessageDelayed(msgShowDialog, PROGRESS_DIALOG_DELAY_MS);
-
-        /** Delegate loading contents from SD card to a new thread */
-        new LoadListItemsThread(mCurrentDirPath, new Handler() {
-            @Override
-            public void handleMessage(Message msg) {
-                if (msg.what == MSG_LOADED_ITEMS) {
-                    setTitle(shortenTitle(mCurrentDirPath));
-                    delayedDialogHandler.removeMessages(MSG_SHOW_PROGRESS_DIALOG);
-                    if (sProgressDialog != null) {
-                        sProgressDialog.dismiss();
-                    }
-                    if (msg.obj == null) {
-                        Toast.makeText(DirListActivity.this, NO_RESPONSE_MESSAGE,
-                                Toast.LENGTH_LONG).show();
-                    } else {
-                        setListAdapter(new DirListAdapter(DirListActivity.this,
-                                (ListItem[])msg.obj));
-                    }
-                }
-            }
-        }).start();
-    }
-
-    /**
-     * TODO: find a neat way to determine number of characters that fit in the title
-     * bar.
-     * */
-    private String shortenTitle(String title) {
-        if (title.equals("")) {
-            return "Tests' root dir:";
-        }
-        int charCount = mListView.getWidth() / MEAN_TITLE_CHAR_SIZE;
-
-        if (title.length() > charCount) {
-            return "..." + title.substring(title.length() - charCount);
-        } else {
-            return title;
-        }
-    }
-
-    /**
-     * Return the array with contents of the given directory.
-     * First it contains the subfolders, then the files. Both sorted
-     * alphabetically.
-     *
-     * The dirPath is relative.
-     */
-    private ListItem[] getDirList(String dirPath) {
-        List<ListItem> subDirs = new ArrayList<ListItem>();
-        List<ListItem> subFiles = new ArrayList<ListItem>();
-
-        List<String> dirRelativePaths = FsUtils.getLayoutTestsDirContents(dirPath, false, true);
-        if (dirRelativePaths == null) {
-            return null;
-        }
-        for (String dirRelativePath : dirRelativePaths) {
-            if (FileFilter.isTestDir(new File(dirRelativePath).getName())) {
-                subDirs.add(new ListItem(dirRelativePath, true));
-            }
-        }
-
-        List<String> testRelativePaths = FsUtils.getLayoutTestsDirContents(dirPath, false, false);
-        if (testRelativePaths == null) {
-            return null;
-        }
-        for (String testRelativePath : testRelativePaths) {
-            if (FileFilter.isTestFile(new File(testRelativePath).getName())) {
-                subFiles.add(new ListItem(testRelativePath, false));
-            }
-        }
-
-        /** Concatenate the two lists */
-        subDirs.addAll(subFiles);
-
-        return subDirs.toArray(new ListItem[subDirs.size()]);
-    }
-}
diff --git a/tests/TileBenchmark/src/com/test/tilebenchmark/PerformanceTest.java b/tests/TileBenchmark/src/com/test/tilebenchmark/PerformanceTest.java
deleted file mode 100644
index 5763ad3..0000000
--- a/tests/TileBenchmark/src/com/test/tilebenchmark/PerformanceTest.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*
- * Copyright (C) 2011 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.test.tilebenchmark;
-
-import com.test.tilebenchmark.ProfileActivity.ProfileCallback;
-
-import java.io.File;
-import java.util.HashMap;
-import java.util.Map;
-
-import android.content.res.Resources;
-import android.os.Bundle;
-import android.os.Environment;
-import android.test.ActivityInstrumentationTestCase2;
-import android.util.Log;
-import android.webkit.WebSettings;
-import android.widget.Spinner;
-
-public class PerformanceTest extends
-        ActivityInstrumentationTestCase2<ProfileActivity> {
-
-    public static class AnimStat {
-        double aggVal = 0;
-        double aggSqrVal = 0;
-        double count = 0;
-    }
-
-    private class StatAggregator extends PlaybackGraphs {
-        private HashMap<String, Double> mDataMap = new HashMap<String, Double>();
-        private HashMap<String, AnimStat> mAnimDataMap = new HashMap<String, AnimStat>();
-        private int mCount = 0;
-
-
-        public void aggregate() {
-            boolean inAnimTests = mAnimTests != null;
-            Resources resources = mWeb.getResources();
-            String animFramerateString = resources.getString(R.string.animation_framerate);
-            for (Map.Entry<String, Double> e : mSingleStats.entrySet()) {
-                String name = e.getKey();
-                if (inAnimTests) {
-                    if (name.equals(animFramerateString)) {
-                        // in animation testing phase, record animation framerate and aggregate
-                        // stats, differentiating on values of mAnimTestNr and mDoubleBuffering
-                        String fullName = ANIM_TEST_NAMES[mAnimTestNr] + " " + name;
-                        fullName += mDoubleBuffering ? " tiled" : " webkit";
-
-                        if (!mAnimDataMap.containsKey(fullName)) {
-                            mAnimDataMap.put(fullName, new AnimStat());
-                        }
-                        AnimStat statVals = mAnimDataMap.get(fullName);
-                        statVals.aggVal += e.getValue();
-                        statVals.aggSqrVal += e.getValue() * e.getValue();
-                        statVals.count += 1;
-                    }
-                } else {
-                    double aggVal = mDataMap.containsKey(name)
-                            ? mDataMap.get(name) : 0;
-                    mDataMap.put(name, aggVal + e.getValue());
-                }
-            }
-
-            if (inAnimTests) {
-                return;
-            }
-
-            mCount++;
-            for (int metricIndex = 0; metricIndex < Metrics.length; metricIndex++) {
-                for (int statIndex = 0; statIndex < Stats.length; statIndex++) {
-                    String metricLabel = resources.getString(
-                            Metrics[metricIndex].getLabelId());
-                    String statLabel = resources.getString(
-                            Stats[statIndex].getLabelId());
-
-                    String label = metricLabel + " " + statLabel;
-                    double aggVal = mDataMap.containsKey(label) ? mDataMap
-                            .get(label) : 0;
-
-                    aggVal += mStats[metricIndex][statIndex];
-                    mDataMap.put(label, aggVal);
-                }
-            }
-
-        }
-
-        // build the final bundle of results
-        public Bundle getBundle() {
-            Bundle b = new Bundle();
-            int count = (0 == mCount) ? Integer.MAX_VALUE : mCount;
-            for (Map.Entry<String, Double> e : mDataMap.entrySet()) {
-                b.putDouble(e.getKey(), e.getValue() / count);
-            }
-
-            for (Map.Entry<String, AnimStat> e : mAnimDataMap.entrySet()) {
-                String statName = e.getKey();
-                AnimStat statVals = e.getValue();
-
-                double avg = statVals.aggVal/statVals.count;
-                double stdDev = Math.sqrt((statVals.aggSqrVal / statVals.count) - avg * avg);
-
-                b.putDouble(statName, avg);
-                b.putDouble(statName + " STD DEV", stdDev);
-            }
-
-            return b;
-        }
-    }
-
-    ProfileActivity mActivity;
-    ProfiledWebView mWeb;
-    Spinner mMovementSpinner;
-    StatAggregator mStats;
-
-    private static final String LOGTAG = "PerformanceTest";
-    private static final String TEST_LOCATION = "webkit/page_cycler";
-    private static final String URL_PREFIX = "file://";
-    private static final String URL_POSTFIX = "/index.html?skip=true";
-    private static final int MAX_ITERATIONS = 4;
-    private static final String SCROLL_TEST_DIRS[] = {
-        "alexa25_2011"
-    };
-    private static final String ANIM_TEST_DIRS[] = {
-        "dhtml"
-    };
-
-    public PerformanceTest() {
-        super(ProfileActivity.class);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mActivity = getActivity();
-        mWeb = (ProfiledWebView) mActivity.findViewById(R.id.web);
-        mMovementSpinner = (Spinner) mActivity.findViewById(R.id.movement);
-        mStats = new StatAggregator();
-
-        // use mStats as a condition variable between the UI thread and
-        // this(the testing) thread
-        mActivity.setCallback(new ProfileCallback() {
-            @Override
-            public void profileCallback(RunData data) {
-                mStats.setData(data);
-                synchronized (mStats) {
-                    mStats.notify();
-                }
-            }
-        });
-
-    }
-
-    private boolean loadUrl(final String url) {
-        try {
-            Log.d(LOGTAG, "test starting for url " + url);
-            mActivity.runOnUiThread(new Runnable() {
-                @Override
-                public void run() {
-                    mWeb.loadUrl(url);
-                }
-            });
-            synchronized (mStats) {
-                mStats.wait();
-            }
-
-            mStats.aggregate();
-        } catch (InterruptedException e) {
-            e.printStackTrace();
-            return false;
-        }
-        return true;
-    }
-
-    private boolean validTest(String nextTest) {
-        // if testing animations, test must be in mAnimTests
-        if (mAnimTests == null)
-            return true;
-
-        for (String test : mAnimTests) {
-            if (test.equals(nextTest)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    private boolean runIteration(String[] testDirs) {
-        File sdFile = Environment.getExternalStorageDirectory();
-        for (String testDirName : testDirs) {
-            File testDir = new File(sdFile, TEST_LOCATION + "/" + testDirName);
-            Log.d(LOGTAG, "Testing dir: '" + testDir.getAbsolutePath()
-                    + "', exists=" + testDir.exists());
-
-            for (File siteDir : testDir.listFiles()) {
-                if (!siteDir.isDirectory() || !validTest(siteDir.getName())) {
-                    continue;
-                }
-
-                if (!loadUrl(URL_PREFIX + siteDir.getAbsolutePath()
-                        + URL_POSTFIX)) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-
-    private boolean  runTestDirs(String[] testDirs) {
-        for (int i = 0; i < MAX_ITERATIONS; i++)
-            if (!runIteration(testDirs)) {
-                return false;
-            }
-        return true;
-    }
-
-    private void pushDoubleBuffering() {
-        getInstrumentation().runOnMainSync(new Runnable() {
-            public void run() {
-                mWeb.setDoubleBuffering(mDoubleBuffering);
-            }
-        });
-    }
-
-    private void setScrollingTestingMode(final boolean scrolled) {
-        getInstrumentation().runOnMainSync(new Runnable() {
-            public void run() {
-                mMovementSpinner.setSelection(scrolled ? 0 : 2);
-            }
-        });
-    }
-
-
-    private String[] mAnimTests = null;
-    private int mAnimTestNr = -1;
-    private boolean mDoubleBuffering = true;
-    private static final String[] ANIM_TEST_NAMES = {
-        "slow", "fast"
-    };
-    private static final String[][] ANIM_TESTS = {
-        {"scrolling", "replaceimages", "layers5", "layers1"},
-        {"slidingballs", "meter", "slidein", "fadespacing", "colorfade",
-                "mozilla", "movingtext", "diagball", "zoom", "imageslide"},
-    };
-
-    private boolean checkMedia() {
-        String state = Environment.getExternalStorageState();
-
-        if (!Environment.MEDIA_MOUNTED.equals(state)
-                && !Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
-            Log.d(LOGTAG, "ARG Can't access sd card!");
-            // Can't read the SD card, fail and die!
-            getInstrumentation().sendStatus(1, null);
-            return false;
-        }
-        return true;
-    }
-
-    public void testMetrics() {
-        setScrollingTestingMode(true);
-        if (checkMedia() && runTestDirs(SCROLL_TEST_DIRS)) {
-            getInstrumentation().sendStatus(0, mStats.getBundle());
-        } else {
-            getInstrumentation().sendStatus(1, null);
-        }
-    }
-
-    public void testMetricsMinimalMemory() {
-        mActivity.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mWeb.setUseMinimalMemory(true);
-            }
-        });
-
-        setScrollingTestingMode(true);
-        if (checkMedia() && runTestDirs(SCROLL_TEST_DIRS)) {
-            getInstrumentation().sendStatus(0, mStats.getBundle());
-        } else {
-            getInstrumentation().sendStatus(1, null);
-        }
-    }
-
-    private boolean runAnimationTests() {
-        for (int doubleBuffer = 0; doubleBuffer <= 1; doubleBuffer++) {
-            mDoubleBuffering = doubleBuffer == 1;
-            pushDoubleBuffering();
-            for (mAnimTestNr = 0; mAnimTestNr < ANIM_TESTS.length; mAnimTestNr++) {
-                mAnimTests = ANIM_TESTS[mAnimTestNr];
-                if (!runTestDirs(ANIM_TEST_DIRS)) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-
-    public void testAnimations() {
-        // instead of autoscrolling, load each page until either an timer fires,
-        // or the animation signals complete via javascript
-        setScrollingTestingMode(false);
-
-        if (checkMedia() && runAnimationTests()) {
-            getInstrumentation().sendStatus(0, mStats.getBundle());
-        } else {
-            getInstrumentation().sendStatus(1, null);
-        }
-    }
-}
diff --git a/tests/TileBenchmark/src/com/test/tilebenchmark/PlaybackActivity.java b/tests/TileBenchmark/src/com/test/tilebenchmark/PlaybackActivity.java
deleted file mode 100644
index 1eb1c00..0000000
--- a/tests/TileBenchmark/src/com/test/tilebenchmark/PlaybackActivity.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (C) 2011 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.test.tilebenchmark;
-
-import android.app.Activity;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.view.GestureDetector.SimpleOnGestureListener;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.Button;
-import android.widget.SeekBar;
-import android.widget.SeekBar.OnSeekBarChangeListener;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-
-/**
- * Interface for playing back WebView tile rendering status. Draws viewport and
- * states of tiles and statistics for off-line analysis.
- */
-public class PlaybackActivity extends Activity {
-    private static final float SCROLL_SCALER = 0.125f;
-
-    PlaybackView mPlaybackView;
-    SeekBar mSeekBar;
-    Button mForward;
-    Button mBackward;
-    TextView mFrameDisplay;
-
-    private int mFrame = -1;
-    private int mFrameMax;
-
-    private class TouchFrameChangeListener extends SimpleOnGestureListener {
-        float mDist = 0;
-
-        @Override
-        public boolean onScroll(MotionEvent e1, MotionEvent e2,
-                float distanceX, float distanceY) {
-            // aggregate scrolls so that small ones can add up
-            mDist += distanceY * SCROLL_SCALER;
-            int intComponent = (int) Math.floor(Math.abs(mDist));
-            if (intComponent >= 1) {
-                int scrollDist = (mDist > 0) ? intComponent : -intComponent;
-                setFrame(null, mFrame + scrollDist);
-                mDist -= scrollDist;
-            }
-            return super.onScroll(e1, e2, distanceX, distanceY);
-        }
-    };
-
-    private class SeekFrameChangeListener implements OnSeekBarChangeListener {
-        @Override
-        public void onStopTrackingTouch(SeekBar seekBar) {
-        }
-
-        @Override
-        public void onStartTrackingTouch(SeekBar seekBar) {
-        }
-
-        @Override
-        public void onProgressChanged(SeekBar seekBar, int progress,
-                boolean fromUser) {
-            setFrame(seekBar, progress);
-        }
-    };
-
-    private class LoadFileTask extends AsyncTask<String, Void, RunData> {
-        @Override
-        protected RunData doInBackground(String... params) {
-            RunData data = null;
-            try {
-                FileInputStream fis = openFileInput(params[0]);
-                ObjectInputStream in = new ObjectInputStream(fis);
-                data = (RunData) in.readObject();
-                in.close();
-            } catch (IOException ex) {
-                ex.printStackTrace();
-            } catch (ClassNotFoundException ex) {
-                ex.printStackTrace();
-            }
-            return data;
-        }
-
-        @Override
-        protected void onPostExecute(RunData data) {
-            if (data == null) {
-                Toast.makeText(getApplicationContext(),
-                        getResources().getString(R.string.error_no_data),
-                        Toast.LENGTH_LONG).show();
-                return;
-            }
-            mPlaybackView.setData(data);
-
-            mFrameMax = data.frames.length - 1;
-            mSeekBar.setMax(mFrameMax);
-
-            setFrame(null, 0);
-        }
-    }
-
-    private void setFrame(View changer, int f) {
-        if (f < 0) {
-            f = 0;
-        } else if (f > mFrameMax) {
-            f = mFrameMax;
-        }
-
-        if (mFrame == f) {
-            return;
-        }
-
-        mFrame = f;
-        mForward.setEnabled(mFrame != mFrameMax);
-        mBackward.setEnabled(mFrame != 0);
-        if (changer != mSeekBar) {
-            mSeekBar.setProgress(mFrame);
-        }
-        mFrameDisplay.setText(Integer.toString(mFrame));
-        mPlaybackView.setFrame(mFrame);
-    };
-
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.playback);
-
-        mPlaybackView = (PlaybackView) findViewById(R.id.playback);
-        mSeekBar = (SeekBar) findViewById(R.id.seek_bar);
-        mForward = (Button) findViewById(R.id.forward);
-        mBackward = (Button) findViewById(R.id.backward);
-        mFrameDisplay = (TextView) findViewById(R.id.frame_display);
-
-        mForward.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                setFrame(v, mFrame + 1);
-            }
-        });
-
-        mBackward.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                setFrame(v, mFrame - 1);
-            }
-        });
-
-        mSeekBar.setOnSeekBarChangeListener(new SeekFrameChangeListener());
-
-        mPlaybackView.setOnGestureListener(new TouchFrameChangeListener());
-
-        new LoadFileTask().execute(ProfileActivity.TEMP_FILENAME);
-    }
-}
diff --git a/tests/TileBenchmark/src/com/test/tilebenchmark/PlaybackGraphs.java b/tests/TileBenchmark/src/com/test/tilebenchmark/PlaybackGraphs.java
deleted file mode 100644
index 065e86f..0000000
--- a/tests/TileBenchmark/src/com/test/tilebenchmark/PlaybackGraphs.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- * Copyright (C) 2011 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.test.tilebenchmark;
-
-import android.content.res.Resources;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.Rect;
-import android.graphics.drawable.ShapeDrawable;
-
-import com.test.tilebenchmark.RunData.TileData;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-
-public class PlaybackGraphs {
-    private static final int BAR_WIDTH = PlaybackView.TILE_SCALE * 3;
-    private static final float CANVAS_SCALE = 0.2f;
-    private static final double IDEAL_FRAMES = 60;
-    private static final int LABELOFFSET = 100;
-    private static Paint whiteLabels;
-
-    private static double viewportCoverage(TileData view, TileData tile) {
-        if (tile.left < (view.right * view.scale)
-                && tile.right >= (view.left * view.scale)
-                && tile.top < (view.bottom * view.scale)
-                && tile.bottom >= (view.top * view.scale)) {
-            return 1.0f;
-        }
-        return 0.0f;
-    }
-
-    protected interface MetricGen {
-        public double getValue(TileData[] frame);
-
-        public double getMax();
-
-        public int getLabelId();
-    };
-
-    protected static MetricGen[] Metrics = new MetricGen[] {
-            new MetricGen() {
-                // framerate graph
-                @Override
-                public double getValue(TileData[] frame) {
-                    int renderTimeUS = frame[0].level;
-                    return 1.0e6f / renderTimeUS;
-                }
-
-                @Override
-                public double getMax() {
-                    return IDEAL_FRAMES;
-                }
-
-                @Override
-                public int getLabelId() {
-                    return R.string.frames_per_second;
-                }
-            }, new MetricGen() {
-                // coverage graph
-                @Override
-                public double getValue(TileData[] frame) {
-                    double total = 0, totalCount = 0;
-                    for (int tileID = 1; tileID < frame.length; tileID++) {
-                        TileData data = frame[tileID];
-                        double coverage = viewportCoverage(frame[0], data);
-                        total += coverage * (data.isReady ? 100 : 0);
-                        totalCount += coverage;
-                    }
-                    if (totalCount == 0) {
-                        return -1;
-                    }
-                    return total / totalCount;
-                }
-
-                @Override
-                public double getMax() {
-                    return 100;
-                }
-
-                @Override
-                public int getLabelId() {
-                    return R.string.viewport_coverage;
-                }
-            }
-    };
-
-    protected interface StatGen {
-        public double getValue(double sortedValues[]);
-
-        public int getLabelId();
-    }
-
-    public static double getPercentile(double sortedValues[], double ratioAbove) {
-        if (sortedValues.length == 0)
-            return -1;
-
-        double index = ratioAbove * (sortedValues.length - 1);
-        int intIndex = (int) Math.floor(index);
-        if (index == intIndex) {
-            return sortedValues[intIndex];
-        }
-        double alpha = index - intIndex;
-        return sortedValues[intIndex] * (1 - alpha)
-                + sortedValues[intIndex + 1] * (alpha);
-    }
-
-    public static double getMean(double sortedValues[]) {
-        if (sortedValues.length == 0)
-            return -1;
-
-        double agg = 0;
-        for (double val : sortedValues) {
-            agg += val;
-        }
-        return agg / sortedValues.length;
-    }
-
-    public static double getStdDev(double sortedValues[]) {
-        if (sortedValues.length == 0)
-            return -1;
-
-        double agg = 0;
-        double sqrAgg = 0;
-        for (double val : sortedValues) {
-            agg += val;
-            sqrAgg += val*val;
-        }
-        double mean = agg / sortedValues.length;
-        return Math.sqrt((sqrAgg / sortedValues.length) - (mean * mean));
-    }
-
-    protected static StatGen[] Stats = new StatGen[] {
-            new StatGen() {
-                @Override
-                public double getValue(double[] sortedValues) {
-                    return getPercentile(sortedValues, 0.25);
-                }
-
-                @Override
-                public int getLabelId() {
-                    return R.string.percentile_25;
-                }
-            }, new StatGen() {
-                @Override
-                public double getValue(double[] sortedValues) {
-                    return getPercentile(sortedValues, 0.5);
-                }
-
-                @Override
-                public int getLabelId() {
-                    return R.string.percentile_50;
-                }
-            }, new StatGen() {
-                @Override
-                public double getValue(double[] sortedValues) {
-                    return getPercentile(sortedValues, 0.75);
-                }
-
-                @Override
-                public int getLabelId() {
-                    return R.string.percentile_75;
-                }
-            }, new StatGen() {
-                @Override
-                public double getValue(double[] sortedValues) {
-                    return getStdDev(sortedValues);
-                }
-
-                @Override
-                public int getLabelId() {
-                    return R.string.std_dev;
-                }
-            }, new StatGen() {
-                @Override
-                public double getValue(double[] sortedValues) {
-                    return getMean(sortedValues);
-                }
-
-                @Override
-                public int getLabelId() {
-                    return R.string.mean;
-                }
-            },
-    };
-
-    public PlaybackGraphs() {
-        whiteLabels = new Paint();
-        whiteLabels.setColor(Color.WHITE);
-        whiteLabels.setTextSize(PlaybackView.TILE_SCALE / 3);
-    }
-
-    private ArrayList<ShapeDrawable> mShapes = new ArrayList<ShapeDrawable>();
-    protected final double[][] mStats = new double[Metrics.length][Stats.length];
-    protected HashMap<String, Double> mSingleStats;
-
-    private void gatherFrameMetric(int metricIndex, double metricValues[], RunData data) {
-        // create graph out of rectangles, one per frame
-        int lastBar = 0;
-        for (int frameIndex = 0; frameIndex < data.frames.length; frameIndex++) {
-            TileData frame[] = data.frames[frameIndex];
-            int newBar = (int)((frame[0].top + frame[0].bottom) * frame[0].scale / 2.0f);
-
-            MetricGen s = Metrics[metricIndex];
-            double absoluteValue = s.getValue(frame);
-            double relativeValue = absoluteValue / s.getMax();
-            relativeValue = Math.min(1,relativeValue);
-            relativeValue = Math.max(0,relativeValue);
-            int rightPos = (int) (-BAR_WIDTH * metricIndex);
-            int leftPos = (int) (-BAR_WIDTH * (metricIndex + relativeValue));
-
-            ShapeDrawable graphBar = new ShapeDrawable();
-            graphBar.getPaint().setColor(Color.BLUE);
-            graphBar.setBounds(leftPos, lastBar, rightPos, newBar);
-
-            mShapes.add(graphBar);
-            metricValues[frameIndex] = absoluteValue;
-            lastBar = newBar;
-        }
-    }
-
-    public void setData(RunData data) {
-        mShapes.clear();
-        double metricValues[] = new double[data.frames.length];
-
-        mSingleStats = data.singleStats;
-
-        if (data.frames.length == 0) {
-            return;
-        }
-
-        for (int metricIndex = 0; metricIndex < Metrics.length; metricIndex++) {
-            // calculate metric based on list of frames
-            gatherFrameMetric(metricIndex, metricValues, data);
-
-            // store aggregate statistics per metric (median, and similar)
-            Arrays.sort(metricValues);
-            for (int statIndex = 0; statIndex < Stats.length; statIndex++) {
-                mStats[metricIndex][statIndex] =
-                        Stats[statIndex].getValue(metricValues);
-            }
-        }
-    }
-
-    public void drawVerticalShiftedShapes(Canvas canvas,
-            ArrayList<ShapeDrawable> shapes) {
-        // Shapes drawn here are drawn relative to the viewRect
-        Rect viewRect = shapes.get(shapes.size() - 1).getBounds();
-        canvas.translate(0, 5 * PlaybackView.TILE_SCALE - viewRect.top);
-
-        for (ShapeDrawable shape : mShapes) {
-            shape.draw(canvas);
-        }
-        for (ShapeDrawable shape : shapes) {
-            shape.draw(canvas);
-        }
-    }
-
-    public void draw(Canvas canvas, ArrayList<ShapeDrawable> shapes,
-            ArrayList<String> strings, Resources resources) {
-        canvas.scale(CANVAS_SCALE, CANVAS_SCALE);
-
-        canvas.translate(BAR_WIDTH * Metrics.length, 0);
-
-        canvas.save();
-        drawVerticalShiftedShapes(canvas, shapes);
-        canvas.restore();
-
-        for (int metricIndex = 0; metricIndex < Metrics.length; metricIndex++) {
-            String label = resources.getString(
-                    Metrics[metricIndex].getLabelId());
-            int xPos = (metricIndex + 1) * -BAR_WIDTH;
-            int yPos = LABELOFFSET;
-            canvas.drawText(label, xPos, yPos, whiteLabels);
-            for (int statIndex = 0; statIndex < Stats.length; statIndex++) {
-                String statLabel = resources.getString(
-                        Stats[statIndex].getLabelId()).substring(0,3);
-                label = statLabel + " " + resources.getString(
-                        R.string.format_stat, mStats[metricIndex][statIndex]);
-                yPos = LABELOFFSET + (1 + statIndex) * PlaybackView.TILE_SCALE
-                        / 2;
-                canvas.drawText(label, xPos, yPos, whiteLabels);
-            }
-        }
-        for (int stringIndex = 0; stringIndex < strings.size(); stringIndex++) {
-            int yPos = LABELOFFSET + stringIndex * PlaybackView.TILE_SCALE / 2;
-            canvas.drawText(strings.get(stringIndex), 0, yPos, whiteLabels);
-        }
-    }
-}
diff --git a/tests/TileBenchmark/src/com/test/tilebenchmark/PlaybackView.java b/tests/TileBenchmark/src/com/test/tilebenchmark/PlaybackView.java
deleted file mode 100644
index 5459c1f..0000000
--- a/tests/TileBenchmark/src/com/test/tilebenchmark/PlaybackView.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * Copyright (C) 2011 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.test.tilebenchmark;
-
-import android.animation.ArgbEvaluator;
-import android.animation.ObjectAnimator;
-import android.animation.ValueAnimator;
-import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.drawable.ShapeDrawable;
-import android.util.AttributeSet;
-import android.view.GestureDetector;
-import android.view.GestureDetector.OnGestureListener;
-import android.view.MotionEvent;
-import android.view.View;
-
-import com.test.tilebenchmark.RunData.TileData;
-
-import java.util.ArrayList;
-
-public class PlaybackView extends View {
-    public static final int TILE_SCALE = 256;
-    private static final int INVAL_FLAG = -2;
-    private static final int INVAL_CYCLE = 250;
-
-    private Paint levelPaint = null, coordPaint = null, goldPaint = null;
-    private PlaybackGraphs mGraphs;
-
-    private ArrayList<ShapeDrawable> mTempShapes = new ArrayList<ShapeDrawable>();
-    private RunData mProfData = null;
-    private GestureDetector mGestureDetector = null;
-    private ArrayList<String> mRenderStrings = new ArrayList<String>();
-
-    private class TileDrawable extends ShapeDrawable {
-        TileData tile;
-        String label;
-
-        public TileDrawable(TileData t, int colorId) {
-            this.tile = t;
-            getPaint().setColor(getResources().getColor(colorId));
-            if (colorId == R.color.ready_tile
-                    || colorId == R.color.unready_tile) {
-
-                label = (int) (t.left / TILE_SCALE) + ", "
-                        + (int) (t.top / TILE_SCALE);
-                // ignore scale value for tiles
-                setBounds(t.left, t.top,
-                        t.right, t.bottom);
-            } else {
-                setBounds((int) (t.left * t.scale),
-                        (int) (t.top * t.scale),
-                        (int) (t.right * t.scale),
-                        (int) (t.bottom * t.scale));
-            }
-        }
-
-        @SuppressWarnings("unused")
-        public void setColor(int color) {
-            getPaint().setColor(color);
-        }
-
-        @Override
-        public void draw(Canvas canvas) {
-            super.draw(canvas);
-            if (label != null) {
-                canvas.drawText(Integer.toString(tile.level), getBounds().left,
-                        getBounds().bottom, levelPaint);
-                canvas.drawText(label, getBounds().left,
-                        ((getBounds().bottom + getBounds().top) / 2),
-                        coordPaint);
-            }
-        }
-    }
-
-    public PlaybackView(Context context) {
-        super(context);
-        init();
-    }
-
-    public PlaybackView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        init();
-    }
-
-    public PlaybackView(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-        init();
-    }
-
-    public void setOnGestureListener(OnGestureListener gl) {
-        mGestureDetector = new GestureDetector(getContext(), gl);
-    }
-
-    @Override
-    public boolean onTouchEvent(MotionEvent event) {
-        mGestureDetector.onTouchEvent(event);
-        return true;
-    }
-
-    private void init() {
-        levelPaint = new Paint();
-        levelPaint.setColor(Color.WHITE);
-        levelPaint.setTextSize(TILE_SCALE / 2);
-        coordPaint = new Paint();
-        coordPaint.setColor(Color.BLACK);
-        coordPaint.setTextSize(TILE_SCALE / 3);
-        goldPaint = new Paint();
-        goldPaint.setColor(0xffa0e010);
-        mGraphs = new PlaybackGraphs();
-    }
-
-    @Override
-    protected void onDraw(Canvas canvas) {
-        super.onDraw(canvas);
-
-        if (mTempShapes == null || mTempShapes.isEmpty()) {
-            return;
-        }
-
-        mGraphs.draw(canvas, mTempShapes, mRenderStrings, getResources());
-        invalidate(); // may have animations, force redraw
-    }
-
-    private String statString(int labelId, int value) {
-        return getResources().getString(R.string.format_stat_name,
-                getResources().getString(labelId), value);
-    }
-    private String tileString(int formatStringId, TileData t) {
-        return getResources().getString(formatStringId,
-                t.left, t.top, t.right, t.bottom);
-    }
-
-    public int setFrame(int frame) {
-        if (mProfData == null || mProfData.frames.length == 0) {
-            return 0;
-        }
-
-        int readyTiles = 0, unreadyTiles = 0, unplacedTiles = 0, numInvals = 0;
-        mTempShapes.clear();
-        mRenderStrings.clear();
-
-        // create tile shapes (as they're drawn on bottom)
-        for (TileData t : mProfData.frames[frame]) {
-            if (t == mProfData.frames[frame][0]){
-                // viewport 'tile', add coords to render strings
-                mRenderStrings.add(tileString(R.string.format_view_pos, t));
-            } else  if (t.level != INVAL_FLAG) {
-                int colorId;
-                if (t.isReady) {
-                    readyTiles++;
-                    colorId = R.color.ready_tile;
-                } else {
-                    unreadyTiles++;
-                    colorId = R.color.unready_tile;
-                }
-                if (t.left < 0 || t.top < 0) {
-                    unplacedTiles++;
-                }
-                mTempShapes.add(new TileDrawable(t, colorId));
-            } else {
-                // inval 'tile', count and add coords to render strings
-                numInvals++;
-                mRenderStrings.add(tileString(R.string.format_inval_pos, t));
-            }
-        }
-
-        // create invalidate shapes (drawn above tiles)
-        int invalId = 0;
-        for (TileData t : mProfData.frames[frame]) {
-            if (t.level == INVAL_FLAG && t != mProfData.frames[frame][0]) {
-                TileDrawable invalShape = new TileDrawable(t,
-                        R.color.inval_region_start);
-                ValueAnimator tileAnimator = ObjectAnimator.ofInt(invalShape,
-                        "color",
-                        getResources().getColor(R.color.inval_region_start),
-                        getResources().getColor(R.color.inval_region_stop));
-                tileAnimator.setDuration(numInvals * INVAL_CYCLE);
-                tileAnimator.setEvaluator(new ArgbEvaluator());
-                tileAnimator.setRepeatCount(ValueAnimator.INFINITE);
-                tileAnimator.setRepeatMode(ValueAnimator.RESTART);
-                float delay = (float) (invalId) * INVAL_CYCLE;
-                tileAnimator.setStartDelay((int) delay);
-                invalId++;
-                tileAnimator.start();
-
-                mTempShapes.add(invalShape);
-            }
-        }
-
-        mRenderStrings.add(statString(R.string.ready_tiles, readyTiles));
-        mRenderStrings.add(statString(R.string.unready_tiles, unreadyTiles));
-        mRenderStrings.add(statString(R.string.unplaced_tiles, unplacedTiles));
-        mRenderStrings.add(statString(R.string.number_invalidates, numInvals));
-
-        // draw view rect (using first TileData object, on top)
-        TileDrawable viewShape = new TileDrawable(mProfData.frames[frame][0],
-                R.color.view);
-        mTempShapes.add(viewShape);
-        this.invalidate();
-        return frame;
-    }
-
-    public void setData(RunData tileProfilingData) {
-        mProfData = tileProfilingData;
-
-        mGraphs.setData(mProfData);
-    }
-}
diff --git a/tests/TileBenchmark/src/com/test/tilebenchmark/ProfileActivity.java b/tests/TileBenchmark/src/com/test/tilebenchmark/ProfileActivity.java
deleted file mode 100644
index 2e77157..0000000
--- a/tests/TileBenchmark/src/com/test/tilebenchmark/ProfileActivity.java
+++ /dev/null
@@ -1,337 +0,0 @@
-/*
- * Copyright (C) 2011 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.test.tilebenchmark;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.os.CountDownTimer;
-import android.util.Log;
-import android.util.Pair;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.webkit.WebView;
-import android.webkit.WebViewClient;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemSelectedListener;
-import android.widget.ArrayAdapter;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.Spinner;
-import android.widget.TextView;
-import android.widget.TextView.OnEditorActionListener;
-import android.widget.ToggleButton;
-
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.ObjectOutputStream;
-
-/**
- * Interface for profiling the webview's scrolling, with simple controls on how
- * to scroll, and what content to load.
- */
-public class ProfileActivity extends Activity {
-
-    private static final int TIMED_RECORD_MILLIS = 2000;
-
-    public interface ProfileCallback {
-        public void profileCallback(RunData data);
-    }
-
-    public static final String TEMP_FILENAME = "profile.tiles";
-
-    Button mInspectButton;
-    ToggleButton mCaptureButton;
-    Spinner mVelocitySpinner;
-    Spinner mMovementSpinner;
-    EditText mUrl;
-    ProfiledWebView mWeb;
-    ProfileCallback mCallback;
-
-    LoggingWebViewClient mLoggingWebViewClient = new LoggingWebViewClient();
-    AutoLoggingWebViewClient mAutoLoggingWebViewClient = new AutoLoggingWebViewClient();
-    TimedLoggingWebViewClient mTimedLoggingWebViewClient = new TimedLoggingWebViewClient();
-
-    private enum TestingState {
-        NOT_TESTING,
-        PRE_TESTING,
-        START_TESTING,
-        STOP_TESTING,
-        SAVED_TESTING
-    };
-
-    private class VelocitySelectedListener implements OnItemSelectedListener {
-        @Override
-        public void onItemSelected(AdapterView<?> parent, View view,
-                int position, long id) {
-            String speedStr = parent.getItemAtPosition(position).toString();
-            int speedInt = Integer.parseInt(speedStr);
-            mWeb.setAutoScrollSpeed(speedInt);
-        }
-
-        @Override
-        public void onNothingSelected(AdapterView<?> parent) {
-        }
-    }
-
-    private class MovementSelectedListener implements OnItemSelectedListener {
-        @Override
-        public void onItemSelected(AdapterView<?> parent, View view,
-                int position, long id) {
-            String movementStr = parent.getItemAtPosition(position).toString();
-            if (movementStr == getResources().getString(R.string.movement_auto_scroll)) {
-                mWeb.setWebViewClient(mAutoLoggingWebViewClient);
-                mCaptureButton.setEnabled(false);
-                mVelocitySpinner.setEnabled(true);
-            } else if (movementStr == getResources().getString(R.string.movement_manual)) {
-                mWeb.setWebViewClient(mLoggingWebViewClient);
-                mCaptureButton.setEnabled(true);
-                mVelocitySpinner.setEnabled(false);
-            } else if (movementStr == getResources().getString(R.string.movement_timed)) {
-                mWeb.setWebViewClient(mTimedLoggingWebViewClient);
-                mCaptureButton.setEnabled(false);
-                mVelocitySpinner.setEnabled(false);
-            }
-        }
-
-        @Override
-        public void onNothingSelected(AdapterView<?> parent) {
-        }
-    }
-
-    private class LoggingWebViewClient extends WebViewClient {
-        @Override
-        public boolean shouldOverrideUrlLoading(WebView view, String url) {
-            return false;
-        }
-
-        @Override
-        public void onPageStarted(WebView view, String url, Bitmap favicon) {
-            super.onPageStarted(view, url, favicon);
-            mUrl.setText(url);
-        }
-
-        @Override
-        public void onPageFinished(WebView view, String url) {
-            super.onPageFinished(view, url);
-            view.requestFocus();
-            ((ProfiledWebView)view).onPageFinished();
-        }
-    }
-
-    private class AutoLoggingWebViewClient extends LoggingWebViewClient {
-        @Override
-        public void onPageFinished(WebView view, String url) {
-            super.onPageFinished(view, url);
-            startViewProfiling(true);
-        }
-
-        @Override
-        public void onPageStarted(WebView view, String url, Bitmap favicon) {
-            super.onPageStarted(view, url, favicon);
-            setTestingState(TestingState.PRE_TESTING);
-        }
-    }
-
-    private class TimedLoggingWebViewClient extends LoggingWebViewClient {
-        @Override
-        public void onPageFinished(WebView view, String url) {
-            super.onPageFinished(view, url);
-            startViewProfiling(false);
-
-            // after a fixed time after page finished, stop testing
-            new CountDownTimer(TIMED_RECORD_MILLIS, TIMED_RECORD_MILLIS) {
-                @Override
-                public void onTick(long millisUntilFinished) {
-                }
-
-                @Override
-                public void onFinish() {
-                    mWeb.stopScrollTest();
-                }
-            }.start();
-        }
-
-        @Override
-        public void onPageStarted(WebView view, String url, Bitmap favicon) {
-            super.onPageStarted(view, url, favicon);
-            setTestingState(TestingState.PRE_TESTING);
-        }
-    }
-
-    private class StoreFileTask extends
-            AsyncTask<Pair<String, RunData>, Void, Void> {
-
-        @Override
-        protected Void doInBackground(Pair<String, RunData>... params) {
-            try {
-                FileOutputStream fos = openFileOutput(params[0].first,
-                        Context.MODE_PRIVATE);
-                ObjectOutputStream out = new ObjectOutputStream(fos);
-                out.writeObject(params[0].second);
-                out.close();
-            } catch (IOException ex) {
-                ex.printStackTrace();
-            }
-            return null;
-        }
-
-        @Override
-        protected void onPostExecute(Void v) {
-            setTestingState(TestingState.SAVED_TESTING);
-        }
-    }
-
-    public void setTestingState(TestingState state) {
-        switch (state) {
-            case NOT_TESTING:
-                mUrl.setBackgroundResource(R.color.background_not_testing);
-                mInspectButton.setEnabled(true);
-                mMovementSpinner.setEnabled(true);
-                break;
-            case PRE_TESTING:
-                mInspectButton.setEnabled(false);
-                mMovementSpinner.setEnabled(false);
-                break;
-            case START_TESTING:
-                mCaptureButton.setChecked(true);
-                mUrl.setBackgroundResource(R.color.background_start_testing);
-                mInspectButton.setEnabled(false);
-                mMovementSpinner.setEnabled(false);
-                break;
-            case STOP_TESTING:
-                mCaptureButton.setChecked(false);
-                mUrl.setBackgroundResource(R.color.background_stop_testing);
-                break;
-            case SAVED_TESTING:
-                mInspectButton.setEnabled(true);
-                mMovementSpinner.setEnabled(true);
-                break;
-        }
-    }
-
-    /** auto - automatically scroll. */
-    private void startViewProfiling(boolean auto) {
-        // toggle capture button to indicate capture state to user
-        mWeb.startScrollTest(mCallback, auto);
-        setTestingState(TestingState.START_TESTING);
-    }
-
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
-        mInspectButton = (Button) findViewById(R.id.inspect);
-        mCaptureButton = (ToggleButton) findViewById(R.id.capture);
-        mVelocitySpinner = (Spinner) findViewById(R.id.velocity);
-        mMovementSpinner = (Spinner) findViewById(R.id.movement);
-        mUrl = (EditText) findViewById(R.id.url);
-        mWeb = (ProfiledWebView) findViewById(R.id.web);
-        setCallback(new ProfileCallback() {
-            @SuppressWarnings("unchecked")
-            @Override
-            public void profileCallback(RunData data) {
-                new StoreFileTask().execute(new Pair<String, RunData>(
-                        TEMP_FILENAME, data));
-                Log.d("ProfileActivity", "stored " + data.frames.length + " frames in file");
-                setTestingState(TestingState.STOP_TESTING);
-            }
-        });
-
-        // Inspect button (opens PlaybackActivity)
-        mInspectButton.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                startActivity(new Intent(ProfileActivity.this,
-                        PlaybackActivity.class));
-            }
-        });
-
-        // Velocity spinner
-        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
-                this, R.array.velocity_array,
-                android.R.layout.simple_spinner_item);
-        adapter.setDropDownViewResource(
-                android.R.layout.simple_spinner_dropdown_item);
-        mVelocitySpinner.setAdapter(adapter);
-        mVelocitySpinner.setOnItemSelectedListener(
-                new VelocitySelectedListener());
-        mVelocitySpinner.setSelection(3);
-
-        // Movement spinner
-        String content[] = {
-                getResources().getString(R.string.movement_auto_scroll),
-                getResources().getString(R.string.movement_manual),
-                getResources().getString(R.string.movement_timed)
-        };
-        adapter = new ArrayAdapter<CharSequence>(this,
-                android.R.layout.simple_spinner_item, content);
-        adapter.setDropDownViewResource(
-                android.R.layout.simple_spinner_dropdown_item);
-        mMovementSpinner.setAdapter(adapter);
-        mMovementSpinner.setOnItemSelectedListener(
-                new MovementSelectedListener());
-        mMovementSpinner.setSelection(0);
-
-        // Capture toggle button
-        mCaptureButton.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                if (mCaptureButton.isChecked()) {
-                    startViewProfiling(false);
-                } else {
-                    mWeb.stopScrollTest();
-                }
-            }
-        });
-
-        // Custom profiling WebView
-        mWeb.init(this);
-        mWeb.setWebViewClient(new LoggingWebViewClient());
-
-        // URL text entry
-        mUrl.setOnEditorActionListener(new OnEditorActionListener() {
-            public boolean onEditorAction(TextView v, int actionId,
-                    KeyEvent event) {
-                String url = mUrl.getText().toString();
-                mWeb.loadUrl(url);
-                mWeb.requestFocus();
-                return true;
-            }
-        });
-
-        setTestingState(TestingState.NOT_TESTING);
-    }
-
-    public void setCallback(ProfileCallback callback) {
-        mCallback = callback;
-    }
-
-    @Override
-    public boolean onKeyDown(int keyCode, KeyEvent event) {
-        if ((keyCode == KeyEvent.KEYCODE_BACK) && mWeb.canGoBack()) {
-            mWeb.goBack();
-            return true;
-        }
-        return super.onKeyDown(keyCode, event);
-    }
-}
diff --git a/tests/TileBenchmark/src/com/test/tilebenchmark/ProfiledWebView.java b/tests/TileBenchmark/src/com/test/tilebenchmark/ProfiledWebView.java
deleted file mode 100644
index d3b572c..0000000
--- a/tests/TileBenchmark/src/com/test/tilebenchmark/ProfiledWebView.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- * Copyright (C) 2011 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.test.tilebenchmark;
-
-import android.content.Context;
-import android.os.CountDownTimer;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.webkit.WebSettingsClassic;
-import android.webkit.WebView;
-import android.webkit.WebViewClassic;
-
-import java.util.ArrayList;
-
-import com.test.tilebenchmark.ProfileActivity.ProfileCallback;
-import com.test.tilebenchmark.RunData.TileData;
-
-public class ProfiledWebView extends WebView implements WebViewClassic.PageSwapDelegate {
-    private static final String LOGTAG = "ProfiledWebView";
-
-    private int mSpeed;
-
-    private boolean mIsTesting = false;
-    private boolean mIsScrolling = false;
-    private ProfileCallback mCallback;
-    private long mContentInvalMillis;
-    private static final int LOAD_STALL_MILLIS = 2000; // nr of millis after load,
-                                                       // before test is forced
-
-    // ignore anim end events until this many millis after load
-    private static final long ANIM_SAFETY_THRESHOLD = 200;
-    private long mLoadTime;
-    private long mAnimationTime;
-
-    public ProfiledWebView(Context context) {
-        super(context);
-    }
-
-    public ProfiledWebView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public ProfiledWebView(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-    }
-
-    public ProfiledWebView(Context context, AttributeSet attrs, int defStyle,
-            boolean privateBrowsing) {
-        super(context, attrs, defStyle, privateBrowsing);
-    }
-
-    private class JavaScriptInterface {
-        Context mContext;
-
-        /** Instantiate the interface and set the context */
-        JavaScriptInterface(Context c) {
-            mContext = c;
-        }
-
-        public void animationComplete() {
-            mAnimationTime = System.currentTimeMillis();
-        }
-    }
-
-    public void init(Context c) {
-        WebSettingsClassic settings = getWebViewClassic().getSettings();
-        settings.setJavaScriptEnabled(true);
-        settings.setSupportZoom(true);
-        settings.setEnableSmoothTransition(true);
-        settings.setBuiltInZoomControls(true);
-        settings.setLoadWithOverviewMode(true);
-        settings.setProperty("use_minimal_memory", "false"); // prefetch tiles, as browser does
-        addJavascriptInterface(new JavaScriptInterface(c), "Android");
-        mAnimationTime = 0;
-        mLoadTime = 0;
-    }
-
-    public void setUseMinimalMemory(boolean minimal) {
-        WebSettingsClassic settings = getWebViewClassic().getSettings();
-        settings.setProperty("use_minimal_memory", minimal ? "true" : "false");
-    }
-
-    public void onPageFinished() {
-        mLoadTime = System.currentTimeMillis();
-    }
-
-    @Override
-    protected void onDraw(android.graphics.Canvas canvas) {
-        if (mIsTesting && mIsScrolling) {
-            if (canScrollVertically(1)) {
-                scrollBy(0, mSpeed);
-            } else {
-                stopScrollTest();
-                mIsScrolling = false;
-            }
-        }
-        super.onDraw(canvas);
-    }
-
-    /*
-     * Called once the page is loaded to start scrolling for evaluating tiles.
-     * If autoScrolling isn't set, stop must be called manually. Before
-     * scrolling, invalidate all content and redraw it, measuring time taken.
-     */
-    public void startScrollTest(ProfileCallback callback, boolean autoScrolling) {
-        mCallback = callback;
-        mIsTesting = false;
-        mIsScrolling = false;
-        WebSettingsClassic settings = getWebViewClassic().getSettings();
-        settings.setProperty("tree_updates", "0");
-
-
-        if (autoScrolling) {
-            // after a while, force it to start even if the pages haven't swapped
-            new CountDownTimer(LOAD_STALL_MILLIS, LOAD_STALL_MILLIS) {
-                @Override
-                public void onTick(long millisUntilFinished) {
-                }
-
-                @Override
-                public void onFinish() {
-                    // invalidate all content, and kick off redraw
-                    Log.d("ProfiledWebView",
-                            "kicking off test with callback registration, and tile discard...");
-                    getWebViewClassic().discardAllTextures();
-                    invalidate();
-                    mIsScrolling = true;
-                    mContentInvalMillis = System.currentTimeMillis();
-                }
-            }.start();
-        } else {
-            mIsTesting = true;
-            getWebViewClassic().tileProfilingStart();
-        }
-    }
-
-    /*
-     * Called after the manual contentInvalidateAll, after the tiles have all
-     * been redrawn.
-     * From PageSwapDelegate.
-     */
-    @Override
-    public void onPageSwapOccurred(boolean startAnim) {
-        if (!mIsTesting && mIsScrolling) {
-            // kick off testing
-            mContentInvalMillis = System.currentTimeMillis() - mContentInvalMillis;
-            Log.d("ProfiledWebView", "REDRAW TOOK " + mContentInvalMillis + "millis");
-            mIsTesting = true;
-            invalidate(); // ensure a redraw so that auto-scrolling can occur
-            getWebViewClassic().tileProfilingStart();
-        }
-    }
-
-    private double animFramerate() {
-        WebSettingsClassic settings = getWebViewClassic().getSettings();
-        String updatesString = settings.getProperty("tree_updates");
-        int updates = (updatesString == null) ? -1 : Integer.parseInt(updatesString);
-
-        long animationTime;
-        if (mAnimationTime == 0 || mAnimationTime - mLoadTime < ANIM_SAFETY_THRESHOLD) {
-            animationTime = System.currentTimeMillis() - mLoadTime;
-        } else {
-            animationTime = mAnimationTime - mLoadTime;
-        }
-
-        return updates * 1000.0 / animationTime;
-    }
-
-    public void setDoubleBuffering(boolean useDoubleBuffering) {
-        WebSettingsClassic settings = getWebViewClassic().getSettings();
-        settings.setProperty("use_double_buffering", useDoubleBuffering ? "true" : "false");
-    }
-
-    /*
-     * Called once the page has stopped scrolling
-     */
-    public void stopScrollTest() {
-        getWebViewClassic().tileProfilingStop();
-        mIsTesting = false;
-
-        if (mCallback == null) {
-            getWebViewClassic().tileProfilingClear();
-            return;
-        }
-
-        RunData data = new RunData(getWebViewClassic().tileProfilingNumFrames());
-        // record the time spent (before scrolling) rendering the page
-        data.singleStats.put(getResources().getString(R.string.render_millis),
-                (double)mContentInvalMillis);
-
-        // record framerate
-        double framerate = animFramerate();
-        Log.d(LOGTAG, "anim framerate was "+framerate);
-        data.singleStats.put(getResources().getString(R.string.animation_framerate),
-                framerate);
-
-        for (int frame = 0; frame < data.frames.length; frame++) {
-            data.frames[frame] = new TileData[
-                    getWebViewClassic().tileProfilingNumTilesInFrame(frame)];
-            for (int tile = 0; tile < data.frames[frame].length; tile++) {
-                int left = getWebViewClassic().tileProfilingGetInt(frame, tile, "left");
-                int top = getWebViewClassic().tileProfilingGetInt(frame, tile, "top");
-                int right = getWebViewClassic().tileProfilingGetInt(frame, tile, "right");
-                int bottom = getWebViewClassic().tileProfilingGetInt(frame, tile, "bottom");
-
-                boolean isReady = getWebViewClassic().tileProfilingGetInt(
-                        frame, tile, "isReady") == 1;
-                int level = getWebViewClassic().tileProfilingGetInt(frame, tile, "level");
-
-                float scale = getWebViewClassic().tileProfilingGetFloat(frame, tile, "scale");
-
-                data.frames[frame][tile] = data.new TileData(left, top, right, bottom,
-                        isReady, level, scale);
-            }
-        }
-        getWebViewClassic().tileProfilingClear();
-
-        mCallback.profileCallback(data);
-    }
-
-    @Override
-    public void loadUrl(String url) {
-        mAnimationTime = 0;
-        mLoadTime = 0;
-        if (!url.startsWith("http://") && !url.startsWith("file://")) {
-            url = "http://" + url;
-        }
-        super.loadUrl(url);
-    }
-
-    public void setAutoScrollSpeed(int speedInt) {
-        mSpeed = speedInt;
-    }
-
-    public WebViewClassic getWebViewClassic() {
-        return WebViewClassic.fromWebView(this);
-    }
-}
diff --git a/tests/TileBenchmark/src/com/test/tilebenchmark/RunData.java b/tests/TileBenchmark/src/com/test/tilebenchmark/RunData.java
deleted file mode 100644
index 5e48afd..0000000
--- a/tests/TileBenchmark/src/com/test/tilebenchmark/RunData.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2011 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.test.tilebenchmark;
-
-import java.io.Serializable;
-import java.util.HashMap;
-
-public class RunData implements Serializable {
-    public TileData[][] frames;
-    public HashMap<String, Double> singleStats = new HashMap<String, Double>();
-
-    public RunData(int frames) {
-        this.frames = new TileData[frames][];
-    }
-
-    public class TileData implements Serializable {
-        public int left, top, right, bottom;
-        public boolean isReady;
-        public int level;
-        public float scale;
-
-        public TileData(int left, int top, int right, int bottom,
-                boolean isReady, int level, float scale) {
-            this.left = left;
-            this.right = right;
-            this.top = top;
-            this.bottom = bottom;
-            this.isReady = isReady;
-            this.level = level;
-            this.scale = scale;
-        }
-
-        public String toString() {
-            return "Tile (" + left + "," + top + ")->("
-                    + right + "," + bottom + ")"
-                    + (isReady ? "ready" : "NOTready") + " at scale " + scale;
-        }
-    }
-
-}
diff --git a/wifi/java/android/net/wifi/WifiNative.java b/wifi/java/android/net/wifi/WifiNative.java
index 53c00d8..f86a51c9 100644
--- a/wifi/java/android/net/wifi/WifiNative.java
+++ b/wifi/java/android/net/wifi/WifiNative.java
@@ -48,6 +48,10 @@
     static final int SCAN_WITHOUT_CONNECTION_SETUP          = 1;
     static final int SCAN_WITH_CONNECTION_SETUP             = 2;
 
+    // Hold this lock before calling supplicant - it is required to
+    // mutually exclude access from Wifi and P2p state machines
+    static final Object mLock = new Object();
+
     public final String mInterfaceName;
     public final String mInterfacePrefix;
 
@@ -92,18 +96,17 @@
         }
     }
 
-
     private static final LocalLog mLocalLog = new LocalLog(1024);
+
+    // hold mLock before accessing mCmdIdLock
     private int mCmdId;
 
     public LocalLog getLocalLog() {
         return mLocalLog;
     }
 
-    private int getNewCmdId() {
-        synchronized (mLocalLog) {
-            return mCmdId++;
-        }
+    private int getNewCmdIdLocked() {
+        return mCmdId++;
     }
 
     private void localLog(String s) {
@@ -112,6 +115,7 @@
     }
 
     public boolean connectToSupplicant() {
+        // No synchronization necessary .. it is implemented in WifiMonitor
         localLog(mInterfacePrefix + "connectToSupplicant");
         return connectToSupplicantNative();
     }
@@ -122,39 +126,48 @@
     }
 
     public String waitForEvent() {
+        // No synchronization necessary .. it is implemented in WifiMonitor
         return waitForEventNative();
     }
 
     private boolean doBooleanCommand(String command) {
         if (DBG) Log.d(mTAG, "doBoolean: " + command);
-        int cmdId = getNewCmdId();
-        localLog(cmdId + "->" + mInterfacePrefix + command);
-        boolean result = doBooleanCommandNative(mInterfacePrefix + command);
-        localLog(cmdId + "<-" + result);
-        return result;
+        synchronized (mLock) {
+            int cmdId = getNewCmdIdLocked();
+            localLog(cmdId + "->" + mInterfacePrefix + command);
+            boolean result = doBooleanCommandNative(mInterfacePrefix + command);
+            localLog(cmdId + "<-" + result);
+            return result;
+        }
     }
 
     private int doIntCommand(String command) {
         if (DBG) Log.d(mTAG, "doInt: " + command);
-        int cmdId = getNewCmdId();
-        localLog(cmdId + "->" + mInterfacePrefix + command);
-        int result = doIntCommandNative(mInterfacePrefix + command);
-        localLog(cmdId + "<-" + result);
-        return result;
+        synchronized (mLock) {
+            int cmdId = getNewCmdIdLocked();
+            localLog(cmdId + "->" + mInterfacePrefix + command);
+            int result = doIntCommandNative(mInterfacePrefix + command);
+            localLog(cmdId + "<-" + result);
+            return result;
+        }
     }
 
     private String doStringCommand(String command) {
         if (DBG) Log.d(mTAG, "doString: " + command);
-        int cmdId = getNewCmdId();
-        localLog(cmdId + "->" + mInterfacePrefix + command);
-        String result = doStringCommandNative(mInterfacePrefix + command);
-        localLog(cmdId + "<-" + result);
-        return result;
+        synchronized (mLock) {
+            int cmdId = getNewCmdIdLocked();
+            localLog(cmdId + "->" + mInterfacePrefix + command);
+            String result = doStringCommandNative(mInterfacePrefix + command);
+            localLog(cmdId + "<-" + result);
+            return result;
+        }
     }
 
     private String doStringCommandWithoutLogging(String command) {
         if (DBG) Log.d(mTAG, "doString: " + command);
-        return doStringCommandNative(mInterfacePrefix + command);
+        synchronized (mLock) {
+            return doStringCommandNative(mInterfacePrefix + command);
+        }
     }
 
     public boolean ping() {
@@ -499,10 +512,12 @@
     }
 
     public boolean startWpsPbc(String iface, String bssid) {
-        if (TextUtils.isEmpty(bssid)) {
-            return doBooleanCommandNative("IFNAME=" + iface + " WPS_PBC");
-        } else {
-            return doBooleanCommandNative("IFNAME=" + iface + " WPS_PBC " + bssid);
+        synchronized (mLock) {
+            if (TextUtils.isEmpty(bssid)) {
+                return doBooleanCommandNative("IFNAME=" + iface + " WPS_PBC");
+            } else {
+                return doBooleanCommandNative("IFNAME=" + iface + " WPS_PBC " + bssid);
+            }
         }
     }
 
@@ -513,7 +528,9 @@
 
     public boolean startWpsPinKeypad(String iface, String pin) {
         if (TextUtils.isEmpty(pin)) return false;
-        return doBooleanCommandNative("IFNAME=" + iface + " WPS_PIN any " + pin);
+        synchronized (mLock) {
+            return doBooleanCommandNative("IFNAME=" + iface + " WPS_PIN any " + pin);
+        }
     }
 
 
@@ -526,10 +543,12 @@
     }
 
     public String startWpsPinDisplay(String iface, String bssid) {
-        if (TextUtils.isEmpty(bssid)) {
-            return doStringCommandNative("IFNAME=" + iface + " WPS_PIN any");
-        } else {
-            return doStringCommandNative("IFNAME=" + iface + " WPS_PIN " + bssid);
+        synchronized (mLock) {
+            if (TextUtils.isEmpty(bssid)) {
+                return doStringCommandNative("IFNAME=" + iface + " WPS_PIN any");
+            } else {
+                return doStringCommandNative("IFNAME=" + iface + " WPS_PIN " + bssid);
+            }
         }
     }
 
@@ -581,7 +600,9 @@
     }
 
     public boolean setP2pGroupIdle(String iface, int time) {
-        return doBooleanCommandNative("IFNAME=" + iface + " SET p2p_group_idle " + time);
+        synchronized (mLock) {
+            return doBooleanCommandNative("IFNAME=" + iface + " SET p2p_group_idle " + time);
+        }
     }
 
     public void setPowerSave(boolean enabled) {
@@ -593,10 +614,12 @@
     }
 
     public boolean setP2pPowerSave(String iface, boolean enabled) {
-        if (enabled) {
-            return doBooleanCommandNative("IFNAME=" + iface + " P2P_SET ps 1");
-        } else {
-            return doBooleanCommandNative("IFNAME=" + iface + " P2P_SET ps 0");
+        synchronized (mLock) {
+            if (enabled) {
+                return doBooleanCommandNative("IFNAME=" + iface + " P2P_SET ps 1");
+            } else {
+                return doBooleanCommandNative("IFNAME=" + iface + " P2P_SET ps 0");
+            }
         }
     }
 
@@ -765,7 +788,9 @@
 
     public boolean p2pGroupRemove(String iface) {
         if (TextUtils.isEmpty(iface)) return false;
-        return doBooleanCommandNative("IFNAME=" + iface + " P2P_GROUP_REMOVE " + iface);
+        synchronized (mLock) {
+            return doBooleanCommandNative("IFNAME=" + iface + " P2P_GROUP_REMOVE " + iface);
+        }
     }
 
     public boolean p2pReject(String deviceAddress) {