diff options
437 files changed, 5417 insertions, 25798 deletions
diff --git a/api/current.txt b/api/current.txt index e4d8b76..c0455fc 100644 --- a/api/current.txt +++ b/api/current.txt @@ -5736,7 +5736,6 @@ package android.content { 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 +5956,7 @@ package android.content { 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 +6715,7 @@ package android.content { 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 +6836,6 @@ package android.content { 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 +6843,15 @@ package android.content { 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 +6878,6 @@ package android.content { 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); @@ -13199,6 +13187,7 @@ package android.media { 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); @@ -13211,6 +13200,7 @@ package android.media { 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 @@ -13225,18 +13215,32 @@ package android.media { } 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); } @@ -15260,12 +15264,12 @@ package android.nfc { 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"; @@ -15285,15 +15289,15 @@ package android.nfc.cardemulation { 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"; } } @@ -20827,67 +20831,70 @@ package android.provider { } 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.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.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.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; @@ -20895,10 +20902,11 @@ package android.provider { 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[]); } @@ -21253,6 +21261,7 @@ package android.provider { 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"; @@ -22584,8 +22593,11 @@ package android.security { } 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(); @@ -22596,9 +22608,12 @@ package android.security { 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); @@ -25748,7 +25763,7 @@ package android.util { 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 @@ -28963,15 +28978,15 @@ package android.view.accessibility { } 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 @@ -28982,6 +28997,14 @@ package android.view.accessibility { 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.ContextThemeWrapper; 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 @@ class ContextImpl extends Context { 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 abstract class ContentResolver { 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 @@ public abstract class ContentResolver { new SyncRequest.Builder() .setSyncAdapter(account, authority) .setExtras(extras) - .syncOnce(0, 0) // Immediate sync. + .syncOnce() .build(); requestSync(request); } @@ -1677,6 +1677,9 @@ public abstract class ContentResolver { /** * 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 @@ public abstract class ContentResolver { * {@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 @@ public abstract class ContentResolver { } /** - * 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 @@ public abstract class Context { /** * 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 class PeriodicSync implements Parcelable { 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 class PeriodicSync implements Parcelable { 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 @@ public class PeriodicSync implements Parcelable { @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 @@ public class PeriodicSync implements Parcelable { 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 class PeriodicSync implements Parcelable { 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.accounts.Account; 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 @@ public class SyncRequest implements Parcelable { 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 @@ public class SyncRequest implements Parcelable { /** * {@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 class SyncRequest implements Parcelable { public long getSyncFlexTime() { return mSyncFlexTimeSecs; } + /** * {@hide} * @return the last point in time at which this sync must scheduled. @@ -159,7 +162,7 @@ public class SyncRequest implements Parcelable { 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 @@ public class SyncRequest implements Parcelable { 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 @@ public class SyncRequest implements Parcelable { // 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 @@ public class SyncRequest implements Parcelable { 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 @@ public class SyncRequest implements Parcelable { /** 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 @@ public class SyncRequest implements Parcelable { 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 @@ public class SyncRequest implements Parcelable { } /** - * 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 @@ public class SyncRequest implements Parcelable { } /** + * {@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 @@ public class SyncRequest implements Parcelable { } /** - * @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 @@ public class SyncRequest implements Parcelable { } /** - * 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 @@ public class SyncRequest implements Parcelable { * 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 @@ public class SyncRequest implements Parcelable { /** * 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 @@ public class SyncRequest implements Parcelable { /** * 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 @@ public class SyncRequest implements Parcelable { /** * 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 @@ public class SyncRequest implements Parcelable { } /** - * 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 @@ public class SyncRequest implements Parcelable { } /** + * {@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 @@ public class SyncRequest implements Parcelable { * 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 @@ public class SyncRequest implements Parcelable { // 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> - * <service ndroid:name=".MyAnonymousSyncService" android:permission="android.permission.SYNC" /> - * </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 @@ public class DdmHandleProfiling extends ChunkHandler { * 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 @@ public final class ApduServiceInfo implements Parcelable { 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 @@ public final class ApduServiceInfo implements Parcelable { 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 android.util.Log; 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..1bb2ea4 100644 --- a/core/java/android/nfc/cardemulation/HostApduService.java +++ b/core/java/android/nfc/cardemulation/HostApduService.java @@ -40,13 +40,31 @@ public abstract class HostApduService extends Service { */ @SdkConstant(SdkConstantType.SERVICE_ACTION) public static final String SERVICE_INTERFACE = + "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.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 SERVICE_META_DATA = "android.nfc.HostApduService"; + public static final String OLD_SERVICE_META_DATA = "android.nfc.HostApduService"; /** * Reason for {@link #onDeactivated(int)}. 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 @@ public abstract class OffHostApduService extends Service { */ @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 @@ href="{@docRoot}guide/developing/tools/traceview.html">Traceview: A Graphical Lo } /** - * 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/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 @@ package android.provider; 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.database.Cursor; 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 @@ import java.util.List; 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,279 +74,297 @@ public final class DocumentsContract { /** {@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. + * 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 MIME_TYPE_DIR = "vnd.android.doc/dir"; + public static final String COLUMN_DOCUMENT_ID = "document_id"; /** - * Flag indicating that a document is a directory that supports creation of - * new files within it. + * 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 DocumentColumns#FLAGS + * @see #MIME_TYPE_DIR */ - public static final int FLAG_SUPPORTS_CREATE = 1; + public static final String COLUMN_MIME_TYPE = "mime_type"; /** - * Flag indicating that a document is renamable. + * 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. A + * {@link DocumentsProvider} can update this field using events from + * {@link OnCloseListener} or other reliable + * {@link ParcelFileDescriptor} transports. + * <p> + * Type: INTEGER (long) * - * @see DocumentColumns#FLAGS + * @see System#currentTimeMillis() */ - public static final int FLAG_SUPPORTS_RENAME = 1 << 1; + public static final String COLUMN_LAST_MODIFIED = "last_modified"; /** - * Flag indicating that a document is deletable. + * 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 COLUMN_ICON = "icon"; + + /** + * Flags that apply to a document. + * <p> + * Type: INTEGER (int) * - * @see DocumentColumns#FLAGS + * @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 int FLAG_SUPPORTS_DELETE = 1 << 2; + public static final String COLUMN_FLAGS = "flags"; /** - * Flag indicating that a document can be represented as a thumbnail. + * 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 DocumentColumns#FLAGS + * @see #COLUMN_MIME_TYPE */ - public static final int FLAG_SUPPORTS_THUMBNAIL = 1 << 3; + public static final String MIME_TYPE_DIR = "vnd.android.document/directory"; /** - * Flag indicating that a document is a directory that supports search. + * Flag indicating that a document can be represented as a thumbnail. * - * @see DocumentColumns#FLAGS + * @see #COLUMN_FLAGS + * @see DocumentsContract#getDocumentThumbnail(ContentResolver, Uri, + * Point, CancellationSignal) + * @see DocumentsProvider#openDocumentThumbnail(String, Point, + * android.os.CancellationSignal) */ - public static final int FLAG_SUPPORTS_SEARCH = 1 << 4; + 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 DocumentColumns#FLAGS + * @see #COLUMN_FLAGS */ - public static final int FLAG_SUPPORTS_WRITE = 1 << 5; + public static final int FLAG_SUPPORTS_WRITE = 1 << 1; /** - * 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. + * Flag indicating that a document is deletable. * - * @see DocumentColumns#FLAGS + * @see #COLUMN_FLAGS + * @see DocumentsContract#deleteDocument(ContentResolver, Uri) + * @see DocumentsProvider#deleteDocument(String) */ - 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"; + public static final int FLAG_SUPPORTS_DELETE = 1 << 2; - /** - * 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(); - } + /** + * 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; - /** - * 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(); - } + /** + * 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; - /** - * 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(); + /** + * 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; } /** - * Extract the {@link DocumentColumns#DOC_ID} from the given Uri. + * 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 static String getDocId(Uri documentUri) { - final List<String> paths = documentUri.getPathSegments(); - if (paths.size() < 2) { - throw new IllegalArgumentException("Not a document: " + documentUri); + public final static class Root { + private Root() { } - 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 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 DOC_ID = "doc_id"; + public static final String COLUMN_ROOT_ID = "root_id"; /** - * MIME type of a document. + * Type of a root, used for clustering when presenting multiple roots to + * a user. * <p> - * Type: STRING + * Type: INTEGER (int) * - * @see Documents#MIME_TYPE_DIR + * @see #ROOT_TYPE_SERVICE + * @see #ROOT_TYPE_SHORTCUT + * @see #ROOT_TYPE_DEVICE */ - public static final String MIME_TYPE = "mime_type"; + public static final String COLUMN_ROOT_TYPE = "root_type"; /** - * 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 - * {@link OnCloseListener} or other reliable - * {@link ParcelFileDescriptor} transports. + * Flags that apply to a root. * <p> - * Type: INTEGER (long) + * Type: INTEGER (int) * - * @see System#currentTimeMillis() + * @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 LAST_MODIFIED = "last_modified"; + public static final String COLUMN_FLAGS = "flags"; /** - * Specific icon resource for a document, or {@code null} to resolve - * default using {@link #MIME_TYPE}. + * Icon resource ID for a root. * <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. + * Title for a root, which will be shown to a user. * <p> * Type: STRING */ - public static final String SUMMARY = "summary"; + public static final String COLUMN_TITLE = "title"; /** - * Flags that apply to a specific document. + * Summary for this root, which may be shown to a user. The summary may + * be {@code null}. * <p> - * Type: INTEGER (int) + * Type: STRING */ - public static final String FLAGS = "flags"; - } + public static final String COLUMN_SUMMARY = "summary"; - /** - * Metadata about a specific root of documents. - */ - public final static class DocumentRoot implements Parcelable { /** - * Root that represents a storage service, such as a cloud-based - * service. + * Document which is a directory that represents the top directory of + * this root. + * <p> + * Type: STRING * - * @see #rootType + * @see Document#COLUMN_DOCUMENT_ID */ - public static final int ROOT_TYPE_SERVICE = 1; + 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"; /** - * Root that represents a shortcut to content that may be available - * elsewhere through another storage root. + * 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_SHORTCUT = 2; + public static final int ROOT_TYPE_SERVICE = 1; /** - * Root that represents a physical storage device. + * 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_DEVICE = 3; + public static final int ROOT_TYPE_SHORTCUT = 2; /** - * Root that represents a physical storage device that should only be - * displayed to advanced users. + * Type of root that represents a physical storage device. * - * @see #rootType + * @see #COLUMN_ROOT_TYPE */ - public static final int ROOT_TYPE_DEVICE_ADVANCED = 4; + public static final int ROOT_TYPE_DEVICE = 3; /** * 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 @@ public final class DocumentsContract { * 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}. + * Flag indicating that a root offers video documents. When a user is + * selecting video, roots not providing video may be excluded. + * + * @see #COLUMN_FLAGS + * @see Intent#EXTRA_MIME_TYPES */ - public String summary; + public static final int FLAG_PROVIDES_VIDEO = 1 << 4; /** - * Document which is a directory that represents the top of this root. - * Must not be {@code null}. + * 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 docId; + public static final int FLAG_PROVIDES_IMAGES = 1 << 5; /** - * 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 this root can report recently modified + * documents. * - * @see DocumentColumns#DOC_ID + * @see #COLUMN_FLAGS + * @see DocumentsContract#buildRecentDocumentsUri(String, String) */ - public String recentDocId; + public static final int FLAG_SUPPORTS_RECENTS = 1 << 6; + } - /** - * Number of free bytes of available in this root, or -1 if unknown or - * unbounded. - */ - public long availableBytes; + /** + * 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"; - /** - * 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 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"; - public DocumentRoot() { - } + /** + * 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 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(); - } + /** {@hide} */ + public static final String METHOD_CREATE_DOCUMENT = "android:createDocument"; + /** {@hide} */ + public static final String METHOD_DELETE_DOCUMENT = "android:deleteDocument"; - /** {@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; - } + /** {@hide} */ + public static final String EXTRA_THUMBNAIL_SIZE = "thumbnail_size"; - @Override - public int describeContents() { - return 0; - } + 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"; - @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); + 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); + } + if (!PATH_ROOT.equals(paths.get(0))) { + throw new IllegalArgumentException("Not a root: " + rootUri); } + return paths.get(1); + } - public static final Creator<DocumentRoot> CREATOR = new Creator<DocumentRoot>() { - @Override - public DocumentRoot createFromParcel(Parcel in) { - return new DocumentRoot(in); - } + /** + * 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); + } + if (!PATH_DOCUMENT.equals(paths.get(0))) { + throw new IllegalArgumentException("Not a document: " + documentUri); + } + return paths.get(1); + } - @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 @@ public final class DocumentsContract { * {@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 @@ public final class DocumentsContract { } /** - * 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 @@ public final class DocumentsContract { } } - /** {@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 @@ public final class DocumentsContract { } /** - * 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.Bundle; 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 @@ import java.util.List; * 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 @@ import java.util.List; 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 @@ public abstract class DocumentsProvider extends ContentProvider { } /** - * 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 @@ public abstract class DocumentsProvider extends ContentProvider { * @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 @@ public abstract class DocumentsProvider extends ContentProvider { 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 @@ public abstract class DocumentsProvider extends ContentProvider { } } + /** + * 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 @@ public abstract class DocumentsProvider extends ContentProvider { } } + /** + * 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 @@ public abstract class DocumentsProvider extends ContentProvider { 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); - - } 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); + if (METHOD_CREATE_DOCUMENT.equals(method)) { + final String mimeType = extras.getString(Document.COLUMN_MIME_TYPE); + final String displayName = extras.getString(Document.COLUMN_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 @@ public abstract class DocumentsProvider extends ContentProvider { 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 final class Settings { 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 @@ public final class Settings { * <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 @@ public final class Settings { * 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 @@ public final class Settings { /** * 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 @@ public final class Settings { "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 final class Settings { 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 @@ public final class Settings { 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 @@ public interface IKeystoreService extends IInterface { 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 @@ public interface IKeystoreService extends IInterface { _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 interface IKeystoreService extends IInterface { 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 @@ import android.os.Bundle; * </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/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"; + /** Default captioning enabled value. */ + private static final int DEFAULT_ENABLED = 0; + /** Default style preset as an index into {@link CaptionStyle#PRESETS}. */ private static final int DEFAULT_PRESET = 0; - private static final int DEFAULT_ENABLED = 0; - private static final float DEFAULT_FONT_SIZE = 24; + + /** 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; + + /** + * Creates a new captioning manager for the specified context. + * + * @hide + */ + public CaptioningManager(Context context) { + mContentResolver = context.getContentResolver(); + } /** - * @param cr Resolver to access the database with. - * @return The user's preferred caption enabled state. + * @return the user's preferred captioning enabled state */ - public static final boolean isEnabled(ContentResolver cr) { - return Secure.getInt(cr, Secure.ACCESSIBILITY_CAPTIONING_ENABLED, DEFAULT_ENABLED) == 1; + public final boolean isEnabled() { + return Secure.getInt( + mContentResolver, 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. + * @return the raw locale string for the user's preferred captioning + * language * @hide */ - public static final String getRawLocale(ContentResolver cr) { - return Secure.getString(cr, Secure.ACCESSIBILITY_CAPTIONING_LOCALE); + public final String getRawLocale() { + return Secure.getString(mContentResolver, Secure.ACCESSIBILITY_CAPTIONING_LOCALE); } /** - * @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 locale for the user's preferred captioning language, or null + * if not specified */ - public static final Locale getLocale(ContentResolver cr) { - final String rawLocale = getRawLocale(cr); + public final Locale getLocale() { + final String rawLocale = getRawLocale(); if (!TextUtils.isEmpty(rawLocale)) { final String[] splitLocale = rawLocale.split("_"); switch (splitLocale.length) { @@ -85,14 +104,151 @@ public class CaptioningManager { } /** - * @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 @@ public class CaptioningManager { } /** - * @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 @@ public class CaptioningManager { /** * @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 @@ public class CaptioningManager { 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 @@ public final class InputMethodManager { } /** - * 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/WebView.java b/core/java/android/webkit/WebView.java index 3923539..eded438 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -31,7 +31,9 @@ import android.os.Bundle; 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 android.widget.AbsoluteLayout; import java.io.BufferedWriter; import java.io.File; -import java.io.OutputStream; import java.util.Map; /** @@ -1042,7 +1043,9 @@ public class WebView extends AbsoluteLayout * 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 +1054,26 @@ public class WebView extends AbsoluteLayout * 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); + mProvider.exportToPdf(fd, attributes, resultCallback, cancellationSignal); } /** diff --git a/core/java/android/webkit/WebViewClassic.java b/core/java/android/webkit/WebViewClassic.java index db98d30..b1a7878 100644 --- a/core/java/android/webkit/WebViewClassic.java +++ b/core/java/android/webkit/WebViewClassic.java @@ -62,6 +62,7 @@ import android.os.Handler; 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 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc * 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"); - } /** 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.net.http.SslCertificate; 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 android.webkit.WebView.PictureListener; import java.io.BufferedWriter; import java.io.File; -import java.io.OutputStream; import java.util.Map; /** @@ -148,8 +149,9 @@ public interface WebViewProvider { 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/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 @@ import android.widget.AbsListView; * 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 @@ import android.widget.AbsListView; * {@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 @@ public abstract class AutoScrollHelper implements View.OnTouchListener { 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 @@ public abstract class AutoScrollHelper implements View.OnTouchListener { 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 @@ public abstract class AutoScrollHelper implements View.OnTouchListener { 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 @@ public abstract class AutoScrollHelper implements View.OnTouchListener { * @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 @@ public abstract class AutoScrollHelper implements View.OnTouchListener { * 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 @@ public abstract class AutoScrollHelper implements View.OnTouchListener { * * @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 @@ public abstract class AutoScrollHelper implements View.OnTouchListener { * @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 @@ public abstract class AutoScrollHelper implements View.OnTouchListener { * 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 @@ public abstract class AutoScrollHelper implements View.OnTouchListener { 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); - - 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); - } + 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 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. + * @return whether the target is able to scroll in the requested direction + */ + 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 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. + * @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 onScrollBy(int deltaX, int deltaY); + public abstract boolean canTargetScrollVertically(int direction); /** * Returns the interpolated position of a touch point relative to an edge @@ -534,7 +631,7 @@ public abstract class AutoScrollHelper implements View.OnTouchListener { 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,7 +648,7 @@ public abstract class AutoScrollHelper implements View.OnTouchListener { return 0; } - private static float constrain(float value, float min, float max) { + private static int constrain(int value, int min, int max) { if (value > max) { return max; } else if (value < min) { @@ -561,19 +658,13 @@ public abstract class AutoScrollHelper implements View.OnTouchListener { } } - /** - * 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); + private static float constrain(float value, float min, float max) { + if (value > max) { + return max; + } else if (value < min) { + return min; + } else { + return value; } } @@ -582,52 +673,44 @@ public abstract class AutoScrollHelper implements View.OnTouchListener { * 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; - - // If we just started actively scrolling, make sure any down - // or move events send to the target view are canceled. - if (mExclusiveEnabled && scrolling) { - cancelTargetTouch(); - } - } + scrollTargetBy(deltaX, deltaY); - // 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 @@ public abstract class AutoScrollHelper implements View.OnTouchListener { * 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 setRampUpDuration(int durationMillis) { + mRampUpDuration = durationMillis; } - public void setDuration(int durationMillis) { - mDuration = durationMillis; + public void setRampDownDuration(int durationMillis) { + mRampDownDuration = durationMillis; } /** @@ -665,32 +760,50 @@ public abstract class AutoScrollHelper implements View.OnTouchListener { */ public void start() { mStartTime = AnimationUtils.currentAnimationTimeMillis(); + mStopTime = -1; mDeltaTime = mStartTime; + mStopValue = 0.5f; + mDeltaX = 0; + mDeltaY = 0; } /** - * Returns whether the scroller is finished, which means that its - * acceleration is zero. - * - * @return Whether the scroller is finished. + * 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() { - if (mTargetVelocityX == 0 && mTargetVelocityY == 0) { - return true; + 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); } - final long currentTime = AnimationUtils.currentAnimationTimeMillis(); - final long elapsedSinceStart = currentTime - mStartTime; - return elapsedSinceStart > mDuration; } /** - * Stops the scroller and resets its values. + * 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. */ - public void reset() { - mStartTime = -1; - mDeltaTime = -1; - mDeltaX = 0; - mDeltaY = 0; + private float interpolateValue(float value) { + return -4 * value * value + 4 * value; } /** @@ -701,18 +814,13 @@ public abstract class AutoScrollHelper implements View.OnTouchListener { * @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 @@ public abstract class AutoScrollHelper implements View.OnTouchListener { 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 @@ public abstract class AutoScrollHelper implements View.OnTouchListener { } /** - * 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/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 @@ not_valid_surface: "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/AndroidManifest.xml b/core/res/AndroidManifest.xml index 9613df3..3ee2657 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1095,6 +1095,12 @@ android:description="@string/permdesc_use_sip" android:label="@string/permlab_use_sip" /> + <!-- Allows an application to request CallHandlerService implementations. --> + <permission android:name="android.permission.CAN_REQUEST_HANDLE_CALL_SERVICE" + android:permissionGroup="android.permission-group.PHONE_CALLS" + android:protectionLevel="system" /> + + <!-- ================================== --> <!-- Permissions for sdcard interaction --> <!-- ================================== --> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 5444cb1..f8cffa7 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> 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 @@ LOCAL_SRC_FILES := \ $(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>" + - " " + - "<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(" "); - - // 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(" "); - - // 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> <small>a</small></a>" + - "</span> <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 <small>a</small></a>"); - - // go to the third sentence - sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); - assertSelectionString(" "); - - // 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(" "); - - // go to the second sentence - sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); - assertSelectionString("<a href=\"#\"><span>Second <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/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 @@ public class DrmManagerClient { 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 @@ public class DrmManagerClient { 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 class DrmManagerClient { } 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 @@ public class DrmManagerClient { 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 @@ void JNIOnInfoListener::onInfo(const DrmInfoEvent& event) { 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 @@ package android.security; 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.SecureRandom; 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 @@ public class AndroidKeyPairGenerator extends KeyPairGeneratorSpi { 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 @@ public class AndroidKeyPairGenerator extends KeyPairGeneratorSpi { 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 @@ public class AndroidKeyPairGenerator extends KeyPairGeneratorSpi { 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 @@ public class AndroidKeyPairGenerator extends KeyPairGeneratorSpi { 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 @@ import javax.security.auth.x500.X500Principal; * 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 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { * @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 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { * {@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 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { 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 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { 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 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { } /** - * 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 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { private String mKeystoreAlias; + private String mKeyType = "RSA"; + + private int mKeySize = -1; + + private AlgorithmParameterSpec mSpec; + private X500Principal mSubjectDN; private BigInteger mSerialNumber; @@ -246,6 +371,49 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { } /** + * 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 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { * @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 @@ public class KeyStore { 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 class KeyStore { } } - 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.SecureRandom; 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 @@ public class AndroidKeyPairGeneratorTest extends AndroidTestCase { 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,12 +151,14 @@ public class AndroidKeyPairGeneratorTest extends AndroidTestCase { 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) @@ -157,7 +168,223 @@ public class AndroidKeyPairGeneratorTest extends AndroidTestCase { 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, "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) + .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", 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 @@ public class AndroidKeyPairGeneratorTest extends AndroidTestCase { .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 @@ public class AndroidKeyPairGeneratorTest extends AndroidTestCase { .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 @@ public class AndroidKeyPairGeneratorTest extends AndroidTestCase { .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 @@ public class AndroidKeyPairGeneratorTest extends AndroidTestCase { 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 @@ package android.security; 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.PublicKey; 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { * * 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { * * 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { * * 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { (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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { // 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { // 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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,58 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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_DSA_NullParams_Unencrypted_Success() throws Exception { + mKeyStore.load(null, null); + + assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_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); + assertNotNull("Entry should exist", entry); + + assertTrue("Should be a PrivateKeyEntry", entry instanceof PrivateKeyEntry); + + PrivateKeyEntry keyEntry = (PrivateKeyEntry) entry; + + assertPrivateKeyEntryEquals(keyEntry, "DSA", FAKE_DSA_KEY_1, FAKE_DSA_USER_1, FAKE_DSA_CA_1); } - public void testKeyStore_GetEntry_NullParams_Unencrypted_Success() throws Exception { + 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_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE)); - assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_USER_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)); - assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1, + + 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); @@ -886,13 +1557,14 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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); } @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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { // 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { // 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { // 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { // 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { // 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 @@ public class AndroidKeyStoreTest extends AndroidTestCase { 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 class KeyPairGeneratorSpecTest extends AndroidTestCase { 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 class KeyPairGeneratorSpecTest extends AndroidTestCase { 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 @@ public class KeyPairGeneratorSpecTest extends AndroidTestCase { 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 class KeyPairGeneratorSpecTest extends AndroidTestCase { 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 class KeyPairGeneratorSpecTest extends AndroidTestCase { 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 class KeyPairGeneratorSpecTest extends AndroidTestCase { 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 class KeyPairGeneratorSpecTest extends AndroidTestCase { 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 class KeyPairGeneratorSpecTest extends AndroidTestCase { 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 class KeyPairGeneratorSpecTest extends AndroidTestCase { 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 class KeyPairGeneratorSpecTest extends AndroidTestCase { 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.security.KeyStore; 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 class KeyStoreTest extends ActivityUnitTestCase<Activity> { 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 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { 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 class KeyStoreTest extends ActivityUnitTestCase<Activity> { 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 class KeyStoreTest extends ActivityUnitTestCase<Activity> { 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 class KeyStoreTest extends ActivityUnitTestCase<Activity> { 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 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { 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 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { 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 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { 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 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { 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 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { 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 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { 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 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { 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 class RemoteControlClient */ 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 class RemoteControlClient */ 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 class RemoteControlClient */ 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 @@ public class RemoteControlClient * <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 class RemoteControlClient */ 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 @@ public class RemoteControlClient * {@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 @@ public class RemoteControlClient /** * 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 @@ public class RemoteControlClient } /** - * @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 @@ public class RemoteControlClient } /** - * @hide - * CANDIDATE FOR PUBLIC API + * Causes all metadata fields to be read-only. */ public synchronized void clearEditableKeys() { if (mApplied) { @@ -869,7 +865,8 @@ public class RemoteControlClient * {@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 @@ public class RemoteControlClient } /** - * @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_MODULE_TAGS := optional 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.AlertDialog; 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.content.DialogInterface.OnClickListener; 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 @@ public class CreateDirectoryFragment extends DialogFragment { 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.ContentResolver; 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.ListView; 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 @@ public class DirectoryFragment extends Fragment { 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 @@ public class DirectoryFragment extends Fragment { 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 class DirectoryFragment extends Fragment { 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 @@ public class DirectoryFragment extends Fragment { mGridView.setOnItemClickListener(mItemListener); mGridView.setMultiChoiceModeListener(mMultiListener); - mAdapter = new DocumentsAdapter(); + return view; + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); - final Uri uri = getArguments().getParcelable(EXTRA_URI); + 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); + + if (mLastSortOrder != state.sortOrder) { + getLoaderManager().restartLoader(mLoaderId, null, mCallbacks); + mLastSortOrder = state.sortOrder; + } - // TODO: avoid kicking loader when nothing changed - getLoaderManager().restartLoader(mLoaderId, getArguments(), mCallbacks); 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 @@ public class DirectoryFragment extends Fragment { 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 @@ public class DirectoryFragment extends Fragment { @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 @@ public class DirectoryFragment extends Fragment { @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 @@ public class DirectoryFragment extends Fragment { 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 @@ public class DirectoryFragment extends Fragment { 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 @@ public class DirectoryFragment extends Fragment { } }; - 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); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + intent.addCategory(Intent.CATEGORY_DEFAULT); + 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); - // TODO: find common mimetype - intent.setType("*/*"); + + 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 { - intent = new Intent(Intent.ACTION_SEND); - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - intent.addCategory(Intent.CATEGORY_DEFAULT); - intent.setData(uris.get(0)); + 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 @@ public class DirectoryFragment extends Fragment { } } - 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; - - public DocumentsAdapter() { - } + private Cursor mCursor; - public void swapDocuments(List<Document> documents) { - mDocuments = documents; + public void swapCursor(Cursor cursor) { + mCursor = cursor; - if (mDocuments != null && mDocuments.isEmpty()) { + if (isEmpty()) { mEmptyView.setVisibility(View.VISIBLE); } else { mEmptyView.setVisibility(View.GONE); @@ -416,7 +435,7 @@ public class DirectoryFragment extends Fragment { @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 @@ public class DirectoryFragment extends Fragment { } } - 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 @@ public class DirectoryFragment extends Fragment { 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 @@ public class DirectoryFragment extends Fragment { (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 @@ public class DirectoryFragment extends Fragment { @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 @@ public class DirectoryFragment extends Fragment { 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 @@ public class DirectoryFragment extends Fragment { 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 String mRootId; + private final Uri mUri; + private final int mSortOrder; - private final int mType; - private Predicate<Document> mFilter; - private Comparator<Document> mSortOrder; + private CancellationSignal mSignal; + private DirectoryResult mResult; - public DirectoryLoader(Context context, Uri uri, int type, Predicate<Document> filter, - Comparator<Document> sortOrder) { - super(context, uri); - mType = type; - mFilter = filter; + 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); - - 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"); - } + @Override + public void cancelLoadInBackground() { + super.cancelLoadInBackground(); - if (doc != null && (mFilter == null || mFilter.apply(doc))) { - result.contents.add(doc); + synchronized (this) { + if (mSignal != null) { + mSignal.cancel(); } } + } + + @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); + } - if (mSortOrder != null) { - Collections.sort(result.contents, mSortOrder); + 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 static com.android.documentsui.DocumentsActivity.TAG; 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.database.Cursor; 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.SearchView.OnQueryTextListener; 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,74 +90,86 @@ public class DocumentsActivity extends Activity { 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; - } + setResult(Activity.RESULT_CANCELED); + setContentView(R.layout.activity); - // TODO: unify action in single place - mDisplayState.action = mAction; + mRootsContainer = findViewById(R.id.container_roots); - if (mAction == ACTION_OPEN || mAction == ACTION_GET_CONTENT) { - mDisplayState.allowMultiple = intent.getBooleanExtra( - Intent.EXTRA_ALLOW_MULTIPLE, false); - } + mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); - 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); + mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, + R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close); + + mDrawerLayout.setDrawerListener(mDrawerListener); + mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); + + if (icicle != null) { + mState = icicle.getParcelable(EXTRA_STATE); } else { - mDisplayState.acceptMimes = new String[] { intent.getType() }; + buildDefaultState(); } - mDisplayState.localOnly = intent.getBooleanExtra(Intent.EXTRA_LOCAL_ONLY, false); - - setResult(Activity.RESULT_CANCELED); - setContentView(R.layout.activity); + if (mState.action == ACTION_MANAGE) { + mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); + } - if (mAction == ACTION_CREATE) { + if (mState.action == 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) { + if (mState.action == 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) { + } else if (mState.action == ACTION_OPEN || mState.action == ACTION_CREATE) { RootsFragment.show(getFragmentManager(), null); } - if (mAction == ACTION_MANAGE) { - mDisplayState.sortOrder = SORT_ORDER_LAST_MODIFIED; - } + onCurrentDirectoryChanged(); + } - mRootsContainer = findViewById(R.id.container_roots); + private void buildDefaultState() { + mState = new State(); - mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); + 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; + } - mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, - R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close); + if (mState.action == ACTION_OPEN || mState.action == ACTION_GET_CONTENT) { + mState.allowMultiple = intent.getBooleanExtra( + Intent.EXTRA_ALLOW_MULTIPLE, false); + } - mDrawerLayout.setDrawerListener(mDrawerListener); - mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); + 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() }; + } - if (mAction == ACTION_MANAGE) { - mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); + 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 @@ public class DocumentsActivity extends Activity { } } else { - mDrawerLayout.openDrawer(mRootsContainer); - // Restore last stack for calling package // TODO: move into async loader final String packageName = getCallingPackage(); @@ -178,17 +185,17 @@ public class DocumentsActivity extends Activity { .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 class DocumentsActivity extends Activity { 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 @@ public class DocumentsActivity extends Activity { 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 @@ public class DocumentsActivity extends Activity { 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 @@ public class DocumentsActivity extends Activity { 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 @@ public class DocumentsActivity extends Activity { 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 @@ public class DocumentsActivity extends Activity { mSearchView.setOnCloseListener(new OnCloseListener() { @Override public boolean onClose() { - mCurrentSearch = null; + mState.currentSearch = null; onCurrentDirectoryChanged(); return false; } @@ -317,7 +324,7 @@ public class DocumentsActivity extends Activity { 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 @@ public class DocumentsActivity extends Activity { 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 @@ public class DocumentsActivity extends Activity { // 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 @@ public class DocumentsActivity extends Activity { 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 @@ public class DocumentsActivity extends Activity { @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 @@ public class DocumentsActivity extends Activity { } } + @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 @@ public class DocumentsActivity extends Activity { 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 @@ public class DocumentsActivity extends Activity { 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 @@ public class DocumentsActivity extends Activity { } // 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 class DocumentsActivity extends Activity { } 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 @@ public class DocumentsActivity extends Activity { 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 class DocumentsActivity extends Activity { } } - 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 class DocumentsActivity extends Activity { } } - 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 @@ public class DocumentsActivity extends Activity { 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 @@ public class DocumentsActivity extends Activity { 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 @@ public class DocumentsActivity extends Activity { 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 class DocumentsActivity extends Activity { 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 class DocumentsActivity extends Activity { 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 @@ public class MimePredicate implements Predicate<Document> { } @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.database.Cursor; 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.ListView; 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 @@ public class RecentsCreateFragment extends Fragment { 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 @@ public class RecentsCreateFragment extends Fragment { 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 class RecentsProvider extends ContentProvider { 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.Intent; 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 @@ public class RootsCache { // 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 class RootsCache { 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 @@ public class RootsCache { // 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 @@ public class RootsCache { } @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.Intent; 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.ImageView; 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 class RootsFragment extends Fragment { 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 class RootsFragment extends Fragment { 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 @@ public class RootsFragment extends Fragment { } }; - 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 @@ public class RootsFragment extends Fragment { 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 @@ public class RootsFragment extends Fragment { 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 @@ public class RootsFragment extends Fragment { 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.Button; 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 @@ import com.android.documentsui.model.Document; 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 @@ public class SaveFragment extends Fragment { * 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 android.widget.TextView; 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 @@ public class TestActivity extends Activity { 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 @@ public class TestActivity extends Activity { 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 @@ public class TestActivity extends Activity { 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 @@ public class TestActivity extends Activity { 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 @@ public class TestActivity extends Activity { 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 @@ public class TestActivity extends Activity { 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 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); +public class DocumentStack extends LinkedList<DocumentInfo> implements Durable { + private static final int VERSION_INIT = 1; - 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 @@ public class DocumentStack extends LinkedList<Document> { 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/DumpRenderTree/src/com/android/dumprendertree/HTMLHostApp.java b/packages/DocumentsUI/src/com/android/documentsui/model/Durable.java index f610f5a..01633ed 100644 --- a/tests/DumpRenderTree/src/com/android/dumprendertree/HTMLHostApp.java +++ b/packages/DocumentsUI/src/com/android/documentsui/model/Durable.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007 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,20 +14,14 @@ * limitations under the License. */ -package com.android.dumprendertree; +package com.android.documentsui.model; -import android.app.Application; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; -public class HTMLHostApp extends Application { - - public HTMLHostApp() { - } - - public void onCreate() { - } - - public void onTerminate() { - } - +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.media.ExifInterface; 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.io.IOException; 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 @@ public class ExternalStorageProvider extends DocumentsProvider { // 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 @@ public class ExternalStorageProvider extends DocumentsProvider { 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 @@ public class ExternalStorageProvider extends DocumentsProvider { 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 @@ public class ExternalStorageProvider extends DocumentsProvider { 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 @@ public class ExternalStorageProvider extends DocumentsProvider { 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 @@ public class ExternalStorageProvider extends DocumentsProvider { } @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 @@ public class ExternalStorageProvider extends DocumentsProvider { } @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 @@ public class ExternalStorageProvider extends DocumentsProvider { } @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 @@ public class ExternalStorageProvider extends DocumentsProvider { } @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 @@ public class ExternalStorageProvider extends DocumentsProvider { 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 @@ public class ExternalStorageProvider extends DocumentsProvider { } 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 @@ public class KeyguardHostView extends KeyguardViewBase { private void addWidgetsFromSettings() { if (mSafeModeEnabled || widgetsDisabled()) { + addDefaultStatusWidget(0); return; } diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_alarm.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_alarm.png Binary files differindex 773d418..2c55017 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_alarm.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_alarm.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_0.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_100.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_100.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_15.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_15.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_28.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_28.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_43.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_43.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_57.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_57.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_71.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_71.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_85.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_85.png Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth.png Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_device_access_location_found.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_device_access_location_found.png Binary files differindex ddf6b12..9befc34 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_device_access_location_found.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_device_access_location_found.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_no_sim.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_no_sim.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_silent.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_silent.png Binary files differindex 859f7b1..58f67d0 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_silent.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_silent.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_vibrate.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_vibrate.png Binary files differindex 2f2f291..b794c9a 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_vibrate.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_vibrate.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0.png Binary files differindex de6988f..6253d9a 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully.png Binary files differindex e322aa1..6253d9a 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1.png Binary files differindex cf9c992..0bed6d9 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully.png Binary files differindex 4892842..0b27331 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2.png Binary files differindex 4273a52..6bb92a3 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully.png Binary files differindex 201689b..c77c37f 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3.png Binary files differindex 0457c50..92e6837 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully.png Binary files differindex 22dc516..269eae2 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4.png Binary files differindex 2fdea79..ac2eaf0 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully.png Binary files differindex 8c4ed12..d9da0d9 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png Binary files differindex 56c497a..e02a84b 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_sync.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_sync.png Binary files differindex 9013bc6..2dc2b17 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_sync.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_sync.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_sync_error.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_sync_error.png Binary files differindex 38d04f2..70f839f 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_sync_error.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_sync_error.png 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 4881c91..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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 227402b..9d3346f 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex e583414..ef73123 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 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 Binary files differindex 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 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 Binary files differindex 03a0f61..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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_alarm.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_alarm.png Binary files differindex 7640c87..c6dc466 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_alarm.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_alarm.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_0.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_100.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_100.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_15.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_15.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_28.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_28.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_43.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_43.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_57.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_57.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_71.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_71.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_85.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_85.png Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex d0700fb..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 diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth.png Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 0f3350b..11e4762 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_device_access_location_found.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_device_access_location_found.png Binary files differindex f698605..2e24f6f 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_device_access_location_found.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_device_access_location_found.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_no_sim.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_no_sim.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_silent.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_silent.png Binary files differindex 24717d7..1e05a91 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_silent.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_silent.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_vibrate.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_vibrate.png Binary files differindex a77fe7f..f4afa52 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_vibrate.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_vibrate.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png Binary files differindex 43f5468..55173f8 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully.png Binary files differindex cadcd03..55173f8 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1.png Binary files differindex 54e0685..6649d7c 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.png Binary files differindex 2efaf45..dcfe5b4 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2.png Binary files differindex d3bc458..be3fe62 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.png Binary files differindex 9c3f44c..734c52a 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3.png Binary files differindex a7ba08a..0deb868 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.png Binary files differindex e16bee6..d808990 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4.png Binary files differindex 7e1e8de..f890c2b 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.png Binary files differindex e599443..0e11ce8 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.png Binary files differindex 688b6d6..1ffeaa3 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_sync.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_sync.png Binary files differindex 1cacf93..ad5b2ff 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_sync.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_sync.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_sync_error.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_sync_error.png Binary files differindex 5425af4..6db607d 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_sync_error.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_sync_error.png 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex ce25a0b..7023c4f 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 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 Binary files differindex b4d24d1..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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differnew file mode 100644 index 0000000..586a738 --- /dev/null +++ b/packages/SystemUI/res/drawable-sw600dp-xxhdpi/heads_up_window_bg.9.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_alarm.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_alarm.png Binary files differindex c8882e0..8bca860 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_alarm.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_alarm.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_0.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_0.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_100.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_100.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_15.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_15.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_28.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_28.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_43.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_43.png Binary files differindex f247294..91d9694 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_43.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_43.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_57.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_57.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_71.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_71.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_85.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_85.png Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_bluetooth.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_bluetooth.png Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 79d9447..137f76e 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_device_access_location_found.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_device_access_location_found.png Binary files differindex dbd370d..a7f0017 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_device_access_location_found.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_device_access_location_found.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_no_sim.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_no_sim.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_ringer_silent.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_ringer_silent.png Binary files differindex 19fa2e8..662d062 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_ringer_silent.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_ringer_silent.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_ringer_vibrate.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_ringer_vibrate.png Binary files differindex bc41395..18be9c0 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_ringer_vibrate.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_ringer_vibrate.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0.png Binary files differindex f5843ad..8b34373 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_fully.png Binary files differindex df5138e..8b34373 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_fully.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_fully.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1.png Binary files differindex 41a46ed..610e78f 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_fully.png Binary files differindex a76bca3..f682a0e 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2.png Binary files differindex d4dca0b..5bb372e 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_fully.png Binary files differindex a91f099..ef05975 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3.png Binary files differindex 33e8072..d556733 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_fully.png Binary files differindex e1c0f71..c5088b5 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4.png Binary files differindex cad7427..e1bd8bd 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_fully.png Binary files differindex c36c6d9..c82a435 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_fully.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_fully.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_null.png Binary files differindex 674be33..298b27d 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_null.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_null.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_sync.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_sync.png Binary files differindex ab6f812..75b002d 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_sync.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_sync.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_sync_error.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_sync_error.png Binary files differindex a7780cf..6276f47 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_sync_error.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_sync_error.png 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 6eb8410..0368f17 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differnew file mode 100644 index 0000000..586a738 --- /dev/null +++ b/packages/SystemUI/res/drawable-xxhdpi/heads_up_window_bg.9.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_menu_share.png b/packages/SystemUI/res/drawable-xxhdpi/ic_menu_share.png Binary files differnew file mode 100644 index 0000000..d450531 --- /dev/null +++ b/packages/SystemUI/res/drawable-xxhdpi/ic_menu_share.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_alarm.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_alarm.png Binary files differindex ed4b8c4..d42d9d6 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_alarm.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_alarm.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_0.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_0.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_100.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_100.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_15.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_15.png Binary files differindex eb3d607..c03248a 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_15.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_15.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_28.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_28.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_43.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_43.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_57.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_57.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_71.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_71.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_85.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_85.png Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_bluetooth.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_bluetooth.png Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 9f4ee4c..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 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 Binary files differindex 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 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 Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_device_access_location_found.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_device_access_location_found.png Binary files differindex 8e00f6d..ad34d49 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_device_access_location_found.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_device_access_location_found.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_no_sim.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_no_sim.png Binary files differindex 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 diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_ringer_silent.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_ringer_silent.png Binary files differindex 4e511c6..aabf0aa 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_ringer_silent.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_ringer_silent.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_ringer_vibrate.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_ringer_vibrate.png Binary files differindex efd0ca6..654c2a5 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_ringer_vibrate.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_ringer_vibrate.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0.png Binary files differindex 18f63e5..361ff48 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0_fully.png Binary files differindex 8106087..937839b 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0_fully.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0_fully.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1.png Binary files differindex d863597..d185a4d 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1_fully.png Binary files differindex 01fce1a..2bd6eb1 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2.png Binary files differindex f9ee187..9594607 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2_fully.png Binary files differindex e72fda6..aad369e 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3.png Binary files differindex a1540d7..6f9f50c 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3_fully.png Binary files differindex eebc585..c76e188 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4.png Binary files differindex bf22fbb..75a182f 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4_fully.png Binary files differindex 754e3b9..1889813 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4_fully.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4_fully.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_null.png Binary files differindex 78e94c6..b388b8f 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_null.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_null.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_sync.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_sync.png Binary files differindex e36bf10..99b2fff 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_sync.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_sync.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_sync_error.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_sync_error.png Binary files differindex 274b02f..2f6a4c0 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_sync_error.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_sync_error.png 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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/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 @@ package com.android.server.content; 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 @@ public final class ContentService extends IContentService.Stub { 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 @@ public final class ContentService extends IContentService.Stub { 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.io.PrintWriter; 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 @@ public class SyncManager { } /** - * 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 @@ public class SyncManager { 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 @@ public class SyncManager { + " remaining: " + (remainingMillis) + " time_since_last: " + timeSinceLastRunMillis + " last poll absol: " + lastPollTimeAbsolute - + " last poll shifed: " + shiftedLastPollTimeAbsolute + " shifted now: " + shiftedNowAbsolute + " run_early: " + runEarly); } @@ -2392,6 +2218,15 @@ public class SyncManager { } 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..4856747 100644 --- a/services/java/com/android/server/content/SyncOperation.java +++ b/services/java/com/android/server/content/SyncOperation.java @@ -111,40 +111,6 @@ public class SyncOperation implements Comparable { 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 @@ public class SyncOperation implements Comparable { 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 class SyncOperation implements Comparable { } } - 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 @@ public final class GeofenceProxy { 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 @@ public final class GeofenceProxy { 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 @@ public final class GeofenceProxy { 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 @@ public final class GeofenceProxy { } } - private void setFusedGeofence() { + private void setFusedGeofenceLocked() { try { mGeofenceHardware.setFusedGeofenceHardware(mFusedGeofenceHardware); } catch(RemoteException e) { @@ -140,30 +148,37 @@ public final class GeofenceProxy { // 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/print/UserState.java b/services/java/com/android/server/print/UserState.java index 4a1b96b..7d94a42 100644 --- a/services/java/com/android/server/print/UserState.java +++ b/services/java/com/android/server/print/UserState.java @@ -19,8 +19,6 @@ package com.android.server.print; 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; @@ -68,11 +66,6 @@ final class UserState implements PrintSpoolerCallbacks { 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 @@ final class UserState implements PrintSpoolerCallbacks { mUserId = userId; mLock = lock; mSpooler = new RemotePrintSpooler(context, userId, this); - enableSystemPrintServicesOnce(); + synchronized (mLock) { + enableSystemPrintServicesOnFirstBootLocked(); + } } @Override @@ -379,11 +374,23 @@ final class UserState implements PrintSpoolerCallbacks { 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 @@ final class UserState implements PrintSpoolerCallbacks { } 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()); } } + } + + // Nothing to be enabled - done. + if (builder.length() <= 0) { + return; + } + + String servicesToEnable = builder.toString(); - Settings.Secure.putStringForUser(mContext.getContentResolver(), - Settings.Secure.ENABLED_PRINT_SERVICES, builder.toString(), mUserId); + // 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() { 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/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 5220d57..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 Binary files differdeleted file mode 100644 index 5b3fcec..0000000 --- a/tests/DumpRenderTree2/res/drawable/folder.png +++ /dev/null diff --git a/tests/DumpRenderTree2/res/drawable/runtest.png b/tests/DumpRenderTree2/res/drawable/runtest.png Binary files differdeleted file mode 100644 index 910c654..0000000 --- a/tests/DumpRenderTree2/res/drawable/runtest.png +++ /dev/null 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 = '▼ ';" + - " } else {" + - " element.style.display = 'none';" + - " triangle.innerHTML = '▶ ';" + - " }" + - " }" + - "</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 + "\">▶ </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("\">■ </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 = " "; - - if (diff.text.endsWith("\n") || forceOutputLine) { - lineNums.add(i); - /** TODO: Think of better way to replace stuff */ - line += begSpan + diff.text.replace(" ", " ") - + endSpan + br; - lines.add(line); - line = ""; - } else { - line += begSpan + diff.text.replace(" ", " ") + 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 cff436f..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/OnEverythingFinishedCallback.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/scriptsupport/OnEverythingFinishedCallback.java deleted file mode 100644 index e1d4364..0000000 --- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/scriptsupport/OnEverythingFinishedCallback.java +++ /dev/null @@ -1,25 +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; - -/** - * 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 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 @@ public class WifiNative { 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 @@ public class WifiNative { } } - 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 class WifiNative { } public boolean connectToSupplicant() { + // No synchronization necessary .. it is implemented in WifiMonitor localLog(mInterfacePrefix + "connectToSupplicant"); return connectToSupplicantNative(); } @@ -122,39 +126,48 @@ public class WifiNative { } 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 class WifiNative { } 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 class WifiNative { 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 class WifiNative { } 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 class WifiNative { } 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 class WifiNative { } 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 class WifiNative { 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) { |