Commit 054a68b4 authored by Yi Su's avatar Yi Su Committed by Commit Bot

Change the OSDD functionality in search_engine.js to send messages to native side.

Current search_engine.js has a function __gCrWeb.searchEngine.getOpenSearchDescriptionDocumentUrl,
which will be called by native side to get the OpenSearch URL. This CL strips the
function shell, and let the code send messages to native side when OSDD is found in page.

This helps avoid unnecessary Js execution on native side, and makes the SearchEngineTabHelper cleaner.

Bug: 433824
Change-Id: I209ebc40129e753c9715123404a9228659e33158
Reviewed-on: https://chromium-review.googlesource.com/c/1309751Reviewed-by: default avatarEugene But <eugenebut@chromium.org>
Commit-Queue: Yi Su <mrsuyi@chromium.org>
Cr-Commit-Position: refs/heads/master@{#604306}
parent 721f48ec
......@@ -23,22 +23,6 @@ __gCrWeb['searchEngine'] = __gCrWeb.searchEngine;
/* Beginning of anonymous object. */
(function() {
/**
* Find <link> of OSDD(Open Search Description Document) in document and return
* it's URL. If multiple OSDDs are found(which should never happen on a sane web
* site), return the URL of the first OSDD.
* @return {Object|undefined} Dictionary containing document.URL and "href"
* of OSDD <link>, or undefined if not found.
*/
__gCrWeb.searchEngine.getOpenSearchDescriptionDocumentUrl = function() {
var links = document.getElementsByTagName('link');
for (var i = 0; i < links.length; ++i) {
if (links[i].type == 'application/opensearchdescription+xml') {
return {'documentUrl': document.URL, 'openSearchUrl': links[i].href};
}
}
};
/**
* Encodes |url| in "application/x-www-form-urlencoded" content type of <form>.
* The standard is defined in:
......@@ -227,8 +211,7 @@ function generateSearchableUrl_(form) {
value = 'Submit';
}
queryArgs.push(
encodeFormData_(element.name) + '=' +
encodeFormData_(value));
encodeFormData_(element.name) + '=' + encodeFormData_(value));
}
continue;
}
......@@ -306,4 +289,22 @@ document.addEventListener('submit', function(event) {
}
}, false);
/**
* Finds <link> of OSDD(Open Search Description Document) in the main frame. If
* found, sends a message containing the page's URL and OSDD's URL to native
* side. If the page has multiple OSDD <links>s (which should never happen on a
* sane web site), only send the first <link>.
*/
var links = document.getElementsByTagName('link');
for (var i = 0; i < links.length; ++i) {
if (links[i].type == 'application/opensearchdescription+xml') {
__gCrWeb.message.invokeOnHost({
'command': 'searchEngine.openSearch',
'pageUrl': document.URL,
'osddUrl': links[i].href
});
break;
}
};
}()); // End of anonymous object
......@@ -22,6 +22,11 @@ using web::test::SelectWebViewElementWithId;
namespace {
const char kCommandPrefix[] = "searchEngine";
const char kCommandOpenSearch[] = "searchEngine.openSearch";
const char kOpenSearchPageUrlKey[] = "pageUrl";
const char kOpenSearchOsddUrlKey[] = "osddUrl";
const char kCommandSearchableUrl[] = "searchEngine.searchableUrl";
const char kSearchableUrlUrlKey[] = "url";
// This is for cases where no message should be sent back from Js.
const NSTimeInterval kWaitForJsNotReturnTimeout = 0.5;
......@@ -82,8 +87,8 @@ class SearchEngineJsTest : public web::WebJsTest<web::WebTestWithWebState> {
DISALLOW_COPY_AND_ASSIGN(SearchEngineJsTest);
};
// Tests that __gCrWeb.searchEngine.getOpenSearchDescriptionDocumentUrl returns
// the URL of the first OSDD found in page.
// Tests that if a OSDD <link> is found in page, __gCrWeb.searchEngine will
// send a message containing the page's URL and OSDD's URL.
TEST_F(SearchEngineJsTest, TestGetOpenSearchDescriptionDocumentUrlSucceed) {
LoadHtmlAndInject(
@"<html><link rel='search' type='application/opensearchdescription+xml' "
......@@ -95,29 +100,36 @@ TEST_F(SearchEngineJsTest, TestGetOpenSearchDescriptionDocumentUrlSucceed) {
@"<link href='/favicon.ico' rel='shortcut icon' "
@"type='image/x-icon'></html>",
GURL("https://cs.chromium.org"));
id result = ExecuteJavaScript(
@"__gCrWeb.searchEngine.getOpenSearchDescriptionDocumentUrl();");
ASSERT_TRUE([result isKindOfClass:NSDictionary.class]);
NSDictionary* dict = result;
ASSERT_EQ(2UL, dict.count);
EXPECT_NSEQ(@"https://cs.chromium.org/", dict[@"documentUrl"]);
EXPECT_NSEQ(@"https://cs.chromium.org/codesearch/first_opensearch.xml",
dict[@"openSearchUrl"]);
ASSERT_TRUE(WaitUntilConditionOrTimeout(kWaitForJSCompletionTimeout, ^{
base::RunLoop().RunUntilIdle();
return message_received_;
}));
const base::Value* cmd = message_.FindKey("command");
ASSERT_TRUE(cmd);
ASSERT_TRUE(cmd->is_string());
EXPECT_EQ(kCommandOpenSearch, cmd->GetString());
const base::Value* page_url = message_.FindKey(kOpenSearchPageUrlKey);
ASSERT_TRUE(page_url);
ASSERT_TRUE(page_url->is_string());
EXPECT_EQ("https://cs.chromium.org/", page_url->GetString());
const base::Value* osdd_url = message_.FindKey(kOpenSearchOsddUrlKey);
ASSERT_TRUE(osdd_url);
ASSERT_TRUE(osdd_url->is_string());
EXPECT_EQ("https://cs.chromium.org/codesearch/first_opensearch.xml",
osdd_url->GetString());
}
// Tests that __gCrWeb.searchEngine.getOpenSearchDescriptionDocumentUrl returns
// undefined if no OSDD is found in page.
// Tests that if no OSDD <link> is found in page, __gCrWeb.searchEngine will
// not send a message about OSDD.
TEST_F(SearchEngineJsTest, TestGetOpenSearchDescriptionDocumentUrlFail) {
LoadHtmlAndInject(
@"<html><link href='/favicon.ico' rel='shortcut icon' "
@"type='image/x-icon'></html>",
GURL("https://cs.chromium.org"));
id result = ExecuteJavaScript(
@"__gCrWeb.searchEngine.getOpenSearchDescriptionDocumentUrl();");
EXPECT_FALSE(result);
ASSERT_FALSE(WaitUntilConditionOrTimeout(kWaitForJsNotReturnTimeout, ^{
base::RunLoop().RunUntilIdle();
return message_received_;
}));
}
// Tests that __gCrWeb.searchEngine generates and sends back a searchable
......@@ -130,7 +142,11 @@ TEST_F(SearchEngineJsTest,
base::RunLoop().RunUntilIdle();
return message_received_;
}));
const base::Value* url = message_.FindKey("url");
const base::Value* cmd = message_.FindKey("command");
ASSERT_TRUE(cmd);
ASSERT_TRUE(cmd->is_string());
EXPECT_EQ(kCommandSearchableUrl, cmd->GetString());
const base::Value* url = message_.FindKey(kSearchableUrlUrlKey);
ASSERT_TRUE(url);
ASSERT_TRUE(url->is_string());
EXPECT_EQ(
......
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