[Extensions] Un-refcount ExtensionInstallPrompt::Prompt

There's no reason ExtensionInstallPrompt::Prompt needs to be refcounted, other
than that we were sloppy with passing it around. Un-refcount it and properly
pass ownership.

BUG=567845
[email protected] (mechanical ui/views/extensions changes)

Review URL: https://codereview.chromium.org/1513553002

Cr-Commit-Position: refs/heads/master@{#365342}
diff --git a/chrome/browser/extensions/api/dashboard_private/dashboard_private_api.cc b/chrome/browser/extensions/api/dashboard_private/dashboard_private_api.cc
index 27d7938..0de44d6 100644
--- a/chrome/browser/extensions/api/dashboard_private/dashboard_private_api.cc
+++ b/chrome/browser/extensions/api/dashboard_private/dashboard_private_api.cc
@@ -138,14 +138,14 @@
     Release();
     return;
   }
-  scoped_refptr<ExtensionInstallPrompt::Prompt> prompt(
+  scoped_ptr<ExtensionInstallPrompt::Prompt> prompt(
       new ExtensionInstallPrompt::Prompt(
           ExtensionInstallPrompt::DELEGATED_PERMISSIONS_PROMPT));
   prompt->set_delegated_username(details().delegated_user);
 
   install_prompt_.reset(new ExtensionInstallPrompt(web_contents));
   install_prompt_->ShowDialog(
-      this, dummy_extension_.get(), &icon, prompt,
+      this, dummy_extension_.get(), &icon, prompt.Pass(),
       ExtensionInstallPrompt::GetDefaultShowDialogCallback());
   // Control flow finishes up in InstallUIProceed or InstallUIAbort.
 }
diff --git a/chrome/browser/extensions/api/developer_private/show_permissions_dialog_helper.cc b/chrome/browser/extensions/api/developer_private/show_permissions_dialog_helper.cc
index e35de04..c38ee810 100644
--- a/chrome/browser/extensions/api/developer_private/show_permissions_dialog_helper.cc
+++ b/chrome/browser/extensions/api/developer_private/show_permissions_dialog_helper.cc
@@ -76,12 +76,12 @@
         DevicePermissionsManager::Get(profile_)
             ->GetPermissionMessageStrings(extension_id_);
   }
-  scoped_refptr<ExtensionInstallPrompt::Prompt> prompt(
+  scoped_ptr<ExtensionInstallPrompt::Prompt> prompt(
       new ExtensionInstallPrompt::Prompt(
           ExtensionInstallPrompt::POST_INSTALL_PERMISSIONS_PROMPT));
   prompt->set_retained_files(retained_file_paths);
   prompt->set_retained_device_messages(retained_device_messages);
-  prompt_->ShowDialog(this, extension, nullptr, prompt,
+  prompt_->ShowDialog(this, extension, nullptr, prompt.Pass(),
                       ExtensionInstallPrompt::GetDefaultShowDialogCallback());
 }
 
diff --git a/chrome/browser/extensions/api/inline_install_private/inline_install_private_api.cc b/chrome/browser/extensions/api/inline_install_private/inline_install_private_api.cc
index 566e6c7..d632a600 100644
--- a/chrome/browser/extensions/api/inline_install_private/inline_install_private_api.cc
+++ b/chrome/browser/extensions/api/inline_install_private/inline_install_private_api.cc
@@ -32,8 +32,8 @@
   // webstore.
   const GURL& GetRequestorURL() const override { return requestor_url_; }
 
-  scoped_refptr<ExtensionInstallPrompt::Prompt> CreateInstallPrompt() const
-      override;
+  scoped_ptr<ExtensionInstallPrompt::Prompt> CreateInstallPrompt()
+      const override;
 
   void OnManifestParsed() override;
 
@@ -52,16 +52,16 @@
 Installer::~Installer() {
 }
 
-scoped_refptr<ExtensionInstallPrompt::Prompt>
-Installer::CreateInstallPrompt() const {
-  scoped_refptr<ExtensionInstallPrompt::Prompt> prompt(
+scoped_ptr<ExtensionInstallPrompt::Prompt> Installer::CreateInstallPrompt()
+    const {
+  scoped_ptr<ExtensionInstallPrompt::Prompt> prompt(
       new ExtensionInstallPrompt::Prompt(
           ExtensionInstallPrompt::INLINE_INSTALL_PROMPT));
   prompt->SetWebstoreData(localized_user_count(),
                           show_user_count(),
                           average_rating(),
                           rating_count());
-  return prompt;
+  return prompt.Pass();
 }
 
 
diff --git a/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc b/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc
index 2a87d99..4f88b6b79 100644
--- a/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc
+++ b/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc
@@ -53,7 +53,8 @@
         ExtensionInstallPrompt::GetReEnablePromptTypeForExtension(
             function->browser_context(), extension);
     install_prompt_->ShowDialog(
-        this, extension, nullptr, new ExtensionInstallPrompt::Prompt(type),
+        this, extension, nullptr,
+        make_scoped_ptr(new ExtensionInstallPrompt::Prompt(type)),
         ExtensionInstallPrompt::GetDefaultShowDialogCallback());
   }
   ~ManagementSetEnabledFunctionInstallPromptDelegate() override {}
diff --git a/chrome/browser/extensions/api/permissions/permissions_api.cc b/chrome/browser/extensions/api/permissions/permissions_api.cc
index 196a0056..82f7aac 100644
--- a/chrome/browser/extensions/api/permissions/permissions_api.cc
+++ b/chrome/browser/extensions/api/permissions/permissions_api.cc
@@ -250,8 +250,8 @@
     install_ui_.reset(new ExtensionInstallPrompt(GetAssociatedWebContents()));
     install_ui_->ShowDialog(
         this, extension(), nullptr,
-        new ExtensionInstallPrompt::Prompt(
-            ExtensionInstallPrompt::PERMISSIONS_PROMPT),
+        make_scoped_ptr(new ExtensionInstallPrompt::Prompt(
+            ExtensionInstallPrompt::PERMISSIONS_PROMPT)),
         requested_permissions_->Clone(),
         ExtensionInstallPrompt::GetDefaultShowDialogCallback());
   }
diff --git a/chrome/browser/extensions/api/webstore_widget_private/app_installer.cc b/chrome/browser/extensions/api/webstore_widget_private/app_installer.cc
index fbdb041..be0f9d9 100644
--- a/chrome/browser/extensions/api/webstore_widget_private/app_installer.cc
+++ b/chrome/browser/extensions/api/webstore_widget_private/app_installer.cc
@@ -55,18 +55,18 @@
   return GURL::EmptyGURL();
 }
 
-scoped_refptr<ExtensionInstallPrompt::Prompt>
-AppInstaller::CreateInstallPrompt() const {
+scoped_ptr<ExtensionInstallPrompt::Prompt> AppInstaller::CreateInstallPrompt()
+    const {
   if (silent_installation_)
-    return NULL;
+    return nullptr;
 
-  scoped_refptr<ExtensionInstallPrompt::Prompt> prompt(
+  scoped_ptr<ExtensionInstallPrompt::Prompt> prompt(
       new ExtensionInstallPrompt::Prompt(
           ExtensionInstallPrompt::INLINE_INSTALL_PROMPT));
 
   prompt->SetWebstoreData(localized_user_count(), show_user_count(),
                           average_rating(), rating_count());
-  return prompt;
+  return prompt.Pass();
 }
 
 bool AppInstaller::ShouldShowPostInstallUI() const {
diff --git a/chrome/browser/extensions/api/webstore_widget_private/app_installer.h b/chrome/browser/extensions/api/webstore_widget_private/app_installer.h
index 805cbaa..854b95b9 100644
--- a/chrome/browser/extensions/api/webstore_widget_private/app_installer.h
+++ b/chrome/browser/extensions/api/webstore_widget_private/app_installer.h
@@ -40,7 +40,7 @@
   bool ShouldShowPostInstallUI() const override;
   bool ShouldShowAppInstalledBubble() const override;
   content::WebContents* GetWebContents() const override;
-  scoped_refptr<ExtensionInstallPrompt::Prompt> CreateInstallPrompt()
+  scoped_ptr<ExtensionInstallPrompt::Prompt> CreateInstallPrompt()
       const override;
   bool CheckInlineInstallPermitted(const base::DictionaryValue& webstore_data,
                                    std::string* error) const override;
diff --git a/chrome/browser/extensions/bundle_installer.cc b/chrome/browser/extensions/bundle_installer.cc
index 0be9cb9..30e489d9 100644
--- a/chrome/browser/extensions/bundle_installer.cc
+++ b/chrome/browser/extensions/bundle_installer.cc
@@ -287,18 +287,18 @@
     if (browser)
       web_contents = browser->tab_strip_model()->GetActiveWebContents();
     install_ui_.reset(new ExtensionInstallPrompt(web_contents));
-    scoped_refptr<ExtensionInstallPrompt::Prompt> prompt;
+    scoped_ptr<ExtensionInstallPrompt::Prompt> prompt;
     if (delegated_username_.empty()) {
-      prompt = new ExtensionInstallPrompt::Prompt(
-          ExtensionInstallPrompt::BUNDLE_INSTALL_PROMPT);
+      prompt.reset(new ExtensionInstallPrompt::Prompt(
+          ExtensionInstallPrompt::BUNDLE_INSTALL_PROMPT));
     } else {
-      prompt = new ExtensionInstallPrompt::Prompt(
-          ExtensionInstallPrompt::DELEGATED_BUNDLE_PERMISSIONS_PROMPT);
+      prompt.reset(new ExtensionInstallPrompt::Prompt(
+          ExtensionInstallPrompt::DELEGATED_BUNDLE_PERMISSIONS_PROMPT));
       prompt->set_delegated_username(delegated_username_);
     }
     prompt->set_bundle(this);
     install_ui_->ShowDialog(
-        this, nullptr, &icon_, prompt, permissions.Pass(),
+        this, nullptr, &icon_, prompt.Pass(), permissions.Pass(),
         ExtensionInstallPrompt::GetDefaultShowDialogCallback());
   }
 }
diff --git a/chrome/browser/extensions/crx_installer.cc b/chrome/browser/extensions/crx_installer.cc
index 4d31cbf7..83d6620 100644
--- a/chrome/browser/extensions/crx_installer.cc
+++ b/chrome/browser/extensions/crx_installer.cc
@@ -913,9 +913,10 @@
     ExtensionInstallPrompt::PromptType type =
         ExtensionInstallPrompt::GetReEnablePromptTypeForExtension(
             service->profile(), extension());
-    client_->ShowDialog(this, extension(), nullptr,
-                        new ExtensionInstallPrompt::Prompt(type),
-                        ExtensionInstallPrompt::GetDefaultShowDialogCallback());
+    client_->ShowDialog(
+        this, extension(), nullptr,
+        make_scoped_ptr(new ExtensionInstallPrompt::Prompt(type)),
+        ExtensionInstallPrompt::GetDefaultShowDialogCallback());
   }
 }
 
