Commit 95488d8f authored by gogerald's avatar gogerald Committed by Commit Bot

[Autofill Assistant] Get rid of node ids when using devtools

'node id' is volatile which subject to change without notice.
This change enables concurrently checking element exists, getting field value
and so on

Bug: 806868
Change-Id: I90a4254c170e260c93caa201b7fa3b411508c152
Reviewed-on: https://chromium-review.googlesource.com/c/1292430Reviewed-by: default avatarRouslan Solomakhin <rouslan@chromium.org>
Commit-Queue: Ganggui Tang <gogerald@chromium.org>
Cr-Commit-Position: refs/heads/master@{#601314}
parent 0ea4d6dd
...@@ -180,42 +180,39 @@ class WebController { ...@@ -180,42 +180,39 @@ class WebController {
void FindElement(const std::vector<std::string>& selectors, void FindElement(const std::vector<std::string>& selectors,
bool strict_mode, bool strict_mode,
FindElementCallback callback); FindElementCallback callback);
void OnGetDocument(const std::vector<std::string>& selectors, void OnGetDocumentElement(const std::vector<std::string>& selectors,
bool strict_mode, bool strict_mode,
FindElementCallback callback, FindElementCallback callback,
std::unique_ptr<dom::GetDocumentResult> result); std::unique_ptr<runtime::EvaluateResult> result);
void RecursiveFindElement(int node_id, void RecursiveFindElement(const std::string& object_id,
size_t index, size_t index,
const std::vector<std::string>& selectors, const std::vector<std::string>& selectors,
bool strict_mode, bool strict_mode,
std::unique_ptr<FindElementResult> element_result, std::unique_ptr<FindElementResult> element_result,
FindElementCallback callback); FindElementCallback callback);
void OnQuerySelectorAll(size_t index, void OnQuerySelectorAll(
const std::vector<std::string>& selectors, size_t index,
bool strict_mode, const std::vector<std::string>& selectors,
std::unique_ptr<FindElementResult> element_result, bool strict_mode,
FindElementCallback callback, std::unique_ptr<FindElementResult> element_result,
std::unique_ptr<dom::QuerySelectorAllResult> result); FindElementCallback callback,
void OnResolveNode(std::unique_ptr<FindElementResult> element_result, std::unique_ptr<runtime::CallFunctionOnResult> result);
FindElementCallback callback, void OnDescribeNode(const std::string& object_id,
std::unique_ptr<dom::ResolveNodeResult> result);
void OnDescribeNode(int node_id,
size_t index, size_t index,
const std::vector<std::string>& selectors, const std::vector<std::string>& selectors,
bool strict_mode, bool strict_mode,
std::unique_ptr<FindElementResult> element_result, std::unique_ptr<FindElementResult> element_result,
FindElementCallback callback, FindElementCallback callback,
std::unique_ptr<dom::DescribeNodeResult> result); std::unique_ptr<dom::DescribeNodeResult> result);
void OnResolveNode(size_t index,
const std::vector<std::string>& selectors,
bool strict_mode,
std::unique_ptr<FindElementResult> element_result,
FindElementCallback callback,
std::unique_ptr<dom::ResolveNodeResult> result);
content::RenderFrameHost* FindCorrespondingRenderFrameHost( content::RenderFrameHost* FindCorrespondingRenderFrameHost(
std::string name, std::string name,
std::string document_url); std::string document_url);
void OnPushNodesByBackendIds(
size_t index,
const std::vector<std::string>& selectors,
bool strict_mode,
std::unique_ptr<FindElementResult> element_result,
FindElementCallback callback,
std::unique_ptr<dom::PushNodesByBackendIdsToFrontendResult> result);
void OnResult(bool result, base::OnceCallback<void(bool)> callback); void OnResult(bool result, base::OnceCallback<void(bool)> callback);
void OnResult(bool exists, void OnResult(bool exists,
const std::string& result, const std::string& result,
......
...@@ -34,22 +34,30 @@ class WebControllerBrowserTest : public content::ContentBrowserTest { ...@@ -34,22 +34,30 @@ class WebControllerBrowserTest : public content::ContentBrowserTest {
WebController::CreateForWebContents(shell()->web_contents()); WebController::CreateForWebContents(shell()->web_contents());
} }
void IsElementExists(const std::vector<std::string>& selectors, void AreElementsExist(const std::vector<std::vector<std::string>>& selectors,
bool expected_result) { const std::vector<bool> results) {
base::RunLoop run_loop; base::RunLoop run_loop;
web_controller_->ElementExists( ASSERT_EQ(selectors.size(), results.size());
selectors, size_t pending_number_of_checks = selectors.size();
base::BindOnce(&WebControllerBrowserTest::CheckElementExistCallback, for (size_t i = 0; i < selectors.size(); i++) {
base::Unretained(this), run_loop.QuitClosure(), web_controller_->ElementExists(
expected_result)); selectors[i],
base::BindOnce(&WebControllerBrowserTest::CheckElementExistCallback,
base::Unretained(this), run_loop.QuitClosure(),
&pending_number_of_checks, results[i]));
}
run_loop.Run(); run_loop.Run();
} }
void CheckElementExistCallback(const base::Closure& done_callback, void CheckElementExistCallback(const base::Closure& done_callback,
size_t* pending_number_of_checks_output,
bool expected_result, bool expected_result,
bool result) { bool result) {
ASSERT_EQ(expected_result, result); ASSERT_EQ(expected_result, result);
done_callback.Run(); *pending_number_of_checks_output -= 1;
if (*pending_number_of_checks_output == 0) {
done_callback.Run();
}
} }
void ClickElement(const std::vector<std::string>& selectors) { void ClickElement(const std::vector<std::string>& selectors) {
...@@ -190,23 +198,31 @@ class WebControllerBrowserTest : public content::ContentBrowserTest { ...@@ -190,23 +198,31 @@ class WebControllerBrowserTest : public content::ContentBrowserTest {
ASSERT_FALSE(result->object_id.empty()); ASSERT_FALSE(result->object_id.empty());
} }
std::string GetFieldValue(const std::vector<std::string>& selectors) { void GetFieldsValue(const std::vector<std::vector<std::string>>& selectors,
const std::vector<std::string>& expected_values) {
base::RunLoop run_loop; base::RunLoop run_loop;
std::string result; ASSERT_EQ(selectors.size(), expected_values.size());
web_controller_->GetFieldValue( size_t pending_number_of_checks = selectors.size();
selectors, base::BindOnce(&WebControllerBrowserTest::OnGetFieldValue, for (size_t i = 0; i < selectors.size(); i++) {
base::Unretained(this), web_controller_->GetFieldValue(
run_loop.QuitClosure(), &result)); selectors[i],
base::BindOnce(&WebControllerBrowserTest::OnGetFieldValue,
base::Unretained(this), run_loop.QuitClosure(),
&pending_number_of_checks, expected_values[i]));
}
run_loop.Run(); run_loop.Run();
return result;
} }
void OnGetFieldValue(const base::Closure& done_callback, void OnGetFieldValue(const base::Closure& done_callback,
std::string* value_output, size_t* pending_number_of_checks_output,
const std::string& expected_value,
bool exists, bool exists,
const std::string& value) { const std::string& value) {
*value_output = value; ASSERT_EQ(expected_value, value);
std::move(done_callback).Run(); *pending_number_of_checks_output -= 1;
if (*pending_number_of_checks_output == 0) {
std::move(done_callback).Run();
}
} }
bool SetFieldValue(const std::vector<std::string>& selectors, bool SetFieldValue(const std::vector<std::string>& selectors,
...@@ -238,48 +254,67 @@ class WebControllerBrowserTest : public content::ContentBrowserTest { ...@@ -238,48 +254,67 @@ class WebControllerBrowserTest : public content::ContentBrowserTest {
DISALLOW_COPY_AND_ASSIGN(WebControllerBrowserTest); DISALLOW_COPY_AND_ASSIGN(WebControllerBrowserTest);
}; };
IN_PROC_BROWSER_TEST_F(WebControllerBrowserTest, IsElementExists) { IN_PROC_BROWSER_TEST_F(WebControllerBrowserTest, ConcurrentElementsExist) {
std::vector<std::string> selectors; std::vector<std::vector<std::string>> selectors;
selectors.emplace_back("#button"); std::vector<bool> results;
IsElementExists(selectors, true);
selectors.emplace_back("#whatever");
IsElementExists(selectors, false);
// IFrame. std::vector<std::string> a_selector;
selectors.clear(); a_selector.emplace_back("#button");
selectors.emplace_back("#iframe"); selectors.emplace_back(a_selector);
selectors.emplace_back("#button"); results.emplace_back(true);
IsElementExists(selectors, true);
selectors.emplace_back("#whatever");
IsElementExists(selectors, false);
selectors.clear(); a_selector.emplace_back("#whatever");
selectors.emplace_back("#iframe"); selectors.emplace_back(a_selector);
selectors.emplace_back("[name=name]"); results.emplace_back(false);
IsElementExists(selectors, true);
// IFrame.
a_selector.clear();
a_selector.emplace_back("#iframe");
a_selector.emplace_back("#button");
selectors.emplace_back(a_selector);
results.emplace_back(true);
a_selector.emplace_back("#whatever");
selectors.emplace_back(a_selector);
results.emplace_back(false);
a_selector.clear();
a_selector.emplace_back("#iframe");
a_selector.emplace_back("[name=name]");
selectors.emplace_back(a_selector);
results.emplace_back(true);
// Shadow DOM. // Shadow DOM.
selectors.clear(); a_selector.clear();
selectors.emplace_back("#iframe"); a_selector.emplace_back("#iframe");
selectors.emplace_back("#shadowsection"); a_selector.emplace_back("#shadowsection");
selectors.emplace_back("#shadowbutton"); a_selector.emplace_back("#shadowbutton");
IsElementExists(selectors, true); selectors.emplace_back(a_selector);
selectors.emplace_back("#whatever"); results.emplace_back(true);
IsElementExists(selectors, false);
a_selector.emplace_back("#whatever");
selectors.emplace_back(a_selector);
results.emplace_back(false);
// IFrame inside IFrame. // IFrame inside IFrame.
selectors.clear(); a_selector.clear();
selectors.emplace_back("#iframe"); a_selector.emplace_back("#iframe");
selectors.emplace_back("#iframe"); a_selector.emplace_back("#iframe");
selectors.emplace_back("#button"); a_selector.emplace_back("#button");
IsElementExists(selectors, true); selectors.emplace_back(a_selector);
selectors.emplace_back("#whatever"); results.emplace_back(true);
IsElementExists(selectors, false);
a_selector.emplace_back("#whatever");
selectors.emplace_back(a_selector);
results.emplace_back(false);
// Hidden element. // Hidden element.
selectors.clear(); a_selector.clear();
selectors.emplace_back("#hidden"); a_selector.emplace_back("#hidden");
IsElementExists(selectors, false); selectors.emplace_back(a_selector);
results.emplace_back(false);
AreElementsExist(selectors, results);
} }
IN_PROC_BROWSER_TEST_F(WebControllerBrowserTest, ClickElement) { IN_PROC_BROWSER_TEST_F(WebControllerBrowserTest, ClickElement) {
...@@ -421,17 +456,61 @@ IN_PROC_BROWSER_TEST_F(WebControllerBrowserTest, GetOuterHtml) { ...@@ -421,17 +456,61 @@ IN_PROC_BROWSER_TEST_F(WebControllerBrowserTest, GetOuterHtml) {
} }
IN_PROC_BROWSER_TEST_F(WebControllerBrowserTest, GetAndSetFieldValue) { IN_PROC_BROWSER_TEST_F(WebControllerBrowserTest, GetAndSetFieldValue) {
std::vector<std::string> selectors; std::vector<std::vector<std::string>> selectors;
selectors.emplace_back("#input"); std::vector<std::string> expected_values;
EXPECT_EQ("helloworld", GetFieldValue(selectors));
std::vector<std::string> a_selector;
a_selector.emplace_back("#input1");
selectors.emplace_back(a_selector);
expected_values.emplace_back("helloworld1");
GetFieldsValue(selectors, expected_values);
EXPECT_TRUE(SetFieldValue(selectors, "foo'")); EXPECT_TRUE(SetFieldValue(a_selector, "foo"));
EXPECT_EQ("foo'", GetFieldValue(selectors)); expected_values.clear();
expected_values.emplace_back("foo");
GetFieldsValue(selectors, expected_values);
selectors.clear(); selectors.clear();
selectors.emplace_back("#invalid_selector"); a_selector.clear();
EXPECT_EQ("", GetFieldValue(selectors)); a_selector.emplace_back("#invalid_selector");
EXPECT_FALSE(SetFieldValue(selectors, "foobar")); selectors.emplace_back(a_selector);
expected_values.clear();
expected_values.emplace_back("");
GetFieldsValue(selectors, expected_values);
EXPECT_FALSE(SetFieldValue(a_selector, "foobar"));
}
IN_PROC_BROWSER_TEST_F(WebControllerBrowserTest, ConcurrentGetFieldsValue) {
std::vector<std::vector<std::string>> selectors;
std::vector<std::string> expected_values;
std::vector<std::string> a_selector;
a_selector.emplace_back("#input1");
selectors.emplace_back(a_selector);
expected_values.emplace_back("helloworld1");
a_selector.clear();
a_selector.emplace_back("#input2");
selectors.emplace_back(a_selector);
expected_values.emplace_back("helloworld2");
a_selector.clear();
a_selector.emplace_back("#input3");
selectors.emplace_back(a_selector);
expected_values.emplace_back("helloworld3");
a_selector.clear();
a_selector.emplace_back("#input4");
selectors.emplace_back(a_selector);
expected_values.emplace_back("helloworld4");
a_selector.clear();
a_selector.emplace_back("#input5");
selectors.emplace_back(a_selector);
expected_values.emplace_back("helloworld5");
GetFieldsValue(selectors, expected_values);
} }
IN_PROC_BROWSER_TEST_F(WebControllerBrowserTest, NavigateToUrl) { IN_PROC_BROWSER_TEST_F(WebControllerBrowserTest, NavigateToUrl) {
......
...@@ -50,7 +50,19 @@ found in the LICENSE file. ...@@ -50,7 +50,19 @@ found in the LICENSE file.
</div> </div>
<div> <div>
<input id="input" type="field" value="helloworld" /> <input id="input1" type="field" value="helloworld1" />
</div>
<div>
<input id="input2" type="field" value="helloworld2" />
</div>
<div>
<input id="input3" type="field" value="helloworld3" />
</div>
<div>
<input id="input4" type="field" value="helloworld4" />
</div>
<div>
<input id="input5" type="field" value="helloworld5" />
</div> </div>
<div id="testOuterHtml"><span>Span</span><p>Paragraph</p></div> <div id="testOuterHtml"><span>Span</span><p>Paragraph</p></div>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment