1 // Copyright 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package org.chromium.android_webview.test; 6 7 import android.graphics.Picture; 8 import android.net.http.SslError; 9 import android.webkit.ConsoleMessage; 10 import android.webkit.ValueCallback; 11 12 import org.chromium.base.ThreadUtils; 13 import org.chromium.content.browser.test.util.CallbackHelper; 14 import org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnEvaluateJavaScriptResultHelper; 15 import org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnPageFinishedHelper; 16 import org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnPageStartedHelper; 17 import org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnReceivedErrorHelper; 18 19 /** 20 * AwContentsClient subclass used for testing. 21 */ 22 public class TestAwContentsClient extends NullContentsClient { 23 private String mUpdatedTitle; 24 private boolean mAllowSslError; 25 private final OnPageStartedHelper mOnPageStartedHelper; 26 private final OnPageFinishedHelper mOnPageFinishedHelper; 27 private final OnReceivedErrorHelper mOnReceivedErrorHelper; 28 private final CallbackHelper mOnReceivedSslErrorHelper; 29 private final OnDownloadStartHelper mOnDownloadStartHelper; 30 private final OnReceivedLoginRequestHelper mOnReceivedLoginRequestHelper; 31 private final OnEvaluateJavaScriptResultHelper mOnEvaluateJavaScriptResultHelper; 32 private final AddMessageToConsoleHelper mAddMessageToConsoleHelper; 33 private final OnScaleChangedHelper mOnScaleChangedHelper; 34 private final PictureListenerHelper mPictureListenerHelper; 35 private final ShouldOverrideUrlLoadingHelper mShouldOverrideUrlLoadingHelper; 36 private final DoUpdateVisitedHistoryHelper mDoUpdateVisitedHistoryHelper; 37 38 public TestAwContentsClient() { 39 super(ThreadUtils.getUiThreadLooper()); 40 mOnPageStartedHelper = new OnPageStartedHelper(); 41 mOnPageFinishedHelper = new OnPageFinishedHelper(); 42 mOnReceivedErrorHelper = new OnReceivedErrorHelper(); 43 mOnReceivedSslErrorHelper = new CallbackHelper(); 44 mOnDownloadStartHelper = new OnDownloadStartHelper(); 45 mOnReceivedLoginRequestHelper = new OnReceivedLoginRequestHelper(); 46 mOnEvaluateJavaScriptResultHelper = new OnEvaluateJavaScriptResultHelper(); 47 mAddMessageToConsoleHelper = new AddMessageToConsoleHelper(); 48 mOnScaleChangedHelper = new OnScaleChangedHelper(); 49 mPictureListenerHelper = new PictureListenerHelper(); 50 mShouldOverrideUrlLoadingHelper = new ShouldOverrideUrlLoadingHelper(); 51 mDoUpdateVisitedHistoryHelper = new DoUpdateVisitedHistoryHelper(); 52 mAllowSslError = true; 53 } 54 55 public OnPageStartedHelper getOnPageStartedHelper() { 56 return mOnPageStartedHelper; 57 } 58 59 public OnPageFinishedHelper getOnPageFinishedHelper() { 60 return mOnPageFinishedHelper; 61 } 62 63 public OnReceivedErrorHelper getOnReceivedErrorHelper() { 64 return mOnReceivedErrorHelper; 65 } 66 67 public CallbackHelper getOnReceivedSslErrorHelper() { 68 return mOnReceivedSslErrorHelper; 69 } 70 71 public OnDownloadStartHelper getOnDownloadStartHelper() { 72 return mOnDownloadStartHelper; 73 } 74 75 public OnReceivedLoginRequestHelper getOnReceivedLoginRequestHelper() { 76 return mOnReceivedLoginRequestHelper; 77 } 78 79 public OnEvaluateJavaScriptResultHelper getOnEvaluateJavaScriptResultHelper() { 80 return mOnEvaluateJavaScriptResultHelper; 81 } 82 83 public ShouldOverrideUrlLoadingHelper getShouldOverrideUrlLoadingHelper() { 84 return mShouldOverrideUrlLoadingHelper; 85 } 86 87 public AddMessageToConsoleHelper getAddMessageToConsoleHelper() { 88 return mAddMessageToConsoleHelper; 89 } 90 91 public DoUpdateVisitedHistoryHelper getDoUpdateVisitedHistoryHelper() { 92 return mDoUpdateVisitedHistoryHelper; 93 } 94 95 /** 96 * Callback helper for onScaleChangedScaled. 97 */ 98 public static class OnScaleChangedHelper extends CallbackHelper { 99 private float mPreviousScale; 100 private float mCurrentScale; 101 public void notifyCalled(float oldScale, float newScale) { 102 mPreviousScale = oldScale; 103 mCurrentScale = newScale; 104 super.notifyCalled(); 105 } 106 107 public float getOldScale() { 108 return mPreviousScale; 109 } 110 111 public float getNewScale() { 112 return mCurrentScale; 113 } 114 115 public float getLastScaleRatio() { 116 assert getCallCount() > 0; 117 return mCurrentScale / mPreviousScale; 118 } 119 } 120 121 public OnScaleChangedHelper getOnScaleChangedHelper() { 122 return mOnScaleChangedHelper; 123 } 124 125 public PictureListenerHelper getPictureListenerHelper() { 126 return mPictureListenerHelper; 127 } 128 129 @Override 130 public void onReceivedTitle(String title) { 131 mUpdatedTitle = title; 132 } 133 134 public String getUpdatedTitle() { 135 return mUpdatedTitle; 136 } 137 138 @Override 139 public void onPageStarted(String url) { 140 mOnPageStartedHelper.notifyCalled(url); 141 } 142 143 @Override 144 public void onPageFinished(String url) { 145 mOnPageFinishedHelper.notifyCalled(url); 146 } 147 148 @Override 149 public void onReceivedError(int errorCode, String description, String failingUrl) { 150 mOnReceivedErrorHelper.notifyCalled(errorCode, description, failingUrl); 151 } 152 153 @Override 154 public void onReceivedSslError(ValueCallback<Boolean> callback, SslError error) { 155 callback.onReceiveValue(mAllowSslError); 156 mOnReceivedSslErrorHelper.notifyCalled(); 157 } 158 159 public void setAllowSslError(boolean allow) { 160 mAllowSslError = allow; 161 } 162 163 /** 164 * CallbackHelper for OnDownloadStart. 165 */ 166 public static class OnDownloadStartHelper extends CallbackHelper { 167 private String mUrl; 168 private String mUserAgent; 169 private String mContentDisposition; 170 private String mMimeType; 171 long mContentLength; 172 173 public String getUrl() { 174 assert getCallCount() > 0; 175 return mUrl; 176 } 177 178 public String getUserAgent() { 179 assert getCallCount() > 0; 180 return mUserAgent; 181 } 182 183 public String getContentDisposition() { 184 assert getCallCount() > 0; 185 return mContentDisposition; 186 } 187 188 public String getMimeType() { 189 assert getCallCount() > 0; 190 return mMimeType; 191 } 192 193 public long getContentLength() { 194 assert getCallCount() > 0; 195 return mContentLength; 196 } 197 198 public void notifyCalled(String url, String userAgent, String contentDisposition, 199 String mimeType, long contentLength) { 200 mUrl = url; 201 mUserAgent = userAgent; 202 mContentDisposition = contentDisposition; 203 mMimeType = mimeType; 204 mContentLength = contentLength; 205 notifyCalled(); 206 } 207 } 208 209 @Override 210 public void onDownloadStart(String url, 211 String userAgent, 212 String contentDisposition, 213 String mimeType, 214 long contentLength) { 215 getOnDownloadStartHelper().notifyCalled(url, userAgent, contentDisposition, mimeType, 216 contentLength); 217 } 218 219 /** 220 * CallbackHelper for OnReceivedLoginRequest. 221 */ 222 public static class OnReceivedLoginRequestHelper extends CallbackHelper { 223 private String mRealm; 224 private String mAccount; 225 private String mArgs; 226 227 public String getRealm() { 228 assert getCallCount() > 0; 229 return mRealm; 230 } 231 232 public String getAccount() { 233 assert getCallCount() > 0; 234 return mAccount; 235 } 236 237 public String getArgs() { 238 assert getCallCount() > 0; 239 return mArgs; 240 } 241 242 public void notifyCalled(String realm, String account, String args) { 243 mRealm = realm; 244 mAccount = account; 245 mArgs = args; 246 notifyCalled(); 247 } 248 } 249 250 @Override 251 public void onReceivedLoginRequest(String realm, String account, String args) { 252 getOnReceivedLoginRequestHelper().notifyCalled(realm, account, args); 253 } 254 255 @Override 256 public boolean onConsoleMessage(ConsoleMessage consoleMessage) { 257 mAddMessageToConsoleHelper.notifyCalled(consoleMessage.messageLevel().ordinal(), 258 consoleMessage.message(), consoleMessage.lineNumber(), consoleMessage.sourceId()); 259 return false; 260 } 261 262 /** 263 * Callback helper for AddMessageToConsole. 264 */ 265 public static class AddMessageToConsoleHelper extends CallbackHelper { 266 private int mLevel; 267 private String mMessage; 268 private int mLineNumber; 269 private String mSourceId; 270 271 public int getLevel() { 272 assert getCallCount() > 0; 273 return mLevel; 274 } 275 276 public String getMessage() { 277 assert getCallCount() > 0; 278 return mMessage; 279 } 280 281 public int getLineNumber() { 282 assert getCallCount() > 0; 283 return mLineNumber; 284 } 285 286 public String getSourceId() { 287 assert getCallCount() > 0; 288 return mSourceId; 289 } 290 291 void notifyCalled(int level, String message, int lineNumer, String sourceId) { 292 mLevel = level; 293 mMessage = message; 294 mLineNumber = lineNumer; 295 mSourceId = sourceId; 296 notifyCalled(); 297 } 298 } 299 300 @Override 301 public void onScaleChangedScaled(float oldScale, float newScale) { 302 mOnScaleChangedHelper.notifyCalled(oldScale, newScale); 303 } 304 305 /** 306 * Callback helper for PictureListener. 307 */ 308 public static class PictureListenerHelper extends CallbackHelper { 309 // Generally null, depending on |invalidationOnly| in enableOnNewPicture() 310 private Picture mPicture; 311 312 public Picture getPicture() { 313 assert getCallCount() > 0; 314 return mPicture; 315 } 316 317 void notifyCalled(Picture picture) { 318 mPicture = picture; 319 notifyCalled(); 320 } 321 } 322 323 @Override 324 public void onNewPicture(Picture picture) { 325 mPictureListenerHelper.notifyCalled(picture); 326 } 327 328 /** 329 * Callback helper for ShouldOverrideUrlLoading. 330 */ 331 public static class ShouldOverrideUrlLoadingHelper extends CallbackHelper { 332 private String mShouldOverrideUrlLoadingUrl; 333 private String mPreviousShouldOverrideUrlLoadingUrl; 334 private boolean mShouldOverrideUrlLoadingReturnValue = false; 335 void setShouldOverrideUrlLoadingUrl(String url) { 336 mShouldOverrideUrlLoadingUrl = url; 337 } 338 void setPreviousShouldOverrideUrlLoadingUrl(String url) { 339 mPreviousShouldOverrideUrlLoadingUrl = url; 340 } 341 void setShouldOverrideUrlLoadingReturnValue(boolean value) { 342 mShouldOverrideUrlLoadingReturnValue = value; 343 } 344 public String getShouldOverrideUrlLoadingUrl() { 345 assert getCallCount() > 0; 346 return mShouldOverrideUrlLoadingUrl; 347 } 348 public String getPreviousShouldOverrideUrlLoadingUrl() { 349 assert getCallCount() > 1; 350 return mPreviousShouldOverrideUrlLoadingUrl; 351 } 352 public boolean getShouldOverrideUrlLoadingReturnValue() { 353 return mShouldOverrideUrlLoadingReturnValue; 354 } 355 public void notifyCalled(String url) { 356 mPreviousShouldOverrideUrlLoadingUrl = mShouldOverrideUrlLoadingUrl; 357 mShouldOverrideUrlLoadingUrl = url; 358 notifyCalled(); 359 } 360 } 361 362 @Override 363 public boolean shouldOverrideUrlLoading(String url) { 364 super.shouldOverrideUrlLoading(url); 365 boolean returnValue = 366 mShouldOverrideUrlLoadingHelper.getShouldOverrideUrlLoadingReturnValue(); 367 mShouldOverrideUrlLoadingHelper.notifyCalled(url); 368 return returnValue; 369 } 370 371 372 /** 373 * Callback helper for doUpdateVisitedHistory. 374 */ 375 public static class DoUpdateVisitedHistoryHelper extends CallbackHelper { 376 String mUrl; 377 boolean mIsReload; 378 379 public String getUrl() { 380 assert getCallCount() > 0; 381 return mUrl; 382 } 383 384 public boolean getIsReload() { 385 assert getCallCount() > 0; 386 return mIsReload; 387 } 388 389 public void notifyCalled(String url, boolean isReload) { 390 mUrl = url; 391 mIsReload = isReload; 392 notifyCalled(); 393 } 394 } 395 396 @Override 397 public void doUpdateVisitedHistory(String url, boolean isReload) { 398 getDoUpdateVisitedHistoryHelper().notifyCalled(url, isReload); 399 } 400 } 401