diff --git a/chrome/browser/extensions/extension_disabled_ui.cc b/chrome/browser/extensions/extension_disabled_ui.cc
index cbeae7b..54a13321 100644
--- a/chrome/browser/extensions/extension_disabled_ui.cc
+++ b/chrome/browser/extensions/extension_disabled_ui.cc
@@ -127,7 +127,8 @@
       ExtensionInstallPrompt::GetReEnablePromptTypeForExtension(
           service_->profile(), extension);
   install_ui_->ShowDialog(
-      this, extension_, nullptr, new ExtensionInstallPrompt::Prompt(type),
+      this, extension_, nullptr,
+      make_scoped_ptr(new ExtensionInstallPrompt::Prompt(type)),
       ExtensionInstallPrompt::GetDefaultShowDialogCallback());
 }
 
diff --git a/chrome/browser/extensions/extension_install_prompt.cc b/chrome/browser/extensions/extension_install_prompt.cc
index 95e8aef4..6567b07 100644
--- a/chrome/browser/extensions/extension_install_prompt.cc
+++ b/chrome/browser/extensions/extension_install_prompt.cc
@@ -644,7 +644,17 @@
     const Extension* extension,
     const SkBitmap* icon,
     const ShowDialogCallback& show_dialog_callback) {
-  ShowDialog(delegate, extension, icon, new Prompt(INSTALL_PROMPT),
+  ShowDialog(delegate, extension, icon,
+             make_scoped_ptr(new Prompt(INSTALL_PROMPT)), show_dialog_callback);
+}
+
+void ExtensionInstallPrompt::ShowDialog(
+    Delegate* delegate,
+    const Extension* extension,
+    const SkBitmap* icon,
+    scoped_ptr<Prompt> prompt,
+    const ShowDialogCallback& show_dialog_callback) {
+  ShowDialog(delegate, extension, icon, prompt.Pass(), nullptr,
              show_dialog_callback);
 }
 
@@ -652,23 +662,15 @@
     Delegate* delegate,
     const Extension* extension,
     const SkBitmap* icon,
-    const scoped_refptr<Prompt>& prompt,
-    const ShowDialogCallback& show_dialog_callback) {
-  ShowDialog(delegate, extension, icon, prompt, nullptr, show_dialog_callback);
-}
-
-void ExtensionInstallPrompt::ShowDialog(
-    Delegate* delegate,
-    const Extension* extension,
-    const SkBitmap* icon,
-    const scoped_refptr<Prompt>& prompt,
+    scoped_ptr<Prompt> prompt,
     scoped_ptr<const PermissionSet> custom_permissions,
     const ShowDialogCallback& show_dialog_callback) {
   DCHECK(ui_loop_ == base::MessageLoop::current());
+  DCHECK(prompt);
   extension_ = extension;
   delegate_ = delegate;
   SetIcon(icon);
-  prompt_ = prompt;
+  prompt_ = prompt.Pass();
   custom_permissions_ = custom_permissions.Pass();
   show_dialog_callback_ = show_dialog_callback;
 
@@ -836,7 +838,8 @@
   }
 
   if (show_dialog_callback_.is_null())
-    GetDefaultShowDialogCallback().Run(show_params_.get(), delegate_, prompt_);
+    GetDefaultShowDialogCallback().Run(show_params_.get(), delegate_,
+                                       prompt_.Pass());
   else
-    show_dialog_callback_.Run(show_params_.get(), delegate_, prompt_);
+    show_dialog_callback_.Run(show_params_.get(), delegate_, prompt_.Pass());
 }
diff --git a/chrome/browser/extensions/extension_install_prompt.h b/chrome/browser/extensions/extension_install_prompt.h
index 52eb01b..75c8488 100644
--- a/chrome/browser/extensions/extension_install_prompt.h
+++ b/chrome/browser/extensions/extension_install_prompt.h
@@ -98,11 +98,10 @@
   // prompt. Gets populated with raw data and exposes getters for formatted
   // strings so that the GTK/views/Cocoa install dialogs don't have to repeat
   // that logic.
-  // Ref-counted because we pass around the prompt independent of the full
-  // ExtensionInstallPrompt.
-  class Prompt : public base::RefCountedThreadSafe<Prompt> {
+  class Prompt {
    public:
     explicit Prompt(PromptType type);
+    ~Prompt();
 
     void SetPermissions(const extensions::PermissionMessages& permissions,
                         PermissionsType permissions_type);
@@ -202,8 +201,6 @@
       std::vector<bool> is_showing_details;
     };
 
-    virtual ~Prompt();
-
     bool ShouldDisplayRevokeButton() const;
 
     // Returns the InstallPromptPermissions corresponding to
@@ -275,7 +272,7 @@
 
   typedef base::Callback<void(ExtensionInstallPromptShowParams*,
                               ExtensionInstallPrompt::Delegate*,
-                              scoped_refptr<ExtensionInstallPrompt::Prompt>)>
+                              scoped_ptr<ExtensionInstallPrompt::Prompt>)>
       ShowDialogCallback;
 
   // Callback to show the default extension install dialog.
@@ -332,13 +329,13 @@
   virtual void ShowDialog(Delegate* delegate,
                           const extensions::Extension* extension,
                           const SkBitmap* icon,
-                          const scoped_refptr<Prompt>& prompt,
+                          scoped_ptr<Prompt> prompt,
                           const ShowDialogCallback& show_dialog_callback);
   virtual void ShowDialog(
       Delegate* delegate,
       const extensions::Extension* extension,
       const SkBitmap* icon,
-      const scoped_refptr<Prompt>& prompt,
+      scoped_ptr<Prompt> prompt,
       scoped_ptr<const extensions::PermissionSet> custom_permissions,
       const ShowDialogCallback& show_dialog_callback);
 
@@ -396,7 +393,7 @@
   Delegate* delegate_;
 
   // A pre-filled prompt.
-  scoped_refptr<Prompt> prompt_;
+  scoped_ptr<Prompt> prompt_;
 
   // Used to show the confirm dialog.
   ShowDialogCallback show_dialog_callback_;
diff --git a/chrome/browser/extensions/extension_install_prompt_browsertest.cc b/chrome/browser/extensions/extension_install_prompt_browsertest.cc
index 57a3e2d5..da055ca 100644
--- a/chrome/browser/extensions/extension_install_prompt_browsertest.cc
+++ b/chrome/browser/extensions/extension_install_prompt_browsertest.cc
@@ -27,10 +27,9 @@
 
 // ExtensionInstallPrompt::ShowDialogCallback which proceeds without showing the
 // prompt.
