summaryrefslogtreecommitdiff
path: root/android_webview/javatests/src
diff options
context:
space:
mode:
Diffstat (limited to 'android_webview/javatests/src')
-rw-r--r--android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientGetDefaultVideoPosterTest.java6
-rw-r--r--android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldInterceptRequestTest.java253
-rw-r--r--android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldOverrideUrlLoadingTest.java58
-rw-r--r--android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java14
-rw-r--r--android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java10
-rw-r--r--android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerStartupTest.java5
-rw-r--r--android_webview/javatests/src/org/chromium/android_webview/test/KeySystemTest.java7
-rw-r--r--android_webview/javatests/src/org/chromium/android_webview/test/util/CommonResources.java18
8 files changed, 270 insertions, 101 deletions
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientGetDefaultVideoPosterTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientGetDefaultVideoPosterTest.java
index 8891fb9822..fea72ffa93 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientGetDefaultVideoPosterTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientGetDefaultVideoPosterTest.java
@@ -10,8 +10,8 @@ import android.graphics.BitmapFactory;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.Log;
+import org.chromium.android_webview.AwWebResourceResponse;
import org.chromium.android_webview.DefaultVideoPosterRequestHandler;
-import org.chromium.android_webview.InterceptedRequestData;
import org.chromium.base.test.util.Feature;
import org.chromium.content.browser.test.util.CallbackHelper;
@@ -77,7 +77,7 @@ public class AwContentsClientGetDefaultVideoPosterTest extends AwTestBase {
new DefaultVideoPosterClient(getInstrumentation().getTargetContext());
DefaultVideoPosterRequestHandler handler =
new DefaultVideoPosterRequestHandler(contentsClient);
- InterceptedRequestData requestData =
+ AwWebResourceResponse requestData =
handler.shouldInterceptRequest(handler.getDefaultVideoPosterURL());
assertTrue(requestData.getMimeType().equals("image/png"));
Bitmap bitmap = BitmapFactory.decodeStream(requestData.getData());
@@ -94,7 +94,7 @@ public class AwContentsClientGetDefaultVideoPosterTest extends AwTestBase {
NullContentsClient contentsClient = new NullContentsClient();
DefaultVideoPosterRequestHandler handler =
new DefaultVideoPosterRequestHandler(contentsClient);
- InterceptedRequestData requestData =
+ AwWebResourceResponse requestData =
handler.shouldInterceptRequest(handler.getDefaultVideoPosterURL());
assertTrue(requestData.getMimeType().equals("image/png"));
InputStream in = requestData.getData();
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldInterceptRequestTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldInterceptRequestTest.java
index fff12d2898..e1bcb59fbf 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldInterceptRequestTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldInterceptRequestTest.java
@@ -8,8 +8,10 @@ import android.test.suitebuilder.annotation.SmallTest;
import android.util.Pair;
import org.chromium.android_webview.AwContents;
-import org.chromium.android_webview.InterceptedRequestData;
+import org.chromium.android_webview.AwContentsClient.ShouldInterceptRequestParams;
+import org.chromium.android_webview.AwWebResourceResponse;
import org.chromium.android_webview.test.util.CommonResources;
+import org.chromium.android_webview.test.util.JSUtils;
import org.chromium.base.test.util.Feature;
import org.chromium.base.test.util.TestFileUtil;
import org.chromium.content.browser.test.util.CallbackHelper;
@@ -20,7 +22,9 @@ import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CountDownLatch;
@@ -35,27 +39,35 @@ public class AwContentsClientShouldInterceptRequestTest extends AwTestBase {
public static class ShouldInterceptRequestHelper extends CallbackHelper {
private List<String> mShouldInterceptRequestUrls = new ArrayList<String>();
- private ConcurrentHashMap<String, InterceptedRequestData> mReturnValuesByUrls
- = new ConcurrentHashMap<String, InterceptedRequestData>();
+ private ConcurrentHashMap<String, AwWebResourceResponse> mReturnValuesByUrls
+ = new ConcurrentHashMap<String, AwWebResourceResponse>();
+ private ConcurrentHashMap<String, ShouldInterceptRequestParams> mParamsByUrls
+ = new ConcurrentHashMap<String, ShouldInterceptRequestParams>();
// This is read from the IO thread, so needs to be marked volatile.
- private volatile InterceptedRequestData mShouldInterceptRequestReturnValue = null;
- void setReturnValue(InterceptedRequestData value) {
+ private volatile AwWebResourceResponse mShouldInterceptRequestReturnValue = null;
+ void setReturnValue(AwWebResourceResponse value) {
mShouldInterceptRequestReturnValue = value;
}
- void setReturnValueForUrl(String url, InterceptedRequestData value) {
+ void setReturnValueForUrl(String url, AwWebResourceResponse value) {
mReturnValuesByUrls.put(url, value);
}
public List<String> getUrls() {
assert getCallCount() > 0;
return mShouldInterceptRequestUrls;
}
- public InterceptedRequestData getReturnValue(String url) {
- InterceptedRequestData value = mReturnValuesByUrls.get(url);
+ public AwWebResourceResponse getReturnValue(String url) {
+ AwWebResourceResponse value = mReturnValuesByUrls.get(url);
if (value != null) return value;
return mShouldInterceptRequestReturnValue;
}
- public void notifyCalled(String url) {
- mShouldInterceptRequestUrls.add(url);
+ public ShouldInterceptRequestParams getParamsForUrl(String url) {
+ assert getCallCount() > 0;
+ assert mParamsByUrls.containsKey(url);
+ return mParamsByUrls.get(url);
+ }
+ public void notifyCalled(ShouldInterceptRequestParams params) {
+ mShouldInterceptRequestUrls.add(params.url);
+ mParamsByUrls.put(params.url, params);
notifyCalled();
}
}
@@ -75,9 +87,10 @@ public class AwContentsClientShouldInterceptRequestTest extends AwTestBase {
}
@Override
- public InterceptedRequestData shouldInterceptRequest(String url) {
- InterceptedRequestData returnValue = mShouldInterceptRequestHelper.getReturnValue(url);
- mShouldInterceptRequestHelper.notifyCalled(url);
+ public AwWebResourceResponse shouldInterceptRequest(ShouldInterceptRequestParams params) {
+ AwWebResourceResponse returnValue =
+ mShouldInterceptRequestHelper.getReturnValue(params.url);
+ mShouldInterceptRequestHelper.notifyCalled(params);
return returnValue;
}
@@ -104,6 +117,9 @@ public class AwContentsClientShouldInterceptRequestTest extends AwTestBase {
}
}
+ final int teapotStatusCode = 418;
+ final String teapotResponsePhrase = "I'm a teapot";
+
private String addPageToTestServer(TestWebServer webServer, String httpPath, String html) {
List<Pair<String, String>> headers = new ArrayList<Pair<String, String>>();
headers.add(Pair.create("Content-Type", "text/html"));
@@ -116,11 +132,11 @@ public class AwContentsClientShouldInterceptRequestTest extends AwTestBase {
CommonResources.ABOUT_HTML);
}
- private InterceptedRequestData stringToInterceptedRequestData(String input) throws Throwable {
+ private AwWebResourceResponse stringToAwWebResourceResponse(String input) throws Throwable {
final String mimeType = "text/html";
final String encoding = "UTF-8";
- return new InterceptedRequestData(
+ return new AwWebResourceResponse(
mimeType, encoding, new ByteArrayInputStream(input.getBytes(encoding)));
}
@@ -150,14 +166,13 @@ public class AwContentsClientShouldInterceptRequestTest extends AwTestBase {
@SmallTest
@Feature({"AndroidWebView"})
- public void testCalledWithCorrectUrl() throws Throwable {
+ public void testCalledWithCorrectUrlParam() throws Throwable {
final String aboutPageUrl = addAboutPageToTestServer(mWebServer);
- int callCount = mShouldInterceptRequestHelper.getCallCount();
int onPageFinishedCallCount = mContentsClient.getOnPageFinishedHelper().getCallCount();
+ int callCount = mShouldInterceptRequestHelper.getCallCount();
loadUrlAsync(mAwContents, aboutPageUrl);
-
mShouldInterceptRequestHelper.waitForCallback(callCount);
assertEquals(1, mShouldInterceptRequestHelper.getUrls().size());
assertEquals(aboutPageUrl,
@@ -169,6 +184,95 @@ public class AwContentsClientShouldInterceptRequestTest extends AwTestBase {
@SmallTest
@Feature({"AndroidWebView"})
+ public void testCalledWithCorrectIsMainFrameParam() throws Throwable {
+ final String subframeUrl = addAboutPageToTestServer(mWebServer);
+ final String pageWithIframeUrl = addPageToTestServer(mWebServer, "/page_with_iframe.html",
+ CommonResources.makeHtmlPageFrom("",
+ "<iframe src=\"" + subframeUrl + "\"/>"));
+
+ int callCount = mShouldInterceptRequestHelper.getCallCount();
+ loadUrlAsync(mAwContents, pageWithIframeUrl);
+ mShouldInterceptRequestHelper.waitForCallback(callCount, 2);
+ assertEquals(2, mShouldInterceptRequestHelper.getUrls().size());
+ assertEquals(false,
+ mShouldInterceptRequestHelper.getParamsForUrl(subframeUrl).isMainFrame);
+ assertEquals(true,
+ mShouldInterceptRequestHelper.getParamsForUrl(pageWithIframeUrl).isMainFrame);
+ }
+
+ @SmallTest
+ @Feature({"AndroidWebView"})
+ public void testCalledWithCorrectMethodParam() throws Throwable {
+ final String pageToPostToUrl = addAboutPageToTestServer(mWebServer);
+ final String pageWithFormUrl = addPageToTestServer(mWebServer, "/page_with_form.html",
+ CommonResources.makeHtmlPageWithSimplePostFormTo(pageToPostToUrl));
+ enableJavaScriptOnUiThread(mAwContents);
+
+ int callCount = mShouldInterceptRequestHelper.getCallCount();
+ loadUrlAsync(mAwContents, pageWithFormUrl);
+ mShouldInterceptRequestHelper.waitForCallback(callCount);
+ assertEquals("GET",
+ mShouldInterceptRequestHelper.getParamsForUrl(pageWithFormUrl).method);
+
+ callCount = mShouldInterceptRequestHelper.getCallCount();
+ JSUtils.clickOnLinkUsingJs(this, mAwContents,
+ mContentsClient.getOnEvaluateJavaScriptResultHelper(), "link");
+ mShouldInterceptRequestHelper.waitForCallback(callCount);
+ assertEquals("POST",
+ mShouldInterceptRequestHelper.getParamsForUrl(pageToPostToUrl).method);
+ }
+
+ @SmallTest
+ @Feature({"AndroidWebView"})
+ public void testCalledWithCorrectHasUserGestureParam() throws Throwable {
+ final String aboutPageUrl = addAboutPageToTestServer(mWebServer);
+ final String pageWithLinkUrl = addPageToTestServer(mWebServer, "/page_with_link.html",
+ CommonResources.makeHtmlPageWithSimpleLinkTo(aboutPageUrl));
+ enableJavaScriptOnUiThread(mAwContents);
+
+ int callCount = mShouldInterceptRequestHelper.getCallCount();
+ loadUrlAsync(mAwContents, pageWithLinkUrl);
+ mShouldInterceptRequestHelper.waitForCallback(callCount);
+ assertEquals(false,
+ mShouldInterceptRequestHelper.getParamsForUrl(pageWithLinkUrl).hasUserGesture);
+
+ callCount = mShouldInterceptRequestHelper.getCallCount();
+ JSUtils.clickOnLinkUsingJs(this, mAwContents,
+ mContentsClient.getOnEvaluateJavaScriptResultHelper(), "link");
+ mShouldInterceptRequestHelper.waitForCallback(callCount);
+ assertEquals(true,
+ mShouldInterceptRequestHelper.getParamsForUrl(aboutPageUrl).hasUserGesture);
+ }
+
+ @SmallTest
+ @Feature({"AndroidWebView"})
+ public void testCalledWithCorrectHeadersParam() throws Throwable {
+ final String headerName = "X-Test-Header-Name";
+ final String headerValue = "TestHeaderValue";
+ final String syncGetUrl = addPageToTestServer(mWebServer, "/intercept_me",
+ CommonResources.ABOUT_HTML);
+ final String mainPageUrl = addPageToTestServer(mWebServer, "/main",
+ CommonResources.makeHtmlPageFrom("",
+ "<script>" +
+ " var xhr = new XMLHttpRequest();" +
+ " xhr.open('GET', '" + syncGetUrl + "', false);" +
+ " xhr.setRequestHeader('" + headerName + "', '" + headerValue + "'); " +
+ " xhr.send(null);" +
+ "</script>"));
+ enableJavaScriptOnUiThread(mAwContents);
+
+ int callCount = mShouldInterceptRequestHelper.getCallCount();
+ loadUrlAsync(mAwContents, mainPageUrl);
+ mShouldInterceptRequestHelper.waitForCallback(callCount, 2);
+
+ Map<String, String> headers =
+ mShouldInterceptRequestHelper.getParamsForUrl(syncGetUrl).requestHeaders;
+ assertTrue(headers.containsKey(headerName));
+ assertEquals(headerValue, headers.get(headerName));
+ }
+
+ @SmallTest
+ @Feature({"AndroidWebView"})
public void testOnLoadResourceCalledWithCorrectUrl() throws Throwable {
final String aboutPageUrl = addAboutPageToTestServer(mWebServer);
final TestAwContentsClient.OnLoadResourceHelper onLoadResourceHelper =
@@ -188,19 +292,19 @@ public class AwContentsClientShouldInterceptRequestTest extends AwTestBase {
final String aboutPageUrl = addAboutPageToTestServer(mWebServer);
mShouldInterceptRequestHelper.setReturnValue(
- new InterceptedRequestData("text/html", "UTF-8", null));
+ new AwWebResourceResponse("text/html", "UTF-8", null));
int callCount = mShouldInterceptRequestHelper.getCallCount();
loadUrlAsync(mAwContents, aboutPageUrl);
mShouldInterceptRequestHelper.waitForCallback(callCount);
mShouldInterceptRequestHelper.setReturnValue(
- new InterceptedRequestData(null, null, new ByteArrayInputStream(new byte[0])));
+ new AwWebResourceResponse(null, null, new ByteArrayInputStream(new byte[0])));
callCount = mShouldInterceptRequestHelper.getCallCount();
loadUrlAsync(mAwContents, aboutPageUrl);
mShouldInterceptRequestHelper.waitForCallback(callCount);
mShouldInterceptRequestHelper.setReturnValue(
- new InterceptedRequestData(null, null, null));
+ new AwWebResourceResponse(null, null, null));
callCount = mShouldInterceptRequestHelper.getCallCount();
loadUrlAsync(mAwContents, aboutPageUrl);
mShouldInterceptRequestHelper.waitForCallback(callCount);
@@ -241,7 +345,7 @@ public class AwContentsClientShouldInterceptRequestTest extends AwTestBase {
final String aboutPageUrl = addAboutPageToTestServer(mWebServer);
mShouldInterceptRequestHelper.setReturnValue(
- new InterceptedRequestData("text/html", "UTF-8", new EmptyInputStream()));
+ new AwWebResourceResponse("text/html", "UTF-8", new EmptyInputStream()));
int shouldInterceptRequestCallCount = mShouldInterceptRequestHelper.getCallCount();
int onPageFinishedCallCount = mContentsClient.getOnPageFinishedHelper().getCallCount();
@@ -251,11 +355,11 @@ public class AwContentsClientShouldInterceptRequestTest extends AwTestBase {
mContentsClient.getOnPageFinishedHelper().waitForCallback(onPageFinishedCallCount);
}
- private static class SlowInterceptedRequestData extends InterceptedRequestData {
+ private static class SlowAwWebResourceResponse extends AwWebResourceResponse {
private CallbackHelper mReadStartedCallbackHelper = new CallbackHelper();
private CountDownLatch mLatch = new CountDownLatch(1);
- public SlowInterceptedRequestData(String mimeType, String encoding, InputStream data) {
+ public SlowAwWebResourceResponse(String mimeType, String encoding, InputStream data) {
super(mimeType, encoding, data);
}
@@ -285,14 +389,14 @@ public class AwContentsClientShouldInterceptRequestTest extends AwTestBase {
final String aboutPageUrl = addAboutPageToTestServer(mWebServer);
final String aboutPageData = makePageWithTitle("some title");
final String encoding = "UTF-8";
- final SlowInterceptedRequestData slowInterceptedRequestData =
- new SlowInterceptedRequestData("text/html", encoding,
+ final SlowAwWebResourceResponse slowAwWebResourceResponse =
+ new SlowAwWebResourceResponse("text/html", encoding,
new ByteArrayInputStream(aboutPageData.getBytes(encoding)));
- mShouldInterceptRequestHelper.setReturnValue(slowInterceptedRequestData);
- int callCount = slowInterceptedRequestData.getReadStartedCallbackHelper().getCallCount();
+ mShouldInterceptRequestHelper.setReturnValue(slowAwWebResourceResponse);
+ int callCount = slowAwWebResourceResponse.getReadStartedCallbackHelper().getCallCount();
loadUrlAsync(mAwContents, aboutPageUrl);
- slowInterceptedRequestData.getReadStartedCallbackHelper().waitForCallback(callCount);
+ slowAwWebResourceResponse.getReadStartedCallbackHelper().waitForCallback(callCount);
// Now the AwContents is "stuck" waiting for the SlowInputStream to finish reading so we
// delete it to make sure that the dangling 'read' task doesn't cause a crash. Unfortunately
@@ -312,12 +416,12 @@ public class AwContentsClientShouldInterceptRequestTest extends AwTestBase {
}
});
- slowInterceptedRequestData.unblockReads();
+ slowAwWebResourceResponse.unblockReads();
}
@SmallTest
@Feature({"AndroidWebView"})
- public void testHttpStatusField() throws Throwable {
+ public void testHttpStatusCodeAndText() throws Throwable {
final String syncGetUrl = mWebServer.getResponseUrl("/intercept_me");
final String syncGetJs =
"(function() {" +
@@ -325,7 +429,8 @@ public class AwContentsClientShouldInterceptRequestTest extends AwTestBase {
" xhr.open('GET', '" + syncGetUrl + "', false);" +
" xhr.send(null);" +
" console.info('xhr.status = ' + xhr.status);" +
- " return xhr.status;" +
+ " console.info('xhr.statusText = ' + xhr.statusText);" +
+ " return '[' + xhr.status + '][' + xhr.statusText + ']';" +
"})();";
enableJavaScriptOnUiThread(mAwContents);
@@ -333,32 +438,47 @@ public class AwContentsClientShouldInterceptRequestTest extends AwTestBase {
loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), aboutPageUrl);
mShouldInterceptRequestHelper.setReturnValue(
- new InterceptedRequestData("text/html", "UTF-8", null));
- assertEquals("404",
+ new AwWebResourceResponse("text/html", "UTF-8", null));
+ assertEquals("\"[404][Not Found]\"",
executeJavaScriptAndWaitForResult(mAwContents, mContentsClient, syncGetJs));
mShouldInterceptRequestHelper.setReturnValue(
- new InterceptedRequestData("text/html", "UTF-8", new EmptyInputStream()));
- assertEquals("200",
+ new AwWebResourceResponse("text/html", "UTF-8", new EmptyInputStream()));
+ assertEquals("\"[200][OK]\"",
+ executeJavaScriptAndWaitForResult(mAwContents, mContentsClient, syncGetJs));
+
+ mShouldInterceptRequestHelper.setReturnValue(
+ new AwWebResourceResponse("text/html", "UTF-8", new EmptyInputStream(),
+ teapotStatusCode, teapotResponsePhrase, new HashMap<String, String>()));
+ assertEquals("\"[" + teapotStatusCode + "][" + teapotResponsePhrase + "]\"",
executeJavaScriptAndWaitForResult(mAwContents, mContentsClient, syncGetJs));
}
- @SmallTest
- @Feature({"AndroidWebView"})
- public void testHttpResponseClientHeader() throws Throwable {
- final String clientResponseHeaderName = "Client-Via";
- // JSON stringification applied by executeJavaScriptAndWaitForResult adds quotes
- // around returned strings.
- final String clientResponseHeaderValue = "\"shouldInterceptRequest\"";
- final String syncGetUrl = mWebServer.getResponseUrl("/intercept_me");
+ private String getHeaderValue(AwContents awContents, TestAwContentsClient contentsClient,
+ String url, String headerName) throws Exception {
final String syncGetJs =
"(function() {" +
" var xhr = new XMLHttpRequest();" +
- " xhr.open('GET', '" + syncGetUrl + "', false);" +
+ " xhr.open('GET', '" + url + "', false);" +
" xhr.send(null);" +
" console.info(xhr.getAllResponseHeaders());" +
- " return xhr.getResponseHeader('" + clientResponseHeaderName + "');" +
+ " return xhr.getResponseHeader('" + headerName + "');" +
"})();";
+ String header = executeJavaScriptAndWaitForResult(awContents, contentsClient, syncGetJs);
+ // JSON stringification applied by executeJavaScriptAndWaitForResult adds quotes
+ // around returned strings.
+ assertTrue(header.length() > 2);
+ assertEquals('"', header.charAt(0));
+ assertEquals('"', header.charAt(header.length() - 1));
+ return header.substring(1, header.length() - 1);
+ }
+
+ @SmallTest
+ @Feature({"AndroidWebView"})
+ public void testHttpResponseClientViaHeader() throws Throwable {
+ final String clientResponseHeaderName = "Client-Via";
+ final String clientResponseHeaderValue = "shouldInterceptRequest";
+ final String syncGetUrl = mWebServer.getResponseUrl("/intercept_me");
enableJavaScriptOnUiThread(mAwContents);
final String aboutPageUrl = addAboutPageToTestServer(mWebServer);
@@ -367,15 +487,34 @@ public class AwContentsClientShouldInterceptRequestTest extends AwTestBase {
// The response header is set regardless of whether the embedder has provided a
// valid resource stream.
mShouldInterceptRequestHelper.setReturnValue(
- new InterceptedRequestData("text/html", "UTF-8", null));
+ new AwWebResourceResponse("text/html", "UTF-8", null));
assertEquals(clientResponseHeaderValue,
- executeJavaScriptAndWaitForResult(mAwContents, mContentsClient, syncGetJs));
+ getHeaderValue(mAwContents, mContentsClient, syncGetUrl, clientResponseHeaderName));
mShouldInterceptRequestHelper.setReturnValue(
- new InterceptedRequestData("text/html", "UTF-8", new EmptyInputStream()));
+ new AwWebResourceResponse("text/html", "UTF-8", new EmptyInputStream()));
assertEquals(clientResponseHeaderValue,
- executeJavaScriptAndWaitForResult(mAwContents, mContentsClient, syncGetJs));
+ getHeaderValue(mAwContents, mContentsClient, syncGetUrl, clientResponseHeaderName));
+
}
+ @SmallTest
+ @Feature({"AndroidWebView"})
+ public void testHttpResponseHeader() throws Throwable {
+ final String clientResponseHeaderName = "X-Test-Header-Name";
+ final String clientResponseHeaderValue = "TestHeaderValue";
+ final String syncGetUrl = mWebServer.getResponseUrl("/intercept_me");
+ final Map<String, String> headers = new HashMap<String, String>();
+ headers.put(clientResponseHeaderName, clientResponseHeaderValue);
+ enableJavaScriptOnUiThread(mAwContents);
+
+ final String aboutPageUrl = addAboutPageToTestServer(mWebServer);
+ loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), aboutPageUrl);
+
+ mShouldInterceptRequestHelper.setReturnValue(
+ new AwWebResourceResponse("text/html", "UTF-8", null, 0, null, headers));
+ assertEquals(clientResponseHeaderValue,
+ getHeaderValue(mAwContents, mContentsClient, syncGetUrl, clientResponseHeaderName));
+ }
private String makePageWithTitle(String title) {
return CommonResources.makeHtmlPageFrom("<title>" + title + "</title>",
@@ -389,7 +528,7 @@ public class AwContentsClientShouldInterceptRequestTest extends AwTestBase {
final String expectedPage = makePageWithTitle(expectedTitle);
mShouldInterceptRequestHelper.setReturnValue(
- stringToInterceptedRequestData(expectedPage));
+ stringToAwWebResourceResponse(expectedPage));
final String aboutPageUrl = addAboutPageToTestServer(mWebServer);
@@ -403,7 +542,7 @@ public class AwContentsClientShouldInterceptRequestTest extends AwTestBase {
@Feature({"AndroidWebView"})
public void testDoesNotChangeReportedUrl() throws Throwable {
mShouldInterceptRequestHelper.setReturnValue(
- stringToInterceptedRequestData(makePageWithTitle("some title")));
+ stringToAwWebResourceResponse(makePageWithTitle("some title")));
final String aboutPageUrl = addAboutPageToTestServer(mWebServer);
@@ -420,7 +559,7 @@ public class AwContentsClientShouldInterceptRequestTest extends AwTestBase {
mContentsClient.getOnReceivedErrorHelper();
mShouldInterceptRequestHelper.setReturnValue(
- new InterceptedRequestData("text/html", "UTF-8", null));
+ new AwWebResourceResponse("text/html", "UTF-8", null));
final String aboutPageUrl = addAboutPageToTestServer(mWebServer);
final int callCount = onReceivedErrorHelper.getCallCount();
@@ -451,7 +590,7 @@ public class AwContentsClientShouldInterceptRequestTest extends AwTestBase {
@SmallTest
@Feature({"AndroidWebView"})
public void testOnReceivedErrorCallback() throws Throwable {
- mShouldInterceptRequestHelper.setReturnValue(new InterceptedRequestData(null, null, null));
+ mShouldInterceptRequestHelper.setReturnValue(new AwWebResourceResponse(null, null, null));
OnReceivedErrorHelper onReceivedErrorHelper = mContentsClient.getOnReceivedErrorHelper();
int onReceivedErrorHelperCallCount = onReceivedErrorHelper.getCallCount();
loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), "foo://bar");
@@ -468,7 +607,7 @@ public class AwContentsClientShouldInterceptRequestTest extends AwTestBase {
addPageToTestServer(mWebServer, "/page_with_image.html",
CommonResources.getOnImageLoadedHtml(CommonResources.FAVICON_FILENAME));
mShouldInterceptRequestHelper.setReturnValueForUrl(
- imageUrl, new InterceptedRequestData(null, null, null));
+ imageUrl, new AwWebResourceResponse(null, null, null));
OnReceivedErrorHelper onReceivedErrorHelper = mContentsClient.getOnReceivedErrorHelper();
int onReceivedErrorHelperCallCount = onReceivedErrorHelper.getCallCount();
loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), pageWithImage);
@@ -479,12 +618,12 @@ public class AwContentsClientShouldInterceptRequestTest extends AwTestBase {
@Feature({"AndroidWebView"})
public void testCalledForIframe() throws Throwable {
final String aboutPageUrl = addAboutPageToTestServer(mWebServer);
- final String pageWithIframe = addPageToTestServer(mWebServer, "/page_with_iframe.html",
+ final String pageWithIframeUrl = addPageToTestServer(mWebServer, "/page_with_iframe.html",
CommonResources.makeHtmlPageFrom("",
"<iframe src=\"" + aboutPageUrl + "\"/>"));
int callCount = mShouldInterceptRequestHelper.getCallCount();
- loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), pageWithIframe);
+ loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), pageWithIframeUrl);
mShouldInterceptRequestHelper.waitForCallback(callCount, 2);
assertEquals(2, mShouldInterceptRequestHelper.getUrls().size());
assertEquals(aboutPageUrl, mShouldInterceptRequestHelper.getUrls().get(1));
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldOverrideUrlLoadingTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldOverrideUrlLoadingTest.java
index 5ccc6ebb3d..8656e4266f 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldOverrideUrlLoadingTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldOverrideUrlLoadingTest.java
@@ -64,15 +64,12 @@ public class AwContentsClientShouldOverrideUrlLoadingTest extends AwTestBase {
});
}
- private String makeHtmlPageFrom(String headers, String body) {
- return CommonResources.makeHtmlPageFrom("<title>" + TITLE + "</title> " + headers, body);
+ private String getTestPageCommonHeaders() {
+ return "<title>" + TITLE + "</title> ";
}
- private String getHtmlForPageWithSimpleLinkTo(String destination) {
- return makeHtmlPageFrom("",
- "<a href=\"" + destination + "\" id=\"link\">" +
- "<img class=\"big\" />" +
- "</a>");
+ private String makeHtmlPageFrom(String headers, String body) {
+ return CommonResources.makeHtmlPageFrom(getTestPageCommonHeaders() + headers, body);
}
private String getHtmlForPageWithJsAssignLinkTo(String url) {
@@ -104,13 +101,6 @@ public class AwContentsClientShouldOverrideUrlLoadingTest extends AwTestBase {
method, timeout));
}
- private String getHtmlForPageWithSimplePostFormTo(String destination) {
- return makeHtmlPageFrom("",
- "<form action=\"" + destination + "\" method=\"post\">" +
- "<input type=\"submit\" value=\"post\" id=\"link\">" +
- "</form>");
- }
-
private String addPageToTestServer(TestWebServer webServer, String httpPath, String html) {
List<Pair<String, String>> headers = new ArrayList<Pair<String, String>>();
headers.add(Pair.create("Content-Type", "text/html"));
@@ -134,7 +124,7 @@ public class AwContentsClientShouldOverrideUrlLoadingTest extends AwTestBase {
contentsClient.getShouldOverrideUrlLoadingHelper();
loadDataSync(awContents, contentsClient.getOnPageFinishedHelper(),
- getHtmlForPageWithSimpleLinkTo(DATA_URL), "text/html", false);
+ CommonResources.makeHtmlPageWithSimpleLinkTo(DATA_URL), "text/html", false);
assertEquals(0, shouldOverrideUrlLoadingHelper.getCallCount());
}
@@ -217,7 +207,8 @@ public class AwContentsClientShouldOverrideUrlLoadingTest extends AwTestBase {
setShouldOverrideUrlLoadingReturnValueOnUiThread(shouldOverrideUrlLoadingHelper, true);
loadDataSync(awContents, contentsClient.getOnPageFinishedHelper(),
- getHtmlForPageWithSimpleLinkTo(DATA_URL), "text/html", false);
+ CommonResources.makeHtmlPageWithSimpleLinkTo(getTestPageCommonHeaders(),
+ DATA_URL), "text/html", false);
assertEquals(TITLE, getTitleOnUiThread(awContents));
}
@@ -234,7 +225,7 @@ public class AwContentsClientShouldOverrideUrlLoadingTest extends AwTestBase {
OnPageStartedHelper onPageStartedHelper = contentsClient.getOnPageStartedHelper();
loadDataSync(awContents, contentsClient.getOnPageFinishedHelper(),
- getHtmlForPageWithSimpleLinkTo(DATA_URL), "text/html", false);
+ CommonResources.makeHtmlPageWithSimpleLinkTo(DATA_URL), "text/html", false);
final int shouldOverrideUrlLoadingCallCount = shouldOverrideUrlLoadingHelper.getCallCount();
final int onPageStartedCallCount = onPageStartedHelper.getCallCount();
@@ -259,7 +250,7 @@ public class AwContentsClientShouldOverrideUrlLoadingTest extends AwTestBase {
final int onReceivedErrorCallCount = onReceivedErrorHelper.getCallCount();
loadDataSync(awContents, contentsClient.getOnPageFinishedHelper(),
- getHtmlForPageWithSimpleLinkTo(DATA_URL), "text/html", false);
+ CommonResources.makeHtmlPageWithSimpleLinkTo(DATA_URL), "text/html", false);
final int shouldOverrideUrlLoadingCallCount = shouldOverrideUrlLoadingHelper.getCallCount();
@@ -301,11 +292,11 @@ public class AwContentsClientShouldOverrideUrlLoadingTest extends AwTestBase {
final String anchorLinkPath = "/anchor_link.html";
final String anchorLinkUrl = mWebServer.getResponseUrl(anchorLinkPath);
addPageToTestServer(mWebServer, anchorLinkPath,
- getHtmlForPageWithSimpleLinkTo(anchorLinkUrl + "#anchor"));
+ CommonResources.makeHtmlPageWithSimpleLinkTo(anchorLinkUrl + "#anchor"));
if (useLoadData) {
loadDataSync(awContents, contentsClient.getOnPageFinishedHelper(),
- getHtmlForPageWithSimpleLinkTo("#anchor"), "text/html", false);
+ CommonResources.makeHtmlPageWithSimpleLinkTo("#anchor"), "text/html", false);
} else {
loadUrlSync(awContents, contentsClient.getOnPageFinishedHelper(), anchorLinkUrl);
}
@@ -335,7 +326,7 @@ public class AwContentsClientShouldOverrideUrlLoadingTest extends AwTestBase {
// We can't go to about:blank from here because we'd get a cross-origin error.
loadDataSync(awContents, contentsClient.getOnPageFinishedHelper(),
- getHtmlForPageWithSimpleLinkTo(DATA_URL), "text/html", false);
+ CommonResources.makeHtmlPageWithSimpleLinkTo(DATA_URL), "text/html", false);
int callCount = shouldOverrideUrlLoadingHelper.getCallCount();
@@ -357,7 +348,7 @@ public class AwContentsClientShouldOverrideUrlLoadingTest extends AwTestBase {
final String httpPath = "/page_with_about_blank_navigation";
final String httpPathOnServer = mWebServer.getResponseUrl(httpPath);
addPageToTestServer(mWebServer, httpPath,
- getHtmlForPageWithSimpleLinkTo(ABOUT_BLANK_URL));
+ CommonResources.makeHtmlPageWithSimpleLinkTo(ABOUT_BLANK_URL));
loadUrlSync(awContents, contentsClient.getOnPageFinishedHelper(),
httpPathOnServer);
@@ -384,7 +375,7 @@ public class AwContentsClientShouldOverrideUrlLoadingTest extends AwTestBase {
final String httpPath = "/page_with_link_to_self.html";
final String httpPathOnServer = mWebServer.getResponseUrl(httpPath);
addPageToTestServer(mWebServer, httpPath,
- getHtmlForPageWithSimpleLinkTo(httpPathOnServer));
+ CommonResources.makeHtmlPageWithSimpleLinkTo(httpPathOnServer));
loadUrlSync(awContents, contentsClient.getOnPageFinishedHelper(),
httpPathOnServer);
@@ -454,7 +445,8 @@ public class AwContentsClientShouldOverrideUrlLoadingTest extends AwTestBase {
final String redirectTargetUrl = createRedirectTargetPage(mWebServer);
loadDataSync(awContents, contentsClient.getOnPageFinishedHelper(),
- getHtmlForPageWithSimpleLinkTo(redirectTargetUrl), "text/html", false);
+ CommonResources.makeHtmlPageWithSimpleLinkTo(redirectTargetUrl), "text/html",
+ false);
int callCount = shouldOverrideUrlLoadingHelper.getCallCount();
clickOnLinkUsingJs(awContents, contentsClient);
@@ -477,11 +469,11 @@ public class AwContentsClientShouldOverrideUrlLoadingTest extends AwTestBase {
final String pageWithLinkToIgnorePath = "/page_with_link_to_ignore.html";
final String pageWithLinkToIgnoreUrl = addPageToTestServer(mWebServer,
pageWithLinkToIgnorePath,
- getHtmlForPageWithSimpleLinkTo(redirectTargetUrl));
+ CommonResources.makeHtmlPageWithSimpleLinkTo(redirectTargetUrl));
final String synchronizationPath = "/sync.html";
final String synchronizationUrl = addPageToTestServer(mWebServer,
synchronizationPath,
- getHtmlForPageWithSimpleLinkTo(redirectTargetUrl));
+ CommonResources.makeHtmlPageWithSimpleLinkTo(redirectTargetUrl));
loadUrlSync(awContents, contentsClient.getOnPageFinishedHelper(),
pageWithLinkToIgnoreUrl);
@@ -518,7 +510,7 @@ public class AwContentsClientShouldOverrideUrlLoadingTest extends AwTestBase {
TestAwContentsClient.ShouldOverrideUrlLoadingHelper shouldOverrideUrlLoadingHelper =
contentsClient.getShouldOverrideUrlLoadingHelper();
loadDataSync(awContents, contentsClient.getOnPageFinishedHelper(),
- getHtmlForPageWithSimpleLinkTo(dataUrl), "text/html", false);
+ CommonResources.makeHtmlPageWithSimpleLinkTo(dataUrl), "text/html", false);
int callCount = shouldOverrideUrlLoadingHelper.getCallCount();
clickOnLinkUsingJs(awContents, contentsClient);
@@ -541,7 +533,8 @@ public class AwContentsClientShouldOverrideUrlLoadingTest extends AwTestBase {
contentsClient.getShouldOverrideUrlLoadingHelper();
final String unsupportedSchemeUrl = "foobar://resource/1";
loadDataSync(awContents, contentsClient.getOnPageFinishedHelper(),
- getHtmlForPageWithSimpleLinkTo(unsupportedSchemeUrl), "text/html", false);
+ CommonResources.makeHtmlPageWithSimpleLinkTo(unsupportedSchemeUrl), "text/html",
+ false);
int callCount = shouldOverrideUrlLoadingHelper.getCallCount();
clickOnLinkUsingJs(awContents, contentsClient);
@@ -564,7 +557,7 @@ public class AwContentsClientShouldOverrideUrlLoadingTest extends AwTestBase {
final String redirectTargetUrl = createRedirectTargetPage(mWebServer);
final String postLinkUrl = addPageToTestServer(mWebServer, "/page_with_post_link.html",
- getHtmlForPageWithSimplePostFormTo(redirectTargetUrl));
+ CommonResources.makeHtmlPageWithSimplePostFormTo(redirectTargetUrl));
loadUrlSync(awContents, contentsClient.getOnPageFinishedHelper(), postLinkUrl);
@@ -603,7 +596,7 @@ public class AwContentsClientShouldOverrideUrlLoadingTest extends AwTestBase {
final String redirectTargetUrl = createRedirectTargetPage(mWebServer);
final String postToGetRedirectUrl = mWebServer.setRedirect("/302.html", redirectTargetUrl);
final String postLinkUrl = addPageToTestServer(mWebServer, "/page_with_post_link.html",
- getHtmlForPageWithSimplePostFormTo(postToGetRedirectUrl));
+ CommonResources.makeHtmlPageWithSimplePostFormTo(postToGetRedirectUrl));
loadUrlSync(awContents, contentsClient.getOnPageFinishedHelper(), postLinkUrl);
@@ -702,7 +695,7 @@ public class AwContentsClientShouldOverrideUrlLoadingTest extends AwTestBase {
final AwContents awContents = testContainerView.getAwContents();
final String pageWithLinkToRedirectUrl = addPageToTestServer(webServer,
"/page_with_link_to_redirect.html",
- getHtmlForPageWithSimpleLinkTo(redirectUrl));
+ CommonResources.makeHtmlPageWithSimpleLinkTo(redirectUrl));
enableJavaScriptOnUiThread(awContents);
TestAwContentsClient.ShouldOverrideUrlLoadingHelper shouldOverrideUrlLoadingHelper =
@@ -813,7 +806,8 @@ public class AwContentsClientShouldOverrideUrlLoadingTest extends AwTestBase {
@Override
public void run() {
awContents.loadUrl(LoadUrlParams.createLoadDataParams(
- getHtmlForPageWithSimpleLinkTo(DATA_URL), "text/html", false));
+ CommonResources.makeHtmlPageWithSimpleLinkTo(DATA_URL), "text/html",
+ false));
awContents.loadUrl(new LoadUrlParams(jsUrl));
}
});
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java
index 4943bf8d9c..d6ac546f06 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java
@@ -21,9 +21,10 @@ import static org.chromium.base.test.util.ScalableTimeout.scaleTimeout;
import org.apache.http.Header;
import org.apache.http.HttpRequest;
import org.chromium.android_webview.AwContents;
+import org.chromium.android_webview.AwContentsClient.ShouldInterceptRequestParams;
import org.chromium.android_webview.AwSettings;
import org.chromium.android_webview.AwSettings.LayoutAlgorithm;
-import org.chromium.android_webview.InterceptedRequestData;
+import org.chromium.android_webview.AwWebResourceResponse;
import org.chromium.android_webview.test.util.CommonResources;
import org.chromium.android_webview.test.util.ImagePageGenerator;
import org.chromium.android_webview.test.util.VideoTestUtil;
@@ -1782,8 +1783,10 @@ public class AwSettingsTest extends AwTestBase {
views.getContainer1(), views.getClient1(), 1));
}
- @SmallTest
- @Feature({"AndroidWebView", "Preferences"})
+ // @SmallTest
+ // @Feature({"AndroidWebView", "Preferences"})
+ // http://crbug.com/387101
+ @DisabledTest
public void testBlockNetworkImagesDoesNotBlockDataUrlImage() throws Throwable {
final TestAwContentsClient contentClient = new TestAwContentsClient();
final AwTestContainerView testContainerView =
@@ -2568,8 +2571,9 @@ public class AwSettingsTest extends AwTestBase {
final String DEFAULT_VIDEO_POSTER_URL = "http://default_video_poster/";
TestAwContentsClient client = new TestAwContentsClient() {
@Override
- public InterceptedRequestData shouldInterceptRequest(String url) {
- if (url.equals(DEFAULT_VIDEO_POSTER_URL)) {
+ public AwWebResourceResponse shouldInterceptRequest(
+ ShouldInterceptRequestParams params) {
+ if (params.url.equals(DEFAULT_VIDEO_POSTER_URL)) {
videoPosterAccessedCallbackHelper.notifyCalled();
}
return null;
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java
index 15c0bcd78e..5f9c51b632 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java
@@ -9,6 +9,7 @@ import android.test.suitebuilder.annotation.MediumTest;
import org.chromium.android_webview.AwContents;
import org.chromium.android_webview.test.util.CommonResources;
import org.chromium.android_webview.test.util.JSUtils;
+import org.chromium.base.test.util.DisabledTest;
import org.chromium.base.test.util.Feature;
import org.chromium.content.browser.test.util.TestCallbackHelperContainer;
import org.chromium.net.test.util.TestWebServer;
@@ -48,8 +49,13 @@ public class ClientOnPageFinishedTest extends AwTestBase {
assertEquals("data:text/html," + html, onPageFinishedHelper.getUrl());
}
- @MediumTest
- @Feature({"AndroidWebView"})
+ /**
+ * @MediumTest
+ * @Feature({"AndroidWebView"})
+ *
+ * http://crbug.com/386300
+ */
+ @DisabledTest
public void testOnPageFinishedCalledAfterError() throws Throwable {
class LocalTestClient extends TestAwContentsClient {
private boolean isOnReceivedErrorCalled = false;
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerStartupTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerStartupTest.java
index d365319b02..9f597e6b7d 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerStartupTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerStartupTest.java
@@ -11,7 +11,7 @@ import android.test.suitebuilder.annotation.SmallTest;
import org.chromium.android_webview.AwBrowserProcess;
import org.chromium.android_webview.AwContents;
import org.chromium.android_webview.AwCookieManager;
-import org.chromium.android_webview.InterceptedRequestData;
+import org.chromium.android_webview.AwWebResourceResponse;
import org.chromium.android_webview.test.util.CommonResources;
import org.chromium.android_webview.test.util.CookieUtils;
import org.chromium.base.test.util.Feature;
@@ -120,7 +120,8 @@ public class CookieManagerStartupTest extends AwTestBase {
String url = "http://www.example.com";
TestAwContentsClient contentsClient = new TestAwContentsClient() {
@Override
- public InterceptedRequestData shouldInterceptRequest(String url) {
+ public AwWebResourceResponse shouldInterceptRequest(
+ ShouldInterceptRequestParams params) {
(new AwCookieManager()).getCookie("www.example.com");
return null;
}
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/KeySystemTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/KeySystemTest.java
index f3dd6ce702..b884b920d8 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/KeySystemTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/KeySystemTest.java
@@ -5,6 +5,7 @@
package org.chromium.android_webview.test;
import android.test.suitebuilder.annotation.SmallTest;
+
import org.chromium.android_webview.AwContents;
import org.chromium.base.test.util.DisabledTest;
import org.chromium.base.test.util.Feature;
@@ -65,4 +66,10 @@ public class KeySystemTest extends AwTestBase {
public void testNotSupportFooKeySystem() throws Throwable {
assertEquals("\"\"", IsKeySystemSupported("com.foo.keysystem"));
}
+
+ @Feature({"AndroidWebView"})
+ @SmallTest
+ public void testSupportPlatformKeySystem() throws Throwable {
+ assertEquals("\"maybe\"", IsKeySystemSupported("com.oem.test-keysystem"));
+ }
}
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/util/CommonResources.java b/android_webview/javatests/src/org/chromium/android_webview/test/util/CommonResources.java
index 5fae61ca79..2f8e900392 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/util/CommonResources.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/util/CommonResources.java
@@ -105,4 +105,22 @@ public class CommonResources {
"</body>" +
"</html>";
}
+
+ public static String makeHtmlPageWithSimpleLinkTo(String headers, String destination) {
+ return makeHtmlPageFrom(headers,
+ "<a href=\"" + destination + "\" id=\"link\">" +
+ "<img class=\"big\" />" +
+ "</a>");
+ }
+
+ public static String makeHtmlPageWithSimpleLinkTo(String destination) {
+ return makeHtmlPageWithSimpleLinkTo("", destination);
+ }
+
+ public static String makeHtmlPageWithSimplePostFormTo(String destination) {
+ return makeHtmlPageFrom("",
+ "<form action=\"" + destination + "\" method=\"post\">" +
+ "<input type=\"submit\" value=\"post\" id=\"link\">" +
+ "</form>");
+ }
}