11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/bind.h" 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/run_loop.h" 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/extension_service.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/webstore_installer_test.h" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/webstore_reinstaller.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/ui/browser.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/ui/tabs/tab_strip_model.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/common/extensions/webstore_install_result.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/extension_registry.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/extension.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/extension_builder.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/value_builder.h" 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace extensions { 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace { 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kWebstoreDomain[] = "cws.com"; 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kAppDomain[] = "app.com"; 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kNonAppDomain[] = "nonapp.com"; 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kTestExtensionId[] = "ecglahbcnmdpdciemllbhojghbkagdje"; 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kTestDataPath[] = "extensions/api_test/webstore_inline_install"; 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kCrxFilename[] = "extension.crx"; 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass WebstoreReinstallerBrowserTest : public WebstoreInstallerTest { 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WebstoreReinstallerBrowserTest() 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : WebstoreInstallerTest( 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kWebstoreDomain, 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kTestDataPath, 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kCrxFilename, 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kAppDomain, 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kNonAppDomain) {} 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~WebstoreReinstallerBrowserTest() {} 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void OnInstallCompletion(const base::Closure& quit_closure, 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool success, 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& error, 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci webstore_install::Result result); 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool last_install_result() const { return last_install_result_; } 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool last_install_result_; 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid WebstoreReinstallerBrowserTest::OnInstallCompletion( 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::Closure& quit_closure, 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool success, 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& error, 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci webstore_install::Result result) { 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci last_install_result_ = success; 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci quit_closure.Run(); 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_F(WebstoreReinstallerBrowserTest, TestWebstoreReinstall) { 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Build an extension with the same id as our test extension and add it. 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string kExtensionName("ReinstallerExtension"); 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<const Extension> extension = 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ExtensionBuilder().SetLocation(Manifest::INTERNAL) 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .SetID(kTestExtensionId) 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .SetManifest( 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DictionaryBuilder().Set("name", kExtensionName) 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .Set("description", "Foo") 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .Set("manifest_version", 2) 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .Set("version", "1.0") 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .Build()) 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .Build(); 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extension_service()->AddExtension(extension.get()); 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ExtensionRegistry* registry = ExtensionRegistry::Get(profile()); 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(registry->enabled_extensions().GetByID(kTestExtensionId)); 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::WebContents* active_web_contents = 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci browser()->tab_strip_model()->GetActiveWebContents(); 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(active_web_contents); 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Start by canceling the repair prompt. 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AutoCancelInstall(); 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Create and run a WebstoreReinstaller. 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::RunLoop run_loop; 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<WebstoreReinstaller> reinstaller( 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new WebstoreReinstaller( 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci active_web_contents, 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kTestExtensionId, 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&WebstoreReinstallerBrowserTest::OnInstallCompletion, 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Unretained(this), 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop.QuitClosure()))); 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reinstaller->BeginReinstall(); 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop.Run(); 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // We should have failed, and the old extension should still be present. 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(last_install_result()); 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extension = registry->enabled_extensions().GetByID(kTestExtensionId); 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(extension.get()); 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kExtensionName, extension->name()); 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Now accept the repair prompt. 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AutoAcceptInstall(); 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::RunLoop run_loop2; 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reinstaller = 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new WebstoreReinstaller( 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci active_web_contents, 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kTestExtensionId, 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&WebstoreReinstallerBrowserTest::OnInstallCompletion, 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Unretained(this), 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop2.QuitClosure())); 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reinstaller->BeginReinstall(); 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop2.Run(); 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The reinstall should have succeeded, and the extension should have been 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // "updated" (which in this case means that it should have been replaced with 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // the inline install test extension, since that's the id we used). 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(last_install_result()); 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extension = registry->enabled_extensions().GetByID(kTestExtensionId); 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(extension.get()); 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The name should not match, since the extension changed. 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_NE(kExtensionName, extension->name()); 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace extensions 128