-void TestShowDialogCallback(
-    ExtensionInstallPromptShowParams* params,
-    ExtensionInstallPrompt::Delegate* delegate,
-    scoped_refptr<ExtensionInstallPrompt::Prompt> prompt) {
+void TestShowDialogCallback(ExtensionInstallPromptShowParams* params,
+                            ExtensionInstallPrompt::Delegate* delegate,
+                            scoped_ptr<ExtensionInstallPrompt::Prompt> prompt) {
   delegate->InstallUIProceed();
 }
 
diff --git a/chrome/browser/extensions/extension_install_prompt_unittest.cc b/chrome/browser/extensions/extension_install_prompt_unittest.cc
index 1fd740e..6911666f 100644
--- a/chrome/browser/extensions/extension_install_prompt_unittest.cc
+++ b/chrome/browser/extensions/extension_install_prompt_unittest.cc
@@ -33,7 +33,7 @@
     size_t withheld_permissions_count,
     ExtensionInstallPromptShowParams* params,
     ExtensionInstallPrompt::Delegate* delegate,
-    scoped_refptr<ExtensionInstallPrompt::Prompt> install_prompt) {
+    scoped_ptr<ExtensionInstallPrompt::Prompt> install_prompt) {
   ASSERT_TRUE(install_prompt.get());
   EXPECT_EQ(regular_permissions_count,
             install_prompt->GetPermissionCount(
@@ -86,8 +86,9 @@
   base::RunLoop run_loop;
   prompt.ShowDialog(
       nullptr,  // no delegate
-      extension.get(), nullptr, new ExtensionInstallPrompt::Prompt(
-                                    ExtensionInstallPrompt::PERMISSIONS_PROMPT),
+      extension.get(), nullptr,
+      make_scoped_ptr(new ExtensionInstallPrompt::Prompt(
+          ExtensionInstallPrompt::PERMISSIONS_PROMPT)),
       permission_set.Pass(),
       base::Bind(&VerifyPromptPermissionsCallback, run_loop.QuitClosure(),
                  1u,    // |regular_permissions_count|.
@@ -147,13 +148,13 @@
   ExtensionInstallPrompt prompt(factory.CreateWebContents(profile()));
   base::RunLoop run_loop;
 
-  scoped_refptr<ExtensionInstallPrompt::Prompt> sub_prompt(
+  scoped_ptr<ExtensionInstallPrompt::Prompt> sub_prompt(
       new ExtensionInstallPrompt::Prompt(
           ExtensionInstallPrompt::DELEGATED_PERMISSIONS_PROMPT));
   sub_prompt->set_delegated_username("Username");
   prompt.ShowDialog(
       nullptr,  // no delegate
-      extension.get(), nullptr, sub_prompt,
+      extension.get(), nullptr, sub_prompt.Pass(),
       base::Bind(&VerifyPromptPermissionsCallback, run_loop.QuitClosure(),
                  2u,    // |regular_permissions_count|.
                  0u));  // |withheld_permissions_count|.
diff --git a/chrome/browser/extensions/extension_reenabler.cc b/chrome/browser/extensions/extension_reenabler.cc
index 5744b26..c957505a 100644
--- a/chrome/browser/extensions/extension_reenabler.cc
+++ b/chrome/browser/extensions/extension_reenabler.cc
@@ -89,9 +89,10 @@
     ExtensionInstallPrompt::PromptType type =
         ExtensionInstallPrompt::GetReEnablePromptTypeForExtension(
             browser_context, extension.get());
-    install_prompt_->ShowDialog(this, extension.get(), nullptr,
-                                new ExtensionInstallPrompt::Prompt(type),
-                                show_dialog_callback_);
+    install_prompt_->ShowDialog(
+        this, extension.get(), nullptr,
+        make_scoped_ptr(new ExtensionInstallPrompt::Prompt(type)),
+        show_dialog_callback_);
   }
 }
 
@@ -150,9 +151,10 @@
     ExtensionInstallPrompt::PromptType type =
         ExtensionInstallPrompt::GetReEnablePromptTypeForExtension(
             browser_context_, extension_.get());
-    install_prompt_->ShowDialog(this, extension_.get(), nullptr,
-                                new ExtensionInstallPrompt::Prompt(type),
-                                show_dialog_callback_);
+    install_prompt_->ShowDialog(
+        this, extension_.get(), nullptr,
+        make_scoped_ptr(new ExtensionInstallPrompt::Prompt(type)),
+        show_dialog_callback_);
   }
 }
 
diff --git a/chrome/browser/extensions/extension_reenabler_unittest.cc b/chrome/browser/extensions/extension_reenabler_unittest.cc
index 24b074d..43d05b66 100644
--- a/chrome/browser/extensions/extension_reenabler_unittest.cc
+++ b/chrome/browser/extensions/extension_reenabler_unittest.cc
@@ -80,7 +80,7 @@
   // The callback to run when a test ExtensionInstallPrompt is ready to show.
   void OnShow(ExtensionInstallPromptShowParams* show_params,
               ExtensionInstallPrompt::Delegate* delegate,
-              scoped_refptr<ExtensionInstallPrompt::Prompt> prompt) {
+              scoped_ptr<ExtensionInstallPrompt::Prompt> prompt) {
     DCHECK(!quit_closure_.is_null());
     quit_closure_.Run();
     quit_closure_ = base::Closure();
diff --git a/chrome/browser/extensions/external_install_error.cc b/chrome/browser/extensions/external_install_error.cc
index 912edda3..8b42cb1 100644
--- a/chrome/browser/extensions/external_install_error.cc
+++ b/chrome/browser/extensions/external_install_error.cc
@@ -75,8 +75,8 @@
 // A global error that spawns a bubble when the menu item is clicked.
 class ExternalInstallBubbleAlert : public GlobalErrorWithStandardBubble {
  public:
-  explicit ExternalInstallBubbleAlert(ExternalInstallError* error,
-                                      ExtensionInstallPrompt::Prompt* prompt);
+  ExternalInstallBubbleAlert(ExternalInstallError* error,
+                             ExtensionInstallPrompt::Prompt* prompt);
   ~ExternalInstallBubbleAlert() override;
 
  private:
@@ -101,6 +101,7 @@
   ExternalInstallError* error_;
 
   // The Prompt with all information, which we then use to populate the bubble.
+  // Owned by |error|.
   ExtensionInstallPrompt::Prompt* prompt_;
 
   DISALLOW_COPY_AND_ASSIGN(ExternalInstallBubbleAlert);
@@ -280,8 +281,8 @@
       error_service_(GlobalErrorServiceFactory::GetForProfile(
           Profile::FromBrowserContext(browser_context_))),
       weak_factory_(this) {
-  prompt_ = new ExtensionInstallPrompt::Prompt(
-      ExtensionInstallPrompt::EXTERNAL_INSTALL_PROMPT);
+  prompt_.reset(new ExtensionInstallPrompt::Prompt(
+      ExtensionInstallPrompt::EXTERNAL_INSTALL_PROMPT));
 
   webstore_data_fetcher_.reset(new WebstoreDataFetcher(
       this, browser_context_->GetRequestContext(), GURL(), extension_id_));
@@ -332,7 +333,7 @@
   install_ui_show_params_.reset(
       new ExtensionInstallPromptShowParams(web_contents));
   ExtensionInstallPrompt::GetDefaultShowDialogCallback().Run(
-      install_ui_show_params_.get(), this, prompt_);
+      install_ui_show_params_.get(), this, prompt_.Pass());
 }
 
 const Extension* ExternalInstallError::GetExtension() const {
@@ -381,7 +382,7 @@
 
   install_ui_->ShowDialog(this, GetExtension(),
                           nullptr,  // Force a fetch of the icon.
-                          prompt_,
+                          prompt_.Pass(),
                           base::Bind(&ExternalInstallError::OnDialogReady,
                                      weak_factory_.GetWeakPtr()));
 }
@@ -389,9 +390,9 @@
 void ExternalInstallError::OnDialogReady(
     ExtensionInstallPromptShowParams* show_params,
     ExtensionInstallPrompt::Delegate* prompt_delegate,
-    scoped_refptr<ExtensionInstallPrompt::Prompt> prompt) {
+    scoped_ptr<ExtensionInstallPrompt::Prompt> prompt) {
   DCHECK_EQ(this, prompt_delegate);
-  prompt_ = prompt;
+  prompt_ = prompt.Pass();
 
   if (alert_type_ == BUBBLE_ALERT) {
     global_error_.reset(new ExternalInstallBubbleAlert(this, prompt_.get()));
diff --git a/chrome/browser/extensions/external_install_error.h b/chrome/browser/extensions/external_install_error.h
index c26aa73..ccad2d3d 100644
--- a/chrome/browser/extensions/external_install_error.h
+++ b/chrome/browser/extensions/external_install_error.h
@@ -79,7 +79,7 @@
   // shown.
   void OnDialogReady(ExtensionInstallPromptShowParams* show_params,
                      ExtensionInstallPrompt::Delegate* prompt_delegate,
-                     scoped_refptr<ExtensionInstallPrompt::Prompt> prompt);
+                     scoped_ptr<ExtensionInstallPrompt::Prompt> prompt);
 
   // The associated BrowserContext.
   content::BrowserContext* browser_context_;
@@ -99,7 +99,7 @@
   // The UI for showing the error.
   scoped_ptr<ExtensionInstallPrompt> install_ui_;
   scoped_ptr<ExtensionInstallPromptShowParams> install_ui_show_params_;
-  scoped_refptr<ExtensionInstallPrompt::Prompt> prompt_;
+  scoped_ptr<ExtensionInstallPrompt::Prompt> prompt_;
 
   // The UI for the given error, which will take the form of either a menu
   // alert or a bubble alert (depending on the |alert_type_|.
diff --git a/chrome/browser/extensions/navigation_observer.cc b/chrome/browser/extensions/navigation_observer.cc
index 2682ac4..a7755836 100644
--- a/chrome/browser/extensions/navigation_observer.cc
+++ b/chrome/browser/extensions/navigation_observer.cc
@@ -82,7 +82,8 @@
         ExtensionInstallPrompt::GetReEnablePromptTypeForExtension(profile_,
                                                                   extension);
     extension_install_prompt_->ShowDialog(
-        this, extension, nullptr, new ExtensionInstallPrompt::Prompt(type),
+        this, extension, nullptr,
+        make_scoped_ptr(new ExtensionInstallPrompt::Prompt(type)),
         ExtensionInstallPrompt::GetDefaultShowDialogCallback());
   }
 }
diff --git a/chrome/browser/extensions/webstore_inline_installer.cc b/chrome/browser/extensions/webstore_inline_installer.cc
index e0eaf43..b78d53a 100644
--- a/chrome/browser/extensions/webstore_inline_installer.cc
+++ b/chrome/browser/extensions/webstore_inline_installer.cc
@@ -101,9 +101,9 @@
   return requestor_url_;
 }
 
-scoped_refptr<ExtensionInstallPrompt::Prompt>
+scoped_ptr<ExtensionInstallPrompt::Prompt>
 WebstoreInlineInstaller::CreateInstallPrompt() const {
-  scoped_refptr<ExtensionInstallPrompt::Prompt> prompt(
+  scoped_ptr<ExtensionInstallPrompt::Prompt> prompt(
       new ExtensionInstallPrompt::Prompt(
           ExtensionInstallPrompt::INLINE_INSTALL_PROMPT));
 
@@ -114,7 +114,7 @@
                           show_user_count(),
                           average_rating(),
                           rating_count());
-  return prompt;
+  return prompt.Pass();
 }
 
 bool WebstoreInlineInstaller::ShouldShowPostInstallUI() const {
diff --git a/chrome/browser/extensions/webstore_inline_installer.h b/chrome/browser/extensions/webstore_inline_installer.h
index 573e7d6..ebdab6a 100644
--- a/chrome/browser/extensions/webstore_inline_installer.h
+++ b/chrome/browser/extensions/webstore_inline_installer.h
@@ -53,7 +53,7 @@
   bool ShouldShowPostInstallUI() const override;
   bool ShouldShowAppInstalledBubble() const override;
   content::WebContents* GetWebContents() const override;
-  scoped_refptr<ExtensionInstallPrompt::Prompt> CreateInstallPrompt()
+  scoped_ptr<ExtensionInstallPrompt::Prompt> CreateInstallPrompt()
       const override;
   bool CheckInlineInstallPermitted(const base::DictionaryValue& webstore_data,
                                    std::string* error) const override;
diff --git a/chrome/browser/extensions/webstore_inline_installer_browsertest.cc b/chrome/browser/extensions/webstore_inline_installer_browsertest.cc
index 21f30bb..850f4e4 100644
--- a/chrome/browser/extensions/webstore_inline_installer_browsertest.cc
+++ b/chrome/browser/extensions/webstore_inline_installer_browsertest.cc
@@ -68,7 +68,7 @@
   void ShowDialog(Delegate* delegate,
                   const Extension* extension,
                   const SkBitmap* icon,
-                  const scoped_refptr<ExtensionInstallPrompt::Prompt>& prompt,
+                  scoped_ptr<ExtensionInstallPrompt::Prompt> prompt,
                   const ShowDialogCallback& callback) override {
     delegate_ = delegate;
   }
diff --git a/chrome/browser/extensions/webstore_install_with_prompt.cc b/chrome/browser/extensions/webstore_install_with_prompt.cc
index b0ddf40..b45a6418 100644
--- a/chrome/browser/extensions/webstore_install_with_prompt.cc
+++ b/chrome/browser/extensions/webstore_install_with_prompt.cc
@@ -54,10 +54,10 @@
   return dummy_requestor_url_;
 }
 
-scoped_refptr<ExtensionInstallPrompt::Prompt>
+scoped_ptr<ExtensionInstallPrompt::Prompt>
 WebstoreInstallWithPrompt::CreateInstallPrompt() const {
-  return new ExtensionInstallPrompt::Prompt(
-      ExtensionInstallPrompt::INSTALL_PROMPT);
+  return make_scoped_ptr(new ExtensionInstallPrompt::Prompt(
+      ExtensionInstallPrompt::INSTALL_PROMPT));
 }
 
 scoped_ptr<ExtensionInstallPrompt>
diff --git a/chrome/browser/extensions/webstore_install_with_prompt.h b/chrome/browser/extensions/webstore_install_with_prompt.h
index 7166d58..dbabe50fb 100644
--- a/chrome/browser/extensions/webstore_install_with_prompt.h
+++ b/chrome/browser/extensions/webstore_install_with_prompt.h
@@ -55,7 +55,7 @@
   bool ShouldShowPostInstallUI() const override;
   bool ShouldShowAppInstalledBubble() const override;
   content::WebContents* GetWebContents() const override;
-  scoped_refptr<ExtensionInstallPrompt::Prompt> CreateInstallPrompt()
+  scoped_ptr<ExtensionInstallPrompt::Prompt> CreateInstallPrompt()
       const override;
   scoped_ptr<ExtensionInstallPrompt> CreateInstallUI() override;
   bool CheckInlineInstallPermitted(const base::DictionaryValue& webstore_data,
diff --git a/chrome/browser/extensions/webstore_reinstaller.cc b/chrome/browser/extensions/webstore_reinstaller.cc
index 340fc2df..278d123 100644
--- a/chrome/browser/extensions/webstore_reinstaller.cc
+++ b/chrome/browser/extensions/webstore_reinstaller.cc
@@ -44,16 +44,16 @@
   return GURL::EmptyGURL();
 }
 
-scoped_refptr<ExtensionInstallPrompt::Prompt>
+scoped_ptr<ExtensionInstallPrompt::Prompt>
 WebstoreReinstaller::CreateInstallPrompt() const {
-  scoped_refptr<ExtensionInstallPrompt::Prompt> prompt(
+  scoped_ptr<ExtensionInstallPrompt::Prompt> prompt(
       new ExtensionInstallPrompt::Prompt(
           ExtensionInstallPrompt::REPAIR_PROMPT));
   prompt->SetWebstoreData(localized_user_count(),
                           show_user_count(),
                           average_rating(),
                           rating_count());
-  return prompt;
+  return prompt.Pass();
 }
 
 bool WebstoreReinstaller::ShouldShowPostInstallUI() const {
diff --git a/chrome/browser/extensions/webstore_reinstaller.h b/chrome/browser/extensions/webstore_reinstaller.h
index 6927662..efaddb8 100644
--- a/chrome/browser/extensions/webstore_reinstaller.h
+++ b/chrome/browser/extensions/webstore_reinstaller.h
@@ -34,7 +34,7 @@
   bool ShouldShowPostInstallUI() const override;
   bool ShouldShowAppInstalledBubble() const override;
   content::WebContents* GetWebContents() const override;
-  scoped_refptr<ExtensionInstallPrompt::Prompt> CreateInstallPrompt()
+  scoped_ptr<ExtensionInstallPrompt::Prompt> CreateInstallPrompt()
       const override;
   bool CheckInlineInstallPermitted(const base::DictionaryValue& webstore_data,
                                    std::string* error) const override;
diff --git a/chrome/browser/extensions/webstore_standalone_installer.cc b/chrome/browser/extensions/webstore_standalone_installer.cc
index 85fe3e37..8b1edca 100644
--- a/chrome/browser/extensions/webstore_standalone_installer.cc
+++ b/chrome/browser/extensions/webstore_standalone_installer.cc
@@ -406,7 +406,7 @@
 
   install_ui_ = CreateInstallUI();
   install_ui_->ShowDialog(
-      this, localized_extension.get(), &icon_, install_prompt_,
+      this, localized_extension.get(), &icon_, install_prompt_.Pass(),
       ExtensionInstallPrompt::GetDefaultShowDialogCallback());
 }
 
diff --git a/chrome/browser/extensions/webstore_standalone_installer.h b/chrome/browser/extensions/webstore_standalone_installer.h
index af27549f..57f05bdae 100644
--- a/chrome/browser/extensions/webstore_standalone_installer.h
+++ b/chrome/browser/extensions/webstore_standalone_installer.h
@@ -120,7 +120,7 @@
 
   // Should return an installation prompt with desired properties or NULL if
   // no prompt should be shown.
-  virtual scoped_refptr<ExtensionInstallPrompt::Prompt> CreateInstallPrompt()
+  virtual scoped_ptr<ExtensionInstallPrompt::Prompt> CreateInstallPrompt()
       const = 0;
 
   // Perform all necessary checks to make sure inline install is permitted,
@@ -225,7 +225,7 @@
 
   // Installation dialog and its underlying prompt.
   scoped_ptr<ExtensionInstallPrompt> install_ui_;
-  scoped_refptr<ExtensionInstallPrompt::Prompt> install_prompt_;
+  scoped_ptr<ExtensionInstallPrompt::Prompt> install_prompt_;
 
   // For fetching webstore JSON data.
   scoped_ptr<WebstoreDataFetcher> webstore_data_fetcher_;
diff --git a/chrome/browser/extensions/webstore_startup_installer.cc b/chrome/browser/extensions/webstore_startup_installer.cc
index 711e960c..7f0cdba 100644
--- a/chrome/browser/extensions/webstore_startup_installer.cc
+++ b/chrome/browser/extensions/webstore_startup_installer.cc
@@ -19,11 +19,11 @@
 
 WebstoreStartupInstaller::~WebstoreStartupInstaller() {}
 
-scoped_refptr<ExtensionInstallPrompt::Prompt>
+scoped_ptr<ExtensionInstallPrompt::Prompt>
 WebstoreStartupInstaller::CreateInstallPrompt() const {
   if (show_prompt_) {
-    return new ExtensionInstallPrompt::Prompt(
-        ExtensionInstallPrompt::INSTALL_PROMPT);
+    return make_scoped_ptr(new ExtensionInstallPrompt::Prompt(
+        ExtensionInstallPrompt::INSTALL_PROMPT));
   }
   return NULL;
 }
diff --git a/chrome/browser/extensions/webstore_startup_installer.h b/chrome/browser/extensions/webstore_startup_installer.h
index 2e56901..cfbbf76 100644
--- a/chrome/browser/extensions/webstore_startup_installer.h
+++ b/chrome/browser/extensions/webstore_startup_installer.h
@@ -31,7 +31,7 @@
   ~WebstoreStartupInstaller() override;
 
   // Implementations of WebstoreStandaloneInstaller Template Method's hooks.
-  scoped_refptr<ExtensionInstallPrompt::Prompt> CreateInstallPrompt()
+  scoped_ptr<ExtensionInstallPrompt::Prompt> CreateInstallPrompt()
       const override;
 
  private:
diff --git a/chrome/browser/ui/cocoa/extensions/extension_install_dialog_controller.h b/chrome/browser/ui/cocoa/extensions/extension_install_dialog_controller.h
index 6a99ef0..0596b00 100644
--- a/chrome/browser/ui/cocoa/extensions/extension_install_dialog_controller.h
+++ b/chrome/browser/ui/cocoa/extensions/extension_install_dialog_controller.h
@@ -8,6 +8,7 @@
 #import <Cocoa/Cocoa.h>
 
 #include "base/mac/scoped_nsobject.h"
+#include "base/macros.h"
 #include "chrome/browser/extensions/extension_install_prompt.h"
 #import "chrome/browser/ui/cocoa/constrained_window/constrained_window_mac.h"
 
@@ -31,7 +32,7 @@
   ExtensionInstallDialogController(
       ExtensionInstallPromptShowParams* show_params,
       ExtensionInstallPrompt::Delegate* delegate,
-      scoped_refptr<ExtensionInstallPrompt::Prompt> prompt);
+      scoped_ptr<ExtensionInstallPrompt::Prompt> prompt);
   ~ExtensionInstallDialogController() override;
 
   // ExtensionInstallPrompt::Delegate implementation.
@@ -53,6 +54,8 @@
   base::scoped_nsobject<ExtensionInstallViewController> view_controller_;
   scoped_ptr<ConstrainedWindowMac> constrained_window_;
   scoped_ptr<extensions::ExperienceSamplingEvent> sampling_event_;
+
+  DISALLOW_COPY_AND_ASSIGN(ExtensionInstallDialogController);
 };
 
 #endif  // CHROME_BROWSER_UI_COCOA_EXTENSIONS_EXTENSION_INSTALL_DIALOG_CONTROLLER_H_
