Chromium Code Reviews| Index: chrome/browser/ui/views/extensions/chooser_dialog_view.cc |
| diff --git a/chrome/browser/ui/views/extensions/chooser_dialog_view.cc b/chrome/browser/ui/views/extensions/chooser_dialog_view.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..f4b4189710b2047ec8128d7b5a0544f167ffa189 |
| --- /dev/null |
| +++ b/chrome/browser/ui/views/extensions/chooser_dialog_view.cc |
| @@ -0,0 +1,159 @@ |
| +// Copyright 2016 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/views/extensions/chooser_dialog_view.h" |
| + |
| +#include "base/strings/utf_string_conversions.h" |
| +#include "chrome/browser/extensions/chrome_extension_chooser_dialog.h" |
| +#include "chrome/browser/ui/views/chooser_content_view.h" |
| +#include "chrome/grit/generated_resources.h" |
| +#include "components/chooser_controller/chooser_controller.h" |
| +#include "components/constrained_window/constrained_window_views.h" |
| +#include "components/url_formatter/elide_url.h" |
| +#include "components/web_modal/web_contents_modal_dialog_manager.h" |
| +#include "content/public/browser/browser_thread.h" |
| +#include "extensions/browser/extension_registry.h" |
| +#include "ui/base/l10n/l10n_util.h" |
| +#include "ui/views/controls/styled_label.h" |
| +#include "ui/views/controls/table/table_view.h" |
| +#include "ui/views/layout/box_layout.h" |
| +#include "ui/views/layout/layout_constants.h" |
| +#include "ui/views/window/dialog_client_view.h" |
| +#include "url/origin.h" |
| + |
| +namespace { |
| + |
| +const int kChooserDialogWidth = 300; |
|
msw
2016/06/08 01:16:32
nit: these are shared between dialog & bubble, add
juncai
2016/06/09 01:59:53
Done.
|
| + |
| +const int kChooserDialogHeight = 200; |
| + |
| +} // namespace |
| + |
| +ChooserDialogView::ChooserDialogView(content::WebContents* web_contents, |
| + ChooserController* chooser_controller) |
| + : web_contents_(web_contents), chooser_controller_(chooser_controller) { |
| + // ------------------------------------ |
|
msw
2016/06/08 01:16:32
I'm starting to wonder if ChooserView should imple
juncai
2016/06/09 01:59:53
Changed ChooserContentView to be a subclass of vie
|
| + // | Chooser dialog title | |
| + // | -------------------------------- | |
| + // | | option 0 | | |
| + // | | option 1 | | |
| + // | | option 2 | | |
| + // | | | | |
| + // | | | | |
| + // | | | | |
| + // | -------------------------------- | |
| + // | [ Connect ] [ Cancel ] | |
| + // |----------------------------------| |
| + // | Not seeing your device? Get help | |
| + // ------------------------------------ |
| + |
| + DCHECK(web_contents_); |
| + |
| + chooser_content_view_.reset( |
| + new ChooserContentView(this, chooser_controller_)); |
| + |
| + table_view_ = chooser_content_view_->table_view(); |
|
msw
2016/06/08 01:16:32
ditto nit (from other CL): remove this member.
juncai
2016/06/09 01:59:53
Done.
|
| + table_model_ = table_view_->model(); |
|
msw
2016/06/08 01:16:32
ditto nit (from other CL): remove this member.
juncai
2016/06/09 01:59:53
Done.
|
| + |
| + views::BoxLayout* layout = new views::BoxLayout( |
| + views::BoxLayout::kVertical, 0, 0, views::kRelatedControlVerticalSpacing); |
| + SetLayoutManager(layout); |
| + views::View* table_parent = table_view_->CreateParentIfNecessary(); |
| + AddChildView(table_parent); |
| + layout->SetFlexForView(table_parent, 1); |
| +} |
| + |
| +ChooserDialogView::~ChooserDialogView() { |
| + table_view_->SetModel(nullptr); |
|
msw
2016/06/08 01:16:32
Do these in the ChooserView dtor?
juncai
2016/06/09 01:59:53
Done.
|
| + table_model_->SetObserver(nullptr); |
| +} |
| + |
| +gfx::Size ChooserDialogView::GetPreferredSize() const { |
| + return gfx::Size(kChooserDialogWidth, kChooserDialogHeight); |
| +} |
| + |
| +base::string16 ChooserDialogView::GetWindowTitle() const { |
| + base::string16 chooser_title; |
| + url::Origin origin = chooser_controller_->GetOrigin(); |
| + content::BrowserContext* browser_context = web_contents_->GetBrowserContext(); |
| + extensions::ExtensionRegistry* extension_registry = |
| + extensions::ExtensionRegistry::Get(browser_context); |
| + if (extension_registry) { |
| + const extensions::Extension* extension = |
| + extension_registry->enabled_extensions().GetExtensionOrAppByURL( |
| + GURL(origin.Serialize())); |
| + if (extension) |
| + chooser_title = base::UTF8ToUTF16(extension->name()); |
| + } |
| + |
| + if (chooser_title.empty()) { |
| + chooser_title = url_formatter::FormatOriginForSecurityDisplay( |
| + origin, url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC); |
| + } |
| + |
| + return l10n_util::GetStringFUTF16(IDS_CHOOSER_BUBBLE_PROMPT, chooser_title); |
| +} |
| + |
| +bool ChooserDialogView::ShouldShowCloseButton() const { |
| + return false; |
| +} |
| + |
| +ui::ModalType ChooserDialogView::GetModalType() const { |
| + return ui::MODAL_TYPE_CHILD; |
| +} |
| + |
| +base::string16 ChooserDialogView::GetDialogButtonLabel( |
| + ui::DialogButton button) const { |
| + return chooser_content_view_->GetDialogButtonLabel(button); |
| +} |
| + |
| +bool ChooserDialogView::IsDialogButtonEnabled(ui::DialogButton button) const { |
| + return chooser_content_view_->IsDialogButtonEnabled(button); |
| +} |
| + |
| +views::View* ChooserDialogView::CreateFootnoteView() { |
| + return chooser_content_view_->CreateFootnoteView(this); |
| +} |
| + |
| +bool ChooserDialogView::Accept() { |
| + if (chooser_controller_) |
| + chooser_controller_->Select(table_view_->selection_model().active()); |
| + return true; |
| +} |
| + |
| +bool ChooserDialogView::Cancel() { |
| + if (chooser_controller_) |
| + chooser_controller_->Cancel(); |
| + return true; |
| +} |
| + |
| +bool ChooserDialogView::Close() { |
| + if (chooser_controller_) |
| + chooser_controller_->Close(); |
| + return true; |
| +} |
| + |
| +void ChooserDialogView::StyledLabelLinkClicked(views::StyledLabel* label, |
| + const gfx::Range& range, |
| + int event_flags) { |
| + chooser_controller_->OpenHelpCenterUrl(); |
| +} |
| + |
| +void ChooserDialogView::OnSelectionChanged() { |
| + GetDialogClientView()->UpdateDialogButtons(); |
| +} |
| + |
| +void ChromeExtensionChooserDialog::ShowDialogImpl( |
|
msw
2016/06/08 01:16:32
Do we need to split ShowDialog and ShowDialogImpl?
juncai
2016/06/09 01:59:53
This is a similar pattern as:
https://cs.chromium.
msw
2016/06/09 18:40:04
Acknowledged; thanks for the explanation.
|
| + ChooserController* chooser_controller) const { |
| + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| + DCHECK(chooser_controller); |
| + |
| + web_modal::WebContentsModalDialogManager* manager = |
| + web_modal::WebContentsModalDialogManager::FromWebContents(web_contents_); |
| + if (manager) { |
| + constrained_window::ShowWebModalDialogViews( |
| + new ChooserDialogView(web_contents_, chooser_controller), |
| + web_contents_); |
| + } |
| +} |