summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions/webstore_installer_test.cc
diff options
context:
space:
mode:
authorrockot@chromium.org <rockot@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-11 20:12:01 +0000
committerrockot@chromium.org <rockot@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-11 20:12:01 +0000
commitb70a67cfe59ba40efd3feec9e9afe43f0bb2a401 (patch)
treecbe234593ddabca3286035a349f3d8dc7436798b /chrome/browser/extensions/webstore_installer_test.cc
parent3989b0303e38a1bd8cb6b056671e6dc0c1e55632 (diff)
downloadchromium_src-b70a67cfe59ba40efd3feec9e9afe43f0bb2a401.zip
chromium_src-b70a67cfe59ba40efd3feec9e9afe43f0bb2a401.tar.gz
chromium_src-b70a67cfe59ba40efd3feec9e9afe43f0bb2a401.tar.bz2
Fix WebstoreInlineInstaller ASAN bugs
Certain code paths which called back onto a raw pointer to a WebstoreInlineInstaller could not guarantee the object's existence at callback time. Additional ref counts have been added to ensure that this is no longer the case. BUG=236513,241431,241432,247774,263004 Review URL: https://codereview.chromium.org/24839002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@228239 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/extensions/webstore_installer_test.cc')
-rw-r--r--chrome/browser/extensions/webstore_installer_test.cc127
1 files changed, 127 insertions, 0 deletions
diff --git a/chrome/browser/extensions/webstore_installer_test.cc b/chrome/browser/extensions/webstore_installer_test.cc
new file mode 100644
index 0000000..26d3549
--- /dev/null
+++ b/chrome/browser/extensions/webstore_installer_test.cc
@@ -0,0 +1,127 @@
+// Copyright 2013 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/command_line.h"
+#include "base/strings/stringprintf.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/extensions/extension_install_prompt.h"
+#include "chrome/browser/extensions/tab_helper.h"
+#include "chrome/browser/extensions/webstore_inline_installer.h"
+#include "chrome/browser/extensions/webstore_inline_installer_factory.h"
+#include "chrome/browser/extensions/webstore_installer_test.h"
+#include "chrome/browser/extensions/webstore_standalone_installer.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/common/chrome_switches.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/test_switches.h"
+#include "chrome/test/base/ui_test_utils.h"
+#include "content/public/browser/notification_registrar.h"
+#include "content/public/browser/notification_service.h"
+#include "content/public/browser/notification_types.h"
+#include "content/public/browser/render_view_host.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test_utils.h"
+#include "net/base/host_port_pair.h"
+#include "net/dns/mock_host_resolver.h"
+#include "url/gurl.h"
+
+using content::WebContents;
+using extensions::Extension;
+using extensions::TabHelper;
+using extensions::WebstoreInlineInstaller;
+using extensions::WebstoreInlineInstallerFactory;
+using extensions::WebstoreStandaloneInstaller;
+
+WebstoreInstallerTest::WebstoreInstallerTest(
+ const std::string& webstore_domain,
+ const std::string& test_data_path,
+ const std::string& crx_filename,
+ const std::string& verified_domain,
+ const std::string& unverified_domain)
+ : webstore_domain_(webstore_domain),
+ test_data_path_(test_data_path),
+ crx_filename_(crx_filename),
+ verified_domain_(verified_domain),
+ unverified_domain_(unverified_domain) {
+}
+
+WebstoreInstallerTest::~WebstoreInstallerTest() {}
+
+void WebstoreInstallerTest::SetUpCommandLine(CommandLine* command_line) {
+ // We start the test server now instead of in
+ // SetUpInProcessBrowserTestFixture so that we can get its port number.
+ ASSERT_TRUE(test_server()->Start());
+
+ net::HostPortPair host_port = test_server()->host_port_pair();
+ test_gallery_url_ = base::StringPrintf(
+ "http://%s:%d/files/%s",
+ webstore_domain_.c_str(), host_port.port(), test_data_path_.c_str());
+ command_line->AppendSwitchASCII(
+ switches::kAppsGalleryURL, test_gallery_url_);
+
+ GURL crx_url = GenerateTestServerUrl(webstore_domain_, crx_filename_);
+ CommandLine::ForCurrentProcess()->AppendSwitchASCII(
+ switches::kAppsGalleryUpdateURL, crx_url.spec());
+
+ // Allow tests to call window.gc(), so that we can check that callback
+ // functions don't get collected prematurely.
+ command_line->AppendSwitchASCII(switches::kJavaScriptFlags, "--expose-gc");
+}
+
+void WebstoreInstallerTest::SetUpInProcessBrowserTestFixture() {
+ host_resolver()->AddRule(webstore_domain_, "127.0.0.1");
+ host_resolver()->AddRule(verified_domain_, "127.0.0.1");
+ host_resolver()->AddRule(unverified_domain_, "127.0.0.1");
+}
+
+GURL WebstoreInstallerTest::GenerateTestServerUrl(
+ const std::string& domain,
+ const std::string& page_filename) {
+ GURL page_url = test_server()->GetURL(
+ base::StringPrintf("files/%s/%s",
+ test_data_path_.c_str(),
+ page_filename.c_str()));
+
+ GURL::Replacements replace_host;
+ replace_host.SetHostStr(domain);
+ return page_url.ReplaceComponents(replace_host);
+}
+
+void WebstoreInstallerTest::RunTest(const std::string& test_function_name) {
+ bool result = false;
+ std::string script = base::StringPrintf(
+ "%s('%s')", test_function_name.c_str(),
+ test_gallery_url_.c_str());
+ ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
+ browser()->tab_strip_model()->GetActiveWebContents(),
+ script,
+ &result));
+ EXPECT_TRUE(result);
+}
+
+bool WebstoreInstallerTest::RunIndexedTest(
+ const std::string& test_function_name,
+ int i) {
+ std::string result = "FAILED";
+ std::string script = base::StringPrintf("%s('%s', %d)",
+ test_function_name.c_str(), test_gallery_url_.c_str(), i);
+ EXPECT_TRUE(content::ExecuteScriptAndExtractString(
+ browser()->tab_strip_model()->GetActiveWebContents(),
+ script,
+ &result));
+ EXPECT_TRUE(result != "FAILED");
+ return result == "KEEPGOING";
+}
+
+void WebstoreInstallerTest::RunTestAsync(
+ const std::string& test_function_name) {
+ std::string script = base::StringPrintf(
+ "%s('%s')", test_function_name.c_str(), test_gallery_url_.c_str());
+ browser()->tab_strip_model()->GetActiveWebContents()->GetRenderViewHost()->
+ ExecuteJavascriptInWebFrame(
+ UTF8ToUTF16(std::string()),
+ UTF8ToUTF16(script));
+}