diff --git a/chrome/browser/ui/cocoa/extensions/extension_install_dialog_controller.mm b/chrome/browser/ui/cocoa/extensions/extension_install_dialog_controller.mm
index c901e17..f43b7e6 100644
--- a/chrome/browser/ui/cocoa/extensions/extension_install_dialog_controller.mm
+++ b/chrome/browser/ui/cocoa/extensions/extension_install_dialog_controller.mm
@@ -26,14 +26,14 @@
 void ShowExtensionInstallDialogImpl(
     ExtensionInstallPromptShowParams* show_params,
     ExtensionInstallPrompt::Delegate* delegate,
-    scoped_refptr<ExtensionInstallPrompt::Prompt> prompt) {
+    scoped_ptr<ExtensionInstallPrompt::Prompt> prompt) {
   // These objects will delete themselves when the dialog closes.
   if (!show_params->GetParentWebContents()) {
-    new WindowedInstallDialogController(show_params, delegate, prompt);
+    new WindowedInstallDialogController(show_params, delegate, prompt.Pass());
     return;
   }
 
-  new ExtensionInstallDialogController(show_params, delegate, prompt);
+  new ExtensionInstallDialogController(show_params, delegate, prompt.Pass());
 }
 
 }  // namespace
@@ -41,13 +41,14 @@
 ExtensionInstallDialogController::ExtensionInstallDialogController(
     ExtensionInstallPromptShowParams* show_params,
     ExtensionInstallPrompt::Delegate* delegate,
-    scoped_refptr<ExtensionInstallPrompt::Prompt> prompt)
+    scoped_ptr<ExtensionInstallPrompt::Prompt> prompt)
     : delegate_(delegate) {
+  ExtensionInstallPrompt::PromptType promptType = prompt->type();
   view_controller_.reset([[ExtensionInstallViewController alloc]
       initWithProfile:show_params->profile()
             navigator:show_params->GetParentWebContents()
              delegate:this
-               prompt:prompt]);
+               prompt:prompt.Pass()]);
 
   base::scoped_nsobject<NSWindow> window([[ConstrainedWindowCustomWindow alloc]
       initWithContentRect:[[view_controller_ view] bounds]]);
