[fuchsia] Move ExecuteJavaScript tests into their own file.
Part of an ongoing effort to extract clusters of related tests from the frame_impl_browsertests.cc monolith. Bug: 1155378 Change-Id: I7f74d30587e3368593ee3a36aac8e018e230252a Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3293608 Commit-Queue: Bryant Chandler <bryantchandler@chromium.org> Reviewed-by: Kevin Marshall <kmarshall@chromium.org> Cr-Commit-Position: refs/heads/main@{#944552}
This commit is contained in:

committed by
Chromium LUCI CQ

parent
2ad4fe09f6
commit
57cf90c283
fuchsia/engine
@ -464,6 +464,7 @@ test("web_engine_browsertests") {
|
|||||||
"browser/frame_impl_browsertest.cc",
|
"browser/frame_impl_browsertest.cc",
|
||||||
"browser/headless_browsertest.cc",
|
"browser/headless_browsertest.cc",
|
||||||
"browser/input_browsertest.cc",
|
"browser/input_browsertest.cc",
|
||||||
|
"browser/javascript_browsertest.cc",
|
||||||
"browser/media_browsertest.cc",
|
"browser/media_browsertest.cc",
|
||||||
"browser/mock_virtual_keyboard.cc",
|
"browser/mock_virtual_keyboard.cc",
|
||||||
"browser/mock_virtual_keyboard.h",
|
"browser/mock_virtual_keyboard.h",
|
||||||
|
@ -72,7 +72,6 @@ namespace {
|
|||||||
constexpr char kPage1Path[] = "/title1.html";
|
constexpr char kPage1Path[] = "/title1.html";
|
||||||
constexpr char kPage2Path[] = "/title2.html";
|
constexpr char kPage2Path[] = "/title2.html";
|
||||||
constexpr char kPage3Path[] = "/websql.html";
|
constexpr char kPage3Path[] = "/websql.html";
|
||||||
constexpr char kDynamicTitlePath[] = "/dynamic_title.html";
|
|
||||||
constexpr char kVisibilityPath[] = "/visibility.html";
|
constexpr char kVisibilityPath[] = "/visibility.html";
|
||||||
constexpr char kWaitSizePath[] = "/wait-size.html";
|
constexpr char kWaitSizePath[] = "/wait-size.html";
|
||||||
constexpr char kPage1Title[] = "title 1";
|
constexpr char kPage1Title[] = "title 1";
|
||||||
@ -80,7 +79,6 @@ constexpr char kPage2Title[] = "title 2";
|
|||||||
constexpr char kPage3Title[] = "websql not available";
|
constexpr char kPage3Title[] = "websql not available";
|
||||||
constexpr char kDataUrl[] =
|
constexpr char kDataUrl[] =
|
||||||
"data:text/html;base64,PGI+SGVsbG8sIHdvcmxkLi4uPC9iPg==";
|
"data:text/html;base64,PGI+SGVsbG8sIHdvcmxkLi4uPC9iPg==";
|
||||||
constexpr int64_t kOnLoadScriptId = 0;
|
|
||||||
|
|
||||||
MATCHER_P(NavigationHandleUrlEquals,
|
MATCHER_P(NavigationHandleUrlEquals,
|
||||||
url,
|
url,
|
||||||
@ -765,329 +763,6 @@ IN_PROC_BROWSER_TEST_F(FrameImplTest, NoNavigationObserverAttached) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
IN_PROC_BROWSER_TEST_F(FrameImplTest, BeforeLoadScript) {
|
|
||||||
constexpr int64_t kBindingsId = 1234;
|
|
||||||
|
|
||||||
net::test_server::EmbeddedTestServerHandle test_server_handle;
|
|
||||||
ASSERT_TRUE(test_server_handle =
|
|
||||||
embedded_test_server()->StartAndReturnHandle());
|
|
||||||
GURL url(embedded_test_server()->GetURL(kDynamicTitlePath));
|
|
||||||
auto frame = cr_fuchsia::FrameForTest::Create(context(), {});
|
|
||||||
|
|
||||||
frame->AddBeforeLoadJavaScript(
|
|
||||||
kBindingsId, {url.DeprecatedGetOriginAsURL().spec()},
|
|
||||||
base::MemBufferFromString("stashed_title = 'hello';", "test"),
|
|
||||||
[](fuchsia::web::Frame_AddBeforeLoadJavaScript_Result result) {
|
|
||||||
EXPECT_TRUE(result.is_response());
|
|
||||||
});
|
|
||||||
|
|
||||||
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
|
|
||||||
frame.GetNavigationController(), fuchsia::web::LoadUrlParams(),
|
|
||||||
url.spec()));
|
|
||||||
frame.navigation_listener().RunUntilUrlEquals(url);
|
|
||||||
}
|
|
||||||
|
|
||||||
IN_PROC_BROWSER_TEST_F(FrameImplTest, BeforeLoadScriptUpdated) {
|
|
||||||
constexpr int64_t kBindingsId = 1234;
|
|
||||||
|
|
||||||
net::test_server::EmbeddedTestServerHandle test_server_handle;
|
|
||||||
ASSERT_TRUE(test_server_handle =
|
|
||||||
embedded_test_server()->StartAndReturnHandle());
|
|
||||||
GURL url(embedded_test_server()->GetURL(kDynamicTitlePath));
|
|
||||||
auto frame = cr_fuchsia::FrameForTest::Create(context(), {});
|
|
||||||
|
|
||||||
frame->AddBeforeLoadJavaScript(
|
|
||||||
kBindingsId, {url.DeprecatedGetOriginAsURL().spec()},
|
|
||||||
base::MemBufferFromString("stashed_title = 'hello';", "test"),
|
|
||||||
[](fuchsia::web::Frame_AddBeforeLoadJavaScript_Result result) {
|
|
||||||
EXPECT_TRUE(result.is_response());
|
|
||||||
});
|
|
||||||
|
|
||||||
// Verify that this script clobbers the previous script, as opposed to being
|
|
||||||
// injected alongside it. (The latter would result in the title being
|
|
||||||
// "helloclobber").
|
|
||||||
frame->AddBeforeLoadJavaScript(
|
|
||||||
kBindingsId, {url.DeprecatedGetOriginAsURL().spec()},
|
|
||||||
base::MemBufferFromString("stashed_title = document.title + 'clobber';",
|
|
||||||
"test"),
|
|
||||||
[](fuchsia::web::Frame_AddBeforeLoadJavaScript_Result result) {
|
|
||||||
EXPECT_TRUE(result.is_response());
|
|
||||||
});
|
|
||||||
|
|
||||||
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
|
|
||||||
frame.GetNavigationController(), fuchsia::web::LoadUrlParams(),
|
|
||||||
url.spec()));
|
|
||||||
frame.navigation_listener().RunUntilUrlAndTitleEquals(url, "clobber");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Verifies that bindings are injected in order by producing a cumulative,
|
|
||||||
// non-commutative result.
|
|
||||||
IN_PROC_BROWSER_TEST_F(FrameImplTest, BeforeLoadScriptOrdered) {
|
|
||||||
constexpr int64_t kBindingsId1 = 1234;
|
|
||||||
constexpr int64_t kBindingsId2 = 5678;
|
|
||||||
|
|
||||||
net::test_server::EmbeddedTestServerHandle test_server_handle;
|
|
||||||
ASSERT_TRUE(test_server_handle =
|
|
||||||
embedded_test_server()->StartAndReturnHandle());
|
|
||||||
GURL url(embedded_test_server()->GetURL(kDynamicTitlePath));
|
|
||||||
auto frame = cr_fuchsia::FrameForTest::Create(context(), {});
|
|
||||||
|
|
||||||
frame->AddBeforeLoadJavaScript(
|
|
||||||
kBindingsId1, {url.DeprecatedGetOriginAsURL().spec()},
|
|
||||||
base::MemBufferFromString("stashed_title = 'hello';", "test"),
|
|
||||||
[](fuchsia::web::Frame_AddBeforeLoadJavaScript_Result result) {
|
|
||||||
EXPECT_TRUE(result.is_response());
|
|
||||||
});
|
|
||||||
frame->AddBeforeLoadJavaScript(
|
|
||||||
kBindingsId2, {url.DeprecatedGetOriginAsURL().spec()},
|
|
||||||
base::MemBufferFromString("stashed_title += ' there';", "test"),
|
|
||||||
[](fuchsia::web::Frame_AddBeforeLoadJavaScript_Result result) {
|
|
||||||
EXPECT_TRUE(result.is_response());
|
|
||||||
});
|
|
||||||
|
|
||||||
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
|
|
||||||
frame.GetNavigationController(), fuchsia::web::LoadUrlParams(),
|
|
||||||
url.spec()));
|
|
||||||
frame.navigation_listener().RunUntilUrlAndTitleEquals(url, "hello there");
|
|
||||||
}
|
|
||||||
|
|
||||||
IN_PROC_BROWSER_TEST_F(FrameImplTest, BeforeLoadScriptRemoved) {
|
|
||||||
constexpr int64_t kBindingsId1 = 1234;
|
|
||||||
constexpr int64_t kBindingsId2 = 5678;
|
|
||||||
|
|
||||||
net::test_server::EmbeddedTestServerHandle test_server_handle;
|
|
||||||
ASSERT_TRUE(test_server_handle =
|
|
||||||
embedded_test_server()->StartAndReturnHandle());
|
|
||||||
GURL url(embedded_test_server()->GetURL(kDynamicTitlePath));
|
|
||||||
auto frame = cr_fuchsia::FrameForTest::Create(context(), {});
|
|
||||||
|
|
||||||
frame->AddBeforeLoadJavaScript(
|
|
||||||
kBindingsId1, {url.DeprecatedGetOriginAsURL().spec()},
|
|
||||||
base::MemBufferFromString("stashed_title = 'foo';", "test"),
|
|
||||||
[](fuchsia::web::Frame_AddBeforeLoadJavaScript_Result result) {
|
|
||||||
EXPECT_TRUE(result.is_response());
|
|
||||||
});
|
|
||||||
|
|
||||||
// Add a script which clobbers "foo".
|
|
||||||
frame->AddBeforeLoadJavaScript(
|
|
||||||
kBindingsId2, {url.DeprecatedGetOriginAsURL().spec()},
|
|
||||||
base::MemBufferFromString("stashed_title = 'bar';", "test"),
|
|
||||||
[](fuchsia::web::Frame_AddBeforeLoadJavaScript_Result result) {
|
|
||||||
EXPECT_TRUE(result.is_response());
|
|
||||||
});
|
|
||||||
|
|
||||||
// Deletes the clobbering script.
|
|
||||||
frame->RemoveBeforeLoadJavaScript(kBindingsId2);
|
|
||||||
|
|
||||||
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
|
|
||||||
frame.GetNavigationController(), fuchsia::web::LoadUrlParams(),
|
|
||||||
url.spec()));
|
|
||||||
frame.navigation_listener().RunUntilUrlAndTitleEquals(url, "foo");
|
|
||||||
}
|
|
||||||
|
|
||||||
IN_PROC_BROWSER_TEST_F(FrameImplTest, BeforeLoadScriptRemoveInvalidId) {
|
|
||||||
net::test_server::EmbeddedTestServerHandle test_server_handle;
|
|
||||||
ASSERT_TRUE(test_server_handle =
|
|
||||||
embedded_test_server()->StartAndReturnHandle());
|
|
||||||
GURL url(embedded_test_server()->GetURL(kPage1Path));
|
|
||||||
auto frame = cr_fuchsia::FrameForTest::Create(context(), {});
|
|
||||||
|
|
||||||
frame->RemoveBeforeLoadJavaScript(kOnLoadScriptId);
|
|
||||||
|
|
||||||
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
|
|
||||||
frame.GetNavigationController(), fuchsia::web::LoadUrlParams(),
|
|
||||||
url.spec()));
|
|
||||||
frame.navigation_listener().RunUntilUrlAndTitleEquals(url, kPage1Title);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Test JS injection using ExecuteJavaScriptNoResult() to set a value, and
|
|
||||||
// ExecuteJavaScript() to retrieve that value.
|
|
||||||
IN_PROC_BROWSER_TEST_F(FrameImplTest, ExecuteJavaScript) {
|
|
||||||
constexpr char kJsonStringLiteral[] = "\"I am a literal, literally\"";
|
|
||||||
auto frame = cr_fuchsia::FrameForTest::Create(context(), {});
|
|
||||||
|
|
||||||
net::test_server::EmbeddedTestServerHandle test_server_handle;
|
|
||||||
ASSERT_TRUE(test_server_handle =
|
|
||||||
embedded_test_server()->StartAndReturnHandle());
|
|
||||||
const GURL kUrl(embedded_test_server()->GetURL(kPage1Path));
|
|
||||||
|
|
||||||
// Navigate to a page and wait for it to finish loading.
|
|
||||||
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
|
|
||||||
frame.GetNavigationController(), fuchsia::web::LoadUrlParams(),
|
|
||||||
kUrl.spec()));
|
|
||||||
frame.navigation_listener().RunUntilUrlAndTitleEquals(kUrl, kPage1Title);
|
|
||||||
|
|
||||||
// Execute with no result to set the variable.
|
|
||||||
frame->ExecuteJavaScriptNoResult(
|
|
||||||
{kUrl.DeprecatedGetOriginAsURL().spec()},
|
|
||||||
base::MemBufferFromString(
|
|
||||||
base::StringPrintf("my_variable = %s;", kJsonStringLiteral), "test"),
|
|
||||||
[](fuchsia::web::Frame_ExecuteJavaScriptNoResult_Result result) {
|
|
||||||
EXPECT_TRUE(result.is_response());
|
|
||||||
});
|
|
||||||
|
|
||||||
// Execute a script snippet to return the variable's value.
|
|
||||||
base::RunLoop loop;
|
|
||||||
frame->ExecuteJavaScript(
|
|
||||||
{kUrl.DeprecatedGetOriginAsURL().spec()},
|
|
||||||
base::MemBufferFromString("my_variable;", "test"),
|
|
||||||
[&](fuchsia::web::Frame_ExecuteJavaScript_Result result) {
|
|
||||||
ASSERT_TRUE(result.is_response());
|
|
||||||
std::string result_json =
|
|
||||||
*base::StringFromMemBuffer(result.response().result);
|
|
||||||
EXPECT_EQ(result_json, kJsonStringLiteral);
|
|
||||||
loop.Quit();
|
|
||||||
});
|
|
||||||
loop.Run();
|
|
||||||
}
|
|
||||||
|
|
||||||
IN_PROC_BROWSER_TEST_F(FrameImplTest, BeforeLoadScriptVmoDestroyed) {
|
|
||||||
net::test_server::EmbeddedTestServerHandle test_server_handle;
|
|
||||||
ASSERT_TRUE(test_server_handle =
|
|
||||||
embedded_test_server()->StartAndReturnHandle());
|
|
||||||
GURL url(embedded_test_server()->GetURL(kDynamicTitlePath));
|
|
||||||
auto frame = cr_fuchsia::FrameForTest::Create(context(), {});
|
|
||||||
|
|
||||||
frame->AddBeforeLoadJavaScript(
|
|
||||||
kOnLoadScriptId, {url.DeprecatedGetOriginAsURL().spec()},
|
|
||||||
base::MemBufferFromString("stashed_title = 'hello';", "test"),
|
|
||||||
[](fuchsia::web::Frame_AddBeforeLoadJavaScript_Result result) {
|
|
||||||
EXPECT_TRUE(result.is_response());
|
|
||||||
});
|
|
||||||
|
|
||||||
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
|
|
||||||
frame.GetNavigationController(), fuchsia::web::LoadUrlParams(),
|
|
||||||
url.spec()));
|
|
||||||
frame.navigation_listener().RunUntilUrlAndTitleEquals(url, "hello");
|
|
||||||
}
|
|
||||||
|
|
||||||
IN_PROC_BROWSER_TEST_F(FrameImplTest, BeforeLoadScriptWrongOrigin) {
|
|
||||||
net::test_server::EmbeddedTestServerHandle test_server_handle;
|
|
||||||
ASSERT_TRUE(test_server_handle =
|
|
||||||
embedded_test_server()->StartAndReturnHandle());
|
|
||||||
GURL url(embedded_test_server()->GetURL(kDynamicTitlePath));
|
|
||||||
auto frame = cr_fuchsia::FrameForTest::Create(context(), {});
|
|
||||||
|
|
||||||
frame->AddBeforeLoadJavaScript(
|
|
||||||
kOnLoadScriptId, {"http://example.com"},
|
|
||||||
base::MemBufferFromString("stashed_title = 'hello';", "test"),
|
|
||||||
[](fuchsia::web::Frame_AddBeforeLoadJavaScript_Result result) {
|
|
||||||
EXPECT_TRUE(result.is_response());
|
|
||||||
});
|
|
||||||
|
|
||||||
// Expect that the original HTML title is used, because we didn't inject a
|
|
||||||
// script with a replacement title.
|
|
||||||
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
|
|
||||||
frame.GetNavigationController(), fuchsia::web::LoadUrlParams(),
|
|
||||||
url.spec()));
|
|
||||||
frame.navigation_listener().RunUntilUrlAndTitleEquals(
|
|
||||||
url, "Welcome to Stan the Offline Dino's Homepage");
|
|
||||||
}
|
|
||||||
|
|
||||||
IN_PROC_BROWSER_TEST_F(FrameImplTest, BeforeLoadScriptWildcardOrigin) {
|
|
||||||
net::test_server::EmbeddedTestServerHandle test_server_handle;
|
|
||||||
ASSERT_TRUE(test_server_handle =
|
|
||||||
embedded_test_server()->StartAndReturnHandle());
|
|
||||||
GURL url(embedded_test_server()->GetURL(kDynamicTitlePath));
|
|
||||||
auto frame = cr_fuchsia::FrameForTest::Create(context(), {});
|
|
||||||
|
|
||||||
frame->AddBeforeLoadJavaScript(
|
|
||||||
kOnLoadScriptId, {"*"},
|
|
||||||
base::MemBufferFromString("stashed_title = 'hello';", "test"),
|
|
||||||
[](fuchsia::web::Frame_AddBeforeLoadJavaScript_Result result) {
|
|
||||||
EXPECT_TRUE(result.is_response());
|
|
||||||
});
|
|
||||||
|
|
||||||
// Test script injection for the origin 127.0.0.1.
|
|
||||||
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
|
|
||||||
frame.GetNavigationController(), fuchsia::web::LoadUrlParams(),
|
|
||||||
url.spec()));
|
|
||||||
frame.navigation_listener().RunUntilUrlAndTitleEquals(url, "hello");
|
|
||||||
|
|
||||||
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
|
|
||||||
frame.GetNavigationController(), fuchsia::web::LoadUrlParams(),
|
|
||||||
url::kAboutBlankURL));
|
|
||||||
frame.navigation_listener().RunUntilUrlEquals(GURL(url::kAboutBlankURL));
|
|
||||||
|
|
||||||
// Test script injection using a different origin ("localhost"), which should
|
|
||||||
// still be picked up by the wildcard.
|
|
||||||
GURL alt_url = embedded_test_server()->GetURL("localhost", kDynamicTitlePath);
|
|
||||||
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
|
|
||||||
frame.GetNavigationController(), fuchsia::web::LoadUrlParams(),
|
|
||||||
alt_url.spec()));
|
|
||||||
frame.navigation_listener().RunUntilUrlAndTitleEquals(alt_url, "hello");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Test that we can inject scripts before and after RenderFrame creation.
|
|
||||||
IN_PROC_BROWSER_TEST_F(FrameImplTest,
|
|
||||||
BeforeLoadScriptEarlyAndLateRegistrations) {
|
|
||||||
constexpr int64_t kOnLoadScriptId2 = kOnLoadScriptId + 1;
|
|
||||||
|
|
||||||
net::test_server::EmbeddedTestServerHandle test_server_handle;
|
|
||||||
ASSERT_TRUE(test_server_handle =
|
|
||||||
embedded_test_server()->StartAndReturnHandle());
|
|
||||||
GURL url(embedded_test_server()->GetURL(kDynamicTitlePath));
|
|
||||||
auto frame = cr_fuchsia::FrameForTest::Create(context(), {});
|
|
||||||
|
|
||||||
frame->AddBeforeLoadJavaScript(
|
|
||||||
kOnLoadScriptId, {url.DeprecatedGetOriginAsURL().spec()},
|
|
||||||
base::MemBufferFromString("stashed_title = 'hello';", "test"),
|
|
||||||
[](fuchsia::web::Frame_AddBeforeLoadJavaScript_Result result) {
|
|
||||||
EXPECT_TRUE(result.is_response());
|
|
||||||
});
|
|
||||||
|
|
||||||
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
|
|
||||||
frame.GetNavigationController(), fuchsia::web::LoadUrlParams(),
|
|
||||||
url.spec()));
|
|
||||||
frame.navigation_listener().RunUntilUrlAndTitleEquals(url, "hello");
|
|
||||||
|
|
||||||
frame->AddBeforeLoadJavaScript(
|
|
||||||
kOnLoadScriptId2, {url.DeprecatedGetOriginAsURL().spec()},
|
|
||||||
base::MemBufferFromString("stashed_title += ' there';", "test"),
|
|
||||||
[](fuchsia::web::Frame_AddBeforeLoadJavaScript_Result result) {
|
|
||||||
EXPECT_TRUE(result.is_response());
|
|
||||||
});
|
|
||||||
|
|
||||||
// Navigate away to clean the slate.
|
|
||||||
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
|
|
||||||
frame.GetNavigationController(), fuchsia::web::LoadUrlParams(),
|
|
||||||
url::kAboutBlankURL));
|
|
||||||
frame.navigation_listener().RunUntilUrlEquals(GURL(url::kAboutBlankURL));
|
|
||||||
|
|
||||||
// Navigate back and see if both scripts are working.
|
|
||||||
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
|
|
||||||
frame.GetNavigationController(), fuchsia::web::LoadUrlParams(),
|
|
||||||
url.spec()));
|
|
||||||
frame.navigation_listener().RunUntilUrlAndTitleEquals(url, "hello there");
|
|
||||||
}
|
|
||||||
|
|
||||||
IN_PROC_BROWSER_TEST_F(FrameImplTest, ExecuteJavaScriptBadEncoding) {
|
|
||||||
auto frame = cr_fuchsia::FrameForTest::Create(context(), {});
|
|
||||||
|
|
||||||
net::test_server::EmbeddedTestServerHandle test_server_handle;
|
|
||||||
ASSERT_TRUE(test_server_handle =
|
|
||||||
embedded_test_server()->StartAndReturnHandle());
|
|
||||||
GURL url(embedded_test_server()->GetURL(kPage1Path));
|
|
||||||
|
|
||||||
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
|
|
||||||
frame.GetNavigationController(), fuchsia::web::LoadUrlParams(),
|
|
||||||
url.spec()));
|
|
||||||
frame.navigation_listener().RunUntilUrlAndTitleEquals(url, kPage1Title);
|
|
||||||
|
|
||||||
base::RunLoop run_loop;
|
|
||||||
|
|
||||||
// 0xFE is an illegal UTF-8 byte; it should cause UTF-8 conversion to fail.
|
|
||||||
frame->ExecuteJavaScriptNoResult(
|
|
||||||
{url.DeprecatedGetOriginAsURL().spec()},
|
|
||||||
base::MemBufferFromString("true;\xfe", "test"),
|
|
||||||
[&run_loop](fuchsia::web::Frame_ExecuteJavaScriptNoResult_Result result) {
|
|
||||||
EXPECT_TRUE(result.is_err());
|
|
||||||
EXPECT_EQ(result.err(), fuchsia::web::FrameError::BUFFER_NOT_UTF8);
|
|
||||||
run_loop.Quit();
|
|
||||||
});
|
|
||||||
run_loop.Run();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Verifies that a Frame will handle navigation listener disconnection events
|
// Verifies that a Frame will handle navigation listener disconnection events
|
||||||
// gracefully.
|
// gracefully.
|
||||||
IN_PROC_BROWSER_TEST_F(FrameImplTest, NavigationObserverDisconnected) {
|
IN_PROC_BROWSER_TEST_F(FrameImplTest, NavigationObserverDisconnected) {
|
||||||
|
345
fuchsia/engine/browser/javascript_browsertest.cc
Normal file
345
fuchsia/engine/browser/javascript_browsertest.cc
Normal file
@ -0,0 +1,345 @@
|
|||||||
|
// Copyright 2021 The Chromium Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#include "base/fuchsia/mem_buffer_util.h"
|
||||||
|
#include "content/public/test/browser_test.h"
|
||||||
|
#include "fuchsia/base/test/frame_test_util.h"
|
||||||
|
#include "fuchsia/base/test/test_navigation_listener.h"
|
||||||
|
#include "fuchsia/engine/browser/frame_impl_browser_test_base.h"
|
||||||
|
#include "fuchsia/engine/test/frame_for_test.h"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
constexpr char kPage1Path[] = "/title1.html";
|
||||||
|
constexpr char kPage1Title[] = "title 1";
|
||||||
|
|
||||||
|
constexpr char kDynamicTitlePath[] = "/dynamic_title.html";
|
||||||
|
constexpr int64_t kOnLoadScriptId = 0;
|
||||||
|
|
||||||
|
using JavaScriptTest = FrameImplTestBase;
|
||||||
|
|
||||||
|
IN_PROC_BROWSER_TEST_F(JavaScriptTest, BeforeLoadScript) {
|
||||||
|
constexpr int64_t kBindingsId = 1234;
|
||||||
|
|
||||||
|
net::test_server::EmbeddedTestServerHandle test_server_handle;
|
||||||
|
ASSERT_TRUE(test_server_handle =
|
||||||
|
embedded_test_server()->StartAndReturnHandle());
|
||||||
|
GURL url(embedded_test_server()->GetURL(kDynamicTitlePath));
|
||||||
|
auto frame = cr_fuchsia::FrameForTest::Create(context(), {});
|
||||||
|
|
||||||
|
frame->AddBeforeLoadJavaScript(
|
||||||
|
kBindingsId, {embedded_test_server()->GetOrigin().Serialize()},
|
||||||
|
base::MemBufferFromString("stashed_title = 'hello';", "test"),
|
||||||
|
[](fuchsia::web::Frame_AddBeforeLoadJavaScript_Result result) {
|
||||||
|
EXPECT_TRUE(result.is_response());
|
||||||
|
});
|
||||||
|
|
||||||
|
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
|
||||||
|
frame.GetNavigationController(), fuchsia::web::LoadUrlParams(),
|
||||||
|
url.spec()));
|
||||||
|
frame.navigation_listener().RunUntilUrlEquals(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
IN_PROC_BROWSER_TEST_F(JavaScriptTest, BeforeLoadScriptUpdated) {
|
||||||
|
constexpr int64_t kBindingsId = 1234;
|
||||||
|
|
||||||
|
net::test_server::EmbeddedTestServerHandle test_server_handle;
|
||||||
|
ASSERT_TRUE(test_server_handle =
|
||||||
|
embedded_test_server()->StartAndReturnHandle());
|
||||||
|
GURL url(embedded_test_server()->GetURL(kDynamicTitlePath));
|
||||||
|
auto frame = cr_fuchsia::FrameForTest::Create(context(), {});
|
||||||
|
|
||||||
|
frame->AddBeforeLoadJavaScript(
|
||||||
|
kBindingsId, {embedded_test_server()->GetOrigin().Serialize()},
|
||||||
|
base::MemBufferFromString("stashed_title = 'hello';", "test"),
|
||||||
|
[](fuchsia::web::Frame_AddBeforeLoadJavaScript_Result result) {
|
||||||
|
EXPECT_TRUE(result.is_response());
|
||||||
|
});
|
||||||
|
|
||||||
|
// Verify that this script clobbers the previous script, as opposed to being
|
||||||
|
// injected alongside it. (The latter would result in the title being
|
||||||
|
// "helloclobber").
|
||||||
|
frame->AddBeforeLoadJavaScript(
|
||||||
|
kBindingsId, {embedded_test_server()->GetOrigin().Serialize()},
|
||||||
|
base::MemBufferFromString("stashed_title = document.title + 'clobber';",
|
||||||
|
"test"),
|
||||||
|
[](fuchsia::web::Frame_AddBeforeLoadJavaScript_Result result) {
|
||||||
|
EXPECT_TRUE(result.is_response());
|
||||||
|
});
|
||||||
|
|
||||||
|
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
|
||||||
|
frame.GetNavigationController(), fuchsia::web::LoadUrlParams(),
|
||||||
|
url.spec()));
|
||||||
|
frame.navigation_listener().RunUntilUrlAndTitleEquals(url, "clobber");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verifies that bindings are injected in order by producing a cumulative,
|
||||||
|
// non-commutative result.
|
||||||
|
IN_PROC_BROWSER_TEST_F(JavaScriptTest, BeforeLoadScriptOrdered) {
|
||||||
|
constexpr int64_t kBindingsId1 = 1234;
|
||||||
|
constexpr int64_t kBindingsId2 = 5678;
|
||||||
|
|
||||||
|
net::test_server::EmbeddedTestServerHandle test_server_handle;
|
||||||
|
ASSERT_TRUE(test_server_handle =
|
||||||
|
embedded_test_server()->StartAndReturnHandle());
|
||||||
|
GURL url(embedded_test_server()->GetURL(kDynamicTitlePath));
|
||||||
|
auto frame = cr_fuchsia::FrameForTest::Create(context(), {});
|
||||||
|
|
||||||
|
frame->AddBeforeLoadJavaScript(
|
||||||
|
kBindingsId1, {embedded_test_server()->GetOrigin().Serialize()},
|
||||||
|
base::MemBufferFromString("stashed_title = 'hello';", "test"),
|
||||||
|
[](fuchsia::web::Frame_AddBeforeLoadJavaScript_Result result) {
|
||||||
|
EXPECT_TRUE(result.is_response());
|
||||||
|
});
|
||||||
|
frame->AddBeforeLoadJavaScript(
|
||||||
|
kBindingsId2, {embedded_test_server()->GetOrigin().Serialize()},
|
||||||
|
base::MemBufferFromString("stashed_title += ' there';", "test"),
|
||||||
|
[](fuchsia::web::Frame_AddBeforeLoadJavaScript_Result result) {
|
||||||
|
EXPECT_TRUE(result.is_response());
|
||||||
|
});
|
||||||
|
|
||||||
|
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
|
||||||
|
frame.GetNavigationController(), fuchsia::web::LoadUrlParams(),
|
||||||
|
url.spec()));
|
||||||
|
frame.navigation_listener().RunUntilUrlAndTitleEquals(url, "hello there");
|
||||||
|
}
|
||||||
|
|
||||||
|
IN_PROC_BROWSER_TEST_F(JavaScriptTest, BeforeLoadScriptRemoved) {
|
||||||
|
constexpr int64_t kBindingsId1 = 1234;
|
||||||
|
constexpr int64_t kBindingsId2 = 5678;
|
||||||
|
|
||||||
|
net::test_server::EmbeddedTestServerHandle test_server_handle;
|
||||||
|
ASSERT_TRUE(test_server_handle =
|
||||||
|
embedded_test_server()->StartAndReturnHandle());
|
||||||
|
GURL url(embedded_test_server()->GetURL(kDynamicTitlePath));
|
||||||
|
auto frame = cr_fuchsia::FrameForTest::Create(context(), {});
|
||||||
|
|
||||||
|
frame->AddBeforeLoadJavaScript(
|
||||||
|
kBindingsId1, {embedded_test_server()->GetOrigin().Serialize()},
|
||||||
|
base::MemBufferFromString("stashed_title = 'foo';", "test"),
|
||||||
|
[](fuchsia::web::Frame_AddBeforeLoadJavaScript_Result result) {
|
||||||
|
EXPECT_TRUE(result.is_response());
|
||||||
|
});
|
||||||
|
|
||||||
|
// Add a script which clobbers "foo".
|
||||||
|
frame->AddBeforeLoadJavaScript(
|
||||||
|
kBindingsId2, {embedded_test_server()->GetOrigin().Serialize()},
|
||||||
|
base::MemBufferFromString("stashed_title = 'bar';", "test"),
|
||||||
|
[](fuchsia::web::Frame_AddBeforeLoadJavaScript_Result result) {
|
||||||
|
EXPECT_TRUE(result.is_response());
|
||||||
|
});
|
||||||
|
|
||||||
|
// Deletes the clobbering script.
|
||||||
|
frame->RemoveBeforeLoadJavaScript(kBindingsId2);
|
||||||
|
|
||||||
|
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
|
||||||
|
frame.GetNavigationController(), fuchsia::web::LoadUrlParams(),
|
||||||
|
url.spec()));
|
||||||
|
frame.navigation_listener().RunUntilUrlAndTitleEquals(url, "foo");
|
||||||
|
}
|
||||||
|
|
||||||
|
IN_PROC_BROWSER_TEST_F(JavaScriptTest, BeforeLoadScriptRemoveInvalidId) {
|
||||||
|
net::test_server::EmbeddedTestServerHandle test_server_handle;
|
||||||
|
ASSERT_TRUE(test_server_handle =
|
||||||
|
embedded_test_server()->StartAndReturnHandle());
|
||||||
|
GURL url(embedded_test_server()->GetURL(kPage1Path));
|
||||||
|
auto frame = cr_fuchsia::FrameForTest::Create(context(), {});
|
||||||
|
|
||||||
|
frame->RemoveBeforeLoadJavaScript(kOnLoadScriptId);
|
||||||
|
|
||||||
|
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
|
||||||
|
frame.GetNavigationController(), fuchsia::web::LoadUrlParams(),
|
||||||
|
url.spec()));
|
||||||
|
frame.navigation_listener().RunUntilUrlAndTitleEquals(url, kPage1Title);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test JS injection using ExecuteJavaScriptNoResult() to set a value, and
|
||||||
|
// ExecuteJavaScript() to retrieve that value.
|
||||||
|
IN_PROC_BROWSER_TEST_F(JavaScriptTest, ExecuteJavaScript) {
|
||||||
|
constexpr char kJsonStringLiteral[] = "\"I am a literal, literally\"";
|
||||||
|
auto frame = cr_fuchsia::FrameForTest::Create(context(), {});
|
||||||
|
|
||||||
|
net::test_server::EmbeddedTestServerHandle test_server_handle;
|
||||||
|
ASSERT_TRUE(test_server_handle =
|
||||||
|
embedded_test_server()->StartAndReturnHandle());
|
||||||
|
const GURL kUrl(embedded_test_server()->GetURL(kPage1Path));
|
||||||
|
|
||||||
|
// Navigate to a page and wait for it to finish loading.
|
||||||
|
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
|
||||||
|
frame.GetNavigationController(), fuchsia::web::LoadUrlParams(),
|
||||||
|
kUrl.spec()));
|
||||||
|
frame.navigation_listener().RunUntilUrlAndTitleEquals(kUrl, kPage1Title);
|
||||||
|
|
||||||
|
// Execute with no result to set the variable.
|
||||||
|
frame->ExecuteJavaScriptNoResult(
|
||||||
|
{kUrl.DeprecatedGetOriginAsURL().spec()},
|
||||||
|
base::MemBufferFromString(
|
||||||
|
base::StringPrintf("my_variable = %s;", kJsonStringLiteral), "test"),
|
||||||
|
[](fuchsia::web::Frame_ExecuteJavaScriptNoResult_Result result) {
|
||||||
|
EXPECT_TRUE(result.is_response());
|
||||||
|
});
|
||||||
|
|
||||||
|
// Execute a script snippet to return the variable's value.
|
||||||
|
base::RunLoop loop;
|
||||||
|
frame->ExecuteJavaScript(
|
||||||
|
{kUrl.DeprecatedGetOriginAsURL().spec()},
|
||||||
|
base::MemBufferFromString("my_variable;", "test"),
|
||||||
|
[&](fuchsia::web::Frame_ExecuteJavaScript_Result result) {
|
||||||
|
ASSERT_TRUE(result.is_response());
|
||||||
|
std::string result_json =
|
||||||
|
*base::StringFromMemBuffer(result.response().result);
|
||||||
|
EXPECT_EQ(result_json, kJsonStringLiteral);
|
||||||
|
loop.Quit();
|
||||||
|
});
|
||||||
|
loop.Run();
|
||||||
|
}
|
||||||
|
|
||||||
|
IN_PROC_BROWSER_TEST_F(JavaScriptTest, BeforeLoadScriptVmoDestroyed) {
|
||||||
|
net::test_server::EmbeddedTestServerHandle test_server_handle;
|
||||||
|
ASSERT_TRUE(test_server_handle =
|
||||||
|
embedded_test_server()->StartAndReturnHandle());
|
||||||
|
GURL url(embedded_test_server()->GetURL(kDynamicTitlePath));
|
||||||
|
auto frame = cr_fuchsia::FrameForTest::Create(context(), {});
|
||||||
|
|
||||||
|
frame->AddBeforeLoadJavaScript(
|
||||||
|
kOnLoadScriptId, {embedded_test_server()->GetOrigin().Serialize()},
|
||||||
|
base::MemBufferFromString("stashed_title = 'hello';", "test"),
|
||||||
|
[](fuchsia::web::Frame_AddBeforeLoadJavaScript_Result result) {
|
||||||
|
EXPECT_TRUE(result.is_response());
|
||||||
|
});
|
||||||
|
|
||||||
|
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
|
||||||
|
frame.GetNavigationController(), fuchsia::web::LoadUrlParams(),
|
||||||
|
url.spec()));
|
||||||
|
frame.navigation_listener().RunUntilUrlAndTitleEquals(url, "hello");
|
||||||
|
}
|
||||||
|
|
||||||
|
IN_PROC_BROWSER_TEST_F(JavaScriptTest, BeforeLoadScriptWrongOrigin) {
|
||||||
|
net::test_server::EmbeddedTestServerHandle test_server_handle;
|
||||||
|
ASSERT_TRUE(test_server_handle =
|
||||||
|
embedded_test_server()->StartAndReturnHandle());
|
||||||
|
GURL url(embedded_test_server()->GetURL(kDynamicTitlePath));
|
||||||
|
auto frame = cr_fuchsia::FrameForTest::Create(context(), {});
|
||||||
|
|
||||||
|
frame->AddBeforeLoadJavaScript(
|
||||||
|
kOnLoadScriptId, {"http://example.com"},
|
||||||
|
base::MemBufferFromString("stashed_title = 'hello';", "test"),
|
||||||
|
[](fuchsia::web::Frame_AddBeforeLoadJavaScript_Result result) {
|
||||||
|
EXPECT_TRUE(result.is_response());
|
||||||
|
});
|
||||||
|
|
||||||
|
// Expect that the original HTML title is used, because we didn't inject a
|
||||||
|
// script with a replacement title.
|
||||||
|
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
|
||||||
|
frame.GetNavigationController(), fuchsia::web::LoadUrlParams(),
|
||||||
|
url.spec()));
|
||||||
|
frame.navigation_listener().RunUntilUrlAndTitleEquals(
|
||||||
|
url, "Welcome to Stan the Offline Dino's Homepage");
|
||||||
|
}
|
||||||
|
|
||||||
|
IN_PROC_BROWSER_TEST_F(JavaScriptTest, BeforeLoadScriptWildcardOrigin) {
|
||||||
|
net::test_server::EmbeddedTestServerHandle test_server_handle;
|
||||||
|
ASSERT_TRUE(test_server_handle =
|
||||||
|
embedded_test_server()->StartAndReturnHandle());
|
||||||
|
GURL url(embedded_test_server()->GetURL(kDynamicTitlePath));
|
||||||
|
auto frame = cr_fuchsia::FrameForTest::Create(context(), {});
|
||||||
|
|
||||||
|
frame->AddBeforeLoadJavaScript(
|
||||||
|
kOnLoadScriptId, {"*"},
|
||||||
|
base::MemBufferFromString("stashed_title = 'hello';", "test"),
|
||||||
|
[](fuchsia::web::Frame_AddBeforeLoadJavaScript_Result result) {
|
||||||
|
EXPECT_TRUE(result.is_response());
|
||||||
|
});
|
||||||
|
|
||||||
|
// Test script injection for the origin 127.0.0.1.
|
||||||
|
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
|
||||||
|
frame.GetNavigationController(), fuchsia::web::LoadUrlParams(),
|
||||||
|
url.spec()));
|
||||||
|
frame.navigation_listener().RunUntilUrlAndTitleEquals(url, "hello");
|
||||||
|
|
||||||
|
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
|
||||||
|
frame.GetNavigationController(), fuchsia::web::LoadUrlParams(),
|
||||||
|
url::kAboutBlankURL));
|
||||||
|
frame.navigation_listener().RunUntilUrlEquals(GURL(url::kAboutBlankURL));
|
||||||
|
|
||||||
|
// Test script injection using a different origin ("localhost"), which should
|
||||||
|
// still be picked up by the wildcard.
|
||||||
|
GURL alt_url = embedded_test_server()->GetURL("localhost", kDynamicTitlePath);
|
||||||
|
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
|
||||||
|
frame.GetNavigationController(), fuchsia::web::LoadUrlParams(),
|
||||||
|
alt_url.spec()));
|
||||||
|
frame.navigation_listener().RunUntilUrlAndTitleEquals(alt_url, "hello");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test that we can inject scripts before and after RenderFrame creation.
|
||||||
|
IN_PROC_BROWSER_TEST_F(JavaScriptTest,
|
||||||
|
BeforeLoadScriptEarlyAndLateRegistrations) {
|
||||||
|
constexpr int64_t kOnLoadScriptId2 = kOnLoadScriptId + 1;
|
||||||
|
|
||||||
|
net::test_server::EmbeddedTestServerHandle test_server_handle;
|
||||||
|
ASSERT_TRUE(test_server_handle =
|
||||||
|
embedded_test_server()->StartAndReturnHandle());
|
||||||
|
GURL url(embedded_test_server()->GetURL(kDynamicTitlePath));
|
||||||
|
auto frame = cr_fuchsia::FrameForTest::Create(context(), {});
|
||||||
|
|
||||||
|
frame->AddBeforeLoadJavaScript(
|
||||||
|
kOnLoadScriptId, {embedded_test_server()->GetOrigin().Serialize()},
|
||||||
|
base::MemBufferFromString("stashed_title = 'hello';", "test"),
|
||||||
|
[](fuchsia::web::Frame_AddBeforeLoadJavaScript_Result result) {
|
||||||
|
EXPECT_TRUE(result.is_response());
|
||||||
|
});
|
||||||
|
|
||||||
|
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
|
||||||
|
frame.GetNavigationController(), fuchsia::web::LoadUrlParams(),
|
||||||
|
url.spec()));
|
||||||
|
frame.navigation_listener().RunUntilUrlAndTitleEquals(url, "hello");
|
||||||
|
|
||||||
|
frame->AddBeforeLoadJavaScript(
|
||||||
|
kOnLoadScriptId2, {embedded_test_server()->GetOrigin().Serialize()},
|
||||||
|
base::MemBufferFromString("stashed_title += ' there';", "test"),
|
||||||
|
[](fuchsia::web::Frame_AddBeforeLoadJavaScript_Result result) {
|
||||||
|
EXPECT_TRUE(result.is_response());
|
||||||
|
});
|
||||||
|
|
||||||
|
// Navigate away to clean the slate.
|
||||||
|
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
|
||||||
|
frame.GetNavigationController(), fuchsia::web::LoadUrlParams(),
|
||||||
|
url::kAboutBlankURL));
|
||||||
|
frame.navigation_listener().RunUntilUrlEquals(GURL(url::kAboutBlankURL));
|
||||||
|
|
||||||
|
// Navigate back and see if both scripts are working.
|
||||||
|
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
|
||||||
|
frame.GetNavigationController(), fuchsia::web::LoadUrlParams(),
|
||||||
|
url.spec()));
|
||||||
|
frame.navigation_listener().RunUntilUrlAndTitleEquals(url, "hello there");
|
||||||
|
}
|
||||||
|
|
||||||
|
IN_PROC_BROWSER_TEST_F(JavaScriptTest, BadEncoding) {
|
||||||
|
auto frame = cr_fuchsia::FrameForTest::Create(context(), {});
|
||||||
|
|
||||||
|
net::test_server::EmbeddedTestServerHandle test_server_handle;
|
||||||
|
ASSERT_TRUE(test_server_handle =
|
||||||
|
embedded_test_server()->StartAndReturnHandle());
|
||||||
|
GURL url(embedded_test_server()->GetURL(kPage1Path));
|
||||||
|
|
||||||
|
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
|
||||||
|
frame.GetNavigationController(), fuchsia::web::LoadUrlParams(),
|
||||||
|
url.spec()));
|
||||||
|
frame.navigation_listener().RunUntilUrlAndTitleEquals(url, kPage1Title);
|
||||||
|
|
||||||
|
base::RunLoop run_loop;
|
||||||
|
|
||||||
|
// 0xFE is an illegal UTF-8 byte; it should cause UTF-8 conversion to fail.
|
||||||
|
frame->ExecuteJavaScriptNoResult(
|
||||||
|
{embedded_test_server()->GetOrigin().Serialize()},
|
||||||
|
base::MemBufferFromString("true;\xfe", "test"),
|
||||||
|
[&run_loop](fuchsia::web::Frame_ExecuteJavaScriptNoResult_Result result) {
|
||||||
|
EXPECT_TRUE(result.is_err());
|
||||||
|
EXPECT_EQ(result.err(), fuchsia::web::FrameError::BUFFER_NOT_UTF8);
|
||||||
|
run_loop.Quit();
|
||||||
|
});
|
||||||
|
run_loop.Run();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
Reference in New Issue
Block a user