blob: 1679945cc1ef175a4d9d6d2ec4c9b6472979b2ed [file] [log] [blame]
// Copyright 2015 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 "chrome/browser/ui/search_engines/search_engine_tab_helper.h"
#include <utility>
#include "base/macros.h"
#include "base/run_loop.h"
#include "base/strings/stringprintf.h"
#include "chrome/browser/search_engines/template_url_service_factory.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/search_engines/template_url.h"
#include "components/search_engines/template_url_service.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "net/test/embedded_test_server/http_request.h"
#include "net/test/embedded_test_server/http_response.h"
using net::test_server::BasicHttpResponse;
using net::test_server::HttpRequest;
using net::test_server::HttpResponse;
namespace {
class TemplateURLServiceObserver {
public:
TemplateURLServiceObserver(TemplateURLService* service, base::RunLoop* loop)
: runner_(loop) {
DCHECK(loop);
template_url_sub_ = service->RegisterOnLoadedCallback(base::Bind(
&TemplateURLServiceObserver::StopLoop, base::Unretained(this)));
service->Load();
}
~TemplateURLServiceObserver() {}
private:
void StopLoop() { runner_->Quit(); }
base::RunLoop* runner_;
std::unique_ptr<TemplateURLService::Subscription> template_url_sub_;
DISALLOW_COPY_AND_ASSIGN(TemplateURLServiceObserver);
};
testing::AssertionResult VerifyTemplateURLServiceLoad(
TemplateURLService* service) {
if (service->loaded())
return testing::AssertionSuccess();
base::RunLoop runner;
TemplateURLServiceObserver observer(service, &runner);
runner.Run();
if (service->loaded())
return testing::AssertionSuccess();
return testing::AssertionFailure() << "TemplateURLService isn't loaded";
}
} // namespace
class SearchEngineTabHelperBrowserTest : public InProcessBrowserTest {
public:
SearchEngineTabHelperBrowserTest() {}
~SearchEngineTabHelperBrowserTest() override {}
private:
std::unique_ptr<HttpResponse> HandleRequest(const GURL& osdd_xml_url,
const HttpRequest& request) {
std::string html = base::StringPrintf(
"<html>"
"<head>"
" <link rel='search' type='application/opensearchdescription+xml'"
" href='%s'"
" title='ExampleSearch'>"
"</head>"
"</html>",
osdd_xml_url.spec().c_str());
std::unique_ptr<BasicHttpResponse> http_response(new BasicHttpResponse());
http_response->set_code(net::HTTP_OK);
http_response->set_content(html);
http_response->set_content_type("text/html");
return std::move(http_response);
}
// Starts a test server that serves a page pointing to a opensearch descriptor
// from a file:// url.
bool StartTestServer() {
GURL file_url = ui_test_utils::GetTestUrl(
base::FilePath(),
base::FilePath().AppendASCII("simple_open_search.xml"));
embedded_test_server()->RegisterRequestHandler(
base::Bind(&SearchEngineTabHelperBrowserTest::HandleRequest,
base::Unretained(this), file_url));
return embedded_test_server()->Start();
}
void SetUpOnMainThread() override { ASSERT_TRUE(StartTestServer()); }
DISALLOW_COPY_AND_ASSIGN(SearchEngineTabHelperBrowserTest);
};
IN_PROC_BROWSER_TEST_F(SearchEngineTabHelperBrowserTest,
IgnoreSearchDescriptionsFromFileURLs) {
TemplateURLService* url_service =
TemplateURLServiceFactory::GetForProfile(browser()->profile());
ASSERT_TRUE(url_service);
VerifyTemplateURLServiceLoad(url_service);
TemplateURLService::TemplateURLVector template_urls =
url_service->GetTemplateURLs();
// Navigate to a page with a search descriptor. Path doesn't matter as the
// test server always serves the same HTML.
GURL url(embedded_test_server()->GetURL("/"));
ui_test_utils::NavigateToURL(browser(), url);
// No new search engines should be added.
EXPECT_EQ(template_urls, url_service->GetTemplateURLs());
}