@@ -59,7 +60,8 @@
       this, show_params->GetParentWebContents(), sheet));
 
   std::string event_name = ExperienceSamplingEvent::kExtensionInstallDialog;
-  event_name.append(ExtensionInstallPrompt::PromptTypeToString(prompt->type()));
+  event_name.append(
+      ExtensionInstallPrompt::PromptTypeToString(promptType));
   sampling_event_ = ExperienceSamplingEvent::Create(event_name);
 }
 
diff --git a/chrome/browser/ui/cocoa/extensions/extension_install_dialog_controller_browsertest.mm b/chrome/browser/ui/cocoa/extensions/extension_install_dialog_controller_browsertest.mm
index 9197c055..756ef90 100644
--- a/chrome/browser/ui/cocoa/extensions/extension_install_dialog_controller_browsertest.mm
+++ b/chrome/browser/ui/cocoa/extensions/extension_install_dialog_controller_browsertest.mm
@@ -32,13 +32,12 @@
   ExtensionInstallPromptShowParams show_params(tab);
 
   chrome::MockExtensionInstallPromptDelegate delegate;
-  scoped_refptr<ExtensionInstallPrompt::Prompt> prompt =
+  scoped_ptr<ExtensionInstallPrompt::Prompt> prompt =
       chrome::BuildExtensionInstallPrompt(extension_.get());
 
   ExtensionInstallDialogController* controller =
-      new ExtensionInstallDialogController(&show_params,
-                                           &delegate,
-                                           prompt);
+      new ExtensionInstallDialogController(&show_params, &delegate,
+                                           prompt.Pass());
 
   base::scoped_nsobject<NSWindow> window(
       [[[controller->view_controller() view] window] retain]);
@@ -57,13 +56,12 @@
   ExtensionInstallPromptShowParams show_params(tab);
 
   chrome::MockExtensionInstallPromptDelegate delegate;
-  scoped_refptr<ExtensionInstallPrompt::Prompt> prompt =
+  scoped_ptr<ExtensionInstallPrompt::Prompt> prompt =
       chrome::BuildExtensionPostInstallPermissionsPrompt(extension_.get());
 
   ExtensionInstallDialogController* controller =
-      new ExtensionInstallDialogController(&show_params,
-                                           &delegate,
-                                           prompt);
+      new ExtensionInstallDialogController(&show_params, &delegate,
+                                           prompt.Pass());
 
   base::scoped_nsobject<NSWindow> window(
       [[[controller->view_controller() view] window] retain]);
diff --git a/chrome/browser/ui/cocoa/extensions/extension_install_prompt_test_utils.h b/chrome/browser/ui/cocoa/extensions/extension_install_prompt_test_utils.h
index 07084e9..a95ba2f 100644
--- a/chrome/browser/ui/cocoa/extensions/extension_install_prompt_test_utils.h
+++ b/chrome/browser/ui/cocoa/extensions/extension_install_prompt_test_utils.h
@@ -43,12 +43,11 @@
 gfx::Image LoadInstallPromptIcon();
 
 // Builds a prompt using the given extension.
-scoped_refptr<ExtensionInstallPrompt::Prompt> BuildExtensionInstallPrompt(
+scoped_ptr<ExtensionInstallPrompt::Prompt> BuildExtensionInstallPrompt(
     extensions::Extension* extension);
 
-scoped_refptr<ExtensionInstallPrompt::Prompt>
-    BuildExtensionPostInstallPermissionsPrompt(
-        extensions::Extension* extension);
+scoped_ptr<ExtensionInstallPrompt::Prompt>
+BuildExtensionPostInstallPermissionsPrompt(extensions::Extension* extension);
 
 }  // namespace chrome
 
diff --git a/chrome/browser/ui/cocoa/extensions/extension_install_prompt_test_utils.mm b/chrome/browser/ui/cocoa/extensions/extension_install_prompt_test_utils.mm
index b2e2a70..7fa3edf 100644
--- a/chrome/browser/ui/cocoa/extensions/extension_install_prompt_test_utils.mm
+++ b/chrome/browser/ui/cocoa/extensions/extension_install_prompt_test_utils.mm
@@ -71,24 +71,24 @@
       file_contents.length());
 }
 
-scoped_refptr<ExtensionInstallPrompt::Prompt> BuildExtensionInstallPrompt(
+scoped_ptr<ExtensionInstallPrompt::Prompt> BuildExtensionInstallPrompt(
     Extension* extension) {
-  scoped_refptr<ExtensionInstallPrompt::Prompt> prompt =
+  scoped_ptr<ExtensionInstallPrompt::Prompt> prompt(
       new ExtensionInstallPrompt::Prompt(
-          ExtensionInstallPrompt::INSTALL_PROMPT);
+          ExtensionInstallPrompt::INSTALL_PROMPT));
   prompt->set_extension(extension);
   prompt->set_icon(LoadInstallPromptIcon());
-  return prompt;
+  return prompt.Pass();
 }
 
-scoped_refptr<ExtensionInstallPrompt::Prompt>
+scoped_ptr<ExtensionInstallPrompt::Prompt>
 BuildExtensionPostInstallPermissionsPrompt(Extension* extension) {
-  scoped_refptr<ExtensionInstallPrompt::Prompt> prompt =
+  scoped_ptr<ExtensionInstallPrompt::Prompt> prompt(
       new ExtensionInstallPrompt::Prompt(
-          ExtensionInstallPrompt::POST_INSTALL_PERMISSIONS_PROMPT);
+          ExtensionInstallPrompt::POST_INSTALL_PERMISSIONS_PROMPT));
   prompt->set_extension(extension);
   prompt->set_icon(LoadInstallPromptIcon());
-  return prompt;
+  return prompt.Pass();
 }
 
 }  // namespace chrome
diff --git a/chrome/browser/ui/cocoa/extensions/extension_install_view_controller.h b/chrome/browser/ui/cocoa/extensions/extension_install_view_controller.h
index 170b293d..f88d3dc 100644
--- a/chrome/browser/ui/cocoa/extensions/extension_install_view_controller.h
+++ b/chrome/browser/ui/cocoa/extensions/extension_install_view_controller.h
@@ -46,7 +46,7 @@
   Profile* profile_; // weak
   content::PageNavigator* navigator_;  // weak
   ExtensionInstallPrompt::Delegate* delegate_;  // weak
-  scoped_refptr<ExtensionInstallPrompt::Prompt> prompt_;
+  scoped_ptr<ExtensionInstallPrompt::Prompt> prompt_;
 
   base::scoped_nsobject<NSArray> warnings_;
   BOOL isComputingRowHeight_;
@@ -68,7 +68,7 @@
 - (id)initWithProfile:(Profile*)profile
             navigator:(content::PageNavigator*)navigator
              delegate:(ExtensionInstallPrompt::Delegate*)delegate
-               prompt:(scoped_refptr<ExtensionInstallPrompt::Prompt>)prompt;
+               prompt:(scoped_ptr<ExtensionInstallPrompt::Prompt>)prompt;
 - (IBAction)storeLinkClicked:(id)sender; // Callback for "View details" link.
 - (IBAction)cancel:(id)sender;
 - (IBAction)ok:(id)sender;
