| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.content.browser.webcontents; | 5 package org.chromium.content.browser.webcontents; |
| 6 | 6 |
| 7 import android.annotation.SuppressLint; | 7 import android.annotation.SuppressLint; |
| 8 import android.content.Intent; | 8 import android.content.Intent; |
| 9 import android.os.Bundle; | 9 import android.os.Bundle; |
| 10 import android.os.Parcel; | 10 import android.os.Parcel; |
| 11 import android.support.test.filters.SmallTest; | 11 import android.support.test.filters.SmallTest; |
| 12 | 12 |
| 13 import org.junit.Assert; |
| 14 import org.junit.Rule; |
| 15 import org.junit.Test; |
| 16 import org.junit.runner.RunWith; |
| 17 |
| 13 import org.chromium.base.ThreadUtils; | 18 import org.chromium.base.ThreadUtils; |
| 19 import org.chromium.base.test.BaseJUnit4ClassRunner; |
| 14 import org.chromium.base.test.util.UrlUtils; | 20 import org.chromium.base.test.util.UrlUtils; |
| 15 import org.chromium.content_public.browser.RenderFrameHost; | 21 import org.chromium.content_public.browser.RenderFrameHost; |
| 16 import org.chromium.content_public.browser.WebContents; | 22 import org.chromium.content_public.browser.WebContents; |
| 17 import org.chromium.content_shell.Shell; | 23 import org.chromium.content_shell.Shell; |
| 18 import org.chromium.content_shell_apk.ContentShellActivity; | 24 import org.chromium.content_shell_apk.ContentShellActivity; |
| 19 import org.chromium.content_shell_apk.ContentShellTestBase; | 25 import org.chromium.content_shell_apk.ContentShellActivityTestRule; |
| 20 | 26 |
| 21 import java.util.concurrent.Callable; | 27 import java.util.concurrent.Callable; |
| 22 import java.util.concurrent.ExecutionException; | 28 import java.util.concurrent.ExecutionException; |
| 23 | 29 |
| 24 /** | 30 /** |
| 25 * Test various Java WebContents specific features. | 31 * Test various Java WebContents specific features. |
| 26 * TODO(dtrainor): Add more testing for the WebContents methods. | 32 * TODO(dtrainor): Add more testing for the WebContents methods. |
| 27 */ | 33 */ |
| 28 public class WebContentsTest extends ContentShellTestBase { | 34 @RunWith(BaseJUnit4ClassRunner.class) |
| 35 public class WebContentsTest { |
| 36 @Rule |
| 37 public ContentShellActivityTestRule mActivityTestRule = new ContentShellActi
vityTestRule(); |
| 38 |
| 29 private static final String TEST_URL_1 = "about://blank"; | 39 private static final String TEST_URL_1 = "about://blank"; |
| 30 private static final String TEST_URL_2 = UrlUtils.encodeHtmlDataUri("<html>1
</html>"); | 40 private static final String TEST_URL_2 = UrlUtils.encodeHtmlDataUri("<html>1
</html>"); |
| 31 private static final String WEB_CONTENTS_KEY = "WEBCONTENTSKEY"; | 41 private static final String WEB_CONTENTS_KEY = "WEBCONTENTSKEY"; |
| 32 private static final String PARCEL_STRING_TEST_DATA = "abcdefghijklmnopqrstu
vwxyz"; | 42 private static final String PARCEL_STRING_TEST_DATA = "abcdefghijklmnopqrstu
vwxyz"; |
| 33 | 43 |
| 34 /** | 44 /** |
| 35 * Check that {@link WebContents#isDestroyed()} works as expected. | 45 * Check that {@link WebContents#isDestroyed()} works as expected. |
| 36 * TODO(dtrainor): Test this using {@link WebContents#destroy()} instead onc
e it is possible to | 46 * TODO(dtrainor): Test this using {@link WebContents#destroy()} instead onc
e it is possible to |
| 37 * build a {@link WebContents} directly in the content/ layer. | 47 * build a {@link WebContents} directly in the content/ layer. |
| 38 * | 48 * |
| 39 * @throws InterruptedException | 49 * @throws InterruptedException |
| 40 * @throws ExecutionException | 50 * @throws ExecutionException |
| 41 */ | 51 */ |
| 52 @Test |
| 42 @SmallTest | 53 @SmallTest |
| 43 public void testWebContentsIsDestroyedMethod() throws InterruptedException,
ExecutionException { | 54 public void testWebContentsIsDestroyedMethod() throws InterruptedException,
ExecutionException { |
| 44 final ContentShellActivity activity = launchContentShellWithUrl(TEST_URL
_1); | 55 final ContentShellActivity activity = |
| 45 waitForActiveShellToBeDoneLoading(); | 56 mActivityTestRule.launchContentShellWithUrl(TEST_URL_1); |
| 57 mActivityTestRule.waitForActiveShellToBeDoneLoading(); |
| 46 WebContents webContents = activity.getActiveWebContents(); | 58 WebContents webContents = activity.getActiveWebContents(); |
| 47 | 59 |
| 48 assertFalse("WebContents incorrectly marked as destroyed", | 60 Assert.assertFalse( |
| 49 isWebContentsDestroyed(webContents)); | 61 "WebContents incorrectly marked as destroyed", isWebContentsDest
royed(webContents)); |
| 50 | 62 |
| 51 // Launch a new shell. | 63 // Launch a new shell. |
| 52 Shell originalShell = activity.getActiveShell(); | 64 Shell originalShell = activity.getActiveShell(); |
| 53 loadNewShell(TEST_URL_1); | 65 mActivityTestRule.loadNewShell(TEST_URL_1); |
| 54 assertNotSame("New shell not created", activity.getActiveShell(), origin
alShell); | 66 Assert.assertNotSame("New shell not created", activity.getActiveShell(),
originalShell); |
| 55 | 67 |
| 56 assertTrue("WebContents incorrectly marked as not destroyed", | 68 Assert.assertTrue("WebContents incorrectly marked as not destroyed", |
| 57 isWebContentsDestroyed(webContents)); | 69 isWebContentsDestroyed(webContents)); |
| 58 } | 70 } |
| 59 | 71 |
| 60 /** | 72 /** |
| 61 * Check that it is possible to serialize and deserialize a WebContents obje
ct through Parcels. | 73 * Check that it is possible to serialize and deserialize a WebContents obje
ct through Parcels. |
| 62 * | 74 * |
| 63 * @throws InterruptedException | 75 * @throws InterruptedException |
| 64 */ | 76 */ |
| 77 @Test |
| 65 @SmallTest | 78 @SmallTest |
| 66 public void testWebContentsSerializeDeserializeInParcel() throws Interrupted
Exception { | 79 public void testWebContentsSerializeDeserializeInParcel() throws Interrupted
Exception { |
| 67 launchContentShellWithUrl(TEST_URL_1); | 80 mActivityTestRule.launchContentShellWithUrl(TEST_URL_1); |
| 68 waitForActiveShellToBeDoneLoading(); | 81 mActivityTestRule.waitForActiveShellToBeDoneLoading(); |
| 69 WebContents webContents = getWebContents(); | 82 WebContents webContents = mActivityTestRule.getWebContents(); |
| 70 | 83 |
| 71 Parcel parcel = Parcel.obtain(); | 84 Parcel parcel = Parcel.obtain(); |
| 72 | 85 |
| 73 try { | 86 try { |
| 74 // Serialize the WebContents. | 87 // Serialize the WebContents. |
| 75 parcel.writeParcelable(webContents, 0); | 88 parcel.writeParcelable(webContents, 0); |
| 76 | 89 |
| 77 // Read back the WebContents. | 90 // Read back the WebContents. |
| 78 parcel.setDataPosition(0); | 91 parcel.setDataPosition(0); |
| 79 WebContents deserializedWebContents = parcel.readParcelable( | 92 WebContents deserializedWebContents = parcel.readParcelable( |
| 80 WebContents.class.getClassLoader()); | 93 WebContents.class.getClassLoader()); |
| 81 | 94 |
| 82 // Make sure they're equal. | 95 // Make sure they're equal. |
| 83 assertEquals("Deserialized object does not match", | 96 Assert.assertEquals( |
| 84 webContents, deserializedWebContents); | 97 "Deserialized object does not match", webContents, deseriali
zedWebContents); |
| 85 } finally { | 98 } finally { |
| 86 parcel.recycle(); | 99 parcel.recycle(); |
| 87 } | 100 } |
| 88 } | 101 } |
| 89 | 102 |
| 90 /** | 103 /** |
| 91 * Check that it is possible to serialize and deserialize a WebContents obje
ct through Bundles. | 104 * Check that it is possible to serialize and deserialize a WebContents obje
ct through Bundles. |
| 92 * @throws InterruptedException | 105 * @throws InterruptedException |
| 93 */ | 106 */ |
| 107 @Test |
| 94 @SmallTest | 108 @SmallTest |
| 95 // TODO(crbug.com/635567): Fix this properly. | 109 // TODO(crbug.com/635567): Fix this properly. |
| 96 @SuppressLint("ParcelClassLoader") | 110 @SuppressLint("ParcelClassLoader") |
| 97 public void testWebContentsSerializeDeserializeInBundle() throws Interrupted
Exception { | 111 public void testWebContentsSerializeDeserializeInBundle() throws Interrupted
Exception { |
| 98 launchContentShellWithUrl(TEST_URL_1); | 112 mActivityTestRule.launchContentShellWithUrl(TEST_URL_1); |
| 99 waitForActiveShellToBeDoneLoading(); | 113 mActivityTestRule.waitForActiveShellToBeDoneLoading(); |
| 100 WebContents webContents = getWebContents(); | 114 WebContents webContents = mActivityTestRule.getWebContents(); |
| 101 | 115 |
| 102 // Use a parcel to force the Bundle to actually serialize and deserializ
e, otherwise it can | 116 // Use a parcel to force the Bundle to actually serialize and deserializ
e, otherwise it can |
| 103 // cache the WebContents object. | 117 // cache the WebContents object. |
| 104 Parcel parcel = Parcel.obtain(); | 118 Parcel parcel = Parcel.obtain(); |
| 105 | 119 |
| 106 try { | 120 try { |
| 107 // Create a bundle and put the WebContents in it. | 121 // Create a bundle and put the WebContents in it. |
| 108 Bundle bundle = new Bundle(); | 122 Bundle bundle = new Bundle(); |
| 109 bundle.putParcelable(WEB_CONTENTS_KEY, webContents); | 123 bundle.putParcelable(WEB_CONTENTS_KEY, webContents); |
| 110 | 124 |
| 111 // Serialize the Bundle. | 125 // Serialize the Bundle. |
| 112 parcel.writeBundle(bundle); | 126 parcel.writeBundle(bundle); |
| 113 | 127 |
| 114 // Read back the Bundle. | 128 // Read back the Bundle. |
| 115 parcel.setDataPosition(0); | 129 parcel.setDataPosition(0); |
| 116 Bundle deserializedBundle = parcel.readBundle(); | 130 Bundle deserializedBundle = parcel.readBundle(); |
| 117 | 131 |
| 118 // Read back the WebContents. | 132 // Read back the WebContents. |
| 119 deserializedBundle.setClassLoader(WebContents.class.getClassLoader()
); | 133 deserializedBundle.setClassLoader(WebContents.class.getClassLoader()
); |
| 120 WebContents deserializedWebContents = | 134 WebContents deserializedWebContents = |
| 121 deserializedBundle.getParcelable(WEB_CONTENTS_KEY); | 135 deserializedBundle.getParcelable(WEB_CONTENTS_KEY); |
| 122 | 136 |
| 123 // Make sure they're equal. | 137 // Make sure they're equal. |
| 124 assertEquals("Deserialized object does not match", | 138 Assert.assertEquals( |
| 125 webContents, deserializedWebContents); | 139 "Deserialized object does not match", webContents, deseriali
zedWebContents); |
| 126 } finally { | 140 } finally { |
| 127 parcel.recycle(); | 141 parcel.recycle(); |
| 128 } | 142 } |
| 129 } | 143 } |
| 130 | 144 |
| 131 /** | 145 /** |
| 132 * Check that it is possible to serialize and deserialize a WebContents obje
ct through Intents. | 146 * Check that it is possible to serialize and deserialize a WebContents obje
ct through Intents. |
| 133 * @throws InterruptedException | 147 * @throws InterruptedException |
| 134 */ | 148 */ |
| 149 @Test |
| 135 @SmallTest | 150 @SmallTest |
| 136 // TODO(crbug.com/635567): Fix this properly. | 151 // TODO(crbug.com/635567): Fix this properly. |
| 137 @SuppressLint("ParcelClassLoader") | 152 @SuppressLint("ParcelClassLoader") |
| 138 public void testWebContentsSerializeDeserializeInIntent() throws Interrupted
Exception { | 153 public void testWebContentsSerializeDeserializeInIntent() throws Interrupted
Exception { |
| 139 launchContentShellWithUrl(TEST_URL_1); | 154 mActivityTestRule.launchContentShellWithUrl(TEST_URL_1); |
| 140 waitForActiveShellToBeDoneLoading(); | 155 mActivityTestRule.waitForActiveShellToBeDoneLoading(); |
| 141 WebContents webContents = getWebContents(); | 156 WebContents webContents = mActivityTestRule.getWebContents(); |
| 142 | 157 |
| 143 // Use a parcel to force the Intent to actually serialize and deserializ
e, otherwise it can | 158 // Use a parcel to force the Intent to actually serialize and deserializ
e, otherwise it can |
| 144 // cache the WebContents object. | 159 // cache the WebContents object. |
| 145 Parcel parcel = Parcel.obtain(); | 160 Parcel parcel = Parcel.obtain(); |
| 146 | 161 |
| 147 try { | 162 try { |
| 148 // Create an Intent and put the WebContents in it. | 163 // Create an Intent and put the WebContents in it. |
| 149 Intent intent = new Intent(); | 164 Intent intent = new Intent(); |
| 150 intent.putExtra(WEB_CONTENTS_KEY, webContents); | 165 intent.putExtra(WEB_CONTENTS_KEY, webContents); |
| 151 | 166 |
| 152 // Serialize the Intent | 167 // Serialize the Intent |
| 153 parcel.writeParcelable(intent, 0); | 168 parcel.writeParcelable(intent, 0); |
| 154 | 169 |
| 155 // Read back the Intent. | 170 // Read back the Intent. |
| 156 parcel.setDataPosition(0); | 171 parcel.setDataPosition(0); |
| 157 Intent deserializedIntent = parcel.readParcelable(null); | 172 Intent deserializedIntent = parcel.readParcelable(null); |
| 158 | 173 |
| 159 // Read back the WebContents. | 174 // Read back the WebContents. |
| 160 deserializedIntent.setExtrasClassLoader(WebContents.class.getClassLo
ader()); | 175 deserializedIntent.setExtrasClassLoader(WebContents.class.getClassLo
ader()); |
| 161 WebContents deserializedWebContents = | 176 WebContents deserializedWebContents = |
| 162 (WebContents) deserializedIntent.getParcelableExtra(WEB_CONT
ENTS_KEY); | 177 (WebContents) deserializedIntent.getParcelableExtra(WEB_CONT
ENTS_KEY); |
| 163 | 178 |
| 164 // Make sure they're equal. | 179 // Make sure they're equal. |
| 165 assertEquals("Deserialized object does not match", | 180 Assert.assertEquals( |
| 166 webContents, deserializedWebContents); | 181 "Deserialized object does not match", webContents, deseriali
zedWebContents); |
| 167 } finally { | 182 } finally { |
| 168 parcel.recycle(); | 183 parcel.recycle(); |
| 169 } | 184 } |
| 170 } | 185 } |
| 171 | 186 |
| 172 /** | 187 /** |
| 173 * Check that attempting to deserialize a WebContents object from a Parcel f
rom another process | 188 * Check that attempting to deserialize a WebContents object from a Parcel f
rom another process |
| 174 * instance fails. | 189 * instance fails. |
| 175 * @throws InterruptedException | 190 * @throws InterruptedException |
| 176 */ | 191 */ |
| 192 @Test |
| 177 @SmallTest | 193 @SmallTest |
| 178 public void testWebContentsFailDeserializationAcrossProcessBoundary() | 194 public void testWebContentsFailDeserializationAcrossProcessBoundary() |
| 179 throws InterruptedException { | 195 throws InterruptedException { |
| 180 launchContentShellWithUrl(TEST_URL_1); | 196 mActivityTestRule.launchContentShellWithUrl(TEST_URL_1); |
| 181 waitForActiveShellToBeDoneLoading(); | 197 mActivityTestRule.waitForActiveShellToBeDoneLoading(); |
| 182 WebContents webContents = getWebContents(); | 198 WebContents webContents = mActivityTestRule.getWebContents(); |
| 183 | 199 |
| 184 Parcel parcel = Parcel.obtain(); | 200 Parcel parcel = Parcel.obtain(); |
| 185 | 201 |
| 186 try { | 202 try { |
| 187 // Serialize the WebContents. | 203 // Serialize the WebContents. |
| 188 parcel.writeParcelable(webContents, 0); | 204 parcel.writeParcelable(webContents, 0); |
| 189 | 205 |
| 190 // Invalidate all serialized WebContents. | 206 // Invalidate all serialized WebContents. |
| 191 WebContentsImpl.invalidateSerializedWebContentsForTesting(); | 207 WebContentsImpl.invalidateSerializedWebContentsForTesting(); |
| 192 | 208 |
| 193 // Try to read back the WebContents. | 209 // Try to read back the WebContents. |
| 194 parcel.setDataPosition(0); | 210 parcel.setDataPosition(0); |
| 195 WebContents deserializedWebContents = parcel.readParcelable( | 211 WebContents deserializedWebContents = parcel.readParcelable( |
| 196 WebContents.class.getClassLoader()); | 212 WebContents.class.getClassLoader()); |
| 197 | 213 |
| 198 // Make sure we weren't able to deserialize the WebContents. | 214 // Make sure we weren't able to deserialize the WebContents. |
| 199 assertNull("Unexpectedly deserialized a WebContents", deserializedWe
bContents); | 215 Assert.assertNull("Unexpectedly deserialized a WebContents", deseria
lizedWebContents); |
| 200 } finally { | 216 } finally { |
| 201 parcel.recycle(); | 217 parcel.recycle(); |
| 202 } | 218 } |
| 203 } | 219 } |
| 204 | 220 |
| 205 /** | 221 /** |
| 206 * Check that serializing a destroyed WebContents always results in a null d
eserialized | 222 * Check that serializing a destroyed WebContents always results in a null d
eserialized |
| 207 * WebContents. | 223 * WebContents. |
| 208 * @throws InterruptedException | 224 * @throws InterruptedException |
| 209 * @throws ExecutionException | 225 * @throws ExecutionException |
| 210 */ | 226 */ |
| 227 @Test |
| 211 @SmallTest | 228 @SmallTest |
| 212 public void testSerializingADestroyedWebContentsDoesNotDeserialize() | 229 public void testSerializingADestroyedWebContentsDoesNotDeserialize() |
| 213 throws InterruptedException, ExecutionException { | 230 throws InterruptedException, ExecutionException { |
| 214 ContentShellActivity activity = launchContentShellWithUrl(TEST_URL_1); | 231 ContentShellActivity activity = mActivityTestRule.launchContentShellWith
Url(TEST_URL_1); |
| 215 waitForActiveShellToBeDoneLoading(); | 232 mActivityTestRule.waitForActiveShellToBeDoneLoading(); |
| 216 WebContents webContents = activity.getActiveWebContents(); | 233 WebContents webContents = activity.getActiveWebContents(); |
| 217 loadNewShell(TEST_URL_1); | 234 mActivityTestRule.loadNewShell(TEST_URL_1); |
| 218 | 235 |
| 219 assertTrue("WebContents not destroyed", isWebContentsDestroyed(webConten
ts)); | 236 Assert.assertTrue("WebContents not destroyed", isWebContentsDestroyed(we
bContents)); |
| 220 | 237 |
| 221 Parcel parcel = Parcel.obtain(); | 238 Parcel parcel = Parcel.obtain(); |
| 222 | 239 |
| 223 try { | 240 try { |
| 224 // Serialize the WebContents. | 241 // Serialize the WebContents. |
| 225 parcel.writeParcelable(webContents, 0); | 242 parcel.writeParcelable(webContents, 0); |
| 226 | 243 |
| 227 // Try to read back the WebContents. | 244 // Try to read back the WebContents. |
| 228 parcel.setDataPosition(0); | 245 parcel.setDataPosition(0); |
| 229 WebContents deserializedWebContents = parcel.readParcelable( | 246 WebContents deserializedWebContents = parcel.readParcelable( |
| 230 WebContents.class.getClassLoader()); | 247 WebContents.class.getClassLoader()); |
| 231 | 248 |
| 232 // Make sure we weren't able to deserialize the WebContents. | 249 // Make sure we weren't able to deserialize the WebContents. |
| 233 assertNull("Unexpectedly deserialized a destroyed WebContents", | 250 Assert.assertNull( |
| 234 deserializedWebContents); | 251 "Unexpectedly deserialized a destroyed WebContents", deseria
lizedWebContents); |
| 235 } finally { | 252 } finally { |
| 236 parcel.recycle(); | 253 parcel.recycle(); |
| 237 } | 254 } |
| 238 } | 255 } |
| 239 | 256 |
| 240 /** | 257 /** |
| 241 * Check that destroying a WebContents after serializing it always results i
n a null | 258 * Check that destroying a WebContents after serializing it always results i
n a null |
| 242 * deserialized WebContents. | 259 * deserialized WebContents. |
| 243 * @throws InterruptedException | 260 * @throws InterruptedException |
| 244 * @throws ExecutionException | 261 * @throws ExecutionException |
| 245 */ | 262 */ |
| 263 @Test |
| 246 @SmallTest | 264 @SmallTest |
| 247 public void testDestroyingAWebContentsAfterSerializingDoesNotDeserialize() | 265 public void testDestroyingAWebContentsAfterSerializingDoesNotDeserialize() |
| 248 throws InterruptedException, ExecutionException { | 266 throws InterruptedException, ExecutionException { |
| 249 ContentShellActivity activity = launchContentShellWithUrl(TEST_URL_1); | 267 ContentShellActivity activity = mActivityTestRule.launchContentShellWith
Url(TEST_URL_1); |
| 250 waitForActiveShellToBeDoneLoading(); | 268 mActivityTestRule.waitForActiveShellToBeDoneLoading(); |
| 251 WebContents webContents = activity.getActiveWebContents(); | 269 WebContents webContents = activity.getActiveWebContents(); |
| 252 | 270 |
| 253 Parcel parcel = Parcel.obtain(); | 271 Parcel parcel = Parcel.obtain(); |
| 254 | 272 |
| 255 try { | 273 try { |
| 256 // Serialize the WebContents. | 274 // Serialize the WebContents. |
| 257 parcel.writeParcelable(webContents, 0); | 275 parcel.writeParcelable(webContents, 0); |
| 258 | 276 |
| 259 // Destroy the WebContents. | 277 // Destroy the WebContents. |
| 260 loadNewShell(TEST_URL_1); | 278 mActivityTestRule.loadNewShell(TEST_URL_1); |
| 261 assertTrue("WebContents not destroyed", isWebContentsDestroyed(webCo
ntents)); | 279 Assert.assertTrue("WebContents not destroyed", isWebContentsDestroye
d(webContents)); |
| 262 | 280 |
| 263 // Try to read back the WebContents. | 281 // Try to read back the WebContents. |
| 264 parcel.setDataPosition(0); | 282 parcel.setDataPosition(0); |
| 265 WebContents deserializedWebContents = parcel.readParcelable( | 283 WebContents deserializedWebContents = parcel.readParcelable( |
| 266 WebContents.class.getClassLoader()); | 284 WebContents.class.getClassLoader()); |
| 267 | 285 |
| 268 // Make sure we weren't able to deserialize the WebContents. | 286 // Make sure we weren't able to deserialize the WebContents. |
| 269 assertNull("Unexpectedly deserialized a destroyed WebContents", | 287 Assert.assertNull( |
| 270 deserializedWebContents); | 288 "Unexpectedly deserialized a destroyed WebContents", deseria
lizedWebContents); |
| 271 } finally { | 289 } finally { |
| 272 parcel.recycle(); | 290 parcel.recycle(); |
| 273 } | 291 } |
| 274 } | 292 } |
| 275 | 293 |
| 276 /** | 294 /** |
| 277 * Check that failing a WebContents deserialization doesn't corrupt subseque
nt data in the | 295 * Check that failing a WebContents deserialization doesn't corrupt subseque
nt data in the |
| 278 * Parcel. | 296 * Parcel. |
| 279 * @throws InterruptedException | 297 * @throws InterruptedException |
| 280 */ | 298 */ |
| 299 @Test |
| 281 @SmallTest | 300 @SmallTest |
| 282 public void testFailedDeserializationDoesntCorruptParcel() | 301 public void testFailedDeserializationDoesntCorruptParcel() throws Interrupte
dException { |
| 283 throws InterruptedException { | 302 mActivityTestRule.launchContentShellWithUrl(TEST_URL_1); |
| 284 launchContentShellWithUrl(TEST_URL_1); | 303 mActivityTestRule.waitForActiveShellToBeDoneLoading(); |
| 285 waitForActiveShellToBeDoneLoading(); | 304 WebContents webContents = mActivityTestRule.getWebContents(); |
| 286 WebContents webContents = getWebContents(); | |
| 287 | 305 |
| 288 Parcel parcel = Parcel.obtain(); | 306 Parcel parcel = Parcel.obtain(); |
| 289 | 307 |
| 290 try { | 308 try { |
| 291 // Serialize the WebContents. | 309 // Serialize the WebContents. |
| 292 parcel.writeParcelable(webContents, 0); | 310 parcel.writeParcelable(webContents, 0); |
| 293 | 311 |
| 294 // Serialize a String after the WebContents. | 312 // Serialize a String after the WebContents. |
| 295 parcel.writeString(PARCEL_STRING_TEST_DATA); | 313 parcel.writeString(PARCEL_STRING_TEST_DATA); |
| 296 | 314 |
| 297 // Invalidate all serialized WebContents. | 315 // Invalidate all serialized WebContents. |
| 298 WebContentsImpl.invalidateSerializedWebContentsForTesting(); | 316 WebContentsImpl.invalidateSerializedWebContentsForTesting(); |
| 299 | 317 |
| 300 // Try to read back the WebContents. | 318 // Try to read back the WebContents. |
| 301 parcel.setDataPosition(0); | 319 parcel.setDataPosition(0); |
| 302 WebContents deserializedWebContents = parcel.readParcelable( | 320 WebContents deserializedWebContents = parcel.readParcelable( |
| 303 WebContents.class.getClassLoader()); | 321 WebContents.class.getClassLoader()); |
| 304 | 322 |
| 305 // Make sure we weren't able to deserialize the WebContents. | 323 // Make sure we weren't able to deserialize the WebContents. |
| 306 assertNull("Unexpectedly deserialized a WebContents", deserializedWe
bContents); | 324 Assert.assertNull("Unexpectedly deserialized a WebContents", deseria
lizedWebContents); |
| 307 | 325 |
| 308 // Make sure we can properly deserialize the String after the WebCon
tents. | 326 // Make sure we can properly deserialize the String after the WebCon
tents. |
| 309 assertEquals("Failing to read the WebContents corrupted the parcel", | 327 Assert.assertEquals("Failing to read the WebContents corrupted the p
arcel", |
| 310 PARCEL_STRING_TEST_DATA, parcel.readString()); | 328 PARCEL_STRING_TEST_DATA, parcel.readString()); |
| 311 } finally { | 329 } finally { |
| 312 parcel.recycle(); | 330 parcel.recycle(); |
| 313 } | 331 } |
| 314 } | 332 } |
| 315 | 333 |
| 316 /** | 334 /** |
| 317 * Check that the main frame associated with the WebContents is not null | 335 * Check that the main frame associated with the WebContents is not null |
| 318 * and corresponds with the test URL. | 336 * and corresponds with the test URL. |
| 319 * | 337 * |
| 320 * @throws InterruptedException | 338 * @throws InterruptedException |
| 321 */ | 339 */ |
| 340 @Test |
| 322 @SmallTest | 341 @SmallTest |
| 323 public void testWebContentsMainFrame() throws InterruptedException { | 342 public void testWebContentsMainFrame() throws InterruptedException { |
| 324 final ContentShellActivity activity = launchContentShellWithUrl(TEST_URL
_2); | 343 final ContentShellActivity activity = |
| 325 waitForActiveShellToBeDoneLoading(); | 344 mActivityTestRule.launchContentShellWithUrl(TEST_URL_2); |
| 345 mActivityTestRule.waitForActiveShellToBeDoneLoading(); |
| 326 final WebContents webContents = activity.getActiveWebContents(); | 346 final WebContents webContents = activity.getActiveWebContents(); |
| 327 | 347 |
| 328 ThreadUtils.postOnUiThread(new Runnable() { | 348 ThreadUtils.postOnUiThread(new Runnable() { |
| 329 @Override | 349 @Override |
| 330 public void run() { | 350 public void run() { |
| 331 RenderFrameHost frameHost = webContents.getMainFrame(); | 351 RenderFrameHost frameHost = webContents.getMainFrame(); |
| 332 | 352 |
| 333 assertNotNull(frameHost); | 353 Assert.assertNotNull(frameHost); |
| 334 | 354 |
| 335 assertEquals("RenderFrameHost has incorrect last committed URL",
TEST_URL_2, | 355 Assert.assertEquals("RenderFrameHost has incorrect last committe
d URL", TEST_URL_2, |
| 336 frameHost.getLastCommittedURL()); | 356 frameHost.getLastCommittedURL()); |
| 337 | 357 |
| 338 WebContents associatedWebContents = WebContentsImpl.fromRenderFr
ameHost(frameHost); | 358 WebContents associatedWebContents = WebContentsImpl.fromRenderFr
ameHost(frameHost); |
| 339 assertEquals("RenderFrameHost associated with different WebConte
nts", webContents, | 359 Assert.assertEquals("RenderFrameHost associated with different W
ebContents", |
| 340 associatedWebContents); | 360 webContents, associatedWebContents); |
| 341 } | 361 } |
| 342 }); | 362 }); |
| 343 } | 363 } |
| 344 | 364 |
| 345 private boolean isWebContentsDestroyed(final WebContents webContents) { | 365 private boolean isWebContentsDestroyed(final WebContents webContents) { |
| 346 return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<Boolean
>() { | 366 return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<Boolean
>() { |
| 347 @Override | 367 @Override |
| 348 public Boolean call() throws Exception { | 368 public Boolean call() throws Exception { |
| 349 return webContents.isDestroyed(); | 369 return webContents.isDestroyed(); |
| 350 } | 370 } |
| 351 }); | 371 }); |
| 352 } | 372 } |
| 353 } | 373 } |
| OLD | NEW |