Bug 1947801: Add OHTTP client test. r=valentin,geckoview-reviewers,android-reviewers,ohall
Differential Revision: https://phabricator.services.mozilla.com/D239907
This commit is contained in:
@@ -0,0 +1,31 @@
|
|||||||
|
/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
|
||||||
|
* Any copyright is dedicated to the Public Domain.
|
||||||
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||||
|
|
||||||
|
package org.mozilla.geckoview.test
|
||||||
|
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
|
import androidx.test.filters.MediumTest
|
||||||
|
import org.junit.Test
|
||||||
|
import org.junit.runner.RunWith
|
||||||
|
import org.mozilla.geckoview.* // ktlint-disable no-wildcard-imports
|
||||||
|
import org.mozilla.geckoview.test.util.RuntimeCreator
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4::class)
|
||||||
|
@MediumTest
|
||||||
|
class WebExecutorOhttpTest : BaseSessionTest() {
|
||||||
|
// We just want to make sure we don't crash when trying to use ohttp.
|
||||||
|
// We test the actual functionality in toolkit/components/resistfingerprinting/tests/xpcshell/test_ohttp_client.js.
|
||||||
|
@Test(expected = WebRequestError::class)
|
||||||
|
fun testOhttp() {
|
||||||
|
sessionRule.setPrefsUntilTestEnd(
|
||||||
|
mapOf(
|
||||||
|
// Don't make external requests.
|
||||||
|
"network.ohttp.configURL" to "https://example.com",
|
||||||
|
"network.ohttp.relayURL" to "https://example.com",
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
GeckoWebExecutor(RuntimeCreator.getRuntime()).fetch(WebRequest.Builder("https://example.com").build(), GeckoWebExecutor.FETCH_FLAGS_OHTTP).poll(5 * 100)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -119,6 +119,7 @@ public class WebRequest extends WebMessage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Builder offers a convenient way for constructing {@link WebRequest} instances. */
|
/** Builder offers a convenient way for constructing {@link WebRequest} instances. */
|
||||||
|
@WrapForJNI
|
||||||
@AnyThread
|
@AnyThread
|
||||||
public static class Builder extends WebMessage.Builder {
|
public static class Builder extends WebMessage.Builder {
|
||||||
/* package */ String mMethod = "GET";
|
/* package */ String mMethod = "GET";
|
||||||
|
|||||||
@@ -6,4 +6,6 @@ BROWSER_CHROME_MANIFESTS += [
|
|||||||
"browser/browser.toml",
|
"browser/browser.toml",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
XPCSHELL_TESTS_MANIFESTS += ["xpcshell/xpcshell.toml"]
|
||||||
|
|
||||||
TEST_DIRS += ["gtest"]
|
TEST_DIRS += ["gtest"]
|
||||||
|
|||||||
@@ -0,0 +1,292 @@
|
|||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
const { AddonTestUtils } = ChromeUtils.importESModule(
|
||||||
|
"resource://testing-common/AddonTestUtils.sys.mjs"
|
||||||
|
);
|
||||||
|
|
||||||
|
const API_OHTTP_CONFIG = "http://example.com/ohttp-config";
|
||||||
|
const API_OHTTP_RELAY = "http://example.com/relay/";
|
||||||
|
|
||||||
|
AddonTestUtils.maybeInit(this);
|
||||||
|
const server = AddonTestUtils.createHttpServer({ hosts: ["example.com"] });
|
||||||
|
|
||||||
|
const ohttp = Cc["@mozilla.org/network/oblivious-http;1"].getService(
|
||||||
|
Ci.nsIObliviousHttp
|
||||||
|
);
|
||||||
|
const ohttpServer = ohttp.server();
|
||||||
|
|
||||||
|
const serverContext = {
|
||||||
|
statusCode: 0,
|
||||||
|
configBody: ohttpServer.encodedConfig,
|
||||||
|
failure: false,
|
||||||
|
};
|
||||||
|
|
||||||
|
server.registerPathHandler(
|
||||||
|
new URL(API_OHTTP_CONFIG).pathname,
|
||||||
|
(request, response) => {
|
||||||
|
const bstream = Cc["@mozilla.org/binaryoutputstream;1"].createInstance(
|
||||||
|
Ci.nsIBinaryOutputStream
|
||||||
|
);
|
||||||
|
bstream.setOutputStream(response.bodyOutputStream);
|
||||||
|
bstream.writeByteArray(serverContext.configBody);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
let requestPromise, resolveRequest;
|
||||||
|
let responsePromise, resolveResponse;
|
||||||
|
|
||||||
|
server.registerPathHandler(
|
||||||
|
new URL(API_OHTTP_RELAY).pathname,
|
||||||
|
async (request, response) => {
|
||||||
|
const inputStream = Cc["@mozilla.org/binaryinputstream;1"].createInstance(
|
||||||
|
Ci.nsIBinaryInputStream
|
||||||
|
);
|
||||||
|
inputStream.setInputStream(request.bodyInputStream);
|
||||||
|
const requestBody = inputStream.readByteArray(inputStream.available());
|
||||||
|
const ohttpRequest = ohttpServer.decapsulate(requestBody);
|
||||||
|
const bhttp = Cc["@mozilla.org/network/binary-http;1"].getService(
|
||||||
|
Ci.nsIBinaryHttp
|
||||||
|
);
|
||||||
|
const decodedRequest = bhttp.decodeRequest(ohttpRequest.request);
|
||||||
|
|
||||||
|
response.processAsync();
|
||||||
|
if (serverContext.failure) {
|
||||||
|
response.setStatusLine(request.httpVersion, 500, "Internal Server Error");
|
||||||
|
response.finish();
|
||||||
|
resolveRequest(decodedRequest);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const BinaryHttpResponse = {
|
||||||
|
status: serverContext.statusCode,
|
||||||
|
headerNames: [],
|
||||||
|
headerValues: [],
|
||||||
|
content: new TextEncoder().encode(decodedRequest.content),
|
||||||
|
QueryInterface: ChromeUtils.generateQI(["nsIBinaryHttpResponse"]),
|
||||||
|
};
|
||||||
|
const encResponse = ohttpRequest.encapsulate(
|
||||||
|
bhttp.encodeResponse(BinaryHttpResponse)
|
||||||
|
);
|
||||||
|
response.setStatusLine(request.httpVersion, 200, "OK");
|
||||||
|
response.setHeader("Content-Type", "message/ohttp-res", false);
|
||||||
|
|
||||||
|
const bstream = Cc["@mozilla.org/binaryoutputstream;1"].createInstance(
|
||||||
|
Ci.nsIBinaryOutputStream
|
||||||
|
);
|
||||||
|
bstream.setOutputStream(response.bodyOutputStream);
|
||||||
|
bstream.writeByteArray(encResponse);
|
||||||
|
response.finish();
|
||||||
|
|
||||||
|
resolveRequest(decodedRequest);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
function resetPromises() {
|
||||||
|
const tmp1 = Promise.withResolvers();
|
||||||
|
requestPromise = tmp1.promise;
|
||||||
|
resolveRequest = tmp1.resolve;
|
||||||
|
|
||||||
|
const tmp2 = Promise.withResolvers();
|
||||||
|
responsePromise = tmp2.promise;
|
||||||
|
resolveResponse = tmp2.resolve;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function test_success() {
|
||||||
|
resetPromises();
|
||||||
|
|
||||||
|
const request = {
|
||||||
|
method: "POST",
|
||||||
|
scheme: "https",
|
||||||
|
authority: "example.com",
|
||||||
|
path: "/my-path",
|
||||||
|
headerNames: ["User-Agent"],
|
||||||
|
headerValues: ["Mozilla/5.0"],
|
||||||
|
content: "Hello, world!",
|
||||||
|
};
|
||||||
|
|
||||||
|
const expectedResponse = {
|
||||||
|
url: `${request.scheme}://${request.authority}${request.path}`,
|
||||||
|
statusCode: 42,
|
||||||
|
error: "",
|
||||||
|
};
|
||||||
|
|
||||||
|
serverContext.statusCode = expectedResponse.statusCode;
|
||||||
|
|
||||||
|
const ohttpClientTester = Cc[
|
||||||
|
"@mozilla.org/ohttp-client-test;1"
|
||||||
|
].createInstance(Ci.nsIOhttpClientTest);
|
||||||
|
|
||||||
|
ohttpClientTester.fetch(
|
||||||
|
`${request.scheme}://${request.authority}${request.path}`,
|
||||||
|
request.method,
|
||||||
|
request.content,
|
||||||
|
request.headerNames,
|
||||||
|
request.headerValues,
|
||||||
|
(url, statusCode, headerKeys, headerValues, error) => {
|
||||||
|
resolveResponse({
|
||||||
|
url,
|
||||||
|
statusCode,
|
||||||
|
headerKeys,
|
||||||
|
headerValues,
|
||||||
|
error,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const [ohttpRequest, ohttpResponse] = await Promise.all([
|
||||||
|
requestPromise,
|
||||||
|
responsePromise,
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Verify request
|
||||||
|
Assert.equal(ohttpRequest.method, request.method);
|
||||||
|
Assert.equal(ohttpRequest.scheme, request.scheme);
|
||||||
|
Assert.equal(ohttpRequest.authority, request.authority);
|
||||||
|
Assert.equal(ohttpRequest.path, request.path);
|
||||||
|
Assert.deepEqual(ohttpRequest.headerNames, request.headerNames);
|
||||||
|
Assert.deepEqual(ohttpRequest.headerValues, request.headerValues);
|
||||||
|
Assert.deepEqual(
|
||||||
|
ohttpRequest.content,
|
||||||
|
request.content.split("").map(s => s.charCodeAt(0))
|
||||||
|
);
|
||||||
|
|
||||||
|
// Verify response
|
||||||
|
Assert.equal(ohttpResponse.url, expectedResponse.url);
|
||||||
|
Assert.equal(ohttpResponse.statusCode, expectedResponse.statusCode);
|
||||||
|
Assert.equal(ohttpResponse.error, expectedResponse.error);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function test_invalid_config() {
|
||||||
|
resetPromises();
|
||||||
|
|
||||||
|
const request = {
|
||||||
|
method: "POST",
|
||||||
|
scheme: "https",
|
||||||
|
authority: "example.com",
|
||||||
|
path: "/my-path",
|
||||||
|
headerNames: ["User-Agent"],
|
||||||
|
headerValues: ["Mozilla/5.0"],
|
||||||
|
content: "Hello, world!",
|
||||||
|
};
|
||||||
|
|
||||||
|
const expectedResponse = {
|
||||||
|
url: "",
|
||||||
|
statusCode: 0,
|
||||||
|
error: "Request failed, error=0x11, category=0x1",
|
||||||
|
};
|
||||||
|
|
||||||
|
// Provide invalid config
|
||||||
|
// We still set status code to verify that we don't
|
||||||
|
// get back 42 as the status.
|
||||||
|
serverContext.configBody = [0, 0, 0, 0];
|
||||||
|
serverContext.statusCode = 42;
|
||||||
|
|
||||||
|
const ohttpClientTester = Cc[
|
||||||
|
"@mozilla.org/ohttp-client-test;1"
|
||||||
|
].createInstance(Ci.nsIOhttpClientTest);
|
||||||
|
|
||||||
|
ohttpClientTester.fetch(
|
||||||
|
`${request.scheme}://${request.authority}${request.path}`,
|
||||||
|
request.method,
|
||||||
|
request.content,
|
||||||
|
request.headerNames,
|
||||||
|
request.headerValues,
|
||||||
|
(url, statusCode, headerKeys, headerValues, error) => {
|
||||||
|
resolveResponse({
|
||||||
|
url,
|
||||||
|
statusCode,
|
||||||
|
headerKeys,
|
||||||
|
headerValues,
|
||||||
|
error,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
// Request promise never resolves as getting config fails
|
||||||
|
const ohttpResponse = await responsePromise;
|
||||||
|
|
||||||
|
// Verify response
|
||||||
|
Assert.equal(ohttpResponse.url, expectedResponse.url);
|
||||||
|
Assert.equal(ohttpResponse.statusCode, expectedResponse.statusCode);
|
||||||
|
Assert.equal(ohttpResponse.error, expectedResponse.error);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function test_ohttp_failure() {
|
||||||
|
resetPromises();
|
||||||
|
|
||||||
|
const request = {
|
||||||
|
method: "POST",
|
||||||
|
scheme: "https",
|
||||||
|
authority: "example.com",
|
||||||
|
path: "/my-path",
|
||||||
|
headerNames: ["User-Agent"],
|
||||||
|
headerValues: ["Mozilla/5.0"],
|
||||||
|
content: "Hello, world!",
|
||||||
|
};
|
||||||
|
|
||||||
|
const expectedResponse = {
|
||||||
|
url: "",
|
||||||
|
statusCode: 0,
|
||||||
|
error: "Request failed, error=0x11, category=0x1",
|
||||||
|
};
|
||||||
|
|
||||||
|
// Provide a valid config, but make the server fail.
|
||||||
|
// We still set status code to verify that we don't
|
||||||
|
// get back 42 as the status.
|
||||||
|
serverContext.configBody = ohttpServer.encodedConfig;
|
||||||
|
serverContext.statusCode = 42;
|
||||||
|
serverContext.failure = true;
|
||||||
|
|
||||||
|
const ohttpClientTester = Cc[
|
||||||
|
"@mozilla.org/ohttp-client-test;1"
|
||||||
|
].createInstance(Ci.nsIOhttpClientTest);
|
||||||
|
|
||||||
|
ohttpClientTester.fetch(
|
||||||
|
`${request.scheme}://${request.authority}${request.path}`,
|
||||||
|
request.method,
|
||||||
|
request.content,
|
||||||
|
request.headerNames,
|
||||||
|
request.headerValues,
|
||||||
|
(url, statusCode, headerKeys, headerValues, error) => {
|
||||||
|
resolveResponse({
|
||||||
|
url,
|
||||||
|
statusCode,
|
||||||
|
headerKeys,
|
||||||
|
headerValues,
|
||||||
|
error,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const [ohttpRequest, ohttpResponse] = await Promise.all([
|
||||||
|
requestPromise,
|
||||||
|
responsePromise,
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Verify request
|
||||||
|
Assert.equal(ohttpRequest.method, request.method);
|
||||||
|
Assert.equal(ohttpRequest.scheme, request.scheme);
|
||||||
|
Assert.equal(ohttpRequest.authority, request.authority);
|
||||||
|
Assert.equal(ohttpRequest.path, request.path);
|
||||||
|
Assert.deepEqual(ohttpRequest.headerNames, request.headerNames);
|
||||||
|
Assert.deepEqual(ohttpRequest.headerValues, request.headerValues);
|
||||||
|
Assert.deepEqual(
|
||||||
|
ohttpRequest.content,
|
||||||
|
request.content.split("").map(s => s.charCodeAt(0))
|
||||||
|
);
|
||||||
|
|
||||||
|
// Verify response
|
||||||
|
Assert.equal(ohttpResponse.url, expectedResponse.url);
|
||||||
|
Assert.equal(ohttpResponse.statusCode, expectedResponse.statusCode);
|
||||||
|
Assert.equal(ohttpResponse.error, expectedResponse.error);
|
||||||
|
}
|
||||||
|
|
||||||
|
add_task(async function run_tests() {
|
||||||
|
await test_success();
|
||||||
|
await test_invalid_config();
|
||||||
|
await test_ohttp_failure();
|
||||||
|
});
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
[DEFAULT]
|
||||||
|
prefs = [
|
||||||
|
"network.ohttp.configURL='http://example.com/ohttp-config'",
|
||||||
|
"network.ohttp.relayURL='http://example.com/relay/'"
|
||||||
|
]
|
||||||
|
|
||||||
|
["test_ohttp_client.js"]
|
||||||
|
run-if = ["os == 'android'"]
|
||||||
@@ -10,6 +10,7 @@
|
|||||||
#include "ReferrerInfo.h"
|
#include "ReferrerInfo.h"
|
||||||
#include "WebExecutorSupport.h"
|
#include "WebExecutorSupport.h"
|
||||||
#include "OhttpHelper.h"
|
#include "OhttpHelper.h"
|
||||||
|
#include "JavaExceptions.h"
|
||||||
|
|
||||||
#include "nsIAsyncVerifyRedirectCallback.h"
|
#include "nsIAsyncVerifyRedirectCallback.h"
|
||||||
#include "nsICancelable.h"
|
#include "nsICancelable.h"
|
||||||
@@ -277,6 +278,67 @@ nsresult WebExecutorSupport::PerformOrQueueOhttpRequest(
|
|||||||
return OhttpHelper::FetchConfigAndFulfillRequests();
|
return OhttpHelper::FetchConfigAndFulfillRequests();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(ENABLE_TESTS)
|
||||||
|
|
||||||
|
void WebExecutorSupport::TestOhttp(const nsACString& url,
|
||||||
|
const nsACString& method,
|
||||||
|
const nsACString& body,
|
||||||
|
const nsTArray<nsCString>& headerKeys,
|
||||||
|
const nsTArray<nsCString>& headerValues,
|
||||||
|
ohttpClientTestCallback* callback) {
|
||||||
|
auto result = java::GeckoResult::New();
|
||||||
|
|
||||||
|
nsCOMPtr<ohttpClientTestCallback> callbackRef(callback);
|
||||||
|
auto resolve = jni::GeckoResultCallback::CreateAndAttach(
|
||||||
|
[callbackRef](jni::Object::Param aResolveVal) {
|
||||||
|
auto response = java::WebResponse::LocalRef(aResolveVal);
|
||||||
|
auto responseBase =
|
||||||
|
java::WebMessage::LocalRef(response.Cast<java::WebMessage>());
|
||||||
|
|
||||||
|
auto headerKeysJava = responseBase->GetHeaderKeys();
|
||||||
|
auto headerValuesJava = responseBase->GetHeaderValues();
|
||||||
|
nsTArray<nsCString> headersKeys(headerKeysJava->Length());
|
||||||
|
nsTArray<nsCString> headersValues(headerValuesJava->Length());
|
||||||
|
for (size_t i = 0; i < headerKeysJava->Length(); i++) {
|
||||||
|
headersKeys.AppendElement(
|
||||||
|
jni::String::LocalRef(headerKeysJava->GetElement(i))
|
||||||
|
->ToCString());
|
||||||
|
headersValues.AppendElement(
|
||||||
|
jni::String::LocalRef(headerValuesJava->GetElement(i))
|
||||||
|
->ToCString());
|
||||||
|
}
|
||||||
|
|
||||||
|
callbackRef->OnResponse(responseBase->Uri()->ToCString(),
|
||||||
|
response->StatusCode(), headersKeys,
|
||||||
|
headersValues, ""_ns);
|
||||||
|
});
|
||||||
|
auto reject = jni::GeckoResultCallback::CreateAndAttach(
|
||||||
|
[callbackRef](jni::Object::Param aRejectVal) {
|
||||||
|
auto error = java::sdk::Throwable::LocalRef(aRejectVal);
|
||||||
|
|
||||||
|
callbackRef->OnResponse(""_ns, 0, nsTArray<nsCString>(),
|
||||||
|
nsTArray<nsCString>(),
|
||||||
|
error->GetMessage()->ToCString());
|
||||||
|
});
|
||||||
|
result->NativeThen(resolve, reject);
|
||||||
|
|
||||||
|
const auto requestBuilder =
|
||||||
|
java::WebRequest::Builder::New(url)->Method(method)->Body(body);
|
||||||
|
for (size_t i = 0; i < headerKeys.Length(); i++) {
|
||||||
|
requestBuilder->AddHeader(headerKeys[i], headerValues[i]);
|
||||||
|
}
|
||||||
|
const auto request = requestBuilder->Build();
|
||||||
|
|
||||||
|
nsresult rv = PerformOrQueueOhttpRequest(
|
||||||
|
request, java::GeckoWebExecutor::FETCH_FLAGS_OHTTP, result, true);
|
||||||
|
|
||||||
|
if (NS_FAILED(rv)) {
|
||||||
|
CompleteWithError(result, rv);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
static nsresult ConvertCacheMode(int32_t mode, int32_t& result) {
|
static nsresult ConvertCacheMode(int32_t mode, int32_t& result) {
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case java::WebRequest::CACHE_MODE_DEFAULT:
|
case java::WebRequest::CACHE_MODE_DEFAULT:
|
||||||
|
|||||||
@@ -10,6 +10,10 @@
|
|||||||
#include "mozilla/java/GeckoResultWrappers.h"
|
#include "mozilla/java/GeckoResultWrappers.h"
|
||||||
#include "mozilla/java/WebRequestWrappers.h"
|
#include "mozilla/java/WebRequestWrappers.h"
|
||||||
|
|
||||||
|
#if defined(ENABLE_TESTS)
|
||||||
|
# include "nsIOhttpClientTest.h"
|
||||||
|
#endif // defined(ENABLE_TESTS)
|
||||||
|
|
||||||
class nsIChannel;
|
class nsIChannel;
|
||||||
|
|
||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
@@ -40,6 +44,15 @@ class WebExecutorSupport final
|
|||||||
int32_t aFlags,
|
int32_t aFlags,
|
||||||
java::GeckoResult::Param aResult,
|
java::GeckoResult::Param aResult,
|
||||||
bool bypassConfigCache = false);
|
bool bypassConfigCache = false);
|
||||||
|
#if defined(ENABLE_TESTS)
|
||||||
|
// Used for testing OHTTP. Porting all of the OHTTP server code to Java would
|
||||||
|
// be quite a bit of work, so we're just going to test it in JS.
|
||||||
|
static void TestOhttp(const nsACString& url, const nsACString& method,
|
||||||
|
const nsACString& body,
|
||||||
|
const nsTArray<nsCString>& headerKeys,
|
||||||
|
const nsTArray<nsCString>& headerValues,
|
||||||
|
ohttpClientTestCallback* callback);
|
||||||
|
#endif // defined(ENABLE_TESTS)
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace widget
|
} // namespace widget
|
||||||
|
|||||||
@@ -41,6 +41,14 @@ class GeckoResultCallback final
|
|||||||
return java;
|
return java;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static java::GeckoResult::GeckoCallback::LocalRef CreateAndAttach(
|
||||||
|
OuterCallback&& aCallback) {
|
||||||
|
auto java = java::GeckoResult::GeckoCallback::New();
|
||||||
|
auto native = MakeUnique<GeckoResultCallback>(std::move(aCallback));
|
||||||
|
Base::AttachNative(java, std::move(native));
|
||||||
|
return java;
|
||||||
|
}
|
||||||
|
|
||||||
explicit GeckoResultCallback(OuterCallback&& aCallback)
|
explicit GeckoResultCallback(OuterCallback&& aCallback)
|
||||||
: mCallback(std::move(aCallback)) {}
|
: mCallback(std::move(aCallback)) {}
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,11 @@ DIRS += [
|
|||||||
"jni",
|
"jni",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
if CONFIG["ENABLE_TESTS"]:
|
||||||
|
DIRS += [
|
||||||
|
"tests",
|
||||||
|
]
|
||||||
|
|
||||||
EXPORTS += [
|
EXPORTS += [
|
||||||
"AndroidBridge.h",
|
"AndroidBridge.h",
|
||||||
]
|
]
|
||||||
@@ -110,6 +115,7 @@ EXPORTS.mozilla.widget += [
|
|||||||
"GeckoViewSupport.h",
|
"GeckoViewSupport.h",
|
||||||
"InProcessAndroidCompositorWidget.h",
|
"InProcessAndroidCompositorWidget.h",
|
||||||
"nsWindow.h",
|
"nsWindow.h",
|
||||||
|
"WebExecutorSupport.h",
|
||||||
"WindowEvent.h",
|
"WindowEvent.h",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
28
widget/android/tests/OhttpClientTest.cpp
Normal file
28
widget/android/tests/OhttpClientTest.cpp
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||||
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
#if defined(ENABLE_TESTS)
|
||||||
|
|
||||||
|
# include "mozilla/widget/WebExecutorSupport.h"
|
||||||
|
# include "mozilla/widget/OhttpClientTest.h"
|
||||||
|
|
||||||
|
namespace mozilla::widget {
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
OhttpClientTest::Fetch(const nsACString& url, const nsACString& method,
|
||||||
|
const nsACString& body,
|
||||||
|
const nsTArray<nsCString>& headerKeys,
|
||||||
|
const nsTArray<nsCString>& headerValues,
|
||||||
|
ohttpClientTestCallback* callback) {
|
||||||
|
widget::WebExecutorSupport::TestOhttp(url, method, body, headerKeys,
|
||||||
|
headerValues, callback);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMPL_ISUPPORTS(OhttpClientTest, nsIOhttpClientTest)
|
||||||
|
} // namespace mozilla::widget
|
||||||
|
|
||||||
|
#endif // defined(ENABLE_TESTS)
|
||||||
29
widget/android/tests/OhttpClientTest.h
Normal file
29
widget/android/tests/OhttpClientTest.h
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||||
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
#ifndef mozilla_widget_android_tests
|
||||||
|
#define mozilla_widget_android_tests
|
||||||
|
|
||||||
|
#if defined(ENABLE_TESTS)
|
||||||
|
|
||||||
|
# include "nsIOhttpClientTest.h"
|
||||||
|
|
||||||
|
namespace mozilla::widget {
|
||||||
|
|
||||||
|
class OhttpClientTest final : public nsIOhttpClientTest {
|
||||||
|
public:
|
||||||
|
NS_DECL_THREADSAFE_ISUPPORTS
|
||||||
|
NS_DECL_NSIOHTTPCLIENTTEST
|
||||||
|
|
||||||
|
OhttpClientTest() = default;
|
||||||
|
|
||||||
|
private:
|
||||||
|
~OhttpClientTest() = default;
|
||||||
|
};
|
||||||
|
} // namespace mozilla::widget
|
||||||
|
|
||||||
|
#endif // defined(ENABLE_TESTS)
|
||||||
|
#endif // mozilla_widget_android_tests
|
||||||
15
widget/android/tests/components.conf
Normal file
15
widget/android/tests/components.conf
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
|
||||||
|
# vim: set filetype=python:
|
||||||
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
|
Classes = [
|
||||||
|
{
|
||||||
|
'cid': '{b3150bd2-689c-4cf0-b4ee-4f90aaf1cbd3}',
|
||||||
|
'contract_ids': ['@mozilla.org/ohttp-client-test;1'],
|
||||||
|
'type': 'mozilla::widget::OhttpClientTest',
|
||||||
|
'headers': ['mozilla/widget/OhttpClientTest.h'],
|
||||||
|
'processes': ProcessSelector.MAIN_PROCESS_ONLY,
|
||||||
|
},
|
||||||
|
]
|
||||||
21
widget/android/tests/moz.build
Normal file
21
widget/android/tests/moz.build
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
|
||||||
|
# vim: set filetype=python:
|
||||||
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
|
EXPORTS.mozilla.widget += ["OhttpClientTest.h"]
|
||||||
|
|
||||||
|
UNIFIED_SOURCES += ["OhttpClientTest.cpp"]
|
||||||
|
|
||||||
|
XPCOM_MANIFESTS += ["components.conf"]
|
||||||
|
|
||||||
|
XPIDL_MODULE = "widget_android_tests"
|
||||||
|
|
||||||
|
XPIDL_SOURCES += [
|
||||||
|
"nsIOhttpClientTest.idl",
|
||||||
|
]
|
||||||
|
|
||||||
|
include("/ipc/chromium/chromium-config.mozbuild")
|
||||||
|
|
||||||
|
FINAL_LIBRARY = "xul"
|
||||||
21
widget/android/tests/nsIOhttpClientTest.idl
Normal file
21
widget/android/tests/nsIOhttpClientTest.idl
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
/* -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 8 -*- */
|
||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
#include "nsISupports.idl"
|
||||||
|
|
||||||
|
[function, scriptable, uuid(cdec8db3-3868-41e7-a91a-68a3b5a24de0)]
|
||||||
|
interface ohttpClientTestCallback : nsISupports
|
||||||
|
{
|
||||||
|
void onResponse(in ACString url, in long statusCode, in Array<ACString> headerKeys, in Array<ACString> headerValues, in ACString errorMessage);
|
||||||
|
};
|
||||||
|
|
||||||
|
[scriptable, uuid(b3150bd2-689c-4cf0-b4ee-4f90aaf1cbd3)]
|
||||||
|
interface nsIOhttpClientTest : nsISupports
|
||||||
|
{
|
||||||
|
void fetch(
|
||||||
|
in ACString url, in ACString method, in ACString body, in Array<ACString> headerKeys, in Array<ACString> headerValues,
|
||||||
|
in ohttpClientTestCallback callback
|
||||||
|
);
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user