diff --git a/chrome/browser/ui/cocoa/extensions/extension_install_view_controller.mm b/chrome/browser/ui/cocoa/extensions/extension_install_view_controller.mm
index 7bd7af0..d4bb7b6 100644
--- a/chrome/browser/ui/cocoa/extensions/extension_install_view_controller.mm
+++ b/chrome/browser/ui/cocoa/extensions/extension_install_view_controller.mm
@@ -224,7 +224,7 @@
 - (id)initWithProfile:(Profile*)profile
             navigator:(content::PageNavigator*)navigator
              delegate:(ExtensionInstallPrompt::Delegate*)delegate
-               prompt:(scoped_refptr<ExtensionInstallPrompt::Prompt>)prompt {
+               prompt:(scoped_ptr<ExtensionInstallPrompt::Prompt>)prompt {
   // We use a different XIB in the case of bundle installs, installs with
   // webstore data, or no permission warnings. These are laid out nicely for
   // the data they display.
@@ -246,8 +246,8 @@
     profile_ = profile;
     navigator_ = navigator;
     delegate_ = delegate;
-    prompt_ = prompt;
-    warnings_.reset([[self buildWarnings:*prompt] retain]);
+    prompt_ = prompt.Pass();
+    warnings_.reset([[self buildWarnings:*prompt_] retain]);
   }
   return self;
 }
diff --git a/chrome/browser/ui/cocoa/extensions/extension_install_view_controller_unittest.mm b/chrome/browser/ui/cocoa/extensions/extension_install_view_controller_unittest.mm
index 508e312..02c5791 100644
--- a/chrome/browser/ui/cocoa/extensions/extension_install_view_controller_unittest.mm
+++ b/chrome/browser/ui/cocoa/extensions/extension_install_view_controller_unittest.mm
@@ -38,8 +38,8 @@
 TEST_F(ExtensionInstallViewControllerTest, BasicsNormalCancel) {
   chrome::MockExtensionInstallPromptDelegate delegate;
 
-  scoped_refptr<ExtensionInstallPrompt::Prompt> prompt =
-      chrome::BuildExtensionInstallPrompt(extension_.get());
+  scoped_ptr<ExtensionInstallPrompt::Prompt> prompt(
+      chrome::BuildExtensionInstallPrompt(extension_.get()));
   ExtensionInstallPrompt::PermissionsType type =
       ExtensionInstallPrompt::PermissionsType::REGULAR_PERMISSIONS;
 
@@ -47,12 +47,13 @@
   permissions.push_back(PermissionMessage(base::UTF8ToUTF16("warning 1"),
                                           PermissionIDSet()));
   prompt->SetPermissions(permissions, type);
+  base::string16 permissionString = prompt->GetPermission(0, type);
 
   base::scoped_nsobject<ExtensionInstallViewController> controller(
       [[ExtensionInstallViewController alloc] initWithProfile:profile()
                                                     navigator:browser()
                                                      delegate:&delegate
-                                                       prompt:prompt]);
+                                                       prompt:prompt.Pass()]);
 
   [controller view];  // Force nib load.
 
@@ -72,7 +73,7 @@
   NSOutlineView* outlineView = [controller outlineView];
   EXPECT_TRUE(outlineView);
   EXPECT_EQ(2, [outlineView numberOfRows]);
-  EXPECT_NSEQ(base::SysUTF16ToNSString(prompt->GetPermission(0, type)),
+  EXPECT_NSEQ(base::SysUTF16ToNSString(permissionString),
               [[outlineView dataSource] outlineView:outlineView
                           objectValueForTableColumn:nil
                                              byItem:[outlineView itemAtRow:1]]);
@@ -94,8 +95,8 @@
 TEST_F(ExtensionInstallViewControllerTest, BasicsNormalOK) {
   chrome::MockExtensionInstallPromptDelegate delegate;
 
-  scoped_refptr<ExtensionInstallPrompt::Prompt> prompt =
-      chrome::BuildExtensionInstallPrompt(extension_.get());
+  scoped_ptr<ExtensionInstallPrompt::Prompt> prompt(
+      chrome::BuildExtensionInstallPrompt(extension_.get()));
   ExtensionInstallPrompt::PermissionsType type =
       ExtensionInstallPrompt::PermissionsType::REGULAR_PERMISSIONS;
 
@@ -108,7 +109,7 @@
       [[ExtensionInstallViewController alloc] initWithProfile:profile()
                                                     navigator:browser()
                                                      delegate:&delegate
-                                                       prompt:prompt]);
+                                                       prompt:prompt.Pass()]);
 
   [controller view];  // Force nib load.
   [controller ok:nil];
@@ -123,8 +124,8 @@
   chrome::MockExtensionInstallPromptDelegate delegate1;
   chrome::MockExtensionInstallPromptDelegate delegate2;
 
-  scoped_refptr<ExtensionInstallPrompt::Prompt> one_warning_prompt =
-      chrome::BuildExtensionInstallPrompt(extension_.get());
+  scoped_ptr<ExtensionInstallPrompt::Prompt> one_warning_prompt(
+      chrome::BuildExtensionInstallPrompt(extension_.get()));
   ExtensionInstallPrompt::PermissionsType type =
       ExtensionInstallPrompt::PermissionsType::REGULAR_PERMISSIONS;
 
@@ -133,8 +134,8 @@
                                           PermissionIDSet()));
   one_warning_prompt->SetPermissions(permissions, type);
 
-  scoped_refptr<ExtensionInstallPrompt::Prompt> two_warnings_prompt =
-      chrome::BuildExtensionInstallPrompt(extension_.get());
+  scoped_ptr<ExtensionInstallPrompt::Prompt> two_warnings_prompt(
+      chrome::BuildExtensionInstallPrompt(extension_.get()));
   permissions.push_back(PermissionMessage(base::UTF8ToUTF16("warning 2"),
                                           PermissionIDSet()));
   two_warnings_prompt->SetPermissions(permissions, type);
@@ -144,7 +145,7 @@
           initWithProfile:profile()
                 navigator:browser()
                  delegate:&delegate1
-                   prompt:one_warning_prompt]);
+                   prompt:one_warning_prompt.Pass()]);
 
   [controller1 view];  // Force nib load.
 
@@ -153,7 +154,7 @@
           initWithProfile:profile()
                 navigator:browser()
                  delegate:&delegate2
-                   prompt:two_warnings_prompt]);
+                   prompt:two_warnings_prompt.Pass()]);
 
   [controller2 view];  // Force nib load.
 
@@ -173,15 +174,15 @@
   chrome::MockExtensionInstallPromptDelegate delegate;
 
   // No warnings should trigger skinny prompt.
-  scoped_refptr<ExtensionInstallPrompt::Prompt> no_warnings_prompt =
-      chrome::BuildExtensionInstallPrompt(extension_.get());
+  scoped_ptr<ExtensionInstallPrompt::Prompt> no_warnings_prompt(
+      chrome::BuildExtensionInstallPrompt(extension_.get()));
 
   base::scoped_nsobject<ExtensionInstallViewController> controller(
       [[ExtensionInstallViewController alloc]
           initWithProfile:profile()
                 navigator:browser()
                  delegate:&delegate
-                   prompt:no_warnings_prompt]);
+                   prompt:no_warnings_prompt.Pass()]);
 
   [controller view];  // Force nib load.
 
@@ -215,18 +216,19 @@
   chrome::MockExtensionInstallPromptDelegate delegate;
 
   // No warnings should trigger skinny prompt.
-  scoped_refptr<ExtensionInstallPrompt::Prompt> inline_prompt =
+  scoped_ptr<ExtensionInstallPrompt::Prompt> inline_prompt(
       new ExtensionInstallPrompt::Prompt(
-          ExtensionInstallPrompt::INLINE_INSTALL_PROMPT);
+          ExtensionInstallPrompt::INLINE_INSTALL_PROMPT));
   inline_prompt->SetWebstoreData("1,000", true, 3.5, 200);
   inline_prompt->set_extension(extension_.get());
   inline_prompt->set_icon(chrome::LoadInstallPromptIcon());
 
   base::scoped_nsobject<ExtensionInstallViewController> controller(
-      [[ExtensionInstallViewController alloc] initWithProfile:profile()
-                                                    navigator:browser()
-                                                     delegate:&delegate
-                                                       prompt:inline_prompt]);
+      [[ExtensionInstallViewController alloc]
+          initWithProfile:profile()
+                navigator:browser()
+                 delegate:&delegate
+                   prompt:inline_prompt.Pass()]);
 
   [controller view];  // Force nib load.
 
@@ -273,8 +275,8 @@
 TEST_F(ExtensionInstallViewControllerTest, PostInstallPermissionsPrompt) {
   chrome::MockExtensionInstallPromptDelegate delegate;
 
-  scoped_refptr<ExtensionInstallPrompt::Prompt> prompt =
-      chrome::BuildExtensionPostInstallPermissionsPrompt(extension_.get());
+  scoped_ptr<ExtensionInstallPrompt::Prompt> prompt(
+      chrome::BuildExtensionPostInstallPermissionsPrompt(extension_.get()));
   ExtensionInstallPrompt::PermissionsType type =
       ExtensionInstallPrompt::PermissionsType::REGULAR_PERMISSIONS;
 
@@ -287,7 +289,7 @@
       [[ExtensionInstallViewController alloc] initWithProfile:profile()
                                                     navigator:browser()
                                                      delegate:&delegate
-                                                       prompt:prompt]);
+                                                       prompt:prompt.Pass()]);
 
   [controller view];  // Force nib load.
 
@@ -302,8 +304,8 @@
 TEST_F(ExtensionInstallViewControllerTest, PermissionsDetails) {
   chrome::MockExtensionInstallPromptDelegate delegate;
 
-  scoped_refptr<ExtensionInstallPrompt::Prompt> prompt =
-      chrome::BuildExtensionInstallPrompt(extension_.get());
+  scoped_ptr<ExtensionInstallPrompt::Prompt> prompt(
+      chrome::BuildExtensionInstallPrompt(extension_.get()));
   ExtensionInstallPrompt::PermissionsType type =
       ExtensionInstallPrompt::PermissionsType::REGULAR_PERMISSIONS;
 
@@ -315,19 +317,20 @@
   prompt->SetPermissions(permissions, type);
   prompt->SetIsShowingDetails(
       ExtensionInstallPrompt::PERMISSIONS_DETAILS, 0, true);
+  base::string16 permissionString = prompt->GetPermissionsDetails(0, type);
 
   base::scoped_nsobject<ExtensionInstallViewController> controller(
       [[ExtensionInstallViewController alloc] initWithProfile:profile()
                                                     navigator:browser()
                                                      delegate:&delegate
-                                                       prompt:prompt]);
+                                                       prompt:prompt.Pass()]);
 
   [controller view];  // Force nib load.
 
   NSOutlineView* outlineView = [controller outlineView];
   EXPECT_TRUE(outlineView);
   EXPECT_EQ(4, [outlineView numberOfRows]);
-  EXPECT_NSEQ(base::SysUTF16ToNSString(prompt->GetPermissionsDetails(0, type)),
+  EXPECT_NSEQ(base::SysUTF16ToNSString(permissionString),
               [[outlineView dataSource] outlineView:outlineView
                           objectValueForTableColumn:nil
                                              byItem:[outlineView itemAtRow:2]]);
diff --git a/chrome/browser/ui/cocoa/extensions/windowed_install_dialog_controller.h b/chrome/browser/ui/cocoa/extensions/windowed_install_dialog_controller.h
index ca787c0a..4e828cf 100644
--- a/chrome/browser/ui/cocoa/extensions/windowed_install_dialog_controller.h
+++ b/chrome/browser/ui/cocoa/extensions/windowed_install_dialog_controller.h
@@ -25,7 +25,7 @@
   WindowedInstallDialogController(
       ExtensionInstallPromptShowParams* show_params,
       ExtensionInstallPrompt::Delegate* delegate,
-      scoped_refptr<ExtensionInstallPrompt::Prompt> prompt);
+      scoped_ptr<ExtensionInstallPrompt::Prompt> prompt);
   ~WindowedInstallDialogController() override;
 
   // Invoked by the -[NSWindow windowWillClose:] notification after a dialog
diff --git a/chrome/browser/ui/cocoa/extensions/windowed_install_dialog_controller.mm b/chrome/browser/ui/cocoa/extensions/windowed_install_dialog_controller.mm
index d6f414f..542a82d 100644
--- a/chrome/browser/ui/cocoa/extensions/windowed_install_dialog_controller.mm
+++ b/chrome/browser/ui/cocoa/extensions/windowed_install_dialog_controller.mm
@@ -25,20 +25,20 @@
 - (id)initWithProfile:(Profile*)profile
             navigator:(content::PageNavigator*)navigator
              delegate:(WindowedInstallDialogController*)delegate
-               prompt:(scoped_refptr<ExtensionInstallPrompt::Prompt>)prompt;
+               prompt:(scoped_ptr<ExtensionInstallPrompt::Prompt>)prompt;
 
 @end
 
 WindowedInstallDialogController::WindowedInstallDialogController(
     ExtensionInstallPromptShowParams* show_params,
     ExtensionInstallPrompt::Delegate* delegate,
-    scoped_refptr<ExtensionInstallPrompt::Prompt> prompt)
+    scoped_ptr<ExtensionInstallPrompt::Prompt> prompt)
     : delegate_(delegate) {
   install_controller_.reset([[WindowedInstallController alloc]
       initWithProfile:show_params->profile()
             navigator:show_params->GetParentWebContents()
              delegate:this
-               prompt:prompt]);
+               prompt:prompt.Pass()]);
   [[install_controller_ window] makeKeyAndOrderFront:nil];
 }
 
@@ -78,7 +78,7 @@
 - (id)initWithProfile:(Profile*)profile
             navigator:(content::PageNavigator*)navigator
              delegate:(WindowedInstallDialogController*)delegate
-               prompt:(scoped_refptr<ExtensionInstallPrompt::Prompt>)prompt {
+               prompt:(scoped_ptr<ExtensionInstallPrompt::Prompt>)prompt {
   base::scoped_nsobject<NSWindow> controlledPanel(
       [[NSPanel alloc] initWithContentRect:ui::kWindowSizeDeterminedLater
                                  styleMask:NSTitledWindowMask
@@ -86,11 +86,12 @@
                                      defer:NO]);
   if ((self = [super initWithWindow:controlledPanel])) {
     dialogController_ = delegate;
+    ExtensionInstallPrompt::Prompt* weakPrompt = prompt.get();
     installViewController_.reset([[ExtensionInstallViewController alloc]
         initWithProfile:profile
               navigator:navigator
                delegate:delegate
-                 prompt:prompt]);
+                 prompt:prompt.Pass()]);
     NSWindow* window = [self window];
 
     // Ensure the window does not display behind the app launcher window, and is
@@ -101,7 +102,7 @@
     if ([window respondsToSelector:@selector(setAnimationBehavior:)])
       [window setAnimationBehavior:NSWindowAnimationBehaviorAlertPanel];
 
-    [window setTitle:base::SysUTF16ToNSString(prompt->GetDialogTitle())];
+    [window setTitle:base::SysUTF16ToNSString(weakPrompt->GetDialogTitle())];
     NSRect viewFrame = [[installViewController_ view] frame];
     [window setFrame:[window frameRectForContentRect:viewFrame]
              display:NO];
diff --git a/chrome/browser/ui/cocoa/extensions/windowed_install_dialog_controller_browsertest.mm b/chrome/browser/ui/cocoa/extensions/windowed_install_dialog_controller_browsertest.mm
index 29fa9bf..839366e 100644
--- a/chrome/browser/ui/cocoa/extensions/windowed_install_dialog_controller_browsertest.mm
+++ b/chrome/browser/ui/cocoa/extensions/windowed_install_dialog_controller_browsertest.mm
@@ -22,9 +22,9 @@
     WindowedInstallDialogController** controller,
     ExtensionInstallPromptShowParams* show_params,
     ExtensionInstallPrompt::Delegate* delegate,
-    scoped_refptr<ExtensionInstallPrompt::Prompt> prompt) {
+    scoped_ptr<ExtensionInstallPrompt::Prompt> prompt) {
   *controller =
-      new WindowedInstallDialogController(show_params, delegate, prompt);
+      new WindowedInstallDialogController(show_params, delegate, prompt.Pass());
 }
 
 typedef InProcessBrowserTest WindowedInstallDialogControllerBrowserTest;
diff --git a/chrome/browser/ui/extensions/extension_enable_flow.cc b/chrome/browser/ui/extensions/extension_enable_flow.cc
index e16a2ea..6cc42919 100644
--- a/chrome/browser/ui/extensions/extension_enable_flow.cc
+++ b/chrome/browser/ui/extensions/extension_enable_flow.cc
@@ -118,7 +118,7 @@
       ExtensionInstallPrompt::GetReEnablePromptTypeForExtension(profile_,
                                                                 extension);
   prompt_->ShowDialog(this, extension, nullptr,
-                      new ExtensionInstallPrompt::Prompt(type),
+                      make_scoped_ptr(new ExtensionInstallPrompt::Prompt(type)),
                       ExtensionInstallPrompt::GetDefaultShowDialogCallback());
 }
 
diff --git a/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc b/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc
index ff1ac90f..e43bd823 100644
--- a/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc
+++ b/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc
@@ -102,14 +102,15 @@
 void ShowExtensionInstallDialogImpl(
     ExtensionInstallPromptShowParams* show_params,
     ExtensionInstallPrompt::Delegate* delegate,
-    scoped_refptr<ExtensionInstallPrompt::Prompt> prompt) {
+    scoped_ptr<ExtensionInstallPrompt::Prompt> prompt) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  bool use_tab_modal_dialog = prompt->ShouldUseTabModalDialog();
   ExtensionInstallDialogView* dialog =
       new ExtensionInstallDialogView(show_params->profile(),
                                      show_params->GetParentWebContents(),
                                      delegate,
-                                     prompt);
-  if (prompt->ShouldUseTabModalDialog()) {
+                                     prompt.Pass());
+  if (use_tab_modal_dialog) {
     content::WebContents* parent_web_contents =
         show_params->GetParentWebContents();
     if (parent_web_contents)
@@ -198,11 +199,11 @@
     Profile* profile,
     content::PageNavigator* navigator,
     ExtensionInstallPrompt::Delegate* delegate,
-    scoped_refptr<ExtensionInstallPrompt::Prompt> prompt)
+    scoped_ptr<ExtensionInstallPrompt::Prompt> prompt)
     : profile_(profile),
       navigator_(navigator),
       delegate_(delegate),
-      prompt_(prompt),
+      prompt_(prompt.Pass()),
       container_(NULL),
       scroll_view_(NULL),
       handled_result_(false) {
diff --git a/chrome/browser/ui/views/extensions/extension_install_dialog_view.h b/chrome/browser/ui/views/extensions/extension_install_dialog_view.h
index 0e81c85..2f15b36e 100644
--- a/chrome/browser/ui/views/extensions/extension_install_dialog_view.h
+++ b/chrome/browser/ui/views/extensions/extension_install_dialog_view.h
@@ -38,11 +38,10 @@
 class ExtensionInstallDialogView : public views::DialogDelegateView,
                                    public views::LinkListener {
  public:
-  ExtensionInstallDialogView(
-      Profile* profile,
-      content::PageNavigator* navigator,
-      ExtensionInstallPrompt::Delegate* delegate,
-      scoped_refptr<ExtensionInstallPrompt::Prompt> prompt);
+  ExtensionInstallDialogView(Profile* profile,
+                             content::PageNavigator* navigator,
+                             ExtensionInstallPrompt::Delegate* delegate,
+                             scoped_ptr<ExtensionInstallPrompt::Prompt> prompt);
   ~ExtensionInstallDialogView() override;
 
   // Returns the interior ScrollView of the dialog. This allows us to inspect
@@ -92,7 +91,7 @@
   Profile* profile_;
   content::PageNavigator* navigator_;
   ExtensionInstallPrompt::Delegate* delegate_;
-  scoped_refptr<ExtensionInstallPrompt::Prompt> prompt_;
+  scoped_ptr<ExtensionInstallPrompt::Prompt> prompt_;
 
   // The container view that contains all children (heading, icon, webstore
   // data, and the scroll view with permissions etc.), excluding the buttons,
diff --git a/chrome/browser/ui/views/extensions/extension_install_dialog_view_browsertest.cc b/chrome/browser/ui/views/extensions/extension_install_dialog_view_browsertest.cc
index 752f6a0c..13a1b642 100644
--- a/chrome/browser/ui/views/extensions/extension_install_dialog_view_browsertest.cc
+++ b/chrome/browser/ui/views/extensions/extension_install_dialog_view_browsertest.cc
@@ -56,24 +56,6 @@
   ++abort_count_;
 }
 
-// This lets us construct the parent for the prompt we're constructing in our
-// tests.
-class MockExtensionInstallPrompt : public ExtensionInstallPrompt {
- public:
-  explicit MockExtensionInstallPrompt(content::WebContents* web_contents)
-      : ExtensionInstallPrompt(web_contents), prompt_(NULL) {}
-  ~MockExtensionInstallPrompt() override {}
-  void set_prompt(ExtensionInstallPrompt::Prompt* prompt) {
-    prompt_ = prompt;
-  }
-  ExtensionInstallPrompt::Prompt* get_prompt() {
-    return prompt_;
-  }
-
- private:
-  ExtensionInstallPrompt::Prompt* prompt_;
-};
-
 class ExtensionInstallDialogViewTestBase : public ExtensionBrowserTest {
  protected:
   explicit ExtensionInstallDialogViewTestBase(
@@ -82,17 +64,18 @@
 
   void SetUpOnMainThread() override;
 
-  ExtensionInstallPrompt::Prompt* prompt() { return prompt_.get(); }
+  // Creates and returns an install prompt of |prompt_type_|, optionally setting
+  // |permissions|.
+  scoped_ptr<ExtensionInstallPrompt::Prompt> CreatePrompt();
+  scoped_ptr<ExtensionInstallPrompt::Prompt> CreatePrompt(
+      const PermissionMessages& permissions);
+
   content::WebContents* web_contents() { return web_contents_; }
   MockExtensionInstallPromptDelegate* delegate() { return &delegate_; }
 
-  void SetPromptPermissions(const PermissionMessages& permissions);
-  void SetPromptRetainedFiles(std::vector<base::FilePath> files);
-
  private:
   const extensions::Extension* extension_;
-  MockExtensionInstallPrompt* install_prompt_;
-  scoped_refptr<ExtensionInstallPrompt::Prompt> prompt_;
+  ExtensionInstallPrompt::PromptType prompt_type_;
   content::WebContents* web_contents_;
   MockExtensionInstallPromptDelegate delegate_;
 
@@ -101,11 +84,7 @@
 
 ExtensionInstallDialogViewTestBase::ExtensionInstallDialogViewTestBase(
     ExtensionInstallPrompt::PromptType prompt_type)
-    : extension_(NULL),
-      install_prompt_(NULL),
-      prompt_(new ExtensionInstallPrompt::Prompt(prompt_type)),
-      web_contents_(NULL) {
-}
+    : extension_(NULL), prompt_type_(prompt_type), web_contents_(NULL) {}
 
 void ExtensionInstallDialogViewTestBase::SetUpOnMainThread() {
   ExtensionBrowserTest::SetUpOnMainThread();
@@ -114,29 +93,20 @@
       "install_prompt/permissions_scrollbar_regression"));
 
   web_contents_ = browser()->tab_strip_model()->GetWebContentsAt(0);
+}
 
-  install_prompt_ = new MockExtensionInstallPrompt(web_contents_);
-  install_prompt_->set_prompt(prompt_.get());
-  prompt_->set_extension(extension_);
+scoped_ptr<ExtensionInstallPrompt::Prompt>
+ExtensionInstallDialogViewTestBase::CreatePrompt() {
+  scoped_ptr<ExtensionInstallPrompt::Prompt> prompt(
+      new ExtensionInstallPrompt::Prompt(prompt_type_));
+  prompt->set_extension(extension_);
 
   scoped_ptr<ExtensionIconManager> icon_manager(new ExtensionIconManager());
   const SkBitmap icon_bitmap = icon_manager->GetIcon(extension_->id());
   gfx::Image icon = gfx::Image::CreateFrom1xBitmap(icon_bitmap);
-  prompt_->set_icon(icon);
+  prompt->set_icon(icon);
 
-  this->SetPromptPermissions(PermissionMessages());
-  this->SetPromptRetainedFiles(std::vector<base::FilePath>());
-}
-
-void ExtensionInstallDialogViewTestBase::SetPromptPermissions(
-    const PermissionMessages& permissions) {
-  prompt_->SetPermissions(permissions,
-                          ExtensionInstallPrompt::REGULAR_PERMISSIONS);
-}
-
-void ExtensionInstallDialogViewTestBase::SetPromptRetainedFiles(
-    std::vector<base::FilePath> files) {
-  prompt_->set_retained_files(files);
+  return prompt.Pass();
 }
 
 class ScrollbarTest : public ExtensionInstallDialogViewTestBase {
@@ -144,7 +114,7 @@
   ScrollbarTest();
   ~ScrollbarTest() override {}
 
-  bool IsScrollbarVisible();
+  bool IsScrollbarVisible(scoped_ptr<ExtensionInstallPrompt::Prompt> prompt);
 
  private:
   DISALLOW_COPY_AND_ASSIGN(ScrollbarTest);
@@ -155,12 +125,10 @@
           ExtensionInstallPrompt::PERMISSIONS_PROMPT) {
 }
 
-bool ScrollbarTest::IsScrollbarVisible() {
+bool ScrollbarTest::IsScrollbarVisible(
+    scoped_ptr<ExtensionInstallPrompt::Prompt> prompt) {
   ExtensionInstallDialogView* dialog = new ExtensionInstallDialogView(
-      profile(),
-      web_contents(),
-      delegate(),
-      prompt());
+      profile(), web_contents(), delegate(), prompt.Pass());
 
   // Create the modal view around the install dialog view.
   views::Widget* modal = constrained_window::CreateBrowserModalDialogViews(
@@ -181,8 +149,10 @@
     permissions.push_back(PermissionMessage(permission_string,
                                             PermissionIDSet()));
   }
-  this->SetPromptPermissions(permissions);
-  ASSERT_TRUE(IsScrollbarVisible()) << "Scrollbar is not visible";
+  scoped_ptr<ExtensionInstallPrompt::Prompt> prompt = CreatePrompt();
+  prompt->SetPermissions(permissions,
+                         ExtensionInstallPrompt::REGULAR_PERMISSIONS);
+  ASSERT_TRUE(IsScrollbarVisible(prompt.Pass())) << "Scrollbar is not visible";
 }
 
 // Tests that a scrollbar isn't shown for this regression case.
@@ -193,8 +163,10 @@
   PermissionMessages permissions;
   permissions.push_back(PermissionMessage(permission_string,
                                           PermissionIDSet()));
-  this->SetPromptPermissions(permissions);
-  ASSERT_FALSE(IsScrollbarVisible()) << "Scrollbar is visible";
+  scoped_ptr<ExtensionInstallPrompt::Prompt> prompt = CreatePrompt();
+  prompt->SetPermissions(permissions,
+                         ExtensionInstallPrompt::REGULAR_PERMISSIONS);
+  ASSERT_FALSE(IsScrollbarVisible(prompt.Pass())) << "Scrollbar is visible";
 }
 
 class ExtensionInstallDialogViewTest
@@ -216,8 +188,8 @@
     // The user confirms the install.
     MockExtensionInstallPromptDelegate delegate;
     scoped_ptr<ExtensionInstallDialogView> dialog(
-        new ExtensionInstallDialogView(
-            profile(), web_contents(), &delegate, prompt()));
+        new ExtensionInstallDialogView(profile(), web_contents(), &delegate,
+                                       CreatePrompt()));
     views::DialogDelegateView* delegate_view = dialog.get();
 
     delegate_view->Accept();
@@ -232,8 +204,8 @@
     // The user cancels the install.
     MockExtensionInstallPromptDelegate delegate;
     scoped_ptr<ExtensionInstallDialogView> dialog(
-        new ExtensionInstallDialogView(
-            profile(), web_contents(), &delegate, prompt()));
+        new ExtensionInstallDialogView(profile(), web_contents(), &delegate,
+                                       CreatePrompt()));
     views::DialogDelegateView* delegate_view = dialog.get();
 
     delegate_view->Cancel();
@@ -249,8 +221,8 @@
     // proceed or cancel.
     MockExtensionInstallPromptDelegate delegate;
     scoped_ptr<ExtensionInstallDialogView> dialog(
-        new ExtensionInstallDialogView(
-            profile(), web_contents(), &delegate, prompt()));
+        new ExtensionInstallDialogView(profile(), web_contents(), &delegate,
+                                       CreatePrompt()));
     dialog.reset();
 
     EXPECT_EQ(1, delegate.abort_count());